; ;================================================================================================== ; HEATH H8 FRONT PANEL (DISPLAY AND KEYBOARD) ROUTINES ;================================================================================================== ; ; LED SEGMENTS (BIT VALUES) ; ; +--02--+ ; 40 04 ; +--01--+ ; 20 08 ; +--10--+ 80 ; ; H8PKEYNONE .EQU $FF ; NONE H8PKEY0 .EQU $FE H8PKEY1 .EQU $FC H8PKEY2 .EQU $FA H8PKEY3 .EQU $F8 H8PKEY4 .EQU $F6 H8PKEY5 .EQU $F4 H8PKEY6 .EQU $F2 H8PKEY7 .EQU $F0 H8PKEY8 .EQU $EF H8PKEY9 .EQU $CF H8PKEYPLUS .EQU $AF ; PLUS H8PKEYMINUS .EQU $8F ; MINUS H8PKEYMUL .EQU $6F ; MULTIPLY H8PKEYDIV .EQU $4F ; DIVIDE H8PKEYNUM .EQU $2F ; NUMBER H8PKEYDOT .EQU $0F ; DOT ; H8P_TICCNT .EQU $FFEA ; TICCNT AT $FFEA IS COPIED DOWN TO $000B FOR HEATH COMPATIBILITY H8P_SPEED .EQU $FFEC ; SPEED CONTROL VALUE IS STORED HERE H8P_SPDIO .EQU $30 H8FPIO .EQU $F0 ; DEVECHO "H8P: IO=" DEVECHO H8FPIO DEVECHO "\n" ; ;__H8P_PREINIT_______________________________________________________________________________________ ; ; CONFIGURE AND RESET PANEL ;____________________________________________________________________________________________________ ; ; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION ; H8P_PREINIT: LD HL,H8P_INTR CALL HB_ADDIM1 ; RET ; ;__H8P_INIT__________________________________________________________________________________________ ; ; DISPLAY H8 FRONT PANEL INFO ON ROMWBW CONSOLE ;____________________________________________________________________________________________________ ; H8P_INIT: CALL NEWLINE ; FORMATTING PRTS("H8FP:$") ; FORMATTING ; PRTS(" IO=0x$") ; FORMATTING LD A,H8FPIO ; GET BASE PORT CALL PRTHEXBYTE ; PRINT BASE PORT ; RET ; DONE ; ; H8 FRONT PANEL INTERRUPT ; H8P_INTR: LD (H8P_BCVAL),BC LD (H8P_DEVAL),DE LD (H8P_HLVAL),HL LD HL,(H8P_TICCNT) ; 2MS TIC COUNTER INC HL LD (H8P_TICCNT),HL CALL H8P_TIMER ; UP TIMER CALL H8P_STAT ; CHECK KEYPAD PRESS CALL H8P_GETSEGIDX ; SEGMENT INDEX IN (C) CALL H8P_HORN OR C OUT (H8FPIO),A ; CLEAR INTERRUPT AND SET LED IDX LD C,A LD A,(H8P_FPENA) OR A LD A,$FF CALL NZ,H8P_GETSEGPAT OUT (H8FPIO+1),A ; SET LED PATTERN ; CALL H8P_KEYPAD LD A,(H8P_STTIMER) INC A AND $1F ; UPDATE LEDS EVERY 32 TICKS LD (H8P_STTIMER),A CALL Z,H8P_HDLSTATE LD A,(H8P_HBTICK) ; ROMWBW TIMER INC A LD (H8P_HBTICK),A CP 10 RET NZ CALL HB_TICK XOR A LD (H8P_HBTICK),A INC A ; INTERRUPT HANDLED RET ; ; HANDLE FRONT PANEL SPEAKER SOUNDS ; H8P_HORN: LD HL,(H8P_HORNDUR) LD A,H OR L LD A,$D0 ; HORN OFF RET Z DEC HL LD (H8P_HORNDUR),HL LD A,$50 ; HORN ON RET ; ; HANDLE UP-TIME TIMER ; H8P_TIMER: LD HL,(H8P_ONESEC) DEC HL LD (H8P_ONESEC),HL LD A,H OR L RET NZ LD HL,(H8P_UPTIME) INC HL LD (H8P_UPTIME),HL LD HL,500 LD (H8P_ONESEC),HL CALL H8P_TIMER1 LD A,(H8P_STATE) OR A CALL Z,H8P_TIMER2 RET ; ADVANCE DIGITS H8P_TIMER1: LD C,9 LD HL,H8P_UPTDIG+8 CALL H8P_ADVDIG RET ; SHOW DIGITS H8P_TIMER2: LD DE,H8P_UPTDIG+8 LD HL,H8P_SEGBUF+8 LD C,9 H8P_TIMER3: PUSH BC PUSH HL LD A,C CP 7 JR Z,H8P_TIMER4 CP 4 JR Z,H8P_TIMER4 JR H8P_TIMER5 H8P_TIMER4: LD A,$80 JR H8P_TIMER6 H8P_TIMER5: LD HL,H8P_DIGMAP LD A,(DE) LD C,A LD B,0 ADD HL,BC LD A,(HL) H8P_TIMER6: POP HL LD (HL),A DEC HL DEC DE POP BC DEC C JR NZ,H8P_TIMER3 RET H8P_ADVDIG: LD A,(HL) ; 000.000.00X INC A LD (HL),A CP 10 ; 0-9 RET NZ LD (HL),0 DEC HL LD A,(HL) ; 000.000.0X0 INC A LD (HL),A CP 6 ; 0-5 RET NZ LD (HL),0 DEC HL DEC HL LD A,(HL) ; 000.00X.000 INC A LD (HL),A CP 10 ; 0-9 RET NZ LD (HL),0 DEC HL LD A,(HL) ; 000.0X0.000 INC A LD (HL),A CP 6 ; 0-5 RET NZ LD (HL),0 DEC HL DEC HL LD A,(HL) ; 00X.000.000 INC A LD (HL),A CP 10 ; 0-9 RET NZ LD (HL),0 DEC HL LD A,(HL) ; 0X0.000.000 INC A LD (HL),A CP 10 ; 0-9 RET NZ LD (HL),0 DEC HL LD A,(HL) ; X00.000.000 INC A LD (HL),A CP 10 ; 0-9 RET NZ LD (HL),0 RET ; ; CHECK FOR KEY PRESS, SAVE RAW VALUE ; H8P_STAT: IN A,(H8FPIO) LD (H8P_KEYBUF),A RET ; ; GET KEY AND RESET KEYBUF ; H8P_GETKEY: LD A,(H8P_KEYBUF) RET ; H8P_KEYPAD: CALL H8P_GETKEY LD C,A LD A,(H8P_LSTKEY) CP C RET Z LD A,C LD (H8P_LSTKEY),A CP H8PKEYNONE RET Z LD HL,$04 LD (H8P_HORNDUR),HL CP H8PKEYDIV ; / KEY (ALTER) JP Z,H8P_KEYPADALT CP H8PKEYMUL ; * KEY (CANCEL) JP Z,H8P_KEYPADCAN CP H8PKEYNUM ; MEM KEY JP Z,H8P_KEYPADMEM CP H8PKEYDOT ; REG KEY JP Z,H8P_KEYPADREG CP H8PKEY9 JP Z,H8P_KEYPAD9 CP H8PKEY8 JP Z,H8P_KEYPAD8 CP H8PKEY7 JP Z,H8P_KEYPAD7 CP H8PKEY6 JP Z,H8P_KEYPAD6 CP H8PKEY5 JP Z,H8P_KEYPAD5 CP H8PKEY4 JP Z,H8P_KEYPAD4 CP H8PKEY3 JP Z,H8P_KEYPAD3 CP H8PKEY2 JP Z,H8P_KEYPAD2 CP H8PKEY1 JP Z,H8P_KEYPAD1 CP H8PKEY0 JP Z,H8P_KEYPAD0 CP H8PKEYPLUS JP Z,H8P_KEYPADPLUS CP H8PKEYMINUS JP Z,H8P_KEYPADMINUS RET ; RESET TIMER H8P_KEYPADALT: LD A,(H8P_FPENA) OR A RET Z LD A,(H8P_STATE) OR A RET NZ XOR A LD C,9 LD HL,H8P_UPTDIG H8P_KEYPADALTL: LD (HL),A INC HL DEC C JR NZ,H8P_KEYPADALTL RET ; ENABLE FRONT PANEL DISPLAY H8P_KEYPADCAN: LD A,(H8P_FPENA) CPL LD (H8P_FPENA),A RET ; SET MEM STATE H8P_KEYPADMEM: LD A,2 LD (H8P_STATE),A LD (H8P_MEMENTER),A XOR A LD (H8P_MEMADRIDX),A CALL H8P_UPDMEMLOC RET ; SET REG STATE H8P_KEYPADREG: LD A,1 LD (H8P_STATE),A XOR A LD (H8P_MEMENTER),A RET ; NOTHING H8P_KEYPAD9: ; RET ; TIMER H8P_KEYPAD8: LD A,(H8P_STATE) CP 2 RET Z LD A,0 LD (H8P_STATE),A RET ; SPEED CONTROL H8P_KEYPAD7: LD A,(H8P_STATE) CP 2 ; MEM MODE LD A,7 JP Z,H8P_KEYPADDIG LD A,3 LD (H8P_STATE),A RET ; PC (OUT) H8P_KEYPAD6: LD A,(H8P_STATE) CP 2 ; MEM MODE LD A,6 JP Z,H8P_KEYPADDIG LD A,5 LD (H8P_REGNUM),A RET ; HL (IN) H8P_KEYPAD5: LD A,(H8P_STATE) CP 2 ; MEM MODE LD A,5 JP Z,H8P_KEYPADDIG LD A,3 LD (H8P_REGNUM),A RET ; DE H8P_KEYPAD4: LD A,(H8P_STATE) CP 2 ; MEM MODE LD A,4 JP Z,H8P_KEYPADDIG LD A,2 LD (H8P_REGNUM),A RET ; BC H8P_KEYPAD3: LD A,(H8P_STATE) CP 2 ; MEM MODE LD A,3 JP Z,H8P_KEYPADDIG LD A,1 LD (H8P_REGNUM),A RET ; AF H8P_KEYPAD2: LD A,(H8P_STATE) CP 2 ; MEM MODE LD A,2 JP Z,H8P_KEYPADDIG LD A,0 LD (H8P_REGNUM),A RET ; SP H8P_KEYPAD1: LD A,(H8P_STATE) CP 2 ; MEM MODE LD A,1 JP Z,H8P_KEYPADDIG LD A,4 LD (H8P_REGNUM),A RET ; NOTHING H8P_KEYPAD0: LD A,(H8P_STATE) CP 2 ; MEM MODE JP NZ,H8P_KEYPAD8 LD A,0 ; H8P_KEYPADDIG: LD C,A LD A,(H8P_MEMENTER) OR A JR Z,H8P_KEYPADDIG1 LD A,(H8P_MEMADRIDX) OR A CALL Z,H8P_SETDIG0 DEC A CALL Z,H8P_SETDIG1 DEC A CALL Z,H8P_SETDIG2 DEC A CALL Z,H8P_SETDIG3 DEC A CALL Z,H8P_SETDIG4 DEC A CALL Z,H8P_SETDIG5 CALL H8P_UPDMEMLOC ; NEXT MEMORY ADR INDEX LD A,(H8P_MEMADRIDX) INC A LD (H8P_MEMADRIDX),A CP 6 RET NZ XOR A LD (H8P_MEMADRIDX),A RET ; CHECK FOR IN/OUT TO PORT H8P_KEYPADDIG1: LD A,C CP 5 ; IN PORT JR Z,H8P_KEYPADINP CP 6 ; OUT PORT JR Z,H8P_KEYPADOUT RET H8P_KEYPADINP: LD BC,(H8P_MEMLOC) IN A,(C) LD B,A LD (H8P_MEMLOC),BC JP H8P_UPDMEMLOC H8P_KEYPADOUT: LD BC,(H8P_MEMLOC) LD A,B OUT (C),A RET H8P_UPDMEMLOC: LD BC,H8P_MEMLOC LD HL,H8P_SEGBUF CALL H8P_FILLOCT RET ; C=VAL H8P_SETDIG0: LD HL,(H8P_MEMLOC) LD B,H CALL H8P_SETOCTH LD H,A LD (H8P_MEMLOC),HL LD A,$FF RET H8P_SETDIG1: LD HL,(H8P_MEMLOC) LD B,H CALL H8P_SETOCTM LD H,A LD (H8P_MEMLOC),HL LD A,$FF RET H8P_SETDIG2: LD HL,(H8P_MEMLOC) LD B,H CALL H8P_SETOCTL LD H,A LD (H8P_MEMLOC),HL LD A,$FF RET H8P_SETDIG3: LD HL,(H8P_MEMLOC) LD B,L CALL H8P_SETOCTH LD L,A LD (H8P_MEMLOC),HL LD A,$FF RET H8P_SETDIG4: LD HL,(H8P_MEMLOC) LD B,L CALL H8P_SETOCTM LD L,A LD (H8P_MEMLOC),HL LD A,$FF RET H8P_SETDIG5: LD HL,(H8P_MEMLOC) LD B,L CALL H8P_SETOCTL LD L,A LD (H8P_MEMLOC),HL XOR A LD (H8P_MEMENTER),A LD A,$FF RET H8P_SETDIGD: LD A,(H8P_MEMVAL) PUSH AF CALL H8P_GETOCTH LD (H8P_SEGBUF+6),A POP AF PUSH AF CALL H8P_GETOCTM LD (H8P_SEGBUF+7),A POP AF CALL H8P_GETOCTL LD (H8P_SEGBUF+8),A RET ; MEM/SPEED INCREASE H8P_KEYPADPLUS: LD A,(H8P_STATE) CP 3 JR Z,H8P_KEYPADPLUS3 CP 2 RET NZ LD HL,(H8P_MEMLOC) INC HL LD (H8P_MEMLOC),HL JP H8P_UPDMEMLOC H8P_KEYPADPLUS3: LD A,(H8P_SPEED) OR A RET Z DEC A LD (H8P_SPEED),A OUT (H8P_SPDIO),A RET ; MEM/SPEED DECREASE H8P_KEYPADMINUS: LD A,(H8P_STATE) CP 3 JR Z,H8P_KEYPADMINUS3 CP 2 RET NZ LD HL,(H8P_MEMLOC) DEC HL LD (H8P_MEMLOC),HL JP H8P_UPDMEMLOC H8P_KEYPADMINUS3: LD A,(H8P_SPEED) CP 3 RET Z INC A LD (H8P_SPEED),A OUT (H8P_SPDIO),A RET ; ; HANDLE FRONT PANEL STATE ; H8P_HDLSTATE: LD A,(H8P_STATE) OR A RET Z ; UP-TIME TIMER DEC A JP Z,H8P_HDLREG ; SHOWING REGISTER VALUES DEC A JP Z,H8P_HDLMEM ; SHOWING MEMORY LOCATION VALUE DEC A JP Z,H8P_HDLSPD ; MODIFYING SPEED RET ; H8P_HDLREG: LD A,(H8P_REGNUM) LD HL,H8P_REGAF OR A JP Z,H8P_HDLREGAF DEC A LD HL,H8P_REGBC JP Z,H8P_HDLREGBC DEC A LD HL,H8P_REGDE JP Z,H8P_HDLREGDE DEC A LD HL,H8P_REGHL JP Z,H8P_HDLREGHL DEC A LD HL,H8P_REGSP JP Z,H8P_HDLREGSP DEC A LD HL,H8P_REGPC JP Z,H8P_HDLREGPC RET H8P_HDLREGAF: CALL H8P_UPDLEDS LD HL,HBX_INTSTK DEC HL LD A,(HL) ; (HL)=AF LOW LD (H8P_AFVAL),A DEC HL LD A,(HL) ; (HL)=AF HIGH LD (H8P_AFVAL+1),A LD BC,H8P_AFVAL LD HL,H8P_SEGBUF JP H8P_FILLOCT H8P_HDLREGBC: LD BC,H8P_BCVAL CALL H8P_FILLOCT JP H8P_UPDLEDS H8P_HDLREGDE: LD BC,H8P_DEVAL CALL H8P_FILLOCT JP H8P_UPDLEDS H8P_HDLREGHL: CALL H8P_UPDLEDS LD HL,(HBX_INT_SP) LD A,(HL) LD (H8P_HLVAL),A INC HL LD A,(HL) LD (H8P_HLVAL+1),A LD BC,H8P_HLVAL LD HL,H8P_SEGBUF JP H8P_FILLOCT H8P_HDLREGSP: LD BC,HBX_INT_SP CALL H8P_FILLOCT JP H8P_UPDLEDS H8P_HDLREGPC: CALL H8P_UPDLEDS LD HL,(HBX_INT_SP) ; (HL)=HL LOW INC HL ; (HL)=HL HIGH INC HL ; (HL)=PC LOW LD A,(HL) LD (H8P_PCVAL),A INC HL ; (HL)=PC HIGH LD A,(HL) LD (H8P_PCVAL+1),A LD BC,H8P_PCVAL LD HL,H8P_SEGBUF JP H8P_FILLOCT H8P_HDLMEM: CALL H8P_SETDIGD RET H8P_HDLSPD: LD HL,H8P_SPD16 LD A,(H8P_SPEED) OR A JR Z,H8P_UPDLEDS LD HL,H8P_SPD08 DEC A JR Z,H8P_UPDLEDS LD HL,H8P_SPD04 DEC A JR Z,H8P_UPDLEDS LD HL,H8P_SPD02 H8P_UPDLEDS: LD C,9 LD DE,H8P_SEGBUF H8P_UPDLEDS1: LD A,(HL) INC HL LD (DE),A INC DE DEC C JR NZ,H8P_UPDLEDS1 RET ; H8P_GETSEGIDX: LD A,(H8P_SEGIDX) DEC A LD (H8P_SEGIDX),A LD C,A RET NZ LD A,9 LD (H8P_SEGIDX),A LD C,A RET ; ; A = SEG IDX ; ; +--02--+ ; 40 04 ; +--01--+ ; 20 08 ; +--10--+ 80 ; H8P_GETSEGPAT: LD A,C AND $0F ; IDX=1 THRU 9 DEC A LD C,A LD B,0 LD HL,H8P_SEGBUF ADD HL,BC LD E,(HL) LD A,(H8P_MEMENTER) OR A JR Z,H8P_GETSEGPATX LD A,(H8P_MEMADRIDX) CP C JR NZ,H8P_GETSEGPATX LD A,$80 OR E LD E,A H8P_GETSEGPATX: LD A,E CPL RET ; BC=MEMLOC, HL=LED BUFFER H8P_FILLOCT: PUSH HL INC BC ; POINT TO HIGH BYTE LD A,(BC) CALL H8P_GETOCTH LD (HL),A INC HL LD A,(BC) CALL H8P_GETOCTM LD (HL),A INC HL LD A,(BC) CALL H8P_GETOCTL LD (HL),A INC HL DEC BC ; POINT TO LOW BYTE LD A,(BC) CALL H8P_GETOCTH LD (HL),A INC HL LD A,(BC) CALL H8P_GETOCTM LD (HL),A INC HL LD A,(BC) CALL H8P_GETOCTL LD (HL),A POP HL RET ; HIGH OCTAL BITS H8P_GETOCTH: AND $C0 RRA RRA RRA RRA RRA RRA JR H8P_GETOCTX ; MEDIUM OCTAL BITS H8P_GETOCTM: AND $38 RRA RRA RRA JR H8P_GETOCTX ; LOW OCTAL BITS H8P_GETOCTL: AND $07 H8P_GETOCTX: PUSH HL LD E,A LD D,0 LD HL,H8P_DIGMAP ADD HL,DE LD A,(HL) ; VALUE CONVERTED TO LED SEGMENT PATTERN POP HL RET ; B=CURVAL, C=NEWVAL H8P_SETOCTH: LD A,C AND $03 RLA RLA RLA RLA RLA RLA LD C,A LD A,B AND $3F OR C RET H8P_SETOCTM: LD A,C AND $07 RLA RLA RLA LD C,A LD A,B AND $C7 OR C RET H8P_SETOCTL: LD A,C AND $07 LD C,A LD A,B AND $F8 OR C CALL H8P_BEEP RET ; H8P_BEEP: PUSH HL LD HL,16 LD (H8P_HORNDUR),HL POP HL RET ; ; DEVICE INFORMATION ; H8P_DEVICE: ; LD D,DSKYDEV_H8P ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL DEVICE NUMBER LD H,0 ; H := MODE LD L,H8FPIO ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; ; DIGITS TO LED PATTERNS ; +--02--+ ; 40 04 ; +--01--+ ; 20 08 ; +--10--+ 80 ; H8P_DIGMAP: ; 0 1 2 3 4 5 6 7 .DB $7E, $0C, $37, $1F, $4D, $5B, $7B, $0E ; 8 9 A B C D E F .DB $7F, $5F, $6F, $79, $72, $3D, $73, $63 ; H8P_REGNUM: .DB 0 H8P_REGAF: .DB $00, $00, $00, $00, $00, $00, $00, $6F, $63 H8P_REGBC: .DB $00, $00, $00, $00, $00, $00, $00, $79, $72 H8P_REGDE: .DB $00, $00, $00, $00, $00, $00, $00, $3D, $73 H8P_REGHL: .DB $00, $00, $00, $00, $00, $00, $00, $6D, $70 H8P_REGSP: .DB $00, $00, $00, $00, $00, $00, $00, $5B, $67 H8P_REGPC: .DB $00, $00, $00, $00, $00, $00, $00, $67, $72 H8P_SPD16: .DB $00, $00, $00, $00, $0C, $7B, $5B, $67, $3D H8P_SPD08: .DB $00, $00, $00, $00, $00, $7F, $5B, $67, $3D H8P_SPD04: .DB $00, $00, $00, $00, $00, $4D, $5B, $67, $3D H8P_SPD02: .DB $00, $00, $00, $00, $00, $37, $5B, $67, $3D H8P_MEMADRIDX: .DB 0 H8P_MEMENTER: .DB 0 H8P_AFVAL: .DW 0 H8P_BCVAL: .DW 0 H8P_DEVAL: .DW 0 H8P_HLVAL: .DW 0 H8P_PCVAL: .DW 0 ; H8P_STATE: .DB 00 H8P_STTIMER: .DB 00 H8P_FPENA: .DB $FF H8P_SEGIDX: .DB 09 H8P_HBTICK: .DB 00 H8P_KEYBUF: .DB 00 H8P_LSTKEY: .DB 00 H8P_SEGBUF: .DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF H8P_HORNDUR: .DW $0080 H8P_ONESEC: .DW 500 H8P_UPTIME: .DW 0 H8P_UPTDIG: .DB 0,0,0,0,0,0,0,0,0