|
|
|
@ -13,6 +13,15 @@ |
|
|
|
; |
|
|
|
SSER_PREINIT: |
|
|
|
; |
|
|
|
; TEST FOR PRESENCE |
|
|
|
; |
|
|
|
XOR A ; CLEAR ACCUM |
|
|
|
LD (SSER_PRESENT),A ; PRESET TO NOT PRESENT |
|
|
|
CALL SSER_DETECT ; CHECK FOR HARDWARE, Z=PRESENT |
|
|
|
RET NZ ; ABORT IF NOT PRESENT |
|
|
|
OR $FF ; PRESENT FLAG |
|
|
|
LD (SSER_PRESENT),A ; STORE IT |
|
|
|
; |
|
|
|
; ADD OURSELVES TO CIO DISPATCH TABLE |
|
|
|
; |
|
|
|
LD D,0 ; PHYSICAL UNIT IS ZERO |
|
|
|
@ -26,6 +35,9 @@ SSER_PREINIT: |
|
|
|
; |
|
|
|
; |
|
|
|
SSER_INIT: |
|
|
|
LD A,(SSER_PRESENT) ; PRESENT FLAG |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET Z ; ABORT IF NOT PRESENT |
|
|
|
CALL NEWLINE |
|
|
|
PRTS("SSER:$") |
|
|
|
PRTS(" IO=0x$") ; FORMATTING |
|
|
|
@ -114,3 +126,24 @@ SSER_DEVICE: |
|
|
|
LD L,SSERSTATUS ; L := BASE I/O ADDRESS |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
; TEST FOR HARDWARE PRESENCE BY CHECKING THE STATUS PORT. IF IT IS |
|
|
|
; $FF, WE ASSUME NOT PRESENT. THEN READ PORT A DIFFERENT WAY. IF |
|
|
|
; PRESENT PORT SHOULD HAVE SAME VALUE. |
|
|
|
; |
|
|
|
; |
|
|
|
SSER_DETECT: |
|
|
|
IN A,(SSERSTATUS) ; GET DATA PORT VALUE DIRECTLY |
|
|
|
CP $FF ; CHECK FOR $FF |
|
|
|
JR NZ,SSER_DETECT1 ; IF NOT $FF, MAY BE ACTIVE, CONTINUE |
|
|
|
OR A ; SWITCH ZF BACK TO NZ |
|
|
|
RET ; DONE |
|
|
|
SSER_DETECT1: |
|
|
|
LD C,SSERSTATUS ; PORT ADR TO C |
|
|
|
IN B,(C) ; GET DATA PORT VALUE VIA (C) |
|
|
|
CP B ; COMPARE, EQUAL IMPLIES ACTIVE PORT |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
SSER_PRESENT .DB 0 ; FLAG FOR HARDWARE PRESENT |