diff --git a/Source/HBIOS/Config/RCZ80_kio.asm b/Source/HBIOS/Config/RCZ80_kio.asm index d4cbea78..f096c73d 100644 --- a/Source/HBIOS/Config/RCZ80_kio.asm +++ b/Source/HBIOS/Config/RCZ80_kio.asm @@ -40,6 +40,8 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIOCNT .SET 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP SIO0MODE .SET SIOMODE_EZZ80 ; SIO 0: CHIP TYPE: SIOMODE_[RC|SMB|ZP|EZZ80] SIO0BASE .SET KIOBASE+$08 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .SET 1843200 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCLK .SET 1843200 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 ; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 256b8b40..692524c5 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -45,6 +45,7 @@ CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS ; DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 11f11006..add48b40 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -63,6 +63,7 @@ CTCBASE .EQU $20 ; CTC BASE I/O ADDRESS ; DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 1b374069..8f2cceb4 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -49,6 +49,7 @@ CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT ; DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 3dacdd9b..5ff655bb 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -52,6 +52,7 @@ CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT ; DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index ddcd94d3..dc009336 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -49,6 +49,7 @@ CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT ; DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 9bcc308c..5361832e 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -44,6 +44,7 @@ CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS ; DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 8e7fa1dd..ded8a6e0 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -41,6 +41,7 @@ CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT ; DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_sc126.asm b/Source/HBIOS/cfg_sc126.asm index a853fa45..10d18e74 100644 --- a/Source/HBIOS/cfg_sc126.asm +++ b/Source/HBIOS/cfg_sc126.asm @@ -44,6 +44,7 @@ CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT ; DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $0D ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 1a791066..f32ee166 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -41,6 +41,7 @@ CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT ; DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 175ce240..40ea8bd2 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -45,6 +45,7 @@ CTCBASE .EQU $20 ; CTC BASE I/O ADDRESS ; DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 7be689d8..4f36da3f 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -995,7 +995,7 @@ HB_CPU1: #IF (KIOENABLE) LD A,%11111001 ; RESET ALL DEVICES, SET DAISYCHAIN OUT (KIOBASE+$0E),A ; DO IT - CALL DLY64 ; WAIT A BIT FOR RESET TO COMPLETE + ;CALL DLY64 ; WAIT A BIT FOR RESET TO COMPLETE #ENDIF ; ; SETUP INTERRUPT VECTORS, AS APPROPRIATE @@ -1158,7 +1158,7 @@ HB_CPU1: ; ; FOR NOW, THIS IS SPECIFICALLY FOR A CTC TO DRIVE AN SIO ; AT 1:1 USING CTC CHANNELS A & B. IN OTHER WORDS, IT JUST -; PASSES THE INCOMING TRIGGER OUT AT 1:1. NO INTERRUPTS. +; PASSES THE INCOMING TRIGGER OUT AT 1:1. ; #IF (CTCENABLE == TRUE) ; @@ -1206,7 +1206,7 @@ HB_CPU1: LD A,0 OUT (CTCA),A ; SETUP CTC BASE INT VECTOR ; - ; CTCC IS SLAVED (WIRED) TO TO CTCD TO ACT AS A PRESCALER + ; CTCC IS SLAVED (WIRED) TO CTCD TO ACT AS A PRESCALER ; CONFIGURE CHANNEL D FOR 50HZ PERIODIC INTERRUPTS ; CTC CLK = 1,843,200HZ ; CTCC TIME CONSTANT = 256 @@ -1280,7 +1280,7 @@ HB_CPU1: LD DE,(CPUOSC / 2) / 1000 ; #IF (Z180_CLKDIV >= 1) - LD (HB_CPUTYPE),A ; CPU TYPE + LD A,(HB_CPUTYPE) ; GET CPU TYPE CP 2 ; Z8S180 REV K OR BETTER? JR C,HB_CPU2 ; IF NOT, NOT POSSIBLE! ; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED @@ -1949,19 +1949,36 @@ DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES ; ; TOS=READ FN ADR ; HL=BUF ADR -; C=SEC COUNT +; E=SEC COUNT ; D=BUF BANK ID ; HB_DSKREAD: +; + ; THE ACTUAL SECTOR READ FUNCTION ADDRESS IS ON TOS, SAVE IT + EX (SP),HL ; SAVE HL TO TOS, HL := READ FN ADR + LD (HB_DSKFNADR),HL ; IMBED IN CALL OP BELOW + POP HL ; RECOVER HL +; +#IF (DIAGENABLE) + ; SAVE DISK UNIT NUMBER BIT MASK + LD A,C ; GET DISK UNIT NUMBER + LD B,A ; PUT IN B FOR LOOP COUNTER + INC B ; LOOP ONE EXTRA TIME TO HANDLE UNIT=0 + XOR A ; START WITH ACCUM ZERO + SCF ; ... AND CF SET +HB_DSKREAD0: + RLA ; ROTATE BIT + DJNZ HB_DSKREAD0 ; ... UNTIL IN PROPER LOCATION + LD (HB_DSKBIT),A ; SAVE IT FOR DIAGNOSTICS +#ENDIF ; #IF 1 - ; CHECK TO SEE IF INTER-BANK I/O NEEDED. IF NOT - ; WE JUST ABORT BACK TO DISK DRIVER TO HANDLE. + ; CHECK TO SEE IF INTER-BANK I/O NEEDED. BIT 7,H ; TGT BUF IN UPPER 32K? - RET NZ ; IF SO, NOTHING TO DO + JP NZ,HB_DSKIO ; IF SO, NON-BANKED LD A,D ; GET TGT BANK CP BID_BIOS ; BIOS BANK? - RET Z ; IF SO, NOTHING TO DO + JP Z,HB_DSKIO ; IF SO, NON-BANKED #ENDIF ; #IF 1 @@ -1975,23 +1992,16 @@ HB_DSKREAD: LD (HB_IOBUF),HL LD A,D LD (HB_IOBNK),A -; - ; SETUP READ FN ADR - POP HL ; READ FN ADR IS AT TOS - LD (HB_DSKREADFN),HL ; IMBED IN CALL OP BELOW ; ; SETUP READ AND LOOP COUNT LD B,E ; SEC LOOP COUNTER LD C,0 ; SEC COMPLETE COUNTER ; HB_DSKREAD1: + LD HL,HB_WRKBUF ; USE WORK BUF REAL I/O +; ; CALL READ FN - PUSH BC ; SAVE COUNTERS - LD E,1 ; ONE SECTOR - LD HL,HB_WRKBUF ; USE WORK BUF FOR DATA -HB_DSKREADFN .EQU $+1 - CALL PANIC ; READ ONE SECTOR - POP BC ; RESTORE COUNTERS + CALL HB_DSKFN ; READ ONE SECTOR ; ; IF FAIL, RETURN ERR JR NZ,HB_DSKREADX ; BAIL OUT ON ERROR @@ -2016,9 +2026,7 @@ HB_DSKREADFN .EQU $+1 ; HB_DSKREADX: LD HL,(HB_IOBUF) ; NEXT BUF ADR - LD E,C ; READ COUNT TO E - OR A ; SET RESULT FLAGS - RET ; DONE + JR HB_DSKIOX ; DONE ; ;================================================================================================== ; DISK WRITE HELPER @@ -2029,19 +2037,36 @@ HB_DSKREADX: ; ; TOS=WRITE FN ADR ; HL=BUF ADR -; C=SEC COUNT +; E=SEC COUNT ; D=BUF BANK ID ; HB_DSKWRITE: +; + ; THE ACTUAL SECTOR READ FUNCTION ADDRESS IS ON TOS, SAVE IT + EX (SP),HL ; SAVE HL TO TOS, HL := READ FN ADR + LD (HB_DSKFNADR),HL ; IMBED IN CALL OP BELOW + POP HL ; RECOVER HL +; +#IF (DIAGENABLE) + ; SAVE DISK UNIT NUMBER BIT MASK + LD A,C ; GET DISK UNIT NUMBER + LD B,A ; PUT IN B FOR LOOP COUNTER + INC B ; LOOP ONE EXTRA TIME TO HANDLE UNIT=0 + XOR A ; START WITH ACCUM ZERO + SCF ; ... AND CF SET +HB_DSKWRITE0: + RLA ; ROTATE BIT + DJNZ HB_DSKWRITE0 ; ... UNTIL IN PROPER LOCATION + LD (HB_DSKBIT),A ; SAVE IT FOR DIAGNOSTICS +#ENDIF ; #IF 1 - ; CHECK TO SEE IF INTER-BANK I/O NEEDED. IF NOT - ; WE JUST ABORT BACK TO DISK DRIVER TO HANDLE. + ; CHECK TO SEE IF INTER-BANK I/O NEEDED. BIT 7,H ; TGT BUF IN UPPER 32K? - RET NZ ; IF SO, NOTHING TO DO + JP NZ,HB_DSKIO ; IF SO, NON-BANKED LD A,D ; GET TGT BANK CP BID_BIOS ; BIOS BANK? - RET Z ; IF SO, NOTHING TO DO + JP Z,HB_DSKIO ; IF SO, NON-BANKED #ENDIF ; #IF 1 @@ -2055,10 +2080,6 @@ HB_DSKWRITE: LD (HB_IOBUF),HL LD A,D LD (HB_IOBNK),A -; - ; SETUP WRITE FN ADR - POP HL ; WRITE FN ADR IS AT TOS - LD (HB_DSKWRITEFN),HL ; IMBED IN CALL OP BELOW ; ; SETUP WRITE AND LOOP COUNT LD B,E ; SEC LOOP COUNTER @@ -2079,12 +2100,8 @@ HB_DSKWRITE1: POP BC ; RESTORE COUNTERS ; ; CALL WRITE FN - PUSH BC ; SAVE COUNTERS - LD E,1 ; ONE SECTOR - LD HL,HB_WRKBUF ; USE WORK BUF FOR DATA -HB_DSKWRITEFN .EQU $+1 - CALL PANIC ; READ ONE SECTOR - POP BC ; RESTORE COUNTERS + LD HL,HB_WRKBUF ; WRITE FROM WORK BUFFER + CALL HB_DSKFN ; WRITE ONE SECTOR ; ; IF FAIL, RETURN ERR JR NZ,HB_DSKWRITEX ; BAIL OUT ON ERROR @@ -2096,12 +2113,53 @@ HB_DSKWRITEFN .EQU $+1 ; HB_DSKWRITEX: LD HL,(HB_IOBUF) ; NEXT BUF ADR + JR HB_DSKIOX ; DONE +; +;================================================================================================== +; NON-BANKED DISK READ/WRITE +;================================================================================================== +; +HB_DSKIO: +; + ; SETUP LOOP COUNT + LD B,E ; SEC LOOP COUNTER + LD C,0 ; SEC COMPLETE COUNTER +; +HB_DSKIO1: + ; CALL READ/WRITE FN + CALL HB_DSKFN ; READ/WRITE ONE SECTOR +; + ; IF FAIL, RETURN ERR + JR NZ,HB_DSKIOX ; BAIL OUT ON ERROR +; + ; INC SECTOR COUNT + INC C ; BUMP SEC READ/WRITE COUNT + DJNZ HB_DSKIO1 ; LOOP AS NEEDED + XOR A ; SIGNAL SUCCESS +; +HB_DSKIOX: LD E,C ; WRITE COUNT TO E OR A ; SET RESULT FLAGS RET ; DONE ; -HB_IOBUF .DW 0 -HB_IOBNK .DB 0 +HB_DSKFN: + PUSH BC ; SAVE COUNTERS +#IF (DIAGENABLE & DIAGDISKIO) + LD A,(HB_DSKBIT) ; LOAD UNIT DISK BIT MASK + OUT (DIAGPORT),A ; DISPLAY ON DIAG LEDS +#ENDIF + LD E,1 ; ONE SECTOR +HB_DSKFNADR .EQU $+1 + CALL PANIC ; READ ONE SECTOR +#IF (DIAGENABLE & DIAGDISKIO) + DIAG(0) ; CLEAR DIAG LEDS +#ENDIF + POP BC ; RESTORE COUNTERS + RET ; RETURN +; +HB_DSKBIT .DB 0 ; ACTIVE DISK UNIT +HB_IOBUF .DW 0 ; CURRENT IO BUFFER ADR +HB_IOBNK .DB 0 ; CURRENT IO BUFFER BANK ID ; ;================================================================================================== ; REAL TIME CLOCK DEVICE DISPATCHER @@ -2723,10 +2781,12 @@ HB_DISPCALL: JR NC,HB_DISPERR ; HANDLE FN NUM OUT OF RANGE ERROR ; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX + PUSH BC ; SAVE BC LD B,0 ; MSB IS ALWAYS ZERO RLC C ; MULTIPLY UNIT INDEX RLC C ; ... BY 4 FOR TABLE ENTRY OFFSET ADD IY,BC ; SET IY TO ENTRY ADDRESS + POP BC ; RESTORE BC ; DERIVE DRIVER FUNC ADR TO CALL PUSH HL ; SAVE INCOMING HL diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 0e1d9dec..cd62a3bd 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -211,6 +211,12 @@ SEL: CALL CST ; CHECK CONSOLE INPUT OR A ; ZERO? JR Z,SEL1 ; IF NOT, CONTINUE +#IF (BIOS == BIOS_WBW) + #IF (DIAGENABLE) + XOR A ; ZERO ACCUM + OUT (DIAGPORT),A ; CLEAR DIAG LEDS + #ENDIF +#ENDIF CALL CINUC ; GET THE KEY CALL COUT ; ECHO KEY JR MATS ; AND HANDLE IT @@ -221,6 +227,12 @@ SEL1: CALL DSKY_STAT ; CHECK DSKY INPUT OR A ; TEST FOR ZERO JR Z,SEL2 ; IF ZERO, NO KEY PRESSED +#IF (BIOS == BIOS_WBW) + #IF (DIAGENABLE) + XOR A ; ZERO ACCUM + OUT (DIAGPORT),A ; CLEAR DIAG LEDS + #ENDIF +#ENDIF CALL DSKY_GETKEY ; GET PENDING KEY PRESS JR MATK ; AND HANDLE IT #ENDIF @@ -237,6 +249,12 @@ SEL2: OR C JP NZ,SEL3 ; +#IF (BIOS == BIOS_WBW) + #IF (DIAGENABLE) + XOR A ; ZERO ACCUM + OUT (DIAGPORT),A ; CLEAR DIAG LEDS + #ENDIF +#ENDIF LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED, JR MATS ; PERFORM DEFAULT BOOT ACTION #ENDIF