You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1002 lines
17 KiB

;
;==================================================================================================
; 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"
;
;--------------------------------------------------------------------------------------------------
; HBIOS MODULE HEADER
;--------------------------------------------------------------------------------------------------
;
ORG_H8P .EQU $
;
.DW SIZ_H8P ; MODULE SIZE
.DW H8P_INITPHASE ; ADR OF INIT PHASE HANDLER
;
H8P_INITPHASE:
; INIT PHASE HANDLER, A=PHASE
CP HB_PHASE_PREINIT ; PREINIT PHASE?
JP Z,H8P_PREINIT ; DO PREINIT
CP HB_PHASE_INIT ; INIT PHASE?
JP Z,H8P_INIT ; DO INIT
RET ; DONE
;
;__H8P_PREINIT_______________________________________________________________________________________
;
; CONFIGURE AND RESET PANEL
;____________________________________________________________________________________________________
;
; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION
;
H8P_PREINIT:
; HEATH H8 PLATFORM IMPLEMENTS A CPU SPEED DIVISOR AS SET BY THE
; 2 LS BITS OF PORT H8PSPDIO. THE OSCILLATOR IS NORMALLY 16MHZ.
; 0=FULL (16MHZ), 1=1/2 (8MHZ), 2=1/4 (4 MHZ), 3=1/8 (2 MHZ)
; FOR BOOT, WE SET THE DIVISOR TO HALF (8MHZ)WHICH IS THE FASTEST
; SPEED WE CAN USE THAT STILL ENSURES ALL HARDWARE CAN BE DETECTED.
; E.G., MSX BOARD MAXES OUT AT 8MHZ.
LD A,$01 ; 8 MHZ OPERATION
OUT (H8P_SPDIO),A ; IMPLEMENT IT
LD (H8P_SPEED),A ; UPDATE FP SHADOW
;
; HOOK INTERRUTPS FOR FRONT PANEL OPERATION
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
; EXIT VIA HBIOS SPEED CHANGE, W/ L=NEW SPEED
JP H8P_SETSPD ; SEE HBIOS.ASM
; 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
; EXIT VIA HBIOS H8P SPEED CHANGE, W/ A=NEW SPEED
JP H8P_SETSPD ; SEE HBIOS.ASM
;
; 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 A,(HB_CURBNK) ; GET PRE-INT BANK
LD D,A ; PUT IN D
;
; HORRIBLE HACK TO MAKE PEEK RETURN TO OUR BANK!!!
PUSH AF ; SAVE ORIG HB_CURBNK
LD A,BID_BIOS ; MAKE IT OUR BANK
LD (HB_CURBNK),A ; OVERRIDE FOR PEEK
;
; FOLLOW STACK TO GET PC, USE PEEK IN CASE STACK IN ALT BANK
LD HL,(HBX_INT_SP) ; PRE-INT SP HAS HL AT TOS
CALL HBX_PEEK ; GET LSB TO E
LD C,E ; PUT IN C
INC HL ; POINT TO MSB
CALL HBX_PEEK ; GET MSB TO E
LD B,E ; PUT IN B
LD (H8P_HLVAL),BC ; SAVE FOR DISPLAY
;
; UNDO HACK!!!
POP AF ; RECOVER HB_CURBNK
LD (HB_CURBNK),A ; SAVE RESTORE IT
;
LD BC,H8P_HLVAL
LD HL,H8P_SEGBUF
JP H8P_FILLOCT
H8P_HDLREGSP:
CALL H8P_UPDLEDS
LD HL,(HBX_INT_SP) ; GET INT SAVED SP
INC HL ; BUMP TO VAL
INC HL ; ... OF SP
INC HL ; ... AT TIME
INC HL ; ... OF INTERRUPT
LD (H8P_SPVAL),HL ; SAVE FOR DISPLAY
LD BC,H8P_SPVAL
LD HL,H8P_SEGBUF
JP H8P_FILLOCT
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 A,(HB_CURBNK) ; GET PRE-INT BANK
LD D,A ; PUT IN D
;
; HORRIBLE HACK TO MAKE PEEK RETURN TO OUR BANK!!!
PUSH AF ; SAVE ORIG HB_CURBNK
LD A,BID_BIOS ; MAKE IT OUR BANK
LD (HB_CURBNK),A ; OVERRIDE FOR PEEK
;
; FOLLOW STACK TO GET PC, USE PEEK IN CASE STACK IN ALT BANK
LD HL,(HBX_INT_SP) ; PRE-INT SP
INC HL ; REMOVE 1 LEVEL TO
INC HL ; ... POINT TO PRE-INT PC
CALL HBX_PEEK ; GET LSB TO E
LD C,E ; PUT IN C
INC HL ; POINT TO MSB
CALL HBX_PEEK ; GET MSB TO E
LD B,E ; PUT IN B
LD (H8P_PCVAL),BC ; SAVE FOR DISPLAY
;
; UNDO HACK!!!
POP AF ; RECOVER HB_CURBNK
LD (HB_CURBNK),A ; SAVE RESTORE IT
;
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_SPVAL:
.DW 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
;
;--------------------------------------------------------------------------------------------------
; HBIOS MODULE TRAILER
;--------------------------------------------------------------------------------------------------
;
END_H8P .EQU $
SIZ_H8P .EQU END_H8P - ORG_H8P
;
MEMECHO "H8P occupies "
MEMECHO SIZ_H8P
MEMECHO " bytes.\n"