diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 9b936839..c2b1f54d 100644 Binary files a/Doc/RomWBW Applications.pdf and b/Doc/RomWBW Applications.pdf differ diff --git a/Doc/RomWBW Architecture.pdf b/Doc/RomWBW Architecture.pdf index 5c44e59f..47571248 100644 Binary files a/Doc/RomWBW Architecture.pdf and b/Doc/RomWBW Architecture.pdf differ diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 4ee85ddf..12627522 100644 Binary files a/Doc/RomWBW Disk Catalog.pdf and b/Doc/RomWBW Disk Catalog.pdf differ diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index 90f6e84b..8ecffa01 100644 Binary files a/Doc/RomWBW Getting Started.pdf and b/Doc/RomWBW Getting Started.pdf differ diff --git a/Source/Apps/XM/xmx.180 b/Source/Apps/XM/xmx.180 index a07cfa68..479a3dfb 100644 --- a/Source/Apps/XM/xmx.180 +++ b/Source/Apps/XM/xmx.180 @@ -61,14 +61,74 @@ MINIT: CALL IDBIO ; 1=HBIOS, 2=UBIOS LD (BIOID),A ; Save it DEC A ; Test for HBIOS - JR Z,HINIT ; Do HBIOS setup + JR Z,MINIT_HB ; Do HBIOS setup DEC A ; Test for UBIOS - JR Z,UINIT ; Do UBIOS setup + JR Z,MINIT_UB ; Do UBIOS setup ; ; Neither UNA nor RomWBW LD DE,ERR_BIO ; BIOS error message JP FAIL ; Print msg and bail out ; +MINIT_HB: + ; Display RomWBW notification string + LD DE,HB_TAG ; BIOS notification string + LD C,9 ; BDOS string display function + CALL BDOS ; Do it +; + ; Get CPU speed from RomWBW HBIOS and save it + LD B,0F8H ; HBIOS SYSGET function 0xF8 + LD C,0F0H ; CPUINFO subfunction 0xF0 + RST 08 ; Do it, L := CPU speed in MHz + LD A,L ; Move it to A + LD (CPUSPD),A ; Save it +; + ; Get HBIOS bank id + LD BC,0F8F2H ; HBIOS SYSGET, Bank Info + RST 08 ; do it + JP NZ,APIERR ; handle API error + LD A,D ; BIOS bank id to A + LD (BIOSBID),A ; save it +; + ; Lookup current console to use as default for transfer + LD B,0FAH ; HBIOS PEEK + LD A,(BIOSBID) ; get BIOS bank id + LD D,A ; ... and put in D + LD HL,100H + 12H ; HCB console unit address + RST 08 ; E := value + LD A,E ; put in A + LD (UNIT),A ; save it +; + ; Get HBIOS character 0 device type + LD B,006H ; HBIOS DEVICE function 0x06 + LD C,000H ; HBIOS char 0 device + RST 08 ; Do it, D=device type + LD A,D ; Put result in A + CP 000H ; UART? + JP Z,UA_INIT ; If so, do UART H/W init + CP 080H ; USB-FIFO? + JP Z,UF_INIT ; If so, do USB-FIFO H/W init + JP HB_INIT ; Otherwise, use BIOS I/O +; +MINIT_UB: + ; Display UNA notification string + LD DE,UB_TAG ; BIOS notification string + LD C,9 ; BDOS string display function + CALL BDOS ; Do it +; + ; Get CPU speed from UNA and save it + LD C,0F8H ; UNA BIOS Get PHI function + RST 08 ; Returns speed in Hz in DE:HL + LD B,4 ; Divide MHz in DE:HL by 100000H +MINIT_UB1: + SRL D ; ... to get approx CPU speed in + RR E ; ...MHz. Throw away HL, and + DJNZ MINIT_UB1 ; ...right shift DE by 4. + INC E ; Fix up for value truncation + LD A,E ; Put in A + LD (CPUSPD),A ; Save it +; + JP UB_INIT ; UNA BIOS init +; MINIT_RET: PUSH HL ; Save HL (JP table adr) @@ -107,45 +167,35 @@ MINIT_RET: LD HL,(RCVSCL) ; HL := receive scalar RET ; and return ; -HINIT: - ; Display RomWBW notification string - LD DE,HBTAG ; BIOS notification string - LD C,9 ; BDOS string display function - CALL BDOS ; Do it -; - ; Get CPU speed from RomWBW HBIOS and save it - LD B,0F8H ; HBIOS SYSGET function 0xF8 - LD C,0F0H ; CPUINFO subfunction 0xF0 - RST 08 ; Do it, L := CPU speed in MHz - LD A,L ; Move it to A - LD (CPUSPD),A ; Save it -; - JP H_INIT ; HBIOS init +;----------------------------------------------------------------------- ; -UINIT: - ; Display UNA notification string - LD DE,UBTAG ; BIOS notification string - LD C,9 ; BDOS string display function - CALL BDOS ; Do it +; Uninitialize modem ; - ; Get CPU speed from UNA and save it - LD C,0F8H ; UNA BIOS Get PHI function - RST 08 ; Returns speed in Hz in DE:HL - LD B,4 ; Divide MHz in DE:HL by 100000H -UINIT1: - SRL D ; ... to get approx CPU speed in - RR E ; ...MHz. Throw away HL, and - DJNZ UINIT1 ; ...right shift DE by 4. - INC E ; Fix up for value truncation - LD A,E ; Put in A - LD (CPUSPD),A ; Save it +UNINIT: + LD A,(BIOID) + CP 1 ; Is HBIOS? + JR Z,HUNINIT ; Handle HBIOS + CP 2 ; Is UBIOS? + JR Z,UUNINIT ; Handle UBIOS + RET ; Just return ; - JP U_INIT ; UNA BIOS init +HUNINIT: + ; HBIOS: Reset character device 0 + LD B,04H ; HBIOS CIOINIT function 0x04 + LD A,(UNIT) ; HBIOS serial unit number + LD C,A ; Put in C for func call + LD DE,-1 ; Reset w/ current settings + RST 08 ; Do it + RET ; not initialized, so no 'UN-INITIALIZE' ; -HWERR: - ; Failed to identify target comm hardware - LD DE,ERR_HW ; Hardware error message - JP FAIL ; Print message and bail out +UUNINIT: + ; UBIOS: Reset character device 0 + LD C,10H ; UNA INIT function 0x10 + LD A,(UNIT) ; UBIOS serial unit number + LD B,A ; Put in B for func call + LD DE,-1 ; Reset w/ current settings + RST 08 ; Do it + RET ; not initialized, so no 'UN-INITIALIZE' ; ; Identify active BIOS. RomWBW HBIOS=1, UNA UBIOS=2, else 0 ; @@ -184,6 +234,16 @@ IDBIO2: XOR A ; Setup return value of 0 RET ; and done ; +HWERR: + ; Failed to identify target comm hardware + LD DE,ERR_HW ; Hardware error message + JP FAIL ; Print message and bail out +; +APIERR: + ; API returned unepected failure + LD DE,ERR_API ; API error message + JP FAIL ; Pprint message and bail out +; FAIL: ; DE has error string address LD C,9 ; BDOS string display function @@ -192,36 +252,6 @@ FAIL: ; ;----------------------------------------------------------------------- ; -; Uninitialize modem -; -UNINIT: - LD A,(BIOID) - CP 1 ; Is HBIOS? - JR Z,H_UNINIT ; Handle HBIOS - CP 2 ; Is UBIOS? - JR Z,U_UNINIT ; Handle UBIOS - RET ; Just return -; -H_UNINIT: - ; HBIOS: Reset character device 0 - LD B,04H ; HBIOS CIOINIT function 0x04 - LD A,(UNIT) ; HBIOS serial unit number - LD C,A ; Put in C for func call - LD DE,-1 ; Reset w/ current settings - RST 08 ; Do it - RET ; not initialized, so no 'UN-INITIALIZE' -; -U_UNINIT: - ; UBIOS: Reset character device 0 - LD C,10H ; UNA INIT function 0x10 - LD A,(UNIT) ; UBIOS serial unit number - LD B,A ; Put in B for func call - LD DE,-1 ; Reset w/ current settings - RST 08 ; Do it - RET ; not initialized, so no 'UN-INITIALIZE' -; -;----------------------------------------------------------------------- -; ; The following are all dummy routines that are unused because MINIT ; dynamically installs the real jump table. ; @@ -240,17 +270,20 @@ EXTRA3: BIOID DB 0 ; BIOS ID, 1=HBIOS, 2=UBIOS CPUSPD DB 10 ; CPU speed in MHz RCVSCL DW 6600 ; RECV loop timeout scalar -UNIT DB 0 ; HBIOS serial device unit number +UNIT DB 0 ; BIOS serial device unit number +BIOSBID DB 00H ; BIOS bank id ; TAG DB "RomWBW, 23-May-2020$" ; -H_LBL DB ", HBIOS FastPath$" -U_LBL DB ", UNA UBIOS$" +HB_LBL DB ", HBIOS FastPath$" +UB_LBL DB ", UNA UBIOS$" +UA_LBL DB ", UART$" +UF_LBL DB ", USB-FIFO$" COM_LBL DB " on COM$" EXP_LBL DB 13, 10, 13, 10, "*** Experimental ***$" ; -UBTAG DB " [UNA]$" -HBTAG DB " [WBW]$" +UB_TAG DB " [UNA]$" +HB_TAG DB " [WBW]$" ; CRLF DB 13, 10, "$" ; @@ -270,38 +303,22 @@ ERR_API DB 13, 10, 13, 10, "++ BIOS API Error ++", 13, 10, "$" ; table at program startup. See MINIT above. Note that only a ; subset of the jump table is overlaid (SENDR to SPEED). ; -H_JPTBL: - JP H_SENDR ; send character (via pop psw) - JP H_CAROK ; test for carrier - JP H_MDIN ; receive data byte - JP H_GETCHR ; get character from modem - JP H_RCVRDY ; check receive ready - JP H_SNDRDY ; check send ready - JP H_SPEED ; get speed value for file transfer time +HB_JPTBL: + JP HB_SENDR ; send character (via pop psw) + JP HB_CAROK ; test for carrier + JP HB_MDIN ; receive data byte + JP HB_GETCHR ; get character from modem + JP HB_RCVRDY ; check receive ready + JP HB_SNDRDY ; check send ready + JP HB_SPEED ; get speed value for file transfer time ; ;----------------------------------------------------------------------- ; ; HBIOS initialization ; -H_INIT: +HB_INIT: LD HL,2150 ; Smaller receive loop timeout scalar LD (RCVSCL),HL ; ... to compensate for BIOS overhead -; - ; Get HBIOS bank id - LD BC,0F8F2H ; HBIOS SYSGET, Bank Info - RST 08 ; do it - JR NZ,H_APIERR ; handle API error - LD A,D ; BIOS bank id to A - LD (H_BNKID),A ; save it -; - ; Lookup current console to use as default for transfer - LD B,0FAH ; HBIOS PEEK - LD A,(H_BNKID) ; get BIOS bank id - LD D,A ; ... and put in D - LD HL,100H + 12H ; HCB console unit address - RST 08 ; E := value - LD A,E ; put in A - LD (UNIT),A ; save it ; ; Patch SENDR w/ FastPath addresses LD BC,0F801H ; Get CIO func/data adr @@ -309,9 +326,9 @@ H_INIT: LD A,(UNIT) ; get desired char unit LD E,A ; and put in E RST 08 - JR NZ,H_APIERR ; handle API error - LD (H_UDAT),DE ; Plug in data adr - LD (H_SCFN),HL ; Plug in func adr + JP NZ,APIERR ; handle API error + LD (HB_UDAT),DE ; Plug in data adr + LD (HB_SCFN),HL ; Plug in func adr ; ; Patch GETCHR/MDIN w/ FastPath addresses LD BC,0F801H ; Get CIO func/data adr @@ -319,8 +336,8 @@ H_INIT: LD A,(UNIT) ; get desired char unit LD E,A ; and put in E RST 08 - JR NZ,H_APIERR ; handle API error - LD (H_GCFN),HL ; Plug in func adr + JP NZ,APIERR ; handle API error + LD (HB_GCFN),HL ; Plug in func adr ; ; Patch RCVRDY w/ FastPath addresses LD BC,0F801H ; Get CIO func/data adr @@ -328,8 +345,8 @@ H_INIT: LD A,(UNIT) ; get desired char unit LD E,A ; and put in E RST 08 - JR NZ,H_APIERR ; handle API error - LD (H_RRFN),HL ; Plug in func adr + JP NZ,APIERR ; handle API error + LD (HB_RRFN),HL ; Plug in func adr ; ; Patch SNDRDY w/ FastPath addresses LD BC,0F801H ; Get CIO func/data adr @@ -337,31 +354,27 @@ H_INIT: LD A,(UNIT) ; get desired char unit LD E,A ; and put in E RST 08 - JR NZ,H_APIERR ; handle API error - LD (H_SRFN),HL ; Plug in func adr + JP NZ,APIERR ; handle API error + LD (HB_SRFN),HL ; Plug in func adr ; - LD HL,H_JPTBL - LD DE,H_LBL + LD HL,HB_JPTBL + LD DE,HB_LBL JP MINIT_RET ; -H_APIERR: - LD DE,ERR_API - JP FAIL -; ;----------------------------------------------------------------------- ; ; Send character on top of stack ; -H_SENDR: +HB_SENDR: POP AF ; get character to send from stack PUSH BC PUSH DE PUSH HL LD E,A ; character to E - LD IY,(H_UDAT) - LD A,(H_BNKID) ; call into HBIOS bank + LD IY,(HB_UDAT) + LD A,(BIOSBID) ; call into HBIOS bank LD IX,0000H -H_SCFN EQU $-2 +HB_SCFN EQU $-2 CALL 0FFF9H ; HBIOS bank call POP HL POP DE @@ -372,28 +385,31 @@ H_SCFN EQU $-2 ; ; Test and report carrier status, Z set if carrier present ; -H_CAROK: +HB_CAROK: XOR A ; not used, always indicate present RET ; ;----------------------------------------------------------------------- ; -; Get a character (assume character ready has already been tested) +; Get a character ; -; GETCHR must NOT block. +; GETCHR must not block ; -H_GETCHR: - CALL H_RCVRDY +HB_GETCHR: + CALL HB_RCVRDY RET NZ - -H_MDIN: + ; Fall thru if char ready +; +; MDIN can assume a character is ready +; +HB_MDIN: PUSH BC PUSH DE PUSH HL - LD IY,(H_UDAT) - LD A,(H_BNKID) ; call into HBIOS bank + LD IY,(HB_UDAT) + LD A,(BIOSBID) ; call into HBIOS bank LD IX,0000H -H_GCFN EQU $-2 +HB_GCFN EQU $-2 CALL 0FFF9H ; HBIOS bank call LD A,E ; byte received to A POP HL @@ -407,14 +423,14 @@ H_GCFN EQU $-2 ; Error code returned in A register ; *** Error code does not seem to be used *** ; -H_RCVRDY: +HB_RCVRDY: PUSH BC PUSH DE PUSH HL - LD IY,(H_UDAT) - LD A,(H_BNKID) ; call into HBIOS bank + LD IY,(HB_UDAT) + LD A,(BIOSBID) ; call into HBIOS bank LD IX,0000H -H_RRFN EQU $-2 +HB_RRFN EQU $-2 CALL 0FFF9H ; HBIOS bank call SUB 1 ; CF set IFF zero RL A ; CF to bit 0 of A @@ -429,14 +445,14 @@ H_RRFN EQU $-2 ; ; Test for ready to send a character, Z = ready ; -H_SNDRDY: +HB_SNDRDY: PUSH BC PUSH DE PUSH HL - LD IY,(H_UDAT) - LD A,(H_BNKID) ; call into HBIOS bank + LD IY,(HB_UDAT) + LD A,(BIOSBID) ; call into HBIOS bank LD IX,0000H -H_SRFN EQU $-2 +HB_SRFN EQU $-2 CALL 0FFF9H ; HBIOS bank call SUB 1 ; CF set IFF zero RL A ; CF to bit 0 of A @@ -450,14 +466,13 @@ H_SRFN EQU $-2 ; ; Report baud rate (index into SPTBL returned in register A) ; -H_SPEED: +HB_SPEED: LD A,8 ; arbitrarily return 9600 baud RET ; ; ; -H_BNKID DB 00H ; HBIOS bank id -H_UDAT DW 0000H ; Unit data address +HB_UDAT DW 0000H ; Unit data address ; ; ;======================================================================= @@ -472,20 +487,20 @@ H_UDAT DW 0000H ; Unit data address ; table at program startup. See MINIT above. Note that only a ; subset of the jump table is overlaid (SENDR to SPEED). ; -U_JPTBL: - JP U_SENDR ; send character (via pop psw) - JP U_CAROK ; test for carrier - JP U_MDIN ; receive data byte - JP U_GETCHR ; get character from modem - JP U_RCVRDY ; check receive ready - JP U_SNDRDY ; check send ready - JP U_SPEED ; get speed value for file transfer time +UB_JPTBL: + JP UB_SENDR ; send character (via pop psw) + JP UB_CAROK ; test for carrier + JP UB_MDIN ; receive data byte + JP UB_GETCHR ; get character from modem + JP UB_RCVRDY ; check receive ready + JP UB_SNDRDY ; check send ready + JP UB_SPEED ; get speed value for file transfer time ; ;----------------------------------------------------------------------- ; ; UBIOS initialization ; -U_INIT: +UB_INIT: ; ; TODO: ; - TEST!!! @@ -494,15 +509,15 @@ U_INIT: LD HL,3000 ; Smaller receive loop timeout scalar LD (RCVSCL),HL ; ... to compensate for BIOS overhead ; - LD HL,U_JPTBL - LD DE,U_LBL + LD HL,UB_JPTBL + LD DE,UB_LBL JP MINIT_RET ; ;----------------------------------------------------------------------- ; ; Send character on top of stack ; -U_SENDR: +UB_SENDR: POP AF ; get character to send from stack PUSH BC PUSH DE @@ -519,21 +534,24 @@ U_SENDR: ; ; Test and report carrier status, Z set if carrier present ; -U_CAROK: +UB_CAROK: XOR A ; not used, always indicate present RET ; ;----------------------------------------------------------------------- ; -; Get a character (assume character ready has already been tested) +; Get a character ; -; GETCHR must NOT block. +; GETCHR must not block ; -U_GETCHR: - CALL U_RCVRDY +UB_GETCHR: + CALL UB_RCVRDY RET NZ - -U_MDIN: + ; Fall thru if char ready +; +; MDIN can assume a character is ready +; +UB_MDIN: PUSH BC PUSH DE PUSH HL @@ -551,7 +569,7 @@ U_MDIN: ; Error code returned in A register ; *** Error code does not seem to be used *** ; -U_RCVRDY: +UB_RCVRDY: PUSH BC PUSH DE PUSH HL @@ -570,7 +588,7 @@ U_RCVRDY: ; ; Test for ready to send a character, Z = ready ; -U_SNDRDY: +UB_SNDRDY: PUSH BC PUSH DE PUSH HL @@ -588,7 +606,252 @@ U_SNDRDY: ; ; Report baud rate (index into SPTBL returned in register A) ; -U_SPEED: +UB_SPEED: + LD A,8 ; arbitrarily return 9600 baud + RET +; +;======================================================================= +;======================================================================= +; +; 8250-like UART +; +;======================================================================= +;======================================================================= +; +; UART constants +; +UA_SNDB EQU 20H ; bit to test for send ready +UA_SNDR EQU 20H ; value when ready to send +UA_RCVB EQU 01H ; bit to test for receive ready +UA_RCVR EQU 01H ; value when ready to receive +UA_PARE EQU 04H ; bit for parity error +UA_OVRE EQU 02H ; bit for overrun error +UA_FRME EQU 08H ; bit for framing error +UA_ERRS EQU UA_FRME | UA_OVRE | UA_PARE +; +; Following jump table is dynamically patched into real jump +; table at program startup. See MINIT above. Note that only a +; subset of the jump table is overlaid (SENDR to SPEED). +; +UA_JPTBL: + JP UA_SENDR ; send character (via pop psw) + JP UA_CAROK ; test for carrier + JP UA_MDIN ; receive data byte + JP UA_GETCHR ; get character from modem + JP UA_RCVRDY ; check receive ready + JP UA_SNDRDY ; check send ready + JP UA_SPEED ; get speed value for file transfer time +; +;----------------------------------------------------------------------- +; +; UART initialization +; +UA_INIT: + LD DE,13000 ; Receive loop timeout scalar + LD (RCVSCL),DE ; ... for UART RCVRDY timing +; + LD A,L ; Get base I/O port address + LD (UA_SCP),A ; Set port value in SENDR + LD (UA_GCP),A ; Set port value in GETCHR + ADD A,5 ; UART control port is 5 higher + LD (UA_RRP),A ; Set port value in RCVRDY + LD (UA_SRP),A ; Set port value in SNDRDY +; + LD HL,UA_JPTBL + LD DE,UA_LBL + JP MINIT_RET +; +;----------------------------------------------------------------------- +; +; Send character on top of stack +; +UA_SENDR: + POP AF ; get character to send from stack + OUT (0FFH),A ; send to port +UA_SCP EQU $-1 ; port value + RET +; +;----------------------------------------------------------------------- +; +; Test and report carrier status, Z set if carrier present +; +UA_CAROK: + XOR A ; not used, always indicate present + RET +; +;----------------------------------------------------------------------- +; +; Get a character +; +; GETCHR must not block +; +UA_GETCHR: + CALL UA_RCVRDY + RET NZ + ; Fall thru if char ready +; +; MDIN can assume a character is ready +; +UA_MDIN: + IN A,(0FFH) ; read character from port +UA_GCP EQU $-1 ; port value + RET +; +;----------------------------------------------------------------------- +; +; Test for character ready to receive, Z = ready +; Error code returned in A register +; *** Error code does not seem to be used *** +; +UA_RCVRDY: + IN A,(0FFH) ; get modem status +UA_RRP EQU $-1 ; port value + AND UA_RCVB ; isolate ready bit + CP UA_RCVR ; test it (set flags) + LD A,0 ; report no line errors +; + RET +; +;----------------------------------------------------------------------- +; +; Test for ready to send a character, Z = ready +; +UA_SNDRDY: + IN A,(0FFH) ; get status +UA_SRP EQU $-1 ; port value + AND UA_SNDB ; isolate transmit ready bit + CP UA_SNDR ; test for ready value + RET +; +;----------------------------------------------------------------------- +; +; Report baud rate (index into SPTBL returned in register A) +; +UA_SPEED: + LD A,8 ; arbitrarily return 9600 baud + RET +; +; +; +UA_BASE DB 00H ; UART base port I/O address +UA_CTLP DB 00H ; UART control port I/O address +; +; +;======================================================================= +;======================================================================= +; +; WILL SOWERBUTTS ECB USB-FIFO +; +;======================================================================= +;======================================================================= +; +UF_BASE EQU 0CH +UF_DATA EQU (UF_BASE+0) +UF_STATUS EQU (UF_BASE+1) +UF_SEND_IMM EQU (UF_BASE+2) +; +; Following jump table is dynamically patched over initial jump +; table at program startup. See MINIT above. Note that only a +; subset of the jump table is overlaid (SENDR to SPEED). +; +UF_JPTBL: + JP UF_SENDR ; send character (via pop psw) + JP UF_CAROK ; test for carrier + JP UF_MDIN ; receive data byte + JP UF_GETCHR ; get character from modem + JP UF_RCVRDY ; check receive ready + JP UF_SNDRDY ; check send ready + JP UF_SPEED ; get speed value for file transfer time +; +;----------------------------------------------------------------------- +; +; USB-FIFO initialization +; +UF_INIT: + LD HL,12000 ; Receive loop timeout scalar + LD (RCVSCL),HL ; ... for UART RCVRDY timing +; + LD A,L ; Get base I/O port address (data port) + LD (UF_SCDP),A ; Set data port in SENDR + LD (UF_GCDP),A ; Set data port in GETCHR/MDIN + INC A ; Bump to status port + LD (UF_RRSP),A ; Set status port in RCVRDY + LD (UF_SRSP),A ; Set status port in SNDRDY + INC A ; Bump to send immediate port + LD (UF_SCIP),A ; Set send immed port in SENDR +; + LD HL,UF_JPTBL + LD DE,UF_LBL + JP MINIT_RET +; +;----------------------------------------------------------------------- +; +; Send character on top of stack +; +UF_SENDR: + + POP AF ; get character to send from stack + OUT (0FFH),A ; write to fifo +UF_SCDP EQU $-1 ; data port + OUT (0FFH),A ; send immediate +UF_SCIP EQU $-1 ; send immediate port + RET +; +;----------------------------------------------------------------------- +; +; Test and report carrier status, Z set if carrier present +; +UF_CAROK: + XOR A ; not used, always indicate present + RET +; +;----------------------------------------------------------------------- +; +; Get a character (assume character ready has already been tested) +; +; GETCHR must not block +; +UF_GETCHR: + CALL UF_RCVRDY + RET NZ + ; Fall thru if char ready +; +; MDIN can assume a character is ready +; +UF_MDIN: + IN A,(0FFH) ; get char +UF_GCDP EQU $-1 ; data port + RET +; +;----------------------------------------------------------------------- +; +; Test for character ready to receive, Z = ready +; Error code returned in A register +; *** Error code does not seem to be used *** +; +UF_RCVRDY: + IN A,(0FFH) ; b7=0 if char avail, =1 if no char. +UF_RRSP EQU $-1 ; status port + RLCA ; b0=0 if char avail, =1 if no char. + AND 00000001B ; a=0, zf=1 if no char, a=1, zf=0 if char avail. + LD A,0 + RET +; +;----------------------------------------------------------------------- +; +; Test for ready to send a character, Z = ready +; +UF_SNDRDY: + IN A,(0FFH) ; bit 0=0 if space avail, =1 IF FULL +UF_SRSP EQU $-1 ; status port + AND 00000001B ; A=0, ZF=1 if space avail, A=1, ZF=0 if full. + RET +; +;----------------------------------------------------------------------- +; +; Report baud rate (index into SPTBL returned in register A) +; +UF_SPEED: LD A,8 ; arbitrarily return 9600 baud RET ; diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 8f3ed193..c1058b19 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -558,6 +558,8 @@ unit. Register pair DE contains the line characteristics upon return. | C: Serial Device Attributes | D: Serial Device Type | E: Serial Device Number +| H: Serial Device Unit Mode +| L: Serial Device Unit I/O Base Address Reports information about the character device unit specified. Register C indicates the device attributes: 0=RS-232 and 1=Terminal. Register D @@ -745,6 +747,8 @@ of memory. | C: Attributes | D: Device Type | E: Device Number +| H: Disk Device Unit Mode +| L: Disk Device Unit I/O Base Address Reports information about the character device unit specified. Register D indicates the device type (driver) and register E indicates the physical @@ -954,7 +958,7 @@ Documentation required... Documentation required... -### Function 0x28 -- RTC DEVICE (DIODEVICE) +### Function 0x28 -- RTC DEVICE (RTCDEVICE) | _Entry Parameters_ | B: 0x28 @@ -964,6 +968,8 @@ Documentation required... | A: Status (0=OK, else error) | D: Device Type | E: Device Number +| H: RTC Device Unit Mode +| L: RTC Device Unit I/O Base Address Reports information about the RTC device unit specified. Register D indicates the device type (driver) and register E indicates the physical @@ -1136,8 +1142,10 @@ Keyboard should be flushed. | _Exit Results_ | A: Status (0=OK, else error) -| D=Device Type -| E=Device Number +| D: Device Type +| E: Device Number +| H: VDA Device Unit Mode +| L: VDA Device Unit I/O Base Address Reports information about the video device unit specified. @@ -1568,6 +1576,33 @@ not play a note if the duration is zero. For other values, when a tone is played, it will play for the duration defined in HL and then return. +### Function 0x57 -- Sound Device (SNDDEVICE) + +| _Entry Parameters_ +| B: 0x57 +| C: Sound Device Unit Number + +| _Exit Results_ +| A: Status (0=OK, else error) +| D: Serial Device Type +| E: Serial Device Number +| H: Serial Device Unit Mode +| L: Serial Device Unit I/O Base Address + +Reports information about the sound device unit specified. Register D +indicates the device type (driver) and register E indicates the physical +device number assigned by the driver. + +Each character device is handled by an appropriate driver (AY38910, SN76489, +etc.). The driver can be identified by the Device Type. The assigned Device +Types are listed below. + +_Id_ | _Device Type / Driver_ +---- | ---------------------- +0x00 | SN76489 +0x10 | AY38910 +0x20 | BITMODE + `\clearpage`{=latex} System (SYS) diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index b0396e9a..013ec895 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -267,6 +267,8 @@ DEVICE ($06): D=Device Type E=Device Number C=Device Attributes + H=Device Mode + L=Base I/O Adr Serial Device Attributes Byte: 7: 0=RS-232, 1=Terminal @@ -331,6 +333,8 @@ DEVICE ($17) D=Device Type (MD, FD, IDE, etc.) E=Device Number (0..n) C=Device Attributes + H=Device Mode + L=Base I/O Adr Report the Device Type (Floppy, IDE, SD, etc.) and Device Number. Call does not perform any I/O and succeeds even if the device is in an error state. diff --git a/Source/HBIOS/acia.asm b/Source/HBIOS/acia.asm index 4c3c1255..1ca7f218 100644 --- a/Source/HBIOS/acia.asm +++ b/Source/HBIOS/acia.asm @@ -571,6 +571,8 @@ ACIA_DEVICE: LD D,CIODEV_ACIA ; D := DEVICE TYPE LD E,(IY) ; E := PHYSICAL UNIT LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+3) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 26a71d87..0a064734 100644 --- a/Source/HBIOS/asci.asm +++ b/Source/HBIOS/asci.asm @@ -575,6 +575,8 @@ ASCI_DEVICE: LD D,CIODEV_ASCI ; D := DEVICE TYPE LD E,(IY) ; E := PHYSICAL UNIT LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+3) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 6ddf9c1d..4a10196a 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -57,6 +57,7 @@ AY_FNTBL: .DW AY_PLAY .DW AY_QUERY .DW AY_DURATION + .DW AY_DEVICE ; #IF (($ - AY_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" @@ -428,7 +429,7 @@ AY_QUERY_VOLUME: RET ; AY_QUERY_DEV: - LD B, BF_SND_AY38910 ; RETURN DEVICE IDENTIFIER + LD B, SNDDEV_AY38910 ; RETURN DEVICE IDENTIFIER LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT XOR A RET @@ -443,6 +444,19 @@ AY_DURATION: RET ; ;====================================================================== +; SOUND DRIVER FUNCTION - DEVICE +;====================================================================== +; +AY_DEVICE: + LD D,SNDDEV_AY38910 ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL UNIT + LD C,$00 ; C := DEVICE TYPE + LD H,AYMODE ; H := MODE + LD L,AY_RSEL ; L := BASE I/O ADDRESS + XOR A + RET +; +;====================================================================== ; NON-BLOCKING INTERRUPT CODE ;====================================================================== ; diff --git a/Source/HBIOS/bqrtc.asm b/Source/HBIOS/bqrtc.asm index 274a56f0..5bb10ec4 100644 --- a/Source/HBIOS/bqrtc.asm +++ b/Source/HBIOS/bqrtc.asm @@ -344,6 +344,8 @@ BQRTC_SETALM: BQRTC_DEVICE: LD D,RTCDEV_BQ ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,BQRTC_BASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 0cc31919..05f9cb34 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -132,6 +132,8 @@ CVDU_VDARES: CVDU_VDADEV: LD D,VDADEV_CVDU ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,CVDU_BASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index d7cbb744..4384cce7 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -369,6 +369,8 @@ DSRTC_SETBYT: DSRTC_DEVICE: LD D,RTCDEV_DS ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,DSRTCMODE ; H := MODE + LD L,DSRTC_IO ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/duart.asm b/Source/HBIOS/duart.asm index af716ece..dda23fa2 100644 --- a/Source/HBIOS/duart.asm +++ b/Source/HBIOS/duart.asm @@ -611,10 +611,12 @@ DUART_QUERY: ; ; DUART_DEVICE: - LD D,CIODEV_DUART ; D := DEVICE TYPE - LD E,(IY) ; E := PHYSICAL UNIT - LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 - XOR A ; SIGNAL SUCCESS + LD D,CIODEV_DUART ; D := DEVICE TYPE + LD E,(IY) ; E := PHYSICAL UNIT + LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+3) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS RET ; ; DUART DETECTION ROUTINE diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 98ff1ead..7bf477ba 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -508,6 +508,8 @@ FD_DEVICE: #IF (FDMEDIA == FDM111) LD C,%10010100 ; 8" DS/DD #ENDIF + LD H,FDMODE ; H := MODE + LD L,FDC_MSR ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 0a95c1e3..4b50cdb0 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2294,7 +2294,7 @@ SND_ADDENT: ; WORD DRIVER FUNCTION TABLE ADDRESS ; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS) ; -SND_FNCNT .EQU 7 ; NUMBER OF SND FUNCS (FOR RANGE CHECK) +SND_FNCNT .EQU 8 ; NUMBER OF SND FUNCS (FOR RANGE CHECK) SND_MAX .EQU 3 ; UP TO 2 UNITS SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES ; @@ -4165,7 +4165,12 @@ PS_SOUND: LD E,BF_SNDQ_DEV RST 08 LD A,B - DEC A + ;DEC A + RLCA + RLCA + RLCA + RLCA + AND $0F LD DE,PS_SDSN76489 CALL PRTIDXDEA LD A,(PRTIDXCNT) diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 4440c9d5..2457bc9c 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -63,6 +63,7 @@ BF_SNDNOTE .EQU BF_SND + 3 ; REQUEST NOTE - L CONTAINS NOTE - EACH VALUE IS QUAR BF_SNDPLAY .EQU BF_SND + 4 ; INITIATE THE REQUESTED SOUND COMMAND BF_SNDQUERY .EQU BF_SND + 5 ; E IS SUBFUNCTION BF_SNDDURATION .EQU BF_SND + 6 ; REQUEST DURATION HL MILLISECONDS +BF_SNDDEVICE .EQU BF_SND + 7 ; SOUND DEVICE INFO REQUEST ; ; BF_SNDQUERY SUBCOMMANDS BF_SNDQ_STATUS .EQU 0 @@ -71,11 +72,6 @@ BF_SNDQ_VOLUME .EQU BF_SNDQ_STATUS + 2 ; 8 BIT NUMBER BF_SNDQ_PERIOD .EQU BF_SNDQ_STATUS + 3 ; 16 BIT NUMBER BF_SNDQ_DEV .EQU BF_SNDQ_STATUS + 4 ; RETURN DEVICE TYPE CODE AND IO PORTS - TYPE IN B, PORTS IN DE, HL ; -BF_SNDDEV .EQU 0 ; TYPES OF SOUND DRIVERS -BF_SND_SN76489 .EQU BF_SNDDEV + 1 -BF_SND_AY38910 .EQU BF_SNDDEV + 2 -BF_SND_BITMODE .EQU BF_SNDDEV + 3 -; BF_SYS .EQU $F0 BF_SYSRESET .EQU BF_SYS + 0 ; SOFT RESET HBIOS BF_SYSVER .EQU BF_SYS + 1 ; GET HBIOS VERSION @@ -200,12 +196,12 @@ VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 -;; -;; EMULATION TYPES - moved to std.asm -;; -;EMUTYP_NONE .EQU 0 ; NONE -;EMUTYP_TTY .EQU 1 ; TTY -;EMUTYP_ANSI .EQU 2 ; ANSI +; +; SOUND DEVICE IDS +; +SNDDEV_SN76489 .EQU $00 +SNDDEV_AY38910 .EQU $10 +SNDDEV_BITMODE .EQU $20 ; ; HBIOS CONTROL BLOCK OFFSETS ; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 1d1b3c84..f3cabdad 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -169,6 +169,8 @@ HDSK_DEVICE: LD D,DIODEV_HDSK ; D := DEVICE TYPE LD E,(IY+HDSK_DEV) ; E := PHYSICAL DEVICE NUMBER LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,HDSK_IO ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index d6164225..8613e8a3 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -546,6 +546,8 @@ IDE_DEVICE: JR Z,IDE_DEVICE1 ; IF Z, WE ARE DONE LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH IDE_DEVICE1: + LD H,(IY+IDE_MODE) ; H := MODE + LD L,(IY+IDE_IOBASE) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/intrtc.asm b/Source/HBIOS/intrtc.asm index 3765bf1d..6602b3a3 100644 --- a/Source/HBIOS/intrtc.asm +++ b/Source/HBIOS/intrtc.asm @@ -138,6 +138,8 @@ INTRTC_SETTIM: INTRTC_DEVICE: LD D,RTCDEV_INT ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,0 ; L := 0, NO I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 81567653..1761b530 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -149,6 +149,8 @@ MD_DEVICE: LD C,%00100000 ; ASSUME ROM DISK ATTRIBUTES JR Z,MD_DEVICE1 ; IF ZERO, IT IS ROM DISK, DONE LD C,%00101000 ; USE RAM DISK ATTRIBUTES + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,0 ; L := 0, NO BASE I/O ADDRESS MD_DEVICE1: XOR A ; SIGNAL SUCCESS RET diff --git a/Source/HBIOS/pio.asm b/Source/HBIOS/pio.asm index 349858a2..c0d230f7 100644 --- a/Source/HBIOS/pio.asm +++ b/Source/HBIOS/pio.asm @@ -720,6 +720,8 @@ PPI_DEVICE: LD D,CIODEV_PIO ; D := DEVICE TYPE LD E,(IY) ; E := PHYSICAL UNIT LD C,$40 ; C := ATTRIBUTE + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+3) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 6b795ed3..e87a3a64 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -555,6 +555,8 @@ PPIDE_DEVICE: JR Z,PPIDE_DEVICE1 ; IF Z, WE ARE DONE LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH PPIDE_DEVICE1: + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+PPIDE_DATALO) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index e564db7d..ff395002 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -357,6 +357,8 @@ PPPCON_DEVICE: LD D,CIODEV_PPPCON ; D := DEVICE TYPE LD E,0 ; E := DEVICE NUM, ALWAYS 0 LD C,$BF ; C := DEVICE TYPE, 0xBF IS PROP TERM + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,PPIBASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; @@ -691,6 +693,8 @@ PPPSD_DEVICE: LD D,DIODEV_PPPSD ; D := DEVICE TYPE LD E,(IY+PPPSD_DEV) ; E := PHYSICAL DEVICE NUMBER LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,PPIBASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index 3ed73f09..cea20545 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -230,6 +230,8 @@ PRPCON_DEVICE: LD D,CIODEV_PRPCON ; D := DEVICE TYPE LD E,0 ; E := DEVICE NUM, ALWAYS 0 LD C,$BF ; C := DEVICE TYPE, 0xBF IS PROP TERM + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,PRP_IOBASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; @@ -548,6 +550,8 @@ PRPSD_DEVICE: LD D,DIODEV_PRPSD ; D := DEVICE TYPE LD E,(IY+PRPSD_DEV) ; E := PHYSICAL DEVICE NUMBER LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,PRP_IOBASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 6fbedfe2..282a962e 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -181,6 +181,8 @@ RF_DEVICE: LD D,DIODEV_RF ; D := DEVICE TYPE LD E,(IY+RF_DEV) ; E := PHYSICAL DEVICE NUMBER LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVABLE RAM FLOPPY + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+RF_IOAD) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index ce6cebf7..a45738ca 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -125,6 +125,7 @@ SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %10000000 ; RTC:7 IS DATA OUT (CARD -> CPU) +SD_IOBASE .EQU SD_OPRREG ; IOBASE ; RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -139,6 +140,7 @@ SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %01000000 ; RTC:6 IS DATA OUT (CARD -> CPU) +SD_IOBASE .EQU SD_OPRREG ; IOBASE ; RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -151,6 +153,7 @@ SD_OPRMSK .EQU %00000100 ; MASK FOR BITS WE OWN IN RTC LATCH PORT SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR +SD_IOBASE .EQU SD_OPRREG ; IOBASE ; RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -168,6 +171,7 @@ SD_CS0 .EQU %00010000 ; PPIC:4 IS SELECT SD_CLK .EQU %00000010 ; PPIC:1 IS CLOCK SD_DI .EQU %00000001 ; PPIC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %10000000 ; PPIB:7 IS DATA OUT (CARD -> CPU) +SD_IOBASE .EQU SD_PPIBASE ; IOBASE #ENDIF ; #IF (SDMODE == SDMODE_UART) @@ -180,6 +184,7 @@ SD_CS0 .EQU %00001000 ; UART MCR:3 IS SELECT SD_CLK .EQU %00000100 ; UART MCR:2 IS CLOCK SD_DI .EQU %00000001 ; UART MCR:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %00100000 ; UART MSR:5 IS DATA OUT (CARD -> CPU) +SD_IOBASE .EQU UARTIOB ; IOBASE #ENDIF ; #IF (SDMODE == SDMODE_DSD) ; DUAL SD @@ -193,6 +198,7 @@ SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK SD_DI .EQU %00000001 ; RTC:6 IS DATA IN (CARD <- CPU) SD_DO .EQU %00000001 ; RTC:0 IS DATA OUT (CARD -> CPU) +SD_IOBASE .EQU SD_OPRREG ; IOBASE #ENDIF ; #IF (SDMODE == SDMODE_MK4) ; MARK IV (CSIO STYLE INTERFACE) @@ -202,6 +208,7 @@ SD_OPRDEF .EQU %00000000 ; QUIESCENT STATE SD_CS0 .EQU %00000100 ; SELECT ACTIVE SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR +SD_IOBASE .EQU SD_OPRREG ; IOBASE #ENDIF ; #IF (SDMODE == SDMODE_SC) ; SC @@ -213,6 +220,7 @@ SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD SD_CS1 .EQU %00001000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR +SD_IOBASE .EQU SD_OPRREG ; IOBASE ; RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -236,7 +244,7 @@ SD_CD1 .EQU %00000100 ; IN:SD_OPREG:2 = CD2, IN=0 Card detect switch SD_CSX .EQU %00001000 ; IN/OUT:SD_OPREG:3 = CS0, PMOD SPI CS SD_CS0 .EQU %00010000 ; IN/OUT:SD_OPREG:4 = CS1, SDCARD1 CS, IN=1 Card present SD_CS1 .EQU %00100000 ; IN/OUT:SD_OPREG:5 = CS2, SDCARD2 CS, IN=1 Card present - +SD_IOBASE .EQU SD_BASE ; IOBASE #ENDIF ; ; SD CARD COMMANDS @@ -771,6 +779,8 @@ SD_DEVICE: LD D,DIODEV_SD ; D := DEVICE TYPE LD E,(IY+SD_DEV) ; E := PHYSICAL DEVICE NUMBER LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD + LD H,SDMODE ; H := MODE + LD L,(SD_IOBASE) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/simrtc.asm b/Source/HBIOS/simrtc.asm index 28394990..f144d1aa 100644 --- a/Source/HBIOS/simrtc.asm +++ b/Source/HBIOS/simrtc.asm @@ -140,6 +140,8 @@ SIMRTC_SETTIM: SIMRTC_DEVICE: LD D,RTCDEV_SIMH ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,SIMRTC_IO ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 9d7fc13a..9debbc45 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -949,6 +949,8 @@ SIO_DEVICE: LD D,CIODEV_SIO ; D := DEVICE TYPE LD E,(IY) ; E := PHYSICAL UNIT LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 + LD H,(IY+14) ; H := MODE + LD L,(IY+3) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; @@ -1147,6 +1149,7 @@ SIO0A_CFG: .DW SIO0ACLK & $FFFF ; CLOCK FREQ AS .DW SIO0ACLK >> 16 ; ... DWORD VALUE .DB SIO0ACTCC ; CTC CHANNEL + .DB SIO0MODE ; MODE ; SIO_CFGSIZ .EQU $ - SIO_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -1162,6 +1165,7 @@ SIO0B_CFG: .DW SIO0BCLK & $FFFF ; CLOCK FREQ AS .DW SIO0BCLK >> 16 ; ... DWORD VALUE .DB SIO0BCTCC ; CTC CHANNEL + .DB SIO0MODE ; MODE ; #IF (SIOCNT >= 2) ; @@ -1177,6 +1181,7 @@ SIO1A_CFG: .DW SIO1ACLK & $FFFF ; CLOCK FREQ AS .DW SIO1ACLK >> 16 ; ... DWORD VALUE .DB SIO1ACTCC ; CTC CHANNEL + .DB SIO1MODE ; MODE ; ; SIO1 CHANNEL B SIO1B_CFG: @@ -1190,6 +1195,7 @@ SIO1B_CFG: .DW SIO1BCLK & $FFFF ; CLOCK FREQ AS .DW SIO1BCLK >> 16 ; ... DWORD VALUE .DB SIO1BCTCC ; CTC CHANNEL + .DB SIO1MODE ; MODE ; #ENDIF ; diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 0590d256..b65e9f5d 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -197,7 +197,7 @@ SN7_QUERY_VOLUME: SN7_QUERY_DEV: - LD B, BF_SND_SN76489 + LD B, SNDDEV_SN76489 LD DE, SN76489_PORT_LEFT ; E WITH LEFT PORT LD HL, SN76489_PORT_RIGHT ; L WITH RIGHT PORT @@ -304,6 +304,15 @@ SN7_DURATION: XOR A RET +SN7_DEVICE: + LD D,SNDDEV_SN76489 ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL UNIT + LD C,$00 ; C := DEVICE TYPE + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,SN76489_PORT_LEFT ; L := BASE I/O ADDRESS + XOR A + RET + SN7_FNTBL: .DW SN7_RESET .DW SN7_VOLUME @@ -312,6 +321,7 @@ SN7_FNTBL: .DW SN7_PLAY .DW SN7_QUERY .DW SN7_DURATION + .DW SN7_DEVICE ; #IF (($ - SN7_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 427bcf4c..74df2143 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -20,6 +20,7 @@ SP_FNTBL: .DW SP_PLAY .DW SP_QUERY .DW SP_DURATION + .DW SP_DEVICE ; #IF (($ - SP_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" @@ -149,7 +150,7 @@ SP_QUERY_VOLUME: RET ; SP_QUERY_DEV: - LD B, BF_SND_BITMODE ; RETURN DEVICE IDENTIFIER + LD B, SNDDEV_BITMODE ; RETURN DEVICE IDENTIFIER LD DE, (RTCIO*256)+SP_RTCIOMSK ; AND ADDRESS AND DATA PORT XOR A RET @@ -321,6 +322,19 @@ SP_DURATION: RET ; ;====================================================================== +; SOUND DRIVER FUNCTION - DEVICE +;====================================================================== +; +SP_DEVICE: + LD D,SNDDEV_BITMODE ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL UNIT + LD C,$00 ; C := DEVICE TYPE + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,RTCIO ; L := BASE I/O ADDRESS + XOR A + RET +; +;====================================================================== ; ; STANDARD ONE SECOND TONE TABLES AT 1MHZ. ; FOR SP_BEEPER ROUTINE, FIRST WORD LOADED INTO DE, SECOND INTO HL diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 9a0ec46a..3d16b754 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -70,8 +70,8 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918 ACCESSES ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! ; -#IF (TMSMODE == TMSMODE_N8) -; BELOW WAS TUNED FOR N8 AT 18MHZ +#IF (CPUFAM == CPU_Z180) +; BELOW WAS TUNED FOR Z180 AT 18MHZ #DEFINE TMS_IODELAY EX (SP),HL \ EX (SP),HL ; 38 W/S #ELSE ; BELOW WAS TUNED FOR SBC AT 8MHZ @@ -222,6 +222,8 @@ TMS_VDARES1: ; ENTRY POINT TO AVOID TMS_Z180IO RECURSION TMS_VDADEV: LD D,VDADEV_TMS ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO + LD H,TMSMODE ; H := MODE + LD L,TMS_DATREG ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index af00cebe..52ecd2cf 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -339,6 +339,8 @@ UART_DEVICE: LD D,CIODEV_UART ; D := DEVICE TYPE LD E,(IY) ; E := PHYSICAL UNIT LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+2) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/uf.asm b/Source/HBIOS/uf.asm index efc3d9b3..b67c15ab 100644 --- a/Source/HBIOS/uf.asm +++ b/Source/HBIOS/uf.asm @@ -154,6 +154,8 @@ UF_DEVICE: XOR A ; SIGNAL SUCCESS LD E,A ; E := PHYSICAL UNIT, ALWAYS 0 LD C,A ; C := DEVICE TYPE, 0x00 IS RS-232 + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,UFBASE ; L := BASE I/O ADDRESS RET ; ; USB-FIFO DETECTION ROUTINE diff --git a/Source/HBIOS/vdu.asm b/Source/HBIOS/vdu.asm index 2c057ca2..bb37c14a 100644 --- a/Source/HBIOS/vdu.asm +++ b/Source/HBIOS/vdu.asm @@ -181,6 +181,8 @@ VDU_VDARES: VDU_VDADEV: LD D,VDADEV_VDU ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,VDU_BASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index dde3ae33..e6e7f6a8 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -204,6 +204,8 @@ VGA_VDARES: VGA_VDADEV: LD D,VDADEV_VGA ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,VGA_BASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET diff --git a/Source/ver.inc b/Source/ver.inc index ff8f4c70..f36d1c00 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.16" +#DEFINE BIOSVER "3.1.1-pre.18" diff --git a/Source/ver.lib b/Source/ver.lib index 14fd4afe..d14c4276 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.16" + db "3.1.1-pre.18" endm