From cbb963b1ea652b2bc55b8740fdc33b6841918c44 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 24 May 2020 14:33:47 -0700 Subject: [PATCH] XModem Improvements New **experimental** adaptation of XModem called XMX.COM: - Fixes occasional "stall" at startup (I think) - Reduces HBIOS overhead substantially - Automatically uses the console port no matter what COM port the console is on --- Doc/RomWBW Applications.pdf | Bin 141698 -> 141698 bytes Doc/RomWBW Architecture.pdf | Bin 416848 -> 419792 bytes Doc/RomWBW Disk Catalog.pdf | Bin 130980 -> 130980 bytes Doc/RomWBW Getting Started.pdf | Bin 170905 -> 170905 bytes Source/Apps/XM/Build.cmd | 10 +- Source/Apps/XM/Makefile | 11 +- Source/Apps/XM/xmdm125.asm | 9 +- Source/Apps/XM/xmx.180 | 570 +++++++++++++++++++++++++++++++++ Source/HBIOS/cfg_ezz80.asm | 2 +- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/hbios.asm | 80 ++++- Source/HBIOS/hbios.inc | 5 + Source/ver.inc | 2 +- Source/ver.lib | 2 +- 16 files changed, 666 insertions(+), 31 deletions(-) create mode 100644 Source/Apps/XM/xmx.180 diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index b57c4e8a4918a5491760175bcdab3cb2a8dcdad0..0505387d27f744c0560b9534b9c2d1a297ae5293 100644 GIT binary patch delta 135 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

