;************************************************ ;* * ;* Morrow Designs Pivot * ;* Keyboard Processor Firmware * ;* * ;* Author: Michael Stolowitz * ;* Revision: 5.05 * ;* Date: 5/2/85 * ;* Time: 1:05 p.m. * ;* * ;************************************************ ; ; Revision History: ; ; .00 4/18 Removed switch port WR.19 ; ; Added NMI code for ALT-CALC ; ; Moved Blink Enable to Display Control Bit 6 ; ; Modified Display Control Bit 4 for Hi-Res ; asserted in 40x25 alpha-numeric mode. ; ; Swap CLOCK and PHONE NMI codes. ; ; Added WR.24 for attribute control. Bit 0 ; goes directly to ATENA, P24. Bit 6 goes to ; status register. If Bit 6 is low, ATENA is ; pulsed on blink timeout. Defaults to pulse ; mode enabled. ; ; Added WR.25 for Drive Off pulsing. Bits 4 & 5 ; will turn off drives 0 & 1 respectively. Bits ; are copied during interrupt to display status. ; They are cleared in the not end of frame loop, ; with the corresponding drives being pulsed if ; its bit was set. ; ; Added WR.26 - Keyboard Reset. Clears all of the ; keystates and empties the FIFO. ; ; Move EL Timeout inhibit to bit 2 of R23. Data ; is stored in bit 2 of display status. On RSTAT, ; data is now masked to bits 0 and 3. ; ; R21 works for FDC-OFF only. Access FDC to get ; it on. FDC-OFF also installed in drive off ; register WR.25, bit 1. ; ; .02 SET EL_K1 back to -10 (bjg) ; ; .03 Added EL panel direct control in WR.23, Bit 1. ; Disabled Panel On/Off in timeout routine if ; if timeout inhibit is active. ; ; .04 5/2 Fix error in ALT key routine ; Changed ALT-CALC nmi code ; Added equates for nmi codes ; ; .05 5/2 Fixed Address Tables For Above Changes ; ;************************************************ ;* * ;* Program Structure: * ;* * ;* COLD Code Executed On Reset * ;* MAIN Main Loop ( See MAIN: ) * ;* STALL Interrupt ( See STALL: ) * ;* TIMER Interrupt ( See TIMER: ) * ;* * ;************************************************ ; ;************************************************ ;* * ;* Other References: * ;* * ;* KBHRD.DOC Hardware Description * ;* KB.DOC Functional Description * ;* KBSCAN.DOC Keyboard Description * ;* * ;************************************************ ; ; BANK 0 REGISTER UTILIZATION ; ; KB RED DELTA CODE SEND ; -------------------------------------------------------------- ; R0 ; R1 KEY-ARRAY KEY-ARRAY KEY-ARRAY KEY-ARRAY ; R2 ROW CNT ROW CNT ROW CNT ROW-CNT ; R3 DELTA DELTA ; R4 ROTATE ROTATE ; R5 PWR-STAT PWR-STAT PWR-STAT PWR-STAT ; R6 BIT-CNT BIT-CNT ; R7 KEYSTATE KEYSTATE KEYSTATE KEYSTATE ; ; BANK 1 REGISTER UTILIZATION ; ; R0 WORKING INDEX REGISTER ; R1 6845 ADDRESS REGISTER ; R2 FIFO INPUT POINTER ; R3 FIFO OUTPUT POINTER ; R4 NMI STATUS ; R5 DISPLAY STATUS ; Bit 0 Display Enable ; Bit 1 FDC-OFF ; Bit 2 EL Timeout Inhibit ; Bit 3 Vertical Sync ; Bit 4 Drive Off 0 ; Bit 5 Drive Off 1 ; Bit 6 Attribute Enable Static ; Bit 7 Curser Updated ; R6 SAVED ACCUMULATOR ; R7 DISP CTL SHADOW ; ; F0 NO CURSOR UPDATE ; F1 NOT END-FRAME ; ; PORT 1 KEYBOARD SCAN CODES TO 8255 ; PORT 2 STROBE OUTPUT PORT ; ; ; PORT 2 BIT ASSIGNMENTS ; 0080 KBDAV.N: EQU 10000000B ;SET DAV LATCH 0040 PACK.P: EQU 01000000B ;PROCESSOR ACKNOWLEDGE 0020 NMIRQ.P: EQU 00100000B ;ASSERT PROCESSOR NMI 0010 ATENA.P: EQU 00010000B ;ATTRIBUTE ENABLE ; ; DATA BUS 8084 LOCAL BUS FACILITIES ; 0000 KB.STB EQU 00H ;Key Board Strobe 0001 PD.STB EQU 01H ;Processor Data Strobe 0002 FDC.STB EQU 02H ;Floppy Disk Enable 0003 DS.STB EQU 03H ;Display Strobe 0000 KB.ENA EQU 00H ;Key Board Enable 0001 PD.ENA EQU 01H ;Processor Data Enable 0002 AUX.ENA EQU 02H ;Extra Port Enable 0003 PA.ENA EQU 03H ;Processor Address Enable ; ; 00C5 DSP.DFLT EQU 0C5H ;DEFAULT DISPLAY CONTROL ; ; DATA MEMORY MAP ; 20 - 35H 22 Registers of 6845 ; 36H SAVE1 ; 37H SAVE2 ; 38H BLINK ; 39H DEBOUNCE ; 3AH REPEAT ; 3BH EL LSB ; 3CH EL MSB ; 3DH NMIREQ ; SPACE ; 40 - 57 24 Bytes of Key-Array ; 60 - 7FH 32 Bytes of FIFO ; 0020 CRT.REG: EQU 20H ;START OF 6845 REGISTERS 0036 SAVE1: EQU 36H ;OP SYS ADDR SAVE 0037 SAVE2: EQU 37H ;NMI ADDR SAVE 0038 BLINK: EQU 38H ;BLINK COUNTER 0039 BOUNCE: EQU 39H ;DEBOUNCE VARIABLE 003A REPEAT: EQU 3AH ;REPEAT REGISTER 003B ELTIME0: EQU 3BH ;EL PANEL TIMEOUT LSB 003C ELTIME1: EQU 3CH ;EL PANLE TIMEOUT MSB 003D NMIREQ: EQU 3DH ;NMI REQUEST 0040 KARRAY: EQU 40H ;KB DATA ARRAY 00E0 FIFO: EQU 0E0H ;FIFO - 20H BYTES TO END RAM ; ;BUF.LEN: EQU 20h ;FIFO LENGTH ; ;CUR.REG EQU 0EH ;CURSOR REGISTER PAIR ;DISPLAY BLINK CONSTANTS 0025 K.BLINK: EQU 37 ;75/74 CYCLES PER SECOND 0020 BLINK.B: EQU 20H ;BLINK BIT OF DISP CTL ;DISPLAY EL PANEL TIMEOUT CONSTANTS FF88 EL.K0 EQU -120 ;120 BLINK PERIODS = 1 MIN FFF6 EL.K1 EQU -10 ;10 MINUTES 0004 EL.B EQU 04H ;EL ENABLE BIT OF DISP CTL ;DEBOUNCE CONSTANTS 0002 KBDB.S: EQU 2H ;SHORT - 2 FRAME TIMES 0004 KBDB.L: EQU 4H ;LONG - 4 FRAME TIMES ;NMI STATUS CODES 0002 LOBAT2$: EQU 2 ;LO BATT 2 0004 CURSOR$: EQU 4 ;CURSOR UPDATED 0006 LOBAT1$: EQU 6 ;LO BATT 1 CHANGED 0008 IACALC$: EQU 8 ;ALT-CALC ICON 000A ICLOCK$: EQU 10 ;CLOCK ICON 000C IPHONE$: EQU 12 ;PHONE ICON 000E IDISK$: EQU 14 ;DISK ICON 0010 ICALC$: EQU 16 ;CALC ICON 0012 ACCHG$: EQU 18 ;AC CHANGED 0000 ROM.ORG: EQU 00H ;FOR SIMULATION 0000 ORG ROM.ORG ;RESET ADDRESS ; ; RESET - The 80C39 vectors here following a reset. ; 0000 0416 RESET: JMP COLD ;RESET ENTRY 0002 00 NOP 0003 2460 JMP STALL ;INT INTERRUPT 0005 00 NOP 0006 00 NOP 0007 04B4 JMP TIMER ;TIMER INTERRUPT ; ; KB INIT - Initialize the keyboard ; 0009 C5 KBINIT: SEL RB0 ;BANK 0 REGISTERS 000A BF00 MOV R7,#0 ;CLEAR KB STATE 000C D5 SEL RB1 ;BANK 1 REGISTERS 000D BAE0 MOV R2,#FIFO ;CLR FIFO-IN 000F BBE0 MOV R3,#FIFO ;CLR FIFO-OUT 0011 B8E0 MOV R0,#FIFO ;SET NDX TO FIFO-OUT 0013 B080 MOV @R0,#80H ;STUFF A BREAK CODE 0015 83 RET ;THAT'S IT ; ; COLD - Code executed one time at reset. ; 0016 COLD: ;STROBES OFF 0016 2380 MOV A,#KBDAV.N ;ALL STROBES OFF 0018 3A OUTL P2,A ;TO STROBE PORT ;INITIALIZE DISPLAY 0019 D5 SEL RB1 ;BANK 1 REGISTERS 001A 23C5 MOV A,#DSP.DFLT ;DEFAULT DISP CTL 001C B803 MOV R0,#DS.STB ;SET NDX TO DISP 001E 90 MOVX @R0,A ;AND SET THE PORT 001F AF MOV R7,A ;COPY TO SHADOW REG ; 0020 C5 SEL RB0 ;BANK 0 REGISTERS ; ; ; ;INITIALIZE KEYBOARD DATA ARRAY 0021 B840 MOV R0,#KARRAY ;SET NDX TO ARRAY 0023 B918 MOV R1,#24 ;LENGTH OF ARRAY 0025 27 CLR A ;KEYS OPEN 0026 A0 COLD1: MOV @R0,A ;CLEAR BYTE 0027 18 INC R0 ;BUMP INDEX 0028 E926 DJNZ R1,COLD1 ;DCR CNT UNTIL ZERO ;INITIALIZE BANK 0 REGISTERS 002A A8 MOV R0,A ;WORKING 002B A9 MOV R1,A ;KEY ARRAY POINTER 002C AA MOV R2,A ;ROW CNT 002D AB MOV R3,A ;DELTA DATA 002E AC MOV R4,A ;ROTATED DATA 002F AD MOV R5,A ;PWR-STATUS 0030 AE MOV R6,A ;BIT COUNT 0031 AF MOV R7,A ;KB STATE ;INITIALIZE BLINK 0032 B838 MOV R0,#BLINK ;SET NDX TO CNTR 0034 B025 MOV @R0,#K.BLINK ;AND LOAD INIT VALUE ;INITIALIZE EL PANEL TIMEOUT 0036 B83C MOV R0,#ELTIME1 ;SET NDX TO CNTR 0038 B0F6 MOV @R0,#EL.K1 ;AND LOAD INIT VALUE ;INITIALIZE NMI REQUEST 003A B83D MOV R0,#NMIREQ ;SET NDX TO REGISTER 003C B000 MOV @R0,#0 ;AND CLEAR REQUEST ;INITIALIZE BANK 1 REGISTERS 003E 1409 CALL KBINIT ;INITIALIZE THE KB ;INITIALIZE NMI STATUS 0040 BCFF MOV R4,#0FFH ;TURN ON NMI STATUS ;OTHER BANK 1 REGISTERS 0042 27 CLR A ;ZERO 0043 A9 MOV R1,A ;6845 ADDR REG 0044 AD MOV R5,A ;DISP STATUS 0045 AE MOV R6,A ;ACCUM SAVE ;SETUP THE FLAGS 0046 B5 CPL F1 ;CLR END OF FRAME 0047 95 CPL F0 ;CLR CURSOR UPDATE ;SETUP THE EVENT COUNTER 0048 23FF MOV A,#0FFH ;OVFL LESS ONE 004A 62 MOV T,A ;TO EVENT CNTR 004B 45 STRT CNT ;ENABLE CNTR ;ENABLE INTERRUPTS 004C 25 EN TCNTI ;ENABLE TIMER INT 004D 05 EN I ;ENABLE STALL INT ; ; THE MAIN LOOP ; ; WHILE NOT END OF FRAME ; 1. SEND OUT scan codes in FIFO ; 2. Poll power status port ; Process Lo Batt 2 if set ; Check for AC-ON rising ; 3. Poll NMI request register ; ; AT END OF FRAME: ; 1. Clear end of frame flag. ; 2. Send NMI if cursor updated ; 3. Update blink counter. On overflow: ; Update display blink if enabled ; Pulse attribute if mode enabled ; Update EL panel timeout if enabled ; Send Lo Batt 1 NMI is true and AC-OFF ; 4. Scan keyboard ; Skip if in debounce ; Read keyboard ; Process Changes ; 5. Auto Repeat ; ; 004E 7653 MAIN: JF1 SENDOUT ;SKIP IF NOT END FRAME 0050 B5 CPL F1 ;CLR END FRAME FLAG 0051 A400 JMP FRAME1 ;EXECUTE END FRAME CODE ; ; SEND OUT - If the 8255 is not already busy, and if the FIFO ; is not empty, the next scan code in the buffer is sent to ; the 8255, the keyboard data available latch is set, and the ; output pointer is advanced. If the end of the FIFO is reached, ; the address is wraped forming a ring buffer. If either the ; FIFO is empty, or the 8255 is busy, this routine simply returns. ; ; Bank 1 Register Usage: ; R2 = FIFO Input Pointer ; R3 = FIFO Output Pointer - Updated ; Bank 0 Register Usage: ; R0 = Data is lost ; 0053 3669 SENDOUT: JT0 DRVOFF ;IF 8255 BUSY 0055 D5 SEL RB1 ;BANK 1 REGISTERS 0056 FB MOV A,R3 ;FETCH FIFO-OUT 0057 DA XRL A,R2 ;CMPR FIFO-IN 0058 C669 JZ DRVOFF ;SKIP IF FIFO EMPTY 005A FB MOV A,R3 ;FETCH IT AGAIN 005B 17 INC A ;AND BUMP IT 005C 9660 JNZ SENDOUT1 ;SKIP IF NO OVFL 005E 23E0 MOV A,#FIFO ;WRAP THE FIFO 0060 AB SENDOUT1: MOV R3,A ;RESTORE THE PTR 0061 C5 SEL RB0 ;BANK ZERO 0062 A8 MOV R0,A ;TO NDX VIA A 0063 F0 MOV A,@R0 ;READ BUF TO A 0064 39 OUTL P1,A ;AND THEN TO 8255 0065 9A7F ANL P2,#NOT KBDAV.N ;ASSERT CPU INT1 0067 8A80 ORL P2,#KBDAV.N ;NEGATE STROBES ; ; DRIVE OFF FUNCTION ; 0069 C5 DRVOFF: SEL RB0 ;BANK 0 REGISTERS ;READ CURRENT STATE OF FDC 006A B802 MOV R0,#AUX.ENA ;SET NDX TO AUX PORT 006C 80 MOVX A,@R0 ;READ PORT TO A 006D 5340 ANL A,#40H ;MASK TO FDC ON 006F A8 MOV R0,A ;HOLD IN R0 ;READ DRIVE AND FDC OFF FROM DISP-STAT, CLR IN STAT 0070 D5 SEL RB1 ;BANK 1 REGISTERS 0071 FD MOV A,R5 ;COPY DISPLAY STATUS 0072 53CD ANL A,#0CDH ;CLR DRIVE OFF BITS 0074 2D XCH A,R5 ;SWAP WITH ORIGINAL 0075 C5 SEL RB0 ;BANK 0 REGISTERS 0076 D332 XRL A,#32H ;CMPL THE OFF BITS ;PROCESS FDC-OFF 0078 327C JB1 DRVOFF0 ;SKIP IF NOT FDC OFF 007A B800 MOV R0,#00H ;CLR FDC STATE ;PROCESS DRIVE OFF 0 007C 28 DRVOFF0: XCH A,R0 ;SWAP FOR ADDR 007D 0334 ADD A,#34H ;OFFSET TO ROW 13 007F 28 XCH A,R0 ;SWAP BACK 0080 9283 JB4 DRVOFF1 ;SKIP IF NOT DRV 0 0082 90 MOVX @R0,A ;PULSE DRV OFF 0 ;PROCESS DRIVE OFF 1 0083 28 DRVOFF1: XCH A,R0 ;SWAP WITH ADDR 0084 0304 ADD A,#4 ;OFFSET TO ROW 14 0086 28 XCH A,R0 ;SWAP BACK 0087 B28A JB5 PWRFAIL ;SKIP IF NOT DRV 1 0089 90 MOVX @R0,A ;PULSE DRV OFF 1 ; ; POWER FAIL - Test the extra port for Low Batt 2. ; If true, send an NMI 2 and once acknowledged, ; hang forever. Save the new power status. If AC-ON ; has just set, send an NMI 18. ; 008A C5 PWRFAIL: SEL RB0 ;BANK 0 REGISTERS 008B B802 MOV R0,#AUX.ENA ;SET NDX TO EXTRA PORT 008D 80 MOVX A,@R0 ;READ IN THE PORT 008E 329E JB1 PWRFAIL3 ;SKIP IF LOW BATT 2 0090 2D XCH A,R5 ;NEW VALUES TO PWR STAT ;CHECK FOR AC-ON RISING 0091 129C JB0 PWRFAIL2 ;AC WAS ON 0093 FD MOV A,R5 ;RECALL NEW STATE 0094 1298 JB0 PWRFAIL1 ;AC-ON NOW SET 0096 04A6 JMP NMIRQ ;ELSE DONE 0098 2312 PWRFAIL1: MOV A,#ACCHG$ ;NMI CODE OF AC-ON 009A 14BC CALL NMI ;NMI TO CPU 009C 04A6 PWRFAIL2: JMP NMIRQ ;AND DONE ;LO BATT 2 009E 2302 PWRFAIL3: MOV A,#LOBAT2$ ;LOAD NMI STATUS CODE 00A0 14BC CALL NMI ;SET STATUS AND PULSE NMI 00A2 15 PWRFAIL4: DIS I ;DISABLE EXT INTERRUPT 00A3 35 DIS TCNTI ;DISABLE CNTR INTERRUPT 00A4 049C JMP PWRFAIL2 ;HANG FOREVER ; ; NMI REQUEST - Test the NMIREQ variable. If it is ; non-zero, send the content to the NMI routine and ; clear the variable. ; 00A6 C5 NMIRQ: SEL RB0 ;BANK 0 REGISTERS 00A7 B83D MOV R0,#NMIREQ ;SET NDX TO NMI REQ 00A9 F0 MOV A,@R0 ;AND READ THE VARIABLE 00AA 96AE JNZ NMIRQ1 ;SKIP IF CODE PRESENT 00AC 044E JMP MAIN ;OTHERWISE DONE 00AE B000 NMIRQ1: MOV @R0,#00H ;CLEAR THE VARIABLE 00B0 14BC CALL NMI ;SET THE CODE 00B2 044E JMP MAIN ;AND DONE ; ; TIMER INTERRUPT - A sync pulse has been received from ; the LCD display causing the event counter to overflow ; and generate an interrupt. Reset the counter to -1 ; and re-arm the timer interrupt. Clear F1 to indicate ; that end of frame has been reached. ; ; F1 Cleared ; 00B4 TIMER: ;TIMER INT 00B4 A5 CLR F1 ;ENABLE END OF FRAME 00B5 D5 SEL RB1 ;FOR CORRECT R6 00B6 AE MOV R6,A ;SAVE A IN R6 00B7 23FF MOV A,#0FFH ;ONE SHORT OF OVFL 00B9 62 MOV T,A ;TO RE-ARM THE TIMER 00BA FE MOV A,R6 ;RESTORE A 00BB 93 RETR ;AND DONE ; ; NMI - If NMI is not already set, the status code from ; A is place in the NMI status register and the CPU's ; NMI request line is set. The routine then waits for ; the status register to be cleared through the STALL ; interrupt routine and then exits with A clear. If ; NMI is already active on entry, exit the routine ; immediately with the new code in A. ; ; A = NMI Status Code ; 00BC D5 NMI: SEL RB1 ;IN REGISTER BANK 0 00BD 2C XCH A,R4 ;SWAP NEW & OLD 00BE F2C6 JB7 NMI2 ;IF ALREADY NMI ON 00C0 8A20 ORL P2,#NMIRQ.P ;ASSERT NMI REQUEST 00C2 FC NMI1: MOV A,R4 ;FETCH NMI STATUS 00C3 96C2 JNZ NMI1 ;LOOP UNTIL CLEARED 00C5 83 RET 00C6 2C NMI2: XCH A,R4 ;RESTORE OLD CODE 00C7 83 RET ; ; AUTO REPEAT - SENDSCAN clears REPEAT. This ; routine will increment repeat. Once bit 7 ; is set, it latches 6 & 7. Based on the MSBs: ; 00 Delay - No Output ; 01 Repeat - 5 cps ; 10 Repeat - 10 cps ; 11 Repeat - 15 cps ; The output rate is controlled by the LSBs: ; 0000 5 cps ; d000 10 cps ; dd00 20 cps ; The character at FIFO-IN is sent unless ; it is a break code. ; 00C8 C5 FRAME4: SEL RB0 ;BANK 0 REGISTERS 00C9 B83A MOV R0,#REPEAT ;SET NDX TO CNTR 00CB F0 MOV A,@R0 ;AND FETCH IT 00CC F2D8 JB7 RPT2 ;SPEED 2 OR 3 00CE D2D4 JB6 RPT1 ;SPEED 1 00D0 17 INC A ;DELAYING 00D1 A0 MOV @R0,A ;RESTORE 00D2 044E JMP MAIN ;DONE FOR NOW ;SPEED 1 00D4 BE07 RPT1: MOV R6,#07H ;FOR 10 CPS 00D6 04E5 JMP RPT4 ; 00D8 D2DE RPT2: JB6 RPT3 ;IF SPEED 3 ;SPEED 2 00DA BE03 MOV R6,#03H ;FOR 20 CPS 00DC 04E5 JMP RPT4 ; ;SPEED 3 00DE BE01 RPT3: MOV R6,#01H ;FOR 40 CPS 00E0 17 INC A ;BUMP 00E1 43F0 ORL A,#0F0H ;LATCH HI BITS 00E3 04E6 JMP RPT5 ;CONT 00E5 17 RPT4: INC A ;BUMP 00E6 A0 RPT5: MOV @R0,A ;RESTORE 00E7 5E ANL A,R6 ;MASK LSBS 00E8 96F3 JNZ RPT6 ;NOT TIME YET 00EA D5 SEL RB1 ;TO FIFO BANK 00EB FA MOV A,R2 ;FETCH FIFO-OUT 00EC C5 SEL RB0 ;RESTORE BANK 00ED A8 MOV R0,A ;ADDR TO NDX 00EE F0 MOV A,@R0 ;LAST SCAN CODE 00EF F2F3 JB7 RPT6 ;EXIT IF BREAK 00F1 54AA CALL SENDSCAN ;DATA TO FIFO 00F3 044E RPT6: JMP MAIN ;AND DONE ; ; START OF SECOND PAGE ; 0100 ORG ROM.ORG+100H ; ; STALL INTERRUPT - This interrupt is invoked whenever the ; CPU accesses an I/O port in the range reserved for the ; IBM Color / Graphics adapter. The hardware features of ; these boards which will be emulated by this code inlcude ; the 6845, the MODE register, and the STATUS register. ; Accesses of the SELECT register and the light pen latch ; will be ignored. The interrupt response time must be ; minimized as the CPU is held in a wait state inhibiting ; refresh cycles until it is released. The interrupt ; response time for a port write operation is 18 cycles. ; ; ; THE PORT TABLE: ; The least significant four bits of the CPU address ; and the state of the IORS (I/O Read Status) line are ; read through a port and a 32 entry table is then used ; to call potentially unique routines for reading or ; writing any of the sixteen port addresses associated ; with the color graphics boars. ; ; Processor Address Port: A2 /IOR A3 A1 A0 ; ; The table will dispatch the code to: ; EXIT Illegal or Ignored Access ; WCRTADDR Write 6845 address register ; RCRTDATA Read 6845 data register ; WCRTDATA Write 6845 data register ; WMODE Write MODE register ; RSTAT Read STATUS register ; 0100 68 PORT.TBL: DB EXIT ;R0 READ 6845 ADDR 0101 D7 DB RCRTDATA ;R1 READ 6845 DATA 0102 68 DB EXIT ;R2 READ 6845 ADDR 0103 D7 DB RCRTDATA ;R3 READ 6845 DATA 0104 68 DB EXIT ;R4 READ 6845 ADDR 0105 D7 DB RCRTDATA ;R5 READ 6845 DATA 0106 68 DB EXIT ;R6 READ 6845 ADDR 0107 D7 DB RCRTDATA ;R7 READ 6845 DATA 0108 68 DB EXIT ;R8 READ MODE REG 0109 68 DB EXIT ;R9 READ SELECT 010A 9E DB RSTAT ;RA READ STATUS 010B 68 DB EXIT ;RB LIGHT PEN CLEAR 010C 68 DB EXIT ;RC READ MODE REG 010D 68 DB EXIT ;RD READ SELECT 010E 68 DB EXIT ;RE READ STATUS 010F 68 DB EXIT ;RF LIGHT PEN CLEAR 0110 B0 DB WCRTADDR ;W0 WRITE 6845 ADDR 0111 D5 DB WCRTDATA ;W1 WRITE 6845 DATA 0112 B0 DB WCRTADDR ;W2 WRITE 6845 ADDR 0113 D5 DB WCRTDATA ;W3 WRITE 6845 DATA 0114 B0 DB WCRTADDR ;W4 WRITE 6845 ADDR 0115 D5 DB WCRTDATA ;W5 WRITE 6845 DATA 0116 B0 DB WCRTADDR ;W6 WRITE 6845 ADDR 0117 D5 DB WCRTDATA ;W7 WRITE 6845 DATA 0118 7A DB WMODE ;W8 WRITE MODE REG 0119 68 DB EXIT ;W9 WRITE COLOR SELECT 011A 68 DB EXIT ;WA WRITE STATUS 011B 68 DB EXIT ;WB LIGHT PEN CLEAR 011C 68 DB EXIT ;WC LIGHT PEN SET 011D 68 DB EXIT ;WD NOT USED 011E 68 DB EXIT ;WE NOT USED 011F 68 DB EXIT ;WF NOT USED ; ; 6845 ADDRESS TABLE: ; The 6845 requires only two addresses in its ; interface while its internal structure proivides ; eighteen bytes of registers. The first accessable ; address is a pointer register used to select which ; of the internal registers is to be accessable through ; the second. This table is used to dispatch on the ; data which the CPU is attempting to write to the ; 6845's address register. ; ; A number of hardware features unique to the PIVOT have ; been concealed in registers added to the emulated 6845. ; Since these features may be accessed by the operating ; system or within an NMI, and the accesses requires a ; pair of cycles (one to set the address register and ; one to access the data register), mechanisms are ; provided for preserving address pointers of lower ; levels as higher levels are accessed. ; ; This table will dispatch to: ; WADDR Load Addres ; EXIT Ignore Address - Illegal ; NMIADR Push to SAVE2 - Load ; TRANADR Push to SAVE1 - Load ; 0120 B8 ADDR.TBL: DB WADDR ;A0 0121 B8 DB WADDR ;A1 0122 B8 DB WADDR ;A2 0123 B8 DB WADDR ;A3 0124 B8 DB WADDR ;A4 0125 B8 DB WADDR ;A5 0126 B8 DB WADDR ;A6 0127 B8 DB WADDR ;A7 0128 B8 DB WADDR ;A8 0129 B8 DB WADDR ;A9 012A B8 DB WADDR ;A10 012B B8 DB WADDR ;A11 012C B8 DB WADDR ;A12 012D B8 DB WADDR ;A13 012E B8 DB WADDR ;A14 012F B8 DB WADDR ;A15 0130 B8 DB WADDR ;A16 0131 B8 DB WADDR ;A17 0132 BC DB NMIADR ;A18 0133 68 DB EXIT ;A19 0134 CB DB TRANADR ;A20 0135 CB DB TRANADR ;A21 0136 CB DB TRANADR ;A22 0137 CB DB TRANADR ;A23 0138 CB DB TRANADR ;A24 0139 CB DB TRANADR ;A25 013A CB DB TRANADR ;A26 013B 68 DB EXIT ;A27 013C 68 DB EXIT ;A28 013D 68 DB EXIT ;A29 013E 68 DB EXIT ;A30 013F 68 DB EXIT ;A31 ; ; 6845 DATA REGISTER TABLE: ; The routines which this table passed execution to ; will normally read or write the 6845 register ; indicated by the current value in the address ; register. ; ; There are two types of accesses permitted to the ; added registers. Operating system accesses of ; registers 19-21 make transient use of the address ; register in that its value prior to selection of ; one of these registers is restored (from SAVE1) ; following the next data register access. Setting ; the address register to R18 indicates the start ; of an NMI routine causing the current state of ; the address register to be saved in SAVE2. Any ; write to R18 will clear the NMI state and restore ; the address register from SAVE2. Within an NMI, ; any number of other address or data accesses may ; be made. ; ; This table will dispatch to: ; RD.REG Read Register ; EXIT Return FFh - Illegal ; RD.18 Return NMI status code ; RD.21 Return Extra, Pop SAVE1* ; ; * SAVE1 is popped only if NMI is off ; 0140 DB RD.TBL DB RD.REG ;R0 0141 DB DB RD.REG ;R1 0142 DB DB RD.REG ;R2 0143 DB DB RD.REG ;R3 0144 DB DB RD.REG ;R4 0145 DB DB RD.REG ;R5 0146 DB DB RD.REG ;R6 0147 DB DB RD.REG ;R7 0148 DB DB RD.REG ;R8 0149 DB DB RD.REG ;R9 014A DB DB RD.REG ;R10 014B DB DB RD.REG ;R11 014C DB DB RD.REG ;R12 014D DB DB RD.REG ;R13 014E DB DB RD.REG ;R14 014F DB DB RD.REG ;R15 0150 DB DB RD.REG ;R16 0151 DB DB RD.REG ;R17 0152 E4 DB RD.18 ;R18 0153 68 DB EXIT ;R19 0154 68 DB EXIT ;R20 0155 EB DB RD.21 ;R21 0156 68 DB EXIT ;R22 0157 68 DB EXIT ;R23 0158 68 DB EXIT ;R24 0159 68 DB EXIT ;R25 015A 68 DB EXIT ;R26 015B 68 DB EXIT ;R27 015C 68 DB EXIT ;R28 015D 68 DB EXIT ;R29 015E 68 DB EXIT ;R30 015F 68 DB EXIT ;R31 0160 D5 STALL: SEL RB1 ;BANK 1 REGISTERS 0161 AE MOV R6,A ;SAVE A IN R6 0162 B803 MOV R0,#PA.ENA ;PROC ADDR TO NDX 0164 80 MOVX A,@R0 ;ADDR TO A 0165 531F ANL A,#1FH ;MASK TO 5 BITS ; ADD A,#PORT.TBL AND 0FFH 0167 ;TABLE ADDR IS ZERO 0167 B3 JMPP @A ;JUMP THROUGH TABLE 0168 8A40 EXIT: ORL P2,#PACK.P ;RELEASE HOST PROC 016A 9ABF ANL P2,#NOT PACK.P ;NEGATE STROBE 016C FE EXIT1: MOV A,R6 ;RESTORE A 016D B83C MOV R0,#ELTIME1 ;SET NDX TO EL TIMER 016F B0F6 MOV @R0,#EL.K1 ;AND RESET IT 0171 93 RETR ;AND RETURN 0172 B801 WDATA: MOV R0,#PD.ENA ;DATA ADDR TO NDX 0174 80 MOVX A,@R0 ;DATA TO ACC 0175 8A40 ORL P2,#PACK.P ;RELEASE HOST PROC 0177 9ABF ANL P2,#NOT PACK.P ;NEGATE STROBE 0179 83 RET 017A 3472 WMODE: CALL WDATA ;ACCEPT THE DATA 017C 0320 ADD A,#20H ;BLINK ENA TO B6 017E A8 MOV R0,A ;COPY TO R0 017F D301 XRL A,#01H ;CMPL BIT 0 0181 3288 JB1 WMODE1 ;SKIP IF GRAPHIC 0183 128D JB0 WMODE2 ;SKIP IF 40X25 ALPHA 0185 27 CLR A ;80X25 ALPHA 0186 248F JMP WMODE3 ;CLR HI-RES 0188 928D WMODE1: JB4 WMODE2 ;SKIP IF 640X200 018A 27 CLR A ;320X200 GRAPHIC 018B 248F JMP WMODE3 ;CLR HI-RES 018D 2310 WMODE2: MOV A,#10H ;SET HI-RES 018F 28 WMODE3: XCH A,R0 ;SWAP WITH MODE 0190 5342 ANL A,#01000010B ;KEEP BITS 1 & 6 0192 48 ORL A,R0 ;ADD HI-RES, BIT 4 0193 A8 MOV R0,A ;HOLD IN R0 0194 FF MOV A,R7 ;FETCH SHADOW 0195 53AD ANL A,#10101101B ;KEEP THE REST 0197 48 ORL A,R0 ;MERGE NEW BITS 0198 AF MOV R7,A ;UPDATE SHADOW 0199 B803 MOV R0,#DS.STB ;SET NDX TO DISP 019B 90 MOVX @R0,A ;UPDATE DISP CTL REG 019C 246C JMP EXIT1 ;AND EXIT 019E FD RSTAT: MOV A,R5 ;STATUS REG TO A 019F 5309 ANL A,#09H ;MASK TO ENA & SYNC 01A1 34A8 CALL RDATA ;REL CPU WITH DATA 01A3 D309 XRL A,#09H ;TGL SYNC & ENABLE 01A5 AD MOV R5,A ;RESTORE STATUS 01A6 246C JMP EXIT1 ;AND EXIT 01A8 B801 RDATA: MOV R0,#PD.STB ;SET NDX TO CPU DATA 01AA 90 MOVX @R0,A ;AND OUTPUT THE DATA 01AB 8A40 ORL P2,#PACK.P ;RELEASE HOST PROC 01AD 9ABF ANL P2,#NOT PACK.P ;NEGATE STROBE 01AF 83 RET 01B0 01B0 3472 WCRTADDR: CALL WDATA ;FETCH THE CPU DATA 01B2 531F ANL A,#1FH ;MASK TO FIVE BITS 01B4 A8 MOV R0,A ;HOLD COPY IN R0 01B5 0320 ADD A,#ADDR.TBL AND 0FFH ;OFST TO TABLE BASE 01B7 B3 JMPP @A ;JMP INDIRECT 01B8 F8 WADDR: MOV A,R0 ;MOVE VIA A 01B9 A9 MOV R1,A ;TO R1 01BA 246C JMP EXIT1 ;AND EXIT 01BC FC NMIADR: MOV A,R4 ;FETCH NMI STATUS 01BD F2B8 JB7 WADDR ;SKIP IF NMI SET 01BF 4380 ORL A,#80H ;IF NOT, SET IT 01C1 AC MOV R4,A ;RESTORE NMI STATUS 01C2 9ADF ANL P2,#NOT NMIRQ.P ;NEGATE THE NMI REQ 01C4 F8 MOV A,R0 ;RECALL NEW ADDR 01C5 29 XCH A,R1 ;SWAP WITH OLD 01C6 B837 MOV R0,#SAVE2 ;SET NDX TO SAVE2 01C8 A0 MOV @R0,A ;PUSH OLD R1 01C9 246C JMP EXIT1 ;AND EXIT 01CB FC TRANADR: MOV A,R4 ;FETCH NMI STATUS 01CC F2B8 JB7 WADDR ;SKIP IF NMI SET 01CE F8 MOV A,R0 ;RECALL NEW ADDR 01CF 29 XCH A,R1 ;SWAP OLD WITH NEW 01D0 B836 MOV R0,#SAVE1 ;SET NDX TO SAVE1 01D2 A0 TRANADR1: MOV @R0,A ;PUSH OLD R1 01D3 246C JMP EXIT1 ;AND EXIT 01D5 442A WCRTDATA: JMP WCRTDAT1 ;CHANGE PAGES 01D7 F9 RCRTDATA: MOV A,R1 ;FETCH THE ADDR 01D8 0340 ADD A,#RD.TBL AND 0FFH 01DA ;READ DATA TABLE 01DA B3 JMPP @A ;INDIRECT THRU TABLE 01DB F9 RD.REG: MOV A,R1 ;FETCH REG NUMBER 01DC 0320 ADD A,#CRT.REG ;ADD RAM OFST 01DE A8 MOV R0,A ;COPY TO NDX 01DF F0 MOV A,@R0 ;AND READ DATA 01E0 34A8 CALL RDATA ;SEND DATA AND REL CPU 01E2 246C JMP EXIT1 ;AND END INTERRUPT 01E4 FC RD.18: MOV A,R4 ;FETCH NMI STATUS 01E5 537F ANL A,#7FH ;MASK ACTIVE FLAG 01E7 34A8 CALL RDATA ;RETURN DATA 01E9 246C JMP EXIT1 ;AND END INTERRUPT 01EB B802 RD.21: MOV R0,#AUX.ENA ;SET NDX TO AUX PORT 01ED 80 MOVX A,@R0 ;AND READ PORT 01EE 34A8 CALL RDATA ;DATA TO CPU 01F0 449D JMP WR.EXIT ;USE WRITE'S EXIT ; ; START OF THIRD PAGE OF ROM ; 0200 ORG ROM.ORG+200H ; ; 6845 DATA REGISTER TABLE: ; The routines which this table passed execution to ; will normally read or write the 6845 register ; indicated by the current value in the address ; register. ; ; There are two types of accesses permitted to the ; added registers. Operating system accesses of ; registers 19-21 make transient use of the address ; register in that its value prior to selection of ; one of these registers is restored (from SAVE1) ; following the next data register access. Setting ; the address register to R18 indicates the start ; of an NMI routine causing the current state of ; the address register to be saved in SAVE2. Any ; write to R18 will clear the NMI state and restore ; the address register from SAVE2. Within an NMI, ; any number of other address or data accesses may ; be made. ; ; This table will dispatch to: ; WR.REG Write Register ; WEXIT Return FFh - Illegal ; WR.18 End NMI, Pop SAVE2 ; ; WR.20 Write Display, Pop SAVE1* ; WR.21 Write FDC ON, Pop SAVE1* ; WR.22 Set NMI request, Pop SAVE1* ; WR.23 Set EL Timer Disable, Pop SAVE1* ; WR.24 Set Attribute State, Pop SAVE1* ; WR.25 Drive Power Off, Pop SAVE1* ; WR.26 Keyboard Reset ; ; * SAVE1 is popped only if NMI is off ; 0200 38 WR.TBL DB WR.REG ;W0 0201 38 DB WR.REG ;W1 0202 38 DB WR.REG ;W2 0203 38 DB WR.REG ;W3 0204 38 DB WR.REG ;W4 0205 38 DB WR.REG ;W5 0206 38 DB WR.REG ;W6 0207 38 DB WR.REG ;W7 0208 38 DB WR.REG ;W8 0209 38 DB WR.REG ;W9 020A 38 DB WR.REG ;W10 020B 38 DB WR.REG ;W11 020C 38 DB WR.REG ;W12 020D 38 DB WR.REG ;W13 020E 34 DB WR.CUR ;W14 020F 34 DB WR.CUR ;W15 0210 38 DB WR.REG ;W16 0211 38 DB WR.REG ;W17 0212 3F DB WR.18 ;W18 0213 20 DB WEXIT ;W19 0214 47 DB WR.20 ;W20 0215 57 DB WR.21 ;W21 0216 60 DB WR.22 ;W22 0217 66 DB WR.23 ;W23 0218 7E DB WR.24 ;W24 0219 91 DB WR.25 ;W25 021A 9B DB WR.26 ;W26 021B 20 DB WEXIT ;W27 021C 20 DB WEXIT ;W28 021D 20 DB WEXIT ;W29 021E 20 DB WEXIT ;W30 021F 20 DB WEXIT ;W31 0220 8A40 WEXIT: ORL P2,#PACK.P ;RELEASE HOST PROC 0222 9ABF ANL P2,#NOT PACK.P ;NEGATE STROBE 0224 FE WEXIT1: MOV A,R6 ;RESTORE A 0225 B83C MOV R0,#ELTIME1 ;SET NDX TO EL TIMER 0227 B0F6 MOV @R0,#EL.K1 ;AND RESET IT 0229 93 RETR ;AND RETURN 022A B801 WCRTDAT1: MOV R0,#PD.ENA ;DATA ADDR TO NDX 022C 80 MOVX A,@R0 ;DATA TO ACC 022D 8A40 ORL P2,#PACK.P ;RELEASE HOST PROC 022F 9ABF ANL P2,#NOT PACK.P ;NEGATE STROBE 0231 A8 MOV R0,A ;HOLD IN R0 0232 F9 MOV A,R1 ;FETCH THE ADDR ; ADD A,#WR.TBL AND 0FFH 0233 ;WRITE DATA TABLE 0233 B3 JMPP @A ;INDIRECT THRU TABLE 0234 FD WR.CUR: MOV A,R5 ;FETCH DISPLAY STATUS 0235 4380 ORL A,#80H ;TURN ON CURSOR UPDATE 0237 AD MOV R5,A ;RESTORE DISP STAT 0238 F9 WR.REG: MOV A,R1 ;FETCH REG NUMBER 0239 0320 ADD A,#CRT.REG ;ADD BASE ADDR 023B 28 XCH A,R0 ;SWAP ADDR & DATA 023C A0 MOV @R0,A ;STORE DATA TO ADDR 023D 4424 JMP WEXIT1 ;AND EXIT ;WRITE NMI STATUS REGISTER 023F BC00 WR.18: MOV R4,#0 ;CLR NMI STATUS 0241 B837 MOV R0,#SAVE2 ;SET NDX TO SAVE2 0243 F0 MOV A,@R0 ;AND RESTORE 0244 A9 MOV R1,A ;VIA A 0245 4424 JMP WEXIT1 ;AND EXIT ;WRITE DISPLAY CONTROL PORT 0247 2389 WR.20: MOV A,#10001001B ;NEW BIT MASK 0249 58 ANL A,R0 ;ON NEW DATA 024A D380 XRL A,#80H ;TOGGLE CUR ENA 024C A8 MOV R0,A ;BACK ON HOLD 024D 2376 MOV A,#01110110B ;OLD BIT MASK 024F 5F ANL A,R7 ;ON OLD DATA 0250 48 ORL A,R0 ;MERGE BITS 0251 AF MOV R7,A ;UPDATE SHADOW 0252 B803 MOV R0,#DS.STB ;SET NDX TO DISP 0254 90 MOVX @R0,A ;AND UPDATE DISP 0255 449D JMP WR.EXIT ;TRANSIENT EXIT ;WRITE FDC-ON 0257 F8 WR.21: MOV A,R0 ;RECALL NEW DATA 0258 D29D JB6 WR.EXIT ;SKIP IF FDC-ON 025A 2302 MOV A,#02H ;FDC OFF BIT 025C 4D ORL A,R5 ;MERGE DISP STAT 025D AD MOV R5,A ;RESTORE STAT 025E 449D JMP WR.EXIT ;TRANSIENT EXIT ;WRITE NMI REQUEST 0260 F8 WR.22: MOV A,R0 ;RECALL NEW DATA 0261 B83D MOV R0,#NMIREQ ;SET NDX TO NMI REQ 0263 A0 MOV @R0,A ;AND STORE DATA 0264 449D JMP WR.EXIT ;TRANSIENT EXIT ;WRITE DISPLAY TIMEOUT 0266 FD WR.23: MOV A,R5 ;FETCH DISP STAT 0267 53FB ANL A,#0FBH ;MASK KEEPERS 0269 AD MOV R5,A ;BACK ON HOLD 026A F8 MOV A,R0 ;FETCH NEW DATA 026B 5304 ANL A,#04H ;BIT 2 ONLY 026D 4D ORL A,R5 ;MERGE KEEPERS 026E AD MOV R5,A ;AND RESTORE 026F 5273 JB2 WR.231 ;SKIP IF TIME INH 0271 449D JMP WR.EXIT ;OTHERWISE EXIT 0273 FF WR.231: MOV A,R7 ;FETCH SHADOW 0274 53FB ANL A,#0FBH ;MASK OUT EL PANEL 0276 28 XCH A,R0 ;SWAP WITH NEW DATA 0277 E7 RL A ;SHIFT UP BIT 1 0278 5304 ANL A,#04H ;MASK TO BIT 2 027A 48 ORL A,R0 ;MERGE OLD DATA 027B AF MOV R7,A ;AND RESTORE SHADOW 027C 449D JMP WR.EXIT ;AND DONE ;WRITE DISPLAY CONTROL PORT 027E 1284 WR.24: JB0 WR1.24 ;STATE TO HIGH 0280 9AEF ANL P2,#NOT ATENA.P ;CLEAR ATENA 0282 4486 JMP WR2.24 ;AND CONT 0284 8A10 WR1.24: ORL P2,#ATENA.P ;SET ATENA 0286 2340 WR2.24: MOV A,#01000000B ;MASK TO PULSE MODE 0288 58 ANL A,R0 ;INHIBIT ON NEW DATA 0289 A8 MOV R0,A ;HOLD IN R0 028A FD MOV A,R5 ;FETCH DISP STATUS 028B 53BF ANL A,#10111111B ;OLD BIT MASK 028D 48 ORL A,R0 ;MERGE WITH NEW 028E AD MOV R5,A ;AND RESTORE STATUS 028F 449D JMP WR.EXIT ;TRANSIENT EXIT ;WRITE DRIVE OFF BITS OF DISPLAY STATUS REGISTER 0291 5332 WR.25: ANL A,#32H ;MASK DRV OFF BITS 0293 A8 MOV R0,A ;HOLD IN R0 0294 FD MOV A,R5 ;FETCH DISP STATUS 0295 53CD ANL A,#0CDH ;MASK OLD BITS 0297 48 ORL A,R0 ;MERGE NEW BITS 0298 AD MOV R5,A ;RESTORE STATUS 0299 449D JMP WR.EXIT ;TRANSIENT EXIT ;SOFTWARE RESET OF KEYBOARD 029B 1409 WR.26: CALL KBINIT ;RESET KEYBOARD ; JMP WR.EXIT ;TRANSIENT EXIT ;TRANSIENT EXIT 029D FC WR.EXIT: MOV A,R4 ;FETCH NMI STATUS 029E F2A4 JB7 WR.EXIT1 ;SKIP IF NMI SET 02A0 B836 MOV R0,#SAVE1 ;SET NDX TO SAVE1 02A2 F0 MOV A,@R0 ;AND RESTORE R1 02A3 A9 MOV R1,A ;VIA A ;NORMAL EXIT 02A4 FE WR.EXIT1: MOV A,R6 ;RESTORE A 02A5 B83C MOV R0,#ELTIME1 ;SET NDX TO EL TIMER 02A7 B0F6 MOV @R0,#EL.K1 ;AND RESET IT 02A9 93 RETR ;AND DONE ; ; SEND SCAN - This routine will return the address of ; the next available FIFO-IN location. If the FIFO is ; full, this location will be the same as the previous ; location and the pointer will not be incremented. ; ; Called By SCANCODE and REPEAT, Returns in RB0 ; ; Bank 1 Register Usage: ; R2 = FIFO Input Pointer - Updated ; R3 = FIFO Output Pointer ; Bank 0 Register Usage: ; 02AA A8 SENDSCAN: MOV R0,A ;HOLD IN R0 02AB D5 SEL RB1 ;BANK 1 REGISTERS 02AC FA MOV A,R2 ;FETCH FIFO-IN 02AD 17 INC A ;BUMP PTR 02AE 96B2 JNZ SNDSCAN1 ;SKIP IF NOT OVFL 02B0 23E0 MOV A,#FIFO ;WRAP THE FIFO 02B2 DB SNDSCAN1: XRL A,R3 ;CMP FIFO-OUT 02B3 C6BB JZ SNDSCAN2 ;SKIP IF BUF FULL 02B5 DB XRL A,R3 ;RESTORE ADDR 02B6 AA MOV R2,A ;UPDATE FIFO-IN 02B7 C5 SEL RB0 ;RESTORE BANK 02B8 28 XCH A,R0 ;SWAP ADDR & DATA 02B9 A0 MOV @R0,A ;SEND DATA TO FIFO 02BA 83 RET ;AND DONE 02BB FA SNDSCAN2: MOV A,R2 ;FETCH OLD VALUE 02BC C5 SEL RB0 ;RESTORE BANK 02BD 28 XCH A,R0 ;SWAP ADDR & DATA 02BE A0 MOV @R0,A ;SEND DATA TO FIFO 02BF 83 RET ; ; START OF FOURTH PAGE OF ROM ; ; ; LOOKUP SCAN CODE - A scan code is looked up for each ; bit set in the accumulator assuming that R1 indicates ; the matrix row from which the data was obtained. If ; bit 7 is set in the located code, an NMI is generated ; using the balance of the code as a status. Otherwise, ; 80H is added to the locaed code if F0 was set and the ; result is placed in the FIFO. ; ; Bank 0 Register Usage: ; A = Image of Changed Keys ; R2 = 13 - Matrix Row Number ; F0 = Generate Break Codes ; ; A = Scan Code or NMI Status ; R4 = Save Rotated Delta ; R6 = Save Bit Counter ; R7 = Current Keyboard State ; 0300 ORG ROM.ORG+300H ;TABLE AT X00 ; BIT 0 1 2 3 4 5 6 7 0300 3B3D3F42 SCANTBL: DB 3BH,3DH,3FH,42H,44H,X09,X08,00H ;ROW12 0308 3C3E4041 DB 3CH,3EH,40H,41H,43H,X0A,X07,00H ;ROW11 0310 0EF0AED2 DB 0EH,X1C,X05,X12,X0F,X0C,X13,X14 ;ROW10 0318 B11CC3CF DB X06,1CH,X0D,X11,X0E,X0B,X10,32H ;ROW9 0320 1A00DB07 DB 1AH,00H,X15,07H,15H,23H,19H,31H ;ROW8 0328 A82BDE06 DB X03,2BH,X16,06H,14H,22H,X17,30H ;ROW7 0330 0FE70C04 DB 0FH,X19,0CH,04H,12H,20H,0BH,2EH ;ROW6 0338 AB1BED03 DB X04,1BH,X1B,03H,11H,1FH,X18,2DH ;ROW5 0340 3AA20005 DB 3AH,X00,00H,05H,13H,21H,39H,2FH ;ROW4 0348 0100A402 DB 01H,00H,X01,02H,10H,1EH,X1A,2CH ;ROW3 0350 00000000 DB 00H,00H,00H,00H,00H,00H,00H,X02 ;ROW2 0358 00000000 DB 00H,00H,00H,00H,00H,00H,00H,X1D ;ROW1 0360 BE08 SCANCODE: MOV R6,#8 ;INITIATE CNT 0362 F7 SC1: RLC A ;NEXT BIT TO CRY 0363 E682 JNC SC8 ;SKIP IF NOT SET 0365 AC MOV R4,A ;SAVE ROTATED DELTA 0366 FA MOV A,R2 ;GET ROW INDEX 0367 07 DEC A ;ADJUST TO 11-0 0368 E7 RL A ;AND SHIFT UP - 1 0369 E7 RL A ; - 2 036A E7 RL A ; - 3 036B 6E ADD A,R6 ;MERGE THE BIT NUMBER 036C 07 DEC A ;DECR FOR 8-1 TO 7-0 036D A3 MOVP A,@A ;AND FETCH THE CODE 036E F28D JB7 SC.CONV ;SKIP IF EXEC CODE 0370 B693 JF0 SC.BRK ;SKIP IF BREAK 0372 54AA CALL SENDSCAN ;DATA TO FIFO 0374 B839 SC5: MOV R0,#BOUNCE ;SET NDX TO BOUNCE 0376 FA MOV A,R2 ;GET ROW NUMBER 0377 03FD ADD A,#-3 ;LOOP CNT > 2 ? 0379 E67F JNC SC6 ;YES, USE SHORT DLY 037B B002 MOV @R0,#KBDB.S ;LOAD SHORT DELAY 037D 6481 JMP SC7 ;AND CONT 037F B004 SC6: MOV @R0,#KBDB.L ;LOAD LONG DELAY 0381 FC SC7: MOV A,R4 ;RESTORE ROTATED DATA 0382 EE62 SC8: DJNZ R6,SC1 ;REPEAT FOR 8 BITS 0384 B83A MOV R0,#REPEAT ;SET NDX TO RERPEAT 0386 B000 MOV @R0,#0 ;AND RESET IT 0388 B83C MOV R0,#ELTIME1 ;SET NDX TO EL TIMER 038A B0F6 MOV @R0,#EL.K1 ;AND RESET IT 038C 83 RET ;AND DONE 038D 9400 SC.CONV: CALL CONVERT ;SKIP TO NEXT PAGE 038F B681 JF0 SC7 ;NO DEBOUNCE ON BREAK 0391 6474 JMP SC5 ;SET DEBOUNCE 0393 0393 4380 SC.BRK: ORL A,#80H ;ADD BREAK BIT 0395 54AA CALL SENDSCAN ;DATA TO FIFO 0397 6481 JMP SC7 ;NO DEBOUNCE ; ; START OF FIFTH PAGE OF ROM ; ; ; CONVERT - The SCANCODE routine will convert keyboard ; column/row information to either a PC equivalent scan ; code or to a special conversion code which will be ; indicated by bit 7 being a 1. This routine will ; further decode this information. ; ; A = Output of scan code table with B7 = 1 ; ; F0 = 1 for break, 0 for make. ; ; The keyboard state is held in R7 of bank 0: ; ; b7 b6 b5 b4 b3 b2 b1 ; ls rs ctl num ins scroll alt ; ; The Rom Bios will handle: ; ; Left Arrow / Home ; Right Arrow / End ; Up Arrow / Page Up ; Down Arrow / Page Down ; Print Screen ; 0400 ORG ROM.ORG+400H ;TABLE AT X00 0400 B3 CONVERT: JMPP @A ;INDIRECT THRU TBL ; ; STATE KEYS - This routine will maintain the states ; of LS, RS, CTL and NUM LOCK. ; 0401 A8 CONV.LS: MOV R0,A ;HOLD ENTRY IN R0 0402 FF MOV A,R7 ;FETCH STATE 0403 B60A JF0 CONV.LS1 ;SKIP IF BREAK 0405 4380 ORL A,#80H ;SET LS BIT 0407 AF MOV R7,A ;RESTORE STATE 0408 8473 JMP ARG1 ;AND SEND FIRST ARG 040A 537F CONV.LS1: ANL A,#7FH ;CLR LS BIT 040C AF MOV R7,A ;RESTORE STATE 040D 8473 JMP ARG1 ;AND SEND FIRST ARG 040F A8 CONV.RS: MOV R0,A ;HOLD ENTRY IN R0 0410 FF MOV A,R7 ;FETCH STATE 0411 B618 JF0 CONV.RS1 ;SKIP IF BREAK 0413 4340 ORL A,#40H ;SET RS BIT 0415 AF MOV R7,A ;RESTORE STATE 0416 8473 JMP ARG1 ;AND SEND FIRST ARG 0418 53BF CONV.RS1: ANL A,#0BFH ;CLR RS BIT 041A AF MOV R7,A ;RESTORE STATE 041B 8473 JMP ARG1 ;AND SEND FIRST ARG 041D A8 CONV.CTL: MOV R0,A ;HOLD ENTRY IN R0 041E FF MOV A,R7 ;FETCH STATE 041F B626 JF0 CNV.CTL1 ;SKIP IF BREAK 0421 4320 ORL A,#20H ;SET CTL BIT 0423 AF MOV R7,A ;RESTOEE STATE 0424 8473 JMP ARG1 ;AND SEND FIRST ARG 0426 53DF CNV.CTL1: ANL A,#0DFH ;CLR CTL BIT 0428 AF MOV R7,A ;RESTORE STATE 0429 8473 JMP ARG1 ;AND SEND FIRST ARG 042B A8 CONV.LCK: MOV R0,A ;HOLD ENTRY IN R0 042C FF MOV A,R7 ;FETCH STATE 042D B273 JB5 ARG1 ;SND NUM LOCK IF CTL 042F B641 JF0 CNV.LCK2 ;SKIP IF BREAK 0431 F23C JB7 CNV.LCK1 ;SEND SCROLL LOCK 0433 D23C JB6 CNV.LCK1 ; IF EITHER SHIFT 0435 53FB ANL A,#0FBH ;CLR SCROLL BIT 0437 D310 XRL A,#10H ;TOGGLE NUM LOCK 0439 AF MOV R7,A ;RESTORE STATE 043A 8473 JMP ARG1 ;SEND NUM LOCK 043C 4304 CNV.LCK1: ORL A,#04H ;SET SCROLL BIT 043E AF MOV R7,A ;RESTORE STATE 043F 8477 JMP ARG2 ;SEND SCROLL 0441 5277 CNV.LCK2: JB2 ARG2 ;BREAK SCROLL LOCK 0443 8473 JMP ARG1 ;BREAK NUM LOCKLOCK 0445 A8 CONV.DEL: MOV R0,A ;HOLD ENTRY IN R0 0446 FF MOV A,R7 ;FETCH STATE 0447 B657 JF0 CNV.DEL2 ;SKIP IF BREAK 0449 F252 JB7 CNV.DEL1 ;SEND INSERT IF 044B D252 JB6 CNV.DEL1 ; EITHER SHIFT 044D 53F7 ANL A,#0F7H ;CLR INS BIT 044F AF MOV R7,A ;RESTORE STATE 0450 8473 JMP ARG1 ;SEND DELETE 0452 4308 CNV.DEL1: ORL A,#08H ;SET INS BIT 0454 AF MOV R7,A ;RESTORE STATE 0455 8477 JMP ARG2 ;SEND INSERT 0457 7277 CNV.DEL2: JB3 ARG2 ;BREAK INSERT 0459 8473 JMP ARG1 ;BREAK DELETE 045B A8 CONV.ALT: MOV R0,A ;HOLD ENTRY IN R0 045C FF MOV A,R7 ;FETCH STATE 045D B664 JF0 CNV.ALT1 ;SKIP IF BREAK 045F 4302 ORL A,#02H ;SET ALT BIT 0461 AF MOV R7,A ;RESTORE STATE 0462 8473 JMP ARG1 ;AND SEND FIRST ARG 0464 53FD CNV.ALT1: ANL A,#0FDH ;CLR CTL BIT 0466 AF MOV R7,A ;RESTORE STATE 0467 8473 JMP ARG1 ;AND SEND FIRST ARG ; ; CONTROL FUNCTIONS - This routine handles "Prt On" ; which will send a CTL-P, and "Break" which will send a ; CTL-SCROLL LOCK. "Pause" is handled by CONV.LOCK: ; 0469 A8 CTLKEYS: MOV R0,A ;HOLD ENTRY IN R0 046A FF MOV A,R7 ;FETCH STATE 046B B277 JB5 ARG2 ;SKP IF CTL TO 2ND ARG 046D 8473 JMP ARG1 ;JMP TO FIRST ARG ; ; NUMERIC KEYPAD - Keys in the range of the numeric ; keypad will come through here. If NUM LOCK is false ; the normal key function will be transmitted. If NUM LOCK ; is true, the numeric keypad equivalent will be transmitted. ; 046F A8 NUMPAD: MOV R0,A ;HOLD ENTRY IN R0 0470 FF MOV A,R7 ;FETCH STATE 0471 9277 JB4 ARG2 ;SKIP IF NUM LOCK 0473 F8 ARG1: MOV A,R0 ;RECALL ENTRY 0474 17 INC A ;ADDR FIRST ARG 0475 847A JMP ARGS ;AND CONTINUE 0477 F8 ARG2: MOV A,R0 ;RECALL ENTRY 0478 0302 ADD A,#2 ;ADDR SECOND ART 047A A3 ARGS: MOVP A,@A ;FETCH THE ARG 047B B67F JF0 ARGS2 ;SKIP IF KEY BREAK 047D 8481 JMP ARGS3 ; 047F 0380 ARGS2: ADD A,#80H ;ADD BREAK BIT 0481 44AA ARGS3: JMP SENDSCAN ;SEND THE BREAK ; ; ARROW KEYS - If NUM LOCK is active, these keys ; send the arrow key scan code. If not, they ; send either the arrow key or function key ; depending on the shift stat. ; 0483 A8 ARROW: MOV R0,A ;HOLD ENTRY IN R0 0484 FF MOV A,R7 ;FETCH STATE 0485 9273 JB4 ARG1 ;IF NUM LOCK 0487 F277 JB7 ARG2 ;IF LEFT SHIFT 0489 D277 JB6 ARG2 ;IF RIGHT SHIFT 048B 8473 JMP ARG1 ;IF UN-SHIFTED ; ; ICON KEYS - Icon keys will execute this code. If ; processing a key make, the NMI status code for the ; key will be transmitted by the NMI routine. ; 048D B694 ICONS: JF0 ICONS2 ;SKIP IF BREAK 048F 17 ICONS1: INC A ;FIRST ARG 0490 A3 MOVP A,@A ;FETCH NMI STATUS 0491 14BC CALL NMI ;AND SEND CODE 0493 C5 SEL RB0 ;RESTORE REG BANK 0494 83 ICONS2: RET ;AND DONE ; ; CALCULATOR ICON - Same as ICON KEYS except that ; a unique NMI code is generated for ALT-CALC ; 0495 B694 CALCICON: JF0 ICONS2 ;SKIP IF BREAK 0497 A8 MOV R0,A ;HOLD IN R0 0498 FF MOV A,R7 ;FETCH STATE 0499 329E JB1 CALC2 ;IF ALT 049B F8 MOV A,R0 ;RECALL ADDR 049C 848F JMP ICONS1 ;NMI FIRST ARG 049E F8 CALC2: MOV A,R0 ;RECALL ADDR 049F 17 INC A ;BUMP ARG 04A0 848F JMP ICONS1 ;NMI SECOND ARG 04A2 01 X00: DB CONV.LS ;LEFT SHIFT KEY, 4.1 04A3 2A DB 02AH 04A4 0F X01: DB CONV.RS ;RIGHT SHIFT KEY, 3.2 04A5 36 DB 036H 04A6 04A6 1D X02: DB CONV.CTL ;CONTROL KEY, 2.7 04A7 1D DB 01DH 04A8 2B X03: DB CONV.LCK ;LOCK KEY, 7.0 04A9 45 DB 045H ;NUM LOCK 04AA 46 DB 046H ;SCROLL LOCK 04AB 04AB 45 X04: DB CONV.DEL ;DELETE KEY, 5.0 04AC 53 DB 053H ;DELETE 04AD 52 DB 052H ;INSERT 04AE 69 X05: DB CTLKEYS ;BREAK, 4.4 04AF 0D DB 00DH ;= 04B0 46 DB 046H ;SCROLL LOCK 04B1 69 X06: DB CTLKEYS ;PRINTER ON, 9.0 04B2 28 DB 028H ;' 04B3 19 DB 019H ;^P 04B4 8D X07: DB ICONS ;CLOCK ICON, 11.6 04B5 0A DB ICLOCK$ ;NMI STATUS CODE 04B6 8D X08: DB ICONS ;PHONE ICON, 12.6 04B7 0C DB IPHONE$ 04B8 04B8 8D X09: DB ICONS ;DISK ICON, 12.5 04B9 0E DB IDISK$ 04BA 95 X0A: DB CALCICON ;CALCULATOR ICON, 11.5 04BB 10 DB ICALC$ ;CALC 04BC 08 DB IACALC$ ;ALT-CALC 04BD 6F X0B: DB NUMPAD ;FUNCTION OF NUM LOCK, 9.5 04BE 24 DB 024H ;J - Alpha Key Board 04BF 4F DB 04FH ;1 - Numeric Key Pad 04C0 6F X0C: DB NUMPAD ; 10.5 04C1 25 DB 025H ;K 04C2 50 DB 050H ;2 04C3 6F X0D: DB NUMPAD ; 9.2 04C4 26 DB 026H ;L 04C5 51 DB 051H ;3 04C6 6F X0E: DB NUMPAD ; 9.4 04C7 16 DB 016H ;U 04C8 4B DB 04BH ;4 04C9 6F X0F: DB NUMPAD ; 10.4 04CA 17 DB 017H ;I 04CB 4C DB 04CH ;5 04CC 6F X10: DB NUMPAD ; 9.6 04CD 18 DB 018H ;O 04CE 4D DB 04DH ;6 04CF 6F X11: DB NUMPAD ; 9.3 04D0 08 DB 008H ;7 04D1 47 DB 047H ;7 04D2 6F X12: DB NUMPAD ; 10.3 04D3 09 DB 009H ;8 04D4 48 DB 048H ;8 04D5 6F X13: DB NUMPAD ; 10.6 04D6 0A DB 00AH ;9 04D7 49 DB 049H ;9 04D8 6F X14: DB NUMPAD ; 10.7 04D9 33 DB 033H ;, 04DA 52 DB 052H ;0 04DB 6F X15: DB NUMPAD ; 8.2 04DC 35 DB 035H ;/ 04DD 4E DB 04EH ;+ 04DE 6F X16: DB NUMPAD ; 7.2 04DF 27 DB 027H ;; 04E0 4A DB 04AH ;- 04E1 6F X17: DB NUMPAD ; 7.6 04E2 34 DB 34H ;. 04E3 53 DB 53H ;. 04E4 83 X18: DB ARROW ;FUNCTION OF SHIFT, 5.6 04E5 4B DB 4BH ;< 04E6 47 DB 47H ;Home 04E7 83 X19: DB ARROW ; 6.1 04E8 4D DB 4DH ;> 04E9 4F DB 4FH ;End 04EA 83 X1A: DB ARROW ; 3.6 04EB 48 DB 48H ;^ 04EC 49 DB 49H ;Page Up 04ED 83 X1B: DB ARROW ; 5.2 04EE 50 DB 50H ;V 04EF 51 DB 51H ;Page Down 04F0 69 X1C: DB CTLKEYS ;Print Screen, 10.1 04F1 29 DB 29H ;` 04F2 37 DB 37H ;* 04F3 5B X1D: DB CONV.ALT ;ALTKEY, 1.7 04F4 38 DB 38H ; ; ; START OF SIXTH PAGE OF ROM ; ; FRAME - This page of the rom contains all of the ; routines which execute at the end of each frame ; time of the display. These include the cursor ; update NMI, blink and EL timeouts, keyboard ; debouncing and keyboard scanning. ; 0500 ORG ROM.ORG+500H ;TABLE AT X00 ; ; FRAME1 - Generate CPU NMI is cursor register has ; been updated since the last end of frame. ; 0500 D5 FRAME1: SEL RB1 ;BANK1 REGISTERS 0501 FD MOV A,R5 ;FETCH DISPLAY STATUS 0502 5380 ANL A,#80H ;MASK CURSOR UPDATE 0504 C60C JZ FRAME2 ;SKIP IF NOT SET 0506 DD XRL A,R5 ;CLR UPDATE BIT 0507 AD MOV R5,A ;AND RESTORE STATUS 0508 2304 MOV A,#CURSOR$ ;LOAD NMI STATUS CODE 050A 14BC CALL NMI ;AND SEND NMI ; ; BLINK - Increment the BLINK variable. If no overflow, ; go on to FRAME3. Otherwise, re-initialize the counter. ; If blink is enabled, toggle the blink bit in the display ; control shadow register, otherwise, turn off the blink ; bit in the shadow register. If attribute enable pulsing ; mode is enabled in the display status register, pulse ; attribute enable. Increment the EL panel ; least significant byte. If overflow, reset and increment ; the EL panel most significant byte. If it overflows, ; set it back to -1 so that it will overflow next time and ; clear the EL panel enable bit in the shadow. ; Copy the shadow to the control register. ; 050C C5 FRAME2: SEL RB0 ;BANK 0 REGISTERS 050D B838 MOV R0,#BLINK ;SET NDX TO BLINK 050F 10 INC @R0 ;BUMP IT 0510 F0 MOV A,@R0 ;FETCH NEW VALUE 0511 9657 JNZ FRAME3 ;SKIP IF NOT ZERO ;RE-INITIALIZE BLINK TIMER 0513 B0DB MOV @R0,#-K.BLINK ;RE-INIT THE CNTR ;UPDATE DISPLAY BLINK CONTROL 0515 D5 SEL RB1 ;BANK 1 REGISTERS 0516 FF MOV A,R7 ;FETCH DISPLAY CTL 0517 D21D JB6 FRAME21 ;SKIP IF BLINK ENABLED 0519 53DF ANL A,#0DFH ;CLR BLINK BIT 051B A41F JMP FRAME22 ;AND CONT 051D D320 FRAME21: XRL A,#BLINK.B ;TOGGLE BLINK BIT 051F AF FRAME22: MOV R7,A ;RESTORE CTL SHADOW ;PULSE ATTRIBUTE ENABLE IS MODE ACTIVE 0520 FD MOV A,R5 ;FETCH DISP STATUS 0521 D227 JB6 FRAME225 ;SKIP IF INHIBITED 0523 9AEF ANL P2,#NOT ATENA.P ;PULSE LOW 0525 8A10 ORL P2,#ATENA.P ;AND THEN HIGH ;UPDATE EL PANEL TIMEOUT 0527 5247 FRAME225: JB2 FRAME25 ;SKIP TIMEOUT DISABLED 0529 C5 SEL RB0 ;BANK 0 REGISTERS 052A B83C MOV R0,#ELTIME1 ;SET NDX TO TIMER MSB 052C F0 MOV A,@R0 ;FETCH CURRENT VALUE 052D C63B JZ FRAME23 ;DISPLAY OFF 052F C8 DEC R0 ;SET NDX TO TIMER LSB 0530 10 INC @R0 ;BUMP THE COUNT 0531 F0 MOV A,@R0 ;FETCH NEW VALUE 0532 9642 JNZ FRAME24 ;DISPLAY ON 0534 B088 MOV @R0,#EL.K0 ;SET TO ONE MINUTE 0536 18 INC R0 ;SET NDX EL TIMER MSB 0537 10 INC @R0 ;BUMP THE CNT 0538 F0 MOV A,@R0 ;FETCH NEW VALUE 0539 9642 JNZ FRAME24 ;DISPLAY ON ;TURN OFF DISPLAY 053B D5 FRAME23: SEL RB1 ;BANK 1 REGISTERS 053C FF MOV A,R7 ;FETCH SHADOW 053D 53FB ANL A,#NOT EL.B ;MASK EL PANEL OFF 053F AF MOV R7,A ;AND RESTORE SHADOW 0540 A447 JMP FRAME25 ;AND UPDATE SHADOW ;TURN ON DISPLAY 0542 D5 FRAME24: SEL RB1 ;BANK 1 REGISTERS 0543 FF MOV A,R7 ;FETCH SHADOW 0544 4304 ORL A,#EL.B ;SET EL PANEL ON 0546 AF MOV R7,A ;AND RESTORE SHADOW ;UPDATE DISPLAY CONTROL PORT 0547 FF FRAME25: MOV A,R7 ;FETCH SHADOW 0548 C5 SEL RB0 ;BANK 0 REGISTERS 0549 B803 MOV R0,#DS.STB ;SET NDX TO DISP CTL 054B 90 MOVX @R0,A ;COPY SHADOW TO CTL ;PROCESS LO BATT 1 NMI 054C FD MOV A,R5 ;FETCH PWR STAT 054D 3257 JB1 FRAME3 ;SKIP IF AC-ON 054F 5253 JB2 FRAME26 ;SKIP IF LO BAT 1 0551 A457 JMP FRAME3 ;ELSE DONE 0553 2306 FRAME26: MOV A,#LOBAT1$ ;LOAD NMI CODE 0555 14BC CALL NMI ;AND SEND TO CPU ;********************************************************** ;* KEYBOARD SCAN - The following code sequence will ;* scan the key matrix for changes once per frame ;* time of the LCD display. Key operations are ;* translated into scan codes and loaded into the ;* FIFO for tranmission to the CPU. ICON keys ;* assert NMI and present status codes. Detection ;* of the simultaneous assertion of CTL, ALT and DEL ;* will result in a RESET of the CPU. ;********************************************************** 0557 FRAME3: ; ; DEBOUNCE - If there is debounce time remaining, ; decrement the time and skip reading the keyboard ; for this frame time of the display. ; 0557 C5 SEL RB0 ;BANK ZERO REGISTERS 0558 B839 MOV R0,#BOUNCE ;SET NDX TO BOUNCE 055A F0 MOV A,@R0 ;FETCH DEBOUNCE 055B C661 JZ KBSCAN1 ;SKIP IF ZERO 055D 07 DEC A ;DECR BALANCE 055E A0 MOV @R0,A ;AND RESTORE 055F 044E JMP MAIN ;TILL NEXT FRAME ; ; READ KEY MATRIX - The twelve rows of the key matrix ; are read into the corresponding even byte locations ; in the 24 byte structure KEY-ARRAY. The current state ; of FDC-ENA which is controlled by PAD6 must be main- ; tained. Turn off the KB decoder when done. ; 0561 B802 KBSCAN1: MOV R0,#AUX.ENA ;SET NDX TO AUX PORT 0563 80 MOVX A,@R0 ;READ PORT TO A 0564 5340 ANL A,#40H ;MASK TO FDC-ON 0566 0304 ADD A,#04 ;ADD FIRST KB ROW 0568 A8 MOV R0,A ;AND MOVE TO NDX 0569 B940 MOV R1,#KARRAY ;FIRST KEY ARRAY BYTE 056B BA0C MOV R2,#12 ;FOR TWELVE ROWS 056D 90 KBSCAN2: MOVX @R0,A ;SELECT KB ROW 056E 80 MOVX A,@R0 ;READ KB ROW DATA 056F A1 MOV @R1,A ;AND SAVE IN ARRAY 0570 18 INC R0 ;ADVANCE KB ROW 0571 18 INC R0 ;BY FOUR TO 0572 18 INC R0 ;NEXT KB 0573 18 INC R0 ;COLUMN 0574 19 INC R1 ;ADVANCE ARRAY NDX BY 0575 19 INC R1 ;TWO TO NEXT ENTRY 0576 EA6D DJNZ R2,KBSCAN2 ;DECR ROW CNT 0578 F8 MOV A,R0 ;COPY R0 TO A 0579 5340 ANL A,#40H ;MASK FDC ON 057B A8 MOV R0,A ;AND REPLACE 057C 90 MOVX @R0,A ;KB OFF, KEEP FDC ; ; LOCATE CHANGED KEYS - The current state of the ; key matrix is compared with the previous state. ; Changes are processed. ; 057D B940 KBSCAN3: MOV R1,#KARRAY ;START OF KARRAY 057F BA0C MOV R2,#12 ;FOR EACH ROW 0581 F1 KBSCAN4: MOV A,@R1 ;FETCH NEW DATA 0582 19 INC R1 ;NDX TO OLD DATA 0583 21 XCH A,@R1 ;XCHG NEW WITH OLD 0584 D1 XRL A,@R1 ;LOCATE CHANGES 0585 C696 JZ KBSCAN6 ;SKIP IF NONE 0587 85 CLR F0 ;SET KEY MAKE 0588 AB MOV R3,A ;SAVE A COPY 0589 51 ANL A,@R1 ;FIND THE MAKES 058A C68E JZ KBSCAN5 ;SKIP IF NONE 058C 7460 CALL SCANCODE ;PROCESS MAKES 058E F1 KBSCAN5: MOV A,@R1 ;XOR COMPLEMENT 058F 37 CPL A ;OF NEW DATA WITH 0590 5B ANL A,R3 ;WITH CHANGES TO 0591 C696 JZ KBSCAN6 ;FIND BREAKS - ANY? 0593 95 CPL F0 ;INDICATE BREAKS 0594 7460 CALL SCANCODE ;PROCESS BREAKS 0596 19 KBSCAN6: INC R1 ;BUMP TO NEXT NEW 0597 EA81 DJNZ R2,KBSCAN4 ;LOOP FOR ALL ROWS 0599 04C8 JMP FRAME4 ;TO CHANGE PAGE 0000 END ACCHG$ 0012 FRAME2 050C PWRFAIL1 0098 WMODE3 018F ADDR.TBL 0120 FRAME21 051D PWRFAIL2 009C WR.18 023F ARG1 0473 FRAME22 051F PWRFAIL3 009E WR.20 0247 ARG2 0477 FRAME225 0527 PWRFAIL4 00A2 WR.21 0257 ARGS 047A FRAME23 053B RCRTDATA 01D7 WR.22 0260 ARGS2 047F FRAME24 0542 RD.18 01E4 WR.23 0266 ARGS3 0481 FRAME25 0547 RD.21 01EB WR.231 0273 ARROW 0483 FRAME26 0553 RD.REG 01DB WR.24 027E ATENA.P 0010 FRAME3 0557 RD.TBL 0140 WR.25 0291 AUX.ENA 0002 FRAME4 00C8 RDATA 01A8 WR.26 029B BLINK 0038 IACALC$ 0008 REPEAT 003A WR.CUR 0234 BLINK.B 0020 ICALC$ 0010 RESET 0000 WR.EXIT 029D BOUNCE 0039 ICLOCK$ 000A ROM.ORG 0000 WR.EXIT1 02A4 CALC2 049E ICONS 048D RPT1 00D4 WR.REG 0238 CALCICON 0495 ICONS1 048F RPT2 00D8 WR.TBL 0200 CNV.ALT1 0464 ICONS2 0494 RPT3 00DE WR1.24 0284 CNV.CTL1 0426 IDISK$ 000E RPT4 00E5 WR2.24 0286 CNV.DEL1 0452 IPHONE$ 000C RPT5 00E6 X00 04A2 CNV.DEL2 0457 K.BLINK 0025 RPT6 00F3 X01 04A4 CNV.LCK1 043C KARRAY 0040 RSTAT 019E X02 04A6 CNV.LCK2 0441 KB.ENA 0000 SAVE1 0036 X03 04A8 COLD 0016 KB.STB 0000 SAVE2 0037 X04 04AB COLD1 0026 KBDAV.N 0080 SC.BRK 0393 X05 04AE CONV.ALT 045B KBDB.L 0004 SC.CONV 038D X06 04B1 CONV.CTL 041D KBDB.S 0002 SC1 0362 X07 04B4 CONV.DEL 0445 KBINIT 0009 SC5 0374 X08 04B6 CONV.LCK 042B KBSCAN1 0561 SC6 037F X09 04B8 CONV.LS 0401 KBSCAN2 056D SC7 0381 X0A 04BA CONV.LS1 040A KBSCAN3 057D SC8 0382 X0B 04BD CONV.RS 040F KBSCAN4 0581 SCANCODE 0360 X0C 04C0 CONV.RS1 0418 KBSCAN5 058E SCANTBL 0300 X0D 04C3 CONVERT 0400 KBSCAN6 0596 SENDOUT 0053 X0E 04C6 CRT.REG 0020 LOBAT1$ 0006 SENDOUT1 0060 X0F 04C9 CTLKEYS 0469 LOBAT2$ 0002 SENDSCAN 02AA X10 04CC CURSOR$ 0004 MAIN 004E SNDSCAN1 02B2 X11 04CF DRVOFF 0069 NMI 00BC SNDSCAN2 02BB X12 04D2 DRVOFF0 007C NMI1 00C2 STALL 0160 X13 04D5 DRVOFF1 0083 NMI2 00C6 TIMER 00B4 X14 04D8 DS.STB 0003 NMIADR 01BC TRANADR 01CB X15 04DB DSP.DFLT 00C5 NMIREQ 003D TRANADR1 01D2 X16 04DE EL.B 0004 NMIRQ 00A6 WADDR 01B8 X17 04E1 EL.K0 FF88 NMIRQ.P 0020 WCRTADDR 01B0 X18 04E4 EL.K1 FFF6 NMIRQ1 00AE WCRTDAT1 022A X19 04E7 ELTIME0 003B NUMPAD 046F WCRTDATA 01D5 X1A 04EA ELTIME1 003C PA.ENA 0003 WDATA 0172 X1B 04ED EXIT 0168 PACK.P 0040 WEXIT 0220 X1C 04F0 EXIT1 016C PD.ENA 0001 WEXIT1 0224 X1D 04F3 FDC.STB 0002 PD.STB 0001 WMODE 017A FIFO 00E0 PORT.TBL 0100 WMODE1 0188 FRAME1 0500 PWRFAIL 008A WMODE2 018D