diff --git a/.gitignore b/.gitignore index 32d51319..508cc58d 100644 --- a/.gitignore +++ b/.gitignore @@ -82,6 +82,7 @@ Tools/unix/zx/zx !Source/BPBIOS/Z34RCP11/cledsave.com !Source/Fonts !Source/Images/**/*.[Cc][Oo][Mm] +!Source/Images/hdnew_prefix.bin !Source/RomDsk/**/*.[Cc][Oo][Mm] !Source/UBIOS/FSFAT.BIN !Source/UBIOS/UNA-BIOS.BIN diff --git a/Binary/Clean.cmd b/Binary/Clean.cmd index b0b248d8..ad11adad 100644 --- a/Binary/Clean.cmd +++ b/Binary/Clean.cmd @@ -2,6 +2,7 @@ setlocal if exist *.bin del *.bin +if exist *.dat del *.dat if exist *.com del *.com if exist *.img del *.img if exist *.rom del *.rom diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 3b10f0a5..2b72545a 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -1,3 +1,9 @@ +Version 3.1.1 +------------- +- WBW: Version bumped due to pervasive changes +- WBW: Preliminary hard disk partition support (backward compatible) +- WBW: Change Propeller VGA signal timings to 60Hz refresh + Version 3.1 ----------- - WBW: Refactored ROM Loader @@ -14,6 +20,10 @@ Version 3.1 - M?O: RomWBW Disk Catalog document - DEN: Updated TMS to optionally trigger SYSTIMER interrupt (TMSTIMENABLE) - J?M: Updated KERMIT applications with VT100 terminal support +- A?C: Added support for EPFDC +- PMS: Added AY driver with new sound API support +- DEN: Allow immediate autoboot startup +- DEN: Support for floppy device count parameter Version 3.0.1 ------------- diff --git a/Doc/Hard Disk Anatomy.pdf b/Doc/Hard Disk Anatomy.pdf index 54bf0ad5..a65a9912 100644 Binary files a/Doc/Hard Disk Anatomy.pdf and b/Doc/Hard Disk Anatomy.pdf differ diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 2dd3342c..dcf863fc 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 f6c4ae6e..8a116e0a 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 ae5d367f..eb0583ed 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 b399e547..65d14983 100644 Binary files a/Doc/RomWBW Getting Started.pdf and b/Doc/RomWBW Getting Started.pdf differ diff --git a/Doc/SIO+CTC Baud Rate Options.pdf b/Doc/SIO+CTC Baud Rate Options.pdf new file mode 100644 index 00000000..923e6b48 Binary files /dev/null and b/Doc/SIO+CTC Baud Rate Options.pdf differ diff --git a/Makefile b/Makefile index 8253467c..741e5ef7 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,6 @@ all: $(MAKE) --directory Tools/unix $(MAKE) --directory Source - $(MAKE) --directory Source/Images clean: $(MAKE) --directory Tools/unix clean @@ -15,5 +14,5 @@ clobber: rm -f typescript diff: - $(MAKE) --directory diff + $(MAKE) --directory Source diff diff --git a/ReadMe.md b/ReadMe.md index bbd5b46e..34710692 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ ## Z80/Z180 System Software Version 3.1 Pre-release -Thursday 23 April 2020 +Friday 8 May 2020 Wayne Warthen @@ -1137,8 +1137,8 @@ applications are no longer provided. driver. - Ed Brindley contributed some of the code that supports the RC2014 platform. - - Phil Summers contributed Forth and BASIC in ROM as well as a long - list of general code enhancements. + - Phil Summers contributed Forth and BASIC in ROM, the AY-3-8910 sound + driver as well as a long list of general code enhancements. - Phillip Stevens contributed support for FreeRTOS. - Curt Mayer contributed the Linux / MacOS build process. - UNA BIOS and FDISK80 are the products of John Coffman. diff --git a/ReadMe.txt b/ReadMe.txt index 27ad0aa6..601e8101 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -3,7 +3,7 @@ RomWBW Z80/Z180 System Software Version 3.1 Pre-release -Thursday 23 April 2020 +Friday 8 May 2020 Wayne Warthen wwarthen@gmail.com @@ -1169,8 +1169,8 @@ applications are no longer provided. driver. - Ed Brindley contributed some of the code that supports the RC2014 platform. -- Phil Summers contributed Forth and BASIC in ROM as well as a long - list of general code enhancements. +- Phil Summers contributed Forth and BASIC in ROM, the AY-3-8910 sound + driver as well as a long list of general code enhancements. - Phillip Stevens contributed support for FreeRTOS. - Curt Mayer contributed the Linux / MacOS build process. - UNA BIOS and FDISK80 are the products of John Coffman. diff --git a/Source/Apps/Assign.asm b/Source/Apps/Assign.asm index 0bbf038e..c6214c65 100644 --- a/Source/Apps/Assign.asm +++ b/Source/Apps/Assign.asm @@ -22,7 +22,10 @@ ; 2016-04-08 [WBW] Determine key memory addresses dynamically ; 2019-08-07 [WBW] Fixed DPB selection error ; 2019-11-17 [WBW] Added preliminary CP/M 3 support -; 2019-12-24 [WBW] Fixed location of BIOS save area +; 2019-12-24 [WBW] Fixed location of BIOS save area\ +; 2020-04-29 [WBW] Updated for larger DPH (16 -> 20 bytes) +; 2020-05-06 [WBW] Add patch level to version compare +; 2020-05-10 [WBW] Set media change flag in XDPH for CP/M 3 ;_______________________________________________________________________________ ; ; ToDo: @@ -41,8 +44,7 @@ bdos .equ $0005 ; BDOS invocation vector ; stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp ; -rmj .equ 3 ; CBIOS version - major -rmn .equ 1 ; CBIOS version - minor +#include "../ver.inc" ; ;=============================================================================== ; Code Section @@ -118,10 +120,14 @@ init: jp nz,errinv ; abort with invalid config block inc hl ; next byte (major/minor version) ld a,(hl) ; load it - cp rmj << 4 | rmn ; match? + cp RMJ << 4 | RMN ; match? jp nz,errver ; abort with invalid os version - inc hl ; bump past - inc hl ; ... version info + inc hl ; next byte (update/patch) + ld a,(hl) ; load it + and $F0 ; eliminate patch num + cp RUP << 4 ; match? + jp nz,errver ; abort with invalid os version + inc hl ; bump past version info ; ; dereference HL to point to CBIOS extension data ld a,(hl) ; dereference HL @@ -546,7 +552,8 @@ dph_init2: ld a,(hl) ; unit to A push bc ; save loop control push hl ; save drive map pointer - ld hl,16 ; size of a DPH structure + ;ld hl,16 ; size of a DPH structure + ld hl,20 ; size of a DPH structure call alloc ; allocate space for dph jp c,instovf ; handle overflow error push hl ; save DPH location @@ -771,6 +778,10 @@ instc2: inc hl ; bump to slice field of DPH field ld a,(de) ; get slice from mapwrk ld (hl),a ; put slice into DPH field + ld a,11 ; media byte is 11 bytes ahead + call addhl ; bump HL to media byte adr + or $FF ; use $FF to signify media change + ld (hl),a ; set media flag byte inc de ; bump to next mapwrk entry inc de ; ... inc de ; ... @@ -781,7 +792,7 @@ instc3: push hl ; save drvtbl entry adr push de ; save mapwrk entry adr ld hl,(dphadr) ; get cur dph address - ld de,$23 ; size of xdph + ld de,$27 ; size of xdph add hl,de ; bump to next dph ld (dphadr),hl ; save it pop de ; recover mapwrk entry adr @@ -794,6 +805,16 @@ instc3: add hl,de ; HL := SELMEM func ld a,1 ; bank 1 is tpa bank call jphl +; + ; set SCB drive door open flag + ld a,$54 ; SCB drive door opened flag + ld (scboff),a ; set offset parm + or $FF ; SCB operation, $FF = set + ld (scbop),a ; set operation parm + ld (scbval),a ; set value parm to $FF + ld c,$31 ; get/set system control block + ld de,scbpb ; scb parameter block adr + call bdos ; call drvrst ; perform BDOS drive reset ; @@ -1822,6 +1843,11 @@ heaplim .dw 0 ; heap limit address ; dirbuf .dw 0 ; directory buffer location ; +scbpb: ; BDOS SCB get/set parm block +scboff .db $54 ; media open door flag +scbop .db $FF ; set a byte +scbval .dw $FF ; value to set +; mapwrk .fill (4 * 16),$FF ; working copy of drive map ; devtbl: ; device table @@ -1866,10 +1892,10 @@ stack .equ $ ; stack top ; Messages ; indent .db " ",0 -msgban1 .db "ASSIGN v1.1a for RomWBW CP/M, 24-Dec-2019",0 +msgban1 .db "ASSIGN v1.3 for RomWBW CP/M, 10-May-2020",0 msghb .db " (HBIOS Mode)",0 msgub .db " (UBIOS Mode)",0 -msgban2 .db "Copyright 2019, Wayne Warthen, GNU GPL v3",0 +msgban2 .db "Copyright 2020, Wayne Warthen, GNU GPL v3",0 msguse .db "Usage: ASSIGN D:[=[{D:|[]:[]}]][,...]",13,10 .db " ex. ASSIGN (display all active assignments)",13,10 .db " ASSIGN /? (display version and usage)",13,10 diff --git a/Source/Apps/FDU/FDU.asm b/Source/Apps/FDU/FDU.asm index da176f06..23241dfa 100644 --- a/Source/Apps/FDU/FDU.asm +++ b/Source/Apps/FDU/FDU.asm @@ -45,6 +45,7 @@ ; - USE EOT=R TO END R/W AFTER ONE SECTOR INSTEAD ; OF USING PULSE TC ; 2020-01-05: V5.4 ADDED SUPPORT FOR DYNO FDC +; 2020-04-29: v5.5 ADDED SUPPORT FOR ETCHED PIXELS FDC ; ;_______________________________________________________________________________ ; @@ -79,6 +80,7 @@ FDC_RCSMC .EQU 6 FDC_RCWDC .EQU 7 FDC_SMZ80 .EQU 8 FDC_DYNO .EQU 9 +FDC_EPFDC .EQU 10 ; ; FDC MODE ; @@ -213,7 +215,7 @@ INIT5: XOR A RET -STR_BANNER .DB "Floppy Disk Utility (FDU) v5.4, 05-jAN-2020$" +STR_BANNER .DB "Floppy Disk Utility (FDU) v5.5, 29-Apr-2020$" STR_BANNER2 .DB "Copyright (C) 2020, Wayne Warthen, GNU GPL v3","$" STR_HBIOS .DB " [HBIOS]$" STR_UBIOS .DB " [UBIOS]$" @@ -284,6 +286,7 @@ FDCTBL: ; LABEL CONFIG DATA .DW STR_RCWDC, CFG_RCWDC .DW STR_SMZ80, CFG_SMZ80 .DW STR_DYNO, CFG_DYNO + .DW STR_EPFDC, CFG_EPFDC FDCCNT .EQU ($-FDCTBL)/4 ; FD CONTROLLER COUNT ; ; FDC LABEL STRINGS @@ -298,6 +301,7 @@ STR_RCSMC .TEXT "RC-SMC$" STR_RCWDC .TEXT "RC-WDC$" STR_SMZ80 .TEXT "SMZ80$" STR_DYNO .TEXT "DYNO$" +STR_EPFDC .TEXT "EPFDC$" ; ; FDC CONFIGURATION BLOCKS ; @@ -419,6 +423,17 @@ CFG_DYNO: .DB 0FFH ; PSEUDO DMA DATA PORT .DB _PCAT ; MODE= ; +CFG_EPFDC: + .DB 048H ; FDC MAIN STATUS REGISTER + .DB 049H ; FDC DATA PORT + .DB 0FFH ; DATA INPUT REGISTER + .DB 04AH ; DIGITAL OUTPUT REGISTER (LATCH) + .DB 04BH ; DCR + .DB 0FFH ; DACK + .DB 04CH ; TERMINAL COUNT (W/ DACK) + .DB 0FFH ; PSEUDO DMA DATA PORT + .DB _PCAT ; MODE= +; FDCID .DB 0 ; FDC IDENTIFIER (0 INDEXED) FDCBM .DB 0 ; FDC ID BITMAP FDCLBL .DW 0 ; POINTER TO ACTIVE FDC LABEL STRING @@ -437,6 +452,7 @@ FSS_MENU: .TEXT " (H) RC2014 WDC (SMB)\r\n" .TEXT " (I) SmallZ80 Expansion\r\n" .TEXT " (J) Dyno-Card FDC, D1030\r\n" + .TEXT " (K) RC2014 EPFDC\r\n" .TEXT " (X) Exit\r\n" .TEXT "=== OPTION ===> $\r\n" ; @@ -1517,6 +1533,7 @@ MD_MAP: .DB %00000001 ; RCWDC POLL .DB %00000001 ; SMZ80 POLL .DB %00000001 ; DYNO POLL + .DB %00000001 ; EPFDC POLL ; ; MEDIA DESCRIPTION BLOCK ; @@ -1877,7 +1894,7 @@ FM_DRAW0B: ; ZETA, DIO3 LD A,(FST_DOR) AND 00000010B JR FM_DRAW1 -FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO +FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC LD A,(FST_DOR) AND 11110000B JR FM_DRAW1 @@ -2030,7 +2047,7 @@ FM_MOTOR0B: ; ZETA, DIO3 LD A,(FST_DOR) AND 00000010B JR FM_MOTOR1 -FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO +FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC LD A,(FST_DOR) AND 11110000B JR FM_MOTOR1 @@ -2769,7 +2786,7 @@ FC_INIT1: ; DIO FC_INIT2: ; ZETA, DIO3 LD A,(FCD_DORB) JR FC_INIT5 -FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO +FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC LD A,(FCD_DORC) JR FC_INIT5 FC_INIT4: ; WDSMC @@ -2813,7 +2830,7 @@ FC_RESETFDC1: ; ZETA, DIO3, RCSMC POP AF OUT (C),A JR FC_RESETFDC3 -FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO +FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC LD A,0 OUT (C),A LD A,(FST_DOR) @@ -2840,7 +2857,7 @@ FC_PULSETC: ;RES 0,A ;OUT (C),A ;JR FC_PULSETC2 -;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO +;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC ;LD C,(IY+CFG_TC) ;IN A,(C) ;JR FC_PULSETC2 @@ -2872,7 +2889,7 @@ FC_MOTORON2: ; ZETA, DIO3 LD HL,FST_DOR ; POINT TO FDC_DOR SET 1,(HL) JR FC_MOTORON5 -FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO +FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC LD HL,FST_DOR ; POINT TO FDC_DOR LD A,(HL) ; START WITH CURRENT DOR AND 11111100B ; GET RID OF ANY ACTIVE DS BITS @@ -2936,7 +2953,7 @@ FC_MOTOROFF2: ; ZETA, DIO3 LD HL,FST_DOR ; POINT TO FDC_DOR RES 1,(HL) JR FC_MOTOROFF5 -FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO +FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC LD HL,FST_DOR ; POINT TO FDC_DOR LD A,DORC_INIT LD (HL),A @@ -3806,7 +3823,7 @@ DORB_BR500 .EQU 10100000B ; 500KBPS ; DORB_INIT .EQU DORB_BR250 ; -; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO *** +; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO/EPFDC *** ; DORC_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED ; diff --git a/Source/Apps/Timer.asm b/Source/Apps/Timer.asm index 0d049a06..e8d21740 100644 --- a/Source/Apps/Timer.asm +++ b/Source/Apps/Timer.asm @@ -41,8 +41,11 @@ rmn .equ 1 ; intended CBIOS version - minor ; bf_sysver .equ $F1 ; BIOS: VER function bf_sysget .equ $F8 ; HBIOS: SYSGET function +bf_sysset .equ $F9 ; HBIOS: SYSGET function bf_sysgettimer .equ $D0 ; TIMER subfunction +bf_syssettimer .equ $D0 ; TIMER subfunction bf_sysgetsecs .equ $D1 ; SECONDS subfunction +bf_syssetsecs .equ $D1 ; SECONDS subfunction ; ;=============================================================================== ; Code Section @@ -106,6 +109,15 @@ process00: jr process00 ; continue looking for options ; process0: +; + ; Test of API function to set seconds value + ;ld b,bf_sysset ; HBIOS SYSGET function + ;ld c,bf_syssetsecs ; SECONDS subfunction + ;ld de,0 ; set seconds value + ;ld hl,1000 ; ... to 1000 + ;rst 08 ; call HBIOS, DE:HL := seconds value +; + ; get and print seconds value call crlf2 ; formatting ; process1: diff --git a/Source/Apps/Tune/Makefile b/Source/Apps/Tune/Makefile index cbca69a5..3f6c8fdb 100644 --- a/Source/Apps/Tune/Makefile +++ b/Source/Apps/Tune/Makefile @@ -7,13 +7,13 @@ include $(TOOLS)/Makefile.inc DEPS := Tune.asm $(shell find . -name '*.inc') Tune.com: $(DEPS) - $(TASM) -dWBW Tune.asm Tune.com + $(TASM) -dWBW Tune.asm Tune.com Tune.lst Tunezx.com: $(DEPS) - $(TASM) -dZX Tune.asm Tunezx.com + $(TASM) -dZX Tune.asm Tunezx.com Tunezx.lst Tunemsx.com: $(DEPS) - $(TASM) -dMSX Tune.asm Tunemsx.com + $(TASM) -dMSX Tune.asm Tunemsx.com Tunemsx.lst all:: mkdir -p $(DEST)/Tunes diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 1b523d3c..79bb1aac 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -40,6 +40,7 @@ ; 2020-02-11 [WBW] Made hardware config & detection more flexible ; 2020-03-29 [WBW] Fix error in Z180 I/O W/S bracketing ; 2020-04-25 [DEN] Added support to use HBIOS Sound driver +; 2020-05-02 [PMS] Add support for SBC-V2 slow-io hack ;_______________________________________________________________________________ ; ; ToDo: @@ -53,14 +54,18 @@ #include "hbios.inc" #include "cpm.inc" #include "tune.inc" - +; HEAPEND .EQU $C000 ; End of heap storage ; TYPPT2 .EQU 1 ; FILTYP value for PT2 sound file TYPPT3 .EQU 2 ; FILTYP value for PT3 sound file TYPMYM .EQU 3 ; FILTYP value for MYM sound file ; - +; HIGH SPEED CPU CONTROL +; +SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER +CPUFAMZ180 .EQU 1 ; USE Z180 WAIT STATE MANAGEMENT +; ;Conditional assembly - use -D switch on TASM or uz80as assembler to control _ZX .EQU 0 ; 1) Version of ROUT (ZX or MSX standards) _MSX .EQU 0 @@ -401,43 +406,44 @@ IDBIO2: ; ; ; -SLOWCPU: - LD A,(Z180) ; Z180 base I/O port - CP $FF ; Check for no value - RET Z ; Bail out if no value - ADD A,$1E ; Apply offset of CMR register - LD C,A ; And put it in C - LD B,0 ; MSB for 16-bit I/O - IN A,(C) ; Get current value - LD (CMRSAV),A ; Save it to restore later - XOR A ; Go slow - OUT (C),A ; And update CMR - INC C ; Now point to CCR register - IN A,(C) ; Get current value - LD (CCRSAV),A ; Save it to restore later - XOR A ; Go slow - OUT (C),A ; And update CCR - RET -; -; -; -NORMCPU: - LD A,(Z180) ; Z180 base I/O port - CP $FF ; Check for no value - RET Z ; Bail out if no value - ADD A,$1E ; Apply offset of CMR register - LD C,A ; And put it in C - LD B,0 ; MSB for 16-bit I/O - LD A,(CMRSAV) ; Get original CMR value - OUT (C),A ; And update CMR - INC C ; Now point to CCR register - LD A,(CCRSAV) ; Get original CCR value - OUT (C),A ; And update CCR - RET -; -; +;SLOWCPU: +; LD A,(Z180) ; Z180 base I/O port +; CP $FF ; Check for no value +; RET Z ; Bail out if no value +; ADD A,$1E ; Apply offset of CMR register +; LD C,A ; And put it in C +; LD B,0 ; MSB for 16-bit I/O +; IN A,(C) ; Get current value +; LD (CMRSAV),A ; Save it to restore later +; XOR A ; Go slow +; OUT (C),A ; And update CMR +; INC C ; Now point to CCR register +; IN A,(C) ; Get current value +; LD (CCRSAV),A ; Save it to restore later +; XOR A ; Go slow +; OUT (C),A ; And update CCR +; RET +; +; +; +;NORMCPU: +; LD A,(Z180) ; Z180 base I/O port +; CP $FF ; Check for no value +; RET Z ; Bail out if no value +; ADD A,$1E ; Apply offset of CMR register +; LD C,A ; And put it in C +; LD B,0 ; MSB for 16-bit I/O +; LD A,(CMRSAV) ; Get original CMR value +; OUT (C),A ; And update CMR +; INC C ; Now point to CCR register +; LD A,(CCRSAV) ; Get original CCR value +; OUT (C),A ; And update CCR +; RET +; +; SLOW DOWN I/O FOR FAST CPU'S ; SLOWIO: +#IF (CPUFAMZ180) LD A,(Z180) ; Z180 base I/O port CP $FF ; Check for no value RET Z ; Bail out if no value @@ -448,11 +454,17 @@ SLOWIO: LD (DCSAV),A ; Save it to restore later OR %00110000 ; Force slow operation (I/O W/S=3) OUT (C),A ; And update DCNTL +#ENDIF +#IF (SBCV2004) + LD A,8 ; sbc-v2-004 change to + OUT (112),A ; half clock speed +#ENDIF RET ; -; +; RESTORE I/O SPEED FOR FAST CPU'S ; NORMIO: +#IF (CPUFAMZ180) LD A,(Z180) ; Z180 base I/O port CP $FF ; Check for no value RET Z ; Bail out if no value @@ -461,8 +473,12 @@ NORMIO: LD B,0 ; MSB for 16-bit I/O LD A,(DCSAV) ; Get saved DCNTL value OUT (C),A ; And restore it +#ENDIF +#IF (SBCV2004) + LD A,0 ; sbc-v2-004 change to + OUT (112),A ; normal clock speed +#ENDIF RET - ; ERRBIO: ; Invalid BIOS or version LD DE,MSGBIO @@ -717,7 +733,9 @@ CurPos .DB 0 ;for visualization only (i.e. no need for playing) ;Identifier .IF Id - .DB "=Uni PT2 and PT3 Player r.",Release,"=" + .DB "=Uni PT2 and PT3 Player r." + .DB Release + .DB "=" .ENDIF .IF LoopChecker @@ -1980,87 +1998,78 @@ LOUT OUT (C), A ; SELECT REGISTER JP M, LOUT2 ; IF BIT 7 SET, RETURN W/O WRITING VALUE LD C, D ; SELECT DATA PORT OUT (C), A ; WRITE VALUE TO REGISTER 13 -LOUT2 - CALL NORMIO +LOUT2 CALL NORMIO EI RET ; AND DONE PLAYVIAHBIOS: - LD B, BF_SNDVOL - LD C, 0 - LD H, 0 - LD A, (AYREGS + AmplA) - AND $0F - rlca - rlca - rlca - rlca - LD L, A - RST 08 - - LD B, BF_SNDPRD - LD C, 0 - LD HL, (AYREGS+TonA) - ld a, h - AND $0F - LD H, A - RST 08 - - LD B, BF_SNDPLAY - LD C, 0 - LD D, 0 - RST 08 - - LD B, BF_SNDVOL - LD C, 0 - LD H, 0 - LD A, (AYREGS + AmplB) - AND $0F - rlca - rlca - rlca - rlca - LD L, A +; +; CHANNEL 0 (LEFT) +; + LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME + LD A, (AYREGS + AmplA) ; DEVICE 0 + ADD A,A ; GET 4-BIT + ADD A,A ; VOLUME 0-15 + ADD A,A ; AND CONVERT + ADD A,A ; TO HBIOS + LD L, A ; RANGE 0-255 RST 08 - - LD B, BF_SNDPRD - LD C, 0 - LD HL, (AYREGS+TonB) - ld a, h - AND $0F - LD H, A +; + LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD + LD HL, (AYREGS+TonA) ; DEVICE 0 + LD A, H ; GET 12-BIT ONE PERIOD + AND $0F ; MASK OFF HIGH + LD H, A ; NIBBLE RST 08 - - LD B, BF_SNDPLAY - LD C, 0 - LD D, 1 +; + LD BC, (BF_SNDPLAY*256)+0 ; PLAY + LD D, 0 ; DEVICE 0 + RST 08 ; CHANNEL 0 +; +; CHANNEL 1 (MIDDLE) +; + LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME + LD A, (AYREGS + AmplB) ; DEVICE 0 + ADD A,A ; GET 4-BIT + ADD A,A ; VOLUME 0-15 + ADD A,A ; AND CONVERT + ADD A,A ; TO HBIOS + LD L, A ; RANGE 0-255 RST 08 - - LD B, BF_SNDVOL - LD C, 0 - LD H, 0 - LD A, (AYREGS + AmplC) - AND $0F - rlca - rlca - rlca - rlca - LD L, A +; + LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD + LD HL, (AYREGS+TonB) ; DEVICE 0 + ld A, H ; GET 12-BIT ONE PERIOD + AND $0F ; MASK OFF HIGH + LD H, A ; NIBBLE RST 08 - - LD B, BF_SNDPRD - LD C, 0 - LD HL, (AYREGS+TonC) - ld a, h - AND $0F - LD H, A +; + LD BC, (BF_SNDPLAY*256)+0 ; PLAY + LD D, 1 ; DEVICE 0 + RST 08 ; CHANNEL 0 +; +; CHANNEL 2 (RIGHT) +; + LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME + LD A, (AYREGS + AmplC) ; DEVICE 0 + ADD A,A ; GET 4-BIT + ADD A,A ; VOLUME 0-15 + ADD A,A ; AND CONVERT + ADD A,A ; TO HBIOS + LD L, A ; RANGE 0-255 RST 08 - - LD B, BF_SNDPLAY - LD C, 0 - LD D, 2 +; + LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD + LD HL, (AYREGS+TonC) ; DEVICE 0 + LD A, H ; GET 12-BIT ONE PERIOD + AND $0F ; MASK OFF HIGH + LD H, A ; NIBBLE RST 08 - +; + LD BC, (BF_SNDPLAY*256)+0 ; PLAY + LD D, 2 ; DEVICE 0 + RST 08 ; CHANNEL 0 + RET #ENDIF diff --git a/Source/Apps/Tune/cli.inc b/Source/Apps/Tune/cli.inc index c8ac9b8c..9f8b2551 100644 --- a/Source/Apps/Tune/cli.inc +++ b/Source/Apps/Tune/cli.inc @@ -7,15 +7,20 @@ CLI_ABRT_IF_OPT_FIRST: RET CLI_HAVE_HBIOS_SWITCH: - LD HL, CLIARGS ; TEST FOR --HBIOS ON COMNMAND LINE + LD HL, CLIARGS ; TEST FOR --HBIOS ON COMMAND LINE LD DE, HBIOSOPT CALL STRINDEX JR NZ, CLI_HAVE_HBIOS_SWITCH1 - OR $FF ; IS NOT HBIOS + OR $FF ; MATCHED --HBIOS LD (HBIOSMD), A - RET -CLI_HAVE_HBIOS_SWITCH1: - AND 0 ; IS HBIOS + LD BC,(BF_SYSGET*256)+BF_SND + RST 08 ; CHECK WE HAVE + XOR A ; AT LEAST ONE + CP E ; SOUND DEVICE + RET NZ + JP ERRHW +CLI_HAVE_HBIOS_SWITCH1 ; NOT MATCHED --HBIOS + XOR A LD (HBIOSMD), A RET diff --git a/Source/Apps/Tune/hbios.inc b/Source/Apps/Tune/hbios.inc index f2442f78..7a2ffea1 100644 --- a/Source/Apps/Tune/hbios.inc +++ b/Source/Apps/Tune/hbios.inc @@ -6,10 +6,10 @@ RMN .EQU 1 ; intended CBIOS version - minor BF_SYSVER .EQU $F1 ; BIOS: VER function BF_SYSGET .EQU $F8 ; HBIOS: SYSGET function ; - BF_SND .EQU $50 BF_SNDRESET .EQU BF_SND + 0 ; RESET SOUND SYSTEM -BF_SNDVOL .EQU BF_SND + 1 ; REQUEST SOUND VOL - D IS CHANNEL, E CONTAINS VOLUME (255 MAX, 0 SILENT) - SCALED AS REQUIRED BY DRIVER (EG: MAPS TO JUST 4 BIT RESOLUTION FOR SN76489) -BF_SNDPRD .EQU BF_SND + 2 ; REQUEST SOUND PERIOD - D IS CHANNEL, HL CONTAINS PERIOD (0 LOWEST NOTE) - SCALED BY DRIVER (EG: MAPS TO JUST 10 BITS FOR SN76489 ) +BF_SNDVOL .EQU BF_SND + 1 ; REQUEST SOUND VOL - L CONTAINS VOLUME (255 MAX, 0 SILENT) - SCALED AS REQUIRED BY DRIVER (EG: MAPS TO JUST 4 BIT RESOLUTION FOR SN76489) +BF_SNDPRD .EQU BF_SND + 2 ; REQUEST SOUND PERIOD - HL CONTAINS DRIVER SPECIFIC VALUE +BF_SNDNOTE .EQU BF_SND + 3 ; REQUEST NOTE - L CONTAINS NOTE - EACH VALUE IS QUARTER NOTE BF_SNDPLAY .EQU BF_SND + 4 ; INITIATE THE REQUESTED SOUND COMMAND -BF_SNDQUERY .EQU BF_SND + 5 ; D IS CHANNEL, E IS SUBCOMMAND +BF_SNDQUERY .EQU BF_SND + 5 ; E IS SUBFUNCTION diff --git a/Source/BPBIOS/diskdefs b/Source/BPBIOS/diskdefs index 937bfcf2..a03e42f0 100644 --- a/Source/BPBIOS/diskdefs +++ b/Source/BPBIOS/diskdefs @@ -297,121 +297,169 @@ diskdef wbw_rom1024 os 2.2 end -# UNA 512KB ROM (128KB reserved, 384KB ROM Disk) +# RomWBW 720K floppy media +diskdef wbw_fd720 + seclen 512 + tracks 160 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 2.2 +end -diskdef una_rom512 +# RomWBW 1.44M floppy media +diskdef wbw_fd144 seclen 512 - tracks 12 - sectrk 64 + tracks 160 + sectrk 18 blocksize 2048 maxdir 256 skew 0 - boottrk 0 + boottrk 2 os 2.2 end -# UNA 512KB ROM (128KB reserved, 896KB ROM Disk) +# RomWBW 360K floppy media +diskdef wbw_fd360 + seclen 512 + tracks 80 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 2.2 +end -diskdef una_rom1024 +# RomWBW 1.20M floppy media +diskdef wbw_fd120 seclen 512 - tracks 28 - sectrk 64 + tracks 160 + sectrk 15 blocksize 2048 maxdir 256 skew 0 - boottrk 0 + boottrk 2 os 2.2 end -# RomWBW 8MB Hard Disk, LU 0-3 +# RomWBW 8320KB Hard Disk Slice +# Legacy format, 512 dir entries, 16,630 sectors / slice +diskdef wbw_hd + seclen 512 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 512 + skew 0 + boottrk 16 + os 2.2 +end + +# First 4 slices of wbw_hd diskdef wbw_hd0 seclen 512 - tracks 65 - sectrk 256 + tracks 1040 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 1 + boottrk 16 os 2.2 end diskdef wbw_hd1 seclen 512 - tracks 130 - sectrk 256 + tracks 2080 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 66 + boottrk 1056 os 2.2 end diskdef wbw_hd2 seclen 512 - tracks 195 - sectrk 256 + tracks 3120 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 131 + boottrk 2096 os 2.2 end diskdef wbw_hd3 seclen 512 - tracks 260 - sectrk 256 + tracks 4160 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 196 + boottrk 3136 os 2.2 end -# RomWBW 720K floppy media -diskdef wbw_fd720 + +# RomWBW 8MB Hard Disk +# New format, 1024 dir entries, 16,384 sectors / slice +# Pure filesystem image, no prefix +diskdef wbw_hdnew seclen 512 - tracks 160 - sectrk 9 - blocksize 2048 - maxdir 128 + tracks 1024 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 4 + boottrk 2 os 2.2 end -# RomWBW 1.44M floppy media -diskdef wbw_fd144 +# First 4 slices of wbw_hdnew +# Assumes 128KB prefix (256 sectors) +diskdef wbw_hdnew0 seclen 512 - tracks 160 - sectrk 18 - blocksize 2048 - maxdir 256 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 2 + boottrk 18 os 2.2 end -# RomWBW 360K floppy media -diskdef wbw_fd360 +diskdef wbw_hdnew1 seclen 512 - tracks 80 - sectrk 9 - blocksize 2048 - maxdir 128 + tracks 2064 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 4 + boottrk 1042 os 2.2 end -# RomWBW 1.20M floppy media -diskdef wbw_fd120 +diskdef wbw_hdnew2 seclen 512 - tracks 160 - sectrk 15 - blocksize 2048 - maxdir 256 + tracks 3112 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 2 + boottrk 2066 + os 2.2 +end + +diskdef wbw_hdnew3 + seclen 512 + tracks 4136 + sectrk 16 + blocksize 4096 + maxdir 1024 + skew 0 + boottrk 3114 os 2.2 end diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index f861e737..acaaa3df 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -10,8 +10,8 @@ ; 1) STACK LOCATION DURING BOOT OR WBOOT??? ; 2) REVIEW USE OF DI/EI IN INIT ; -FALSE .EQU 0 -TRUE .EQU ~FALSE +FALSE .EQU 0 +TRUE .EQU ~FALSE ; BDOS .EQU 5 ; BDOS FUNC INVOCATION VECTOR ; @@ -56,8 +56,8 @@ DEV_NUL .EQU $FF ; NUL: ; ; MEMORY LAYOUT ; -IOBYTE .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE -CDISK .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P +IOBYTE .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE +CDISK .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P ; CCP_LOC .EQU CPM_LOC CCP_SIZ .EQU $800 @@ -78,7 +78,7 @@ MEMTOP .EQU $10000 #INCLUDE "../UBIOS/ubios.inc" #ENDIF ; - .ORG CBIOS_LOC ; DEFINED IN STD.ASM + .ORG CBIOS_LOC ; DEFINED IN STD.ASM ; STACK .EQU CBIOS_END ; USE SLACK SPACE FOR STACK AS NEEDED ; @@ -112,7 +112,7 @@ WBOOTE JP WBOOT ; #1 - WARM START ; ; RomWBW CBIOS places the following stamp data into page zero ; at address $40. The address range $40-$4F is reserved by CP/M -; as a scratch area for CBIOS. This data below is copied there at +; as a scratch area for CBIOS. This data below is copied there at ; every warm start. It allows applications to identify RomWBW CBIOS. ; Additionally, it contains a pointer to additional CBIOS extension ; data (CBX) specific to RomWBW CBIOS. @@ -130,7 +130,7 @@ STPIMG: .DB 'W',~'W' ; MARKER STPSIZ .EQU $ - STPIMG ; ; The following section contains key information and addresses for the -; RomWBW CBIOS. A pointer to the start of this section is stored with +; RomWBW CBIOS. A pointer to the start of this section is stored with ; with the CBX data in page zero at $44 (see above). ; CBX: @@ -152,15 +152,15 @@ CBXSIZ .EQU $ - CBX ; IOBYTE (0003H) ; ============== ; -; Device LST: PUN: RDR: CON: -; Bit positions 7 6 5 4 3 2 1 0 +; Device LST: PUN: RDR: CON: +; Bit positions 7 6 5 4 3 2 1 0 ; -; Dec Binary +; Dec Binary ; -; 0 00 TTY: TTY: TTY: TTY: -; 1 01 CRT: PTP: PTR: CRT: -; 2 10 LPT: UP1: UR1: BAT: -; 3 11 UL1: UP2: UR2: UC1: +; 0 00 TTY: TTY: TTY: TTY: +; 1 01 CRT: PTP: PTR: CRT: +; 2 10 LPT: UP1: UR1: BAT: +; 3 11 UL1: UP2: UR2: UC1: ; ; TTY: Teletype device (slow speed console) ; CRT: Cathode ray tube device (high speed console) @@ -235,7 +235,7 @@ DEVMAP: ;================================================================================================== ; ; Disk mapping is done using a drive map table (DRVMAP) which is built -; dynamically at cold boot. See the DRV_INIT routine. This table is +; dynamically at cold boot. See the DRV_INIT routine. This table is ; made up of entries as documented below. The table is prefixed with one ; byte indicating the number of entries. The position of the entry indicates ; the drive letter, so the first entry is A:, the second entry is B:, etc. @@ -245,24 +245,24 @@ DEVMAP: ; DPH: DPH ADDRESS OF DRIVE (WORD) ; ; DRVMAP --+ -; | DRIVE A | DRIVE B | | DRIVE N | -; +-----V------+-------+-----+--------------------+ +--------------------+ -; | N | UNIT | SLICE | DPH | UNIT | SLICE | DPH | ... | UNIT | SLICE | DPH | -; +----8+-----8+------8+-+-16+-----8+------8+-+-16+ +-----8+------8+-+-16+ -; | | | -; +--------------------+ +-> [DPH] +-> [DPH] +; | DRIVE A | DRIVE B | | DRIVE N | +; +-----V------+-------+-----+--------------------+ +--------------------+ +; | N | UNIT | SLICE | DPH | UNIT | SLICE | DPH | ... | UNIT | SLICE | DPH | +; +----8+-----8+------8+-+-16+-----8+------8+-+-16+ +-----8+------8+-+-16+ +; | | | +; +--------------------+ +-> [DPH] +-> [DPH] ; | -; V-----+-------+-------+-------+--------+-----+-----+-----+ -; DPH: | XLT | 0000H | 0000H | 0000H | DIRBUF | DPB | CSV | ALV | -; +---16+-----16+-----16+-----16+------16+-+-16+-+-16+-+-16+ -; (ONE DPH PER DRIVE) | | | -; | | +----------+ -; | | | -; +----------------------+ V-------------+ V-------------+ -; | | CSV BUF | | ALV BUF | -; | +-------------+ +-------------+ -; | (CSZ BYTES) (ASZ BYTES) -; | +; V-----+-------+-------+-------+--------+-----+-----+-----+--------+ +; DPH: | XLT | 0000H | 0000H | 0000H | DIRBUF | DPB | CSV | ALV | LBAOFF | +; +---16+-----16+-----16+-----16+------16+-+-16+-+-16+-+-16+------32+ +; (ONE DPH PER DRIVE) | | | +; | | +----------+ +; | | | +; +----------------------+ V-------------+ V-------------+ +; | | CSV BUF | | ALV BUF | +; | +-------------+ +-------------+ +; | (CSZ BYTES) (ASZ BYTES) +; | ; +-----+-----+-----V-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ ; DPB: | CSZ | ASZ | BLS | SPT | BSH | BLM | EXM | DSM | DRM | AL0 | AL1 | CKS | OFF | ; +---16+---16+----8+---16+----8+----8+----8+---16+---16+----8+----8+---16+---16+ @@ -289,6 +289,7 @@ DPBMAP: .DW DPB_FD360 ; MID_FD360 .DW DPB_FD120 ; MID_FD120 .DW DPB_FD111 ; MID_FD111 + .DW DPB_HDNEW ; MID_HDNEW (1024 DIR ENTRIES) ; DPBCNT .EQU ($ - DPBMAP) / 2 ; @@ -470,8 +471,6 @@ GOMON: ;================================================================================================== ; ;__________________________________________________________________________________________________ -; -;__________________________________________________________________________________________________ CONST: ; CONSOLE STATUS, RETURN $FF IF CHARACTER READY, $00 IF NOT ; @@ -1172,6 +1171,11 @@ DSK_GETINF: RLCA ; ... TO USE AS OFFSET INTO DRVMAP CALL ADDHLA ; ADD OFFSET LD D,(HL) ; D := UNIT + + LD A,D ; PUT UNIT IN ACCUM + INC A ; $FF -> $00 + JR Z,DSK_GETINF1 ; HANDLE UNASSIGNED DRIVE LETTER + INC HL ; BUMP TO SLICE LD E,(HL) ; E := SLICE INC HL ; POINT TO DPH LSB @@ -1179,9 +1183,11 @@ DSK_GETINF: INC HL ; POINT TO DPH MSB LD H,(HL) ; H := DPH MSB LD L,A ; L := DPH LSB - LD A,H ; TEST FOR INVALID DPH - OR L ; ... BY CHECKING FOR ZERO VALUE - JR Z,DSK_GETINF1 ; HANDLE ZERO DPH, DRIVE IS INVALID + + ;LD A,H ; TEST FOR INVALID DPH + ;OR L ; ... BY CHECKING FOR ZERO VALUE + ;JR Z,DSK_GETINF1 ; HANDLE ZERO DPH, DRIVE IS INVALID + XOR A ; SET SUCCESS RET ; @@ -1199,6 +1205,7 @@ DSK_GETINF1: ; ERROR RETURN DSK_SELECT: LD B,E ; SAVE E IN B FOR NOW CALL DSK_GETINF ; GET D=UNIT, E=SLICE, HL=DPH ADDRESS + ;CALL NZ,PANIC ; *DEBUG* RET NZ ; RETURN IF INVALID DRIVE (A=1, NZ SET, HL=0) PUSH BC ; WE NEED B LATER, SAVE ON STACK ; @@ -1209,23 +1216,50 @@ DSK_SELECT: LD (SEKUNIT),A ; SAVE UNIT LD (SEKDPH),HL ; SAVE DPH ADDRESS ; - ; UPDATE OFFSET FOR ACTIVE SLICE - ; A TRACK IS ASSUMED TO BE 16 SECTORS - ; THE OFFSET REPRESENTS THE NUMBER OF BLOCKS * 256 - ; TO USE AS THE OFFSET - LD H,65 ; H = TRACKS PER SLICE, E = SLICE NO - CALL MULT8 ; HL := H * E (TOTAL TRACK OFFSET) - LD (SEKOFF),HL ; SAVE NEW TRACK OFFSET + LD A,E ; A := SLICE + LD (SLICE),A ; SAVE IT + ; UPDATE LBAOFF FROM DPH + LD HL,(SEKDPH) + LD A,16 + CALL ADDHLA + LD DE,SEKLBA + LD BC,4 + LDIR ; ; RESTORE DE TO BC (FOR ACCESS TO DRIVE LOGIN BIT) POP BC ; GET ORIGINAL E INTO B -; -#IFDEF PLTWBW ; ; CHECK IF THIS IS LOGIN, IF NOT, BYPASS MEDIA DETECTION ; FIX: WHAT IF PREVIOUS MEDIA DETECTION FAILED??? BIT 0,B ; TEST DRIVE LOGIN BIT JR NZ,DSK_SELECT2 ; BYPASS MEDIA DETECTION +; +#IFDEF PLTUNA +; + LD A,(SEKUNIT) ; GET DISK UNIT + LD B,A ; UNIT NUM TO B + LD C,$48 ; UNA FUNC: GET DISK TYPE + CALL $FFFD ; CALL UNA + LD A,D ; MOVE DISK TYPE TO A + CP $40 ; RAM/ROM DRIVE? + JR Z,DSK_SELECT1 ; HANDLE RAM/ROM DRIVE + LD A,MID_HD ; OTHERWISE WE HAVE A HARD DISK + JR DSK_SELECT1A ; DONE +; +DSK_SELECT1: + ; UNA RAM/ROM DRIVE + LD C,$45 ; UNA FUNC: GET DISK INFO + LD DE,(DSKBUF) ; 512 BYTE BUFFER + CALL $FFFD ; CALL UNA + BIT 7,B ; TEST RAM DRIVE BIT + LD A,MID_MDROM ; ASSUME ROM + JR Z,DSK_SELECT1A ; IS ROM, DONE + LD A,MID_MDRAM ; MUST BE RAM +; +DSK_SELECT1A: + LD (MEDID),A +; +#ELSE ; ; DETERMINE MEDIA IN DRIVE LD A,(SEKUNIT) ; GET UNIT @@ -1234,11 +1268,48 @@ DSK_SELECT: LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY RST 08 ; DO IT LD A,E ; RESULTANT MEDIA ID TO ACCUM + LD (MEDID),A ; SAVE IT OR A ; SET FLAGS LD HL,0 ; ASSUME FAILURE RET Z ; BAIL OUT IF NO MEDIA ; - ; A HAS MEDIA ID, SET HL TO CORRESPONDING DPBMAP ENTRY +#ENDIF +; + ; CLEAR LBA OFFSET (DWORD) + ; SET HI BIT FOR LBA ACCESS FOR NOW + LD HL,0 ; ZERO + LD (SEKLBA),HL ; CLEAR FIRST WORD + SET 7,H ; ASSUME LBA ACCESS FOR NOW + LD (SEKLBA+2),HL ; CLEAR SECOND WORD +; +#IFDEF PLTWBW +; + LD A,(SEKUNIT) ; GET UNIT + LD C,A ; STORE IN C + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO + RST 08 ; GET UNIT INFO, DEVICE TYPE IN D + LD A,D ; DEVICE TYPE -> A + AND $F0 ; ISOLATE HIGH BITS + CP DIODEV_FD ; FLOPPY? + JR NZ,DSK_SELECT1B ; IF NOT, DO LBA IO + LD HL,SEKLBA+3 ; POINT TO HIGH ORDER BYTE + RES 7,(HL) ; SWITCH FROM LBA -> CHS +; +#ENDIF +; +DSK_SELECT1B: + ; SET LEGACY SECTORS PER SLICE + LD HL,16640 ; LEGACY SECTORS PER SLICE + LD (SPS),HL ; SAVE IT +; + ; CHECK MBR OF PHYSICAL DISK BEING SELECTED + ; WILL UPDATE MEDID AND LBAOFF IF VALID CP/M PARTITION EXISTS + CALL DSK_MBR ; UPDATE MEDIA FROM MBR + LD HL,0 ; ASSUME FAILURE + RET NZ ; ABORT ON I/O ERROR +; + ; SET HL TO DPBMAP ENTRY CORRESPONDING TO MEDIA ID + LD A,(MEDID) ; GET MEDIA ID LD HL,DPBMAP ; HL = DPBMAP RLCA ; DPBMAP ENTRIES ARE 2 BYTES EACH CALL ADDHLA ; ADD OFFSET TO HL @@ -1249,19 +1320,171 @@ DSK_SELECT: LD D,(HL) ; DE = ADDRESS OF DESIRED DPB ; ; PLUG DPB INTO THE ACTIVE DPH - LD HL,(SEKDPH) + LD HL,(SEKDPH) ; POINT TO START OF DPH LD BC,10 ; OFFSET OF DPB IN DPH ADD HL,BC ; HL := DPH.DPB LD (HL),E ; SET LSB OF DPB IN DPH INC HL ; BUMP TO MSB LD (HL),D ; SET MSB OF DPB IN DPH -#ENDIF +; + ; PLUG LBA OFFSET INTO ACTIVE DPH + LD HL,(SEKDPH) ; POINT TO START OF DPH + LD BC,16 ; OFFSET OF LBA OFFSET IN DPH + ADD HL,BC ; HL := DPH.LBAOFF PTR + EX DE,HL ; DEST IS DPH.LBAOFF PTR + LD HL,SEKLBA ; SOURCE IS LBAOFF + LD BC,4 ; 4 BYTES + LDIR ; DO IT ; DSK_SELECT2: LD HL,(SEKDPH) ; HL = DPH ADDRESS FOR CP/M XOR A ; FLAG SUCCESS RET ; NORMAL RETURN ; +; CHECK MBR OF DISK TO SEE IF IT HAS A PARTITION TABLE. +; IF SO, LOOK FOR A CP/M PARTITION. IF FOUND, GET +; UPDATE THE PARTITION OFFSET (LBAOFF) AND UPDATE +; THE MEDIA ID (MEDID). +; +DSK_MBR: + ; CHECK MEDIA TYPE, ONLY HARD DISK IS APPLICABLE + LD A,(MEDID) ; GET MEDIA ID + CP MID_HD ; HARD DISK? + JR Z,DSK_MBR0 ; IF SO, CONTINUE + XOR A ; ELSE, N/A, SIGNAL SUCCESS + RET ; AND RETURN + +DSK_MBR0: +; +#IFDEF PLTWBW + ; SWITCH TO BIOS BANK TO ACCESS DISK BUFFER + LD A,(HB_CURBNK) ; GET CUR BANK + PUSH AF ; SAVE CUR BANK + LD A,(BNKBIOS) ; BIOS BANK + CALL HB_BNKSEL ; DO IT + CALL DSK_MBR1 ; DO THE WORK + ; RESTORE BANK + PUSH AF ; SAVE RESULT + POP HL ; TO HL + EX (SP),HL ; RESULT TO TOS, PREV BANK TO H + LD A,H ; PREV BANK TO A + CALL HB_BNKSEL ; SELECT IT + POP AF ; ORIGINAL RESULT BACK + RET +#ENDIF +; +DSK_MBR1: + ; FLUSH DSKBUF TO MAKE SURE IT IS SAFE TO USE IT. + CALL BLKFLSH ; MAKE SURE DISK BUFFER IS NOT DIRTY + XOR A ; CLEAR ACCUM + LD (HSTACT),A ; CLEAR HOST BUFFER ACTIVE FLAG +; + ; READ SECTOR ZERO (MBR) + LD B,BF_DIOREAD ; READ FUNCTION + LD A,(SEKUNIT) ; GET UNIT + LD C,A ; PUT IN C + LD DE,0 ; LBA SECTOR ZERO + LD HL,0 ; ... +#IFDEF PLTWBW + SET 7,D ; MAKE SURE LBA ACCESS BIT SET +#ENDIF + CALL DSK_IO2 ; DO IT + RET NZ ; ABORT ON ERROR +; + ; CHECK SIGNATURE + LD HL,(DSKBUF) ; DSKBUF ADR + LD DE,$1FE ; OFFSET TO SIGNATURE + ADD HL,DE ; POINT TO SIGNATURE + LD A,(HL) ; GET FIRST BYTE + CP $55 ; CHECK FIRST BYTE + JR NZ,DSK_MBR5 ; NO MATCH, NO PART TABLE + INC HL ; NEXT BYTE + LD A,(HL) ; GET SECOND BYTE + CP $AA ; CHECK SECOND BYTE + JR NZ,DSK_MBR5 ; NO MATCH, NO PART TABLE, ABORT +; + ; TRY TO FIND OUR ENTRY IN PART TABLE AND CAPTURE LBA OFFSET + LD B,4 ; FOUR ENTRIES IN PART TABLE + LD HL,(DSKBUF) ; DSKBUF ADR + LD DE,$1BE+4 ; OFFSET OF FIRST ENTRY PART TYPE + ADD HL,DE ; POINT TO IT +DSK_MBR2: + LD A,(HL) ; GET PART TYPE + CP $2E ; CP/M PARTITION? + JR Z,DSK_MBR3 ; COOL, GRAB THE LBA OFFSET + LD DE,16 ; PART TABLE ENTRY SIZE + ADD HL,DE ; BUMP TO NEXT ENTRY PART TYPE + DJNZ DSK_MBR2 ; LOOP THRU TABLE + JR DSK_MBR5 ; TOO BAD, NO CP/M PARTITION +; +DSK_MBR3: + ; WE HAVE LOCATED A VALID CP/M PARTITION + ; HL POINTS TO PART TYPE FIELD OF PART ENTRY +; + ; CAPTURE THE LBA OFFSET + LD DE,4 ; LBA IS 4 BYTES AFTER PART TYPE + ADD HL,DE ; POINT TO IT + LD DE,SEKLBA ; LOC TO STORE LBA OFFSET + LD BC,4 ; 4 BYTES (32 BITS) + LDIR ; COPY IT +; + ; CHECK THAT REQUESTED SLICE IS "INSIDE" PARTITION + ; SLICE SIZE IS EXACTLY 16,384 SECTORS (8MB), SO WE CAN JUST + ; RIGHT SHIFT PARTITION SECTOR COUNT BY 14 BITS + LD E,(HL) ; HL POINTS TO FIRST BYTE + INC HL ; ... OF 32 BIT PARTITION + LD D,(HL) ; ... SECTOR COUNT, + INC HL ; ... LOAD SECTOR COUNT + PUSH DE ; ... INTO DE:HL + LD E,(HL) ; ... + INC HL ; ... + LD D,(HL) ; ... + POP HL ; ... DE:HL = PART SIZE IN SECTORS + LD B,2 ; DE = DE:HL >> 2 (TRICKY!) + CALL RL32 ; DE = SLICECNT + EX DE,HL ; HL = SLICECNT + LD A,(SLICE) ; GET TARGET SLICE + LD C,A ; PUT IN C + LD B,0 ; BC := REQUESTED SLICE # + SCF ; SET CARRY! + SBC HL,BC ; MAX SLICES - SLICE - 1 + JR NC,DSK_MBR4 ; NO OVERFLOW, OK TO CONTINUE + OR $FF ; SLICE TOO HIGH, SIGNAL ERROR + RET ; AND BAIL OUT +; +DSK_MBR4: + ; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE + LD HL,16384 ; NEW SECTORS PER SLICE + LD (SPS),HL ; SAVE IT + + ; UPDATE MEDIA ID + LD A,MID_HDNEW ; NEW MEDIA ID + LD (MEDID),A ; SAVE IT +; +DSK_MBR5: + ; ADJUST LBA OFFSET BASED ON TARGET SLICE + LD A,(SLICE) ; GET SLICE, A IS LOOP CNT + LD HL,(SEKLBA) ; SET DE:HL + LD DE,(SEKLBA+2) ; ... TO STARTING LBA + LD BC,(SPS) ; SECTORS PER SLICE +DSK_MBR6: + OR A ; SET FLAGS TO CHECK LOOP CNTR + JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED + ADD HL,BC ; ADD ONE SLICE TO LOW WORD + JR NC,DSK_MBR7 ; CHECK FOR CARRY + INC DE ; IF SO, BUMP HIGH WORD +DSK_MBR7: + DEC A ; DEC LOOP DOWNCOUNTER + JR DSK_MBR6 ; AND LOOP +DSK_MBR8: + SET 7,D ; SET LBA ACCESS FLAG + ; RESAVE IT + LD (SEKLBA),HL ; LOWORD + LD (SEKLBA+2),DE ; HIWORD + ; SUCCESSFUL FINISH + XOR A ; SUCCESS + RET ; DONE +; ; ; DSK_STATUS: @@ -1296,67 +1519,14 @@ DSK_WRITE: ; ; ; -#IFDEF PLTUNA - -DSK_IO: - PUSH BC - LD DE,(HSTTRK) ; GET TRACK INTO HL - LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS -DSK_IO1: - SLA E ; SHIFT DE LEFT BY 4 BITS - RL D - DJNZ DSK_IO1 ; LOOP TILL ALL BITS DONE - LD A,(HSTSEC) ; GET THE SECTOR INTO A - AND $0F ; GET RID OF TOP NIBBLE - OR E ; COMBINE WITH E - LD E,A ; BACK IN E - LD HL,0 ; HL:DE NOW HAS SLICE RELATIVE LBA - ; APPLY OFFSET NOW - ; OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO OFFSET! - LD A,(HSTOFF) ; LSB OF SLICE OFFSET TO A - ADD A,D ; ADD WITH D - LD D,A ; PUT IT BACK IN D - LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A - CALL ADCHLA ; ADD OFFSET - POP BC ; RECOVER FUNCTION IN B - LD A,(HSTUNIT) ; GET THE UNIT VALUE - LD C,A ; PUT IT IN C - ; DISPATCH TO DRIVER - PUSH BC - EX DE,HL ; DE:HL NOW HAS LBA - LD B,C ; UNIT TO B - LD C,$41 ; UNA SET LBA - RST 08 ; CALL UNA - CALL NZ,PANIC - POP BC ; RECOVER B=FUNC, C=UNIT - LD E,C ; UNIT TO E - LD C,B ; FUNC TO C - LD B,E ; UNIT TO B - LD DE,(DSKBUF) ; SET BUFFER ADDRESS - LD HL,1 ; 1 SECTOR - ; DISPATCH TO UBIOS - RST 08 - OR A ; SET FLAGS BASED ON RESULT - RET - -#ELSE - DSK_IO: -; -; TRANSLATE CP/M TRACK/SECTOR -> HBIOS TRACK/HEAD/SECTOR -; NEEDS TO HANDLE FLOPPY SEPARATE FROM HARD DISK -; -CHS: LD A,(HSTUNIT) ; GET UNIT LD C,A ; UNIT -> C - PUSH BC ; SAVE FUNC/UNIT - LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO - RST 08 ; GET UNIT INFO, DEVICE TYPE IN D - POP BC ; GET FUNC/UNIT BACK TO BC - LD A,D ; DEVICE TYPE -> A - AND $F0 ; ISOLATE HIGH BITS - CP DIODEV_FD ; FLOPPY? - JR NZ,CHSHD ; IF NOT, DO HD CHS XLAT +; +#IFDEF PLTWBW + LD A,(HSTLBA+3) ; GET HIGH ORDER BYTE + BIT 7,A ; LBA ACCESS? + JR NZ,LBA_IO ; IF SET, GO TO LBA I/O ; ; FLOPPY SPECIFIC TRANSLATION ASSUMES FLOPPY IS DOUBLE-SIDED AND ; USES LOW ORDER BIT OF TRACK AS HEAD VALUE @@ -1368,53 +1538,73 @@ CHS: SRL H ; SHIFT HEAD BIT OUT OF HL RR L ; ... AND INTO CARRY RL D ; CARRY BIT (HEAD) INTO D - JR CHS2 + JR DSK_IO2 ; DO THE DISK I/O ; -; HARD DISK SPECIFIC TRANSLATION -; ASSUMES 16 HEADS PER CYLINDER AND 16 SECTORS PER TRACK +#ENDIF ; -CHSHD: - LD HL,(HSTTRK) ; GET TRACK VALUE - LD A,L ; LSB OF TRACK TO A - AND $0F ; ISOLATE HEAD IN LOW 4 BITS - LD D,A ; STUFF IT IN D +LBA_IO: + PUSH BC ; SAVE FUNC/UNIT + ; GET TRACK AND SHIFT TO MAKE ROOM FOR 4 BIT SECTOR VALUE + LD HL,(HSTTRK) ; GET TRACK + LD DE,0 ; CLEAR HIWORD + LD B,4 ; X16 (16 SPT ASSUMED) + CALL RL32 ; DO IT + ; COMBINE WITH SECTOR LD A,(HSTSEC) ; GET SECTOR - LD E,A ; STUFF IT IN E - LD A,B ; SAVE B (HBIOS FUNC) - LD B,4 ; PREPARE TO SHIFT OUT 4 BIT HEAD VALUE -CHSHD1: - SRL H ; SHIFT ONE BIT OUT - RR L ; ... OF HL - DJNZ CHSHD1 ; DO ALL 4 BITS - LD B,A ; RESTORE B (HBIOS FUNC) - ; FALL THRU TO CHS2 -; -; ALL TYPES OF TRANSLATION WIND UP HERE TO -; MAKE THE ACTUAL HBIOS CALL -; -CHS2: - PUSH DE ; SAVE HEAD/SECTOR + COULD MOVE - LD DE,(HSTOFF) ; NOW GET SLICE OFFSET | TO CHSHD, - ADD HL,DE ; ADD IT TO TRACK VALUE | NO SLICES - POP DE ; RECOVER HEAD/SECTOR + FOR FLOPPY + OR L + LD L,A + ; ADD IN LBA OFFSET FOR PARTITION AND/OR SLICE + LD BC,(HSTLBA) ; LBA OFFSET LOWORD + ADD HL,BC + EX DE,HL + LD BC,(HSTLBA+2) ; LBA OFFSET HIWORD + ADC HL,BC + EX DE,HL + POP BC ; RESTORE FUNC/UNIT + ;JR DSK_IO2 ; DO THE DISK I/O (FALL THRU) +; +#IFDEF PLTUNA +; +; MAKE UNA UBIOS CALL +; HBIOS FUNC SHOULD STILL BE IN B +; UNIT SHOULD STILL BE IN C +; +DSK_IO2: + PUSH BC ; SAVE INCOMING FUNCTION, UNIT + LD B,C ; UNIT TO B + LD C,$41 ; UNA SET LBA + RST 08 ; CALL UNA + POP BC ; RECOVER B=FUNC, C=UNIT + RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A + LD E,C ; UNIT TO E + LD C,B ; FUNC TO C + LD B,E ; UNIT TO B + LD DE,(DSKBUF) ; SET BUFFER ADDRESS + LD HL,1 ; 1 SECTOR + ; DISPATCH TO UBIOS + RST 08 ; CALL UNA + RET ; DONE +; +#ELSE ; ; MAKE HBIOS CALL ; HBIOS FUNC SHOULD STILL BE IN B ; UNIT SHOULD STILL BE IN C ; - PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT - LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL +DSK_IO2: + PUSH BC ; SAVE INCOMING FUNCTION, UNIT + LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL RST 08 ; DO IT - POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT - RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A - LD HL,(DSKBUF) ; GET BUFFER ADDRESS + POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT + RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A + LD HL,(DSKBUF) ; GET BUFFER ADDRESS LD A,(BNKBIOS) ; GET BIOS BANK LD D,A ; TRANSFER TO/FROM BIOS BANK - LD E,1 ; TRANSFER ONE SECTOR + LD E,1 ; TRANSFER ONE SECTOR RST 08 ; DO IT OR A ; SET FLAGS RET ; DONE - +; #ENDIF ; ;================================================================================================== @@ -1501,12 +1691,15 @@ STR_SEC .DB " SEC=$" ; DATA ;================================================================================================== ; -;STR_READONLY .DB "\r\nCBIOS Err: Read Only Drive$" -;STR_STALE .DB "\r\nCBIOS Err: Stale Drive$" +;STR_READONLY .DB "\r\nCBIOS Err: Read Only Drive$" +;STR_STALE .DB "\r\nCBIOS Err: Stale Drive$" ; -SECADR .DW 0 ; ADDRESS OF SECTOR IN ROM/RAM PAGE +;SECADR .DW 0 ; ADDRESS OF SECTOR IN ROM/RAM PAGE DEFDRIVE .DB 0 ; DEFAULT DRIVE CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK +MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID +SLICE .DB 0 ; CURRENT SLICE +SPS .DW 0 ; SECTORS PER SLICE ; #IFDEF PLTWBW BNKBIOS .DB 0 ; BIOS BANK ID @@ -1521,21 +1714,22 @@ BNKUSER .DW 0 ; USER BANK ID ; DOS DISK VARIABLES ; DSKOP .DB 0 ; DISK OPERATION (DOP_READ/DOP_WRITE) -WRTYPE .DB 0 ; WRITE TYPE (0=NORMAL, 1=DIR (FORCE), 2=FIRST RECORD OF BLOCK) -DMAADR .DW 0 ; DIRECT MEMORY ADDRESS +WRTYPE .DB 0 ; WRITE TYPE (0=NORMAL, 1=DIR (FORCE), 2=FIRST RECORD OF BLOCK) +DMAADR .DW 0 ; DIRECT MEMORY ADDRESS HSTWRT .DB 0 ; TRUE = BUFFER IS DIRTY DSKBUF .DW 0 ; ADDRESS OF PHYSICAL SECTOR BUFFER ; ; LOGICAL DISK I/O REQUEST PENDING ; SEK: -SEKDSK .DB 0 ; DISK NUMBER 0-15 -SEKTRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL) -SEKSEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL) -SEKUNIT .DB 0 ; DISK UNIT +SEKDSK .DB 0 ; DISK NUMBER 0-15 +SEKTRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL) +SEKSEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL) +SEKUNIT .DB 0 ; DISK UNIT SEKDPH .DW 0 ; ADDRESS OF ACTIVE (SELECTED) DPH SEKOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR SLICE SEKACT .DB TRUE ; ALWAYS TRUE! +SEKLBA .FILL 4,0 ; LBA OFFSET ; ; RESULT OF CPM TO PHYSICAL TRANSLATION ; @@ -1547,6 +1741,7 @@ XLTUNIT .DB 0 XLTDPH .DW 0 XLTOFF .DW 0 XLTACT .DB TRUE ; ALWAYS TRUE! +XLTLBA .FILL 4,0 ; LBA OFFSET ; XLTSIZ .EQU $ - XLT ; @@ -1560,13 +1755,14 @@ HSTUNIT .DB 0 ; DISK UNIT IN BUFFER HSTDPH .DW 0 ; CURRENT DPH ADDRESS HSTOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR SLICE HSTACT .DB 0 ; TRUE = BUFFER HAS VALID DATA +HSTLBA .FILL 4,0 ; LBA OFFSET ; ; SEQUENTIAL WRITE TRACKING FOR (UNA)LLOCATED BLOCK ; UNA: -UNADSK .DB 0 ; DISK NUMBER 0-15 -UNATRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL) -UNASEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL) +UNADSK .DB 0 ; DISK NUMBER 0-15 +UNATRK .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL) +UNASEC .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL) ; UNASIZ .EQU $ - UNA ; @@ -1595,13 +1791,13 @@ ALS_HD .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP) ; BLS BSH BLM EXM (DSM<256) EXM (DSM>255) ; ---------- --- --- ------------- ------------- ; 1,024 3 7 0 N/A -; 2,048 4 15 1 0 -; 4,096 5 31 3 1 -; 8,192 6 63 7 3 -; 16,384 7 127 15 7 +; 2,048 4 15 1 0 +; 4,096 5 31 3 1 +; 8,192 6 63 7 3 +; 16,384 7 127 15 7 ; -; AL0/1: EACH BIT SET ALLOCATES A BLOCK OF DIR ENTRIES. EACH DIR ENTRY -; IS 32 BYTES. BIT COUNT = (((DRM + 1) * 32) / BLS) +; AL0/1: EACH BIT SET ALLOCATES A BLOCK OF DIR ENTRIES. EACH DIR ENTRY +; IS 32 BYTES. BIT COUNT = (((DRM + 1) * 32) / BLS) ; ; CKS = (DIR ENT / 4), ZERO FOR NON-REMOVABLE MEDIA ; @@ -1623,21 +1819,21 @@ ALS_HD .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP) .DW ALS_ROM ; ALS: BLKS / 8 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_ROM: - .DW 64 ; SPT: SECTORS PER TRACK - .DB 4 ; BSH: BLOCK SHIFT FACTOR - .DB 15 ; BLM: BLOCK MASK + .DW 64 ; SPT: SECTORS PER TRACK + .DB 4 ; BSH: BLOCK SHIFT FACTOR + .DB 15 ; BLM: BLOCK MASK .DB 1 ; EXM: (BLKS <= 256) ? 1 : 0 .DW 192 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1 - .DW 255 ; DRM: DIR ENTRIES - 1 = 255 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA - .DW 0 ; OFF: ROM DISK HAS NO SYSTEM AREA + .DW 255 ; DRM: DIR ENTRIES - 1 = 255 + .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA + .DW 0 ; OFF: ROM DISK HAS NO SYSTEM AREA ;__________________________________________________________________________________________________ ; ; RAM DISK: 64 SECS/TRK, 128 BYTES/SEC ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256 -; RAM DISK SIZE = TOTAL RAM - 128K RESERVED FOR SYSTEM USE +; RAM DISK SIZE = TOTAL RAM - 256K RESERVED FOR SYSTEM USE ; ; ALS_RAM, EXM, DSM MUST BE FILLED DYNAMICALLY: ; - ALS_RAM := (BANKS * 2) @@ -1650,16 +1846,16 @@ DPB_ROM: .DW ALS_RAM ; ALS: BLKS / 8 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_RAM: - .DW 64 ; SPT: SECTORS PER TRACK - .DB 4 ; BSH: BLOCK SHIFT FACTOR - .DB 15 ; BLM: BLOCK MASK + .DW 64 ; SPT: SECTORS PER TRACK + .DB 4 ; BSH: BLOCK SHIFT FACTOR + .DB 15 ; BLM: BLOCK MASK .DB 1 ; EXM: (BLKS <= 256) ? 1 : 0 - .DW 192 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1 - .DW 255 ; DRM: DIR ENTRIES - 1 = 255 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA - .DW 0 ; OFF: RESERVED TRACKS = 0 TRK + .DW 128 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1 + .DW 255 ; DRM: DIR ENTRIES - 1 = 255 + .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA + .DW 0 ; OFF: RESERVED TRACKS = 0 TRK ;__________________________________________________________________________________________________ ; ; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC @@ -1669,16 +1865,16 @@ DPB_RAM: .DW ALS_HD .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_RF: - .DW 64 ; SPT: SECTORS PER TRACK - .DB 4 ; BSH: BLOCK SHIFT FACTOR - .DB 15 ; BLM: BLOCK MASK - .DB 0 ; EXM: EXTENT MASK - .DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = (4MB / 2K BLS) - 1 = 2047 - .DW 511 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 - .DB 11111111B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA - .DW 0 ; OFF: RESERVED TRACKS = 0 TRK + .DW 64 ; SPT: SECTORS PER TRACK + .DB 4 ; BSH: BLOCK SHIFT FACTOR + .DB 15 ; BLM: BLOCK MASK + .DB 0 ; EXM: EXTENT MASK + .DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = (4MB / 2K BLS) - 1 = 2047 + .DW 511 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 + .DB 11111111B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA + .DW 0 ; OFF: RESERVED TRACKS = 0 TRK ;__________________________________________________________________________________________________ ; ; GENERIC HARD DISK DRIVE (8MB DATA SPACE + 128K RESERVED SPACE) @@ -1690,16 +1886,33 @@ DPB_RF: .DW ALS_HD .DB (4096 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_HD: - .DW 64 ; SPT: SECTORS PER TRACK - .DB 5 ; BSH: BLOCK SHIFT FACTOR - .DB 31 ; BLM: BLOCK MASK - .DB 1 ; EXM: EXTENT MASK - .DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 = (8MB / 4K BLS) - 1 = 2047 - .DW 511 ; DRM: DIR ENTRIES - 1 = 512 - 1 = 511 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 - .DW 16 ; OFF: RESERVED TRACKS = 16 TRKS * (16 TRKS * 16 HEADS * 16 SECS * 512 BYTES) = 128K + .DW 64 ; SPT: SECTORS PER TRACK + .DB 5 ; BSH: BLOCK SHIFT FACTOR + .DB 31 ; BLM: BLOCK MASK + .DB 1 ; EXM: EXTENT MASK + .DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 = (8MB / 4K BLS) - 1 = 2047 + .DW 512 - 1 ; DRM: DIR ENTRIES - 1 + .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 + .DW 16 ; OFF: RESERVED TRACKS +; +; BLOCKSIZE (BLS) = 4K, DIRECTORY ENTRIES = 1024 +; + .DW CKS_HD + .DW ALS_HD + .DB (4096 / 128) ; RECORDS PER BLOCK (BLS / 128) +DPB_HDNEW: + .DW 64 ; SPT: SECTORS PER TRACK + .DB 5 ; BSH: BLOCK SHIFT FACTOR + .DB 31 ; BLM: BLOCK MASK + .DB 1 ; EXM: EXTENT MASK + .DW 2048 - 1 - 4 ; DSM: STORAGE BLOCKS - 1 - RES TRKS + .DW 1024 - 1 ; DRM: DIR ENTRIES - 1 + .DB 11111111B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 + .DW 2 ; OFF: RESERVED TRACKS ;__________________________________________________________________________________________________ ; ; IBM 720KB 3.5" FLOPPY DRIVE, 80 TRKS, 36 SECS/TRK, 512 BYTES/SEC @@ -1709,16 +1922,16 @@ DPB_HD: .DW ALS_FD .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_FD720: - .DW 36 ; SPT: SECTORS PER TRACK - .DB 4 ; BSH: BLOCK SHIFT FACTOR - .DB 15 ; BLM: BLOCK MASK - .DB 0 ; EXM: EXTENT MASK - .DW 350 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((720K - 18K OFF) / 2K BLS) - 1 = 350 - .DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127 - .DB 11000000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4 - .DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K + .DW 36 ; SPT: SECTORS PER TRACK + .DB 4 ; BSH: BLOCK SHIFT FACTOR + .DB 15 ; BLM: BLOCK MASK + .DB 0 ; EXM: EXTENT MASK + .DW 350 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((720K - 18K OFF) / 2K BLS) - 1 = 350 + .DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127 + .DB 11000000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4 + .DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K ;__________________________________________________________________________________________________ ; ; IBM 1.44MB 3.5" FLOPPY DRIVE, 80 TRKS, 72 SECS/TRK, 512 BYTES/SEC @@ -1728,16 +1941,16 @@ DPB_FD720: .DW ALS_FD .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_FD144: - .DW 72 ; SPT: SECTORS PER TRACK - .DB 4 ; BSH: BLOCK SHIFT FACTOR - .DB 15 ; BLM: BLOCK MASK - .DB 0 ; EXM: EXTENT MASK - .DW 710 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,440K - 18K OFF) / 2K BLS) - 1 = 710 - .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 - .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 72 SEC/TRK) = 18K + .DW 72 ; SPT: SECTORS PER TRACK + .DB 4 ; BSH: BLOCK SHIFT FACTOR + .DB 15 ; BLM: BLOCK MASK + .DB 0 ; EXM: EXTENT MASK + .DW 710 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,440K - 18K OFF) / 2K BLS) - 1 = 710 + .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 + .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 + .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 72 SEC/TRK) = 18K ;__________________________________________________________________________________________________ ; ; IBM 360KB 5.25" FLOPPY DRIVE, 40 TRKS, 9 SECS/TRK, 512 BYTES/SEC @@ -1747,16 +1960,16 @@ DPB_FD144: .DW ALS_FD .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_FD360: - .DW 36 ; SPT: SECTORS PER TRACK - .DB 4 ; BSH: BLOCK SHIFT FACTOR - .DB 15 ; BLM: BLOCK MASK - .DB 1 ; EXM: EXTENT MASK - .DW 170 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((360K - 18K OFF) / 2K BLS) - 1 = 170 - .DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4 - .DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K + .DW 36 ; SPT: SECTORS PER TRACK + .DB 4 ; BSH: BLOCK SHIFT FACTOR + .DB 15 ; BLM: BLOCK MASK + .DB 1 ; EXM: EXTENT MASK + .DW 170 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((360K - 18K OFF) / 2K BLS) - 1 = 170 + .DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127 + .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4 + .DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K ;__________________________________________________________________________________________________ ; ; IBM 1.20MB 5.25" FLOPPY DRIVE, 80 TRKS, 15 SECS/TRK, 512 BYTES/SEC @@ -1766,16 +1979,16 @@ DPB_FD360: .DW ALS_FD .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_FD120: - .DW 60 ; SPT: SECTORS PER TRACK - .DB 4 ; BSH: BLOCK SHIFT FACTOR - .DB 15 ; BLM: BLOCK MASK - .DB 0 ; EXM: EXTENT MASK - .DW 591 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,200K - 15K OFF) / 2K BLS) - 1 = 591 - .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 - .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K + .DW 60 ; SPT: SECTORS PER TRACK + .DB 4 ; BSH: BLOCK SHIFT FACTOR + .DB 15 ; BLM: BLOCK MASK + .DB 0 ; EXM: EXTENT MASK + .DW 591 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,200K - 15K OFF) / 2K BLS) - 1 = 591 + .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 + .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 + .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K ;__________________________________________________________________________________________________ ; ; IBM 1.11MB 8" FLOPPY DRIVE, 77 TRKS, 15 SECS/TRK, 512 BYTES/SEC @@ -1785,16 +1998,16 @@ DPB_FD120: .DW ALS_FD .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) DPB_FD111: - .DW 60 ; SPT: SECTORS PER TRACK - .DB 4 ; BSH: BLOCK SHIFT FACTOR - .DB 15 ; BLM: BLOCK MASK - .DB 0 ; EXM: EXTENT MASK - .DW 569 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,155K - 15K OFF) / 2K BLS) - 1 = 569 - .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 - .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K + .DW 60 ; SPT: SECTORS PER TRACK + .DB 4 ; BSH: BLOCK SHIFT FACTOR + .DB 15 ; BLM: BLOCK MASK + .DB 0 ; EXM: EXTENT MASK + .DW 569 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,155K - 15K OFF) / 2K BLS) - 1 = 569 + .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 + .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE + .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 + .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K ; #IFDEF PLTUNA SECBUF .FILL 512,0 ; PHYSICAL DISK SECTOR BUFFER @@ -2086,7 +2299,7 @@ DEV_INIT0: ;POP BC ; RESTORE LOOP CONTROL ;LD A,C ; UNIT INDEX TO ACCUM ;;CALL C,JPHL ; DO IT IF DEVICE TYPE < VDU - + LD A,(HCB + HCB_CONDEV) ; CURRENT CONSOLE UNIT CP C ; IS CURRENT CONSOLE? LD A,C ; UNIT INDEX TO ACCUM @@ -2143,10 +2356,12 @@ MD_INIT: ; #IFDEF PLTWBW LD A,(HCB + HCB_ROMBANKS) ; ROM BANK COUNT + SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES LD IX,DPB_ROM ; ADDRESS OF DPB CALL MD_INIT1 ; FIX IT UP ; LD A,(HCB + HCB_RAMBANKS) ; RAM BANK COUNT + SUB 8 ; REDUCE BANK COUNT BY RESERVED PAGES LD IX,DPB_RAM ; ADDRESS OF DPB CALL MD_INIT1 ; FIX IT UP ; @@ -2155,7 +2370,6 @@ MD_INIT: MD_INIT1: ; ; PUT USABLE BANK COUNT IN HL - SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES LD L,A ; PUT IN LSB OF HL LD H,0 ; MSB IS ALWAYS ZERO ; @@ -2650,7 +2864,8 @@ DPH_INIT: LD H,0 ; ... INTO HL ADD HL,HL ; MULTIPLY ADD HL,HL ; ... BY SIZE - ADD HL,HL ; ... OF DPH (16) + CALL ADDHLA ; ... + ADD HL,HL ; ... OF DPH (20) ADD HL,HL ; ... FOR TOTAL SIZE CALL ALLOC ; ALLOCATE THE SPACE CALL C,PANIC ; SHOULD NEVER ERROR @@ -2707,7 +2922,8 @@ DPH_INIT2: LD (HL),D ; ... DRIVE MAP INC HL ; AND BUMP TO START OF NEXT ENTRY ; UPDATE DPH ALLOCATION TOP - LD A,16 ; SIZE OF A DPH ENTRY + ;LD A,16 ; SIZE OF A DPH ENTRY + LD A,20 ; SIZE OF A DPH ENTRY EX DE,HL ; HL := DPH POINTER CALL ADDHLA ; CALC NEW DPHTOP LD (DPHTOP),HL ; SAVE IT @@ -3011,7 +3227,7 @@ CMD .DB CMDLEN - 2 CMDLEN .EQU $ - CMD ; FCB_SUB .DB '?' ; DRIVE CODE, 0 = CURRENT DRIVE - .DB "SUBMIT " ; FILE NAME, 8 CHARS + .DB "SUBMIT " ; FILE NAME, 8 CHARS .DB "COM" ; FILE TYPE, 3 CHARS .FILL 36-($-FCB_SUB),0 ; ZERO FILL REMAINDER OF FCB ; @@ -3023,7 +3239,7 @@ FCB_PRO .DB '?' ; DRIVE CODE, 0 = CURRENT DRIVE STR_BANNER .DB "CBIOS v", BIOSVER, " [", PLTSTR, "]$" STR_INITRAMDISK .DB "Formatting RAMDISK...$" STR_LDR2 .DB "\r\n" -STR_LDR .DB "\r\n $" +STR_LDR .DB "\r\n $" STR_DPHINIT .DB "Configuring Drives...$" STR_HEAPOVF .DB " *** Insufficient Memory ***$" STR_INVMED .DB " *** Invalid Device ID ***$" diff --git a/Source/CBIOS/util.asm b/Source/CBIOS/util.asm index 023688ed..1d32990e 100644 --- a/Source/CBIOS/util.asm +++ b/Source/CBIOS/util.asm @@ -430,3 +430,15 @@ PRTHEXBUF1: INC DE DJNZ PRTHEXBUF1 RET +; +; LEFT SHIFT DE:HL BY B BITS (B > 0) +; +RL32: + OR A ; CLEAR CARRY + RL L + RL H + RL E + RL D + DJNZ RL32 + RET + diff --git a/Source/CPM3/bioskrnl.asm b/Source/CPM3/bioskrnl.asm index ab3a9ccd..bd21c783 100644 --- a/Source/CPM3/bioskrnl.asm +++ b/Source/CPM3/bioskrnl.asm @@ -507,6 +507,11 @@ seldsk: mov a,m ! inx h ! mov h,m ! mov l,a ; get address of LOGIN routine call ipchl ; call LOGIN pop h ; recover DPH pointer + ; WBW Start + ora a + rz ; successful return + lxi h,0 ; error occurred, clear HL + ; WBW End not$first$select: ret diff --git a/Source/CPM3/biosldr.z80 b/Source/CPM3/biosldr.z80 index 9fc960d3..beeeb878 100644 --- a/Source/CPM3/biosldr.z80 +++ b/Source/CPM3/biosldr.z80 @@ -51,109 +51,211 @@ jp 0 ; reserved for future expansion jp 0 ; reserved for future expansion -boot: - - if cmdline +mbrsec equ dtabuf +boot: + ; The main module (cpmldr.asm) does not expect the + ; boot call to use much stack. We use our own during + ; this routine to avoid issues. ld (stksav),sp ld sp,stack -boot1: - ld de,msgunit - call writestr - call cin - push af - call cout - pop af - - sub '0' - ld (unit),a - jr c,selerr - - ld bc,0F810h ; HBIOS, get disk unit count - call 0FFF0h ; do it, E := disk unit count - ld a,(unit) ; get unit num back - cp e ; compare to entry - jr nc,selerr ; loop if too high + ; Do the real work + call boot0 - ld de,msgslc - call writestr - call cin - push af - call cout - pop af - - sub '0' - ld (slice),a - jr c,selerr - cp 10 - jr nc,selerr + ; Restore original stack and return + ld sp,(stksav) + ret + +boot0: + + if cmdline - jr boot2 +boot1: + ; Get disk unit from user + ld de,msgunit ; disk unit prompt + call writestr ; display on console + call cin ; get a character + push af ; save it + call cout ; echo character + pop af ; restore it + sub '0' ; convert to binary + ld (unit),a ; save it + jr c,selerr ; loop if below 0 entered + ld bc,0F810h ; HBIOS, get disk unit count + call 0FFF0h ; do it, E := disk unit count + ld a,(unit) ; get unit num back + cp e ; compare to entry + jr nc,selerr ; loop if too high + + ; Get disk slice from user + ld de,msgslc ; slice prompt + call writestr ; display on console + call cin ; get a character + push af ; save it + call cout ; echo it + pop af ; restore it + sub '0' ; convert to binary + ld (slice),a ; save it + jr c,selerr ; loop if below 0 entered + cp 10 ; check for over 9 + jr nc,selerr ; loop if over 9 + ld de,crlf ; linefeed + call writestr ; ... to console + jr boot2 ; boot w/ unit & slice selerr: - ld de,msginv - call writestr - jr boot1 + ; Display invalid entry message and restart + ld de,msginv ; error message + call writestr ; display on console + jr boot1 ; loop boot2: - ld de,crlf - call writestr + ; Record unit & slice w/ HBIOS + ld bc,0F9E0h ; HBIOS func: set boot info + ld a,(unit) ; get unit + ld d,a ; put in D + ld a,(slice) ; get slice + ld e,a ; put in E + ld l,0 ; Bank is always zero + call 0FFF0h ; do it - ld sp,(stksav) - - ld bc,0F9E0h ; HBIOS func: set boot info - ld a,(unit) ; get unit - ld d,a ; put in D - ld a,(slice) ; get slice - ld e,a ; put in E - ld l,0 ; Bank is always zero - call 0FFF0h ; do it - else - - ld bc,0F8E0h ; HBIOS func: get boot info - call 0FFF0h ; do it, D := boot unit, E: := slice - ld a,d ; move unit to A - ld (unit),a ; save it - ld a,e ; move slice to A - ld (slice),a ; save it + + ; Get unit & slice from HBIOS + ld bc,0F8E0h ; HBIOS func: get boot info + call 0FFF0h ; do it, D := boot unit, E: := slice + ld a,d ; move unit to A + ld (unit),a ; save it + ld a,e ; move slice to A + ld (slice),a ; save it endif - ld a,(unit) ; Get boot unit - ld c,a ; put in C - ld b,18h ; HBIOS Media function - ld e,1 ; Enable media check/discovery - call 0FFF0H ; HBIOS call - ld a,e ; Resultant media id to accum - or a ; Set flags - ;halt - ; - ; !!! Need to do something on error !!! - ; - ret z ; Bail out on error - + ; Check that drive actually exists + ld bc,0F810h ; HBIOS func: get disk count + call 0FFF0h ; do it, E=disk count + ld a,(unit) ; get boot disk unit + cp e ; compare to count + jp nc,err_nodisk ; handle no disk err + + ; Sense media to determine media format + ld a,(unit) ; Get boot unit + ld c,a ; put in C + ld b,18h ; HBIOS Media function + ld e,1 ; Enable media check/discovery + call 0FFF0H ; HBIOS call + jp nz,err_diskio ; handle error + ld a,e ; resultant media id to accum + ld (medid),a ; save media id + or a ; set flags, 0 is no media + jp z,err_diskio ; handle no media error + + ; Initialize slice start LBA & sectors per slice + ld hl,0 ; assume slice starts + ld (lba),hl ; ... at LBA offset + ld (lba+2),hl ; ... of zero + ld hl,16640 ; assume legacy value for + ld (sps),hl ; ... sectors per slice + + ; If not hard disk, skip partition & slice stuff + ld a,(medid) ; get media id + cp 4 ; hard disk? + jr nz,boot9 ; if not, jump ahead + + ; Read MBR + ld de,8000h ; LBA address zero + ld hl,0 ; ... to read first sector + ld bc,mbrsec ; read into MBR buffer + ld (dma),bc ; save + ld b,1 ; one sector + ld a,(unit) ; get bootunit + ld c,a ; put in C + call diskread ; do it, no return on err + + ; Check signature + ld hl,(mbrsec+1FEh) ; get signature + ld a,l ; first byte + cp 055h ; should be $55 + jr nz,boot5 ; if not, no part table + ld a,h ; second byte + cp 0AAh ; should be $AA + jr nz,boot5 ; if not, no part table + + ; Search part table for CP/M entry (type 0x2E) + ld b,4 ; four entries in part table + ld hl,mbrsec+1BEh+4 ; offset of first part type +boot3: + ld a,(hl) ; get part type + cp 2Eh ; CP/M partition? + jr z,boot4 ; cool, grab the LBA offset + ld de,16 ; part table entry size + add hl,de ; bump to next part type + djnz boot3 ; loop thru table + jr boot5 ; too bad, no CP/M partition + +boot4: + ; Capture the starting LBA of the CP/M partition we found + ld de,4 ; LBA is 4 bytes after part type + add hl,de ; point to it + ld de,lba ; loc to store lba offset + ld bc,4 ; 4 bytes (32 bits) + ldir ; copy it + + ; For now, it is implied that a slice within a partition + ; table will be in the "new" disk format. So, we now + ; adjust the sectors per slice and media id. + + ; Use new slice format sectors per slice value + ld hl,16384 ; new sectors per slice + ld (sps),hl ; save it + + ; Update media id for new hard disk format + ld a,10 ; new media id + ld (medid),a ; save it + +boot5: + ; Adjust LBA offset based on target slice + ld a,(slice) ; get boot slice, A is loop cnt + ld hl,(lba) ; set DE:HL + ld de,(lba+2) ; ... to starting LBA + ld bc,(sps) ; sectors per slice +boot6: + or a ; set flags to check loop cntr + jr z,boot8 ; done if counter exhausted + add hl,bc ; add one slice to low word + jr nc,boot7 ; check for carry + inc de ; if so, bump high word +boot7: + dec a ; dec loop downcounter + jr boot6 ; and loop +boot8: + ld (lba),hl ; save new lba, low word + ld (lba+2),de ; save new lba, high word + +boot9: + ; Locate DPB corresponding to media id ld hl,dpb$start - dpb$sz ld de,dpb$sz - ld b,a ; loop count -dsk$login1: - add hl,de ; next dpb - djnz dsk$login1 ; loop as needed - - ; hl is ptr to desired dpb - ld de,dph0 ; load DPH pointer - ex de,hl ; de = DPB adr, hl = DPH adr - push de ; save DPB adr - ld de,12 ; offset of DPB in DPH - add hl,de ; hl = adr of DPB field in DPH - pop de ; recover DPB adr - ld (hl),e ; update LSB - inc hl - ld (hl),d ; udpate MSB + ld a,(medid) ; get media id + ld b,a ; to loop count +boot10: + add hl,de ; next dpb + djnz boot10 ; loop as needed + + ; Stuff DPB ptr (HL) into DPH + ld de,dph0 ; load DPH pointer + ex de,hl ; de = DPB adr, hl = DPH adr + push de ; save DPB adr + ld de,12 ; offset of DPB in DPH + add hl,de ; hl = adr of DPB field in DPH + pop de ; recover DPB adr + ld (hl),e ; update LSB + inc hl ; point to MSB + ld (hl),d ; update MSB + + ret ; done - ret - wboot: ld a,81H halt @@ -162,15 +264,14 @@ const: ld a,82H halt conin: - ld bc,0080H ; unit 80h (console), func 0 = CIN - call 0FFF0H - + ld bc,0080h ; unit 80h (console), func 0 = CIN + call 0FFF0h ; do it + ld a,e ; put in C + ret ; done conout: - ld e,c ; output character in E - ld bc,0180H ; unit 80h (console), func 1 = COUT - ;rst 08 ; do it - call 0FFF0H - ret ; return + ld e,c ; output character in E + ld bc,0180h ; unit 80h (console), func 1 = COUT + jp 0FFF0h list: ld a,85H halt @@ -197,61 +298,100 @@ setsec: setdma: ld (dma),bc ret + read: - ld a,(unit) ; get unit - ld c,a ; BIOS Disk Unit in C - ld b,12H ; HBIOS SEEK function - push bc ; save it - ;push de ; save XDPH pointer - ld b,17h ; HBIOS DEVICE function - rst 08 ; Do it, D=device type - ld a,d ; put in accum - and 0F0h ; isolate high bits - ld b,1 ; assume it is floppy, 1 head bit - ld c,01h ; 1 bit head mask - cp 10h ; floppy? - jr z,seek0 ; yup, skip ahead - ld b,4 ; must be hard disk, 4 head bits - ld c,0Fh ; 4 bit head mask -seek0: - ;pop de ; recover XDPH pointer - push bc ; save bc - ld a,(slice) ; get slice - ld e,a ; slice to E - ld h,65 ; number of tracks per slice - call mult8 ; HL now has track offset for slice - pop bc ; recover bc - push hl ; save track offset for now - ld hl,(trk) ; get track value - ld a,l ; lsb of track to a - and c ; apply mask - ld d,a ; save in d -seek1: - srl h ; shift one bit out - rr l ; ... of hl - djnz seek1 ; do all bits - ld a,(sect) ; get sector - ld e,a ; stuff it in e - ex de,hl ; de=track, hl=head/sect - ex (sp),hl ; save head/sect, hl = offset - add hl,de ; hl has final track value - pop de ; recover head/sect to de - pop bc ; recover function & unit - ;rst 08 ; perform seek - call 0FFF0H - - ; Read Sector - ld b,13h ; HBIOS read - ld a,(unit) ; get boot unit - ld c,a ; put in C - ld hl,(dma) ; dma address - ld a,(0FFE0H) ; current bank - ld d,a ; ... to D - ld e,1 ; 1 sector - ;rst 08 - call 0FFF0H + ; Check device type + ld a,(unit) ; get unit + ld c,a ; BIOS Disk Unit in C + ld b,17h ; HBIOS DEVICE function + rst 08 ; Do it, D=device type + ld a,d ; put in accum + and 0F0h ; isolate high bits + cp 10h ; floppy? + jr nz,read2 ; if not, do LBA i/o - ret + ; Floppy I/O + ld de,(sect) ; sector -> de, head(d) becomes zero + ld hl,(trk) ; track -> hl (low bit has head) + srl h ; shift head bit out of hl + rr l ; ... and into carry + rl d ; carry bit (head) into d + jr read3 ; do the disk i/o + +; ; *** Simplify this to get rid of slice!!! *** +; ld b,1 ; assume it is floppy, 1 head bit +; ld c,01h ; 1 bit head mask +; push bc ; save bc +; ld a,(slice) ; get slice +; ld e,a ; slice to E +; ld h,65 ; number of tracks per slice +; call mult8 ; HL now has track offset for slice +; pop bc ; recover bc +; push hl ; save track offset for now +; ld hl,(trk) ; get track value +; ld a,l ; lsb of track to a +; and c ; apply mask +; ld d,a ; save in d +;read1: +; srl h ; shift one bit out +; rr l ; ... of hl +; djnz read1 ; do all bits +; ld a,(sect) ; get sector +; ld e,a ; stuff it in e +; ex de,hl ; DE=track, HL=head/sect +; ex (sp),hl ; save head/sect, HL = offset +; add hl,de ; HL has final track value +; pop de ; recover head/sect to de +; jr read3 + + ; LBA I/O +read2: + ld hl,(trk) ; get track + ld de,0 ; clear hiword + ld b,4 ; x16 (16 spt assumed) + call rl32 ; do it + ; combine with sector + ld a,(sect) ; get sector + or l ; combine + ld l,a ; and back to L + ; add in lba offset + ld bc,(lba) ; lba offset loword + add hl,bc ; add to cur loword + ex de,hl ; swap + ld bc,(lba+2) ; lba offset hiword + adc hl,bc ; add w/ carry to cur hiword + ex de,hl ; swap back + set 7,d ; set lba access bit + +read3: + ; DE:HL has sector address to read (LBA or CHS) + ld a,(unit) ; get disk unit + ld c,a ; put in C + ld b,1 ; read 1 sector + jr diskread ; read sector and return + +diskread: + ; Read disk sector(s) + ; DE:HL is LBA, B is sector count, C is disk unit + + ; Seek to requested sector in DE:HL + push bc ; save unit & count + ld b,012h ; HBIOS func: seek + call 0FFF0h ; do it + pop bc ; recover unit & count + jp nz,err_diskio ; handle error + + ; Read sector(s) into buffer + ld e,b ; transfer count + ld b,013h ; HBIOS func: disk read + ld hl,(dma) ; read into info sec buffer + ld a,(0FFE0h) ; get current bank + ld d,a ; put in D + call 0FFF0h ; do it + jp nz,err_diskio ; handle error + xor a ; signal success + ret ; and done + write: ld a,8EH halt @@ -291,10 +431,11 @@ flush: halt move: - ex de,hl ; we are passed source in DE and dest in HL - ldir ; use Z80 block move instruction - ex de,hl ; need next addresses in same regs - ret + ; On input, DE=src, HL=dest + ex de,hl ; swap HL/DE for LDIR + ldir ; Z80 block move + ex de,hl ; swap back (required!) + ret ; done time: ld a,9AH halt @@ -307,22 +448,21 @@ setbnk: xmove: ld a,9DH halt - + cin: - ; input character from console via hbios - ld c,080H ; console unit to c - ld b,00H ; hbios func: input char - call 0FFF0H ; hbios reads character - ld a,e ; move character to a for return - ret + ; Input character from console via HBIOS + ld c,080H ; console unit to C + ld b,00H ; HBIOS func: input char + call 0FFF0H ; HBIOS reads character + ld a,e ; To A for return + ret ; done cout: - ; output character to console via hbios - ld e,a ; output char to e - ld c,080H ; console unit to c - ld b,01H ; hbios func: output char - call 0FFF0H ; hbios outputs character - ret + ; Output character to console via HBIOS + ld e,a ; output char to E + ld c,080H ; console unit to C + ld b,01H ; HBIOS func: output char + jp 0FFF0H ; output & return writestr: push af @@ -339,12 +479,8 @@ writestr2: pop af ret -; -; multiply 8-bit values -; in: multiply h by e -; out: hl = result, e = 0, b = 0 -; mult8: + ; Multiply: H := H * E ld d,0 ld l,d ld b,8 @@ -356,6 +492,46 @@ mult8_noadd: djnz mult8_loop ret +rl32: + ; Left shift DE:HL by B bits (B > 0) + or a ; clear carry + rl l ; rotate L thru carry + rl h ; rotate H thru carry + rl e ; rotate E thru carry + rl d ; rotate D thru carry + djnz rl32 ; loop B times + ret ; done + +err_nodisk: + ld hl,str_err_nodisk + jr err +err_noslice: + ld hl,str_err_noslice + jr err +err_diskio: + ld hl,str_err_diskio + jr err +err_sig: + ld hl,str_err_sig + jr err +err_api: + ld hl,str_err_api + jr err +err: + push hl + ld de,str_err_prefix + call writestr + pop de + call writestr + halt + +str_err_prefix db "\r\n\r\n*** ","$" +str_err_nodisk db "Disk unit not available","$" +str_err_noslice db "Disk unit does not support slices","$" +str_err_diskio db "Disk I/O failure","$" +str_err_sig db "No system image on disk","$" +str_err_api db "HBIOS API failure","$" + msgunit db 13,10,13,10,'Boot CP/M 3 from Disk Unit: $' msgslc db ' Slice: $' msginv db 13,10,13,10,'*** Invalid Selection ***$' @@ -363,129 +539,143 @@ crlf db 13,10,'$' dpb$start: dpb$rom: ; 384K ROM Drive - dw 64 ; spt: sectors per track - db 4 ; bsh: block shift factor - db 15 ; blm: block mask - db 1 ; exm: extent mask - dw 192 - 1 ; dsm: total storage in blocks - 1 = (384kb / 2k bls) - 1 = 191 - dw 256 - 1 ; drm: dir entries - 1 = 256 - 1 = 255 - db 11110000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 8000h ; cks: directory check vector size - permanent storage = 8000H - dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k + dw 64 ; spt: sectors per track + db 4 ; bsh: block shift factor + db 15 ; blm: block mask + db 1 ; exm: extent mask + dw 192 - 1 ; dsm: total storage in blocks - 1 = (384kb / 2k bls) - 1 = 191 + dw 256 - 1 ; drm: dir entries - 1 = 256 - 1 = 255 + db 11110000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 8000h ; cks: directory check vector size - permanent storage = 8000H + dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 dpb$sz equ $ - dpb$start dpb$ram: ; 256K RAM Drive - dw 64 ; spt: sectors per track - db 4 ; bsh: block shift factor - db 15 ; blm: block mask - db 1 ; exm: extent mask - dw 128 - 1 ; dsm: total storage in blocks - 1 = (256kb / 2k bls) - 1 = 127 - dw 256 - 1 ; drm: dir entries - 1 = 256 - 1 = 255 - db 11110000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 8000h ; cks: directory check vector size - permanent storage = 8000H - dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k + dw 64 ; spt: sectors per track + db 4 ; bsh: block shift factor + db 15 ; blm: block mask + db 1 ; exm: extent mask + dw 128 - 1 ; dsm: total storage in blocks - 1 = (256kb / 2k bls) - 1 = 127 + dw 256 - 1 ; drm: dir entries - 1 = 256 - 1 = 255 + db 11110000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 8000h ; cks: directory check vector size - permanent storage = 8000H + dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 dpb$rf: ; 4MB RAM Floppy Drive - dw 64 ; spt: sectors per track - db 4 ; bsh: block shift factor - db 15 ; blm: block mask - db 0 ; exm: extent mask - dw 2047 ; dsm: total storage in blocks - 1 = (4mb / 2k bls) - 1 = 2047 - dw 255 ; drm: dir entries - 1 = 256 - 1 = 255 - db 11110000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 8000h ; cks: directory check vector size - permanent storage = 8000H - dw 0 ; off: reserved tracks = 0 trks + dw 64 ; spt: sectors per track + db 4 ; bsh: block shift factor + db 15 ; blm: block mask + db 0 ; exm: extent mask + dw 2047 ; dsm: total storage in blocks - 1 = (4mb / 2k bls) - 1 = 2047 + dw 255 ; drm: dir entries - 1 = 256 - 1 = 255 + db 11110000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 8000h ; cks: directory check vector size - permanent storage = 8000H + dw 0 ; off: reserved tracks = 0 trks db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 dpb$hd: ; 8MB Hard Disk Drive - dw 64 ; spt: sectors per track - db 5 ; bsh: block shift factor - db 31 ; blm: block mask - db 1 ; exm: extent mask - dw 2047 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047 - dw 511 ; drm: dir entries - 1 = 512 - 1 = 511 - db 11110000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 8000h ; cks: directory check vector size - permanent storage = 8000H - dw 16 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k + dw 64 ; spt: sectors per track + db 5 ; bsh: block shift factor + db 31 ; blm: block mask + db 1 ; exm: extent mask + dw 2047 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047 + dw 512-1 ; drm: dir entries - 1 = 512 - 1 = 511 + db 11110000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 8000h ; cks: directory check vector size - permanent storage = 8000H + dw 16 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 dpb$fd720: ; 3.5" DS/DD Floppy Drive (720K) - dw 36 ; spt: sectors per track - db 4 ; bsh: block shift factor - db 15 ; blm: block mask - db 0 ; exm: extent mask - dw 350 ; dsm: total storage in blocks - 1 blk = ((720k - 18k off) / 2k bls) - 1 = 350 - dw 127 ; drm: dir entries - 1 = 128 - 1 = 127 - db 11000000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 32 ; cks: directory check vector size = 128 / 4 - dw 4 ; off: reserved tracks = 4 trks * (512 b/sec * 36 sec/trk) = 18k + dw 36 ; spt: sectors per track + db 4 ; bsh: block shift factor + db 15 ; blm: block mask + db 0 ; exm: extent mask + dw 350 ; dsm: total storage in blocks - 1 blk = ((720k - 18k off) / 2k bls) - 1 = 350 + dw 127 ; drm: dir entries - 1 = 128 - 1 = 127 + db 11000000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 32 ; cks: directory check vector size = 128 / 4 + dw 4 ; off: reserved tracks = 4 trks * (512 b/sec * 36 sec/trk) = 18k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 dpb_fd144: ; 3.5" DS/HD Floppy Drive (1.44M) - dw 72 ; spt: sectors per track - db 4 ; bsh: block shift factor - db 15 ; blm: block mask - db 0 ; exm: extent mask - dw 710 ; dsm: total storage in blocks - 1 blk = ((1,440k - 18k off) / 2k bls) - 1 = 710 - dw 255 ; drm: dir entries - 1 = 256 - 1 = 255 - db 11110000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 64 ; cks: directory check vector size = 256 / 4 - dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 72 sec/trk) = 18k + dw 72 ; spt: sectors per track + db 4 ; bsh: block shift factor + db 15 ; blm: block mask + db 0 ; exm: extent mask + dw 710 ; dsm: total storage in blocks - 1 blk = ((1,440k - 18k off) / 2k bls) - 1 = 710 + dw 255 ; drm: dir entries - 1 = 256 - 1 = 255 + db 11110000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 64 ; cks: directory check vector size = 256 / 4 + dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 72 sec/trk) = 18k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 -dpb_fd360: ; 5.25" DS/DD Floppy Drive (360K) - dw 36 ; spt: sectors per track - db 4 ; bsh: block shift factor - db 15 ; blm: block mask - db 1 ; exm: extent mask - dw 170 ; dsm: total storage in blocks - 1 blk = ((360k - 18k off) / 2k bls) - 1 = 170 - dw 127 ; drm: dir entries - 1 = 128 - 1 = 127 - db 11110000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 32 ; cks: directory check vector size = 128 / 4 - dw 4 ; off: reserved tracks = 4 trks * (512 b/sec * 36 sec/trk) = 18k +dpb_fd360: ; 5.25" DS/DD Floppy Drive (360K) + dw 36 ; spt: sectors per track + db 4 ; bsh: block shift factor + db 15 ; blm: block mask + db 1 ; exm: extent mask + dw 170 ; dsm: total storage in blocks - 1 blk = ((360k - 18k off) / 2k bls) - 1 = 170 + dw 127 ; drm: dir entries - 1 = 128 - 1 = 127 + db 11110000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 32 ; cks: directory check vector size = 128 / 4 + dw 4 ; off: reserved tracks = 4 trks * (512 b/sec * 36 sec/trk) = 18k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 dpb_fd120: ; 5.25" DS/HD Floppy Drive (1.2M) - dw 60 ; spt: sectors per track - db 4 ; bsh: block shift factor - db 15 ; blm: block mask - db 0 ; exm: extent mask - dw 591 ; dsm: total storage in blocks - 1 blk = ((1,200k - 15k off) / 2k bls) - 1 = 591 - dw 255 ; drm: dir entries - 1 = 256 - 1 = 255 - db 11110000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 64 ; cks: directory check vector size = 256 / 4 - dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 60 sec/trk) = 15k + dw 60 ; spt: sectors per track + db 4 ; bsh: block shift factor + db 15 ; blm: block mask + db 0 ; exm: extent mask + dw 591 ; dsm: total storage in blocks - 1 blk = ((1,200k - 15k off) / 2k bls) - 1 = 591 + dw 255 ; drm: dir entries - 1 = 256 - 1 = 255 + db 11110000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 64 ; cks: directory check vector size = 256 / 4 + dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 60 sec/trk) = 15k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 dpb_fd111: ; 8" DS/DD Floppy Drive (1.11M) - dw 60 ; spt: sectors per track - db 4 ; bsh: block shift factor - db 15 ; blm: block mask - db 0 ; exm: extent mask - dw 569 ; dsm: total storage in blocks - 1 blk = ((1,155k - 15k off) / 2k bls) - 1 = 569 - dw 255 ; drm: dir entries - 1 = 256 - 1 = 255 - db 11110000b ; al0: dir blk bit map, first byte - db 00000000b ; al1: dir blk bit map, second byte - dw 64 ; cks: directory check vector size = 256 / 4 - dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 60 sec/trk) = 15k + dw 60 ; spt: sectors per track + db 4 ; bsh: block shift factor + db 15 ; blm: block mask + db 0 ; exm: extent mask + dw 569 ; dsm: total storage in blocks - 1 blk = ((1,155k - 15k off) / 2k bls) - 1 = 569 + dw 255 ; drm: dir entries - 1 = 256 - 1 = 255 + db 11110000b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 64 ; cks: directory check vector size = 256 / 4 + dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 60 sec/trk) = 15k + db 2 ; psh: 2 for 512 byte sectors + db 3 ; phm: (512 / 128) - 1 + +dpb$hdnew: ; 8MB Hard Disk Drive (new format) + dw 64 ; spt: sectors per track + db 5 ; bsh: block shift factor + db 31 ; blm: block mask + db 1 ; exm: extent mask + dw 2048 - 1 - 4 ; dsm: total storage in blocks - 1 = 2048 - 1 - resvd tracks + dw 1024 - 1 ; drm: dir entries + db 11111111b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 8000h ; cks: directory check vector size - permanent storage = 8000H + dw 2 ; off: reserved tracks db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 @@ -493,13 +683,13 @@ dph0: dw 0 ; xlt, 0 means no translation db 0,0,0,0,0,0,0,0,0 ; scratch (9 bytes) db 0 ; mf: media flag dw dpb$hd ; dpb - dw csvbuf ; csv: - dw alvbuf ; alv: + dw csvbuf ; csv: + dw alvbuf ; alv: dw dirbcb ; dirbcb dw dtabcb ; dtabcb dw 0ffffh ; hash (disabled) db 0 ; hbank - + dtbl: dtbl dph0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dirbcb: db 0ffh ; drv @@ -524,6 +714,10 @@ trk ds 2 ; current track sect ds 2 ; current sector dma ds 2 ; current DMA address +medid ds 1 ; media id +lba ds 4 ; current lba +sps ds 2 ; sectors per slice + csvbuf ds 128 ; length (CSV) = ((DRM+1)/4) alvbuf ds 512 ; length (ALV) = ((DSM+1)/4) dirbuf ds 512 ; sector buffer @@ -531,6 +725,6 @@ dtabuf ds 512 ; sector buffer ds 64 stack equ $ -stksav dw 0 +stksav ds 2 end diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 53e36f47..b9f58bc7 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -41,7 +41,7 @@ tpa$bank equ 0 if banked ; Clone page zero from bank 0 to additional banks - ld b,3 ; last bank + ld b,4 ; last bank ld c,0 ; src bank init$2: push bc ; save bank id's @@ -228,25 +228,26 @@ dinit6: pop de ; restore drive list ptr inc de ; increment active drive list ptr djnz dinit6 ; loop as needed + ret - ; zero out remaining dph table entries - ld a,16 ; dph table entries - sub l ; subtract entries used - ret z ; return if all entries used - ld b,a ; save as loop counter - ld a,l ; current dph to accum - rlca ; *2 for word entry - ld hl,@dtbl ; start of dtbl - call addhla ; hl now points to entry - -dinit6a: - xor a ; zero accum - ld (hl),a ; zero lsb - inc hl ; next byte - ld (hl),a ; zero msb - inc hl ; next byte - djnz dinit6a - ret ; finished +; ; zero out remaining dph table entries +; ld a,16 ; dph table entries +; sub l ; subtract entries used +; ret z ; return if all entries used +; ld b,a ; save as loop counter +; ld a,l ; current dph to accum +; rlca ; *2 for word entry +; ld hl,@dtbl ; start of dtbl +; call addhla ; hl now points to entry +; +;dinit6a: +; xor a ; zero accum +; ld (hl),a ; zero lsb +; inc hl ; next byte +; ld (hl),a ; zero msb +; inc hl ; next byte +; djnz dinit6a +; ret ; finished dinit7: ; process a unit (all slices) ld e,0 ; initialize slice index diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 154d601d..1856eefa 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -37,7 +37,7 @@ extrn ?bnkxlt - ;extrn phex8, cout + extrn phex8, cout ; CP/M 3 Disk definition macros @@ -60,113 +60,129 @@ bell equ 7 dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph0: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph1: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph2: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph3: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph4: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph5: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph6: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph7: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph8: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph9: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph10: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph11: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph12: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph13: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph14: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset dw dsk$write dw dsk$read dw dsk$login dw dsk$init - db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot) + db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot) dph15: dph 0,dpb$max ; Real DPB filled in at disk login + dw 0, 0 ; LBA Offset cseg ; DPB must be resident @@ -176,10 +192,11 @@ dpb$max: db 31 ; blm: block mask db 1 ; exm: extent mask dw 2047 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047 - dw 511 ; drm: dir entries - 1 = 512 - 1 = 511 - db 11110000b ; al0: dir blk bit map, first byte + dw 1024 - 1 ; drm: dir entries - 1 + db 11111111b ; al0: dir blk bit map, first byte db 00000000b ; al1: dir blk bit map, second byte - dw 64 ; cks: directory check vector size - 256 / 4 + ;dw 64 ; cks: directory check vector size - 256 / 4 + dw 256 ; cks: directory check vector size - 1024 / 4 dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 @@ -228,16 +245,16 @@ dpb$rf: ; 4MB RAM Floppy Drive db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 -dpb$hd: ; 8MB Hard Disk Drive +dpb$hd: ; 8MB Hard Disk Drive w/ 512 dir entries dw 64 ; spt: sectors per track db 5 ; bsh: block shift factor db 31 ; blm: block mask db 1 ; exm: extent mask dw 2047 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047 - dw 511 ; drm: dir entries - 1 = 512 - 1 = 511 + dw 512 - 1 ; drm: dir entries - 1 = 512 - 1 = 511 db 11110000b ; al0: dir blk bit map, first byte db 00000000b ; al1: dir blk bit map, second byte - dw 8000h ; cks: directory check vector size - permanent storage = 8000H + dw 8080h ; cks: directory check vector size - permanent storage = 8000H dw 16 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 @@ -312,6 +329,20 @@ dpb_fd111: ; 8" DS/DD Floppy Drive (1.11M) db 2 ; psh: 2 for 512 byte sectors db 3 ; phm: (512 / 128) - 1 +dpb$hdnew: ; 8MB Hard Disk Drive (new format) + dw 64 ; spt: sectors per track + db 5 ; bsh: block shift factor + db 31 ; blm: block mask + db 1 ; exm: extent mask + dw 2048 - 1 - 4 ; dsm: total storage in blocks - 1 = 2048 - 1 - resvd tracks + dw 1024 - 1 ; drm: dir entries + db 11111111b ; al0: dir blk bit map, first byte + db 00000000b ; al1: dir blk bit map, second byte + dw 8100h ; cks: directory check vector size - permanent storage = 8000H + dw 2 ; off: reserved tracks + db 2 ; psh: 2 for 512 byte sectors + db 3 ; phm: (512 / 128) - 1 + dseg ; rest is banked @@ -370,48 +401,191 @@ dsk$login: ;ld a,'L' ;call cout + + ld (curdph),de ; save working DPH + ex de,hl ; DPH adr to HL + dec hl ; point to slice + ld a,(hl) ; get slice + ld (slice),a ; save it + dec hl ; point to disk unit + ld a,(hl) ; get unit + ld (unit),a ; save it + inc a ; 0FFh -> 000h + jp z,err_ret ; bail out on no disk mapped here + + ;call media ; update DPH for media + ;ret - push de ; save DPH ptr +media: + ; Set retry address + ld hl,media + ld (retry$adr),hl - ; check media - ld a,(@rdrv) ; get disk unit - ;halt - ld c,a ; put in C - ld b,18h ; HBIOS Media function - ld e,1 ; Enable media check/discovery - ;rst 08 - call 0FFF0H ; HBIOS call - ld a,e ; Resultant media id to accum - or a ; Set flags - ;halt - ; - ; !!! Need to do something on error !!! - ; - jr nz,dsk$login0 ; continue if OK - pop de ; else error - ret ; return + ; Sense media to determine media format + ld a,(unit) ; get disk unit + ld c,a ; put in C + ld b,18h ; HBIOS Media function + ld e,1 ; Enable media check/discovery + call 0FFF0H ; HBIOS call + jp nz,err_diskio ; handle error + ld a,e ; resultant media id to accum + ld (medid),a ; save media id + or a ; set flags, 0 is no media + jp z,err_diskio ; handle no media error + + ; Initialize slice start LBA & sectors per slice + ld hl,0 ; assume slice starts + ld (lba),hl ; ... at LBA offset + set 7,h ; ... of zero + ld (lba+2),hl ; ... w/ LBA access + + ; Check device type + ld a,(unit) ; get disk unit + ld c,a ; put in C + ld b,17h ; HBIOS func: report device info + call 0FFF0h ; get unit info, device type in D + ld a,d ; device type -> A + and 0F0h ; isolate high bits + cp 10h ; floppy? + jr nz,media1 ; if not, do LBA I/O + ld hl,lba+3 ; point to high order byte + res 7,(hl) ; switch from LBA -> CHS + +media1: + ld hl,16640 ; assume legacy value for + ld (sps),hl ; ... sectors per slice + + ; If not hard disk, skip partition & slice stuff + ld a,(medid) ; get media id + cp 4 ; hard disk? + jp nz,media9 ; if not, jump ahead + + ; Read MBR + ld de,8000h ; LBA address zero + ld hl,0 ; ... to read first sector + ld bc,mbrsec ; read into MBR buffer + ld (dma),bc ; save + ld a,(0FFE0h) ; get current HBIOS bank + ld (bank),a ; set DMA bank + ld a,(unit) ; get bootunit + ld c,a ; put in C + ld b,013h ; HBIOS func: disk read + call dsk$io ; do it + ret nz ; abort on error + + ; Check signature + ld hl,(mbrsec+1FEh) ; get signature + ld a,l ; first byte + cp 055h ; should be $55 + jr nz,media5 ; if not, no part table + ld a,h ; second byte + cp 0AAh ; should be $AA + jr nz,media5 ; if not, no part table + + ; Search part table for CP/M entry (type 0x2E) + ld b,4 ; four entries in part table + ld hl,mbrsec+1BEh+4 ; offset of first part type +media3: + ld a,(hl) ; get part type + cp 2Eh ; CP/M partition? + jr z,media4 ; cool, grab the LBA offset + ld de,16 ; part table entry size + add hl,de ; bump to next part type + djnz media3 ; loop thru table + jr media5 ; too bad, no CP/M partition + +media4: + ; Capture the starting LBA of the CP/M partition we found + ld de,4 ; LBA is 4 bytes after part type + add hl,de ; point to it + ld de,lba ; loc to store lba offset + ld bc,4 ; 4 bytes (32 bits) + ldir ; copy it -dsk$login0: + ; Check that requested slice is "inside" partition. + ; Slice size is exactly 16,384 sectors (8mb), so we can just + ; right shift partition sector count by 14 bits + ld e,(hl) ; HL points to first byte + inc hl ; ... of 32 bit partition + ld d,(hl) ; ... sector count, + inc hl ; ... load sector count + push de ; ... into DE:HL + ld e,(hl) ; ... + inc hl ; ... + ld d,(hl) ; ... + pop hl ; ... DE:HL = part size in sectors + ld b,2 ; DE = DE:HL >> 2 (tricky!) + call rl32 ; DE = slicecnt + ex de,hl ; HL = slicecnt + ld a,(slice) ; get target slice + ld c,a ; put in C + ld b,0 ; BC := requested slice # + scf ; set carry! + sbc hl,bc ; max slices - slice - 1 + jp c,err_noslice ; slice too high, error exit + + ; For now, it is implied that a slice within a partition + ; table will be in the "new" disk format. So, we now + ; adjust the sectors per slice and media id. + + ; Use new slice format sectors per slice value + ld hl,16384 ; new sectors per slice + ld (sps),hl ; save it + + ; Update media id for new hard disk format + ld a,10 ; new media id + ld (medid),a ; save it + +media5: + ; Adjust LBA offset based on target slice + ld a,(slice) ; get slice, A is loop cnt + ld hl,(lba) ; set DE:HL + ld de,(lba+2) ; ... to starting LBA + ld bc,(sps) ; sectors per slice +boot6: + or a ; set flags to check loop cntr + jr z,boot8 ; done if counter exhausted + add hl,bc ; add one slice to low word + jr nc,boot7 ; check for carry + inc de ; if so, bump high word +boot7: + dec a ; dec loop downcounter + jr boot6 ; and loop +boot8: + set 7,d ; set LBA access flag + ld (lba),hl ; save new lba, low word + ld (lba+2),de ; save new lba, high word + +media9: + ; Locate DPB corresponding to media id ld hl,dpb$start - dpb$sz ld de,dpb$sz - ld b,a ; loop count -dsk$login1: - add hl,de ; next dpb - djnz dsk$login1 ; loop as needed - - ; hl is ptr to desired dpb - pop de ; restore DPH ptr - ;halt - ex de,hl ; de = DPB adr, hl = DPH adr - push de ; save DPB adr - ld de,12 ; offset of DPB in DPH - add hl,de ; hl = adr of DPB field in DPH - pop de ; recover DPB adr - ld (hl),e ; update LSB - inc hl - ld (hl),d ; udpate MSB - ret ; done - + ld a,(medid) ; get media id + ld b,a ; to loop count +media10: + add hl,de ; next dpb + djnz media10 ; loop as needed + + ; Stuff DPB ptr (HL) and LBA offset into DPH + ; DPH: DPB @ +12, LBA @ +25 + ld de,(curdph) ; load DPH pointer + ex de,hl ; de = DPB adr, hl = DPH adr + push de ; save DPB adr + ld de,12 ; offset of DPB in DPH + add hl,de ; hl = adr of DPB field in DPH + pop de ; recover DPB adr + ld (hl),e ; update LSB + inc hl ; point to MSB + ld (hl),d ; update MSB + ld de,12 ; 12 more bytes to LBA + add hl,de ; HL points to LBA offset field + ld de,lba ; DE points to LBA offset + ex de,hl ; swap for copy + ld bc,4 ; 4 bytes + ldir ; do it + + xor a ; signal success + ret ; done ; disk READ and WRITE entry points. @@ -429,116 +603,114 @@ dsk$login1: ; if necessary, then return an error code in dsk$read: -; ld ix,30H -; halt + ld a,13h ; HBIOS disk read function + ld (func),a ; save it + jr dsk$rw ; common disk read/write code - ;ld a,'R' - ;call cout +dsk$write: + ld a,14h ; HBIOS disk write function + ld (func),a ; save it + jr dsk$rw ; common disk read/write code - push de ; save XDPH pointer - call dsk$seek ; disk seek - pop hl ; restore pointer to HL - ret nz ; abort on seek error -; - dec hl ; point to unit field of XDPH - dec hl - ld c,(hl) ; BIOS Disk Unit in C - ld b,13H ; HBIOS READ function - ld hl,(@dma) ; Dest buffer adr +dsk$rw: + ; Common disk read/write routine + ; Assumes func is set to HBIOS read or write + + ; Set retry address + ld hl,dsk$rw$retry + ld (retry$adr),hl + + ; Save XDPH address + ld (curdph),de ; save to curdph + +dsk$rw$retry: + ; Get LBA offset from DPH to DE:HL + ld hl,(curdph) ; HL := DPH adr + ld de,25 ; LBA value adr + add hl,de ; HL := LBA offset + ld e,(hl) ; lobyte of loword + inc hl ; bump + ld d,(hl) ; hibyte of loword + inc hl ; bump + push de ; save loword + ld e,(hl) ; lobyte of hiword + inc hl ; bump + ld d,(hl) ; hibyte of hiword + pop hl ; recover loword + + bit 7,d ; LBA access bit set? + jr nz,dsk$rw2 ; if so, go to LBA I/O + + ; Floppy I/O + ld de,(@sect) ; sector -> de, head(d) becomes zero + ld hl,(@trk) ; track -> hl (low bit has head) + srl h ; shift head bit out of hl + rr l ; ... and into carry + rl d ; carry bit (head) into d + jr dsk$rw9 ; do the disk I/O + +dsk$rw2: + push de ; save hiword of LBA + push hl ; save loword of LBA + + ; Get track and shift into correct bits + ld hl,(@trk) ; get track + ld de,0 ; clear hiword + ld b,4 ; x16 (16 spt assumed) + call rl32 ; do it + + ; Combine with sector + ld a,(@sect) ; get sector + or l ; combine + ld l,a ; and back to L + + ; Add in LBA offset + pop bc ; lba offset loword + add hl,bc ; add to cur loword + ex de,hl ; swap + pop bc ; lba offset hiword + adc hl,bc ; add w/ carry to cur hiword + ex de,hl ; swap back + +dsk$rw9: + ; DE:HL has sector address to read (LBA or CHS) + ld bc,(@dma) ; get dma address + ld (dma),bc ; save for dsk$io if banked - ld a,(@dbnk) ; destination bank - call ?bnkxlt + ld a,(@dbnk) ; destination bank + call ?bnkxlt ; xlat to HBIOS else - ld a,(0FFE0H) ; get current bank + ld a,(0FFE0H) ; get current bank endif - ld d,a ; set desk bank - ld e,1 ; 1 sector - rst 08 ; do it - ;call 0FFF0H + ld (bank),a + ld a,(func) ; get HBIOS func code + ld b,a ; put in B + ld a,(@rdrv) ; get disk unit + ld c,a ; put in C + ;jr dsk$io ; fall thru to dsk$io! + +dsk$io: + ; Read/write a disk sector + ; DE:HL is CHS/LBA, B is HBIOS func, C is disk unit + + ; Seek to requested sector in DE:HL + push bc ; save func & unit + ld b,012h ; HBIOS func: seek + call 0FFF0h ; do it + pop bc ; recover func & unit + jp nz,err_diskio ; handle error + + ; Read sector(s) into buffer + ld e,1 ; transfer count + ld hl,(dma) ; read into info sec buffer + ld a,(bank) ; HBIOS DMA bank + ld d,a ; put in D + call 0FFF0h ; do it + jp nz,err_diskio ; handle error + xor a ; signal success + ret ; and done - ;call phex8 - ret ; return -; lxi h,read$msg ; point at " Read " -; mvi a,88h ! mvi b,01h ; 1797 read + Z80DMA direction -; jmp rw$common - -dsk$write: - ;ld ix,32H - ;halt - - push de ; save XDPH pointer - call dsk$seek ; disk seek - pop hl ; restore pointer to XDPH - ret nz ; abort on seek error -; - dec hl ; point to unit field of XDPH - dec hl - ld c,(hl) ; BIOS Disk Unit in C - ld b,14H ; HBIOS WRITE function - ld hl,(@dma) ; Dest buffer adr - if banked - ld a,(@dbnk) ; destination bank - call ?bnkxlt - else - ld a,(0FFE0H) ; get current bank - endif - ld d,a ; set desk bank - ld e,1 ; 1 sector - rst 08 ; do it - ;call 0FFF0H - ret ; return - -; lxi h,write$msg ; point at " Write " -; mvi a,0A8h ! mvi b,05h ; 1797 write + Z80DMA direction -; ; jmp wr$common - -dsk$seek: - dec de ; point to unit field of XDPH - dec de - ld a,(de) ; get it - ld c,a ; BIOS Disk Unit in C - ld b,12H ; HBIOS SEEK function - push bc ; save it - push de ; save XDPH pointer - ld b,17h ; HBIOS DEVICE function - rst 08 ; Do it, D=device type - ld a,d ; put in accum - and 0F0h ; isolate high bits - ld b,1 ; assume it is floppy, 1 head bit - ld c,01h ; 1 bit head mask - cp 10h ; floppy? - jr z,seek0 ; yup, skip ahead - ld b,4 ; must be hard disk, 4 head bits - ld c,0Fh ; 4 bit head mask -seek0: - pop de ; recover XDPH pointer - push bc ; save bc - inc de ; point to slice field of XDPH - ld a,(de) ; get it - ld e,a ; slice to E - ld h,65 ; number of tracks per slice - call mult8 ; HL now has track offset for slice - pop bc ; recover bc - push hl ; save track offset for now - ld hl,(@trk) ; get track value - ld a,l ; lsb of track to a - and c ; apply mask - ld d,a ; save in d -seek1: - srl h ; shift one bit out - rr l ; ... of hl - djnz seek1 ; do all bits - ld a,(@sect) ; get sector - ld e,a ; stuff it in e - ex de,hl ; de=track, hl=head/sect - ex (sp),hl ; save head/sect, hl = offset - add hl,de ; hl has final track value - pop de ; recover head/sect to de - pop bc ; recover function & unit - rst 08 ; perform seek - ;call 0FFF0H - ret ; ; multiply 8-bit values @@ -557,6 +729,96 @@ mult8_noadd: djnz mult8_loop ret +rl32: + ; Left shift DE:HL by B bits (B > 0) + or a ; clear carry + rl l ; rotate L thru carry + rl h ; rotate H thru carry + rl e ; rotate E thru carry + rl d ; rotate D thru carry + djnz rl32 ; loop B times + ret ; done + +cin$echo: ; get console input, echo it, and shift to upper case + call ?const ; check for char + or a ; set flags + jr z,cin$echo1 ; nope, continue + call ?conin ; eat extraneous char + jr cin$echo ; and loop +cin$echo1: + call ?conin ; get char + push af ; save it + ld c,a ; put in C + call ?cono ; echo + pop af ; recover it + cp 'a' ; compare + ret c ; done if carry + sub 'a' - 'A' ; make upper case + ret ; and done + +; call ?const ! ora a ! jz u$c1 ; see if any char already struck +; call ?conin ! jmp u$conin$echo ; yes, eat it and try again +;u$c1: +; call ?conin ! push psw +; mov c,a ! call ?cono +; pop psw ! cpi 'a' ! rc +; sui 'a'-'A' ; make upper case +; ret + + +err_nodisk: + ld hl,str_err_nodisk + jr err +err_noslice: + ld hl,str_err_noslice + jr err +err_diskio: + ld hl,str_err_diskio + jr err +err_sig: + ld hl,str_err_sig + jr err +err_api: + ld hl,str_err_api + jr err +err: + ld a,(@ermde) ; get error mode + cp 0FFh ; FFh means suppress + jr z,err_ret ; if so, go to err return + push hl + call ?pderr + pop hl + call ?pmsg + ld hl,str_err_retry + call ?pmsg + call cin$echo + cp 'Y' + jr nz,err_ret ; return error to caller + ld hl,(retry$adr) ; get retry address + jp (hl) ; and go there +err_ret: + ld a,1 ; signal I/O error + ret ; and done + +str_err_retry db ", Retry (Y/N) ? ",0 +str_err_nodisk db ", No disk",0 +str_err_noslice db ", No slice",0 +str_err_diskio db ", Disk I/O",0 +str_err_sig db ", No system",0 +str_err_api db ", API failure",0 + +retry$adr dw ?wboot ; error retry address +curdph dw 0 ; working dph value +medid db 0 ; working media id value +unit db 0 ; working disk unit num +slice db 0 ; working slice num +lba dw 0,0 ; working lba +sps dw 0 ; sectors per slice +mbrsec ds 512 ; MBR sector buffer +dma dw 0 ; current DMA address +bank db 0 ; HBIOS DMA bank +func db 0 ; HBIOS function + ;rw$common: ; seek to correct track (if necessary), ; ; initialize DMA controller, ; ; and issue 1797 command. diff --git a/Source/CPM3/genbnk.dat b/Source/CPM3/genbnk.dat index 4a542bd3..060a2c79 100644 --- a/Source/CPM3/genbnk.dat +++ b/Source/CPM3/genbnk.dat @@ -8,12 +8,12 @@ MEMTOP = FD BNKSWT = Y COMBAS = 80 LERROR = Y -NUMSEGS = 03 +NUMSEGS = 04 MEMSEG00 = 01,43,00 MEMSEG01 = 0E,72,02 MEMSEG02 = 01,7F,03 MEMSEG03 = 01,7F,04 -MEMSEG04 = 00,C0,05 +MEMSEG04 = 01,7F,05 MEMSEG05 = 00,C0,06 MEMSEG06 = 00,C0,07 MEMSEG07 = 00,C0,08 diff --git a/Source/CPM3/move.z80 b/Source/CPM3/move.z80 index 1b5dc067..73cc13bb 100644 --- a/Source/CPM3/move.z80 +++ b/Source/CPM3/move.z80 @@ -69,7 +69,8 @@ xbnkmov: ; 1: TPA BID_AUX 8Ch ; 2: BUFS BID_AUX-1 8Bh ; 3: BUFS BID_AUX-2 8Ah -; ... +; 4: BUFS BID_AUX-3 89h +; 5: BUFS BID_AUX-4 88h ; ; N.B., Below BID_AUX is considered RAM disk bank. Need to ; make sure RAM disk is kept small enough to stay below diff --git a/Source/CPM3/optzpm.lib b/Source/CPM3/optzpm.lib index eba22e9b..62c2499d 100644 --- a/Source/CPM3/optzpm.lib +++ b/Source/CPM3/optzpm.lib @@ -1,5 +1,4 @@ - ; global assembler options for BANKED BIOS - ; with Boot Drive swapped into Drive A + ; global assembler options for ZPM BIOS true equ -1 false equ not true diff --git a/Source/CPM3/util.z80 b/Source/CPM3/util.z80 index 28b39244..aa916129 100644 --- a/Source/CPM3/util.z80 +++ b/Source/CPM3/util.z80 @@ -51,7 +51,7 @@ bin2bcd1: pop bc ret - if 0 + if 1 ; ; Print the hex word value in HL ; diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 7049f30a..ffc3120e 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -912,6 +912,51 @@ to by HL. HL must point to a location in the top 32K of CPU address space. Write the entire contents of the Non-Volatile RAM from the buffer pointed to by HL. HL must point to a location in the top 32K of CPU address space. +### Function 0x26 -- RTC Get Alarm (RTCGETALM) + +| _Entry Parameters_ +| B: 0x26 + +| _Exit Results_ +| A: Status (0=OK, else error) + +Documentation required... + +### Function 0x27 -- RTC Set Alarm (RTCSETALM) + +| _Entry Parameters_ +| B: 0x27 + +| _Exit Results_ +| A: Status (0=OK, else error) + +Documentation required... + +### Function 0x28 -- RTC DEVICE (DIODEVICE) + +| _Entry Parameters_ +| B: 0x28 +| C: RTC Device Unit ID + +| _Exit Results_ +| A: Status (0=OK, else error) +| D: Device Type +| E: Device Number + +Reports information about the RTC device unit specified. Register D +indicates the device type (driver) and register E indicates the physical +device number assigned by the driver. + +Each RTC device is handled by an appropriate driver (DSRTC, BQRTC, +etc.) which is identified by a device type id from the table below. + +**Type ID** | **Disk Device Type** +----------- | -------------------- +0x00 | DS1302 +0x10 | BQ4845P +0x20 | SIMH +0x30 | System Periodic Timer + `\clearpage`{=latex} Video Display Adapter (VDA) @@ -1329,7 +1374,7 @@ chip provides. | _Entry Parameters_ | B: 0x52 | C: Audio Device Unit ID -| HL: Period (0000=lowest note, FFFF=highest note) +| HL: Period | _Returned Values_ | A: Status (0=OK, else error) @@ -1338,7 +1383,9 @@ This function sets the sound chip period parameter. The period will be applied when the next SNDPLAY function is invoked. The period value is a driver specific value. To play standardized -notes, use the SNDNOTE function. +notes, use the SNDNOTE function. A higher value will generate a lower +note. The maximum value that can be used is driver specific. If value +supplied is beyond driver capabilities, register A will be set to $FF. ### Function 0x53 -- Sound Note (SNDNOTE) @@ -1357,7 +1404,7 @@ The value corresponds to standard musical notes. The value allows for selection of a quarter of a semitone by giving a value between 0 and up to the drivers maximum supported value. The lowest note is (0). -For the SN76490 chip, 0 corresponds to note A1# and the value 249 is +For the SN76489 chip, 0 corresponds to note A1# and the value 249 is the maximum supported value, and it corresponds to note C7. ### Function 0x54 -- Sound Play (SNDPLAY) @@ -1365,7 +1412,7 @@ the maximum supported value, and it corresponds to note C7. | _Entry Parameters_ | B: 0x54 | C: Audio Device Unit ID -| E: Channel +| D: Channel | _Returned Values_ | A: Status (0=OK, else error) @@ -1386,7 +1433,7 @@ HBIOS B=54 C=00 D=01 ; Play note on Channel 1 ### Function 0x55 -- Sound Query (SNDQUERY) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | C: Audio Device Unit ID | E: Subfunction @@ -1399,7 +1446,7 @@ key aspects of the specific Audio Device. #### SNDQUERY Subfunction 0x01 -- Get count of audio channels supported (SNDQ_CHCNT) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | E: 0x01 | _Returned Values_ @@ -1407,10 +1454,10 @@ key aspects of the specific Audio Device. | B: Count of standard tone channels | C: Count of noise tone channels -#### SNDQUERY Subfunction 0x01 -- Get current volume setting (SNDQ_VOL) +#### SNDQUERY Subfunction 0x02 -- Get current volume setting (SNDQ_VOL) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | E: 0x02 | _Returned Values_ @@ -1421,7 +1468,7 @@ key aspects of the specific Audio Device. #### SNDQUERY Subfunction 0x03 -- Get current period setting (SNDQ_PERIOD) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | E: 0x03 | _Returned Values_ @@ -1431,7 +1478,7 @@ key aspects of the specific Audio Device. #### SNDQUERY Subfunction 0x04 -- Get device details (SNDQ_DEV) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | E: 0x04 | _Returned Values_ @@ -1455,7 +1502,7 @@ The currently defined audio device types are: AUDIO ID | Value | Device | Returned registers -------------- | ----- | ---------- | -------------------------------------------- SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel port -SND_SNAY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port +SND_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port `\clearpage`{=latex} @@ -1639,6 +1686,15 @@ available along with the registers/information returned. | A: Status (0=OK, else error) | E: Count of Disk Device Units +#### SYSGET Subfunction 0x20 -- Get Disk Device Unit Count (RTCCNT) + +| _Entry Parameters_ +| BC: 0xF820 + +| _Returned Values_ +| A: Status (0=OK, else error) +| E: Count of RTC Device Units + #### SYSGET Subfunction 0x40 -- Get Video Device Unit Count (VDACNT) | _Entry Parameters_ @@ -1665,6 +1721,7 @@ available along with the registers/information returned. | _Returned Values_ | A: Status (0=OK, else error) | DE:HL: Current Timer Tick Count Value +| C: Tick frequency (typically 50 or 60) #### SYSGET Subfunction 0xD1 -- Get Seconds Count (SECONDS) @@ -1750,15 +1807,6 @@ available along with the registers/information used as input. | _Returned Values_ | A: Status (0=OK, else error) -#### SYSSET Subfunction 0xD2 -- Inc Timer (TIMER) - -| _Entry Parameters_ -| BC: 0xF9D2 - -| _Returned Values_ -| A: Status (0=OK, else error) - - #### SYSSET Subfunction 0xE0 -- Set Boot Information (BOOTINFO) | _Entry Parameters_ diff --git a/Source/Doc/GettingStarted.md b/Source/Doc/GettingStarted.md index dada3943..cd6bc2da 100644 --- a/Source/Doc/GettingStarted.md +++ b/Source/Doc/GettingStarted.md @@ -1190,8 +1190,8 @@ these applications are no longer provided. driver. * Ed Brindley contributed some of the code that supports the RC2014 platform. -* Phil Summers contributed Forth and BASIC in ROM as well as a long -list of general code enhancements. +* Phil Summers contributed Forth and BASIC in ROM, the AY-3-8910 sound +driver as well as a long list of general code enhancements. * Phillip Stevens contributed support for FreeRTOS. * Curt Mayer contributed the Linux / MacOS build process. * UNA BIOS and FDISK80 are the products of John Coffman. diff --git a/Source/Doc/Graphics/Hard Disk Anatomy.vsd b/Source/Doc/Graphics/Hard Disk Anatomy.vsd index 680e16e3..9e78f36f 100644 Binary files a/Source/Doc/Graphics/Hard Disk Anatomy.vsd and b/Source/Doc/Graphics/Hard Disk Anatomy.vsd differ diff --git a/Source/Doc/SIO+CTC Baud Rate Options.xlsx b/Source/Doc/SIO+CTC Baud Rate Options.xlsx new file mode 100644 index 00000000..632283c5 Binary files /dev/null and b/Source/Doc/SIO+CTC Baud Rate Options.xlsx differ diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index 7b97b0cd..68e821be 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -49,6 +49,10 @@ GET ($F8): BC=Function/Subfunction A=Result E=Disk Unit Count + RTCCNT ($20): + BC=Function/Subfunction A=Result + E=RTC Unit Count + VDACNT ($40): BC=Function/Subfunction A=Result E=Video Unit Count diff --git a/Source/HBIOS/Config/MK4_std.asm b/Source/HBIOS/Config/MK4_std.asm index c838d873..f4b0f325 100644 --- a/Source/HBIOS/Config/MK4_std.asm +++ b/Source/HBIOS/Config/MK4_std.asm @@ -37,7 +37,7 @@ CVDUENABLE .SET TRUE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) VGAENABLE .SET TRUE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] +FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index 9c587ada..dd2e4cda 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/Source/HBIOS/Config/RCZ180_ext.asm @@ -40,7 +40,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index dc287783..d211d16a 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/Source/HBIOS/Config/RCZ180_nat.asm @@ -40,7 +40,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index 5766331e..b0441884 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -33,10 +33,8 @@ ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -; -SN76489ENABLE .SET FALSE ; SN76489 SOUND DRIVER diff --git a/Source/HBIOS/Config/SBC_std.asm b/Source/HBIOS/Config/SBC_std.asm index 16acc300..ec701781 100644 --- a/Source/HBIOS/Config/SBC_std.asm +++ b/Source/HBIOS/Config/SBC_std.asm @@ -33,7 +33,7 @@ CVDUENABLE .SET TRUE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) VGAENABLE .SET TRUE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] +FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; diff --git a/Source/HBIOS/Config/SCZ180_126.asm b/Source/HBIOS/Config/SCZ180_126.asm index 1da05c4b..e7549ccc 100644 --- a/Source/HBIOS/Config/SCZ180_126.asm +++ b/Source/HBIOS/Config/SCZ180_126.asm @@ -42,7 +42,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; diff --git a/Source/HBIOS/Config/SCZ180_130.asm b/Source/HBIOS/Config/SCZ180_130.asm index 13fc2f03..45b0cae3 100644 --- a/Source/HBIOS/Config/SCZ180_130.asm +++ b/Source/HBIOS/Config/SCZ180_130.asm @@ -48,7 +48,7 @@ ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET FALSE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_131.asm b/Source/HBIOS/Config/SCZ180_131.asm index c3b75a80..8a659714 100644 --- a/Source/HBIOS/Config/SCZ180_131.asm +++ b/Source/HBIOS/Config/SCZ180_131.asm @@ -49,7 +49,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; diff --git a/Source/HBIOS/audio.inc b/Source/HBIOS/audio.inc index e1a9fbe4..a3ca68da 100644 --- a/Source/HBIOS/audio.inc +++ b/Source/HBIOS/audio.inc @@ -6,10 +6,13 @@ #DEFINE AUDTRACE_E PUSH AF \ LD A, E \ CALL PRTHEXBYTE \ POP AF #DEFINE AUDTRACE_L PUSH AF \ LD A, L \ CALL PRTHEXBYTE \ POP AF #DEFINE AUDTRACE_HL CALL PRTHEXWORDHL -#DEFINE AUDTRACE_DE PUSH DE \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP DE +#DEFINE AUDTRACE_BC PUSH HL \ PUSH BC \ POP HL \ CALL PRTHEXWORDHL \ POP HL +#DEFINE AUDTRACE_DE PUSH HL \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP HL #DEFINE AUDTRACE_IY PUSH HL \ PUSH IY \ POP HL \ CALL PRTHEXWORDHL \ POP HL -#DEFINE AUDDEBUG(S) CALL PRTSTRD \ .TEXT S \ .TEXT "$" ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED +#DEFINE AUDDEBUG(S) push hl \ CALL PRTSTRD \ .TEXT S \ .TEXT "$" \ pop hl ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED + +#DEFINE AUDTRACE_CR AUDDEBUG("\r\n$") #ELSE #DEFINE AUDTRACE(S) @@ -18,9 +21,55 @@ #DEFINE AUDTRACE_D #DEFINE AUDTRACE_E #DEFINE AUDTRACE_L +#DEFINE AUDTRACE_BC #DEFINE AUDTRACE_HL #DEFINE AUDTRACE_DE #DEFINE AUDTRACE_IY #DEFINE AUDDEBUG(STR) + +#DEFINE AUDTRACE_CR #ENDIF + + +#IFNDEF AUDIOUTILS +#DEFINE AUDIOUTILS + +AUD_NOTE: + AUDDEBUG("AUDNOTE ") + AUDTRACE_HL + AUDTRACE_CR + AUDTRACE_DE + AUDTRACE_CR + + push de + LD DE, 48 + CALL DIV16 + ; BC IS OCTAVE COUNT + ; HL is NOTE WITIN OCTAVE + ADD HL, HL + pop de + ADD HL, DE + + LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL + INC HL + LD H, (HL) + LD L, A + + INC C +AUD_NOTE1: + DEC C + JR Z, AUD_NOTE2 + SRL H + RR L + JR AUD_NOTE1 + +AUD_NOTE2: + LD A, L ; IF NOT ZERO + OR H + RET NZ ; RETURN THE CALCULATED PERIOD + + LD H, $FF ; OTHERWISE RETURN -1 PERIOD (ERROR) + LD L, $FF + RET +#ENDIF \ No newline at end of file diff --git a/Source/HBIOS/ay.asm b/Source/HBIOS/ay.asm deleted file mode 100644 index 85d9b9e2..00000000 --- a/Source/HBIOS/ay.asm +++ /dev/null @@ -1,122 +0,0 @@ -; -;====================================================================== -; PSG AY-3-8910 DRIVER FOR CONSOLE BELL -; WILL ALSO WORK WITH YM2149 -;====================================================================== -; -#IF (AYMODE == AYMODE_SCG) -AY_RSEL .EQU $9A -AY_RDAT .EQU $9B -AY_ACR .EQU $9C -#ENDIF -; -#IF (AYMODE == AYMODE_N8) -AY_RSEL .EQU $9C -AY_RDAT .EQU $9D -AY_ACR .EQU N8_DEFACR -#ENDIF -; -#IF (AYMODE == AYMODE_RCZ80) -AY_RSEL .EQU $D8 -AY_RDAT .EQU $D0 -#ENDIF -; -#IF (AYMODE == AYMODE_RCZ180) -AY_RSEL .EQU $68 -AY_RDAT .EQU $60 -#ENDIF -; -AY_R0CHAP .EQU $00 -AY_R1CHAP .EQU $01 -AY_R2CHBP .EQU $02 -AY_R3CHBP .EQU $03 -AY_R7ENAB .EQU $07 -AY_R8AVOL .EQU $08 -AY_R9BVOL .EQU $09 -; -;====================================================================== -; PSG AY-3-8910 DRIVER - INITIALIZATION -;====================================================================== -; -AY_INIT: - CALL NEWLINE ; FORMATTING - PRTS("AY: IO=0x$") - LD A,AY_RSEL - CALL PRTHEXBYTE - CALL AY_PROBE ; CHECK FOR HW EXISTENCE - JR Z,AY_INIT1 ; CONTINUE IF PRESENT -; -; HARDWARE NOT PRESENT -; - PRTS(" NOT PRESENT$") - OR $FF ; SIGNAL FAILURE - RET -; -AY_INIT1: - CALL AY_INIT2 - CALL AY_BEEP -AY_INIT2: - LD D,AY_R7ENAB ; SET MIXER CONTROL / IO ENABLE - LD E,$FF ; $FF - 11 111 111 - CALL AY_WRTPSG ; I/O PORTS DISABLED, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A DISABLE -; - LD B,2 - LD D,AY_R8AVOL ; SET VOLUME TO 0 - LD E,$00 -AY_QUIET: - CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS - INC A - DJNZ AY_QUIET - RET -; -; PLAY A BEEP TONE ON CENTER CHANNEL (LEFT AND RIGHT SPEAKERS) -; -AY_BEEP: - LD D,AY_R2CHBP ; SET TONE PERIOD - LD E,$55 ; CHANNEL B - R00 & R01 - CALL AY_WRTPSG ; $0055 = XXXX0000 01010101 - LD D,AY_R3CHBP - LD E,0 - CALL AY_WRTPSG -; - LD D,AY_R7ENAB ; $FD = 11 111 101 - LD E,$FD ; SET MIXER CONTROL / IO ENABLE - CALL AY_WRTPSG ; I/O PORTS DISABLED, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL B ENABLE -; - LD D,AY_R9BVOL - LD E,$07 ; SET CHANNEL B VOLUME TO 50% (7/16) - CALL AY_WRTPSG -; - CALL LDELAY ; HALF SECOND - RET -; -; WRITE DATA E TO PSG REG A -; -AY_WRTPSG: - HB_DI -#IF (CPUFAM == CPU_Z180) - IN0 A,(Z180_DCNTL) ; GET WAIT STATES - PUSH AF ; SAVE VALUE - OR %00110000 ; FORCE SLOW OPERATION (I/O W/S=3) - OUT0 (Z180_DCNTL),A ; AND UPDATE DCNTL -#ENDIF - LD A,D - OUT (AY_RSEL),A - LD A,E - OUT (AY_RDAT),A -#IF (CPUFAM == CPU_Z180) - POP AF ; GET SAVED DCNTL VALUE - OUT0 (Z180_DCNTL),A ; AND RESTORE IT -#ENDIF - HB_EI - RET -; -; CHECK THERE IS A DEVICE PRESENT -; -AY_PROBE: -#IF ((AYMODE == AYMODE_SCG) | (AYMODE == AYMODE_N8)) - LD A,$FF - OUT (AY_ACR),A ; INIT AUX CONTROL REG -#ENDIF - XOR A - RET diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm new file mode 100644 index 00000000..01dc90a5 --- /dev/null +++ b/Source/HBIOS/ay38910.asm @@ -0,0 +1,494 @@ +;====================================================================== +; +; AY-3-8910 / YM2149 SOUND DRIVER +; +;====================================================================== +; +AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE +; +#IF (AYMODE == AYMODE_SCG) +AY_RSEL .EQU $9A +AY_RDAT .EQU $9B +AY_RIN .EQU AY_RSEL +AY_ACR .EQU $9C +#ENDIF +; +#IF (AYMODE == AYMODE_N8) +AY_RSEL .EQU $9C +AY_RDAT .EQU $9D +AY_RIN .EQU AY_RSEL +AY_ACR .EQU N8_DEFACR +#ENDIF +; +#IF (AYMODE == AYMODE_RCZ80) +AY_RSEL .EQU $D8 +AY_RDAT .EQU $D0 +AY_RIN .EQU AY_RSEL+AY_RCSND +#ENDIF +; +#IF (AYMODE == AYMODE_RCZ180) +AY_RSEL .EQU $68 +AY_RDAT .EQU $60 +AY_RIN .EQU AY_RSEL+AY_RCSND +#ENDIF +; +;====================================================================== +; +; REGISTERS +; +AY_R2CHBP .EQU $02 +AY_R3CHBP .EQU $03 +AY_R7ENAB .EQU $07 +AY_R8AVOL .EQU $08 +; +;====================================================================== +; +; DRIVER FUNCTION TABLE AND INSTANCE DATA +; +AY_FNTBL: + .DW AY_RESET + .DW AY_VOLUME + .DW AY_PERIOD + .DW AY_NOTE + .DW AY_PLAY + .DW AY_QUERY + +#IF (($ - AY_FNTBL) != (SND_FNCNT * 2)) + .ECHO "*** INVALID SND FUNCTION TABLE ***\n" + !!!!! +#ENDIF +; +AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE +; +;====================================================================== +; +; DEVICE CAPABILITIES AND CONFIGURATION +; +SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER +; +AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS +AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS +; +AY_PHICLK .EQU 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 +;AY_PHICLK .EQU 3500000 ; ZX SPECTRUM 3.5MHZ +;AY_PHICLK .EQU 4000000 ; RETROBREW SCB-SCG +AY_RATIO .EQU AY_CLK * 100 / 16 +; +#INCLUDE "audio.inc" +; +;====================================================================== +; +; DRIVER INITIALIZATION (THERE IS NO PRE-INITIALIZATION) +; +; ANNOUNCE DEVICE ON CONSOLE. ACTIVATE DEVICE IF REQUIRED. +; SETUP FUNCTION TABLES. SETUP THE DEVICE. +; ANNOUNCE DEVICE WITH BEEP. SET VOLUME OFF. +; RETURN INITIALIZATION STATUS +; +AY38910_INIT: + CALL NEWLINE ; ANNOUNCE + PRTS("AY: IO=0x$") + LD A,AY_RSEL + CALL PRTHEXBYTE +; +#IF ((AYMODE == AYMODE_SCG) | (AYMODE == AYMODE_N8)) + LD A,$FF ; ACTIVATE DEVICEBIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED + OUT (AY_ACR),A ; SET INIT AUX CONTROL REG +#ENDIF +; + LD DE,(AY_R2CHBP*256)+$55 ; SIMPLE HARDWARE PROBE + CALL AY_WRTPSG ; WRITE AND + CALL AY_RDPSG ; READ TO A + LD A,$55 ; SOUND CHANNEL + CP E ; REGISTER + JR Z,AY_FND +; + CALL PRTSTRD \ .TEXT " NOT PRESENT$" +; + LD A,$FF ; UNSUCCESSFULL INIT + RET +; +AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE + LD BC, AY_FNTBL ; POINTER TO INSTANCE DATA + LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS + CALL SND_ADDENT ; DE := INSTANCE DATA PTR +; + CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION +; + LD E,$07 ; SET VOLUME TO 50% + CALL AY_SETV ; ON ALL CHANNELS +; +; LD DE,(AY_R2CHBP*256)+$55 ; BEEP ON CHANNEL B (CENTER) +; CALL AY_WRTPSG ; R02 = $55 = 01010101 + LD DE,(AY_R3CHBP*256)+$00 + CALL AY_WRTPSG ; R03 = $00 = XXXX0000 +; + CALL LDELAY ; HALF SECOND DELAY +; + LD E,$00 ; SET VOLUME OFF + CALL AY_SETV ; ON ALL CHANNELS +; + XOR A ; SUCCESSFULL INIT + RET +; +;====================================================================== +; INITIALIZE DEVICE +;====================================================================== +; +AY_INIT: + LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000 + CALL AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE + RET +; +;====================================================================== +; SET VOLUME ALL CHANNELS +;====================================================================== +; +AY_SETV: + PUSH BC + LD B,AY_TONECNT ; NUMBER OF CHANNELS + LD D,AY_R8AVOL ; BASE REGISTER FOR VOLUME +AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS + INC D + DJNZ AY_SV + POP BC + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - RESET +; +; INITIALIZE DEVICE. SET VOLUME OFF. RESET VOLUME AND TONE VARIABLES. +; +;====================================================================== +; +AY_RESET: + AUDTRACE(AYT_INIT) +; + PUSH DE + PUSH HL + CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION +; + AUDTRACE(AYT_VOLOFF) + LD E,0 ; SET VOLUME OFF + CALL AY_SETV ; ON ALL CHANNELS +; + XOR A ; SIGNAL SUCCESS + LD (AY_PENDING_VOLUME),A ; SET VOLUME TO ZERO + LD H,A + LD L,A + LD (AY_PENDING_PERIOD),HL ; SET TONE PERIOD TO ZERO +; + POP HL + POP DE + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - VOLUME +;====================================================================== +; +AY_VOLUME: + AUDTRACE(AYT_VOL) + AUDTRACE_L + AUDTRACE_CR + LD A,L ; SAVE VOLUME + LD (AY_PENDING_VOLUME), A +; + XOR A ; SIGNAL SUCCESS + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - NOTE +;====================================================================== +; +AY_NOTE: + AUDTRACE(AYT_NOTE) + AUDTRACE_HL + AUDTRACE_CR + + LD DE, AY3NOTETBL + CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU + ; TO SET THIS PERIOD +; +;====================================================================== +; SOUND DRIVER FUNCTION - PERIOD +;====================================================================== +; +AY_PERIOD: + AUDTRACE(AYT_PERIOD) + AUDTRACE_HL + AUDTRACE_CR + + LD A, H ; IF ZERO - ERROR + OR L + JR Z, AY_PERIOD1 + + LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS + AND 11110000B ; ALLOWED RANGE IS 0001-0FFF (4095) + JR NZ, AY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE + LD (AY_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL + RET +; +AY_PERIOD1: + LD A, $FF ; REQUESTED PERIOD IS LARGER + LD (AY_PENDING_PERIOD), A ; THAN THE DEVICE CAN SUPPORT + LD (AY_PENDING_PERIOD+1), A; SO SET PERIOD TO FFFF + RET ; AND RETURN FAILURE +; +;====================================================================== +; SOUND DRIVER FUNCTION - PLAY +; B = FUNCTION +; C = AUDIO DEVICE +; D = CHANNEL +; A = EXIT STATUS +;====================================================================== +; +AY_PLAY: + AUDTRACE(AYT_PLAY) + AUDTRACE_D + AUDTRACE_CR +; + LD A, (AY_PENDING_PERIOD + 1) ; CHECK THE HIGH BYTE OF THE PERIOD + INC A + JR Z, AY_PLAY1 ; PERIOD IS TOO LARGE, UNABLE TO PLAY +; + PUSH HL + PUSH DE + LD A,D ; LIMIT CHANNEL 0-2 + AND $3 ; AND INDEX TO THE + ADD A,A ; CHANNEL REGISTER + LD D,A ; FOR THE TONE PERIOD +; + AUDTRACE(AYT_REGWR) + AUDTRACE_A + AUDTRACE_CR +; + LD HL,AY_PENDING_PERIOD ; WRITE THE LOWER + ld E,(HL) ; 8-BITS OF THE TONE PERIOD + CALL AY_WRTPSG + INC D ; NEXT REGISTER + INC HL ; NEXT BYTE + LD E,(HL) ; WRITE THE UPPER + CALL AY_WRTPSG ; 8-BITS OF THE TONE PERIOD +; + POP DE ; RECALL CHANNEL + PUSH DE ; SAVE CHANNEL +; + LD A,D ; LIMIT CHANNEL 0-2 + AND $3 ; AND INDEX TO THE + ADD A,AY_R8AVOL ; CHANNEL VOLUME + LD D,A ; REGISTER +; + AUDTRACE(AYT_REGWR) + AUDTRACE_A + AUDTRACE_CR +; + INC HL ; NEXT BYTE + LD A,(HL) ; PENDING VOLUME + RRCA ; MAP THE VOLUME + RRCA ; FROM 00-FF + RRCA ; TO 00-0F + RRCA + AND $0F + LD E,A + CALL AY_WRTPSG ; SET VOL (E) IN CHANNEL REG (D) +; + POP DE ; RECALL CHANNEL + POP HL +; + XOR A ; SIGNAL SUCCESS + RET +; +AY_PLAY1: + PUSH DE ; TURN VOLUME OFF TO STOP PLAYING + LD A,D ; LIMIT CHANNEL 0-2 + AND $3 ; AND INDEX TO THE + ADD A,AY_R8AVOL ; CHANNEL VOLUME + LD D,A ; REGISTER + LD E,0 + CALL AY_WRTPSG ; SET VOL (E) IN CHANNEL REG (D) + POP DE + OR $FF ; SIGNAL FAILURE + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS +;====================================================================== +; +AY_QUERY: + LD A, E + CP BF_SNDQ_CHCNT ; SUB FUNCTION 01 + JR Z, AY_QUERY_CHCNT +; + CP BF_SNDQ_VOLUME ; SUB FUNCTION 02 + JR Z, AY_QUERY_VOLUME +; + CP BF_SNDQ_PERIOD ; SUB FUNCTION 03 + JR Z, AY_QUERY_PERIOD +; + CP BF_SNDQ_DEV ; SUB FUNCTION 04 + JR Z, AY_QUERY_DEV +; + OR $FF ; SIGNAL FAILURE + RET +; +AY_QUERY_CHCNT: + LD BC,(AY_TONECNT*256)+AY_NOISECNT ; RETURN NUMBER OF + XOR A ; TONE AND NOISE + RET ; CHANNELS IN BC +; +AY_QUERY_PERIOD: + LD HL, (AY_PENDING_PERIOD) ; RETURN 16-BIT PERIOD + XOR A ; IN HL REGISTER + RET +; +AY_QUERY_VOLUME: + LD A, (AY_PENDING_VOLUME) ; RETURN 8-BIT VOLUME + LD L, A ; IN L REGISTER + XOR A +; LD H, A + RET +; +AY_QUERY_DEV: + LD B, BF_SND_AY38910 ; RETURN DEVICE IDENTIFIER + LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT + XOR A + RET +; +;====================================================================== +; +; WRITE DATA IN E REGISTER TO DEVICE REGISTER D +; INTERRUPTS DISABLE DURING WRITE. WRITE IN SLOW MODE IF Z180 CPU. +; +;====================================================================== +; +AY_WRTPSG: + HB_DI +#IF (SBCV2004) + LD A,8 ; SBC-V2-004 CHANGE + OUT (112),A ; TO HALF CLOCK SPEED +#ENDIF +#IF (CPUFAM == CPU_Z180) + IN0 A,(Z180_DCNTL) ; GET WAIT STATES + PUSH AF ; SAVE VALUE + OR %00110000 ; FORCE SLOW OPERATION (I/O W/S=3) + OUT0 (Z180_DCNTL),A ; AND UPDATE DCNTL +#ENDIF + LD A,D ; SELECT THE REGISTER WE + OUT (AY_RSEL),A ; WANT TO WRITE TO + LD A,E ; WRITE THE VALUE TO + OUT (AY_RDAT),A ; THE SELECTED REGISTER +#IF (CPUFAM == CPU_Z180) + POP AF ; GET SAVED DCNTL VALUE + OUT0 (Z180_DCNTL),A ; AND RESTORE IT +#ENDIF +#IF (SBCV2004) + LD A,0 ; SBC-V2-004 CHANGE TO + OUT (112),A ; NORMAL CLOCK SPEED +#ENDIF + HB_EI + RET + +; +;====================================================================== +; +; READ FROM REGISTER D AND RETURN WITH RESULT IN E +; +AY_RDPSG: + HB_DI +#IF (SBCV2004) + LD A,8 ; SBC-V2-004 CHANGE + OUT (112),A ; TO HALF CLOCK SPEED +#ENDIF +#IF (CPUFAM == CPU_Z180) + IN0 A,(Z180_DCNTL) ; GET WAIT STATES + PUSH AF ; SAVE VALUE + OR %00110000 ; FORCE SLOW OPERATION (I/O W/S=3) + OUT0 (Z180_DCNTL),A ; AND UPDATE DCNTL +#ENDIF + LD A,D ; SELECT THE REGISTER WE + OUT (AY_RSEL),A ; WANT TO READ + IN A,(AY_RIN) ; READ SELECTED REGISTER + LD E,A +#IF (CPUFAM == CPU_Z180) + POP AF ; GET SAVED DCNTL VALUE + OUT0 (Z180_DCNTL),A ; AND RESTORE IT +#ENDIF +#IF (SBCV2004) + LD A,0 ; SBC-V2-004 CHANGE TO + OUT (112),A ; NORMAL CLOCK SPEED +#ENDIF + HB_EI + RET +; +;====================================================================== +; +AY_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) ; ORDER +AY_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) ; SIGNIFICANT +; +#IF AUDIOTRACE +AYT_INIT .DB "\r\nAY_INIT\r\n$" +AYT_VOLOFF .DB "\r\nAY_VOLUME OFF\r\n$" +AYT_VOL .DB "\r\nAY_VOLUME: $" +AYT_NOTE .DB "\r\nAY_NOTE: $" +AYT_PERIOD .DB "\r\nAY_PERIOD $" +AYT_PLAY .DB "\r\nAY_PLAY CH: $" +AYT_REGWR .DB "\r\nOUT AY-3-8910 $" +#ENDIF +; +;====================================================================== +; BBC MICRO QUARTER TONE FREQUENCY TABLE +;====================================================================== +; +; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCATVE 0 +; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP) +; FIRST PLAYABLE NOTE WILL BE 0 +; ASSUMING A CLOCK OF 1843200 THIS MAPS TO A0# +AY3NOTETBL: + .DW AY_RATIO / 2913 + .DW AY_RATIO / 2956 + .DW AY_RATIO / 2999 + .DW AY_RATIO / 3042 + .DW AY_RATIO / 3086 + .DW AY_RATIO / 3131 + .DW AY_RATIO / 3177 + .DW AY_RATIO / 3223 + .DW AY_RATIO / 3270 + .DW AY_RATIO / 3318 + .DW AY_RATIO / 3366 + .DW AY_RATIO / 3415 + .DW AY_RATIO / 3464 + .DW AY_RATIO / 3515 + .DW AY_RATIO / 3566 + .DW AY_RATIO / 3618 + .DW AY_RATIO / 3670 + .DW AY_RATIO / 3724 + .DW AY_RATIO / 3778 + .DW AY_RATIO / 3833 + .DW AY_RATIO / 3889 + .DW AY_RATIO / 3945 + .DW AY_RATIO / 4003 + .DW AY_RATIO / 4061 + .DW AY_RATIO / 4120 + .DW AY_RATIO / 4180 + .DW AY_RATIO / 4241 + .DW AY_RATIO / 4302 + .DW AY_RATIO / 4365 + .DW AY_RATIO / 4428 + .DW AY_RATIO / 4493 + .DW AY_RATIO / 4558 + .DW AY_RATIO / 4624 + .DW AY_RATIO / 4692 + .DW AY_RATIO / 4760 + .DW AY_RATIO / 4829 + .DW AY_RATIO / 4899 + .DW AY_RATIO / 4971 + .DW AY_RATIO / 5043 + .DW AY_RATIO / 5116 + .DW AY_RATIO / 5191 + .DW AY_RATIO / 5266 + .DW AY_RATIO / 5343 + .DW AY_RATIO / 5421 + .DW AY_RATIO / 5499 + .DW AY_RATIO / 5579 + .DW AY_RATIO / 5661 + .DW AY_RATIO / 5743 diff --git a/Source/HBIOS/bqrtc.asm b/Source/HBIOS/bqrtc.asm index 34854e22..f1c6a751 100644 --- a/Source/HBIOS/bqrtc.asm +++ b/Source/HBIOS/bqrtc.asm @@ -159,6 +159,10 @@ BQRTC_DISPATCH: JP Z, BQRTC_GETALM ; Get Alarm DEC A JP Z, BQRTC_SETALM ; Set Alarm + DEC A + JP Z, BQRTC_DEVICE ; Report RTC device info + CALL PANIC + ; ; NVRAM FUNCTIONS ARE NOT AVAILABLE ; @@ -328,6 +332,14 @@ BQRTC_SETALM: ; clean up and return XOR A ; Signal success RET ; And return +; +; REPORT RTC DEVICE INFO +; +BQRTC_DEVICE: + LD D,RTCDEV_BQ ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + XOR A ; SIGNAL SUCCESS + RET BQRTC_SUSPEND: IN0 A, (BQRTC_CONTROL) ; Suspend Clock diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 1322676b..52773af2 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -93,16 +93,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_DYNO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_DYNO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -156,6 +152,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 99e94ced..d604eb3e 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 10000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -118,16 +118,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -181,6 +177,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index c5ad1178..2b1baa7c 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -18,7 +18,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -156,16 +156,12 @@ TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_NONE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_NONE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -236,6 +232,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 0b247c57..8889fd05 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -111,16 +111,12 @@ TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -190,6 +186,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 20f54fb2..700fc0f7 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -114,16 +114,12 @@ TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU TRUE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -190,6 +186,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 6a2b259d..2e77375b 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -121,16 +121,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -190,6 +186,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index f69bdbaf..f52fcf3a 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 7372800 ; CPU OSC FREQ IN MHZ INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -139,16 +139,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -208,6 +204,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 0e751225..650d4eae 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -115,16 +115,12 @@ TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -192,6 +188,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 24abe9f0..dcc39d72 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -116,16 +116,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -185,6 +181,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_una.asm b/Source/HBIOS/cfg_una.asm index 058eca9e..10821319 100644 --- a/Source/HBIOS/cfg_una.asm +++ b/Source/HBIOS/cfg_una.asm @@ -16,7 +16,7 @@ PLATFORM .EQU PLT_UNA ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO] BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA] ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 865f2506..14d8770e 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPT MODE: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -91,15 +91,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -136,6 +133,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 0109f702..1901511d 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -101,15 +101,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) -; -AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER -; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO] +FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] @@ -146,6 +143,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) - -SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +; AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 + +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 9e4c8a3a..7091f309 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -104,6 +104,8 @@ SERIALCMDLOOP: JP Z,FILLMEM ; FILL MEMORY COMMAND CP 'H' ; IS IT A "H" (Y/N) JP Z,HELP ; HELP COMMAND + CP 'X' ; IS IT A "X" (Y/N) + JP Z,HALT ; HALT COMMAND LD HL,TXT_COMMAND ; POINT AT ERROR TEXT CALL PRTSTRH ; PRINT COMMAND LABEL @@ -150,6 +152,16 @@ BOOT: LD HL,0 ; ADDRESS ZERO CALL HB_BNKCALL ; DOES NOT RETURN #ENDIF +; +;__HALT_______________________________________________________________________ +; +; PERFORM HALT ACTION +;_____________________________________________________________________________ +; +HALT: + DI + HALT +; ;__RUN________________________________________________________________________ ; ; TRANSFER OUT OF MONITOR, USER OPTION "R" @@ -912,6 +924,7 @@ TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):" .TEXT "\r\nO xx yy - Output to port xx value yy" .TEXT "\r\nP xxxx - Program RAM at xxxx" .TEXT "\r\nR xxxx - Run code at xxxx" + .TEXT "\r\nX - Halt system" .TEXT "$" ; #IF DSKYENABLE diff --git a/Source/HBIOS/diskdefs b/Source/HBIOS/diskdefs index 937bfcf2..a03e42f0 100644 --- a/Source/HBIOS/diskdefs +++ b/Source/HBIOS/diskdefs @@ -297,121 +297,169 @@ diskdef wbw_rom1024 os 2.2 end -# UNA 512KB ROM (128KB reserved, 384KB ROM Disk) +# RomWBW 720K floppy media +diskdef wbw_fd720 + seclen 512 + tracks 160 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 2.2 +end -diskdef una_rom512 +# RomWBW 1.44M floppy media +diskdef wbw_fd144 seclen 512 - tracks 12 - sectrk 64 + tracks 160 + sectrk 18 blocksize 2048 maxdir 256 skew 0 - boottrk 0 + boottrk 2 os 2.2 end -# UNA 512KB ROM (128KB reserved, 896KB ROM Disk) +# RomWBW 360K floppy media +diskdef wbw_fd360 + seclen 512 + tracks 80 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 2.2 +end -diskdef una_rom1024 +# RomWBW 1.20M floppy media +diskdef wbw_fd120 seclen 512 - tracks 28 - sectrk 64 + tracks 160 + sectrk 15 blocksize 2048 maxdir 256 skew 0 - boottrk 0 + boottrk 2 os 2.2 end -# RomWBW 8MB Hard Disk, LU 0-3 +# RomWBW 8320KB Hard Disk Slice +# Legacy format, 512 dir entries, 16,630 sectors / slice +diskdef wbw_hd + seclen 512 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 512 + skew 0 + boottrk 16 + os 2.2 +end + +# First 4 slices of wbw_hd diskdef wbw_hd0 seclen 512 - tracks 65 - sectrk 256 + tracks 1040 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 1 + boottrk 16 os 2.2 end diskdef wbw_hd1 seclen 512 - tracks 130 - sectrk 256 + tracks 2080 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 66 + boottrk 1056 os 2.2 end diskdef wbw_hd2 seclen 512 - tracks 195 - sectrk 256 + tracks 3120 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 131 + boottrk 2096 os 2.2 end diskdef wbw_hd3 seclen 512 - tracks 260 - sectrk 256 + tracks 4160 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 196 + boottrk 3136 os 2.2 end -# RomWBW 720K floppy media -diskdef wbw_fd720 + +# RomWBW 8MB Hard Disk +# New format, 1024 dir entries, 16,384 sectors / slice +# Pure filesystem image, no prefix +diskdef wbw_hdnew seclen 512 - tracks 160 - sectrk 9 - blocksize 2048 - maxdir 128 + tracks 1024 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 4 + boottrk 2 os 2.2 end -# RomWBW 1.44M floppy media -diskdef wbw_fd144 +# First 4 slices of wbw_hdnew +# Assumes 128KB prefix (256 sectors) +diskdef wbw_hdnew0 seclen 512 - tracks 160 - sectrk 18 - blocksize 2048 - maxdir 256 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 2 + boottrk 18 os 2.2 end -# RomWBW 360K floppy media -diskdef wbw_fd360 +diskdef wbw_hdnew1 seclen 512 - tracks 80 - sectrk 9 - blocksize 2048 - maxdir 128 + tracks 2064 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 4 + boottrk 1042 os 2.2 end -# RomWBW 1.20M floppy media -diskdef wbw_fd120 +diskdef wbw_hdnew2 seclen 512 - tracks 160 - sectrk 15 - blocksize 2048 - maxdir 256 + tracks 3112 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 2 + boottrk 2066 + os 2.2 +end + +diskdef wbw_hdnew3 + seclen 512 + tracks 4136 + sectrk 16 + blocksize 4096 + maxdir 1024 + skew 0 + boottrk 3114 os 2.2 end diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index 5bcd596f..01d2f171 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -235,12 +235,20 @@ DSRTC_DISPATCH: JP Z,DSRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES DEC A JP Z,DSRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + DEC A + JP Z,DSRTC_GETALM ; GET ALARM + DEC A + JP Z,DSRTC_SETALM ; SET ALARM + DEC A + JP Z,DSRTC_DEVICE ; REPORT RTC DEVICE INFO CALL PANIC ; ; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR ; DSRTC_GETBLK: DSRTC_SETBLK: +DSRTC_GETALM: +DSRTC_SETALM: CALL PANIC ; ; RTC GET TIME @@ -350,6 +358,14 @@ DSRTC_SETBYT: XOR A ; SIGNAL SUCCESS RET ; DONE ; +; REPORT RTC DEVICE INFO +; +DSRTC_DEVICE: + LD D,RTCDEV_DS ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + XOR A ; SIGNAL SUCCESS + RET +; ; CONVERT DATA IN CLOCK BUFFER TO TIME BUFFER AT HL ; DSRTC_CLK2TIM: diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index df2673be..b35c1e73 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -61,6 +61,13 @@ FDC_DOR .EQU FDC_BASE + $02 ; DIGITAL OUTPUT REGISTER FDC_DCR .EQU FDC_BASE + $03 ; CONFIGURATION CONTROL REGISTER FDC_TC .EQU FDC_BASE + $02 ; TERMINAL COUNT (W/ DACK) #ENDIF +#IF (FDMODE == FDMODE_EPFDC) +FDC_MSR .EQU $48 ; 8272 MAIN STATUS REGISTER +FDC_DATA .EQU $49 ; 8272 DATA PORT +FDC_DOR .EQU $4A ; DIGITAL OUTPUT REGISTER +FDC_DCR .EQU $4B ; CONFIGURATION CONTROL REGISTER +FDC_TC .EQU $4C ; TERMINAL COUNT (W/ DACK) +#ENDIF ; ; DISK OPERATIONS ; @@ -94,7 +101,7 @@ FRC_TOSEEKWT .EQU -15H ; EB ; ; FD DEVICE CONFIGURATION ; -FD_DEVCNT .EQU 2 ; 2 DEVICES SUPPORTED +FD_DEVCNT .EQU FDCNT ; 2 DEVICES SUPPORTED FD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS @@ -399,7 +406,7 @@ DOR_INIT .EQU 11100000B ; INITIAL DEFAULT LATCH VALUE ; ; *** DIDE/N8/ZETA V2 *** ; -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) DOR_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED DOR_BR250 .EQU DOR_INIT DOR_BR500 .EQU DOR_INIT @@ -638,7 +645,9 @@ FD_INIT: PRTS("FD: IO=0x$") LD A,FDC_MSR CALL PRTHEXBYTE - PRTS(" UNITS=2$") + PRTS(" UNITS=$") + LD A, FD_DEVCNT + '0' + CALL COUT ; ; SETUP THE DISPATCH TABLE ENTRIES ; @@ -1235,7 +1244,7 @@ FC_SETDOR ; ; SET FST_DCR ; -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) ; FC_SETDCR LD (FST_DCR),A @@ -1267,7 +1276,7 @@ FC_RESETFDC: #IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_RCSMC)) RES 7,A #ENDIF -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) LD A,0 #ENDIF CALL FC_SETDOR @@ -1282,7 +1291,7 @@ FC_RESETFDC: ; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE ; FC_PULSETC: -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) IN A,(FDC_TC) #ELSE LD A,(FST_DOR) @@ -1299,7 +1308,7 @@ FC_MOTORON: ; LD BC,300H ; LD BC,50H ; LD (FCD_IDLECNT),BC - + LD A,(CB_CPUMHZ) RLCA LD (FCD_IDLECNT),A @@ -1339,7 +1348,7 @@ FC_MOTORON1: CP C ; COMPARE TO NEW MOTOR BITS RET Z ; SKIP DELAY, MOTOR WAS ALREADY ON #ENDIF -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) ; SETUP DCR FOR DIDE HARDWARE LD A,(FCD_DCR) ; GET NEW DCR VALUE CALL FC_SETDCR ; AND IMPLEMENT IT diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 6814f6fb..bf4faaca 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1283,7 +1283,7 @@ HB_CPU2: ; LD A,FORCECON ; CALCULATE PRE-INIT TABLE ; A IS INDEX OF CONSOLE DEVICE ENTRY RLCA ; ENTRY THAT WE WANT TO ; A IS OFFSET OF CONSOLE DEVICE ENTRY - LD DE,(HB_PCINITTBL) ; EXECUTE FIRST ; DE IS VALUE OF TOP ENTRY + LD DE,(HB_PCINITTBL) ; EXECUTE FIRST ; DE IS VALUE OF TOP ENTRY LD HL,HB_PCINITTBL ; HL IS ADDRESS OF TOP OF TABLE PUSH HL ; PUSH (1) TOP OF TABLE PUSH DE ; PUSH (2) VALUE OF TOP ENTRY @@ -1672,14 +1672,14 @@ HB_INITTBL: .DW CTC_INIT #ENDIF #IF (SPKENABLE) - .DW SPK_INIT ; AUDIBLE INDICATOR OF BOOT START -#ENDIF -#IF (AYENABLE) - .DW AY_INIT ; AUDIBLE INDICATOR OF BOOT START + .DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF #IF (SN76489ENABLE) .DW SN76489_INIT #ENDIF +#IF (AY38910ENABLE) + .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START +#ENDIF #IF (ASCIENABLE) .DW ASCI_INIT #ENDIF @@ -2289,7 +2289,7 @@ SND_ADDENT: ; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS) ; SND_FNCNT .EQU 6 ; NUMBER OF SND FUNCS (FOR RANGE CHECK) -SND_MAX .EQU 2 ; UP TO 2 UNITS +SND_MAX .EQU 3 ; UP TO 2 UNITS SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES ; .DB SND_FNCNT ; SND FUNCTION COUNT (FOR RANGE CHECK) @@ -2434,6 +2434,8 @@ SYS_GET: JR Z,SYS_GETCIOCNT CP BF_SYSGET_DIOCNT JR Z,SYS_GETDIOCNT + CP BF_SYSGET_RTCCNT + JR Z,SYS_GETRTCCNT CP BF_SYSGET_VDACNT JR Z,SYS_GETVDACNT CP BF_SYSGET_SNDCNT @@ -2462,6 +2464,7 @@ SYS_GETTIMER: HB_DI CALL LD32 HB_EI + LD C, TICKFREQ XOR A RET ; @@ -2549,6 +2552,18 @@ SYS_GETDIOCNT: XOR A ; SIGNALS SUCCESS RET ; +; GET RTC UNIT COUNT +; +SYS_GETRTCCNT: + LD E,0 ; ASSUME 0 RTC DEVICES + LD A,(RTC_DISPACT) ; IS RTC ACTIVE? + OR A ; SET FLAGS + JR Z,SYS_GETRTCCNT1 ; IF NONE, DONE + INC E ; SET ONE DEVICE +SYS_GETRTCCNT1: + XOR A ; SIGNALS SUCCESS + RET +; ; GET VIDEO UNIT COUNT ; SYS_GETVDACNT: @@ -3311,15 +3326,6 @@ SIZ_SPK .EQU $ - ORG_SPK .ECHO " bytes.\n" #ENDIF ; -#IF (AYENABLE) -ORG_AY .EQU $ - #INCLUDE "ay.asm" -SIZ_AY .EQU $ - ORG_AY - .ECHO "AY occupies " - .ECHO SIZ_AY - .ECHO " bytes.\n" -#ENDIF -; #IF (PIO_4P | PIO_ZP | PPI_SBC) ORG_PIO .EQU $ #INCLUDE "pio.asm" @@ -3353,6 +3359,14 @@ SIZ_SN76489 .EQU $ - ORG_SN76489 .ECHO SIZ_SN76489 .ECHO " bytes.\n" #ENDIF +#IF (AY38910ENABLE) +ORG_AY38910 .EQU $ + #INCLUDE "ay38910.asm" +SIZ_AY38910 .EQU $ - ORG_AY38910 + .ECHO "AY38910 occupies " + .ECHO SIZ_AY38910 + .ECHO " bytes.\n" +#ENDIF ; #DEFINE USEDELAY #INCLUDE "util.asm" diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index ab921fdc..03ea58cb 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -32,6 +32,9 @@ BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK +BF_RTCGETALM .EQU BF_RTC + 6 ; GET ALARM +BF_RTCSETALM .EQU BF_RTC + 7 ; SET ALARM +BF_RTCDEVICE .EQU BF_RTC + 8 ; RTC DEVICE INFO REPORT ; BF_EMU .EQU $30 ; DEPRECATED ; @@ -66,11 +69,11 @@ BF_SNDQ_CHCNT .EQU BF_SNDQ_STATUS + 1 ; RETURN COUNT OF CHANNELS 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_SNAY38910 .EQU BF_SNDDEV + 2 - +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 @@ -89,6 +92,7 @@ BF_SYSINT .EQU BF_SYS + 12 ; MANAGE INTERRUPT VECTORS ; BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT +BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE @@ -108,6 +112,20 @@ BF_SYSINT_SET .EQU $20 ; SET INT VECTOR ADDRESS ; CIO_CONSOLE .EQU $80 ; CIO UNIT NUM FOR CUR CON ; +; MEDIA ID VALUES +; +MID_NONE .EQU 0 +MID_MDROM .EQU 1 +MID_MDRAM .EQU 2 +MID_RF .EQU 3 +MID_HD .EQU 4 +MID_FD720 .EQU 5 +MID_FD144 .EQU 6 +MID_FD360 .EQU 7 +MID_FD120 .EQU 8 +MID_FD111 .EQU 9 +MID_HDNEW .EQU 10 +; ; CHAR DEVICE IDS ; CIODEV_UART .EQU $00 @@ -141,6 +159,13 @@ DIODEV_PRPSD .EQU $70 DIODEV_PPPSD .EQU $80 DIODEV_HDSK .EQU $90 ; +; RTC DEVICE IDS +; +RTCDEV_DS .EQU $00 ; DS1322 +RTCDEV_BQ .EQU $10 ; BQ4845P +RTCDEV_SIMH .EQU $30 ; SIMH +RTCDEV_INT .EQU $40 ; PERIODIC INT TIMER +; ; VIDEO DEVICE IDS ; VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545 diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 3c8825bb..e6643dd1 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -27,10 +27,12 @@ HDSK_CFGTBL: .DB 0 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS .DW 0,0 ; CURRENT LBA +#IF (HDSK_DEVCNT >= 2) ; DEVICE 1 .DB 1 ; DEVICE NUMBER .DB 0 ; DEVICE STATUS .DW 0,0 ; CURRENT LBA +#ENDIF ; #IF ($ - HDSK_CFGTBL) != (HDSK_DEVCNT * HDSK_CFGSIZ) .ECHO "*** INVALID HDSK CONFIG TABLE ***\n" @@ -135,15 +137,11 @@ HDSK_RESET: ; ; GET DISK CAPACITY ; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE -; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS -; ASSUME 8 SLICES, SO 16640 X 8 = 133,120 TOTAL SECTORS -; -; 2048 TRKS X 16 HDS X 16 SPT = 524288 OR 80000H +; ASSUME 1GB MEDIA SIZE, SO 1GB / 512B +; IS $200000 SECTORS ; HDSK_CAP: - ;LD DE,133120 >> 16 ; BLOCK COUNT MSW - ;LD HL,133120 & $FFFF ; BLOCK COUNT LSW - LD DE,8 ; BLOCK COUNT MSW + LD DE,$20 ; BLOCK COUNT MSW LD HL,0 ; BLOCK COUNT LSW LD BC,512 ; 512 BYTE SECTOR XOR A ; SIGNAL SUCCESS diff --git a/Source/HBIOS/intrtc.asm b/Source/HBIOS/intrtc.asm index 0414a286..a7d05ac7 100644 --- a/Source/HBIOS/intrtc.asm +++ b/Source/HBIOS/intrtc.asm @@ -50,6 +50,12 @@ INTRTC_DISPATCH: JP Z,INTRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES DEC A JP Z,INTRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + DEC A + JP Z,INTRTC_GETALM ; GET ALARM + DEC A + JP Z,INTRTC_SETALM ; SET ALARM + DEC A + JP Z,INTRTC_DEVICE ; REPORT RTC DEVICE INFO CALL PANIC ; ; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR @@ -58,6 +64,8 @@ INTRTC_GETBYT: INTRTC_SETBYT: INTRTC_GETBLK: INTRTC_SETBLK: +INTRTC_GETALM: +INTRTC_SETALM: CALL PANIC ; ; RTC GET TIME @@ -119,6 +127,14 @@ INTRTC_SETTIM: XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; +; REPORT RTC DEVICE INFO +; +INTRTC_DEVICE: + LD D,RTCDEV_INT ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + XOR A ; SIGNAL SUCCESS + RET +; ; HANDLER FOR TIMER SECONDS INTERRUPT ; INTRTC_INT: diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 884c5cce..f17704ee 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -106,7 +106,7 @@ bid_cur .equ -1 ; used below to indicate current bank ; start: ld sp,bl_stack ; setup private stack - call DELAY_INIT ; init delay functions + call delay_init ; init delay functions ; ; Disable interrupts if IM1 is active because we are switching to page ; zero in user bank and it has not been prepared with IM1 vector yet. @@ -123,7 +123,7 @@ start: rst 08 ; do it ld a,c ; previous bank to A ld (bid_ldr),a ; save previous bank for later - cp BID_IMG0 ; starting from ROM? + bit 7,a ; starting from ROM? #endif ; #if (BIOS == BIOS_UNA) @@ -131,8 +131,7 @@ start: ld de,BID_USR ; select user bank rst 08 ; do it ld (bid_ldr),de ; ... for later - ld a,d ; starting from ROM? - or e ; ... bank == 0? + bit 7,d ; starting from ROM? #endif ; ; For app mode startup, use alternate table @@ -164,20 +163,22 @@ start1: call pstr ; do it call clrbuf ; zero fill the cmd buffer ; -#if (BOOT_TIMEOUT > 0) +#if (BOOT_TIMEOUT != -1) ; Initialize auto command timeout downcounter or $FF ; auto cmd active value ld (acmd_act),a ; set flag ld bc,BOOT_TIMEOUT * 100 ; hundredths of seconds ld (acmd_to),bc ; save auto cmd timeout - ;ld a,b ; check for - ;or c ; ... zero - ;jr nz,prompt ; not zero, prompt w/ timeout - ;call nl2 ; formatting - ;ld hl,str_boot ; command string prefix - ;call pstr ; show it - ;call autocmd ; else, handle w/o prompt - ;jr reprompt ; restart w/ autocmd disable +; + ; If timeout is zero, boot auto command immediately + ld a,b ; check for + or c ; ... zero + jr nz,prompt ; not zero, prompt w/ timeout + call nl2 ; formatting + ld hl,str_autoboot ; auto command prefix + call pstr ; show it + call autocmd ; handle w/o prompt + jr reprompt ; restart w/ autocmd disable #endif ; prompt: @@ -205,7 +206,7 @@ wtkey: jp nz,dskycmd ; if pending, do DSKY command #endif ; -#if (BOOT_TIMEOUT > 0) +#if (BOOT_TIMEOUT != -1) ; check for timeout and handle auto boot here ld a,(acmd_act) ; get auto cmd active flag or a ; set flags @@ -217,7 +218,7 @@ wtkey: dec bc ; decrement ld (acmd_to),bc ; resave it ld de,625 ; 16us * 625 = 10ms - call VDELAY ; 10ms delay + call vdelay ; 10ms delay #endif ; jr wtkey ; loop @@ -454,7 +455,7 @@ setcon: ld hl,str_newcon ; new console msg call pstr ; print string on cur console pop af ; restore new console unit - call PRTDECB ; print unit num + call prtdecb ; print unit num ; ; Set console unit ld b,BF_SYSPOKE ; HBIOS func: POKE @@ -477,7 +478,7 @@ setcon: reboot: ld hl,str_reboot ; point to message call pstr ; print it - call LDELAY ; wait for message to display + call ldelay ; wait for message to display ; #if (BIOS == BIOS_WBW) ; @@ -616,11 +617,11 @@ diskboot: ld hl,str_boot1 call pstr ld a,(bootunit) - call PRTDECB + call prtdecb ld hl,str_boot2 call pstr ld a,(bootslice) - call PRTDECB + call prtdecb ; #if (DSKYENABLE) ld hl,msg_load ; point to load message @@ -630,13 +631,22 @@ diskboot: #if (BIOS == BIOS_WBW) ; ; Check that drive actually exists - ld c,a ; put in C for func call ld b,BF_SYSGET ; HBIOS func: sys get ld c,BF_SYSGET_DIOCNT ; HBIOS sub-func: disk count rst 08 ; do it, E=disk count ld a,(bootunit) ; get boot disk unit cp e ; compare to count jp nc,err_nodisk ; handle no disk err +; + ; Sense media + ld a,(bootunit) ; get boot disk unit + ld c,a ; put in C for func call + ld b,BF_DIOMEDIA ; HBIOS func: media + ld e,1 ; enable media check/discovery + rst 08 ; do it + jp nz,err_diskio ; handle error + ld a,e ; media id to A + ld (mediaid),a ; save media id ; ; If non-zero slice requested, confirm device can handle it ld a,(bootslice) ; get slice @@ -650,40 +660,6 @@ diskboot: cp DIODEV_IDE ; IDE is max slice device type jp c,err_noslice ; no such slice, handle err ; -diskboot1: - ; Sense media - ld a,(bootunit) ; get boot disk unit - ld c,a ; put in C for func call - ld b,BF_DIOMEDIA ; HBIOS func: media - ld e,1 ; enable media check/discovery - rst 08 ; do it - jp nz,err_diskio ; handle error - call pdot ; show progress -; - ; Seek to boot info sector, third sector - ld a,(bootslice) ; get boot slice - ld e,a ; move to E for mult - ld h,65 ; 65 tracks per slice - call MULT8 ; hl := h * e - ld de,$0002 ; head 0, sector 2 - ld b,BF_DIOSEEK ; HBIOS func: seek - ld a,(bootunit) ; get boot disk unit - ld c,a ; put in C - rst 08 ; do it - jp nz,err_diskio ; handle error - call pdot ; show progress -; - ; Read sector into local buffer - ld b,BF_DIOREAD ; HBIOS func: disk read - ld a,(bootunit) ; get boot disk unit - ld c,a ; put in C for func call - ld hl,bl_infosec ; read into info sec buffer - ld d,BID_USR ; user bank - ld e,1 ; transfer one sector - rst 08 ; do it - jp nz,err_diskio ; handle error - call pdot ; show progress -; #endif ; #if (BIOS == BIOS_UNA) @@ -698,59 +674,129 @@ diskboot1: ; If non-zero slice requested, confirm device can handle it ld a,(bootslice) ; get slice or a ; set flags - jr z,diskboot1 ; slice 0, skip slice check + jr z,diskboot0 ; slice 0, skip slice check ld a,d ; disk type to A cp $41 ; IDE? - jr z,diskboot1 ; if so, OK + jr z,diskboot0 ; if so, OK cp $42 ; PPIDE? - jr z,diskboot1 ; if so, OK + jr z,diskboot0 ; if so, OK cp $43 ; SD? - jr z,diskboot1 ; if so, OK + jr z,diskboot0 ; if so, OK cp $44 ; DSD? - jr z,diskboot1 ; if so, OK + jr z,diskboot0 ; if so, OK jp err_noslice ; no such slice, handle err ; +diskboot0: + ; Below is wrong. It assumes we are booting from a hard + ; disk, but it could also be a RAM/ROM disk. However, it is + ; not actually possible to boot from those, so not gonna + ; worry about this. + ld a,4 ; assume legacy hard disk + ld (mediaid),a ; save media id +; +#endif +; diskboot1: + ; Initialize working LBA value + ld hl,0 ; zero HL + ld (lba),hl ; init + ld (lba+2),hl ; ... LBA +; + ; Set legacy sectors per slice + ld hl,16640 ; legacy sectors per slice + ld (sps),hl ; save it +; + ; Check for hard disk + ld a,(mediaid) ; load media id + cp 4 ; legacy hard disk? + jr nz,diskboot8 ; if not hd, no part table +; + ; Attempt to read MBR + ld de,0 ; MBR is at + ld hl,0 ; ... first sector + ld bc,bl_mbrsec ; read into MBR buffer + ld (dma),bc ; save + ld b,1 ; one sector + ld a,(bootunit) ; get bootunit + ld c,a ; put in C + call diskread ; do it + ret nz ; abort on error +; + ; Check signature + ld hl,(bl_mbrsec+$1FE) ; get signature + ld a,l ; first byte + cp $55 ; should be $55 + jr nz,diskboot4 ; if not, no part table + ld a,h ; second byte + cp $AA ; should be $AA + jr nz,diskboot4 ; if not, no part table +; + ; Try to find our entry in part table and capture lba offset + ld b,4 ; four entries in part table + ld hl,bl_mbrsec+$1BE+4 ; offset of first entry part type +diskboot2: + ld a,(hl) ; get part type + cp $2E ; cp/m partition? + jr z,diskboot3 ; cool, grab the lba offset + ld de,16 ; part table entry size + add hl,de ; bump to next entry part type + djnz diskboot2 ; loop thru table + jr diskboot4 ; too bad, no cp/m partition +; +diskboot3: + ; Capture the starting LBA of the CP/M partition we found + ld de,4 ; LBA is 4 bytes after part type + add hl,de ; point to it + ld de,lba ; loc to store lba offset + ld bc,4 ; 4 bytes (32 bits) + ldir ; copy it + ; If boot from partition, use new sectors per slice value + ld hl,16384 ; new sectors per slice + ld (sps),hl ; save it +; +diskboot4: ; Add slice offset ld a,(bootslice) ; get boot slice, A is loop cnt - ld hl,0 ; DE:HL is LBA - ld de,0 ; ... initialize to zero - ld bc,16640 ; sectors per slice -diskboot2: + ld hl,(lba) ; set DE:HL + ld de,(lba+2) ; ... to starting LBA + ld bc,(sps) ; sectors per slice +diskboot5: or a ; set flags to check loop ctr - jr z,diskboot4 ; done if counter exhausted + jr z,diskboot7 ; done if counter exhausted add hl,bc ; add one slice to low word - jr nc,diskboot3 ; check for carry + jr nc,diskboot6 ; check for carry inc de ; if so, bump high word -diskboot3: +diskboot6: dec a ; dec loop downcounter - jr diskboot2 ; and loop + jr diskboot5 ; and loop ; -diskboot4: - ld (loadlba),hl ; save lba, low word - ld (loadlba+2),de ; save lba, high word +diskboot7: + ld (lba),hl ; update lba, low word + ld (lba+2),de ; update lba, high word ; - ; Seek to boot info sector, third sector +diskboot8: + ; Note that we could be coming from diskboot1! + ld hl,str_ldsec ; display prefix + call pstr ; do it + ld hl,(lba) ; recover lba loword + ld de,(lba+2) ; recover lba hiword + call prthex32 ; display starting sector + call pdot ; show progress +; + ; Read boot info sector, third sector ld bc,2 ; sector offset add hl,bc ; add to LBA value low word - jr nc,diskboot5 ; check for carry + jr nc,diskboot9 ; check for carry inc de ; if so, bump high word -diskboot5: - ld a,(bootunit) ; get disk unit to boot - ld b,a ; put in B for func call - ld c,$41 ; UNA func: set lba - rst 08 ; set lba - jp nz,err_api ; handle error +diskboot9: + ld bc,bl_infosec ; read buffer + ld (dma),bc ; save + ld a,(bootunit) ; disk unit to read + ld c,a ; put in C + ld b,1 ; one sector + call diskread ; do it + ret nz ; abort on error call pdot ; show progress -; - ; Read sector into local buffer - ld c,$42 ; UNA func: read sectors - ld de,bl_infosec ; dest of cpm image - ld l,1 ; sectors to read - rst 08 ; do read - jp nz,err_diskio ; handle error -; -#endif ; ; Check signature ld de,(bb_sig) ; get signature read @@ -760,6 +806,7 @@ diskboot5: ld a,$5A ; expected value of second byte cp e ; compare jp nz,err_sig ; handle error + call pdot ; show progress ; ; Print disk boot info ; Volume "xxxxxxx" (0xXXXX-0xXXXX, entry @ 0xXXXX) @@ -772,17 +819,17 @@ diskboot5: call pstr ; print push hl ; save string ptr ld bc,(bb_cpmloc) ; get load loc - call PRTHEXWORD ; print it + call prthexword ; print it pop hl ; restore string ptr call pstr ; print push hl ; save string ptr ld bc,(bb_cpmend) ; get load end - call PRTHEXWORD ; print it + call prthexword ; print it pop hl ; restore string ptr call pstr ; print push hl ; save string ptr ld bc,(bb_cpment) ; get load end - call PRTHEXWORD ; print it + call prthexword ; print it pop hl ; restore string ptr call pstr ; print ; @@ -796,19 +843,25 @@ diskboot5: ld (loadcnt),a ; ... and save it call pdot ; show progress ; -#if (BIOS == BIOS_WBW) -; - ; Load image into memory - ld b,BF_DIOREAD ; HBIOS func: read sectors + ; Start OS load at sector 3 + ld hl,(lba) ; low word of saved LBA + ld de,(lba+2) ; high word of saved LBA + ld bc,3 ; offset for sector 3 + add hl,bc ; apply it + jr nc,diskboot10 ; check for carry + inc de ; bump high word if so +diskboot10: + ld bc,(bb_cpmloc) ; load address + ld (dma),bc ; and save it + ld a,(loadcnt) ; get sectors to read + ld b,a ; put in B ld a,(bootunit) ; get boot disk unit ld c,a ; put in C - ld hl,(bb_cpmloc) ; load address - ld d,BID_USR ; user bank - ld a,(loadcnt) ; get sectors to read - ld e,a ; number of sectors to load - rst 08 ; do it - jp nz,err_diskio ; handle errors + call diskread ; read image + ret nz ; abort on error call pdot ; show progress +; +#if (BIOS == BIOS_WBW) ; ; Record boot unit/slice ld b,BF_SYSSET ; hb func: set hbios parameter @@ -821,36 +874,10 @@ diskboot5: ld e,a ; save in E rst 08 jp nz,err_api ; handle errors - call pdot ; show progress ; #endif ; #if (BIOS == BIOS_UNA) -; - ; Start os load at sector 3 - ld hl,(loadlba) ; low word of saved LBA - ld de,(loadlba+2) ; high word of saved LBA - ld bc,3 ; offset for sector 3 - add hl,bc ; apply it - jr nc,diskboot6 ; check for carry - inc de ; bump high word if so -diskboot6: - ld c,$41 ; UNA func: set lba - ld a,(bootunit) ; get boot disk unit - ld b,a ; move to B - rst 08 ; set lba - jp nz,err_api ; handle error -; - ; Read OS image into memory - ld c,$42 ; UNA func: read sectors - ld a,(bootunit) ; get boot disk unit - ld b,a ; move to B - ld de,(bb_cpmloc) ; dest of cpm image - ld a,(loadcnt) ; get sectors to read - ld l,a ; sectors to read - rst 08 ; do read - jp nz,err_diskio ; handle error - call pdot ; show progress ; ; Record boot unit/slice ; UNA provides only a single byte to record the boot unit @@ -871,9 +898,10 @@ diskboot6: ld bc,$01FC ; UNA func: set bootstrap hist rst 08 ; call UNA jp nz,err_api ; handle error - call pdot ; show progress ; #endif +; + call pdot ; show progress ; #if (DSKYENABLE) ld hl,msg_go ; point to go message @@ -884,6 +912,55 @@ diskboot6: ld hl,(bb_cpment) ; get entry vector jp (hl) ; and go there ; +; Read disk sector(s) +; DE:HL is LBA, B is sector count, C is disk unit +; +diskread: +; +#if (BIOS == BIOS_UNA) +; + ; Seek to requested sector in DE:HL + push bc ; save unit and count + ld b,c ; unit to read in B + ld c,$41 ; UNA func: set lba + rst 08 ; set lba + pop bc ; recover unit and count + jp nz,err_api ; handle error +; + ; Read sector(s) into buffer + ld l,b ; sectors to read + ld b,c ; unit to read in B + ld c,$42 ; UNA func: read sectors + ld de,(dma) ; dest for read + rst 08 ; do read + jp nz,err_diskio ; handle error + xor a ; signal success + ret ; and done +; +#endif +; +#if (BIOS == BIOS_WBW) +; + ; Seek to requested sector in DE:HL + push bc ; save unit & count + set 7,d ; set LBA access flag + ld b,BF_DIOSEEK ; HBIOS func: seek + rst 08 ; do it + pop bc ; recover unit & count + jp nz,err_diskio ; handle error +; + ; Read sector(s) into buffer + ld e,b ; transfer count + ld b,BF_DIOREAD ; HBIOS func: disk read + ld hl,(dma) ; read into info sec buffer + ld d,BID_USR ; user bank + rst 08 ; do it + jp nz,err_diskio ; handle error + xor a ; signal success + ret ; and done +; +#endif +; ;======================================================================= ; Utility functions ;======================================================================= @@ -1077,6 +1154,269 @@ isnum1: or $FF ; set NZ ret ; and done ; +; Delay 16us (cpu speed compensated) incuding call/ret invocation +; Register A and flags destroyed +; No compensation for z180 memory wait states +; There is an overhead of 3ts per invocation +; Impact of overhead diminishes as cpu speed increases +; +; cpu scaler (cpuscl) = (cpuhmz - 2) for 16us + 3ts delay +; note: cpuscl must be >= 1! +; +; example: 8mhz cpu (delay goal is 16us) +; loop = ((6 * 16) - 5) = 91ts +; total cost = (91 + 40) = 131ts +; actual delay = (131 / 8) = 16.375us +; + ; --- total cost = (loop cost + 40) ts -----------------+ +delay: ; 17ts (from invoking call) | + ld a,(cpuscl) ; 13ts | +; | +delay1: ; | + ; --- loop = ((cpuscl * 16) - 5) ts ------------+ | + dec a ; 4ts | | +#if (BIOS == BIOS_WBW) ; | | + #if (CPUFAM == CPU_Z180) ; | | + or a ; +4ts for z180 | | + #endif ; | | +#endif ; | | + jr nz,delay1 ; 12ts (nz) / 7ts (z) | | + ; ----------------------------------------------+ | +; | + ret ; 10ts (return) | + ;-------------------------------------------------------+ +; +; Delay 16us * DE (cpu speed compensated) +; Register DE, A, and flags destroyed +; No compensation for z180 memory wait states +; There is a 27ts overhead for call/ret per invocation +; Impact of overhead diminishes as DE and/or cpu speed increases +; +; cpu scaler (cpuscl) = (cpuhmz - 2) for 16us outer loop cost +; note: cpuscl must be > 0! +; +; Example: 8MHz cpu, DE=6250 (delay goal is .1 sec or 100,000us) +; inner loop = ((16 * 6) - 5) = 91ts +; outer loop = ((91 + 37) * 6250) = 800,000ts +; actual delay = ((800,000 + 27) / 8) = 100,003us +; + ; --- total cost = (outer loop + 27) ts ------------------------+ +vdelay: ; 17ts (from invoking call) | +; | + ; --- outer loop = ((inner loop + 37) * de) ts ---------+ | + ld a,(cpuscl) ; 13ts | | +; | | +vdelay1: ; | | + ; --- inner loop = ((cpuscl * 16) - 5) ts ------+ | | +#if (BIOS == BIOS_WBW) ; | | | + #if (CPUFAM == CPU_Z180) ; | | | + or a ; +4ts for z180 | | | + #endif ; | | | +#endif ; | | | + dec a ; 4ts | | | + jr nz,vdelay1 ; 12ts (nz) / 7ts (z) | | | + ; ----------------------------------------------+ | | +; | | + dec de ; 6ts | | +#if (BIOS == BIOS_WBW) ; | | | + #if (CPUFAM == CPU_Z180) ; | | + or a ; +4ts for z180 | | + #endif ; | | +#endif ; | | + ld a,d ; 4ts | | + or e ; 4ts | | + jp nz,vdelay ; 10ts | | + ;-------------------------------------------------------+ | +; | + ret ; 10ts (final return) | + ;---------------------------------------------------------------+ +; +; Delay about 0.5 seconds +; 500000us / 16us = 31250 +; +ldelay: + push af + push de + ld de,31250 + call vdelay + pop de + pop af + ret +; +; Initialize delay scaler based on operating cpu speed +; HBIOS *must* be installed and available via rst 8!!! +; CPU scaler := max(1, (phimhz - 2)) +; +delay_init: +#if (BIOS == BIOS_UNA) + ld c,$F8 ; UNA bios get phi function + rst 08 ; returns speed in hz in de:hl + ld b,4 ; divide mhz in de:hl by 100000h +delay_init0: + srl d ; ... to get approx cpu speed in + rr e ; ...mhz. throw away hl, and + djnz delay_init0 ; ...right shift de by 4. + inc e ; fix up for value truncation + ld a,e ; put in a +#else + ld b,BF_SYSGET ; HBIOS func=get sys info + ld c,BF_SYSGET_CPUINFO ; HBIOS subfunc=get cpu info + rst 08 ; call HBIOS, rst 08 not yet installed + ld a,l ; put speed in mhz in accum +#endif + cp 3 ; test for <= 2 (special handling) + jr c,delay_init1 ; if <= 2, special processing + sub 2 ; adjust as required by delay functions + jr delay_init2 ; and continue +delay_init1: + ld a,1 ; use the min value of 1 +delay_init2: + ld (cpuscl),a ; update cpu scaler value + ret + +#if (CPUMHZ < 3) +cpuscl .db 1 ; cpu scaler must be > 0 +#else +cpuscl .db CPUMHZ - 2 ; otherwise 2 less than phi mhz +#endif +; +; Print value of a in decimal with leading zero suppression +; +prtdecb: + push hl + push af + ld l,a + ld h,0 + call prtdec + pop af + pop hl + ret +; +; Print value of HL in decimal with leading zero suppression +; +prtdec: + push bc + push de + push hl + ld e,'0' + ld bc,-10000 + call prtdec1 + ld bc,-1000 + call prtdec1 + ld bc,-100 + call prtdec1 + ld c,-10 + call prtdec1 + ld e,0 + ld c,-1 + call prtdec1 + pop hl + pop de + pop bc + ret +prtdec1: + ld a,'0' - 1 +prtdec2: + inc a + add hl,bc + jr c,prtdec2 + sbc hl,bc + cp e + jr z,prtdec3 + ld e,0 + call cout +prtdec3: + ret +; +; Short delay functions. No clock speed compensation, so they +; will run longer on slower systems. The number indicates the +; number of call/ret invocations. A single call/ret is +; 27 t-states on a z80, 25 t-states on a z180. +; +; ; z80 z180 +; ; ---- ---- +dly64: call dly32 ; 1728 1600 +dly32: call dly16 ; 864 800 +dly16: call dly8 ; 432 400 +dly8: call dly4 ; 216 200 +dly4: call dly2 ; 108 100 +dly2: call dly1 ; 54 50 +dly1: ret ; 27 25 +; +; Add hl,a +; +; A register is destroyed! +; +addhla: + add a,l + ld l,a + ret nc + inc h + ret +; +; Print the hex byte value in A +; +prthexbyte: + push af + push de + call hexascii + ld a,d + call cout + ld a,e + call cout + pop de + pop af + ret +; +; Print the hex word value in BC +; +prthexword: + push af + ld a,b + call prthexbyte + ld a,c + call prthexbyte + pop af + ret +; +; Print the hex dword value in DE:HL +; +prthex32: + push bc + push de + pop bc + call prthexword + push hl + pop bc + call prthexword + pop bc + ret +; +; Convert binary value in A to ASCII hex characters in DE +; +hexascii: + ld d,a + call hexconv + ld e,a + ld a,d + rlca + rlca + rlca + rlca + call hexconv + ld d,a + ret +; +; Convert low nibble of A to ASCII hex +; +hexconv: + and 0Fh ; low nibble only + add a,90h + daa + adc a,40h + daa + ret +; ;======================================================================= ; Console character I/O helper routines (registers preserved) ;======================================================================= @@ -1239,7 +1579,7 @@ prtall1: ld hl,str_disk ; prefix string call pstr ; display it ld a,c ; index - call PRTDECB ; print it + call prtdecb ; print it ld hl,str_on ; separator string call pstr push bc ; save loop control @@ -1266,7 +1606,7 @@ prtdrv: and $0F ; isolate device bits add a,a ; multiple by two for word table ld hl,devtbl ; point to start of table - call ADDHLA ; add A to HL for table entry + call addhla ; add A to HL for table entry ld a,(hl) ; deref HL for string adr inc hl ; ... ld h,(hl) ; ... @@ -1275,7 +1615,7 @@ prtdrv: pop hl ; recover HL pop de ; recover DE ld a,e ; device number - call PRTDECB ; print it + call prtdecb ; print it ld a,':' ; suffix call cout ; print it ret @@ -1338,7 +1678,7 @@ prtdrv: ld hl,str_disk ; prefix string call pstr ; display it ld a,b ; index - call PRTDECB ; print it + call prtdecb ; print it ld a,' ' ; formatting call cout ; do it ld a,'=' ; formatting @@ -1378,7 +1718,7 @@ prtdrv2: ; print device pop bc ; recover unit call pstr ; print device name ld a,b ; unit to a - call PRTDECB ; print it + call prtdecb ; print it ld a,':' ; device name suffix call cout ; print it ret ; done @@ -1450,10 +1790,12 @@ str_err_api .db "Unexpected hardware BIOS API failure",0 ;======================================================================= ; #define USEDELAY -#include "util.asm" +; #include "util.asm" ; #if (DSKYENABLE) #define DSKY_KBD +VDELAY .equ vdelay +DLY2 .equ dly2 #include "dsky.asm" #endif ; @@ -1472,6 +1814,7 @@ acmd_to .dw BOOT_TIMEOUT ; auto cmd timeout ;======================================================================= ; str_banner .db PLATFORM_NAME," Boot Loader",0 +str_autoboot .db "AutoBoot: ",0 str_prompt .db "Boot [H=Help]: ",0 str_bs .db bs,' ',bs,0 str_reboot .db "\r\n\r\nRestarting System...",0 @@ -1489,6 +1832,7 @@ str_binfo2 .db $22," [0x",0 str_binfo3 .db "-0x",0 str_binfo4 .db ", entry @ 0x",0 str_binfo5 .db "]",0 +str_ldsec .db ", Sector 0x",0 ; str_help .db "\r\n" .db "\r\n L - List ROM Applications" @@ -1648,9 +1992,13 @@ bid_ldr .ds 1 ; bank at startup #endif #if (BIOS == BIOS_UNA) bid_ldr .ds 2 ; bank at startup -loadlba .ds 4 ; lba for load, dword #endif ; +lba .ds 4 ; lba for load, dword +dma .ds 2 ; address for load +sps .ds 2 ; sectors per slice +mediaid .ds 1 ; media id +; ra_tbl_loc .ds 2 ; points to active ra_tbl bootunit .ds 1 ; boot disk unit bootslice .ds 1 ; boot disk slice @@ -1682,5 +2030,11 @@ bb_biloc .ds 2 ; loc to patch boot drive info bb_cpmloc .ds 2 ; final ram dest for cpm/cbios bb_cpmend .ds 2 ; end address for load bb_cpment .ds 2 ; CP/M entry point (cbios boot) +; +; +; Master Boot Record sector is read into area below. +; +bl_mbrsec .equ $ + .ds 512 ; .end diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index ef187081..1568942b 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -866,7 +866,7 @@ SD_INITCARD1: ; MAKE SURE WE FINISH SENDING #IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) CALL SD_WAITTX ; WAIT FOR TE TO CLEAR - CALL DLY4 ; WAIT A BIT MORE FOR FINAL BIT + CALL DLY32 ; WAIT A BIT MORE FOR FINAL BIT #ENDIF ; ; PUT CARD IN IDLE STATE @@ -1025,7 +1025,7 @@ SD_INITCARD5: ; PER SPEC, THE CARD SHOULD NOW BE ABLE TO HANDLE FULL SPEED OPERATION ; SO, FOR CSIO OPERATION, WE SET CSIO TO MAXIMUM SPEED CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING - CALL DLY4 ; WAIT A BIT MORE FOR FINAL BIT + CALL DLY32 ; WAIT A BIT MORE FOR FINAL BIT XOR A ; ZERO MEANS MAX SPEED OUT (Z180_CNTR),A ; NOW SET CSIO PORT #ENDIF @@ -1335,7 +1335,19 @@ SD_EXECCMD1: ; THE FIRST FILL BYTE IS DISCARDED! THIS HACK IS REQUIRED BY ; STUPID SD CARD ADAPTERS THAT NOW OMIT THE MISO PULL-UP. SEE ; COMMENTS AT TOP OF THIS FILE. - CALL SD_GET ; GET A BYTE AND DISCARD IT +; + ;CALL SD_GET ; GET A BYTE AND DISCARD IT +; + ; THE Z180 -K REVISION CSIO DOES NOT KEEP MOSI HIGH WHEN + ; RECEIVING VIA MISO. INSTEAD MOSI IS LEFT AT WHICHEVER LOGIC + ; LEVEL IT WAS LAST SET TO. THIS CAUSES SOME SD CARDS A PROBLEM + ; BECAUSE THEY EXPECT MOSI TO BE CONSISTENTLY HIGH WHEN IDLE. + ; BY USING A PUT INSTEAD OF A GET, WE CAN FORCE MOSI TO BE + ; LEFT AT THE PROPER LOGIC LEVEL. THE SD CARD DOES NOT CARE + ; IF A PUT OR A GET IS USED TO IGNORE THE BYTE BECAUSE THE + ; CLOCK RUNS IN EITHER CASE. + LD A,$FF ; KEEP MOSI HI + CALL SD_PUT ; SEND 8 CLOCKS #ENDIF ; ; GET RESULT @@ -1661,6 +1673,11 @@ SD_SELECT2: #ENDIF LD (SD_OPRVAL),A OUT (SD_OPRREG),A +;; +;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +; CALL DLY32 ; DELAY FOR FINAL BIT +;#ENDIF +; RET ; ; DESELECT CARD @@ -1674,12 +1691,10 @@ SD_DESELECT: ; FINISH SENDING AFTER TE IS CLEARED. THE DELAY BELOW WILL ; DO THIS FOR THE SLOWEST POSSIBLE SEND RATE WHICH IS ; CLK / 1320, SO DELAY AT LEAST 1320 T-STATES - ;CALL DLY64 ; DELAY FOR FINAL BIT ; - ; IN PRACTICE, IT LOOKS LIKE THIS WORST CASE SCENARIO NEVER - ; OCCURS. FOR NOW, USE A SMALL DELAY WHICH SEEMS TO BE MORE - ; THAN ADEQUATE BASED ON LOGIC ANALYZER TRACES. - CALL DLY4 ; DELAY FOR FINAL BIT + ; IN PRACTICE, A SMALLER DELAY IS FINE BASED ON LOGIC ANALYZER + ; TRACES. + CALL DLY32 ; DELAY FOR FINAL BIT #ENDIF ; LD A,(SD_OPRVAL) diff --git a/Source/HBIOS/simrtc.asm b/Source/HBIOS/simrtc.asm index 8be545c3..0185bd93 100644 --- a/Source/HBIOS/simrtc.asm +++ b/Source/HBIOS/simrtc.asm @@ -49,6 +49,12 @@ SIMRTC_DISPATCH: JP Z,SIMRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES DEC A JP Z,SIMRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + DEC A + JP Z,SIMRTC_GETALM ; GET ALARM + DEC A + JP Z,SIMRTC_SETALM ; SET ALARM + DEC A + JP Z,SIMRTC_DEVICE ; REPORT RTC DEVICE INFO CALL PANIC ; ; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR @@ -57,6 +63,8 @@ SIMRTC_GETBYT: SIMRTC_SETBYT: SIMRTC_GETBLK: SIMRTC_SETBLK: +SIMRTC_GETALM: +SIMRTC_SETALM: CALL PANIC ; ; RTC GET TIME @@ -121,6 +129,14 @@ SIMRTC_SETTIM: XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; +; REPORT RTC DEVICE INFO +; +SIMRTC_DEVICE: + LD D,RTCDEV_SIMH ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + XOR A ; SIGNAL SUCCESS + RET +; ; WORKING VARIABLES ; SIMRTC_BUF: ; ALL IN BCD!!! diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 4ce9546b..220e07e3 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -5,6 +5,8 @@ ;====================================================================== ; ; TODO: +; 1. PROVIDE SUPPORT FOR NOISE CHANNEL +; 2. DOES THIS WORK FOR FASTER CPUS? ONLY BEEN TESTED ON A Z80 7MHZ UNIT ; ;====================================================================== ; CONSTANTS @@ -22,22 +24,11 @@ CHANNEL_1_SILENT .EQU $BF CHANNEL_2_SILENT .EQU $DF CHANNEL_3_SILENT .EQU $FF -SN7CLKDIVIDER .EQU 4 -SN7CLK .EQU CPUOSC / SN7CLKDIVIDER SN7RATIO .EQU SN7CLK * 100 / 32 - -SN7_FIRST_NOTE .EQU 5827 ; A1# -SN7_LAST_NOTE .EQU 209300 ; C7 - -A1S .EQU SN7RATIO / SN7_FIRST_NOTE -C7 .EQU SN7RATIO / SN7_LAST_NOTE - - .ECHO "SN76489: range of A1# (period: " - .ECHO A1S - .ECHO ") to C7 (period: " - .ECHO C7 - .ECHO ")\n" + .ECHO "SN76489 CLOCK: " + .ECHO SN7CLK + .ECHO "\n" #INCLUDE "audio.inc" @@ -69,13 +60,13 @@ SN7_INIT1: ; SN7_RESET: - AUDTRACE(TRACE_INIT) + AUDTRACE(SNT_INIT) CALL SN7_VOLUME_OFF XOR A ; SIGNAL SUCCESS RET SN7_VOLUME_OFF: - AUDTRACE(TRACE_VOLUME_OFF) + AUDTRACE(SNT_VOLOFF) LD A, CHANNEL_0_SILENT OUT (SN76489_PORT_LEFT), A @@ -103,73 +94,51 @@ SN7_VOLUME_OFF: ; 1 CC 1 VVVV SN7_VOLUME: - AUDDEBUG("SN7VOL ") + AUDTRACE(SNT_VOL) AUDTRACE_L - AUDDEBUG("\r\n") + AUDTRACE_CR LD A, L - LD (PENDING_VOLUME), A + LD (SN7_PENDING_VOLUME), A XOR A ; SIGNAL SUCCESS RET - - SN7_NOTE: - AUDDEBUG("SN7NOT ") - AUDTRACE_L - AUDDEBUG("\r\n") - - ADD HL, HL ; SHIFT RIGHT (MULT 2) -INDEX INTO SN7NOTETBL TABLE OF WORDS - ; TEST IF HL IS LARGER THAN SN7NOTETBL SIZE - OR A ; CLEAR CARRY FLAG - LD DE, SIZ_SN7NOTETBL - SBC HL, DE - JR NC, SN7_NOTE1 ; INCOMING HL DOES NOT MAP INTO SN7NOTETBL - - ADD HL, DE ; RESTORE HL - LD E, L ; HL = SN7NOTETBL + HL - LD D, H - LD HL, SN7NOTETBL - ADD HL, DE - - LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL - INC HL - LD H, (HL) - LD L, A - - JR SN7_PERIOD ; APPLY PERIOD - -SN7_NOTE1: - OR $FF ; NOT IMPLEMENTED YET - RET - + LD DE, SN7NOTETBL + CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU + ; TO SET THIS PERIOD SN7_PERIOD: - AUDDEBUG("SN7PRD ") + AUDTRACE(SNT_PERIOD) AUDTRACE_HL - AUDDEBUG("\r\n") + AUDTRACE_CR - LD A, H - CP $04 - JP NC, SN7_QUERY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE + LD A, H ; IF ZERO - ERROR + OR L + JR Z, SN7_QUERY_PERIOD1 + + LD (SN7_PENDING_PERIOD), HL ;ASSUME SUCCESS + + OR A ; IF >= 401 ERROR + LD DE, $401 + SBC HL, DE + JR NC, SN7_QUERY_PERIOD1 - LD (PENDING_PERIOD), HL XOR A ; SIGNAL SUCCESS RET SN7_QUERY_PERIOD1: ; REQUESTED PERIOD IS LARGER THAN THE SN76489 CAN SUPPORT - LD L, $FF - LD H, $FF - LD (PENDING_PERIOD), HL - - OR $FF ; SIGNAL FAILURE + LD A, $FF + LD L, A + LD H, A + LD (SN7_PENDING_PERIOD), HL RET SN7_PLAY: - AUDDEBUG("SN7PLY ") + AUDTRACE(SNT_PLAY) AUDTRACE_D - AUDDEBUG("\r\n") + AUDTRACE_CR - LD A, (PENDING_PERIOD + 1) + LD A, (SN7_PENDING_PERIOD + 1) CP $FF JR Z, SN7_PLAY1 ; PERIOD IS TOO LARGE, UNABLE TO PLAY CALL SN7_APPLY_VOL @@ -179,13 +148,13 @@ SN7_PLAY: RET SN7_PLAY1: ; TURN CHANNEL VOL TO OFF AND STOP PLAYING - LD A, (PENDING_VOLUME) + LD A, (SN7_PENDING_VOLUME) PUSH AF LD A, 0 - LD (PENDING_VOLUME), A + LD (SN7_PENDING_VOLUME), A CALL SN7_APPLY_VOL POP AF - LD (PENDING_VOLUME), A + LD (SN7_PENDING_VOLUME), A OR $FF ; SIGNAL FAILURE RET @@ -214,12 +183,12 @@ SN7_QUERY_CHCNT: RET SN7_QUERY_PERIOD: - LD HL, (PENDING_PERIOD) + LD HL, (SN7_PENDING_PERIOD) XOR A RET SN7_QUERY_VOLUME: - LD A, (PENDING_VOLUME) + LD A, (SN7_PENDING_VOLUME) LD L, A LD H, 0 @@ -251,7 +220,7 @@ SN7_APPLY_VOL: ; APPLY VOLUME TO BOTH LEFT AND RIGHT CHANNELS OR $90 LD B, A - LD A, (PENDING_VOLUME) + LD A, (SN7_PENDING_VOLUME) RRCA RRCA RRCA @@ -264,9 +233,9 @@ SN7_APPLY_VOL: ; APPLY VOLUME TO BOTH LEFT AND RIGHT CHANNELS AND $0F OR B ; A CONTAINS COMMAND TO SET VOLUME FOR CHANNEL - AUDTRACE(TRACE_PORT_WR) + AUDTRACE(SNT_REGWR) AUDTRACE_A - AUDTRACE(TRACE_NEWLINE) + AUDTRACE_CR OUT (SN76489_PORT_LEFT), A OUT (SN76489_PORT_RIGHT), A @@ -279,7 +248,7 @@ SN7_APPLY_PRD: PUSH DE PUSH BC PUSH AF - LD HL, (PENDING_PERIOD) + LD HL, (SN7_PENDING_PERIOD) LD A, D AND $3 @@ -295,9 +264,9 @@ SN7_APPLY_PRD: AND $F OR B ; A NOW CONATINS FIRST PERIOD COMMAND - AUDTRACE(TRACE_PORT_WR) + AUDTRACE(SNT_REGWR) AUDTRACE_A - AUDTRACE(TRACE_NEWLINE) + AUDTRACE_CR OUT (SN76489_PORT_LEFT), A OUT (SN76489_PORT_RIGHT), A @@ -318,9 +287,9 @@ SN7_APPLY_PRD: RLCA ; AND PLACE IN BITS 5 AND 6 OR B ; OR THE TWO SETS OF BITS TO MAKE 2ND PERIOD COMMAND - AUDTRACE(TRACE_PORT_WR) + AUDTRACE(SNT_REGWR) AUDTRACE_A - AUDTRACE(TRACE_NEWLINE) + AUDTRACE_CR OUT (SN76489_PORT_LEFT), A OUT (SN76489_PORT_RIGHT), A @@ -344,282 +313,76 @@ SN7_FNTBL: !!!!! #ENDIF -PENDING_PERIOD +SN7_PENDING_PERIOD .DW 0 ; PENDING PERIOD (10 BITS) -PENDING_VOLUME - .DB 0 ; PENDING VOL (8 BITS -> DOWNOVERTED TO 4 BITS AND INVERTED) +SN7_PENDING_VOLUME + .DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED) STR_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$" STR_MESSAGERT .DB ", RIGHT IO=0x$" #IF AUDIOTRACE -TRACE_INIT .DB "\r\nSN7_INIT CALLED\r\n$" -TRACE_VOLUME_OFF .DB "\r\nSN7_VOLUME_OFF\r\n$" -TRACE_VOLUME_SET .DB "\r\nSN7_VOLUME_SET CH: $" -TRACE_PLAY .DB "\r\nPLAY\r\n$" -TRACE_VOLUME .DB ", VOL: $" -TRACE_PORT_WR .DB "\r\nOUT SN76489, $" -TRACE_PERIOD_SET .DB "\r\nSN7_PERIOD_SET CH: $" -TRACE_PERIOD .DB ", PERIOD: $" -TRACE_NEWLINE .DB "\r\n$" +SNT_INIT .DB "\r\nSN7_INIT\r\n$" +SNT_VOLOFF .DB "\r\nSN7_VOLUME OFF\r\n$" +SNT_VOL .DB "\r\nSN7_VOLUME: $" +SNT_NOTE .DB "\r\nSN7_NOTE: $" +SNT_PERIOD .DB "\r\nSN7_PERIOD: $" +SNT_PLAY .DB "\r\nSN7_PLAY CH: $" +SNT_REGWR .DB "\r\nOUT SN76489, $" #ENDIF -; THE FREQUENCY BY QUATER TONE STARTING AT A1# +; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCATVE 0 +; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP) +; FIRST PLAYABLE NOTE WILL BE $2E +; ASSUMING A CLOCK OF 1843200 THIS MAPS TO +; 2 QUATER TONES BELOW A1#, WITH A1# AT $30 + SN7NOTETBL: - .DW A1S - .DW SN7RATIO / 5912 - .DW SN7RATIO / 5998 - .DW SN7RATIO / 6085 - .DW SN7RATIO / 6174 - .DW SN7RATIO / 6264 - .DW SN7RATIO / 6355 - .DW SN7RATIO / 6447 - .DW SN7RATIO / 6541 - .DW SN7RATIO / 6636 - .DW SN7RATIO / 6733 - .DW SN7RATIO / 6831 - .DW SN7RATIO / 6930 - .DW SN7RATIO / 7031 - .DW SN7RATIO / 7133 - .DW SN7RATIO / 7237 - .DW SN7RATIO / 7342 - .DW SN7RATIO / 7449 - .DW SN7RATIO / 7557 - .DW SN7RATIO / 7667 - .DW SN7RATIO / 7778 - .DW SN7RATIO / 7891 - .DW SN7RATIO / 8006 - .DW SN7RATIO / 8122 - .DW SN7RATIO / 8241 - .DW SN7RATIO / 8361 - .DW SN7RATIO / 8482 - .DW SN7RATIO / 8606 - .DW SN7RATIO / 8731 - .DW SN7RATIO / 8858 - .DW SN7RATIO / 8987 - .DW SN7RATIO / 9118 - .DW SN7RATIO / 9250 - .DW SN7RATIO / 9385 - .DW SN7RATIO / 9521 - .DW SN7RATIO / 9660 - .DW SN7RATIO / 9800 - .DW SN7RATIO / 9943 - .DW SN7RATIO / 10087 - .DW SN7RATIO / 10234 - .DW SN7RATIO / 10383 - .DW SN7RATIO / 10534 - .DW SN7RATIO / 10687 - .DW SN7RATIO / 10843 - .DW SN7RATIO / 11000 - .DW SN7RATIO / 11160 - .DW SN7RATIO / 11322 - .DW SN7RATIO / 11487 - .DW SN7RATIO / 11654 - .DW SN7RATIO / 11824 - .DW SN7RATIO / 11995 - .DW SN7RATIO / 12170 - .DW SN7RATIO / 12347 - .DW SN7RATIO / 12527 - .DW SN7RATIO / 12709 - .DW SN7RATIO / 12894 - .DW SN7RATIO / 13081 - .DW SN7RATIO / 13271 - .DW SN7RATIO / 13464 - .DW SN7RATIO / 13660 - .DW SN7RATIO / 13859 - .DW SN7RATIO / 14061 - .DW SN7RATIO / 14265 - .DW SN7RATIO / 14473 - .DW SN7RATIO / 14683 - .DW SN7RATIO / 14897 - .DW SN7RATIO / 15113 - .DW SN7RATIO / 15333 - .DW SN7RATIO / 15556 - .DW SN7RATIO / 15782 - .DW SN7RATIO / 16012 - .DW SN7RATIO / 16245 - .DW SN7RATIO / 16481 - .DW SN7RATIO / 16721 - .DW SN7RATIO / 16964 - .DW SN7RATIO / 17211 - .DW SN7RATIO / 17461 - .DW SN7RATIO / 17715 - .DW SN7RATIO / 17973 - .DW SN7RATIO / 18234 - .DW SN7RATIO / 18500 - .DW SN7RATIO / 18769 - .DW SN7RATIO / 19042 - .DW SN7RATIO / 19319 - .DW SN7RATIO / 19600 - .DW SN7RATIO / 19885 - .DW SN7RATIO / 20174 - .DW SN7RATIO / 20468 - .DW SN7RATIO / 20765 - .DW SN7RATIO / 21067 - .DW SN7RATIO / 21373 - .DW SN7RATIO / 21684 - .DW SN7RATIO / 22000 - .DW SN7RATIO / 22320 - .DW SN7RATIO / 22645 - .DW SN7RATIO / 22974 - .DW SN7RATIO / 23308 - .DW SN7RATIO / 23647 - .DW SN7RATIO / 23991 - .DW SN7RATIO / 24340 - .DW SN7RATIO / 24694 - .DW SN7RATIO / 25053 - .DW SN7RATIO / 25418 - .DW SN7RATIO / 25787 - .DW SN7RATIO / 26163 - .DW SN7RATIO / 26544 - .DW SN7RATIO / 26930 - .DW SN7RATIO / 27321 - .DW SN7RATIO / 27718 - .DW SN7RATIO / 28121 - .DW SN7RATIO / 28530 - .DW SN7RATIO / 28945 - .DW SN7RATIO / 29366 - .DW SN7RATIO / 29793 - .DW SN7RATIO / 30226 - .DW SN7RATIO / 30666 - .DW SN7RATIO / 31113 - .DW SN7RATIO / 31566 - .DW SN7RATIO / 32025 - .DW SN7RATIO / 32490 - .DW SN7RATIO / 32963 - .DW SN7RATIO / 33442 - .DW SN7RATIO / 33929 - .DW SN7RATIO / 34422 - .DW SN7RATIO / 34923 - .DW SN7RATIO / 35431 - .DW SN7RATIO / 35946 - .DW SN7RATIO / 36469 - .DW SN7RATIO / 36999 - .DW SN7RATIO / 37537 - .DW SN7RATIO / 38083 - .DW SN7RATIO / 38637 - .DW SN7RATIO / 39200 - .DW SN7RATIO / 39770 - .DW SN7RATIO / 40349 - .DW SN7RATIO / 40936 - .DW SN7RATIO / 41530 - .DW SN7RATIO / 42134 - .DW SN7RATIO / 42747 - .DW SN7RATIO / 43369 - .DW SN7RATIO / 44000 - .DW SN7RATIO / 44640 - .DW SN7RATIO / 45289 - .DW SN7RATIO / 45948 - .DW SN7RATIO / 46616 - .DW SN7RATIO / 47294 - .DW SN7RATIO / 47982 - .DW SN7RATIO / 48680 - .DW SN7RATIO / 49388 - .DW SN7RATIO / 50106 - .DW SN7RATIO / 50835 - .DW SN7RATIO / 51575 - .DW SN7RATIO / 52325 - .DW SN7RATIO / 53086 - .DW SN7RATIO / 53858 - .DW SN7RATIO / 54642 - .DW SN7RATIO / 55437 - .DW SN7RATIO / 56243 - .DW SN7RATIO / 57061 - .DW SN7RATIO / 57891 - .DW SN7RATIO / 58733 - .DW SN7RATIO / 59587 - .DW SN7RATIO / 60454 - .DW SN7RATIO / 61333 - .DW SN7RATIO / 62225 - .DW SN7RATIO / 63130 - .DW SN7RATIO / 64048 - .DW SN7RATIO / 64980 - .DW SN7RATIO / 65925 - .DW SN7RATIO / 66884 - .DW SN7RATIO / 67857 - .DW SN7RATIO / 68844 - .DW SN7RATIO / 69846 - .DW SN7RATIO / 70862 - .DW SN7RATIO / 71893 - .DW SN7RATIO / 72938 - .DW SN7RATIO / 73999 - .DW SN7RATIO / 75075 - .DW SN7RATIO / 76167 - .DW SN7RATIO / 77275 - .DW SN7RATIO / 78399 - .DW SN7RATIO / 79539 - .DW SN7RATIO / 80696 - .DW SN7RATIO / 81870 - .DW SN7RATIO / 83061 - .DW SN7RATIO / 84269 - .DW SN7RATIO / 85495 - .DW SN7RATIO / 86738 - .DW SN7RATIO / 88000 - .DW SN7RATIO / 89280 - .DW SN7RATIO / 90579 - .DW SN7RATIO / 91896 - .DW SN7RATIO / 93233 - .DW SN7RATIO / 94589 - .DW SN7RATIO / 95965 - .DW SN7RATIO / 97361 - .DW SN7RATIO / 98777 - .DW SN7RATIO / 100214 - .DW SN7RATIO / 101671 - .DW SN7RATIO / 103150 - .DW SN7RATIO / 104650 - .DW SN7RATIO / 106172 - .DW SN7RATIO / 107716 - .DW SN7RATIO / 109283 - .DW SN7RATIO / 110873 - .DW SN7RATIO / 112486 - .DW SN7RATIO / 114122 - .DW SN7RATIO / 115782 - .DW SN7RATIO / 117466 - .DW SN7RATIO / 119175 - .DW SN7RATIO / 120908 - .DW SN7RATIO / 122667 - .DW SN7RATIO / 124451 - .DW SN7RATIO / 126261 - .DW SN7RATIO / 128098 - .DW SN7RATIO / 129961 - .DW SN7RATIO / 131851 - .DW SN7RATIO / 133769 - .DW SN7RATIO / 135715 - .DW SN7RATIO / 137689 - .DW SN7RATIO / 139691 - .DW SN7RATIO / 141723 - .DW SN7RATIO / 143784 - .DW SN7RATIO / 145876 - .DW SN7RATIO / 147998 - .DW SN7RATIO / 150151 - .DW SN7RATIO / 152335 - .DW SN7RATIO / 154550 - .DW SN7RATIO / 156798 - .DW SN7RATIO / 159079 - .DW SN7RATIO / 161393 - .DW SN7RATIO / 163740 - .DW SN7RATIO / 166122 - .DW SN7RATIO / 168538 - .DW SN7RATIO / 170990 - .DW SN7RATIO / 173477 - .DW SN7RATIO / 176000 - .DW SN7RATIO / 178560 - .DW SN7RATIO / 181157 - .DW SN7RATIO / 183792 - .DW SN7RATIO / 186466 - .DW SN7RATIO / 189178 - .DW SN7RATIO / 191930 - .DW SN7RATIO / 194722 - .DW SN7RATIO / 197553 - .DW SN7RATIO / 200426 - .DW SN7RATIO / 203342 - .DW SN7RATIO / 206299 - .DW C7 - -SIZ_SN7NOTETBL .EQU $ - SN7NOTETBL - .ECHO "SN76489 approx " - .ECHO SIZ_SN7NOTETBL / 2 / 4 /12 - .ECHO " Octaves. Last note index supported: " - - .ECHO SIZ_SN7NOTETBL / 2 - .ECHO "\n" + .DW SN7RATIO / 2913 + .DW SN7RATIO / 2956 + .DW SN7RATIO / 2999 + .DW SN7RATIO / 3042 + .DW SN7RATIO / 3086 + .DW SN7RATIO / 3131 + .DW SN7RATIO / 3177 + .DW SN7RATIO / 3223 + .DW SN7RATIO / 3270 + .DW SN7RATIO / 3318 + .DW SN7RATIO / 3366 + .DW SN7RATIO / 3415 + .DW SN7RATIO / 3464 + .DW SN7RATIO / 3515 + .DW SN7RATIO / 3566 + .DW SN7RATIO / 3618 + .DW SN7RATIO / 3670 + .DW SN7RATIO / 3724 + .DW SN7RATIO / 3778 + .DW SN7RATIO / 3833 + .DW SN7RATIO / 3889 + .DW SN7RATIO / 3945 + .DW SN7RATIO / 4003 + .DW SN7RATIO / 4061 + .DW SN7RATIO / 4120 + .DW SN7RATIO / 4180 + .DW SN7RATIO / 4241 + .DW SN7RATIO / 4302 + .DW SN7RATIO / 4365 + .DW SN7RATIO / 4428 + .DW SN7RATIO / 4493 + .DW SN7RATIO / 4558 + .DW SN7RATIO / 4624 + .DW SN7RATIO / 4692 + .DW SN7RATIO / 4760 + .DW SN7RATIO / 4829 + .DW SN7RATIO / 4899 + .DW SN7RATIO / 4971 + .DW SN7RATIO / 5043 + .DW SN7RATIO / 5116 + .DW SN7RATIO / 5191 + .DW SN7RATIO / 5266 + .DW SN7RATIO / 5343 + .DW SN7RATIO / 5421 + .DW SN7RATIO / 5499 + .DW SN7RATIO / 5579 + .DW SN7RATIO / 5661 + .DW SN7RATIO / 5743 diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index e1575660..443679f7 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -1,46 +1,161 @@ +;====================================================================== +; +; BIT MODE SOUND DRIVER FOR SBC V2 USING BIT 0 OF RTC DRIVER +; +;====================================================================== +; +; DRIVER FUNCTION TABLE AND INSTANCE DATA +; +SP_FNTBL: + .DW SP_RESET + .DW SP_VOLUME + .DW SP_PERIOD + .DW SP_NOTE + .DW SP_PLAY + .DW SP_QUERY +; +#IF (($ - SP_FNTBL) != (SND_FNCNT * 2)) + .ECHO "*** INVALID SND FUNCTION TABLE ***\n" + !!!!! +#ENDIF +; +SP_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE +; +SP_TONECNT .EQU 1 ; COUNT NUMBER OF TONE CHANNELS +SP_NOISECNT .EQU 0 ; COUNT NUMBER OF NOISE CHANNELS +; +SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS) +SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS) ; ;====================================================================== -; I/O BIT DRIVER FOR CONSOLE BELL FOR SBC V2 USING BIT 0 OF RTC DRIVER +; DRIVER INITIALIZATION ;====================================================================== ; -SPK_INIT: - CALL NEWLINE ; FORMATTING +SP_INIT: + LD IY, SP_IDAT ; SETUP FUNCTION TABLE + LD BC, SP_FNTBL ; POINTER TO INSTANCE DATA + LD DE, SP_IDAT ; BC := FUNCTION TABLE ADDRESS + CALL SND_ADDENT ; DE := INSTANCE DATA PTR +; + CALL NEWLINE ; ANNOUNCE DEVICE PRTS("SPK: IO=0x$") LD A,RTCIO CALL PRTHEXBYTE - CALL SPK_SETTBL - CALL SPK_BEEP ; PLAY A NOTE + CALL SP_SETTBL ; SETUP TONE TABLE + CALL SP_PLAY ; PLAY DEFAULT NOTE XOR A RET ; -; SETUP THE SPEAKER NOTE TABLE ACCORDING TO THE CPU SPEED. -; FREQUENCY ACCURACY DECREASES AS CLOCK SPEED MULITPLIER INCREASES. -; 1MHZ ERROR MAY OCCUR IF CPU CLOCK IS UNDER. I.E 3.999 = 3MHZ - -SPK_SETTBL: +;====================================================================== +; SOUND DRIVER FUNCTION - RESET +;====================================================================== +; +SP_RESET: +; XOR A ; SUCCESSFULL RESET +; RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - VOLUME +;====================================================================== +; +SP_VOLUME: + XOR A ; SIGNAL SUCCESS + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - PERIOD +;====================================================================== +; +SP_PERIOD: + LD (SP_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL + XOR A + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - NOTE +;====================================================================== +; +SP_NOTE: + PUSH HL + PUSH DE ; ON ENTRY L IS A NOTE INDEX + LD H,0 ; CONVERT THIS NOTE INDEX + ADD HL,HL ; TO THE ASSOCIATED ENTRY + ADD HL,HL ; IN THE TUNE ABLE. + LD DE,SP_TUNTBL ; SAVE THIS ADDRESS AS + ADD HL,DE ; THE PERIOD + LD (SP_PENDING_PERIOD),HL + POP DE + POP HL + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS +;====================================================================== +; +SP_QUERY: + LD A, E + CP BF_SNDQ_CHCNT ; SUB FUNCTION 01 + JR Z, SP_QUERY_CHCNT +; + CP BF_SNDQ_VOLUME ; SUB FUNCTION 02 + JR Z, SP_QUERY_VOLUME +; + CP BF_SNDQ_PERIOD ; SUB FUNCTION 03 + JR Z, SP_QUERY_PERIOD +; + CP BF_SNDQ_DEV ; SUB FUNCTION 04 + JR Z, SP_QUERY_DEV +; + OR $FF ; SIGNAL FAILURE + RET +; +SP_QUERY_CHCNT: + LD BC,(SP_TONECNT*256)+SP_NOISECNT ; RETURN NUMBER OF + XOR A ; TONE AND NOISE + RET ; CHANNELS IN BC +; +SP_QUERY_PERIOD: + LD HL, (SP_PENDING_PERIOD) ; RETURN 16-BIT PERIOD + XOR A ; IN HL REGISTER + RET +; +SP_QUERY_VOLUME: + LD L, 255 ; RETURN 8-BIT VOLUME + XOR A ; IN L REGISTER + RET +; +SP_QUERY_DEV: + LD B, BF_SND_BITMODE ; RETURN DEVICE IDENTIFIER + LD DE, 0 ; AND ADDRESS AND DATA PORT + XOR A + RET +; +;====================================================================== +; INITIALIZE THE TONE TABLE +;====================================================================== +; +SP_SETTBL: LD A,(CB_CPUMHZ) ; GET CPU SPEED. LD C,A - LD B,SPK_NOTCNT ; SET NUMBER OF NOTES TO - LD HL,SPK_TUNTBL+2 ; ADJUST AND START POINT - -SPK_SETTBL2: + LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO + LD HL,SP_TUNTBL+2 ; ADJUST AND START POINT +; +SP_SETTBL2: PUSH HL - LD A,(HL) ; READ - LD E,A ; IN - INC HL ; THE - LD A,(HL) ; 1MHZ - LD D,A ; NOTE - + LD E,(HL) ; READ IN + INC HL ; THE 1MHZ + LD D,(HL) ; NOTE +; PUSH BC LD B,C LD HL,0 ; MULTIPLY -SPK_SETTBL1: ; 1MHZ NOTE +SP_SETTBL1: ; 1MHZ NOTE ADD HL,DE ; VALUE BY - DJNZ SPK_SETTBL1 ; SYSTEM MHZ + DJNZ SP_SETTBL1 ; SYSTEM MHZ POP BC ; - LD DE,30 ; ADD OVEREAD + LD DE,30 ; ADD OVERHEAD ADD HL,DE ; COMPENSATION ; POP DE ; RECALL NOTE @@ -52,34 +167,35 @@ SPK_SETTBL1: ; 1MHZ NOTE INC HL ; NOTE INC HL ; AND MOVE INC HL ; TO NEXT - - DJNZ SPK_SETTBL2 ; NEXT NOTE +; + DJNZ SP_SETTBL2 ; NEXT NOTE RET - -SPK_BEEP: - LD HL,SPK_NOTE_C8 ; SELECT NOTE ; - LD A,(HL) ; LOAD 1ST ARG +;====================================================================== +; SOUND DRIVER FUNCTION - PLAY +;====================================================================== +; +SP_PLAY: + LD HL,(SP_PENDING_PERIOD) ; SELECT NOTE +; + LD E,(HL) ; LOAD 1ST ARG INC HL ; IN DE - LD E,A - LD A,(HL) + LD D,(HL) INC HL - LD D,A -; - LD A,(HL) ; LOAD 2ND ARG + + LD C,(HL) ; LOAD 2ND ARG INC HL ; IN BC - LD C,A - LD A,(HL) + LD B,(HL) INC HL - LD B,A +; PUSH BC ; SETUP ARG IN HL POP HL ; - CALL SPK_BEEPER ; PLAY + CALL SP_BEEPER ; PLAY ; RET ; -; The following SPK_BEEPER routine is a modification of code from +; The following SP_BEEPER routine is a modification of code from ; "The Complete SPECTRUM ROM DISSASSEMBLY" by Dr Ian Logan & Dr Frank O’Hara ; ; https://www.esocop.org/docs/CompleteSpectrumROMDisassemblyThe.pdf @@ -87,7 +203,7 @@ SPK_BEEP: ; DE Number of passes to make through the sound generation loop ; HL Loop delay parameter ; -SPK_BEEPER: +SP_BEEPER: PUSH IX DI ; Disable the interrupt for the duration of a 'beep'. LD A,L ; Save L temporarily. @@ -146,13 +262,13 @@ BE_END: POP IX RET ; -; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SPK_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL +; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SP_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL ; ; EXCEL SPREADSHEET FOR CALCULATION CAN BE FOUND HERE: ; ; https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=boards:sbc:sbc_v2:sbc_v2-004:spk_beep_tuntbl.xlsx ; -SPK_TUNTBL: +SP_TUNTBL: .DW $13, $191A ; D .DW $14, $17B3 ; E0 .DW $15, $165E ; F0 @@ -246,7 +362,7 @@ SPK_TUNTBL: .DW $DC0, $23 ; A7 .DW $E91, $21 ; A .DW $F6F, $1F ; B7 -SPK_NOTE_C8: +SP_NOTE_C8: .DW $105A, $1D ; C8 .DW $1152, $1C ; C .DW $125A, $1A ; D8 @@ -259,5 +375,6 @@ SPK_NOTE_C8: .DW $1B80, $11 ; A8 .DW $1D22, $10 ; A .DW $1EDE, $F ; B8 - -SPK_NOTCNT .EQU ($-SPK_TUNTBL) / 4 +; +SP_NOTCNT .EQU ($-SP_TUNTBL-1) / 4 +; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index cbd8f0a3..b62a6486 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -89,19 +89,6 @@ FDM360 .EQU 2 ; 5.25" FLOPPY, 360KB, 2 SIDES, 40 TRKS, 9 SECTORS FDM120 .EQU 3 ; 5.25" FLOPPY, 1.2MB, 2 SIDES, 80 TRKS, 15 SECTORS FDM111 .EQU 4 ; 8" FLOPPY, 1.11MB, 2 SIDES, 74 TRKS, 15 SECTORS ; -; MEDIA ID VALUES -; -MID_NONE .EQU 0 -MID_MDROM .EQU 1 -MID_MDRAM .EQU 2 -MID_RF .EQU 3 -MID_HD .EQU 4 -MID_FD720 .EQU 5 -MID_FD144 .EQU 6 -MID_FD360 .EQU 7 -MID_FD120 .EQU 8 -MID_FD111 .EQU 9 -; ; ZILOG CTC MODE SELECTIONS ; CTCMODE_NONE .EQU 0 ; NO CTC @@ -141,6 +128,7 @@ FDMODE_DIO3 .EQU 6 ; DISKIO V3 FDMODE_RCSMC .EQU 7 ; RC2014 SMC 9266 @ $40 (SCOTT BAKER) FDMODE_RCWDC .EQU 8 ; RC2014 WDC 37C65 @ $40 (SCOTT BAKER) FDMODE_DYNO .EQU 9 ; DYNO WDC 37C65 @ $84 +FDMODE_EPFDC .EQU 10 ; RC2014 ETCHED PIXELS FDC ; ; IDE MODE SELECTIONS ; diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index 2305cc74..c24948a3 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -4,25 +4,43 @@ setlocal echo. echo Building Floppy Disk Images... echo. -call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw.sys -call BuildFD.cmd zsdos ..\zsdos\zsys_wbw.sys -call BuildFD.cmd nzcom ..\zsdos\zsys_wbw.sys -call BuildFD.cmd cpm3 ..\cpm3\cpmldr.sys -call BuildFD.cmd zpm3 ..\cpm3\cpmldr.sys -call BuildFD.cmd ws4 +call BuildDisk.cmd cpm22 wbw_fd144 ..\cpm22\cpm_wbw.sys +call BuildDisk.cmd zsdos wbw_fd144 ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd nzcom wbw_fd144 ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd cpm3 wbw_fd144 ..\cpm3\cpmldr.sys +call BuildDisk.cmd zpm3 wbw_fd144 ..\cpm3\cpmldr.sys +call BuildDisk.cmd ws4 wbw_fd144 echo. -echo Building Hard Disk Images... +echo Building Legacy Hard Disk Images... echo. -call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw.sys -call BuildHD.cmd zsdos ..\zsdos\zsys_wbw.sys -call BuildHD.cmd nzcom ..\zsdos\zsys_wbw.sys -call BuildHD.cmd cpm3 ..\cpm3\cpmldr.sys -call BuildHD.cmd zpm3 ..\cpm3\cpmldr.sys -call BuildHD.cmd ws4 +call BuildDisk.cmd cpm22 wbw_hd ..\cpm22\cpm_wbw.sys +call BuildDisk.cmd zsdos wbw_hd ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd nzcom wbw_hd ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd cpm3 wbw_hd ..\cpm3\cpmldr.sys +call BuildDisk.cmd zpm3 wbw_hd ..\cpm3\cpmldr.sys +call BuildDisk.cmd ws4 wbw_hd -if exist ..\BPBIOS\bpbio-ww.rel call BuildHD.cmd bp +if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp wbw_hd echo. -echo Building Combo Disk Image... +echo Building Combo Disk (legacy format) Image... copy /b ..\..\Binary\hd_cpm22.img + ..\..\Binary\hd_zsdos.img + ..\..\Binary\hd_nzcom.img + ..\..\Binary\hd_cpm3.img + ..\..\Binary\hd_zpm3.img + ..\..\Binary\hd_ws4.img ..\..\Binary\hd_combo.img + +echo. +echo Building New Hard Disk Images... +echo. +call BuildDisk.cmd cpm22 wbw_hdnew ..\cpm22\cpm_wbw.sys +call BuildDisk.cmd zsdos wbw_hdnew ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd nzcom wbw_hdnew ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd cpm3 wbw_hdnew ..\cpm3\cpmldr.sys +call BuildDisk.cmd zpm3 wbw_hdnew ..\cpm3\cpmldr.sys +call BuildDisk.cmd ws4 wbw_hdnew + +if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp wbw_hdnew + +copy hdnew_prefix.bin ..\..\Binary\ + +echo. +echo Building Combo Disk (new format) Image... +copy /b hdnew_prefix.bin + ..\..\Binary\hdnew_cpm22.img + ..\..\Binary\hdnew_zsdos.img + ..\..\Binary\hdnew_nzcom.img + ..\..\Binary\hdnew_cpm3.img + ..\..\Binary\hdnew_zpm3.img + ..\..\Binary\hdnew_ws4.img ..\..\Binary\hdnew_combo.img diff --git a/Source/Images/BuildDisk.cmd b/Source/Images/BuildDisk.cmd new file mode 100644 index 00000000..d280c1fd --- /dev/null +++ b/Source/Images/BuildDisk.cmd @@ -0,0 +1 @@ +@PowerShell -ExecutionPolicy Unrestricted .\BuildDisk.ps1 %* \ No newline at end of file diff --git a/Source/Images/BuildDisk.ps1 b/Source/Images/BuildDisk.ps1 new file mode 100644 index 00000000..8401560f --- /dev/null +++ b/Source/Images/BuildDisk.ps1 @@ -0,0 +1,95 @@ +Param($Disk, $Format="", $SysFile="") + +$ErrorAction = 'Stop' + +$CpmToolsPath = '../../Tools/cpmtools' + +$env:PATH = $CpmToolsPath + ';' + $env:PATH + +if ($Format.Length -eq 0) +{ + Write-Error "No disk format specified!" -ErrorAction Stop + return +} + +switch ($Format) +{ + "wbw_fd144" + { + # 1.44MB Floppy Disk + $Desc = "1.44MB Floppy Disk" + $ImgFile = "fd144_${Disk}.img" + $MediaID = 6 + $Size = 1440KB + } + + "wbw_hd" + { + # Legacy Hard Disk Format + $Desc = "Hard Disk (legacy format)" + $ImgFile = "hd_${Disk}.img" + $MediaID = 4 + $Size = 8MB + 128KB + } + + "wbw_hdnew" + { + # New Hard Disk Format + $Desc = "Hard Disk (new format)" + $ImgFile = "hdnew_${Disk}.img" + $MediaID = 10 + $Size = 8MB + } +} + +if (-not (Test-Path("d_${Disk}/"))) +{ + Write-Error "Source directory d_${Disk} for disk ${Disk} not found!" -ErrorAction Stop + return +} + +"Generating $Desc $Disk..." + +if ($SysFile.Length -gt 0) + { [byte[]]$SysImg = [System.IO.File]::ReadAllBytes($SysFile) } +else + { [byte[]]$SysImg = @() } + +$Image = ($SysImg + ([byte[]](0xE5) * ($Size - $SysImg.length))) + +# $Image[1410] = 0x4D +# $Image[1411] = 0x49 +# $Image[1412] = 0x44 +# $Image[1413] = $MediaID + +[System.IO.File]::WriteAllBytes($ImgFile, $Image) + +for ($Usr=0; $Usr -lt 16; $Usr++) +{ + if (Test-Path ("d_${Disk}/u${Usr}/*")) + { + $Cmd = "cpmcp -f $Format $ImgFile d_${Disk}/u${Usr}/*.* ${Usr}:" + $Cmd + Invoke-Expression $Cmd + } +} + +if (Test-Path("d_${Disk}.txt")) +{ + foreach($Line in Get-Content "d_${Disk}.txt") + { + $Spec = $Line.Trim() + if (($Spec.Length -gt 0) -and ($Spec.Substring(0,1) -ne "#")) + { + $Cmd = "cpmcp -f $Format $ImgFile ${Spec}" + $Cmd + Invoke-Expression $Cmd + } + } +} + +"Moving image $ImgFile into output directory..." + +Move-Item $ImgFile -Destination "..\..\Binary\" -Force + +return \ No newline at end of file diff --git a/Source/Images/BuildFD.cmd b/Source/Images/BuildFD.cmd deleted file mode 100644 index b251f23e..00000000 --- a/Source/Images/BuildFD.cmd +++ /dev/null @@ -1 +0,0 @@ -@PowerShell -ExecutionPolicy Unrestricted .\BuildFD.ps1 %* \ No newline at end of file diff --git a/Source/Images/BuildFD.ps1 b/Source/Images/BuildFD.ps1 deleted file mode 100644 index f482bc10..00000000 --- a/Source/Images/BuildFD.ps1 +++ /dev/null @@ -1,69 +0,0 @@ -#Param([Parameter(Mandatory)]$Disk, $SysFile="") -Param($Disk, $SysFile="") - -$ErrorAction = 'Stop' - -$ImgFile = "fd_${Disk}.img" -$Fmt = "wbw_fd144" -$Size = 1440KB - -$CpmToolsPath = '../../Tools/cpmtools' - -$env:PATH = $CpmToolsPath + ';' + $env:PATH - -if (-not (Test-Path("d_${Disk}/"))) -{ - "Source directory d_${Disk} for disk ${Disk} not found!" - return -} - -"Generating Floppy Disk ${Disk}..." - -#$Blank = ([string]([char]0xE5)) * $Size -#Set-Content -Value $Blank -NoNewLine -Path $ImgFile -$Blank = ([byte[]](0xE5) * $Size) -[System.IO.File]::WriteAllBytes($ImgFile, $Blank) - -if ($SysFile.Length -gt 0) -{ - "Adding System Image $SysFile..." - #$Sys = Get-Content -Path "$SysFile.sys" -Raw - #$Img = Get-Content -Path $ImgFile -Raw - #$NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) - #Set-Content -NoNewLine -Path $ImgFile $NewImg - - $Cmd = "mkfs.cpm -f $Fmt -b $SysFile $ImgFile" - $Cmd - Invoke-Expression $Cmd -} - -for ($Usr=0; $Usr -lt 16; $Usr++) -{ - if (Test-Path ("d_${Disk}/u${Usr}/*")) - { - $Cmd = "cpmcp -f $Fmt $ImgFile d_${Disk}/u${Usr}/*.* ${Usr}:" - $Cmd - Invoke-Expression $Cmd - } -} - -if (Test-Path("d_${Disk}.txt")) -{ - foreach($Line in Get-Content "d_${Disk}.txt") - { - $Spec = $Line.Trim() - if (($Spec.Length -gt 0) -and ($Spec.Substring(0,1) -ne "#")) - { - $Cmd = "cpmcp -f $Fmt $ImgFile ${Spec}" - $Cmd - Invoke-Expression $Cmd - } - } -} - -"Moving image $ImgFile into output directory..." - -#&$env:COMSPEC /c move $ImgFile ..\..\Binary\ -Move-Item $ImgFile -Destination "..\..\Binary\" -Force - -return \ No newline at end of file diff --git a/Source/Images/BuildHD.cmd b/Source/Images/BuildHD.cmd deleted file mode 100644 index c7db537e..00000000 --- a/Source/Images/BuildHD.cmd +++ /dev/null @@ -1 +0,0 @@ -@PowerShell -ExecutionPolicy Unrestricted .\BuildHD.ps1 %* \ No newline at end of file diff --git a/Source/Images/BuildHD.ps1 b/Source/Images/BuildHD.ps1 deleted file mode 100644 index eedfa4aa..00000000 --- a/Source/Images/BuildHD.ps1 +++ /dev/null @@ -1,69 +0,0 @@ -#Param([Parameter(Mandatory)]$Disk, $SysFile="") -Param($Disk, $SysFile="") - -$ErrorAction = 'Stop' - -$ImgFile = "hd_${Disk}.img" -$Fmt = "wbw_hd0" -$Size = (128KB * 65) - -$CpmToolsPath = '../../Tools/cpmtools' - -$env:PATH = $CpmToolsPath + ';' + $env:PATH - -if (-not (Test-Path("d_${Disk}/"))) -{ - "Source directory d_${Disk} for disk ${Disk} not found!" - return -} - -"Generating Hard Disk ${Disk}..." - -#$Blank = ([string]([char]0xE5)) * $Size -#Set-Content -Value $Blank -NoNewLine -Path $ImgFile -$Blank = ([byte[]](0xE5) * $Size) -[System.IO.File]::WriteAllBytes($ImgFile, $Blank) - -if ($SysFile.Length -gt 0) -{ - "Adding System Image $SysFile..." - #$Sys = Get-Content -Path "$SysFile.sys" -Raw - #$Img = Get-Content -Path $ImgFile -Raw - #$NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) - #Set-Content -NoNewLine -Path $ImgFile $NewImg - - $Cmd = "mkfs.cpm -f $Fmt -b $SysFile $ImgFile" - $Cmd - Invoke-Expression $Cmd -} - -for ($Usr=0; $Usr -lt 16; $Usr++) -{ - if (Test-Path ("d_${Disk}/u${Usr}/*")) - { - $Cmd = "cpmcp -f $Fmt $ImgFile d_${Disk}/u${Usr}/*.* ${Usr}:" - $Cmd - Invoke-Expression $Cmd - } -} - -if (Test-Path("d_${Disk}.txt")) -{ - foreach($Line in Get-Content "d_${Disk}.txt") - { - $Spec = $Line.Trim() - if (($Spec.Length -gt 0) -and ($Spec.Substring(0,1) -ne "#")) - { - $Cmd = "cpmcp -f $Fmt $ImgFile ${Spec}" - $Cmd - Invoke-Expression $Cmd - } - } -} - -"Moving image $ImgFile into output directory..." - -#&$env:COMSPEC /c move $ImgFile ..\..\Binary\ -Move-Item $ImgFile -Destination "..\..\Binary\" -Force - -return \ No newline at end of file diff --git a/Source/Images/Common/FDISK80.COM b/Source/Images/Common/FDISK80.COM index 28a97094..7e862d67 100644 Binary files a/Source/Images/Common/FDISK80.COM and b/Source/Images/Common/FDISK80.COM differ diff --git a/Source/Images/d_bp/u0/MBASIC.COM b/Source/Images/Common/MBASIC.COM similarity index 100% rename from Source/Images/d_bp/u0/MBASIC.COM rename to Source/Images/Common/MBASIC.COM diff --git a/Source/Images/Makefile b/Source/Images/Makefile index 4832dc37..be90202f 100644 --- a/Source/Images/Makefile +++ b/Source/Images/Makefile @@ -1,16 +1,27 @@ # -# this makefile subsumes all the work done in Build.cmd, Build{Hd,Fd}.* +# this makefile subsumes all the work done in Build.cmd, BuildDisk.cmd, BuildDisk.ps1 # SYSTEMS = ../CPM22/cpm_wbw.sys ../ZSDOS/zsys_wbw.sys ../CPM3/cpmldr.sys -FDIMGS = fd_cpm22.img fd_zsdos.img fd_nzcom.img \ - fd_cpm3.img fd_zpm3.img fd_ws4.img +FDIMGS = fd144_cpm22.img fd144_zsdos.img fd144_nzcom.img \ + fd144_cpm3.img fd144_zpm3.img fd144_ws4.img HDIMGS = hd_cpm22.img hd_zsdos.img hd_nzcom.img \ hd_cpm3.img hd_zpm3.img hd_ws4.img # HDIMGS += hd_bp.img +HDNEWIMGS = hdnew_cpm22.img hdnew_zsdos.img hdnew_nzcom.img \ + hdnew_cpm3.img hdnew_zpm3.img hdnew_ws4.img +# HDNEWIMGS += hdnew_bp.img -OBJECTS = $(FDIMGS) $(HDIMGS) hd_combo.img -OTHERS = blank144 blankhd +HDPREFIX = +HDNEWPREFIX = hdnew_prefix.bin + +OBJECTS = $(FDIMGS) +OBJECTS += $(HDIMGS) hd_combo.img $(HDPREFIX) +OBJECTS += $(HDNEWIMGS) hdnew_combo.img $(HDNEWPREFIX) + +OTHERS = blank144 blankhd blankhdnew + +NODELETE = $(HDPREFIX) $(HDNEWPREFIX) DEST=../../Binary @@ -19,8 +30,11 @@ include $(TOOLS)/Makefile.inc DIFFPATH = $(DIFFTO)/Binary -hd_combo.img: $(HDIMGS) - cat $(HDIMGS) > $@ +hd_combo.img: $(HDPREFIX) $(HDIMGS) + cat $^ > $@ + +hdnew_combo.img: $(HDNEWPREFIX) $(HDNEWIMGS) + cat $^ > $@ # # this somewhat impenetrable and fragile code is used to build each of the images @@ -30,27 +44,39 @@ hd_combo.img: $(HDIMGS) # then process the d_{d}.txt file, copying in those files, and finally maybe put # an OS at the start of each image # + +FDSIZE := 1440 + blank144: - @echo Making Blank Floppy of size 1440k - @LANG=en_US.US-ASCII tr '\000' '\345' /dev/null + @echo Making Blank Floppy of size $(FDSIZE)k + @LC_CTYPE=en_US.US-ASCII tr '\000' '\345' /dev/null -HDSIZE := $(shell expr 128 '*' 65) +HDSIZE := 8320 +HDNEWSIZE := 8192 blankhd: @echo Making Blank Hd of size $(HDSIZE)k - @LANG=en_US.US-ASCII tr '\000' '\345' /dev/null - -%.img: $(SYSTEMS) blank144 blankhd Makefile + @LC_CTYPE=en_US.US-ASCII tr '\000' '\345' /dev/null + +blankhdnew: + @echo Making Blank HdNew of size $(HDNEWSIZE)k + @LC_CTYPE=en_US.US-ASCII tr '\000' '\345' /dev/null + +%.img: $(SYSTEMS) blank144 blankhd blankhdnew Makefile @sys= ; \ case $@ in \ (*cpm22*) sys=../CPM22/cpm_wbw.sys;; \ (*zsdos* | *nzcom*) sys=../ZSDOS/zsys_wbw.sys;; \ (*cpm3* | *zpm3*) sys=../CPM3/cpmldr.sys;; \ esac ; \ - if echo $@ | grep -q ^f ; then \ - fmt=wbw_fd144 ; type=fd_ ; proto=blank144 ; \ - else \ - fmt=wbw_hd0 ; type=hd_ ; proto=blankhd ; \ + if echo $@ | grep -q ^fd144_ ; then \ + fmt=wbw_fd144 ; type=fd144_ ; proto=blank144 ; \ + fi ; \ + if echo $@ | grep -q ^hd_ ; then \ + fmt=wbw_hd ; type=hd_ ; proto=blankhd ; \ + fi ; \ + if echo $@ | grep -q ^hdnew_ ; then \ + fmt=wbw_hdnew ; type=hdnew_ ; proto=blankhdnew ; \ fi ; \ d=$$(echo $(basename $@) | sed s/$$type//) ; \ echo Generating $@ ; \ @@ -59,6 +85,7 @@ blankhd: echo copying system $$sys to $@ ; \ $(BINDIR)/mkfs.cpm -f $$fmt -b $$sys $@ ; \ fi ; \ + # LC_CTYPE=en_US.US-ASCII echo $$mid | dd bs=1 count=4 seek=1410 conv=notrunc of=$@ ; \ for u in $$(seq 0 15) ; do \ dir=d_$$d/u$$u ; \ if [ -d $$dir ] ; then \ @@ -88,13 +115,17 @@ clean:: @rm -f *.ls imgdiff: - @for i in $(FDIMGS) $(HDIMGS) ; do \ + @for i in $(FDIMGS) $(HDIMGS) $(HDNEWIMGS) ; do \ echo $$i ; \ - if echo $$i | grep -q ^f ; then \ - fmt=wbw_fd144 ; \ - else \ - fmt=wbw_hd0 ; \ - fi ; \ + if echo $$i | grep -q ^fd144_ ; then \ + fmt=wbw_fd144 ; \ + fi ; \ + if echo $$i | grep -q ^hd_ ; then \ + fmt=wbw_hd ; \ + fi ; \ + if echo $$i | grep -q ^hdnew_ ; then \ + fmt=wbw_hdnew ; \ + fi ; \ $(BINDIR)/cpmls -i -f $$fmt $$i > $$i.ls ; \ $(BINDIR)/cpmls -i -f $$fmt $(DIFFPATH)/$$i > $$i.diff.ls ; \ done \ diff --git a/Source/Images/d_cpm22/u0/MBASIC.COM b/Source/Images/d_cpm22/u0/MBASIC.COM deleted file mode 100644 index c9ec3cd3..00000000 Binary files a/Source/Images/d_cpm22/u0/MBASIC.COM and /dev/null differ diff --git a/Source/Images/d_cpm22/u0/SUBMIT.COM b/Source/Images/d_cpm22/u0/SUBMIT.COM index 2e788827..f651bfee 100644 Binary files a/Source/Images/d_cpm22/u0/SUBMIT.COM and b/Source/Images/d_cpm22/u0/SUBMIT.COM differ diff --git a/Source/Images/d_nzcom/u0/SUBMIT.COM b/Source/Images/d_nzcom/u0/SUBMIT.COM index 2e788827..f651bfee 100644 Binary files a/Source/Images/d_nzcom/u0/SUBMIT.COM and b/Source/Images/d_nzcom/u0/SUBMIT.COM differ diff --git a/Source/Images/d_zpm3/u15/mbasic.com b/Source/Images/d_zpm3/u15/mbasic.com deleted file mode 100644 index c9ec3cd3..00000000 Binary files a/Source/Images/d_zpm3/u15/mbasic.com and /dev/null differ diff --git a/Source/Images/d_zsdos/u0/MBASIC.COM b/Source/Images/d_zsdos/u0/MBASIC.COM deleted file mode 100644 index c9ec3cd3..00000000 Binary files a/Source/Images/d_zsdos/u0/MBASIC.COM and /dev/null differ diff --git a/Source/Images/diskdefs b/Source/Images/diskdefs index 937bfcf2..a03e42f0 100644 --- a/Source/Images/diskdefs +++ b/Source/Images/diskdefs @@ -297,121 +297,169 @@ diskdef wbw_rom1024 os 2.2 end -# UNA 512KB ROM (128KB reserved, 384KB ROM Disk) +# RomWBW 720K floppy media +diskdef wbw_fd720 + seclen 512 + tracks 160 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 2.2 +end -diskdef una_rom512 +# RomWBW 1.44M floppy media +diskdef wbw_fd144 seclen 512 - tracks 12 - sectrk 64 + tracks 160 + sectrk 18 blocksize 2048 maxdir 256 skew 0 - boottrk 0 + boottrk 2 os 2.2 end -# UNA 512KB ROM (128KB reserved, 896KB ROM Disk) +# RomWBW 360K floppy media +diskdef wbw_fd360 + seclen 512 + tracks 80 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 2.2 +end -diskdef una_rom1024 +# RomWBW 1.20M floppy media +diskdef wbw_fd120 seclen 512 - tracks 28 - sectrk 64 + tracks 160 + sectrk 15 blocksize 2048 maxdir 256 skew 0 - boottrk 0 + boottrk 2 os 2.2 end -# RomWBW 8MB Hard Disk, LU 0-3 +# RomWBW 8320KB Hard Disk Slice +# Legacy format, 512 dir entries, 16,630 sectors / slice +diskdef wbw_hd + seclen 512 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 512 + skew 0 + boottrk 16 + os 2.2 +end + +# First 4 slices of wbw_hd diskdef wbw_hd0 seclen 512 - tracks 65 - sectrk 256 + tracks 1040 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 1 + boottrk 16 os 2.2 end diskdef wbw_hd1 seclen 512 - tracks 130 - sectrk 256 + tracks 2080 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 66 + boottrk 1056 os 2.2 end diskdef wbw_hd2 seclen 512 - tracks 195 - sectrk 256 + tracks 3120 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 131 + boottrk 2096 os 2.2 end diskdef wbw_hd3 seclen 512 - tracks 260 - sectrk 256 + tracks 4160 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 196 + boottrk 3136 os 2.2 end -# RomWBW 720K floppy media -diskdef wbw_fd720 + +# RomWBW 8MB Hard Disk +# New format, 1024 dir entries, 16,384 sectors / slice +# Pure filesystem image, no prefix +diskdef wbw_hdnew seclen 512 - tracks 160 - sectrk 9 - blocksize 2048 - maxdir 128 + tracks 1024 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 4 + boottrk 2 os 2.2 end -# RomWBW 1.44M floppy media -diskdef wbw_fd144 +# First 4 slices of wbw_hdnew +# Assumes 128KB prefix (256 sectors) +diskdef wbw_hdnew0 seclen 512 - tracks 160 - sectrk 18 - blocksize 2048 - maxdir 256 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 2 + boottrk 18 os 2.2 end -# RomWBW 360K floppy media -diskdef wbw_fd360 +diskdef wbw_hdnew1 seclen 512 - tracks 80 - sectrk 9 - blocksize 2048 - maxdir 128 + tracks 2064 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 4 + boottrk 1042 os 2.2 end -# RomWBW 1.20M floppy media -diskdef wbw_fd120 +diskdef wbw_hdnew2 seclen 512 - tracks 160 - sectrk 15 - blocksize 2048 - maxdir 256 + tracks 3112 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 2 + boottrk 2066 + os 2.2 +end + +diskdef wbw_hdnew3 + seclen 512 + tracks 4136 + sectrk 16 + blocksize 4096 + maxdir 1024 + skew 0 + boottrk 3114 os 2.2 end diff --git a/Source/Images/hdnew_prefix.bin b/Source/Images/hdnew_prefix.bin new file mode 100644 index 00000000..8ab54de5 Binary files /dev/null and b/Source/Images/hdnew_prefix.bin differ diff --git a/Source/Makefile b/Source/Makefile index 63c4204f..3df2bab5 100644 --- a/Source/Makefile +++ b/Source/Makefile @@ -9,7 +9,7 @@ SUBDIRS += Fonts SUBDIRS += CPM22 ZCPR ZCPR-DJ ZSDOS SUBDIRS += HBIOS CPM3 SUBDIRS += ZPM3 -SUBDIRS += BPBIOS +#SUBDIRS += BPBIOS SUBDIRS += Images TOOLS = ../Tools include $(TOOLS)/Makefile.inc diff --git a/Source/Prop/Spin/ParPortProp.spin b/Source/Prop/Spin/ParPortProp.spin index 6ecf049f..5e890c21 100644 --- a/Source/Prop/Spin/ParPortProp.spin +++ b/Source/Prop/Spin/ParPortProp.spin @@ -3,8 +3,8 @@ ************************************ * ParPortProp for RomWBW * * Interface to RBC ParPortProp * - * Version 0.96 * - * March 11, 2018 * + * Version 0.97 * + * May 9, 2020 * ************************************ Wayne Warthen @@ -29,11 +29,12 @@ Updates: 2018-03-11 WBW: Implement character attributes + 2020-05-09 WBW: Switch monitor refresh to 60Hz }} CON - VERSION = (((0 << 8) + 96) << 16) + 0 + VERSION = (((0 << 8) + 97) << 16) + 0 _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 @@ -608,7 +609,7 @@ PRI Activity DAT -strVer byte "F/W v0.96",0 +strVer byte "F/W v0.97",0 strHW byte "ParPortProp",0 strROM byte "RomWBW",0 diff --git a/Source/Prop/Spin/PropIO.spin b/Source/Prop/Spin/PropIO.spin index 3d677264..9e074fe0 100644 --- a/Source/Prop/Spin/PropIO.spin +++ b/Source/Prop/Spin/PropIO.spin @@ -3,8 +3,8 @@ ******************************* * PropIO for RomWBW * * Interface to RBC PropIO * - * Version 0.96 * - * March 11, 2018 * + * Version 0.97 * + * May 9, 2020 * ******************************* Wayne Warthen @@ -34,11 +34,12 @@ 2014-02-09 WBW: Clean up 2015-11-15 WBW: Added SD card capacity reporting 2018-03-11 WBW: Implement character attributes + 2020-05-09 WBW: Switch monitor refresh to 60Hz }} CON - VERSION = (((0 << 8) + 96) << 16) + 0 + VERSION = (((0 << 8) + 97) << 16) + 0 _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 @@ -337,7 +338,7 @@ PRI DumpBuffer(Buffer) | i, j DAT -strVer byte "F/W v0.96",0 +strVer byte "F/W v0.97",0 strHW byte "PropIO",0 strROM byte "RomWBW",0 diff --git a/Source/Prop/Spin/PropIO2.spin b/Source/Prop/Spin/PropIO2.spin index 9e01d3cb..ad1592f7 100644 --- a/Source/Prop/Spin/PropIO2.spin +++ b/Source/Prop/Spin/PropIO2.spin @@ -3,8 +3,8 @@ ********************************* * PropIO 2 for RomWBW * * Interface to RBC PropIO 2 * - * Version 0.96 * - * March 11, 2018 * + * Version 0.97 * + * May 9, 2020 * ********************************* Wayne Warthen @@ -34,11 +34,12 @@ 2014-02-08 WBW: Adaptation for PropIO 2 2015-11-15 WBW: Added SD card capacity reporting 2018-03-11 WBW: Implement character attributes + 2020-05-09 WBW: Switch monitor refresh to 60Hz }} CON - VERSION = (((0 << 8) + 96) << 16) + 0 + VERSION = (((0 << 8) + 97) << 16) + 0 _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 @@ -337,7 +338,7 @@ PRI DumpBuffer(Buffer) | i, j DAT -strVer byte "F/W v0.96",0 +strVer byte "F/W v0.97",0 strHW byte "PropIO v2",0 strROM byte "RomWBW",0 diff --git a/Source/Prop/Spin/vgacolour.spin b/Source/Prop/Spin/vgacolour.spin index c5cc2f80..0981fe55 100644 --- a/Source/Prop/Spin/vgacolour.spin +++ b/Source/Prop/Spin/vgacolour.spin @@ -20,6 +20,7 @@ CON +{ ' 640 x 480 @ 69Hz settings: 80 x 30 characters hp = 640 ' horizontal pixels @@ -33,6 +34,24 @@ CON hn = 1 ' horizontal normal sync state (0|1) vn = 1 ' vertical normal sync state (0|1) pr = 30 ' pixel rate in MHz at 80MHz system clock (5MHz granularity) +} + +'{ +' 640 x 480 @ 60Hz settings: 80 x 40 characters + + hp = 640 'horizontal pixels + vp = 480 'vertical pixels + hf = 16 'horizontal front porch pixels + hs = 96 'horizontal sync pixels + hb = 48 'horizontal back porch pixels + vf = 10 'vertical front porch lines + vs = 2 'vertical sync lines + vb = 33 'vertical back porch lines + hn = 1 'horizontal normal sync state (0|1) + vn = 1 'vertical normal sync state (0|1) + pr = 25 'pixel rate in MHz at 80MHz system clock (5MHz granularity) +'} + ' columns and rows diff --git a/Source/RomDsk/ROM_1024KB/FDISK80.COM b/Source/RomDsk/ROM_1024KB/FDISK80.COM index 28a97094..7e862d67 100644 Binary files a/Source/RomDsk/ROM_1024KB/FDISK80.COM and b/Source/RomDsk/ROM_1024KB/FDISK80.COM differ diff --git a/Source/RomDsk/ROM_512KB/FDISK80.COM b/Source/RomDsk/ROM_512KB/FDISK80.COM index 28a97094..7e862d67 100644 Binary files a/Source/RomDsk/ROM_512KB/FDISK80.COM and b/Source/RomDsk/ROM_512KB/FDISK80.COM differ diff --git a/Source/UBIOS/ubios.inc b/Source/UBIOS/ubios.inc index 546c671d..58684c02 100644 --- a/Source/UBIOS/ubios.inc +++ b/Source/UBIOS/ubios.inc @@ -11,27 +11,17 @@ BF_CIOOST .EQU BF_CIO + 4 ; CHARACTER OUTPUT STATUS BF_DIO .EQU $40 BF_DIOREAD .EQU BF_DIO + 2 ; DISK READ BF_DIOWRITE .EQU BF_DIO + 3 ; DISK WRITE -;; -;; MEMORY BANK CONFIGURATION -;; -;ROMSIZE .EQU 512 -;RAMSIZE .EQU 512 ; -;BID_ROM0 .EQU $0000 -;BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1)) -;BID_RAM0 .EQU $8000 -;BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1)) +; MEDIA ID VALUES ; -;BID_BOOT .EQU BID_ROM0 ; BOOT BANK -;BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK -;BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK -;BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK -;BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK -;BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK -; -;BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK -;BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK -;BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.) -;BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK -;BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) -;BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K +MID_NONE .EQU 0 +MID_MDROM .EQU 1 +MID_MDRAM .EQU 2 +MID_RF .EQU 3 +MID_HD .EQU 4 +MID_FD720 .EQU 5 +MID_FD144 .EQU 6 +MID_FD360 .EQU 7 +MID_FD120 .EQU 8 +MID_FD111 .EQU 9 +MID_HDNEW .EQU 10 diff --git a/Source/ver.inc b/Source/ver.inc index 311c55f8..86655b37 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -1,5 +1,5 @@ #DEFINE RMJ 3 #DEFINE RMN 1 -#DEFINE RUP 0 +#DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1-pre.12" +#DEFINE BIOSVER "3.1.1-pre.7" diff --git a/Source/ver.lib b/Source/ver.lib index f5cc5c1c..ee5204d5 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -1,7 +1,7 @@ rmj equ 3 rmn equ 1 -rup equ 0 +rup equ 1 rtp equ 0 biosver macro - db "3.1-pre.12" + db "3.1.1-pre.7" endm diff --git a/Tools/cpmtools/diskdefs b/Tools/cpmtools/diskdefs index 937bfcf2..a03e42f0 100644 --- a/Tools/cpmtools/diskdefs +++ b/Tools/cpmtools/diskdefs @@ -297,121 +297,169 @@ diskdef wbw_rom1024 os 2.2 end -# UNA 512KB ROM (128KB reserved, 384KB ROM Disk) +# RomWBW 720K floppy media +diskdef wbw_fd720 + seclen 512 + tracks 160 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 2.2 +end -diskdef una_rom512 +# RomWBW 1.44M floppy media +diskdef wbw_fd144 seclen 512 - tracks 12 - sectrk 64 + tracks 160 + sectrk 18 blocksize 2048 maxdir 256 skew 0 - boottrk 0 + boottrk 2 os 2.2 end -# UNA 512KB ROM (128KB reserved, 896KB ROM Disk) +# RomWBW 360K floppy media +diskdef wbw_fd360 + seclen 512 + tracks 80 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 2.2 +end -diskdef una_rom1024 +# RomWBW 1.20M floppy media +diskdef wbw_fd120 seclen 512 - tracks 28 - sectrk 64 + tracks 160 + sectrk 15 blocksize 2048 maxdir 256 skew 0 - boottrk 0 + boottrk 2 os 2.2 end -# RomWBW 8MB Hard Disk, LU 0-3 +# RomWBW 8320KB Hard Disk Slice +# Legacy format, 512 dir entries, 16,630 sectors / slice +diskdef wbw_hd + seclen 512 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 512 + skew 0 + boottrk 16 + os 2.2 +end + +# First 4 slices of wbw_hd diskdef wbw_hd0 seclen 512 - tracks 65 - sectrk 256 + tracks 1040 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 1 + boottrk 16 os 2.2 end diskdef wbw_hd1 seclen 512 - tracks 130 - sectrk 256 + tracks 2080 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 66 + boottrk 1056 os 2.2 end diskdef wbw_hd2 seclen 512 - tracks 195 - sectrk 256 + tracks 3120 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 131 + boottrk 2096 os 2.2 end diskdef wbw_hd3 seclen 512 - tracks 260 - sectrk 256 + tracks 4160 + sectrk 16 blocksize 4096 maxdir 512 skew 0 - boottrk 196 + boottrk 3136 os 2.2 end -# RomWBW 720K floppy media -diskdef wbw_fd720 + +# RomWBW 8MB Hard Disk +# New format, 1024 dir entries, 16,384 sectors / slice +# Pure filesystem image, no prefix +diskdef wbw_hdnew seclen 512 - tracks 160 - sectrk 9 - blocksize 2048 - maxdir 128 + tracks 1024 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 4 + boottrk 2 os 2.2 end -# RomWBW 1.44M floppy media -diskdef wbw_fd144 +# First 4 slices of wbw_hdnew +# Assumes 128KB prefix (256 sectors) +diskdef wbw_hdnew0 seclen 512 - tracks 160 - sectrk 18 - blocksize 2048 - maxdir 256 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 2 + boottrk 18 os 2.2 end -# RomWBW 360K floppy media -diskdef wbw_fd360 +diskdef wbw_hdnew1 seclen 512 - tracks 80 - sectrk 9 - blocksize 2048 - maxdir 128 + tracks 2064 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 4 + boottrk 1042 os 2.2 end -# RomWBW 1.20M floppy media -diskdef wbw_fd120 +diskdef wbw_hdnew2 seclen 512 - tracks 160 - sectrk 15 - blocksize 2048 - maxdir 256 + tracks 3112 + sectrk 16 + blocksize 4096 + maxdir 1024 skew 0 - boottrk 2 + boottrk 2066 + os 2.2 +end + +diskdef wbw_hdnew3 + seclen 512 + tracks 4136 + sectrk 16 + blocksize 4096 + maxdir 1024 + skew 0 + boottrk 3114 os 2.2 end diff --git a/Tools/simh/Sim.cfg b/Tools/simh/Sim.cfg index 8c8af2bf..a8c126f5 100644 --- a/Tools/simh/Sim.cfg +++ b/Tools/simh/Sim.cfg @@ -27,8 +27,8 @@ attach hdsk0 ..\..\Binary\hd_combo.img attach hdsk1 ..\..\Binary\hd_combo.img set hdsk0 format=HDSK set hdsk1 format=HDSK -set hdsk0 geom=T:2048/N:256/S:512 -set hdsk1 geom=T:2048/N:256/S:512 +set hdsk0 geom=T:8192/N:256/S:512 +set hdsk1 geom=T:8192/N:256/S:512 set hdsk0 wrtenb set hdsk1 wrtenb