AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 1 0000 TITLE 'MT-70 KEYBOARD FIRMWARE USING 8048 REV. 3.0 4_JUN_84' ;;; MT-70 KEYBOARD FIRMWARE USING 8048 ; REV. 3.0 ; ;; COPYRIGHT 1983 BY ZENITH RADIO CORPORATION ; ; MODIFIED BY GIORA BAR-HAI MARCH 18,1984 ; MODIFIED BY HOWARD FULLMER MAY 16,1984 ; PORT 1 (0-5) RECEIVES THE 6 BIT RESULT FROM THE KEYBOARD SCAN ; PORT 1.6 IS USED AS A CLOCK FOR THE 74LS175 (D-FF) ; PORT 1.7 IS USED TO COMMUNICATE TO THE HOST. (OUTPUT). ; PORT 2 RECEIVES INPUTS FROM CONTROL & SHIFT KEYS (P2.2,P2.3) ; IT OUTPUTS TO CONTROL THE LED INDICATORS & ENABLE THE BELL ; IT ALSO OUTPUTS THE 4 BIT ENCODED VALUE TO SCAN THE KEYBOARD ; (P2.4-P2.7). ; KEYBOARD IDENTIFICATION NUMBER ; 0098 IDNUM EQU 10011000B ; FORM OF NUMBER IS 10011xxx ;; MASK WORDS ; 0004 CONTM EQU 00000100B ; MASK FOR CONTROL KEY 0008 SHFTM EQU 00001000B ; MASK FOR SHIFT KEY 007F OUT0M EQU 01111111B ; MASK OUT GOING DATA LOW 0080 OUT1M EQU 10000000B ; MASK OUT GOING DATA HIGH 00DF OFFL0M EQU 11011111B ; OFF LINE OUTPUT LOW 0020 OFFL1M EQU 00100000B ; OFF LINE OUTPUT HIGH 007F CAPS0M EQU 01111111B ; CAPS LOCKED OUTPUT LOW 0080 CAPS1M EQU 10000000B ; CAPS LOCKED OUTPUT HIGH 00BF BELL0M EQU 10111111B ; BELL OUTPUT LOW 0040 BELL1M EQU 01000000B ; BELL OUTPUT HIGH 00BF FFCK0M EQU 10111111B ; D-FF CLK LOW 0040 FFCK1M EQU 01000000B ; D-FF CLK HIGH ;; CONSTANTS ; 00FF TRUE EQU 0FFH 0000 FALSE EQU 00H ;; REPEAT CONSTANTS AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 2 ; 0080 INITDLY EQU 128 ; INITIAL DELAY BEFORE REPEAT 0022 MINRPT EQU 34 ; MINIMUM REPEAT SPEED 0008 MAXRPT EQU 8 ; MAXIMUM REPEAT SPEED ;; DEBOUNCE CONSTANTS 0006 UPBOUNCE EQU 6 ;15ms key release delay 0003 DNBOUNCE EQU 3 ;15ms key assert delay ;; DEFINE INTERNAL RAM ; 0020 ORG 20H 0020 BITMAP: DS 16 ; BITMAP FOR KEYBOARD 0030 KBOLD: DS 1 ; LAST KEY PRESSED ON KEYBOARD 0031 KBDLY: DS 1 ; DELAY COUNT FOR KEYBOARD 0032 KBRLD: DS 1 ; RELOAD VALUE FOR AUTO REPEAT 0033 KBTMP: DS 1 ; TEMPORARY VARIABLE FOR KEYBOARD 0034 KBENC: DS 1 ; KEYBOARD ENCODED VALUE 0035 BNCNT DS 1 ; KEYBOARD DEBOUNCE COUNTER 0036 TEMP1: DS 1 ; TEMPORARY #1 0037 TEMP2: DS 1 ; TEMPORARY #2 0038 ROWNUM: DS 1 ; KEYBOARD ROW NUMBER 0039 LEDSTA: DS 1 ; LEDs STATUS 003A BELCNT: DS 1 ; BELL DELAY COUNT 003B CAPLKF: DS 1 ; CAPS LOCKED FLAG 003C BELLF: DS 1 ; BELL FLAG TRUE IF RINGING BELL 003D CLICKF: DS 1 ; KEY CLICK FLAG TRUE IF ENABLED 003E REPTF: DS 1 ; AUTO REPEAT FLAG (BITS 0-3) 003F SHFTON: DS 1 ; SHIFT IS DOWN FLAG (BITS 0-3) 003E ORG 3EH 003E LOCKF: DS 1 ; KEYBOARD LOCKED FLAG (BITS 4-7) 003F CNTLON: DS 1 ; CONTROL IS DOWN FLAG (BITS 4-7) ;OFFLNF: DS 1 ; OFF LINE FLAG (NOT USED) ;; FORMAT OF DATA SENT ; ; a = SEVEN BIT ASCII DATA ; s = SHIFT KEY STATUS (1 = DEPRESSED) ; c = CONTROL KEY STATUS (1 = DEPRESSED) ; X = DATA ; B = BINARY ; 0aaaaaaaB ASCII DATA FROM KEYS 0000 NULL EQU 00000000B ; NULL 0007 BELL EQU 00000111B ; BELL 0008 BS EQU 00001000B ; BACKSPACE 000A LF EQU 00001010B ; LINE FEED 000D CR EQU 00001101B ; CARRIAGE RETURN AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 3 001B ESC EQU 00011011B ; ESCAPE 007F DEL EQU 01111111B ; DELETE ; ALL KEYS THAT NEED AN ACCESS CODE HAVE BIT 6 SET IN THE MATRIX. ; ALL KEYS NOT TO BE AUTO REPEATED HAVE BIT 5 SET IN THE MATRIX. ; 1scXXXXXB OTHER DATA TO BE DEFINED 0080 UPA EQU 10000000B ; UP ARROW 0081 DWNA EQU 10000001B ; DOWN ARROW 0082 LFTA EQU 10000010B ; LEFT ARROW 0083 RGHTA EQU 10000011B ; RIGHT ARROW 0084 HOMECLR EQU 10000100B ; HOME CLEAR 0085 ERASE EQU 10000101B ; ERASE KEY (NOT USED) 0086 HELP EQU 10000110B ; HELP KEY 0087 SCROLL EQU 10000111B ; NO SCROLL KEY 00A8 SETUP EQU 10101000B ; SET UP KEY 0089 BREAK EQU 10001001B ; BREAK KEY (NOT USED) 00AA CAPLCK EQU 10101010B ; CAPS LOCK KEY 008B TAB EQU 10001011B ; TAB KEY 008C SPACE EQU 10001100B ; SPACE BAR 008F POWERUP EQU 10001111B ; KEYBOARD POWER UP 0090 KP0 EQU 10010000B ; KEYPAD 0 0091 KP1 EQU 10010001B ; KEYPAD IL/1 0092 KP2 EQU 10010010B ; KEYPAD 2 0093 KP3 EQU 10010011B ; KEYPAD DL/3 0094 KP4 EQU 10010100B ; KEYPAD 4 0095 KP5 EQU 10010101B ; KEYPAD 5 0096 KP6 EQU 10010110B ; KEYPAD 6 0097 KP7 EQU 10010111B ; KEYPAD IC/7 0098 KP8 EQU 10011000B ; KEYPAD 8 0099 KP9 EQU 10011001B ; KEYPAD DC/9 009A KPDEC EQU 10011010B ; KEYPAD DECIMAL POINT 009B KPENT EQU 10011011B ; KEYPAD ENTER 009C KPDASH EQU 10011100B ; KEYPAD DASH 009D KPCOM EQU 10011101B ; KEYPAD COMMA 009F ACCESS EQU 10011111B ; ACCESS CODE 00C0 FN1 EQU 11000000B ; FUNCTION KEY #1 00C1 FN2 EQU 11000001B ; FUNCTION KEY #2 00C2 FN3 EQU 11000010B ; FUNCTION KEY #3 00C3 FN4 EQU 11000011B ; FUNCTION KEY #4 00C4 FN5 EQU 11000100B ; FUNCTION KEY #5 00C5 FN6 EQU 11000101B ; FUNCTION KEY #6 00C6 FN7 EQU 11000110B ; FUNCTION KEY #7 00C7 FN8 EQU 11000111B ; FUNCTION KEY #8 00C8 FN9 EQU 11001000B ; FUNCTION KEY #9 AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 4 00C9 FN10 EQU 11001001B ; FUNCTION KEY #10 00CA FA EQU 11001010B ; FUNCTION KEY FA 00CB FB EQU 11001011B ; FUNCTION KEY FB 00CC FC EQU 11001100B ; FUNCTION KEY FC 00CD FD EQU 11001101B ; FUNCTION KEY FD ; ; 11011XXXB ID NUMBER (ACTUALLY 10011XXXB) ;; FORMAT OF DATA RECEIVED ; 0080 XSNDID EQU 10000000B ; SEND ID NUMBER 0081 XRNGBL EQU 10000001B ; RING BELL 0082 XENCLK EQU 10000010B ; ENABLE KEY CLICK 0083 XDSCLK EQU 10000011B ; DISABLE KEY CLICK 0084 XENCAP EQU 10000100B ; ENTER CAPS LOCKED MODE 0085 XDSCAP EQU 10000101B ; EXIT CAPS LOCKED MODE 0086 XENRPT EQU 10000110B ; ENTER AUTO REPEAT MODE 0087 XDSRPT EQU 10000111B ; EXIT AUTO REPEAT MODE 0088 XENLCK EQU 10001000B ; ENTER KEYBOARD LOCKED MODE 0089 XDSLCK EQU 10001001B ; EXIT KEYBOARD LOCKED MODE 008A XENOFF EQU 10001010B ; ENTER OFF LINE MODE 008B XDSOFF EQU 10001011B ; EXIT OFF LINE MODE ;; POWER UP ROUTINE ; ; THIS SECTION OF CODE IS EXECUTED WHENEVER THE KEYBOARD IS ; POWERED UP OR RESET. THE BELL IS TURNED OFF, ALL LEDS ARE ; TURNED OFF, ALL OF RAM IS CLEARED, ALL FLAGS ARE SET, AND ; THE HOST IS SIGNALED THAT THE KEYBOARD JUST RESET. 0000 ORG 0000H 0000 233F POWER: MOV A, #00111111B 0002 39 OUTL P1, A ; INIT PORT 1 FIRST MOST IMPORTANT 0003 B839 MOV R0, #LEDSTA ; LED STATUS 0005 23BC MOV A, #10111100B 0007 A0 MOV @R0, A ; STORE LED STATUS 0008 3A OUTL P2, A ; INIT PORT 2 FOR OUTPUT 0009 54C5 CALL FFCLK ; PULSE FLIP-FLOP 000B B914 MOV R1, #20 ; DELAY A GOOD 50 MSEC 000D B800 POWER1: MOV R0, #0 000F E80F POWER2: DJNZ R0, POWER2 0011 E90D DJNZ R1, POWER1 0013 27 CLR A ; CLEAR ALL OF RAM 0014 B820 MOV R0, #32 ; FIRST LOCATION. 0016 B920 MOV R1, #32 ; 32 BYTES OF MEMORY. AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 5 0018 18 POWER3: INC R0 ; NEXT LOCATION 0019 A0 MOV @R0, A ; CLEAR IT 001A E918 DJNZ R1, POWER3 ; UNTIL DONE 001C 14E3 CALL DISOFF ; DISABLE OFF LINE MODE 001E 14EE CALL DISLCK ; DISABLE KEYBOARD LOCK 0020 14C9 CALL DISCAP ; DISABLE CAPS LOCKED 0022 14B7 CALL ENCLK ; ENABLE KEY CLICK 0024 14D1 CALL ENRPT ; ENABLE AUTO REPEAT 0026 B836 MOV R0, #TEMP1 0028 B08F MOV @R0, #POWERUP 002A 5400 CALL XMT ; SIGNAL POWERUP ;; MAIN SECTION OF CODE ; ; THIS MAIN LOOP CHECKS FOR ANY DATA FROM THE HOST. IF THERE ; IS DATA THEN IT IS PROCESSED. IF THE KEYBOARD IS NOT LOCKED ; THEN IT IS SCANNED DOING ALL N-KEY ROLL OVER, AUTO REPEAT, AND ; ANY OTHER SPECIAL FUNCTIONS. ALL KEYS TO BE TRANSMITTED ARE ; PROCESSED BY THE SCAN ROUTINE. IF THE BELL IS CURRENTLY ; RINGING THEN A CHECK TO STOP THE BELL IS MADE. 002C 541B MAIN: CALL RCV ; RECEIVE ANY MESSAGE FROM HOST 002E F632 JC MAIN1 ; IF DATA THEN 0030 1444 CALL DPR ; PROCESS DATA 0032 B83E MAIN1: MOV R0, #LOCKF 0034 F0 MOV A, @R0 0035 53F0 ANL A, #11110000B ; CLEAR BITS 0-3 TO READ 4-7 ONLY 0037 963B JNZ MAIN2 ; IF KEYBOARD NOT LOCKED THEN 0039 3400 CALL KBSCAN ; SCAN KEYBOARD AND PROCESS KEYS 003B B83C MAIN2: MOV R0, #BELLF 003D F0 MOV A, @R0 003E C642 JZ MAIN3 ; IF RINGING THE BELL THEN 0040 14A0 CALL GOBELL ; DO THE BELL STUFF 0042 042C MAIN3: JMP MAIN ;; DPR - DATA PROCESSOR ; ; *DPR* PROCESSES ALL DATA FROM THE HOST. ; ; ; ENTRY (A) = BYTE FROM HOST ; ; EXIT NONE ; ; USES ALL AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 6 0044 B836 DPR: MOV R0, #TEMP1 ; SAVE VALUE TO PROCESS 0046 A0 MOV @R0, A 0047 0380 ADD A, #-(XSNDID) 0049 C683 JZ SENDID ; IF SEND ID NUMBER 004B F0 MOV A, @R0 004C 037F ADD A, #-(XRNGBL) 004E C68F JZ RINGBL ; ELSE IF RING BELL 0050 F0 MOV A, @R0 0051 037E ADD A, #-(XENCLK) 0053 C6B7 JZ ENCLK ; ELSE IF ENABLE KEY CLICK 0055 F0 MOV A, @R0 0056 037D ADD A, #-(XDSCLK) 0058 C6BC JZ DISCLK ; ELSE IF DISABLE KEY CLICK 005A F0 MOV A, @R0 005B 037C ADD A, #-(XENCAP) 005D C6C1 JZ ENCAP ; ELSE IF ENABLE CAPS LOCKED 005F F0 MOV A, @R0 0060 037B ADD A, #-(XDSCAP) ; ELSE IF DISABLE CAPS LOCKED 0062 C6C9 JZ DISCAP 0064 F0 MOV A, @R0 0065 037A ADD A, #-(XENRPT) 0067 C6D1 JZ ENRPT ; ELSE IF ENABLE REPEAT FUNCTION 0069 F0 MOV A, @R0 006A 0379 ADD A, #-(XDSRPT) 006C C6D8 JZ DISRPT ; ELSE IF DISABLE REPEAT FUNCTION 006E F0 MOV A, @R0 006F 0376 ADD A, #-(XENOFF) 0071 C6DF JZ ENOFF ; ELSE IF ENABLE OFF LINE 0073 F0 MOV A, @R0 0074 0375 ADD A, #-(XDSOFF) 0076 C6E3 JZ DISOFF ; ELSE IF DISABLE OFF LINE 0078 F0 MOV A, @R0 0079 0378 ADD A, #-(XENLCK) 007B C6E7 JZ ENLCK ; ELSE IF ENABLE KEYBOARD LOCK 007D F0 MOV A, @R0 007E 0377 ADD A, #-(XDSLCK) 0080 C6EE JZ DISLCK ; ELSE IF DISABLE KEYBOARD LOCK AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 7 0082 83 RET ; ELSE RETURN ; SENDID - SEND ID NUMBER ; ; *SENDID* SENDS THE ID NUMBER OF THIS KEYBOARD. THIS COULD ; BE USEFUL FOR LATER TERMINALS TO DETERMINE WHAT FUNCTIONS ; ARE AVAILABLE ON THE KEYBOARD. 0083 B836 SENDID: MOV R0, #TEMP1 0085 239F MOV A, #ACCESS 0087 A0 MOV @R0, A 0088 5400 CALL XMT ; OUTPUT THE ACCESS CODE 008A 2398 MOV A, #IDNUM 008C A0 MOV @R0, A 008D 4400 JMP XMT ; OUTPUT ID NUMBER AND RETURN ; RINGBL - RING BELL ; ; *RINGBL* STARTS THE BELL RINGING IN BACKGROUND SO THAT ; KEYBOARD SCANNING MAY STILL TAKE PLACE. IT USES THE TIMER ; AND TIMER OVERFLOW FLAG TO DO THIS. 008F 2340 RINGBL: MOV A, #BELL1M ; START BELL RINGING 0091 54BB CALL FFCLK1 ; PULSE THE FLIP FLOP 0093 B83A MOV R0, #BELCNT 0095 B008 MOV @R0, #8 ; SET BELL COUNT 0097 B83C MOV R0, #BELLF 0099 B0FF MOV @R0, #TRUE ; FLAG TRUE TO RING THE BELL 009B 2301 MOV A, #-255 009D 62 MOV T, A ; SET TIMER DELAY 009E 55 STRT T ; AND START TIMER 009F 83 RET ; GOBELL - GO RING BELL ; ; *GOBELL* CHECKS THE BELL FROM THE BACKGROUND JOB. IF THE ; TIMER HAS OVERFLOWED THEN IT IS KNOWN THAT THE BELL SHOULD ; BE DONE. 00A0 16A3 GOBELL: JTF GOBEL1 ; IT TIME IS NOT UP THEN 00A2 83 RET ; RETURN 00A3 2301 GOBEL1: MOV A, #-255 ; LOAD NEW DELAY TIME 00A5 62 MOV T, A 00A6 B83A MOV R0, #BELCNT AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 8 00A8 F0 MOV A, @R0 00A9 07 DEC A ; DECREMENT BELL DELAY COUNT 00AA A0 MOV @R0, A 00AB 96B6 JNZ GOBRET ; IF DONE RINGING THEN 00AD 65 STOP TCNT ; STOP TIMER 00AE B83C MOV R0, #BELLF 00B0 B000 MOV @R0, #FALSE ; FLAG TO STOP BELL 00B2 23BF MOV A, #BELL0M ; STOP BELL FROM RINGING 00B4 44C0 JMP FFCLK0 ; PULSE THE FF & RETURN 00B6 83 GOBRET: RET ; ENCLK - ENABLE KEY CLICK ; ; *ENCLK* ENABLES KEY CLICK BY SETTING A FLAG FOR LATER USE ; BY THE BACKGROUND JOBS. 00B7 B83D ENCLK: MOV R0, #CLICKF 00B9 B0FF MOV @R0, #TRUE ; FLAG KEY CLICK TRUE 00BB 83 RET ; DISCLK - DISABLE KEY CLICK ; ; *DISCLK* DISABLE KEY CLICK BY SETTING A FLAG FOR LATER USE ; BY THE BACKGROUND JOBS. 00BC B83D DISCLK: MOV R0, #CLICKF 00BE B000 MOV @R0, #FALSE ; FLAG KEY CLICK FALSE 00C0 83 RET ; ENCAP - ENABLE CAPS LOCKED ; ; *ENCAP* ENABLES CAPS LOCKED MODE BY SETTING A FLAG FOR LATER ; USE BY THE BACKGROUND JOBS. 00C1 B83B ENCAP: MOV R0, #CAPLKF 00C3 B0FF MOV @R0, #TRUE ; FLAG CAPS LOCKED TRUE 00C5 237F MOV A, #CAPS0M ; LIGHT CAPS LOCKED LED 00C7 44C0 JMP FFCLK0 ; PULSE FLIP-FLOP & RETURN AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 9 ; DISCAP - DISABLE CAPS LOCKED ; ; *DISCAP* DISABLES CAPS LOCKED MODE BY SETTING A FLAG FOR LATER ; USE BY THE BACKGROUND JOBS. 00C9 B83B DISCAP: MOV R0, #CAPLKF 00CB B000 MOV @R0, #FALSE ; FLAG CAPS LOCKED FALSE 00CD 2380 MOV A, #CAPS1M ; TURN OFF CAPS LOCKED LED 00CF 44BB JMP FFCLK1 ; PULSE FLIP-FLOP & RETURN. ; ENRPT - ENABLE AUTO REPEAT ; ; *ENRPT* ENABLES AUTO REPEAT BY SETTING A FLAG FOR LATER ; USE BY THE BACKGROUND JOBS. 00D1 B83E ENRPT: MOV R0, #REPTF 00D3 F0 MOV A, @R0 00D4 430F ORL A, #00001111B ; ENABLE AUTO REPEAT FLAG 00D6 A0 MOV @R0, A 00D7 83 RET ; DISRPT - DISABLE AUTO REPEAT ; ; *DISRPT* DISABLES AUTO REPEAT BY SETTING A FLAG FOR LATER ; USE BY THE BACKGROUND JOBS. 00D8 B83E DISRPT: MOV R0, #REPTF 00DA F0 MOV A, @R0 00DB 53F0 ANL A, #11110000B ; DISABLE AUTO REPEAT FLAG 00DD A0 MOV @R0, A 00DE 83 RET ; ENOFF - ENABLE OFF LINE LED ; 00DF 23DF ENOFF: MOV A, #OFFL0M ; TURN ON THE OFF LINE LED 00E1 44C0 JMP FFCLK0 ; PULSE FLIP-FLOP & RETURN. AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 10 ; DSOFF - DISABLE OFF LINE LED ; ; *DSOFF* TURNS OFF THE OFF LINE LED 00E3 2320 DISOFF: MOV A, #OFFL1M ; TURN OFF THE OFF LINE LED 00E5 44BB JMP FFCLK1 ; PULSE FLIP-FLOP & RETURN ; ENLCK - ENABLE KEYBOARD LOCK ; ; *ENLCK* TURNS OFF ANY KEYBOARD SCANNING AND TURNS OFF THE ; KEYBOARD LOCKED LED. 00E7 B83E ENLCK: MOV R0, #LOCKF 00E9 F0 MOV A, @R0 00EA 43F0 ORL A, #11110000B ; FLAG THAT KEYBOARD IS LOCKED 00EC A0 MOV @R0, A 00ED 83 RET ; DISLCK - DISABLE KEYBOARD LOCK ; ; *DISLCK* TURNS OFF THE KEYBOARD LOCKED FEATURE 00EE B83E DISLCK: MOV R0, #LOCKF 00F0 F0 MOV A, @R0 00F1 530F ANL A, #00001111B ; FLAG KEYBOARD NOT LOCKED 00F3 A0 MOV @R0, A 00F4 83 RET 0100 ORG 0100H ; *** NEW PAGE BOUNDRY *** ;; KBSCAN - KEYBOARD SCAN ; ; AUTO REPEAT, AND N-KEY ROLL OVER. IF A KEY SHOULD BE OUTPUTED ; IT IS SENT TO THE HOST ; ; ; REGISTER USAGE ; ; R0 GENERAL WORK POINTER ; R1 POINTER TO KEYBOARD BIT MAP ; R2 SCAN ROW NUMBER ; R3 SCAN COLUMN NUMBER ; R4 TEMPORARY VARIABLE #1 ; R5 TEMPORARY VARIABLE #2 ; R6 FLAG IF ANY KEY IS DOWN ; R7 FLAG IF SAME KEY IS DOWN ; AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 11 ; ; ENTRY NONE ; ; EXIT NONE ; ; USES ALL ; ; SETUP FOR SCAN LOOP ; 0100 BE00 KBSCAN: MOV R6, #FALSE ; ASSUME AND SET NO KEY IS DOWN 0102 BFFF MOV R7, #TRUE ; ASSUME AND SET SAME KEY IS DOWN 0104 230F MOV A, #00001111B ; INITIALIZE SCAN ROW NUMBER 0106 3A OUTL P2,A 0107 B838 MOV R0, #ROWNUM 0109 B000 MOV @R0, #0 010B 90 MOVX @R0,A ; WR PULSE TO STROBE 14515 DECODER 010C ; (NOT USED WHEN 74159 IS CONNECTED) 010C B920 MOV R1, #BITMAP ; SET POINTER TO KB BIT MAP ADDRESS 010E BA10 MOV R2, #16 ; SET INDEX COUNTER TO 16 COLUMNS ; MAIN KEYBOARD SCAN LOOP ; 0110 09 KBLP1: IN A, P1 ; READ KEYBOARD MATRIX 0111 43C0 ORL A, #11000000B ; CHECK BITS 0-5 ONLY 0113 37 CPL A 0114 AD MOV R5,A ; SAVE SCAN INFO 0115 C619 JZ NOKEY 0117 BEFF MOV R6, #TRUE ; FLAG THAT A KEY IS DOWN 0119 F1 NOKEY: MOV A,@R1 ; GET KB BIT MASK 011A 53C0 ANL A,#0C0H ; MASK OUT BOUNCE BITS 011C C63D JZ NOUP ; JUMP IF NO BOUNCE BITS 011E 54CA CALL INCCNT ; INCREMENT ROW BOUNCE COUNT 0120 F1 MOV A, @R1 ; GET OLD KB BIT MAP 0121 D340 XRL A,#40H ; INVERT BIT 6 0123 D22E JB6 NODOWN ; JUMP IF NO DOWN BOUNCE 0125 FC MOV A,R4 ; GET BOUNCE COUNT 0126 03FD ADD A,#-DNBOUNCE ; SUBTRACT DOWN BOUNCE 0128 962E JNZ NODOWN ; JUMP IF COUNT NOT DOWN YET 012A F1 MOV A,@R1 ; CLEAR DOWN BOUNCE FLAG 012B 53BF ANL A,#0BFH AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 12 012D A1 MOV @R1,A 012E F1 NODOWN: MOV A,@R1 012F D380 XRL A,#80H ; INVERT BIT 7 0131 F23D JB7 NOUP ; JUMP IF NO UP BOUNCE 0133 FC MOV A,R4 ; GET BOUNCE COUNT 0134 03FA ADD A,#-UPBOUNCE ; SUBTRACT UP BOUNCE 0136 963D JNZ NOUP ; JUMP IF COUNT NOT DONE YET 0138 FD MOV A,R5 ; UPDATE CHANGES 0139 4340 ORL A,#01000000B ; AND CLEAR UP BOUNCE FLAG 013B 51 ANL A,@R1 013C A1 MOV @R1,A 013D F1 NOUP: MOV A,@R1 ; SEE IF ANY CHANGES 013E 533F ANL A,#3FH 0140 DD XRL A,R5 0141 C6C1 JZ NOCHNG ; JUMP IF NO CHANGES 0143 AC MOV R4,A ; SAVE CHANGES 0144 F1 MOV A,@R1 0145 D252 JB6 DNOFF ; JUMP IF DOWN IS OFF 0147 FC MOV A,R4 ; GET CHANGES 0148 5D ANL A,R5 ; LOOK FOR DOWN CHANGES 0149 C652 JZ DNOFF ; JUMP IF NO DOWN CHANGES 014B AB MOV R3,A ; SAVE DOWN CHANGES 014C 41 ORL A,@R1 ; UPDATE KB BIT MAP 014D 4340 ORL A,#01000000B ; SET DOWN BOUNCE FLAG 014F A1 MOV @R1,A 0150 54DA CALL CLRCNT ; CLEAR BOUNCE COUNT 0152 F1 DNOFF: MOV A,@R1 0153 F260 JB7 UPOFF ; JUMP IF UP IS OFF 0155 FD MOV A,R5 ; LOOK FOR UP CHANGES 0156 37 CPL A 0157 5C ANL A,R4 0158 C660 JZ UPOFF 015A 54DA CALL CLRCNT 015C F1 MOV A,@R1 ; SET UP BOUNCE FLAG 015D 4380 ORL A,#10000000B 015F A1 MOV @R1,A 0160 FB UPOFF: MOV A,R3 0161 C6C1 JZ NOCHNG AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 13 ; INNER KEYBOARD SCAN LOOP ; 0163 BF00 MOV R7,#FALSE 0165 BB06 MOV R3, #6 ; SET INDEX COUNTER TO 6 BITS 0167 67 KBLP2: RRC A ; ROTATE BIT INTO CARRY 0168 E6BF JNC KBSKP2 ; IF THIS KEY IS DOWN THEN BEGIN 016A AD MOV R5, A ; SAVE SHIFTED VALUE TO RESTORE LATER 016B FA MOV A, R2 016C D5 SEL RB1 ; SELECT RB #1 TO SAVE REGISTERS 016D AA MOV R2, A 016E B906 MOV R1, #6 ; TO MULTIPLY BY 6 0170 54AA CALL BMPY ; MULTIPLY R2 BY 6 0172 C5 SEL RB0 ; RETURN TO THE ORIGINAL RB 0173 6B ADD A, R3 ; ADD IN COLUMN OFFSET 0174 97 CLR C 0175 03FA ADD A, #-6 ; SUBTRACT BIAS 0177 B834 MOV R0, #KBENC 0179 A0 MOV @R0, A ; SAVE NUMBER REPRESENTATION OF KEY 017A 8A0C ORL P2, #(CONTM + SHFTM) 017C B83F MOV R0, #SHFTON 017E F0 MOV A, @R0 017F 53F0 ANL A, #11110000B ; SET SHIFT DOWN FLAG FALSE 0181 A0 MOV @R0, A 0182 0A IN A, P2 ; READ FOR SHIFT KEY 0183 5308 ANL A, #SHFTM ; MASK FOR SHIFT KEY 0185 968F JNZ KBSCN4 ; IF THE SHIFT KEY IS DOWN THEN BEGIN 0187 F0 MOV A, @R0 0188 430F ORL A, #00001111B 018A A0 MOV @R0, A ; SET SHIFT DOWN FLAG TRUE 018B 7407 CALL TBSHT ; GET KEY VALUE FROM SHIFT TABLE 018D 2491 JMP KBSCN5 018F 7400 KBSCN4: CALL TBLOW ; ELSE GET KEY VALUE FROM REGULAR TABLE 0191 B830 KBSCN5: MOV R0, #KBOLD 0193 A0 MOV @R0, A ; SAVE KEY VALUE 0194 B83B MOV R0, #CAPLKF 0196 F0 MOV A, @R0 ; GET CAPS LOCKED FLAG 0197 C69E JZ KBSCN6 ; IF CAPS LOCKED THEN BEGIN 0199 543A CALL LOWUP ; CONVERT LOWER CASE TO UPPER CASE 019B B830 MOV R0, #KBOLD 019D A0 MOV @R0, A ; SAVE KEY VALUE AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 14 019E B83F KBSCN6: MOV R0, #CNTLON 01A0 F0 MOV A, @R0 01A1 530F ANL A, #00001111B ; SET CONTROL DOWN FLAG FALSE 01A3 A0 MOV @R0, A 01A4 0A IN A, P2 ; READ FOR CONTROL KEY 01A5 5304 ANL A, #CONTM ; MASK FOR CONTROL KEY 01A7 96B2 JNZ KBSCN7 ; IF THE CONTROL KEY IS DOWN THEN BEGIN 01A9 F0 MOV A, @R0 01AA 43F0 ORL A, #11110000B ; SET CONTROL DOWN FLAG TRUE 01AC A0 MOV @R0, A 01AD 544C CALL TOCTL ; CONVERT TO CONTROL CODE 01AF B830 MOV R0, #KBOLD 01B1 A0 MOV @R0, A ; SAVE KEY VALUE 01B2 B831 KBSCN7: MOV R0, #KBDLY 01B4 B080 MOV @R0, #INITDLY ; SET AUTO REPEAT DELAY COUNT 01B6 B832 MOV R0, #KBRLD 01B8 B022 MOV @R0, #MINRPT ; SET REPEAT RELOAD VALUE 01BA D5 SEL RB1 ; SELECT RB #1 TO SAVE REGISTERS 01BB 5460 CALL PROC ; *** PROCESS THE KEY *** 01BD C5 SEL RB0 ; RESTORE ORIGINAL REGISTERS 01BE FD MOV A, R5 ; RESTORE SHIFTED VALUE 01BF EB67 KBSKP2: DJNZ R3, KBLP2 ; UNTIL SCAN COLUMN NUMBER = 0 01C1 B839 NOCHNG: MOV R0, #LEDSTA ; LED STATUS 01C3 F0 MOV A,@R0 01C4 B838 MOV R0, #ROWNUM 01C6 10 INC @R0 ; INCREMENT ROW NUMBER 01C7 530F ANL A, #0FH ; SAVE BITS 0-3 01C9 47 SWAP A 01CA 40 ORL A, @R0 01CB 47 SWAP A 01CC 3A OUTL P2, A ; BUMP SCAN ROW NUMBER TO NEXT ROW 01CD 90 MOVX @R0,A ; WR PULSE TO STROBE 14515 DECODER 01CE ; (NOT USED WHEN 74159 IS CONNECTED) 01CE 19 INC R1 ; BUMP KB BIT MAP POINTER 01CF EA10 DJNZ R2, KBLP1 ; UNTIL SCAN ROW NUMBER = 0 ; SCANNING IS ALL DONE NOW, CHECK WHAT HAPPENED ; AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 15 01D1 FE MOV A, R6 ; GET KEY DOWN FLAG 01D2 96D5 JNZ KBDWN ; IF NO KEY IS DOWN THEN BEGIN 01D4 83 KBEXIT: RET ; RETURN 01D5 FF KBDWN: MOV A, R7 ; GET SAME KEY DOWN FLAG 01D6 C6D4 JZ KBEXIT ; IF SAME KEY IS DOWN THEN BEGIN 01D8 B831 MOV R0, #KBDLY 01DA F0 MOV A, @R0 01DB 07 DEC A 01DC A0 MOV @R0, A ; DECREMENT THE DELAY COUNT 01DD 96D4 JNZ KBEXIT ; IF DELAY TIME IS UP THEN BEGIN 01DF B832 MOV R0, #KBRLD 01E1 F0 MOV A, @R0 ; GET RELOAD VALUE 01E2 03F8 ADD A, #-MAXRPT 01E4 C6E9 JZ KBDWN1 ; IF OK TO REDUCE DELAY THEN 01E6 F0 MOV A, @R0 01E7 07 DEC A ; REDUCE DELAY 01E8 A0 MOV @R0, A ; AND SAVE IT 01E9 F0 KBDWN1: MOV A, @R0 ; ELSE GET FINAL RELOAD VALUE 01EA B831 MOV R0, #KBDLY 01EC A0 MOV @R0, A ; RESET THE DELAY COUNT 01ED B83E MOV R0, #REPTF 01EF F0 MOV A, @R0 01F0 530F ANL A, #00001111B ; CLEAR BITS 4-7 TO READ 0-3 ONLY 01F2 C6D4 JZ KBEXIT ; IF AUTO REPEAT ENABLED THEN 01F4 B830 MOV R0, #KBOLD 01F6 F0 MOV A, @R0 ; GET KEY VALUE 01F7 F7 RLC A 01F8 E6FE JNC KBDWN2 ; IF ASCII OR 01FA F7 RLC A 01FB F7 RLC A 01FC F6D4 JC KBEXIT ; NON-ASCII & AUTO REPEAT ALLOWED THEN 01FE 4460 KBDWN2: JMP PROC ; *** PROCESS OLD KEY *** 0200 ORG 0200H ; *** NEW PAGE BOUNDRY *** ;; XMT - TRANSMIT DATA TO HOST ; ; *XMT* OUTPUTS BYTES TO THE HOST USING A SPECIAL HANDSHAKE. ; ; ; ENTRY (@R0) = BYTE TO OUTPUT ; AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 16 ; EXIT NONE ; ; USES ALL 0200 997F XMT: ANL P1, #OUT0M ; SET LOW AS SAFETY PRECAUTION 0202 F0 MOV A, @R0 ; GET BYTE 0203 B908 MOV R1, #8 ; INITIALIZE INDEX FOR 8 BITS 0205 8980 ORL P1, #OUT1M ; SET HIGH 0207 561A JT1 XMTRET ; IF REQUEST FROM HOST THEN EXIT 0209 ; REQUEST HOST ATTENTION 0209 4609 XMT1: JNT1 XMT1 ; WAIT FOR REQUEST DATA SIGNAL 020B 67 RRC A ; ROTATE DATA IN 020C E612 JNC XMT2 ; IF HIGH BIT TO BE SENT THEN 020E 8980 ORL P1, #OUT1M ; SET BIT HIGH 0210 4414 JMP XMT3 0212 997F XMT2: ANL P1, #OUT0M ; ELSE SET BIT LOW 0214 XMT3: 0214 5614 XMT4: JT1 XMT4 ; WAIT FOR DATA RECEIVED SIGNAL 0216 E909 DJNZ R1, XMT1 ; UNTIL ALL 8 BITS ARE DONE 0218 997F ANL P1, #OUT0M ; PULL OUTPUT LOW AND RETURN 021A 83 XMTRET: RET ;; RCV - RECEIVE DATA FROM HOST ; ; *RCV* TAKES DATA FROM THE HOST AND PROCESSES IT IF AVAILABLE ; ; ; ENTRY NONE ; ; EXIT (A) = BYTE RECEIVED IF AVAILABLE ; 'C' = SET IF NO DATA, CLEAR OTHERWISE ; ; USES ALL 021B 5620 RCV: JT1 RCV1 ; IF NO DATA THEN 021D 97 CLR C 021E A7 CPL C ; SET CARRY AND RETURN 021F 83 RET 0220 27 RCV1: CLR A ; INITIALIZE RECEIVING BYTE 0221 B908 MOV R1, #8 ; INDEX COUNTER FOR 8 BITS AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 17 0223 8980 RCVLP: ORL P1, #OUT1M ; REQUEST DATA BY SETTING HIGH 0225 5436 CALL RCVDLY ; DELAY 500 USEC 0227 97 CLR C ; INIT CARRY LOW 0228 562B JT1 RCV2 ; IF INPUT IS LOW THEN 022A A7 CPL C ; SET CARRY 022B 67 RCV2: RRC A ; ROTATE DATA IN 022C 997F ANL P1, #OUT0M ; DATA RECEIVED BY SETTING LOW 022E 5436 CALL RCVDLY ; DELAY 500 USEC 0230 E923 DJNZ R1, RCVLP ; UNTIL ALL 8 BITS 0232 5436 CALL RCVDLY ; WAIT FOR HOST TO FINISH 0234 97 CLR C ; FLAG OK AND RETURN 0235 83 RET 0236 BC32 RCVDLY: MOV R4, #50 0238 EC38 RCVDL1: DJNZ R4, RCVDL1 ; DELAY AT LEAST 500 USEC 023A RET ;; LOWUP - CONVERT FROM LOWER CASE TO UPPER CASE ; ; *LOWUP* CONVERTS THE ASCII CHARACTERS FROM 'a' TO 'z' ; TO THEIR UPPER CASE VALUES. ; ; ; ENTRY (KBOLD) = ASCII VALUE TO CONVERT ; ; EXIT (A) = CONVERTED BYTE IF NEEDED ; ; USES A, R0 023A B830 LOWUP: MOV R0, #KBOLD 023C F0 MOV A, @R0 ; GET CHARACTER TO CONVERT 023D 039F ADD A, #-('a') 023F E64A JNC LOWUP1 ; IF CHARACTER >= 'a' 0241 F0 MOV A, @R0 0242 0385 ADD A, #-('z'+1) 0244 F64A JC LOWUP1 ; AND IF CHARACTER <= 'z' THEN 0246 F0 MOV A, @R0 0247 03E0 ADD A, #-('a'-'A') ; CONVERT TO UPPER CASE 0249 83 RET 024A F0 LOWUP1: MOV A, @R0 ; ELSE USE OLD VALUE 024B 83 RET ;; TOCTL - CONVERT TO CONTROL CHARACTER ; ; *TOCTL* CONVERTS THE ASCII CHARACTER INTO A CONTROL CHARACTER AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 18 ; ; ; ENTRY (KBOLD) = ASCII VALUE TO CONVERT ; EXIT (A) = CONVERTED BYTE ; ; USES A, R0, TEMP1 024C 543A TOCTL: CALL LOWUP ; CONVERT TO UPPER CASE 024E B836 MOV R0, #TEMP1 0250 A0 MOV @R0, A ; SAVE CONVERTED UPPER CASE BYTE 0251 03C0 ADD A, #-('@') 0253 E65E JNC TOCTL1 ; IF INSIDE LOWER RANGE 0255 F0 MOV A, @R0 0256 03A0 ADD A, #-(60H) 0258 F65E JC TOCTL1 ; AND INSIDE UPPER RANGE THEN 025A F0 MOV A, @R0 025B 03C0 ADD A, #-('@') ; CONVERT TO CONTROL CHARACTER 025D 83 RET 025E F0 TOCTL1: MOV A, @R0 ; ELSE USE OLD VALUE 025F 83 RET ;; PROC - PROCESS KEY ; ; *PROC* TAKES THE ASCII VALUE OR SPECIAL VALUE AND SENDS IT ; TO THE HOST SENDING AN ACCESS CODE IF NEEDED AND MASKING ; IN THE SHIFT AND CONTROL VALUES IF NEEDED. ; ; ; ENTRY (KBOLD) = BYTE TO PROCESS ; ; EXIT NONE ; ; USES ALL 0260 B830 PROC: MOV R0, #KBOLD 0262 F0 MOV A, @R0 ; GET KEY TO SEND 0263 F7 RLC A 0264 E68D JNC PROC3 ; IF ASCII CHARACTER THEN SKIP 0266 F7 RLC A 0267 E66F JNC PROC1 ; IF ACCESS CODE NEEDED THEN BEGIN 0269 B836 MOV R0, #TEMP1 026B B09F MOV @R0, #ACCESS 026D 5400 CALL XMT ; OUTPUT ACCESS CODE 026F B830 PROC1: MOV R0, #KBOLD 0271 F0 MOV A, @R0 ; GET VALUE TO OUTPUT 0272 539F ANL A, #10011111B ; CLEAR SHIFT/CONTROL AREAS 0274 B836 MOV R0, #TEMP1 AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 19 0276 A0 MOV @R0, A ; SAVE NEW VALUE 0277 B93F MOV R1, #SHFTON 0279 F1 MOV A, @R1 027A 530F ANL A, #00001111B ; CLEAR BITS 4-7 TO READ 0-3 ONLY 027C C682 JZ PROC2 ; IF SHIFT KEY DEPRESSED THEN 027E F0 MOV A, @R0 027F 4340 ORL A, #01000000B ; MASK IN SHIFT CODE 0281 A0 MOV @R0, A 0282 B93F PROC2: MOV R1, #CNTLON 0284 F1 MOV A, @R1 0285 53F0 ANL A, #11110000B ; CLEAR BITS 0-3 TO READ 4-7 ONLY 0287 C68D JZ PROC3 ; IF CONTROL KEY DEPRESSED THEN 0289 F0 MOV A, @R0 028A 4320 ORL A, #00100000B ; MASK IN CONTROL CODE 028C A0 MOV @R0, A 028D 5400 PROC3: CALL XMT ; OUTPUT CHARACTER POINTED BY @R0 028F B83D MOV R0, #CLICKF 0291 F0 MOV A, @R0 0292 C6A9 JZ PROC4 ; IF KEY CLICK ENABLED THEN ;; KEYCLK - KEY CLICK ; *KEYCLK* CLICKS THE BELL ON THE KEYBOARD. IF BELL IS ; RINGING THEN THE BELL IS NOT DISTERBED. ; ; ENTRY NONE ; EXIT NONE ; USES A, R0 0294 B839 KEYCLK: MOV R0, #LEDSTA ; READ FOR BELL STATUS 0296 F0 MOV A, @R0 0297 5340 ANL A, #BELL1M ; MASK FOR BELL STATUS 0299 96A9 JNZ KEYCL2 ; IF NO BELL THEN 029B 2340 MOV A, #BELL1M ; PULL BELL HIGH 029D 54BB CALL FFCLK1 ; PULSE FLIP-FLOP CLOCK 029F B8FF MOV R0, #255 02A1 00 KEYCL1: NOP 02A2 00 NOP 02A3 E8A1 DJNZ R0, KEYCL1 ; DELAY 500 MICROSECONDS 02A5 23BF MOV A, #BELL0M ; PULL BELL LOW 02A7 54C0 CALL FFCLK0 ; PULSE FLIP-FLOP CLOCK 02A9 PROC4: 02A9 83 KEYCL2: RET AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 20 ;; BMPY - BINARY MULTIPLY ; ; *BMPY* MULTIPLIES ONE-BYTE MULTIPLIER AND A ONE-BYTE ; MULTIPLICAND. ; ; ; ENTRY - R1-MULTIPLIER ; R2-MULTIPLICAND ; ; EXIT - A -LS BYTE OF RESULT ; R1-MS BYTE OF RESULT ; ; USES - A,R1,R2,R3 (R3 IS A LOOP COUNTER(=8)) ; 02AA BB08 BMPY: MOV R3, #8 ; SET COUNTER TO 8 02AC 27 CLR A 02AD 97 CLR C 02AE 67 BMP1: RRC A ; DOUBLE SHIFT RIGHT ACC & R1 02AF 29 XCH A, R1 ; INTO CARRY 02B0 67 RRC A 02B1 29 XCH A, R1 02B2 E6B5 JNC BMP2 ; IF CARRY=1 ADD, OTHERWISE DON'T 02B4 6A ADD A, R2 ; ADD MULTIPLICAND TO ACCUMULATOR 02B5 EBAE BMP2: DJNZ R3, BMP1 ; DEC COUNTER & LOOP IF 0 02B7 67 RRC A ; DO A FINAL RIGHT SHIFT AT THE 02B8 29 XCH A, R1 ; END OF THE ROUTINE 02B9 67 RRC A 02BA 83 RET ; FFCLK0 or FFCLK1 - FLIP-FLOP CLOCK ; ; *FFCLK0/1* TURNS THE LED OM/OFF & PULSES THE FLIP-FLOP CLOCK ; ; ENTRY - A-MASK BYTE ; 02BB B839 FFCLK1: MOV R0, #LEDSTA 02BD 40 ORL A, @R0 02BE 44C3 JMP FFCLK01 02C0 B839 FFCLK0: MOV R0, #LEDSTA 02C2 50 ANL A, @R0 02C3 FFCLK01: 02C3 A0 MOV @R0, A ; SAVE LEDs NEW STATUS 02C4 3A OUTL P2, A ; OUTPUT TO PORT 2 02C5 8940 FFCLK: ORL P1, #FFCK1M ; CLOCK HIGH 02C7 99BF ANL P1, #FFCK0M ; CLOCK LOW 02C9 83 RET AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 21 02CA 54E6 INCCNT: CALL GETCNT 02CC E6CF JNC NOSWAP0 02CE 47 SWAP A 02CF NOSWAP0: 02CF 17 INC A 02D0 AC MOV R4,A 02D1 E6D4 JNC NOSWAP1 02D3 47 SWAP A 02D4 NOSWAP1: 02D4 A0 MOV @R0,A 02D5 230F MOV A,#0FH 02D7 5C ANL A,R4 02D8 AC MOV R4,A 02D9 83 RET 02DA 54E6 CLRCNT: CALL GETCNT 02DC E6DF JNC NOSWAP2 02DE 47 SWAP A 02DF NOSWAP2: 02DF 53F0 ANL A,#0F0H 02E1 E6E4 JNC NOSWAP3 02E3 47 SWAP A 02E4 NOSWAP3: 02E4 A0 MOV @R0,A 02E5 83 RET 02E6 F9 GETCNT: MOV A,R1 02E7 97 CLR C 02E8 67 RRC A 02E9 A8 MOV R0,A 02EA F0 MOV A,@R0 02EB 83 RET 0300 ORG 0300H ; *** NEW PAGE BOUNDARY *** ;; TBLOW - TABLE LOWER CASE ; ; *TBLOW* DOES THE TABLE LOOKUP FOR THE LOWER CASE LETTERS ; ; ; ENTRY (KBENC) = KEY NUMBER ; ; EXIT (A) = ASCII VALUE OR SPECIAL VALUE ; ; USES A, R0 0300 B834 TBLOW: MOV R0, #KBENC AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 22 0302 230D MOV A, #LOW (TBLOWT - 1) 0304 60 ADD A, @R0 ; ADD OFFSET AND CONSTANT INTO TABLE 0305 A3 MOVP A, @A ; GET VALUE 0306 83 RET ;; TBSHT - TABLE UPPER CASE ; ; *TBSHT* DOES THE TABLE LOOKUP FOR THE UPPER CASE LETTERS ; ; ; ENTRY (KBENC) = KEY NUMBER ; ; EXIT (A) = ASCII VALUE OR SPECIAL VALUE ; ; USES A, R0 0307 B834 TBSHT: MOV R0, #KBENC 0309 236D MOV A, #LOW (TBSHTT - 1) 030B 60 ADD A, @R0 ; ADD OFFSET AND CONSTANT INTO TABLE 030C A3 MOVP A, @A ; GET VALUE 030D 83 RET 030E ;; TBLOWT - LOWER CASE TABLE 030E ; 030E CCCD TBLOWT: DB FC, FD ; S15 BITS 5,4 0310 A8000000 DB SETUP, NULL, NULL, NULL ; S15 BITS 7,6,5,4 0314 CBCA DB FB, FA ; S14 BITS 5,4 0316 C9C8C7C6 DB FN10, FN9, FN8, FN7 ; S14 BITS 7,6,5,4 031A C5C4 DB FN6, FN5 ; S13 BITS 5,4 031C C3C2C1C0 DB FN4, FN3, FN2, FN1 ; S13 BITS 3,2,1,0 0320 080A DB BS, LF ; S12 BITS 5,4 0322 9C9B0D8C DB KPDASH, KPENT, CR, SPACE ; S12 BITS 3,2,1,0 0326 2F8B DB '/', TAB ; S11 BITS 5,4 0328 9A2E6976 DB KPDEC, '.', 'i', 'v' ; S11 BITS 3,2,1,0 032C 821B DB LFTA, ESC ; S10 BITS 5,4 032E 9D2C7563 DB KPCOM, ',', 'u', 'c' ; S10 BITS 3,2,1,0 0332 8331 DB RGHTA, '1' ; S9 0334 915C7978 DB KP1, '\', 'y', 'x' ; S9 0338 8132 DB DWNA, '2' ; S8 AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 23 033A 926F747A DB KP2, 'o', 't', 'z' ; S8 033E 8033 DB UPA, '3' ; S7 0340 93706861 DB KP3, 'p', 'h', 'a' ; S7 0344 7F34 DB DEL, '4' ; S6 0346 94276A73 DB KP4, ''', 'j', 's' ; S6 034A AA35 DB CAPLCK, '5' ; S5 034C 95606B64 DB KP5, '`', 'k', 'd' ; S5 0350 8736 DB SCROLL, '6' ; S4 0352 963D6C66 DB KP6, '=', 'l', 'f' ; S4 0356 0037 DB NULL, '7' ; S3 0358 972D6D72 DB KP7, '-', 'm', 'r' ; S3 035C 8438 DB HOMECLR,'8' ; S2 035E 985B6E65 DB KP8, '[', 'n', 'e' ; S2 0362 8639 DB HELP, '9' ; S1 0364 995D6277 DB KP9, ']', 'b', 'w' ; S1 0368 8530 DB ERASE, '0' ; S0 036A 903B6771 DB KP0, ';', 'g', 'q' ; S0 036E ;; TBSHTT - UPPER CASE TABLE 036E ; 036E CCCD TBSHTT: DB FC, FD ; S15 BITS 5,4 0370 A8000000 DB SETUP, NULL, NULL, NULL ; S15 BITS 3,2,1,0 0374 CBCA DB FB, FA ; S14 BITS 5,4 0376 C9C8C7C6 DB FN10, FN9, FN8, FN7 ; S14 BITS 3,2,1,0 037A C5C4 DB FN6, FN5 ; S13 HIGH 037C C3C2C1C0 DB FN4, FN3, FN2, FN1 ; S13 LOW 0380 080A DB BS, LF ; S12 HIGH 0382 9C9B0D8C DB KPDASH, KPENT, CR, SPACE ; S12 LOW 0386 3F8B DB '?', TAB ; S11 HIGH 0388 9A3E4956 DB KPDEC, '>', 'I', 'V' ; S11 LOW 038C 821B DB LFTA, ESC ; S10 HIGH 038E 9D3C5543 DB KPCOM, '<', 'U', 'C' ; S10 LOW 0392 8321 DB RGHTA, '!' ; S9 HIGH 0394 917C5958 DB KP1, '|', 'Y', 'X' ; S9 LOW 0398 8140 DB DWNA, '@' ; S8 HIGH 039A 924F545A DB KP2, 'O', 'T', 'Z' ; S8 LOW AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 24 039E 8023 DB UPA, '#' ; S7 HIGH 03A0 93504841 DB KP3, 'P', 'H', 'A' ; S7 LOW 03A4 7F24 DB DEL, '$' ; S6 HIGH 03A6 94224A53 DB KP4, '"', 'J', 'S' ; S6 LOW 03AA AA25 DB CAPLCK, '%' ; S5 HIGH 03AC 957E4B44 DB KP5, '~', 'K', 'D' ; S5 LOW 03B0 875E DB SCROLL, '^' ; S4 HIGH 03B2 962B4C46 DB KP6, '+', 'L', 'F' ; S4 LOW 03B6 0026 DB NULL, '&' ; S3 HIGH 03B8 975F4D52 DB KP7, '_', 'M', 'R' ; S3 LOW 03BC 842A DB HOMECLR,'*' ; S2 HIGH 03BE 987B4E45 DB KP8, '{', 'N', 'E' ; S2 LOW 03C2 8628 DB HELP, '(' ; S1 HIGH 03C4 997D4257 DB KP9, '}', 'B', 'W' ; S1 LOW 03C8 8529 DB ERASE, ')' ; S0 HIGH 03CA 903A4751 DB KP0, ':', 'G', 'Q' ; S0 LOW 0000 END AVOCET SYSTEMS 8048 CROSS-ASSEMBLER - VERSION 1.62 SOURCE FILE NAME: KEY30.ASM PAGE 25 ---- SYMBOL TABLE ---- ACCESS 009F ESC 001B KBLP2 0167 MINRPT 0022 SHFTM 0008 BELCNT 003A FA 00CA KBOLD 0030 NOCHNG 01C1 SHFTON 003F BELL 0007 FALSE 0000 KBRLD 0032 NODOWN 012E SPACE 008C BELL0M 00BF FB 00CB KBSCAN 0100 NOKEY 0119 TAB 008B BELL1M 0040 FC 00CC KBSCN4 018F NOSWAP0 02CF TBLOW 0300 BELLF 003C FD 00CD KBSCN5 0191 NOSWAP1 02D4 TBLOWT 030E BITMAP 0020 FFCK0M 00BF KBSCN6 019E NOSWAP2 02DF TBSHT 0307 BMP1 02AE FFCK1M 0040 KBSCN7 01B2 NOSWAP3 02E4 TBSHTT 036E BMP2 02B5 FFCLK 02C5 KBSKP2 01BF NOUP 013D TEMP1 0036 BMPY 02AA FFCLK0 02C0 KBTMP 0033 NULL 0000 TEMP2 0037 BNCNT 0035 FFCLK01 02C3 KEYCL1 02A1 OFFL0M 00DF TITLE 0000 BREAK 0089 FFCLK1 02BB KEYCL2 02A9 OFFL1M 0020 TOCTL 024C BS 0008 FN1 00C0 KEYCLK 0294 OUT0M 007F TOCTL1 025E CAPLCK 00AA FN10 00C9 KP0 0090 OUT1M 0080 TRUE 00FF CAPLKF 003B FN2 00C1 KP1 0091 POWER 0000 UPA 0080 CAPS0M 007F FN3 00C2 KP2 0092 POWER1 000D UPBOUNCE 0006 CAPS1M 0080 FN4 00C3 KP3 0093 POWER2 000F UPOFF 0160 CLICKF 003D FN5 00C4 KP4 0094 POWER3 0018 XDSCAP 0085 CLRCNT 02DA FN6 00C5 KP5 0095 POWERUP 008F XDSCLK 0083 CNTLON 003F FN7 00C6 KP6 0096 PROC 0260 XDSLCK 0089 CONTM 0004 FN8 00C7 KP7 0097 PROC1 026F XDSOFF 008B CR 000D FN9 00C8 KP8 0098 PROC2 0282 XDSRPT 0087 DEL 007F GETCNT 02E6 KP9 0099 PROC3 028D XENCAP 0084 DISCAP 00C9 GOBEL1 00A3 KPCOM 009D PROC4 02A9 XENCLK 0082 DISCLK 00BC GOBELL 00A0 KPDASH 009C RCV 021B XENLCK 0088 DISLCK 00EE GOBRET 00B6 KPDEC 009A RCV1 0220 XENOFF 008A DISOFF 00E3 HELP 0086 KPENT 009B RCV2 022B XENRPT 0086 DISRPT 00D8 HOMECLR 0084 LEDSTA 0039 RCVDL1 0238 XMT 0200 DNBOUNCE 0003 IDNUM 0098 LF 000A RCVDLY 0236 XMT1 0209 DNOFF 0152 INCCNT 02CA LFTA 0082 RCVLP 0223 XMT2 0212 DPR 0044 INITDLY 0080 LOCKF 003E REPTF 003E XMT3 0214 DWNA 0081 KBDLY 0031 LOWUP 023A RET 023A XMT4 0214 ENCAP 00C1 KBDWN 01D5 LOWUP1 024A RGHTA 0083 XMTRET 021A ENCLK 00B7 KBDWN1 01E9 MAIN 002C RINGBL 008F XRNGBL 0081 ENLCK 00E7 KBDWN2 01FE MAIN1 0032 ROWNUM 0038 XSNDID 0080 ENOFF 00DF KBENC 0034 MAIN2 003B SCROLL 0087 ENRPT 00D1 KBEXIT 01D4 MAIN3 0042 SENDID 0083 ERASE 0085 KBLP1 0110 MAXRPT 0008 SETUP 00A8