|
|
@ -1,10 +1,10 @@ |
|
|
; |
|
|
; |
|
|
;================================================================================================== |
|
|
;================================================================================================== |
|
|
; CENTRONICS INTERFACE DRIVER |
|
|
|
|
|
|
|
|
; CENTRONICS (LPT) INTERFACE DRIVER |
|
|
;================================================================================================== |
|
|
;================================================================================================== |
|
|
; |
|
|
; |
|
|
; CENTRONICS-STYLE PARALLEL PRINTER DRIVER. ASSUMES MBC PRINT BOARD |
|
|
|
|
|
; AS HARDWARE. |
|
|
|
|
|
|
|
|
; CENTRONICS-STYLE PARALLEL PRINTER DRIVER. ASSUMES IBM STYLE |
|
|
|
|
|
; HARDWARE INTERFACE AS DESCRIBED BELOW. |
|
|
; |
|
|
; |
|
|
; IMPLEMENTED AS A ROMWBW CHARACTER DEVICE. CURRENTLY HANDLES OUPUT |
|
|
; IMPLEMENTED AS A ROMWBW CHARACTER DEVICE. CURRENTLY HANDLES OUPUT |
|
|
; ONLY. |
|
|
; ONLY. |
|
|
@ -30,56 +30,56 @@ |
|
|
; | STAT1 | STAT0 | ENBL | PINT | SEL | RES | LF | STB | |
|
|
; | STAT1 | STAT0 | ENBL | PINT | SEL | RES | LF | STB | |
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
; |
|
|
; |
|
|
CEN_NONE .EQU 0 |
|
|
|
|
|
CEN_MBC .EQU 1 |
|
|
|
|
|
|
|
|
LPT_NONE .EQU 0 ; NOT PRESENT |
|
|
|
|
|
LPT_IBM .EQU 1 ; IBM PC STYLE INTERFACE |
|
|
; |
|
|
; |
|
|
; PRE-CONSOLE INITIALIZATION - DETECT AND INIT HARDWARE |
|
|
; PRE-CONSOLE INITIALIZATION - DETECT AND INIT HARDWARE |
|
|
; |
|
|
; |
|
|
CEN_PREINIT: |
|
|
|
|
|
|
|
|
LPT_PREINIT: |
|
|
; |
|
|
; |
|
|
; SETUP THE DISPATCH TABLE ENTRIES |
|
|
; SETUP THE DISPATCH TABLE ENTRIES |
|
|
; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMIAIN |
|
|
; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMIAIN |
|
|
; DISABLED. |
|
|
; DISABLED. |
|
|
; |
|
|
; |
|
|
LD B,CEN_CFGCNT ; LOOP CONTROL |
|
|
|
|
|
|
|
|
LD B,LPT_CFGCNT ; LOOP CONTROL |
|
|
XOR A ; ZERO TO ACCUM |
|
|
XOR A ; ZERO TO ACCUM |
|
|
LD (CEN_DEV),A ; CURRENT DEVICE NUMBER |
|
|
|
|
|
LD IY,CEN_CFG ; POINT TO START OF CFG TABLE |
|
|
|
|
|
CEN_PREINIT0: |
|
|
|
|
|
|
|
|
LD (LPT_DEV),A ; CURRENT DEVICE NUMBER |
|
|
|
|
|
LD IY,LPT_CFG ; POINT TO START OF CFG TABLE |
|
|
|
|
|
LPT_PREINIT0: |
|
|
PUSH BC ; SAVE LOOP CONTROL |
|
|
PUSH BC ; SAVE LOOP CONTROL |
|
|
CALL CEN_INITUNIT ; HAND OFF TO UNIT INIT CODE |
|
|
|
|
|
|
|
|
CALL LPT_INITUNIT ; HAND OFF TO UNIT INIT CODE |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
; |
|
|
; |
|
|
LD A,(IY+1) ; GET THE CEN TYPE DETECTED |
|
|
|
|
|
|
|
|
LD A,(IY+1) ; GET THE LPT TYPE DETECTED |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
JR Z,CEN_PREINIT2 ; SKIP IT IF NOTHING FOUND |
|
|
|
|
|
|
|
|
JR Z,LPT_PREINIT2 ; SKIP IT IF NOTHING FOUND |
|
|
; |
|
|
; |
|
|
PUSH BC ; SAVE LOOP CONTROL |
|
|
PUSH BC ; SAVE LOOP CONTROL |
|
|
PUSH IY ; CFG ENTRY ADDRESS |
|
|
PUSH IY ; CFG ENTRY ADDRESS |
|
|
POP DE ; ... TO DE |
|
|
POP DE ; ... TO DE |
|
|
LD BC,CEN_FNTBL ; BC := FUNCTION TABLE ADDRESS |
|
|
|
|
|
CALL NZ,CIO_ADDENT ; ADD ENTRY IF CEN FOUND, BC:DE |
|
|
|
|
|
|
|
|
LD BC,LPT_FNTBL ; BC := FUNCTION TABLE ADDRESS |
|
|
|
|
|
CALL NZ,CIO_ADDENT ; ADD ENTRY IF LPT FOUND, BC:DE |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
; |
|
|
; |
|
|
CEN_PREINIT2: |
|
|
|
|
|
LD DE,CEN_CFGSIZ ; SIZE OF CFG ENTRY |
|
|
|
|
|
|
|
|
LPT_PREINIT2: |
|
|
|
|
|
LD DE,LPT_CFGSIZ ; SIZE OF CFG ENTRY |
|
|
ADD IY,DE ; BUMP IY TO NEXT ENTRY |
|
|
ADD IY,DE ; BUMP IY TO NEXT ENTRY |
|
|
DJNZ CEN_PREINIT0 ; LOOP UNTIL DONE |
|
|
|
|
|
|
|
|
DJNZ LPT_PREINIT0 ; LOOP UNTIL DONE |
|
|
; |
|
|
; |
|
|
CEN_PREINIT3: |
|
|
|
|
|
|
|
|
LPT_PREINIT3: |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
RET ; AND RETURN |
|
|
RET ; AND RETURN |
|
|
; |
|
|
; |
|
|
; CEN INITIALIZATION ROUTINE |
|
|
|
|
|
|
|
|
; LPT INITIALIZATION ROUTINE |
|
|
; |
|
|
; |
|
|
CEN_INITUNIT: |
|
|
|
|
|
CALL CEN_DETECT ; DETERMINE CEN TYPE |
|
|
|
|
|
|
|
|
LPT_INITUNIT: |
|
|
|
|
|
CALL LPT_DETECT ; DETERMINE LPT TYPE |
|
|
LD (IY+1),A ; SAVE IN CONFIG TABLE |
|
|
LD (IY+1),A ; SAVE IN CONFIG TABLE |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
RET Z ; ABORT IF NOTHING THERE |
|
|
RET Z ; ABORT IF NOTHING THERE |
|
|
; |
|
|
; |
|
|
; UPDATE WORKING CEN DEVICE NUM |
|
|
|
|
|
LD HL,CEN_DEV ; POINT TO CURRENT DEVICE NUM |
|
|
|
|
|
|
|
|
; UPDATE WORKING LPT DEVICE NUM |
|
|
|
|
|
LD HL,LPT_DEV ; POINT TO CURRENT DEVICE NUM |
|
|
LD A,(HL) ; PUT IN ACCUM |
|
|
LD A,(HL) ; PUT IN ACCUM |
|
|
INC (HL) ; INCREMENT IT (FOR NEXT LOOP) |
|
|
INC (HL) ; INCREMENT IT (FOR NEXT LOOP) |
|
|
LD (IY),A ; UPDATE UNIT NUM |
|
|
LD (IY),A ; UPDATE UNIT NUM |
|
|
@ -88,44 +88,44 @@ CEN_INITUNIT: |
|
|
LD DE,-1 ; LEAVE CONFIG ALONE |
|
|
LD DE,-1 ; LEAVE CONFIG ALONE |
|
|
; CALL INITDEV TO IMPLEMENT CONFIG, BUT NOTE THAT WE CALL |
|
|
; CALL INITDEV TO IMPLEMENT CONFIG, BUT NOTE THAT WE CALL |
|
|
; THE INITDEV ENTRY POINT THAT DOES NOT ENABLE/DISABLE INTS! |
|
|
; THE INITDEV ENTRY POINT THAT DOES NOT ENABLE/DISABLE INTS! |
|
|
JP CEN_INITDEVX ; IMPLEMENT IT AND RETURN |
|
|
|
|
|
|
|
|
JP LPT_INITDEVX ; IMPLEMENT IT AND RETURN |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
CEN_INIT: |
|
|
|
|
|
LD B,CEN_CFGCNT ; COUNT OF POSSIBLE CEN UNITS |
|
|
|
|
|
LD IY,CEN_CFG ; POINT TO START OF CFG TABLE |
|
|
|
|
|
CEN_INIT1: |
|
|
|
|
|
|
|
|
LPT_INIT: |
|
|
|
|
|
LD B,LPT_CFGCNT ; COUNT OF POSSIBLE LPT UNITS |
|
|
|
|
|
LD IY,LPT_CFG ; POINT TO START OF CFG TABLE |
|
|
|
|
|
LPT_INIT1: |
|
|
PUSH BC ; SAVE LOOP CONTROL |
|
|
PUSH BC ; SAVE LOOP CONTROL |
|
|
LD A,(IY+1) ; GET CEN TYPE |
|
|
|
|
|
|
|
|
LD A,(IY+1) ; GET LPT TYPE |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
CALL NZ,CEN_PRTCFG ; PRINT IF NOT ZERO |
|
|
|
|
|
|
|
|
CALL NZ,LPT_PRTCFG ; PRINT IF NOT ZERO |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
LD DE,CEN_CFGSIZ ; SIZE OF CFG ENTRY |
|
|
|
|
|
|
|
|
LD DE,LPT_CFGSIZ ; SIZE OF CFG ENTRY |
|
|
ADD IY,DE ; BUMP IY TO NEXT ENTRY |
|
|
ADD IY,DE ; BUMP IY TO NEXT ENTRY |
|
|
DJNZ CEN_INIT1 ; LOOP TILL DONE |
|
|
|
|
|
|
|
|
DJNZ LPT_INIT1 ; LOOP TILL DONE |
|
|
; |
|
|
; |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
; DRIVER FUNCTION TABLE |
|
|
; DRIVER FUNCTION TABLE |
|
|
; |
|
|
; |
|
|
CEN_FNTBL: |
|
|
|
|
|
.DW CEN_IN |
|
|
|
|
|
.DW CEN_OUT |
|
|
|
|
|
.DW CEN_IST |
|
|
|
|
|
.DW CEN_OST |
|
|
|
|
|
.DW CEN_INITDEV |
|
|
|
|
|
.DW CEN_QUERY |
|
|
|
|
|
.DW CEN_DEVICE |
|
|
|
|
|
#IF (($ - CEN_FNTBL) != (CIO_FNCNT * 2)) |
|
|
|
|
|
.ECHO "*** INVALID CEN FUNCTION TABLE ***\n" |
|
|
|
|
|
|
|
|
LPT_FNTBL: |
|
|
|
|
|
.DW LPT_IN |
|
|
|
|
|
.DW LPT_OUT |
|
|
|
|
|
.DW LPT_IST |
|
|
|
|
|
.DW LPT_OST |
|
|
|
|
|
.DW LPT_INITDEV |
|
|
|
|
|
.DW LPT_QUERY |
|
|
|
|
|
.DW LPT_DEVICE |
|
|
|
|
|
#IF (($ - LPT_FNTBL) != (CIO_FNCNT * 2)) |
|
|
|
|
|
.ECHO "*** INVALID LPT FUNCTION TABLE ***\n" |
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; BYTE INTPUT |
|
|
; BYTE INTPUT |
|
|
; |
|
|
; |
|
|
CEN_IN: |
|
|
|
|
|
|
|
|
LPT_IN: |
|
|
; INPUT NOT SUPPORTED - RETURN NULL BYTE |
|
|
; INPUT NOT SUPPORTED - RETURN NULL BYTE |
|
|
LD E,0 ; NULL BYTE |
|
|
LD E,0 ; NULL BYTE |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
@ -133,20 +133,19 @@ CEN_IN: |
|
|
; |
|
|
; |
|
|
; BYTE OUTPUT |
|
|
; BYTE OUTPUT |
|
|
; |
|
|
; |
|
|
CEN_OUT: |
|
|
|
|
|
CALL CEN_OST ; READY TO SEND? |
|
|
|
|
|
JR Z,CEN_OUT ; LOOP IF NOT |
|
|
|
|
|
; *** ADD CODE TO OUTPUT BYTE *** |
|
|
|
|
|
|
|
|
LPT_OUT: |
|
|
|
|
|
CALL LPT_OST ; READY TO SEND? |
|
|
|
|
|
JR Z,LPT_OUT ; LOOP IF NOT |
|
|
LD A,(IY+3) |
|
|
LD A,(IY+3) |
|
|
LD C,A ; PORT 0 (DATA) |
|
|
LD C,A ; PORT 0 (DATA) |
|
|
OUT (C),E ; OUTPUT DATA TO PORT |
|
|
OUT (C),E ; OUTPUT DATA TO PORT |
|
|
call DELAY ; ignore anything back after a reset |
|
|
|
|
|
ld A,%00001101 ; select & strobe, LEDS OFF |
|
|
|
|
|
|
|
|
CALL DELAY ; IGNORE ANYTHING BACK AFTER A RESET |
|
|
|
|
|
LD A,%00001101 ; SELECT & STROBE, LEDS OFF |
|
|
INC C ; PUT CONTROL PORT IN C |
|
|
INC C ; PUT CONTROL PORT IN C |
|
|
INC C |
|
|
INC C |
|
|
OUT (C),A ; OUTPUT DATA TO PORT |
|
|
OUT (C),A ; OUTPUT DATA TO PORT |
|
|
call DELAY ; ignore anything back after a reset |
|
|
|
|
|
ld A,%00001100 ; select, LEDS OFF |
|
|
|
|
|
|
|
|
CALL DELAY ; IGNORE ANYTHING BACK AFTER A RESET |
|
|
|
|
|
LD A,%00001100 ; SELECT, LEDS OFF |
|
|
OUT (C),A ; OUTPUT DATA TO PORT |
|
|
OUT (C),A ; OUTPUT DATA TO PORT |
|
|
|
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
@ -154,14 +153,14 @@ CEN_OUT: |
|
|
; |
|
|
; |
|
|
; INPUT STATUS |
|
|
; INPUT STATUS |
|
|
; |
|
|
; |
|
|
CEN_IST: |
|
|
|
|
|
|
|
|
LPT_IST: |
|
|
; INPUT NOT SUPPORTED - RETURN NOT READY |
|
|
; INPUT NOT SUPPORTED - RETURN NOT READY |
|
|
XOR A ; ZERO BYTES AVAILABLE |
|
|
XOR A ; ZERO BYTES AVAILABLE |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
; OUTPUT STATUS |
|
|
; OUTPUT STATUS |
|
|
; |
|
|
; |
|
|
CEN_OST: |
|
|
|
|
|
|
|
|
LPT_OST: |
|
|
LD A,(IY+3) |
|
|
LD A,(IY+3) |
|
|
LD C,A ; PORT 0 (DATA) |
|
|
LD C,A ; PORT 0 (DATA) |
|
|
INC C ; SELECT STATUS PORT |
|
|
INC C ; SELECT STATUS PORT |
|
|
@ -171,16 +170,16 @@ CEN_OST: |
|
|
; |
|
|
; |
|
|
; INITIALIZE DEVICE |
|
|
; INITIALIZE DEVICE |
|
|
; |
|
|
; |
|
|
CEN_INITDEV: |
|
|
|
|
|
|
|
|
LPT_INITDEV: |
|
|
HB_DI ; AVOID CONFLICTS |
|
|
HB_DI ; AVOID CONFLICTS |
|
|
CALL CEN_INITDEVX ; DO THE REAL WORK |
|
|
|
|
|
|
|
|
CALL LPT_INITDEVX ; DO THE REAL WORK |
|
|
HB_EI ; INTS BACK ON |
|
|
HB_EI ; INTS BACK ON |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
; THIS ENTRY POINT BYPASSES DISABLING/ENABLING INTS WHICH IS REQUIRED BY |
|
|
; THIS ENTRY POINT BYPASSES DISABLING/ENABLING INTS WHICH IS REQUIRED BY |
|
|
; PREINIT ABOVE. PREINIT IS NOT ALLOWED TO ENABLE INTS! |
|
|
; PREINIT ABOVE. PREINIT IS NOT ALLOWED TO ENABLE INTS! |
|
|
; |
|
|
; |
|
|
CEN_INITDEVX: |
|
|
|
|
|
|
|
|
LPT_INITDEVX: |
|
|
LD A,(IY+3) |
|
|
LD A,(IY+3) |
|
|
LD C,A ; PORT 0 (DATA) |
|
|
LD C,A ; PORT 0 (DATA) |
|
|
XOR A ; CLEAR ACCUM |
|
|
XOR A ; CLEAR ACCUM |
|
|
@ -197,7 +196,7 @@ CEN_INITDEVX: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
CEN_QUERY: |
|
|
|
|
|
|
|
|
LPT_QUERY: |
|
|
LD E,(IY+4) ; FIRST CONFIG BYTE TO E |
|
|
LD E,(IY+4) ; FIRST CONFIG BYTE TO E |
|
|
LD D,(IY+5) ; SECOND CONFIG BYTE TO D |
|
|
LD D,(IY+5) ; SECOND CONFIG BYTE TO D |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
@ -205,8 +204,8 @@ CEN_QUERY: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
CEN_DEVICE: |
|
|
|
|
|
LD D,CIODEV_CEN ; D := DEVICE TYPE |
|
|
|
|
|
|
|
|
LPT_DEVICE: |
|
|
|
|
|
LD D,CIODEV_LPT ; D := DEVICE TYPE |
|
|
LD E,(IY) ; E := PHYSICAL UNIT |
|
|
LD E,(IY) ; E := PHYSICAL UNIT |
|
|
LD C,$40 ; C := DEVICE TYPE, 0x40 IS PIO |
|
|
LD C,$40 ; C := DEVICE TYPE, 0x40 IS PIO |
|
|
LD H,(IY+1) ; H := MODE |
|
|
LD H,(IY+1) ; H := MODE |
|
|
@ -214,62 +213,71 @@ CEN_DEVICE: |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; CEN DETECTION ROUTINE |
|
|
|
|
|
|
|
|
; LPT DETECTION ROUTINE |
|
|
; |
|
|
; |
|
|
CEN_DETECT: |
|
|
|
|
|
|
|
|
LPT_DETECT: |
|
|
LD A,(IY+3) ; BASE PORT ADDRESS |
|
|
LD A,(IY+3) ; BASE PORT ADDRESS |
|
|
ADD A,2 ; USE PORT 2 FOR DETECT |
|
|
|
|
|
LD C,A ; PUT IN C FOR I/O |
|
|
LD C,A ; PUT IN C FOR I/O |
|
|
CALL CEN_DETECT2 ; CHECK IT |
|
|
|
|
|
JR Z,CEN_DETECT1 ; FOUND IT, RECORD IT |
|
|
|
|
|
LD A,CEN_NONE ; NOTHING FOUND |
|
|
|
|
|
|
|
|
CALL LPT_DETECT2 ; CHECK IT |
|
|
|
|
|
JR Z,LPT_DETECT1 ; FOUND IT, RECORD IT |
|
|
|
|
|
LD A,LPT_NONE ; NOTHING FOUND |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
CEN_DETECT1: |
|
|
|
|
|
; CEN FOUND, RECORD IT |
|
|
|
|
|
LD A,CEN_MBC ; RETURN CHIP TYPE |
|
|
|
|
|
|
|
|
LPT_DETECT1: |
|
|
|
|
|
; LPT FOUND, RECORD IT |
|
|
|
|
|
LD A,LPT_IBM ; RETURN CHIP TYPE |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
CEN_DETECT2: |
|
|
|
|
|
; LOOK FOR CEN AT PORT ADDRESS IN C |
|
|
|
|
|
XOR A ; DEFAULT VALUE |
|
|
|
|
|
|
|
|
LPT_DETECT2: |
|
|
|
|
|
; LOOK FOR LPT AT BASE PORT ADDRESS IN C |
|
|
|
|
|
INC C ; PORT C FOR I/O |
|
|
|
|
|
INC C ; ... |
|
|
|
|
|
XOR A ; DEFAULT VALUE (TRI-STATE OFF) |
|
|
OUT (C),A ; SEND IT |
|
|
OUT (C),A ; SEND IT |
|
|
IN A,(C) ; READ IT |
|
|
|
|
|
AND %11000000 ; ISOLATE STATUS BITS |
|
|
|
|
|
CP %00000000 ; CORRECT VALUE? |
|
|
|
|
|
RET NZ ; IF NOT, RETURN |
|
|
|
|
|
LD A,%11000000 ; STATUS BITS ON (LEDS OFF) |
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
;IN A,(C) ; READ IT |
|
|
|
|
|
;AND %11000000 ; ISOLATE STATUS BITS |
|
|
|
|
|
;CP %00000000 ; CORRECT VALUE? |
|
|
|
|
|
;RET NZ ; IF NOT, RETURN |
|
|
|
|
|
;LD A,%11000000 ; STATUS BITS ON (LEDS OFF) |
|
|
|
|
|
;OUT (C),A ; SEND IT |
|
|
|
|
|
;IN A,(C) ; READ IT |
|
|
|
|
|
;AND %11000000 ; ISOLATE STATUS BITS |
|
|
|
|
|
;CP %11000000 ; CORRECT VALUE? |
|
|
|
|
|
; |
|
|
|
|
|
DEC C ; BACK TO BASE PORT |
|
|
|
|
|
DEC C ; ... |
|
|
|
|
|
LD A,$A5 ; TEST VALUE |
|
|
OUT (C),A ; SEND IT |
|
|
OUT (C),A ; SEND IT |
|
|
IN A,(C) ; READ IT |
|
|
|
|
|
AND %11000000 ; ISOLATE STATUS BITS |
|
|
|
|
|
CP %11000000 ; CORRECT VALUE? |
|
|
|
|
|
|
|
|
IN A,(C) ; READ IT BACK |
|
|
|
|
|
CP $A5 ; CORRECT? |
|
|
RET ; RETURN (ZF SET CORRECTLY) |
|
|
RET ; RETURN (ZF SET CORRECTLY) |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
CEN_PRTCFG: |
|
|
|
|
|
|
|
|
LPT_PRTCFG: |
|
|
; ANNOUNCE PORT |
|
|
; ANNOUNCE PORT |
|
|
CALL NEWLINE ; FORMATTING |
|
|
CALL NEWLINE ; FORMATTING |
|
|
PRTS("CEN$") ; FORMATTING |
|
|
|
|
|
|
|
|
PRTS("LPT$") ; FORMATTING |
|
|
LD A,(IY) ; DEVICE NUM |
|
|
LD A,(IY) ; DEVICE NUM |
|
|
CALL PRTDECB ; PRINT DEVICE NUM |
|
|
CALL PRTDECB ; PRINT DEVICE NUM |
|
|
PRTS(": IO=0x$") ; FORMATTING |
|
|
PRTS(": IO=0x$") ; FORMATTING |
|
|
LD A,(IY+3) ; GET BASE PORT |
|
|
LD A,(IY+3) ; GET BASE PORT |
|
|
CALL PRTHEXBYTE ; PRINT BASE PORT |
|
|
CALL PRTHEXBYTE ; PRINT BASE PORT |
|
|
|
|
|
|
|
|
; PRINT THE CEN TYPE |
|
|
|
|
|
|
|
|
; PRINT THE LPT TYPE |
|
|
CALL PC_SPACE ; FORMATTING |
|
|
CALL PC_SPACE ; FORMATTING |
|
|
LD A,(IY+1) ; GET CEN TYPE BYTE |
|
|
|
|
|
|
|
|
LD A,(IY+1) ; GET LPT TYPE BYTE |
|
|
RLCA ; MAKE IT A WORD OFFSET |
|
|
RLCA ; MAKE IT A WORD OFFSET |
|
|
LD HL,CEN_TYPE_MAP ; POINT HL TO TYPE MAP TABLE |
|
|
|
|
|
|
|
|
LD HL,LPT_TYPE_MAP ; POINT HL TO TYPE MAP TABLE |
|
|
CALL ADDHLA ; HL := ENTRY |
|
|
CALL ADDHLA ; HL := ENTRY |
|
|
LD E,(HL) ; DEREFERENCE |
|
|
LD E,(HL) ; DEREFERENCE |
|
|
INC HL ; ... |
|
|
INC HL ; ... |
|
|
LD D,(HL) ; ... TO GET STRING POINTER |
|
|
LD D,(HL) ; ... TO GET STRING POINTER |
|
|
CALL WRITESTR ; PRINT IT |
|
|
CALL WRITESTR ; PRINT IT |
|
|
; |
|
|
; |
|
|
; ALL DONE IF NO CEN WAS DETECTED |
|
|
|
|
|
LD A,(IY+1) ; GET CEN TYPE BYTE |
|
|
|
|
|
|
|
|
; ALL DONE IF NO LPT WAS DETECTED |
|
|
|
|
|
LD A,(IY+1) ; GET LPT TYPE BYTE |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
RET Z ; IF ZERO, NOT PRESENT |
|
|
RET Z ; IF ZERO, NOT PRESENT |
|
|
; |
|
|
; |
|
|
@ -280,41 +288,41 @@ CEN_PRTCFG: |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
CEN_TYPE_MAP: |
|
|
|
|
|
.DW CEN_STR_NONE |
|
|
|
|
|
.DW CEN_STR_MBC |
|
|
|
|
|
|
|
|
LPT_TYPE_MAP: |
|
|
|
|
|
.DW LPT_STR_NONE |
|
|
|
|
|
.DW LPT_STR_IBM |
|
|
; |
|
|
; |
|
|
CEN_STR_NONE .DB "<NOT PRESENT>$" |
|
|
|
|
|
CEN_STR_MBC .DB "MBC$" |
|
|
|
|
|
|
|
|
LPT_STR_NONE .DB "<NOT PRESENT>$" |
|
|
|
|
|
LPT_STR_IBM .DB "IBM$" |
|
|
; |
|
|
; |
|
|
; WORKING VARIABLES |
|
|
; WORKING VARIABLES |
|
|
; |
|
|
; |
|
|
CEN_DEV .DB 0 ; DEVICE NUM USED DURING INIT |
|
|
|
|
|
|
|
|
LPT_DEV .DB 0 ; DEVICE NUM USED DURING INIT |
|
|
; |
|
|
; |
|
|
; CEN DEVICE CONFIGURATION TABLE |
|
|
|
|
|
|
|
|
; LPT DEVICE CONFIGURATION TABLE |
|
|
; |
|
|
; |
|
|
CEN_CFG: |
|
|
|
|
|
|
|
|
LPT_CFG: |
|
|
; |
|
|
; |
|
|
CEN0_CFG: |
|
|
|
|
|
; CEN MODULE A CONFIG |
|
|
|
|
|
|
|
|
LPT0_CFG: |
|
|
|
|
|
; LPT MODULE A CONFIG |
|
|
.DB 0 ; DEVICE NUMBER (SET DURING INIT) |
|
|
.DB 0 ; DEVICE NUMBER (SET DURING INIT) |
|
|
.DB 0 ; CEN TYPE (SET DURING INIT) |
|
|
|
|
|
|
|
|
.DB 0 ; LPT TYPE (SET DURING INIT) |
|
|
.DB 0 ; MODULE ID |
|
|
.DB 0 ; MODULE ID |
|
|
.DB CEN0BASE ; BASE PORT |
|
|
|
|
|
|
|
|
.DB LPT0BASE ; BASE PORT |
|
|
.DW 0 ; LINE CONFIGURATION |
|
|
.DW 0 ; LINE CONFIGURATION |
|
|
; |
|
|
; |
|
|
CEN_CFGSIZ .EQU $ - CEN_CFG ; SIZE OF ONE CFG TABLE ENTRY |
|
|
|
|
|
|
|
|
LPT_CFGSIZ .EQU $ - LPT_CFG ; SIZE OF ONE CFG TABLE ENTRY |
|
|
; |
|
|
; |
|
|
#IF (CENCNT >= 2) |
|
|
|
|
|
|
|
|
#IF (LPTCNT >= 2) |
|
|
; |
|
|
; |
|
|
CEN1_CFG: |
|
|
|
|
|
; CEN MODULE B CONFIG |
|
|
|
|
|
|
|
|
LPT1_CFG: |
|
|
|
|
|
; LPT MODULE B CONFIG |
|
|
.DB 0 ; DEVICE NUMBER (SET DURING INIT) |
|
|
.DB 0 ; DEVICE NUMBER (SET DURING INIT) |
|
|
.DB 0 ; CEN TYPE (SET DURING INIT) |
|
|
|
|
|
|
|
|
.DB 0 ; LPT TYPE (SET DURING INIT) |
|
|
.DB 1 ; MODULE ID |
|
|
.DB 1 ; MODULE ID |
|
|
.DB CEN1BASE ; BASE PORT |
|
|
|
|
|
|
|
|
.DB LPT1BASE ; BASE PORT |
|
|
.DW 0 ; LINE CONFIGURATION |
|
|
.DW 0 ; LINE CONFIGURATION |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
CEN_CFGCNT .EQU ($ - CEN_CFG) / CEN_CFGSIZ |
|
|
|
|
|
|
|
|
LPT_CFGCNT .EQU ($ - LPT_CFG) / LPT_CFGSIZ |