|
|
|
@ -27,19 +27,26 @@ |
|
|
|
; PB0 | $01 [FW] $41 [0] $81 [BK] $C1 [CL] |
|
|
|
; |
|
|
|
; |
|
|
|
ICM_PPIA .EQU ICMPPIBASE + 0 ; PORT A |
|
|
|
ICM_PPIB .EQU ICMPPIBASE + 1 ; PORT B |
|
|
|
ICM_PPIC .EQU ICMPPIBASE + 2 ; PORT C |
|
|
|
ICM_PPIX .EQU ICMPPIBASE + 3 ; PPI CONTROL PORT |
|
|
|
ICM_PPIA .EQU ICMPPIBASE + 0 ; PORT A |
|
|
|
ICM_PPIB .EQU ICMPPIBASE + 1 ; PORT B |
|
|
|
ICM_PPIC .EQU ICMPPIBASE + 2 ; PORT C |
|
|
|
ICM_PPIX .EQU ICMPPIBASE + 3 ; PPI CONTROL PORT |
|
|
|
; |
|
|
|
ICM_ROWS .EQU 1 ; DISPLAY ROWS |
|
|
|
ICM_COLS .EQU 8 ; DISPLAY COLUMNS |
|
|
|
; |
|
|
|
DEVECHO "ICM: IO=" |
|
|
|
DEVECHO ICMPPIBASE |
|
|
|
DEVECHO ", SIZE=" |
|
|
|
DEVECHO ICM_COLS |
|
|
|
DEVECHO "X" |
|
|
|
DEVECHO ICM_ROWS |
|
|
|
DEVECHO "\n" |
|
|
|
; |
|
|
|
;__ICM_INIT__________________________________________________________________________________________ |
|
|
|
;__ICM_INIT________________________________________________________________________________________ |
|
|
|
; |
|
|
|
; CONFIGURE PARALLEL PORT AND CLEAR KEYPAD BUFFER |
|
|
|
;____________________________________________________________________________________________________ |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
ICM_PREINIT: |
|
|
|
LD A,(DSKY_DISPACT) ; DSKY DISPATCHER ALREADY SET? |
|
|
|
@ -83,6 +90,33 @@ ICM_PREINIT: |
|
|
|
LD BC,ICM_DISPATCH |
|
|
|
CALL DSKY_SETDISP |
|
|
|
; |
|
|
|
CALL ICM_SHOWVER |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
ICM_SHOWVER: |
|
|
|
LD HL,ICM_VERSTR |
|
|
|
LD DE,ICM_BUF |
|
|
|
LD BC,ICM_COLS |
|
|
|
LDIR |
|
|
|
LD HL,ICM_BUF + 5 |
|
|
|
LD A,RMJ |
|
|
|
LD A,(ICM_SEGMAP + RMJ) |
|
|
|
OR $80 |
|
|
|
LD (HL),A |
|
|
|
INC HL |
|
|
|
LD A,(ICM_SEGMAP + RMN) |
|
|
|
OR $80 |
|
|
|
LD (HL),A |
|
|
|
INC HL |
|
|
|
LD A,(ICM_SEGMAP + RUP) |
|
|
|
LD (HL),A |
|
|
|
; |
|
|
|
; DISPLAY VERSION ON ICM |
|
|
|
LD C,0 |
|
|
|
LD B,8 |
|
|
|
LD HL,ICM_BUF |
|
|
|
CALL ICM_PUTBUF |
|
|
|
RET |
|
|
|
; |
|
|
|
ICM_INIT: |
|
|
|
@ -95,9 +129,18 @@ ICM_INIT: |
|
|
|
; |
|
|
|
LD A,(ICM_PRESENT) ; PRESENT? |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET NZ ; YES, ALL DONE |
|
|
|
JR NZ,ICM_INIT1 ; YES, CONTINUE |
|
|
|
PRTS(" NOT PRESENT$") ; NOT PRESENT |
|
|
|
RET |
|
|
|
; |
|
|
|
ICM_INIT1: |
|
|
|
CALL PC_SPACE |
|
|
|
LD A,ICM_COLS |
|
|
|
CALL PRTDEC8 |
|
|
|
LD A,'X' |
|
|
|
CALL COUT |
|
|
|
LD A,ICM_ROWS |
|
|
|
CALL PRTDEC8 |
|
|
|
RET |
|
|
|
; |
|
|
|
; ICM DEVICE FUNCTION DISPATCH ENTRY |
|
|
|
@ -124,6 +167,10 @@ ICM_DISPATCH: |
|
|
|
JP Z,ICM_BEEP ; BEEP DSKY SPEAKER |
|
|
|
DEC A |
|
|
|
JP Z,ICM_DEVICE ; DEVICE INFO |
|
|
|
DEC A |
|
|
|
JP Z,ICM_MESSAGE ; HANDLE MESSAGE |
|
|
|
DEC A |
|
|
|
JP Z,ICM_EVENT ; HANDLE EVENT |
|
|
|
SYSCHKERR(ERR_NOFUNC) |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -187,47 +234,44 @@ ICM_GETKEY2: |
|
|
|
; DISPLAY HEX VALUE FROM DE:HL |
|
|
|
; |
|
|
|
ICM_SHOWHEX: |
|
|
|
LD BC,DSKY_HEXBUF ; POINT TO HEX BUFFER |
|
|
|
LD BC,ICM_TMP32 ; POINT TO HEX BUFFER |
|
|
|
CALL ST32 ; STORE 32-BIT BINARY THERE |
|
|
|
LD HL,DSKY_HEXBUF ; FROM: BINARY VALUE (HL) |
|
|
|
LD DE,DSKY_BUF ; TO: SEGMENT BUFFER (DE) |
|
|
|
CALL DSKY_BIN2SEG ; CONVERT |
|
|
|
LD HL,DSKY_BUF ; POINT TO SEGMENT BUFFER |
|
|
|
; AND FALL THRU TO DISPLAY IT |
|
|
|
LD HL,ICM_TMP32 ; FROM: BINARY VALUE (HL) |
|
|
|
LD DE,ICM_BUF ; TO: SEGMENT BUFFER (DE) |
|
|
|
CALL ICM_BIN2SEG ; CONVERT |
|
|
|
LD HL,ICM_BUF ; POINT TO SEGMENT BUFFER |
|
|
|
CALL ICM_PUTBUF ; DO IT |
|
|
|
XOR A ; SUCCESS |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
; ICM SHOW BUFFER |
|
|
|
; HL: ADDRESS OF BUFFER |
|
|
|
; |
|
|
|
ICM_SHOWSEG: |
|
|
|
LD A,82H ; SETUP PPI |
|
|
|
OUT (ICM_PPIX),A |
|
|
|
CALL ICM_COFF |
|
|
|
LD A,$F0 ; 7218 -> (DATA COMING, NO DECODE) |
|
|
|
OUT (ICM_PPIA),A |
|
|
|
CALL ICM_STROBEC ; STROBE COMMAND |
|
|
|
LD B,DSKY_BUFLEN ; NUMBER OF DIGITS |
|
|
|
LD C,ICM_PPIA |
|
|
|
ICM_HEXOUT2: |
|
|
|
LD A,(HL) |
|
|
|
CALL ICM_XLAT ; MAP SEGMENTS |
|
|
|
XOR $80 ; FIX DOT POLARITY |
|
|
|
OUT (C),A |
|
|
|
INC HL |
|
|
|
DEC B |
|
|
|
JP Z,ICM_STROBE ; DO FINAL STROBE AND RETURN |
|
|
|
CALL ICM_STROBE ; STROBE BYTE VALUE |
|
|
|
JR ICM_HEXOUT2 |
|
|
|
ICM_STROBEC: ; COMMAND STROBE |
|
|
|
LD A,80H | 30H |
|
|
|
JP ICM_STROBE0 |
|
|
|
ICM_STROBE: ; DATA STROBE |
|
|
|
LD A,00H | 30H ; SET WRITE STROBE |
|
|
|
ICM_STROBE0: |
|
|
|
OUT (ICM_PPIC),A ; OUT TO PORTC |
|
|
|
CALL DLY2 ; DELAY |
|
|
|
ICM_COFF: |
|
|
|
LD A,40H | 30H ; QUIESCE |
|
|
|
OUT (ICM_PPIC),A ; OUT TO PORTC |
|
|
|
; CONVERT FROM DBG ALPHABET TO SEG CODES |
|
|
|
LD B,ICM_COLS ; DO FOR ALL CHARS |
|
|
|
LD DE,ICM_BUF ; DESTINATION BUFFER |
|
|
|
ICM_SHOWSEG1: |
|
|
|
LD A,(HL) ; GET SOURCE VALUE |
|
|
|
INC HL ; BUMP FOR NEXT TIME |
|
|
|
PUSH AF ; SAVE IT |
|
|
|
AND $80 ; ISOLATE HI BIT (DP) |
|
|
|
LD C,A ; SAVE IN C |
|
|
|
POP AF ; RECOVER ORIGINAL |
|
|
|
AND $7F ; REMOVE HI BIT (DP) |
|
|
|
PUSH HL ; SAVE IT |
|
|
|
LD HL,ICM_SEGMAP ; POINT TO XLAT MAP |
|
|
|
CALL ADDHLA ; OFFSET BY VALUE |
|
|
|
LD A,(HL) ; GET NEW VALUE |
|
|
|
OR C ; RECOMBINE WITH DP BIT |
|
|
|
LD (DE),A ; SAVE IT |
|
|
|
INC DE ; BUMP PTR |
|
|
|
POP HL ; RESTORE SOURCE PTR |
|
|
|
DJNZ ICM_SHOWSEG1 ; LOOP TILL DONE |
|
|
|
; |
|
|
|
; DISPLAY CONVERTED BUFFER |
|
|
|
LD HL,ICM_BUF ; BUFFER |
|
|
|
CALL ICM_PUTBUF ; DO IT |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -249,10 +293,76 @@ ICM_DEVICE: |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
;__ICM_KEY___________________________________________________________________________________________ |
|
|
|
; MESSAGE HANDLER |
|
|
|
; |
|
|
|
ICM_MESSAGE: |
|
|
|
LD A,C ; GET MESSAGE ID |
|
|
|
ADD A,A ; WORD OFFSET |
|
|
|
LD HL,ICM_MSGTBL ; START OF MESSAGE TABLE |
|
|
|
CALL ADDHLA ; ADD OFFSET |
|
|
|
LD A,(HL) ; SAVE LSB |
|
|
|
INC HL ; BUMP TO MSB |
|
|
|
LD H,(HL) ; GET MSB |
|
|
|
LD L,A ; GET LSB |
|
|
|
; |
|
|
|
; HL HAS POINTER TO MESSAGE |
|
|
|
CALL ICM_PUTBUF ; DISPLAY IT |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
; EVENT HANDLER |
|
|
|
; |
|
|
|
ICM_EVENT: |
|
|
|
LD A,C ; EVENT ID |
|
|
|
OR A ; 0=CPUSPD |
|
|
|
JR Z,ICM_EVT_CPUSPD ; HANDLE CPU SPD CHANGE |
|
|
|
DEC A ; 1=DSKACT |
|
|
|
JR Z,ICM_EVT_DSKACT ; HANDLE DISK ACTIVITY |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
; CPU SPEED CHANGE |
|
|
|
; |
|
|
|
ICM_EVT_CPUSPD: |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
; DISK ACTIVITY |
|
|
|
; |
|
|
|
ICM_EVT_DSKACT: |
|
|
|
; |
|
|
|
; USE DISK UNIT NUMBER FOR MSB |
|
|
|
LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM |
|
|
|
LD (HB_DSKADR+3),A ; REPLACE HIGH BYTE W/ DISK # |
|
|
|
; |
|
|
|
; CONVERT TO SEGMENT DISPLAY |
|
|
|
LD HL,HB_DSKADR ; INPUT POINTER |
|
|
|
LD DE,ICM_BUF ; BUF FOR OUTPUT |
|
|
|
CALL ICM_BIN2SEG ; CONVERT TO SEG DISPLAY |
|
|
|
; |
|
|
|
; DECIMAL POINT FOR DISK UNIT SEPARATION |
|
|
|
LD HL,ICM_BUF+1 ; SECOND CHAR OF DISP |
|
|
|
SET 7,(HL) ; TURN ON DECIMAL PT |
|
|
|
; |
|
|
|
; DECIMAL POINT TO INDICATE WRITE ACTION |
|
|
|
LD A,(HB_DSKFUNC) ; GET CURRENT I/O FUNCTION |
|
|
|
CP BF_DIOWRITE ; IS IT A WRITE? |
|
|
|
JR NZ,ICM_EVT_DSKACT2 ; IF NOT, SKIP |
|
|
|
LD HL,ICM_BUF+7 ; POINT TO CHAR 7 |
|
|
|
SET 7,(HL) ; SET WRITE DOT |
|
|
|
; |
|
|
|
ICM_EVT_DSKACT2: |
|
|
|
; UPDATE DISPLAY |
|
|
|
LD HL,ICM_BUF ; SEG DISPLAY BUF TO HL |
|
|
|
CALL ICM_PUTBUF |
|
|
|
; |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
;__ICM_KEY_________________________________________________________________________________________ |
|
|
|
; |
|
|
|
; CHECK FOR KEY PRESS W/ DEBOUNCE |
|
|
|
;____________________________________________________________________________________________________ |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
ICM_KEY: |
|
|
|
CALL ICM_SCAN ; INITIAL KEY PRESS SCAN |
|
|
|
@ -273,10 +383,10 @@ ICM_KEY2: |
|
|
|
OR A ; SET FLAGS BASED ON VALUE |
|
|
|
RET ; AND DONE |
|
|
|
; |
|
|
|
;__ICM_SCAN__________________________________________________________________________________________ |
|
|
|
;__ICM_SCAN________________________________________________________________________________________ |
|
|
|
; |
|
|
|
; SCAN KEYPAD AND RETURN RAW SCAN CODE (RETURNS ZERO IF NO KEY PRESSED) |
|
|
|
;____________________________________________________________________________________________________ |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
ICM_SCAN: |
|
|
|
LD B,4 ; 4 COLUMNS |
|
|
|
@ -300,37 +410,44 @@ ICM_SCAN2: |
|
|
|
OR E ; COMBINE WITH ROW |
|
|
|
JP ICM_RESET ; RETURN VIA RESET |
|
|
|
; |
|
|
|
;__ICM_PUTBUF______________________________________________________________________________________ |
|
|
|
; |
|
|
|
; CONVERT FORM STANDARD SEGMENT ENCODING TO ICM ENCODING |
|
|
|
; |
|
|
|
; From: To: |
|
|
|
; +--01--+ +--40--+ |
|
|
|
; 20 02 02 20 |
|
|
|
; +--40--+ +--04--+ |
|
|
|
; 10 04 08 10 |
|
|
|
; +--08--+ 80 +--01--+ 80 |
|
|
|
; WRITE BUFFER AT HL TO SEGMENT DISPLAY |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
ICM_XLAT: |
|
|
|
PUSH BC |
|
|
|
PUSH HL |
|
|
|
LD C,A ; ORIG VALUE TO C |
|
|
|
XOR A ; INIT RESULT VALUE |
|
|
|
LD B,8 |
|
|
|
LD HL,ICM_XTBL |
|
|
|
ICM_XLAT1: |
|
|
|
RRC C ; SHIFT NEXT BIT TO CF |
|
|
|
JR NC,ICM_XLAT2 ; SKIP IF BIT NOT SET |
|
|
|
OR (HL) |
|
|
|
ICM_XLAT2: |
|
|
|
ICM_PUTBUF: |
|
|
|
LD A,82H ; SETUP PPI |
|
|
|
OUT (ICM_PPIX),A |
|
|
|
CALL ICM_COFF |
|
|
|
LD A,$F0 ; 7218 -> (DATA COMING, NO DECODE) |
|
|
|
OUT (ICM_PPIA),A |
|
|
|
CALL ICM_STROBEC ; STROBE COMMAND |
|
|
|
LD B,ICM_COLS ; NUMBER OF DIGITS |
|
|
|
LD C,ICM_PPIA |
|
|
|
ICM_HEXOUT2: |
|
|
|
LD A,(HL) |
|
|
|
XOR $80 ; FIX DOT POLARITY |
|
|
|
OUT (C),A |
|
|
|
INC HL |
|
|
|
DJNZ ICM_XLAT1 |
|
|
|
POP HL |
|
|
|
POP BC |
|
|
|
DEC B |
|
|
|
JP Z,ICM_STROBE ; DO FINAL STROBE AND RETURN |
|
|
|
CALL ICM_STROBE ; STROBE BYTE VALUE |
|
|
|
JR ICM_HEXOUT2 |
|
|
|
ICM_STROBEC: ; COMMAND STROBE |
|
|
|
LD A,80H | 30H |
|
|
|
JP ICM_STROBE0 |
|
|
|
ICM_STROBE: ; DATA STROBE |
|
|
|
LD A,00H | 30H ; SET WRITE STROBE |
|
|
|
ICM_STROBE0: |
|
|
|
OUT (ICM_PPIC),A ; OUT TO PORTC |
|
|
|
CALL DLY2 ; DELAY |
|
|
|
ICM_COFF: |
|
|
|
LD A,40H | 30H ; QUIESCE |
|
|
|
OUT (ICM_PPIC),A ; OUT TO PORTC |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
ICM_XTBL .DB $40, $20, $10, $01, $08, $02, $04, $80 |
|
|
|
; |
|
|
|
;_ _TABLE_____________________________________________________________________________________________________________ |
|
|
|
;_KEYMAP_TABLE_____________________________________________________________________________________ |
|
|
|
; |
|
|
|
ICM_KEYMAP: |
|
|
|
; POS $00 $01 $02 $03 $04 $05 $06 $07 |
|
|
|
@ -353,6 +470,35 @@ ICM_KEYBUF .DB 0 |
|
|
|
; UTILTITY FUNCTIONS |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY |
|
|
|
; |
|
|
|
; HL: ADR OF 32 BIT BINARY |
|
|
|
; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) |
|
|
|
; |
|
|
|
ICM_BIN2SEG: |
|
|
|
LD B,4 ; 4 BYTES OF INPUT |
|
|
|
LD A,B ; PUT IN ACCUM |
|
|
|
CALL ADDHLA ; PROCESS FROM END (LITTLE ENDIAN) |
|
|
|
ICM_BIN2SEG1: |
|
|
|
DEC HL ; DEC PTR (LITTLE ENDIAN) |
|
|
|
LD A,(HL) ; HIGH NIBBLE |
|
|
|
RRCA \ RRCA \ RRCA \ RRCA ; ROTATE BITS |
|
|
|
CALL ICM_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF |
|
|
|
LD A,(HL) ; LOW NIBBLE |
|
|
|
CALL ICM_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF |
|
|
|
DJNZ ICM_BIN2SEG1 ; LOOP FOR ALL INPUT BYTES |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
ICM_BIN2SEG_NIB: |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD HL,ICM_SEGMAP ; POINT TO SEG MAP TABLE |
|
|
|
AND $0F ; ISOLATE LOW NIBBLE |
|
|
|
CALL ADDHLA ; OFFSET INTO TABLE |
|
|
|
LD A,(HL) ; LOAD VALUE FROM TABLE |
|
|
|
POP HL ; RESTORE HL |
|
|
|
LD (DE),A ; SAVE VALUE TO OUTPUT BUF |
|
|
|
INC DE ; BUMP TO NEXT OUTPUT BYTE |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; STORAGE |
|
|
|
@ -361,3 +507,37 @@ ICM_KEYBUF .DB 0 |
|
|
|
; SEG DISPLAY WORKING STORAGE |
|
|
|
; |
|
|
|
ICM_PRESENT .DB 0 |
|
|
|
ICM_BUF .FILL ICM_COLS |
|
|
|
ICM_TMP32 .FILL 4,0 ; TEMP DWORD |
|
|
|
; |
|
|
|
ICM_VERSTR .DB $3E,$7F,$0A,$7B,$57,$00,$00,$00 ; "HBIOS " |
|
|
|
; |
|
|
|
ICM_SEGMAP: |
|
|
|
; |
|
|
|
; POS $00 $01 $02 $03 $04 $05 $06 $07 |
|
|
|
; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' |
|
|
|
|
|
|
|
.DB $7B, $30, $6D, $75, $36, $57, $5F, $70 |
|
|
|
; |
|
|
|
; POS $08 $09 $0A $0B $0C $0D $0E $0F |
|
|
|
; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' |
|
|
|
.DB $7F, $76, $7E, $1F, $4B, $3D, $4F, $4E |
|
|
|
; |
|
|
|
; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A |
|
|
|
; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' |
|
|
|
.DB $00, $04, $00, $6E, $1D, $0C, $0F, $7E, $3D, $0C, $5F |
|
|
|
; |
|
|
|
ICM_MSGTBL: |
|
|
|
.DW ICM_MSG_LDR_SEL |
|
|
|
.DW ICM_MSG_LDR_BOOT |
|
|
|
.DW ICM_MSG_LDR_LOAD |
|
|
|
.DW ICM_MSG_LDR_GO |
|
|
|
.DW ICM_MSG_MON_RDY |
|
|
|
.DW ICM_MSG_MON_BOOT |
|
|
|
; |
|
|
|
ICM_MSG_LDR_SEL .DB $7F,$1D,$1D,$0F,$6C,$00,$00,$00 ; "Boot? " |
|
|
|
ICM_MSG_LDR_BOOT .DB $7F,$1D,$1D,$0F,$80,$80,$80,$00 ; "Boot... " |
|
|
|
ICM_MSG_LDR_LOAD .DB $0B,$1D,$7E,$3D,$80,$80,$80,$00 ; "Load... " |
|
|
|
ICM_MSG_LDR_GO .DB $5F,$1D,$80,$80,$80,$00,$00,$00 ; "Go... " |
|
|
|
ICM_MSG_MON_RDY .DB $04,$4B,$6E,$3B,$00,$3B,$6E,$04 ; "-CPU UP-" |
|
|
|
ICM_MSG_MON_BOOT .DB $7F,$1D,$1D,$0F,$B0,$00,$00,$00 ; "Boot! " |
|
|
|
|