DDQIC+MV%rfaYX!#z{vOAy3~Zt_~1OW6IFU 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 diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 4d92d17f6e15738248e1e8221dab9d3becd635f5..3182f0a8bc4cd7a54f3471d6c147873ffc0e6f5e 100644 GIT binary patch delta 110 zcmZ4TpMA-H_J%EtM_;m=7@8QEm{?3d^O8{p#@YV?VdL1}4U4(|vQ9WMG`_1-VQob)5|@EuD;99i7aLjUCNh h&D~s$4P2dE&72%9O$^PAT`cSrYzQftUNf6X769Uf9dG~u delta 113 zcmbQaoonWHu7(!IElh5?>;{I0rsjr*(|vQ9WMG`_1-VQob)7AZObwk(OpPrK%q-0f hEes7^EDT)@oSe)JjLh6zTwUxGYzQftUNf6X7680y9Jl}g diff --git a/Source/Apps/XM/Build.cmd b/Source/Apps/XM/Build.cmd index 4fbbae00..30b869e9 100644 --- a/Source/Apps/XM/Build.cmd +++ b/Source/Apps/XM/Build.cmd @@ -10,13 +10,21 @@ set ZXLIBDIR=%TOOLS%\cpm\lib\ set ZXINCDIR=%TOOLS%\cpm\include\ zx mac xmdm125.asm $PO + zx slr180 -xmhb/HF -rem zx slr180 -xmuf/HF zx mload25 XM=xmdm125,xmhb + +rem zx slr180 -xmuf/HF rem zx mload25 XMUF=xmdm125,xmuf +zx slr180 -xmx/HF +zx mload25 XMX=xmdm125,xmx + rem set PROMPT=[Build] %PROMPT% rem %comspec% copy /Y XM.com ..\..\..\Binary\Apps\ rem copy /Y XMUF.com ..\..\..\Binary\Apps\ +copy /Y XMX.com ..\..\..\Binary\Apps\ + +rem pause \ No newline at end of file diff --git a/Source/Apps/XM/Makefile b/Source/Apps/XM/Makefile index b16ff7ef..b07781ae 100644 --- a/Source/Apps/XM/Makefile +++ b/Source/Apps/XM/Makefile @@ -1,5 +1,5 @@ -#OBJECTS = xm.com xmuf.com -OBJECTS = xm.com +OBJECTS = xm.com xmx.com +#OBJECTS += xmuf.com DEST = ../../../Binary/Apps TOOLS = ../../../Tools OTHERS = *.hex @@ -9,5 +9,8 @@ include $(TOOLS)/Makefile.inc xm.com: xmdm125.hex xmhb.hex $(ZXCC) $(CPM)/MLOAD25 XM=xmdm125,xmhb -#xmuf.com: xmdm125.hex xmuf.hex -# $(ZXCC) $(CPM)/MLOAD25 XMUF=xmdm125,xmuf +xmuf.com: xmdm125.hex xmuf.hex + $(ZXCC) $(CPM)/MLOAD25 XMUF=xmdm125,xmuf + +xmx.com: xmdm125.hex xmx.hex + $(ZXCC) $(CPM)/MLOAD25 XMX=xmdm125,xmx diff --git a/Source/Apps/XM/xmdm125.asm b/Source/Apps/XM/xmdm125.asm index 8d3ed10b..ba229143 100644 --- a/Source/Apps/XM/xmdm125.asm +++ b/Source/Apps/XM/xmdm125.asm @@ -2259,7 +2259,7 @@ RCVRPTB:CPI SOH ; 'SOH' for a 128-byte block? RCVSERR:MVI B,1 ; Wait for 1 second CALL RECV ; After last char. received JNC RCVSERR ; Loop until sender done - LDA FRSTIM ; Is it the first time? +RCVSER1:LDA FRSTIM ; Is it the first time? ORA A MVI A,NAK JNZ RCVSER2 ; If not first time, send NAK @@ -2320,7 +2320,9 @@ DELFILE:LXI D,FCB ; Point to file ; ; Timed out on receive ; -RCVSTOT:JMP RCVSERR ; Bump error count, etc. +;RCVSTOT:JMP RCVSERR ; Bump error count, etc. +; WBW: Bypass line flush if error is timeout +RCVSTOT:JMP RCVSER1 ; Bump error count, etc. ; ; Got SOH or STX - get block number, block number complemented ; @@ -5694,7 +5696,8 @@ OLINE: DS 80 ; Temporary buffer to store line ORG ($+127)/128*128 ; DBUF EQU $ ; 16-record disk buffer -STACK EQU DBUF-2 ; Save original stack address +;STACK EQU DBUF-2 ; Save original stack address +STACK EQU 0B000H ; WBW LOGBUF EQU DBUF+128 ; For use with LOGCAL ; ;----------------------------------------------------------------------- diff --git a/Source/Apps/XM/xmx.180 b/Source/Apps/XM/xmx.180 new file mode 100644 index 00000000..12bf144d --- /dev/null +++ b/Source/Apps/XM/xmx.180 @@ -0,0 +1,570 @@ +;======================================================================= +; +; XMHB.Z80 - XMODEM12 PATCH FILE FOR ROMWBW HBIOS +; +; Wayne Warthen - wwarthen@gmail.com +; +; 2020-05-23 WBW Rewrite for HBIOS FastPath(tm) +; +;======================================================================= +; + ASEG +; +BASE EQU 100H ; Start of CP/M normal program area +; +BDOS EQU 0005H ; BDOS function dispatch vector +; +;======================================================================= +; +; Jump table: The jump table must be in exactly the same sequence as the +; one in XMODEM. Note the ORG of 103H - This jump table has no jump to +; 'BEGIN'. +; + ORG BASE + 3 ; start after 'JMP BEGIN' +; + JP CONOUT ; must be 00000h if not used, see below + JP MINIT ; initialization routine (if needed) + JP UNINIT ; undo whatever 'MINIT' did (or return) +JPTBL: + JP SENDR ; send character (via pop psw) + JP CAROK ; test for carrier + JP MDIN ; receive data byte + JP GETCHR ; get character from modem + JP RCVRDY ; check receive ready + JP SNDRDY ; check send ready + JP SPEED ; get speed value for file transfer time + JP EXTRA1 ; extra for custom routine + JP EXTRA2 ; extra for custom routine + JP EXTRA3 ; extra for custom routine +; +;----------------------------------------------------------------------- +; +; Output character to console +; +CONOUT EQU 0 ; not used +; +;----------------------------------------------------------------------- +; +; Initialize modem +; +; This procedure has been usurped to dynamically detect the type +; of system we are running on and install the *real* jump table +; entries as appropriate. +; +MINIT: + ; Announce + LD DE,TAG ; Tagline + LD C,9 ; BDOS string display function + CALL BDOS ; Do it +; + ; Identify BIOS (RomWBW HBIOS or UNA UBIOS) + CALL IDBIO ; 1=HBIOS, 2=UBIOS + LD (BIOID),A ; Save it + DEC A ; Test for HBIOS + JR Z,HINIT ; Do HBIOS setup + DEC A ; Test for UBIOS + JR Z,UINIT ; Do UBIOS setup +; + ; Neither UNA nor RomWBW + LD DE,ERR_BIO ; BIOS error message + LD C,9 ; BDOS string display function + CALL BDOS ; Do it + JP 0 ; Bail out! +; +MINIT_RET: + PUSH HL ; Save HL (JP table adr) + + ; Display port notification string + LD C,9 ; BDOS string display function + CALL BDOS ; Do it +; + ; Declare experimental + LD DE,EXP_LBL ; Declare experimental + LD C,9 ; BDOS string display function + CALL BDOS ; Do it +; + ; Newline + LD C,9 ; BDOS string display function + LD DE,CRLF ; Newline + CALL BDOS ; Do it +; + ; Copy real vectors into active jump table + POP HL ; Recover HL + LD DE,JPTBL ; Real jump table is destination + LD BC,7 * 3 ; Copy 7 3-byte entries + LDIR ; Do the copy +; + ; Return with CPU speed in A + LD A,(CPUSPD) ; A := CPU speed in MHz + 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 ; Otherwise, use HBIOS I/O +; +UINIT: + ; Display UNA notification string + LD DE,UBTAG ; 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 +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 +; + JP U_INIT ; UNA BIOS init +; +HWERR: + ; Failed to identify target comm hardware + LD DE,ERR_HW ; Hardware error message + LD C,9 ; BDOS string display function + CALL BDOS ; Do it + JP 0 ; Bail out! +; +; Identify active BIOS. RomWBW HBIOS=1, UNA UBIOS=2, else 0 +; +IDBIO: +; + ; Check for UNA (UBIOS) + LD A,(0FFFDH) ; fixed location of UNA API vector + CP 0C3H ; jp instruction? + JR NZ,IDBIO1 ; if not, not UNA + LD HL,(0FFFEH) ; get jp address + LD A,(HL) ; get byte at target address + CP 0FDH ; first byte of UNA push ix instruction + JR NZ,IDBIO1 ; if not, not UNA + INC HL ; point to next byte + LD A,(HL) ; get next byte + CP 0E5H ; second byte of UNA push ix instruction + JR NZ,IDBIO1 ; if not, not UNA, check others + LD A,2 ; UNA BIOS id = 2 + RET ; and done +; +IDBIO1: + ; Check for RomWBW (HBIOS) + LD HL,(0FFFEH) ; HL := HBIOS ident location + LD A,'W' ; First byte of ident + CP (HL) ; Compare + JR NZ,IDBIO2 ; Not HBIOS + INC HL ; Next byte of ident + LD A,~'W' ; Second byte of ident + CP (HL) ; Compare + JR NZ,IDBIO2 ; Not HBIOS + LD A,1 ; HBIOS BIOS id = 1 + RET ; and done +; +IDBIO2: + ; No idea what this is + XOR A ; Setup return value of 0 + RET ; and done +; +;----------------------------------------------------------------------- +; +; 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 C,80H ; Unit = 80 (console) + 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 B,0 ; Unit = 0 + 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. +; +SENDR: +CAROK: +MDIN: +GETCHR: +RCVRDY: +SNDRDY: +SPEED: +EXTRA1: +EXTRA2: +EXTRA3: + RET +; +BIOID DB 0 ; BIOS ID, 1=HBIOS, 2=UBIOS +CPUSPD DB 10 ; CPU speed in MHz +RCVSCL DW 6600 ; RECV loop timeout scalar +; +TAG DB "RomWBW, 23-May-2020$" +; +COM_LBL DB ", HBIOS FastPath on COM?:$" +EXP_LBL DB 13, 10, 13, 10, "*** Experimental ***$" +; +UBTAG DB " [UNA]$" +HBTAG DB " [WBW]$" +; +CRLF DB 13, 10, "$" +; +ERR_BIO DB 13, 10, 13, 10, "++ Unknown BIOS ++", 13, 10, "$" +ERR_HW DB 13, 10, 13, 10, "++ Unknown Hardware ++", 13, 10, "$" +; +;======================================================================= +;======================================================================= +; +; RomWBW HBIOS Interface +; +;======================================================================= +;======================================================================= +; +; 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). +; +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 +; +;----------------------------------------------------------------------- +; +; HBIOS initialization +; +H_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 + LD A,D ; BIOS bank id to A + LD (H_BNKID),A ; save it +; + ; Patch SENDR w/ FastPath addresses + LD BC,0F801H ; Get CIO func/data adr + LD D,01H ; Func=CIO OUT + LD A,(H_UNIT) ; get desired char unit + LD E,A ; and put in E + RST 08 + ; handle error? + LD (H_SCDAT),DE ; Plug in data adr + LD (H_SCFN),HL ; Plug in func adr +; + ; Patch GETCHR/MDIN w/ FastPath addresses + LD BC,0F801H ; Get CIO func/data adr + LD D,00H ; Func=CIO IN + LD A,(H_UNIT) ; get desired char unit + LD E,A ; and put in E + RST 08 + ; handle error? + LD (H_GCDAT),DE ; Plug in data adr + LD (H_GCFN),HL ; Plug in func adr +; + ; Patch RCVRDY w/ FastPath addresses + LD BC,0F801H ; Get CIO func/data adr + LD D,02H ; Func=CIO IST + LD A,(H_UNIT) ; get desired char unit + LD E,A ; and put in E + RST 08 + ; handle error? + LD (H_RRDAT),DE ; Plug in data adr + LD (H_RRFN),HL ; Plug in func adr +; + ; Patch SNDRDY w/ FastPath addresses + LD BC,0F801H ; Get CIO func/data adr + LD D,03H ; Func=CIO OST + LD A,(H_UNIT) ; get desired char unit + LD E,A ; and put in E + RST 08 + ; handle error? + LD (H_SRDAT),DE ; Plug in data adr + LD (H_SRFN),HL ; Plug in func adr +; + LD HL,H_JPTBL + LD DE,COM_LBL + JP MINIT_RET +; +;----------------------------------------------------------------------- +; +; Send character on top of stack +; +H_SENDR: + POP AF ; get character to send from stack + PUSH BC + PUSH DE + PUSH HL + LD E,A ; character to E + LD IY,0000H +H_SCDAT EQU $-2 + LD A,(H_BNKID) ; call into HBIOS bank + LD HL,0000H +H_SCFN EQU $-2 + CALL 0FFF9H ; HBIOS bank call + POP HL + POP DE + POP BC + RET +; +;----------------------------------------------------------------------- +; +; Test and report carrier status, Z set if carrier present +; +H_CAROK: + XOR A ; not used, always indicate present + RET +; +;----------------------------------------------------------------------- +; +; Get a character (assume character ready has already been tested) +; +; GETCHR must NOT block. +; +H_GETCHR: + CALL H_RCVRDY + RET NZ + +H_MDIN: + PUSH BC + PUSH DE + PUSH HL + LD IY,0000H +H_GCDAT EQU $-2 + LD A,(H_BNKID) ; call into HBIOS bank + LD HL,0000H +H_GCFN EQU $-2 + CALL 0FFF9H ; HBIOS bank call + LD A,E ; byte received to A + POP HL + POP DE + POP BC + RET +; +;----------------------------------------------------------------------- +; +; Test for character ready to receive, Z = ready +; Error code returned in A register +; *** Error code does not seem to be used *** +; +H_RCVRDY: + PUSH BC + PUSH DE + PUSH HL + LD IY,0000H +H_RRDAT EQU $-2 + LD A,(H_BNKID) ; call into HBIOS bank + LD HL,0000H +H_RRFN EQU $-2 + CALL 0FFF9H ; HBIOS bank call + SUB 1 ; CF set IFF zero + RL A ; CF to bit 0 of A + AND 01H ; set Z flag as needed + LD A,0 ; report no line errors + POP HL + POP DE + POP BC + RET +; +;----------------------------------------------------------------------- +; +; Test for ready to send a character, Z = ready +; +H_SNDRDY: + PUSH BC + PUSH DE + PUSH HL + LD IY,0000H +H_SRDAT EQU $-2 + LD A,(H_BNKID) ; call into HBIOS bank + LD HL,0000H +H_SRFN EQU $-2 + CALL 0FFF9H ; HBIOS bank call + SUB 1 ; CF set IFF zero + RL A ; CF to bit 0 of A + AND 01H ; set Z flag as needed + POP HL + POP DE + POP BC + RET +; +;----------------------------------------------------------------------- +; +; Report baud rate (index into SPTBL returned in register A) +; +H_SPEED: + LD A,8 ; arbitrarily return 9600 baud + RET +; +; +; +H_BNKID DB 0 ; HBIOS bank id +H_UNIT DB 80H ; HBIOS unit id +; +; +;======================================================================= +;======================================================================= +; +; UNA UBIOS Interface +; +;======================================================================= +;======================================================================= +; +; 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). +; +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 +; +;----------------------------------------------------------------------- +; +; UBIOS initialization +; +U_INIT: +; +; TODO: +; - TEST!!! +; - ADJUST RCVSCL? +; + LD HL,3000 ; Smaller receive loop timeout scalar + LD (RCVSCL),HL ; ... to compensate for BIOS overhead +; + LD HL,U_JPTBL + LD DE,COM_LBL + JP MINIT_RET +; +;----------------------------------------------------------------------- +; +; Send character on top of stack +; +U_SENDR: + POP AF ; get character to send from stack + PUSH BC + PUSH DE + PUSH HL + LD BC,0012H ; unit 0, func 12h (write char) + LD E,A ; character to E + RST 08 + POP HL + POP DE + POP BC + RET +; +;----------------------------------------------------------------------- +; +; Test and report carrier status, Z set if carrier present +; +U_CAROK: + XOR A ; not used, always indicate present + RET +; +;----------------------------------------------------------------------- +; +; Get a character (assume character ready has already been tested) +; +; GETCHR must NOT block. +; +U_GETCHR: + CALL U_RCVRDY + RET NZ + +U_MDIN: + PUSH BC + PUSH DE + PUSH HL + LD BC,0011H ; unit 0, func 12h (write char) + RST 08 + LD A,E ; byte received to A + POP HL + POP DE + POP BC + RET +; +;----------------------------------------------------------------------- +; +; Test for character ready to receive, Z = ready +; Error code returned in A register +; *** Error code does not seem to be used *** +; +U_RCVRDY: + PUSH BC + PUSH DE + PUSH HL + LD BC,0013H ; unit 0, func 13h (input stat) + LD A,E ; # chars waiting to A + SUB 1 ; CF set IFF zero + RL A ; CF to bit 0 of A + AND 01H ; set Z flag as needed + LD A,0 ; report no line errors + POP HL + POP DE + POP BC + RET +; +;----------------------------------------------------------------------- +; +; Test for ready to send a character, Z = ready +; +U_SNDRDY: + PUSH BC + PUSH DE + PUSH HL + LD BC,0014H ; unit 0, func 14h (output stat) + LD A,E ; # chars space in output buf + SUB 1 ; CF set IFF zero + RL A ; CF to bit 0 of A + AND 01H ; set Z flag as needed + POP HL + POP DE + POP BC + RET +; +;----------------------------------------------------------------------- +; +; Report baud rate (index into SPTBL returned in register A) +; +U_SPEED: + LD A,8 ; arbitrarily return 9600 baud + RET +; + END diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 00041a49..7c001f72 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -87,7 +87,7 @@ DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG ; UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ -UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 75c93b06..ddeafa9f 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -88,7 +88,7 @@ DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG ; UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ -UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 4efdd960..e3cc8fe4 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -86,7 +86,7 @@ DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG ; UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ -UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 547b3b50..720d839e 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -83,7 +83,7 @@ DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG ; UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ -UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 61a1683e..07765d94 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1799,7 +1799,7 @@ HB_DISPATCH: ; #IF 0 ; *DEBUG* START ; - CALL HB_DISPCALL ; DO THE WORK + CALL HB_DISPATCH1 ; DO THE WORK ; ; CHECK STACK INTEGRITY PUSH AF @@ -1810,7 +1810,7 @@ HB_DISPATCH: LD (HB_STACK - HB_STKSIZ + $08),A POP AF RET -HB_DISPCALL: +HB_DISPATCH1: ; #ENDIF ; *DEBUG* END ; @@ -1852,7 +1852,7 @@ CIO_DISPATCH: PUSH IY ; SAVE INCOMING IY - LD IY,CIO_TBL ; POINT IY TO START OF DIO TABLE + LD IY,CIO_TBL ; POINT IY TO START OF CIO TABLE CALL HB_DISPCALL ; GO TO GENERIC API CALL CODE POP IY ; RESTORE IY @@ -2476,27 +2476,37 @@ SYS_FREE: SYS_GET: LD A,C ; GET REQUESTED SUB-FUNCTION CP BF_SYSGET_CIOCNT - JR Z,SYS_GETCIOCNT + JP Z,SYS_GETCIOCNT + CP BF_SYSGET_CIOFN + JP Z,SYS_GETCIOFN CP BF_SYSGET_DIOCNT - JR Z,SYS_GETDIOCNT + JP Z,SYS_GETDIOCNT + ;CP BF_SYSGET_DIOFN + ;JP Z,SYS_GETDIOFN CP BF_SYSGET_RTCCNT - JR Z,SYS_GETRTCCNT + JP Z,SYS_GETRTCCNT + ;CP BF_SYSGET_RTCFN + ;JP Z,SYS_GETRTCFN CP BF_SYSGET_VDACNT JP Z,SYS_GETVDACNT + ;CP BF_SYSGET_VDAFN + ;JP Z,SYS_GETVDAFN CP BF_SYSGET_SNDCNT JP Z, SYS_GETSNDCNT + ;CP BF_SYSGET_SNDFN + ;JP Z,SYS_GETSNDFN CP BF_SYSGET_TIMER - JR Z,SYS_GETTIMER + JP Z,SYS_GETTIMER CP BF_SYSGET_SECS - JR Z,SYS_GETSECS + JP Z,SYS_GETSECS CP BF_SYSGET_BOOTINFO - JR Z,SYS_GETBOOTINFO + JP Z,SYS_GETBOOTINFO CP BF_SYSGET_CPUINFO - JR Z,SYS_GETCPUINFO + JP Z,SYS_GETCPUINFO CP BF_SYSGET_MEMINFO - JR Z,SYS_GETMEMINFO + JP Z,SYS_GETMEMINFO CP BF_SYSGET_BNKINFO - JR Z,SYS_GETBNKINFO + JP Z,SYS_GETBNKINFO CALL SYSCHK LD A,ERR_NOFUNC ; SIGNAL ERROR OR A ; SET FLAGS @@ -2591,6 +2601,27 @@ SYS_GETCIOCNT: XOR A ; SIGNALS SUCCESS RET ; +; GET SERIAL UNIT API FN ADR AND BLOB ADR +; +SYS_GETCIOFN: + LD A,D ; GET CIO FUNC NUM FROM D + LD B,A ; AND PUT IN B + LD A,E ; GET CIO UNIT NUM FROM E + LD C,A ; AND PUT IN C + BIT 7,C ; CHECK FOR SPECIAL UNIT CODE + CALL NZ,SYS_GETCIOFN1 ; IF SO, HANDLE IT + PUSH IY ; SAVE IY VALUE + LD IY,CIO_TBL ; POINT TO UNIT TABLE + CALL HB_DISPCALC ; CALC FN ADR & BLOB ADR + EX (SP),IY ; RESTORE IY, BLOB ADR -> TOS + POP DE ; BLOB ADR -> DE + RET ; AF STILL HAS RESULT OF CALC +; +SYS_GETCIOFN1: + LD A,(CB_CONDEV) ; UNIT $80 -> CONSOLE UNIT + LD C,A ; REPLACE UNIT VALUE IN C + RET ; AND BACK TO REGULAR FLOW +; ; GET DISK UNIT COUNT ; SYS_GETDIOCNT: @@ -2948,14 +2979,27 @@ HB_BADINTCNT .DB 0 ; ; COMMON API FUNCTION DISPATCH CODE ; -; ON ENTRY C IS UNIT # (INDEX INTO XXX_TBL OF UNITS) -; AND IY POINTS TO START OF UNIT TABLE. +; ON ENTRY B IS API FUNCTION NUMBER AND C IS UNIT # +; (INDEX INTO XXX_TBL OF UNITS) AND IY POINTS TO START OF UNIT TABLE. ; USE UNIT # IN C TO LOOKUP XXX_TBL ENTRY. THE XXX_TBL ; ENTRY CONTAINS THE START OF THE DRIVER FUNCTION TABLE AND ; THE DEVICE SPECIFIC INSTANCE DATA (BLOB). SET IY TO BLOB ADDRESS ; AND CALL THE SPECIFIC FUNCTION REQUESTED IN THE DRIVER. ; HB_DISPCALL: + PUSH HL ; SAVE INCOMING IY VALUE + CALL HB_DISPCALC ; IY = BLOB ADR, HL = FN ADR + JR NZ,HB_DISPCALL1 ; ABORT ON ERROR + EX (SP),HL ; RESTORE HL & FN ADR TO TOS + RET ; JUMP TO FN ADR +HB_DISPCALL1: + POP HL ; RECOVER HL + RET ; AND DONE +; +; ENTRY: BC=FUNC/UNIT, IY=DISPATCH TABLE +; EXIT: HL=FUNC ADR, IY=DATA BLOB ADR +; +HB_DISPCALC: ; CHECK INCOMING UNIT INDEX IN C FOR VAILIDITY LD A,C ; A := INCOMING DISK UNIT INDEX CP (IY-1) ; COMPARE TO COUNT @@ -2976,7 +3020,7 @@ HB_DISPCALL: POP BC ; RESTORE BC ; DERIVE DRIVER FUNC ADR TO CALL - PUSH HL ; SAVE INCOMING HL + ;PUSH HL ; SAVE INCOMING HL LD L,(IY+0) ; COPY DRIVER FUNC TABLE LD H,(IY+1) ; ... START TO HL RLCA ; CONV UNIT (STILL IN A) TO FN ADR OFFSET @@ -2985,15 +3029,17 @@ HB_DISPCALL: INC HL ; ... TO GET LD H,(HL) ; ... ACTUAL LD L,A ; ... TARGET FUNCTION ADDRESS - EX (SP),HL ; RESTORE HL, FUNC ADR ON STACK + ;EX (SP),HL ; RESTORE HL, FUNC ADR ON STACK ; GET UNIT INSTANCE DATA BLOB ADDRESS TO IY - PUSH HL ; SAVE INCOMING HL + ;PUSH HL ; SAVE INCOMING HL + PUSH HL ; SAVE FUNC ADR LD L,(IY+2) ; HL := DATA BLOB ADDRESS LD H,(IY+3) ; ... EX (SP),HL ; RESTORE HL, BLOB ADR ON TOS POP IY ; IY := BLOB ADR + XOR A ; SIGNAL SUCCESS RET ; JUMP TO DRIVER FUNC ADR ON TOS ; HB_FUNCERR: diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 3a9933ca..23fb6ac6 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -96,10 +96,15 @@ BF_SYSRES_WARM .EQU $01 ; WARM START (RESTART BOOT LOADER) BF_SYSRES_COLD .EQU $02 ; COLD START ; BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT +BF_SYSGET_CIOFN .EQU $01 ; GET CIO UNIT FN/DATA ADR BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT +BF_SYSGET_DIOFN .EQU $11 ; GET DIO UNIT FN/DATA ADR BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT +BF_SYSGET_RTCFN .EQU $21 ; GET RTC UNIT FN/DATA ADR BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT +BF_SYSGET_VDAFN .EQU $41 ; GET VDA UNIT FN/DATA ADR BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT +BF_SYSGET_SNDFN .EQU $51 ; GET SND UNIT FN/DATA ADR BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE BF_SYSGET_SECS .EQU $D1 ; GET CURRENT SECONDS VALUE BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION diff --git a/Source/ver.inc b/Source/ver.inc index 262cdc2b..fc5d63d7 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.14" +#DEFINE BIOSVER "3.1.1-pre.15" diff --git a/Source/ver.lib b/Source/ver.lib index 5faac7c5..c8e52916 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.14" + db "3.1.1-pre.15" endm