mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:33:12 -06:00
Merge remote-tracking branch 'upstream/dev' into duart
This commit is contained in:
@@ -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:|<device>[<unitnum>]:[<slicenum>]}]][,...]",13,10
|
||||
.db " ex. ASSIGN (display all active assignments)",13,10
|
||||
.db " ASSIGN /? (display version and usage)",13,10
|
||||
|
||||
@@ -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
|
||||
;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
;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
|
||||
;
|
||||
;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
|
||||
;
|
||||
; 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+TonA)
|
||||
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, 0
|
||||
;
|
||||
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 + AmplB)
|
||||
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+TonB)
|
||||
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, 1
|
||||
;
|
||||
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 B, BF_SNDVOL
|
||||
LD C, 0
|
||||
LD H, 0
|
||||
LD A, (AYREGS + AmplC)
|
||||
AND $0F
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
LD L, A
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDPRD
|
||||
LD C, 0
|
||||
LD HL, (AYREGS+TonC)
|
||||
ld a, h
|
||||
AND $0F
|
||||
LD H, A
|
||||
RST 08
|
||||
|
||||
LD B, BF_SNDPLAY
|
||||
LD C, 0
|
||||
LD D, 2
|
||||
RST 08
|
||||
|
||||
;
|
||||
LD BC, (BF_SNDPLAY*256)+0 ; PLAY
|
||||
LD D, 2 ; DEVICE 0
|
||||
RST 08 ; CHANNEL 0
|
||||
|
||||
RET
|
||||
#ENDIF
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -297,77 +297,6 @@ diskdef wbw_rom1024
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# UNA 512KB ROM (128KB reserved, 384KB ROM Disk)
|
||||
|
||||
diskdef una_rom512
|
||||
seclen 512
|
||||
tracks 12
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
skew 0
|
||||
boottrk 0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# UNA 512KB ROM (128KB reserved, 896KB ROM Disk)
|
||||
|
||||
diskdef una_rom1024
|
||||
seclen 512
|
||||
tracks 28
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
skew 0
|
||||
boottrk 0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# RomWBW 8MB Hard Disk, LU 0-3
|
||||
diskdef wbw_hd0
|
||||
seclen 512
|
||||
tracks 65
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 1
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd1
|
||||
seclen 512
|
||||
tracks 130
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 66
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd2
|
||||
seclen 512
|
||||
tracks 195
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 131
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd3
|
||||
seclen 512
|
||||
tracks 260
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 196
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# RomWBW 720K floppy media
|
||||
diskdef wbw_fd720
|
||||
seclen 512
|
||||
@@ -415,3 +344,122 @@ diskdef wbw_fd120
|
||||
boottrk 2
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# 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 1040
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 16
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd1
|
||||
seclen 512
|
||||
tracks 2080
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 1056
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd2
|
||||
seclen 512
|
||||
tracks 3120
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 2096
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd3
|
||||
seclen 512
|
||||
tracks 4160
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 3136
|
||||
os 2.2
|
||||
end
|
||||
|
||||
|
||||
# RomWBW 8MB Hard Disk
|
||||
# New format, 1024 dir entries, 16,384 sectors / slice
|
||||
# Pure filesystem image, no prefix
|
||||
diskdef wbw_hdnew
|
||||
seclen 512
|
||||
tracks 1024
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 2
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# First 4 slices of wbw_hdnew
|
||||
# Assumes 128KB prefix (256 sectors)
|
||||
diskdef wbw_hdnew0
|
||||
seclen 512
|
||||
tracks 1040
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 18
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hdnew1
|
||||
seclen 512
|
||||
tracks 2064
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 1042
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hdnew2
|
||||
seclen 512
|
||||
tracks 3112
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -51,109 +51,211 @@
|
||||
jp 0 ; reserved for future expansion
|
||||
jp 0 ; reserved for future expansion
|
||||
|
||||
mbrsec equ dtabuf
|
||||
|
||||
boot:
|
||||
|
||||
if cmdline
|
||||
|
||||
; 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
|
||||
|
||||
; Do the real work
|
||||
call boot0
|
||||
|
||||
; Restore original stack and return
|
||||
ld sp,(stksav)
|
||||
ret
|
||||
|
||||
boot0:
|
||||
|
||||
if cmdline
|
||||
|
||||
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
|
||||
; 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
|
||||
|
||||
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
|
||||
|
||||
jr boot2
|
||||
; 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
|
||||
read:
|
||||
; 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
; 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
|
||||
|
||||
; 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,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
|
||||
|
||||
dsk$login0:
|
||||
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 <A>
|
||||
|
||||
dsk$read:
|
||||
; ld ix,30H
|
||||
; halt
|
||||
|
||||
;ld a,'R'
|
||||
;call cout
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
;call phex8
|
||||
ret ; return
|
||||
|
||||
; lxi h,read$msg ; point at " Read "
|
||||
; mvi a,88h ! mvi b,01h ; 1797 read + Z80DMA direction
|
||||
; jmp rw$common
|
||||
ld a,13h ; HBIOS disk read function
|
||||
ld (func),a ; save it
|
||||
jr dsk$rw ; common disk read/write code
|
||||
|
||||
dsk$write:
|
||||
;ld ix,32H
|
||||
;halt
|
||||
ld a,14h ; HBIOS disk write function
|
||||
ld (func),a ; save it
|
||||
jr dsk$rw ; common disk read/write code
|
||||
|
||||
dsk$rw:
|
||||
; Common disk read/write routine
|
||||
; Assumes func is set to HBIOS read or write
|
||||
|
||||
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
|
||||
; 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
|
||||
ret ; return
|
||||
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
|
||||
|
||||
; 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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -51,7 +51,7 @@ bin2bcd1:
|
||||
pop bc
|
||||
ret
|
||||
|
||||
if 0
|
||||
if 1
|
||||
;
|
||||
; Print the hex word value in HL
|
||||
;
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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.
|
||||
|
||||
Binary file not shown.
BIN
Source/Doc/SIO+CTC Baud Rate Options.xlsx
Normal file
BIN
Source/Doc/SIO+CTC Baud Rate Options.xlsx
Normal file
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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)
|
||||
;
|
||||
|
||||
@@ -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)
|
||||
;
|
||||
|
||||
@@ -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)
|
||||
;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
;
|
||||
|
||||
@@ -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)
|
||||
;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
;
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
494
Source/HBIOS/ay38910.asm
Normal file
494
Source/HBIOS/ay38910.asm
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -297,77 +297,6 @@ diskdef wbw_rom1024
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# UNA 512KB ROM (128KB reserved, 384KB ROM Disk)
|
||||
|
||||
diskdef una_rom512
|
||||
seclen 512
|
||||
tracks 12
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
skew 0
|
||||
boottrk 0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# UNA 512KB ROM (128KB reserved, 896KB ROM Disk)
|
||||
|
||||
diskdef una_rom1024
|
||||
seclen 512
|
||||
tracks 28
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
skew 0
|
||||
boottrk 0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# RomWBW 8MB Hard Disk, LU 0-3
|
||||
diskdef wbw_hd0
|
||||
seclen 512
|
||||
tracks 65
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 1
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd1
|
||||
seclen 512
|
||||
tracks 130
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 66
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd2
|
||||
seclen 512
|
||||
tracks 195
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 131
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd3
|
||||
seclen 512
|
||||
tracks 260
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 196
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# RomWBW 720K floppy media
|
||||
diskdef wbw_fd720
|
||||
seclen 512
|
||||
@@ -415,3 +344,122 @@ diskdef wbw_fd120
|
||||
boottrk 2
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# 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 1040
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 16
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd1
|
||||
seclen 512
|
||||
tracks 2080
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 1056
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd2
|
||||
seclen 512
|
||||
tracks 3120
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 2096
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd3
|
||||
seclen 512
|
||||
tracks 4160
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 3136
|
||||
os 2.2
|
||||
end
|
||||
|
||||
|
||||
# RomWBW 8MB Hard Disk
|
||||
# New format, 1024 dir entries, 16,384 sectors / slice
|
||||
# Pure filesystem image, no prefix
|
||||
diskdef wbw_hdnew
|
||||
seclen 512
|
||||
tracks 1024
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 2
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# First 4 slices of wbw_hdnew
|
||||
# Assumes 128KB prefix (256 sectors)
|
||||
diskdef wbw_hdnew0
|
||||
seclen 512
|
||||
tracks 1040
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 18
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hdnew1
|
||||
seclen 512
|
||||
tracks 2064
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 1042
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hdnew2
|
||||
seclen 512
|
||||
tracks 3112
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
;
|
||||
diskboot1:
|
||||
; 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:
|
||||
or a ; set flags to check loop ctr
|
||||
jr z,diskboot4 ; done if counter exhausted
|
||||
add hl,bc ; add one slice to low word
|
||||
jr nc,diskboot3 ; check for carry
|
||||
inc de ; if so, bump high word
|
||||
diskboot3:
|
||||
dec a ; dec loop downcounter
|
||||
jr diskboot2 ; and loop
|
||||
;
|
||||
diskboot4:
|
||||
ld (loadlba),hl ; save lba, low word
|
||||
ld (loadlba+2),de ; save lba, high word
|
||||
;
|
||||
; Seek to 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
|
||||
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
|
||||
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
|
||||
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,(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,diskboot7 ; done if counter exhausted
|
||||
add hl,bc ; add one slice to low word
|
||||
jr nc,diskboot6 ; check for carry
|
||||
inc de ; if so, bump high word
|
||||
diskboot6:
|
||||
dec a ; dec loop downcounter
|
||||
jr diskboot5 ; and loop
|
||||
;
|
||||
diskboot7:
|
||||
ld (lba),hl ; update lba, low word
|
||||
ld (lba+2),de ; update lba, high word
|
||||
;
|
||||
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,diskboot9 ; check for carry
|
||||
inc de ; if so, bump high word
|
||||
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
|
||||
;
|
||||
; 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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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!!!
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,46 +1,161 @@
|
||||
;
|
||||
;======================================================================
|
||||
; I/O BIT DRIVER FOR CONSOLE BELL FOR SBC V2 USING BIT 0 OF RTC DRIVER
|
||||
;======================================================================
|
||||
;
|
||||
SPK_INIT:
|
||||
CALL NEWLINE ; FORMATTING
|
||||
; 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)
|
||||
;
|
||||
;======================================================================
|
||||
; DRIVER INITIALIZATION
|
||||
;======================================================================
|
||||
;
|
||||
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
|
||||
;
|
||||
|
||||
@@ -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
|
||||
;
|
||||
|
||||
@@ -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
|
||||
|
||||
1
Source/Images/BuildDisk.cmd
Normal file
1
Source/Images/BuildDisk.cmd
Normal file
@@ -0,0 +1 @@
|
||||
@PowerShell -ExecutionPolicy Unrestricted .\BuildDisk.ps1 %*
|
||||
95
Source/Images/BuildDisk.ps1
Normal file
95
Source/Images/BuildDisk.ps1
Normal file
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
@PowerShell -ExecutionPolicy Unrestricted .\BuildFD.ps1 %*
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
@PowerShell -ExecutionPolicy Unrestricted .\BuildHD.ps1 %*
|
||||
@@ -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
|
||||
Binary file not shown.
@@ -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
|
||||
#
|
||||
blank144:
|
||||
@echo Making Blank Floppy of size 1440k
|
||||
@LANG=en_US.US-ASCII tr '\000' '\345' </dev/zero | dd of=$@ bs=1024 count=1440 2>/dev/null
|
||||
|
||||
HDSIZE := $(shell expr 128 '*' 65)
|
||||
FDSIZE := 1440
|
||||
|
||||
blank144:
|
||||
@echo Making Blank Floppy of size $(FDSIZE)k
|
||||
@LC_CTYPE=en_US.US-ASCII tr '\000' '\345' </dev/zero | dd of=$@ bs=1024 count=$(FDSIZE) 2>/dev/null
|
||||
|
||||
HDSIZE := 8320
|
||||
HDNEWSIZE := 8192
|
||||
|
||||
blankhd:
|
||||
@echo Making Blank Hd of size $(HDSIZE)k
|
||||
@LANG=en_US.US-ASCII tr '\000' '\345' </dev/zero | dd of=$@ bs=1024 count=$(HDSIZE) 2>/dev/null
|
||||
|
||||
%.img: $(SYSTEMS) blank144 blankhd Makefile
|
||||
@LC_CTYPE=en_US.US-ASCII tr '\000' '\345' </dev/zero | dd of=$@ bs=1024 count=$(HDSIZE) 2>/dev/null
|
||||
|
||||
blankhdnew:
|
||||
@echo Making Blank HdNew of size $(HDNEWSIZE)k
|
||||
@LC_CTYPE=en_US.US-ASCII tr '\000' '\345' </dev/zero | dd of=$@ bs=1024 count=$(HDNEWSIZE) 2>/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 \
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -297,77 +297,6 @@ diskdef wbw_rom1024
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# UNA 512KB ROM (128KB reserved, 384KB ROM Disk)
|
||||
|
||||
diskdef una_rom512
|
||||
seclen 512
|
||||
tracks 12
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
skew 0
|
||||
boottrk 0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# UNA 512KB ROM (128KB reserved, 896KB ROM Disk)
|
||||
|
||||
diskdef una_rom1024
|
||||
seclen 512
|
||||
tracks 28
|
||||
sectrk 64
|
||||
blocksize 2048
|
||||
maxdir 256
|
||||
skew 0
|
||||
boottrk 0
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# RomWBW 8MB Hard Disk, LU 0-3
|
||||
diskdef wbw_hd0
|
||||
seclen 512
|
||||
tracks 65
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 1
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd1
|
||||
seclen 512
|
||||
tracks 130
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 66
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd2
|
||||
seclen 512
|
||||
tracks 195
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 131
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd3
|
||||
seclen 512
|
||||
tracks 260
|
||||
sectrk 256
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 196
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# RomWBW 720K floppy media
|
||||
diskdef wbw_fd720
|
||||
seclen 512
|
||||
@@ -415,3 +344,122 @@ diskdef wbw_fd120
|
||||
boottrk 2
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# 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 1040
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 16
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd1
|
||||
seclen 512
|
||||
tracks 2080
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 1056
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd2
|
||||
seclen 512
|
||||
tracks 3120
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 2096
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hd3
|
||||
seclen 512
|
||||
tracks 4160
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 512
|
||||
skew 0
|
||||
boottrk 3136
|
||||
os 2.2
|
||||
end
|
||||
|
||||
|
||||
# RomWBW 8MB Hard Disk
|
||||
# New format, 1024 dir entries, 16,384 sectors / slice
|
||||
# Pure filesystem image, no prefix
|
||||
diskdef wbw_hdnew
|
||||
seclen 512
|
||||
tracks 1024
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 2
|
||||
os 2.2
|
||||
end
|
||||
|
||||
# First 4 slices of wbw_hdnew
|
||||
# Assumes 128KB prefix (256 sectors)
|
||||
diskdef wbw_hdnew0
|
||||
seclen 512
|
||||
tracks 1040
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 18
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hdnew1
|
||||
seclen 512
|
||||
tracks 2064
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
boottrk 1042
|
||||
os 2.2
|
||||
end
|
||||
|
||||
diskdef wbw_hdnew2
|
||||
seclen 512
|
||||
tracks 3112
|
||||
sectrk 16
|
||||
blocksize 4096
|
||||
maxdir 1024
|
||||
skew 0
|
||||
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
|
||||
|
||||
BIN
Source/Images/hdnew_prefix.bin
Normal file
BIN
Source/Images/hdnew_prefix.bin
Normal file
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user