Browse Source

Merge remote-tracking branch 'upstream/dev' into duart

pull/133/head
Chris Odorjan 6 years ago
parent
commit
10bddd8a17
  1. 1
      .gitignore
  2. 1
      Binary/Clean.cmd
  3. 10
      Doc/ChangeLog.txt
  4. BIN
      Doc/Hard Disk Anatomy.pdf
  5. BIN
      Doc/RomWBW Applications.pdf
  6. BIN
      Doc/RomWBW Architecture.pdf
  7. BIN
      Doc/RomWBW Disk Catalog.pdf
  8. BIN
      Doc/RomWBW Getting Started.pdf
  9. BIN
      Doc/SIO+CTC Baud Rate Options.pdf
  10. 3
      Makefile
  11. 6
      ReadMe.md
  12. 6
      ReadMe.txt
  13. 46
      Source/Apps/Assign.asm
  14. 35
      Source/Apps/FDU/FDU.asm
  15. 12
      Source/Apps/Timer.asm
  16. 6
      Source/Apps/Tune/Makefile
  17. 231
      Source/Apps/Tune/Tune.asm
  18. 15
      Source/Apps/Tune/cli.inc
  19. 8
      Source/Apps/Tune/hbios.inc
  20. 150
      Source/BPBIOS/diskdefs
  21. 720
      Source/CBIOS/cbios.asm
  22. 12
      Source/CBIOS/util.asm
  23. 5
      Source/CPM3/bioskrnl.asm
  24. 720
      Source/CPM3/biosldr.z80
  25. 39
      Source/CPM3/boot.z80
  26. 588
      Source/CPM3/diskio.z80
  27. 4
      Source/CPM3/genbnk.dat
  28. 3
      Source/CPM3/move.z80
  29. 3
      Source/CPM3/optzpm.lib
  30. 2
      Source/CPM3/util.z80
  31. 88
      Source/Doc/Architecture.md
  32. 4
      Source/Doc/GettingStarted.md
  33. BIN
      Source/Doc/Graphics/Hard Disk Anatomy.vsd
  34. BIN
      Source/Doc/SIO+CTC Baud Rate Options.xlsx
  35. 4
      Source/HBIOS/API.txt
  36. 2
      Source/HBIOS/Config/MK4_std.asm
  37. 2
      Source/HBIOS/Config/RCZ180_ext.asm
  38. 2
      Source/HBIOS/Config/RCZ180_nat.asm
  39. 4
      Source/HBIOS/Config/RCZ80_std.asm
  40. 2
      Source/HBIOS/Config/SBC_std.asm
  41. 2
      Source/HBIOS/Config/SCZ180_126.asm
  42. 2
      Source/HBIOS/Config/SCZ180_130.asm
  43. 2
      Source/HBIOS/Config/SCZ180_131.asm
  44. 53
      Source/HBIOS/audio.inc
  45. 122
      Source/HBIOS/ay.asm
  46. 494
      Source/HBIOS/ay38910.asm
  47. 12
      Source/HBIOS/bqrtc.asm
  48. 20
      Source/HBIOS/cfg_dyno.asm
  49. 20
      Source/HBIOS/cfg_ezz80.asm
  50. 20
      Source/HBIOS/cfg_master.asm
  51. 20
      Source/HBIOS/cfg_mk4.asm
  52. 20
      Source/HBIOS/cfg_n8.asm
  53. 20
      Source/HBIOS/cfg_rcz180.asm
  54. 20
      Source/HBIOS/cfg_rcz80.asm
  55. 20
      Source/HBIOS/cfg_sbc.asm
  56. 20
      Source/HBIOS/cfg_scz180.asm
  57. 2
      Source/HBIOS/cfg_una.asm
  58. 19
      Source/HBIOS/cfg_zeta.asm
  59. 19
      Source/HBIOS/cfg_zeta2.asm
  60. 13
      Source/HBIOS/dbgmon.asm
  61. 150
      Source/HBIOS/diskdefs
  62. 16
      Source/HBIOS/dsrtc.asm
  63. 25
      Source/HBIOS/fd.asm
  64. 44
      Source/HBIOS/hbios.asm
  65. 31
      Source/HBIOS/hbios.inc
  66. 12
      Source/HBIOS/hdsk.asm
  67. 16
      Source/HBIOS/intrtc.asm
  68. 622
      Source/HBIOS/romldr.asm
  69. 31
      Source/HBIOS/sd.asm
  70. 16
      Source/HBIOS/simrtc.asm
  71. 455
      Source/HBIOS/sn76489.asm
  72. 207
      Source/HBIOS/spk.asm
  73. 14
      Source/HBIOS/std.asm
  74. 48
      Source/Images/Build.cmd
  75. 1
      Source/Images/BuildDisk.cmd
  76. 95
      Source/Images/BuildDisk.ps1
  77. 1
      Source/Images/BuildFD.cmd
  78. 69
      Source/Images/BuildFD.ps1
  79. 1
      Source/Images/BuildHD.cmd
  80. 69
      Source/Images/BuildHD.ps1
  81. BIN
      Source/Images/Common/FDISK80.COM
  82. 0
      Source/Images/Common/MBASIC.COM
  83. 77
      Source/Images/Makefile
  84. BIN
      Source/Images/d_cpm22/u0/MBASIC.COM
  85. BIN
      Source/Images/d_cpm22/u0/SUBMIT.COM
  86. BIN
      Source/Images/d_nzcom/u0/SUBMIT.COM
  87. BIN
      Source/Images/d_zpm3/u15/mbasic.com
  88. BIN
      Source/Images/d_zsdos/u0/MBASIC.COM
  89. 150
      Source/Images/diskdefs
  90. BIN
      Source/Images/hdnew_prefix.bin
  91. 2
      Source/Makefile
  92. 9
      Source/Prop/Spin/ParPortProp.spin
  93. 9
      Source/Prop/Spin/PropIO.spin
  94. 9
      Source/Prop/Spin/PropIO2.spin
  95. 19
      Source/Prop/Spin/vgacolour.spin
  96. BIN
      Source/RomDsk/ROM_1024KB/FDISK80.COM
  97. BIN
      Source/RomDsk/ROM_512KB/FDISK80.COM
  98. 34
      Source/UBIOS/ubios.inc
  99. 4
      Source/ver.inc
  100. 4
      Source/ver.lib

1
.gitignore

@ -82,6 +82,7 @@ Tools/unix/zx/zx
!Source/BPBIOS/Z34RCP11/cledsave.com
!Source/Fonts
!Source/Images/**/*.[Cc][Oo][Mm]
!Source/Images/hdnew_prefix.bin
!Source/RomDsk/**/*.[Cc][Oo][Mm]
!Source/UBIOS/FSFAT.BIN
!Source/UBIOS/UNA-BIOS.BIN

1
Binary/Clean.cmd

@ -2,6 +2,7 @@
setlocal
if exist *.bin del *.bin
if exist *.dat del *.dat
if exist *.com del *.com
if exist *.img del *.img
if exist *.rom del *.rom

10
Doc/ChangeLog.txt

@ -1,3 +1,9 @@
Version 3.1.1
-------------
- WBW: Version bumped due to pervasive changes
- WBW: Preliminary hard disk partition support (backward compatible)
- WBW: Change Propeller VGA signal timings to 60Hz refresh
Version 3.1
-----------
- WBW: Refactored ROM Loader
@ -14,6 +20,10 @@ Version 3.1
- M?O: RomWBW Disk Catalog document
- DEN: Updated TMS to optionally trigger SYSTIMER interrupt (TMSTIMENABLE)
- J?M: Updated KERMIT applications with VT100 terminal support
- A?C: Added support for EPFDC
- PMS: Added AY driver with new sound API support
- DEN: Allow immediate autoboot startup
- DEN: Support for floppy device count parameter
Version 3.0.1
-------------

BIN
Doc/Hard Disk Anatomy.pdf

Binary file not shown.

BIN
Doc/RomWBW Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW Architecture.pdf

Binary file not shown.

BIN
Doc/RomWBW Disk Catalog.pdf

Binary file not shown.

BIN
Doc/RomWBW Getting Started.pdf

Binary file not shown.

BIN
Doc/SIO+CTC Baud Rate Options.pdf

Binary file not shown.

3
Makefile

@ -1,7 +1,6 @@
all:
$(MAKE) --directory Tools/unix
$(MAKE) --directory Source
$(MAKE) --directory Source/Images
clean:
$(MAKE) --directory Tools/unix clean
@ -15,5 +14,5 @@ clobber:
rm -f typescript
diff:
$(MAKE) --directory diff
$(MAKE) --directory Source diff

6
ReadMe.md

@ -3,7 +3,7 @@
## Z80/Z180 System Software
Version 3.1 Pre-release
Thursday 23 April 2020
Friday 8 May 2020
Wayne Warthen <wwarthen@gmail.com>
@ -1137,8 +1137,8 @@ applications are no longer provided.
driver.
- Ed Brindley contributed some of the code that supports the RC2014
platform.
- Phil Summers contributed Forth and BASIC in ROM as well as a long
list of general code enhancements.
- Phil Summers contributed Forth and BASIC in ROM, the AY-3-8910 sound
driver as well as a long list of general code enhancements.
- Phillip Stevens contributed support for FreeRTOS.
- Curt Mayer contributed the Linux / MacOS build process.
- UNA BIOS and FDISK80 are the products of John Coffman.

6
ReadMe.txt

@ -3,7 +3,7 @@ RomWBW
Z80/Z180 System Software
Version 3.1 Pre-release
Thursday 23 April 2020
Friday 8 May 2020
Wayne Warthen wwarthen@gmail.com
@ -1169,8 +1169,8 @@ applications are no longer provided.
driver.
- Ed Brindley contributed some of the code that supports the RC2014
platform.
- Phil Summers contributed Forth and BASIC in ROM as well as a long
list of general code enhancements.
- Phil Summers contributed Forth and BASIC in ROM, the AY-3-8910 sound
driver as well as a long list of general code enhancements.
- Phillip Stevens contributed support for FreeRTOS.
- Curt Mayer contributed the Linux / MacOS build process.
- UNA BIOS and FDISK80 are the products of John Coffman.

46
Source/Apps/Assign.asm

@ -22,7 +22,10 @@
; 2016-04-08 [WBW] Determine key memory addresses dynamically
; 2019-08-07 [WBW] Fixed DPB selection error
; 2019-11-17 [WBW] Added preliminary CP/M 3 support
; 2019-12-24 [WBW] Fixed location of BIOS save area
; 2019-12-24 [WBW] Fixed location of BIOS save area\
; 2020-04-29 [WBW] Updated for larger DPH (16 -> 20 bytes)
; 2020-05-06 [WBW] Add patch level to version compare
; 2020-05-10 [WBW] Set media change flag in XDPH for CP/M 3
;_______________________________________________________________________________
;
; ToDo:
@ -41,8 +44,7 @@ bdos .equ $0005 ; BDOS invocation vector
;
stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp
;
rmj .equ 3 ; CBIOS version - major
rmn .equ 1 ; CBIOS version - minor
#include "../ver.inc"
;
;===============================================================================
; Code Section
@ -118,10 +120,14 @@ init:
jp nz,errinv ; abort with invalid config block
inc hl ; next byte (major/minor version)
ld a,(hl) ; load it
cp rmj << 4 | rmn ; match?
cp RMJ << 4 | RMN ; match?
jp nz,errver ; abort with invalid os version
inc hl ; bump past
inc hl ; ... version info
inc hl ; next byte (update/patch)
ld a,(hl) ; load it
and $F0 ; eliminate patch num
cp RUP << 4 ; match?
jp nz,errver ; abort with invalid os version
inc hl ; bump past version info
;
; dereference HL to point to CBIOS extension data
ld a,(hl) ; dereference HL
@ -546,7 +552,8 @@ dph_init2:
ld a,(hl) ; unit to A
push bc ; save loop control
push hl ; save drive map pointer
ld hl,16 ; size of a DPH structure
;ld hl,16 ; size of a DPH structure
ld hl,20 ; size of a DPH structure
call alloc ; allocate space for dph
jp c,instovf ; handle overflow error
push hl ; save DPH location
@ -771,6 +778,10 @@ instc2:
inc hl ; bump to slice field of DPH field
ld a,(de) ; get slice from mapwrk
ld (hl),a ; put slice into DPH field
ld a,11 ; media byte is 11 bytes ahead
call addhl ; bump HL to media byte adr
or $FF ; use $FF to signify media change
ld (hl),a ; set media flag byte
inc de ; bump to next mapwrk entry
inc de ; ...
inc de ; ...
@ -781,7 +792,7 @@ instc3:
push hl ; save drvtbl entry adr
push de ; save mapwrk entry adr
ld hl,(dphadr) ; get cur dph address
ld de,$23 ; size of xdph
ld de,$27 ; size of xdph
add hl,de ; bump to next dph
ld (dphadr),hl ; save it
pop de ; recover mapwrk entry adr
@ -794,6 +805,16 @@ instc3:
add hl,de ; HL := SELMEM func
ld a,1 ; bank 1 is tpa bank
call jphl
;
; set SCB drive door open flag
ld a,$54 ; SCB drive door opened flag
ld (scboff),a ; set offset parm
or $FF ; SCB operation, $FF = set
ld (scbop),a ; set operation parm
ld (scbval),a ; set value parm to $FF
ld c,$31 ; get/set system control block
ld de,scbpb ; scb parameter block adr
call bdos
;
call drvrst ; perform BDOS drive reset
;
@ -1822,6 +1843,11 @@ heaplim .dw 0 ; heap limit address
;
dirbuf .dw 0 ; directory buffer location
;
scbpb: ; BDOS SCB get/set parm block
scboff .db $54 ; media open door flag
scbop .db $FF ; set a byte
scbval .dw $FF ; value to set
;
mapwrk .fill (4 * 16),$FF ; working copy of drive map
;
devtbl: ; device table
@ -1866,10 +1892,10 @@ stack .equ $ ; stack top
; Messages
;
indent .db " ",0
msgban1 .db "ASSIGN v1.1a for RomWBW CP/M, 24-Dec-2019",0
msgban1 .db "ASSIGN v1.3 for RomWBW CP/M, 10-May-2020",0
msghb .db " (HBIOS Mode)",0
msgub .db " (UBIOS Mode)",0
msgban2 .db "Copyright 2019, Wayne Warthen, GNU GPL v3",0
msgban2 .db "Copyright 2020, Wayne Warthen, GNU GPL v3",0
msguse .db "Usage: ASSIGN D:[=[{D:|<device>[<unitnum>]:[<slicenum>]}]][,...]",13,10
.db " ex. ASSIGN (display all active assignments)",13,10
.db " ASSIGN /? (display version and usage)",13,10

35
Source/Apps/FDU/FDU.asm

@ -45,6 +45,7 @@
; - USE EOT=R TO END R/W AFTER ONE SECTOR INSTEAD
; OF USING PULSE TC
; 2020-01-05: V5.4 ADDED SUPPORT FOR DYNO FDC
; 2020-04-29: v5.5 ADDED SUPPORT FOR ETCHED PIXELS FDC
;
;_______________________________________________________________________________
;
@ -79,6 +80,7 @@ FDC_RCSMC .EQU 6
FDC_RCWDC .EQU 7
FDC_SMZ80 .EQU 8
FDC_DYNO .EQU 9
FDC_EPFDC .EQU 10
;
; FDC MODE
;
@ -213,7 +215,7 @@ INIT5:
XOR A
RET
STR_BANNER .DB "Floppy Disk Utility (FDU) v5.4, 05-jAN-2020$"
STR_BANNER .DB "Floppy Disk Utility (FDU) v5.5, 29-Apr-2020$"
STR_BANNER2 .DB "Copyright (C) 2020, Wayne Warthen, GNU GPL v3","$"
STR_HBIOS .DB " [HBIOS]$"
STR_UBIOS .DB " [UBIOS]$"
@ -284,6 +286,7 @@ FDCTBL: ; LABEL CONFIG DATA
.DW STR_RCWDC, CFG_RCWDC
.DW STR_SMZ80, CFG_SMZ80
.DW STR_DYNO, CFG_DYNO
.DW STR_EPFDC, CFG_EPFDC
FDCCNT .EQU ($-FDCTBL)/4 ; FD CONTROLLER COUNT
;
; FDC LABEL STRINGS
@ -298,6 +301,7 @@ STR_RCSMC .TEXT "RC-SMC$"
STR_RCWDC .TEXT "RC-WDC$"
STR_SMZ80 .TEXT "SMZ80$"
STR_DYNO .TEXT "DYNO$"
STR_EPFDC .TEXT "EPFDC$"
;
; FDC CONFIGURATION BLOCKS
;
@ -419,6 +423,17 @@ CFG_DYNO:
.DB 0FFH ; PSEUDO DMA DATA PORT
.DB _PCAT ; MODE=
;
CFG_EPFDC:
.DB 048H ; FDC MAIN STATUS REGISTER
.DB 049H ; FDC DATA PORT
.DB 0FFH ; DATA INPUT REGISTER
.DB 04AH ; DIGITAL OUTPUT REGISTER (LATCH)
.DB 04BH ; DCR
.DB 0FFH ; DACK
.DB 04CH ; TERMINAL COUNT (W/ DACK)
.DB 0FFH ; PSEUDO DMA DATA PORT
.DB _PCAT ; MODE=
;
FDCID .DB 0 ; FDC IDENTIFIER (0 INDEXED)
FDCBM .DB 0 ; FDC ID BITMAP
FDCLBL .DW 0 ; POINTER TO ACTIVE FDC LABEL STRING
@ -437,6 +452,7 @@ FSS_MENU:
.TEXT " (H) RC2014 WDC (SMB)\r\n"
.TEXT " (I) SmallZ80 Expansion\r\n"
.TEXT " (J) Dyno-Card FDC, D1030\r\n"
.TEXT " (K) RC2014 EPFDC\r\n"
.TEXT " (X) Exit\r\n"
.TEXT "=== OPTION ===> $\r\n"
;
@ -1517,6 +1533,7 @@ MD_MAP:
.DB %00000001 ; RCWDC POLL
.DB %00000001 ; SMZ80 POLL
.DB %00000001 ; DYNO POLL
.DB %00000001 ; EPFDC POLL
;
; MEDIA DESCRIPTION BLOCK
;
@ -1877,7 +1894,7 @@ FM_DRAW0B: ; ZETA, DIO3
LD A,(FST_DOR)
AND 00000010B
JR FM_DRAW1
FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO
FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC
LD A,(FST_DOR)
AND 11110000B
JR FM_DRAW1
@ -2030,7 +2047,7 @@ FM_MOTOR0B: ; ZETA, DIO3
LD A,(FST_DOR)
AND 00000010B
JR FM_MOTOR1
FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO
FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC
LD A,(FST_DOR)
AND 11110000B
JR FM_MOTOR1
@ -2769,7 +2786,7 @@ FC_INIT1: ; DIO
FC_INIT2: ; ZETA, DIO3
LD A,(FCD_DORB)
JR FC_INIT5
FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO
FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC
LD A,(FCD_DORC)
JR FC_INIT5
FC_INIT4: ; WDSMC
@ -2813,7 +2830,7 @@ FC_RESETFDC1: ; ZETA, DIO3, RCSMC
POP AF
OUT (C),A
JR FC_RESETFDC3
FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO
FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC
LD A,0
OUT (C),A
LD A,(FST_DOR)
@ -2840,7 +2857,7 @@ FC_PULSETC:
;RES 0,A
;OUT (C),A
;JR FC_PULSETC2
;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO
;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC
;LD C,(IY+CFG_TC)
;IN A,(C)
;JR FC_PULSETC2
@ -2872,7 +2889,7 @@ FC_MOTORON2: ; ZETA, DIO3
LD HL,FST_DOR ; POINT TO FDC_DOR
SET 1,(HL)
JR FC_MOTORON5
FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO
FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC
LD HL,FST_DOR ; POINT TO FDC_DOR
LD A,(HL) ; START WITH CURRENT DOR
AND 11111100B ; GET RID OF ANY ACTIVE DS BITS
@ -2936,7 +2953,7 @@ FC_MOTOROFF2: ; ZETA, DIO3
LD HL,FST_DOR ; POINT TO FDC_DOR
RES 1,(HL)
JR FC_MOTOROFF5
FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO
FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC
LD HL,FST_DOR ; POINT TO FDC_DOR
LD A,DORC_INIT
LD (HL),A
@ -3806,7 +3823,7 @@ DORB_BR500 .EQU 10100000B ; 500KBPS
;
DORB_INIT .EQU DORB_BR250
;
; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO ***
; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO/EPFDC ***
;
DORC_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED
;

12
Source/Apps/Timer.asm

@ -41,8 +41,11 @@ rmn .equ 1 ; intended CBIOS version - minor
;
bf_sysver .equ $F1 ; BIOS: VER function
bf_sysget .equ $F8 ; HBIOS: SYSGET function
bf_sysset .equ $F9 ; HBIOS: SYSGET function
bf_sysgettimer .equ $D0 ; TIMER subfunction
bf_syssettimer .equ $D0 ; TIMER subfunction
bf_sysgetsecs .equ $D1 ; SECONDS subfunction
bf_syssetsecs .equ $D1 ; SECONDS subfunction
;
;===============================================================================
; Code Section
@ -106,6 +109,15 @@ process00:
jr process00 ; continue looking for options
;
process0:
;
; Test of API function to set seconds value
;ld b,bf_sysset ; HBIOS SYSGET function
;ld c,bf_syssetsecs ; SECONDS subfunction
;ld de,0 ; set seconds value
;ld hl,1000 ; ... to 1000
;rst 08 ; call HBIOS, DE:HL := seconds value
;
; get and print seconds value
call crlf2 ; formatting
;
process1:

6
Source/Apps/Tune/Makefile

@ -7,13 +7,13 @@ include $(TOOLS)/Makefile.inc
DEPS := Tune.asm $(shell find . -name '*.inc')
Tune.com: $(DEPS)
$(TASM) -dWBW Tune.asm Tune.com
$(TASM) -dWBW Tune.asm Tune.com Tune.lst
Tunezx.com: $(DEPS)
$(TASM) -dZX Tune.asm Tunezx.com
$(TASM) -dZX Tune.asm Tunezx.com Tunezx.lst
Tunemsx.com: $(DEPS)
$(TASM) -dMSX Tune.asm Tunemsx.com
$(TASM) -dMSX Tune.asm Tunemsx.com Tunemsx.lst
all::
mkdir -p $(DEST)/Tunes

231
Source/Apps/Tune/Tune.asm

@ -40,6 +40,7 @@
; 2020-02-11 [WBW] Made hardware config & detection more flexible
; 2020-03-29 [WBW] Fix error in Z180 I/O W/S bracketing
; 2020-04-25 [DEN] Added support to use HBIOS Sound driver
; 2020-05-02 [PMS] Add support for SBC-V2 slow-io hack
;_______________________________________________________________________________
;
; ToDo:
@ -53,14 +54,18 @@
#include "hbios.inc"
#include "cpm.inc"
#include "tune.inc"
;
HEAPEND .EQU $C000 ; End of heap storage
;
TYPPT2 .EQU 1 ; FILTYP value for PT2 sound file
TYPPT3 .EQU 2 ; FILTYP value for PT3 sound file
TYPMYM .EQU 3 ; FILTYP value for MYM sound file
;
; HIGH SPEED CPU CONTROL
;
SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER
CPUFAMZ180 .EQU 1 ; USE Z180 WAIT STATE MANAGEMENT
;
;Conditional assembly - use -D switch on TASM or uz80as assembler to control
_ZX .EQU 0 ; 1) Version of ROUT (ZX or MSX standards)
_MSX .EQU 0
@ -401,43 +406,44 @@ IDBIO2:
;
;
;
SLOWCPU:
LD A,(Z180) ; Z180 base I/O port
CP $FF ; Check for no value
RET Z ; Bail out if no value
ADD A,$1E ; Apply offset of CMR register
LD C,A ; And put it in C
LD B,0 ; MSB for 16-bit I/O
IN A,(C) ; Get current value
LD (CMRSAV),A ; Save it to restore later
XOR A ; Go slow
OUT (C),A ; And update CMR
INC C ; Now point to CCR register
IN A,(C) ; Get current value
LD (CCRSAV),A ; Save it to restore later
XOR A ; Go slow
OUT (C),A ; And update CCR
RET
;
;
;
NORMCPU:
LD A,(Z180) ; Z180 base I/O port
CP $FF ; Check for no value
RET Z ; Bail out if no value
ADD A,$1E ; Apply offset of CMR register
LD C,A ; And put it in C
LD B,0 ; MSB for 16-bit I/O
LD A,(CMRSAV) ; Get original CMR value
OUT (C),A ; And update CMR
INC C ; Now point to CCR register
LD A,(CCRSAV) ; Get original CCR value
OUT (C),A ; And update CCR
RET
;
;
;SLOWCPU:
; LD A,(Z180) ; Z180 base I/O port
; CP $FF ; Check for no value
; RET Z ; Bail out if no value
; ADD A,$1E ; Apply offset of CMR register
; LD C,A ; And put it in C
; LD B,0 ; MSB for 16-bit I/O
; IN A,(C) ; Get current value
; LD (CMRSAV),A ; Save it to restore later
; XOR A ; Go slow
; OUT (C),A ; And update CMR
; INC C ; Now point to CCR register
; IN A,(C) ; Get current value
; LD (CCRSAV),A ; Save it to restore later
; XOR A ; Go slow
; OUT (C),A ; And update CCR
; RET
;
;
;
;NORMCPU:
; LD A,(Z180) ; Z180 base I/O port
; CP $FF ; Check for no value
; RET Z ; Bail out if no value
; ADD A,$1E ; Apply offset of CMR register
; LD C,A ; And put it in C
; LD B,0 ; MSB for 16-bit I/O
; LD A,(CMRSAV) ; Get original CMR value
; OUT (C),A ; And update CMR
; INC C ; Now point to CCR register
; LD A,(CCRSAV) ; Get original CCR value
; OUT (C),A ; And update CCR
; RET
;
; SLOW DOWN I/O FOR FAST CPU'S
;
SLOWIO:
#IF (CPUFAMZ180)
LD A,(Z180) ; Z180 base I/O port
CP $FF ; Check for no value
RET Z ; Bail out if no value
@ -448,11 +454,17 @@ SLOWIO:
LD (DCSAV),A ; Save it to restore later
OR %00110000 ; Force slow operation (I/O W/S=3)
OUT (C),A ; And update DCNTL
#ENDIF
#IF (SBCV2004)
LD A,8 ; sbc-v2-004 change to
OUT (112),A ; half clock speed
#ENDIF
RET
;
;
; RESTORE I/O SPEED FOR FAST CPU'S
;
NORMIO:
#IF (CPUFAMZ180)
LD A,(Z180) ; Z180 base I/O port
CP $FF ; Check for no value
RET Z ; Bail out if no value
@ -461,8 +473,12 @@ NORMIO:
LD B,0 ; MSB for 16-bit I/O
LD A,(DCSAV) ; Get saved DCNTL value
OUT (C),A ; And restore it
#ENDIF
#IF (SBCV2004)
LD A,0 ; sbc-v2-004 change to
OUT (112),A ; normal clock speed
#ENDIF
RET
;
ERRBIO: ; Invalid BIOS or version
LD DE,MSGBIO
@ -717,7 +733,9 @@ CurPos .DB 0 ;for visualization only (i.e. no need for playing)
;Identifier
.IF Id
.DB "=Uni PT2 and PT3 Player r.",Release,"="
.DB "=Uni PT2 and PT3 Player r."
.DB Release
.DB "="
.ENDIF
.IF LoopChecker
@ -1980,87 +1998,78 @@ LOUT OUT (C), A ; SELECT REGISTER
JP M, LOUT2 ; IF BIT 7 SET, RETURN W/O WRITING VALUE
LD C, D ; SELECT DATA PORT
OUT (C), A ; WRITE VALUE TO REGISTER 13
LOUT2
CALL NORMIO
LOUT2 CALL NORMIO
EI
RET ; AND DONE
PLAYVIAHBIOS:
LD B, BF_SNDVOL
LD C, 0
LD H, 0
LD A, (AYREGS + AmplA)
AND $0F
rlca
rlca
rlca
rlca
LD L, A
RST 08
LD B, BF_SNDPRD
LD C, 0
LD HL, (AYREGS+TonA)
ld a, h
AND $0F
LD H, A
RST 08
LD B, BF_SNDPLAY
LD C, 0
LD D, 0
RST 08
LD B, BF_SNDVOL
LD C, 0
LD H, 0
LD A, (AYREGS + AmplB)
AND $0F
rlca
rlca
rlca
rlca
LD L, A
;
; CHANNEL 0 (LEFT)
;
LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME
LD A, (AYREGS + AmplA) ; DEVICE 0
ADD A,A ; GET 4-BIT
ADD A,A ; VOLUME 0-15
ADD A,A ; AND CONVERT
ADD A,A ; TO HBIOS
LD L, A ; RANGE 0-255
RST 08
LD B, BF_SNDPRD
LD C, 0
LD HL, (AYREGS+TonB)
ld a, h
AND $0F
LD H, A
;
LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD
LD HL, (AYREGS+TonA) ; DEVICE 0
LD A, H ; GET 12-BIT ONE PERIOD
AND $0F ; MASK OFF HIGH
LD H, A ; NIBBLE
RST 08
LD B, BF_SNDPLAY
LD C, 0
LD D, 1
;
LD BC, (BF_SNDPLAY*256)+0 ; PLAY
LD D, 0 ; DEVICE 0
RST 08 ; CHANNEL 0
;
; CHANNEL 1 (MIDDLE)
;
LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME
LD A, (AYREGS + AmplB) ; DEVICE 0
ADD A,A ; GET 4-BIT
ADD A,A ; VOLUME 0-15
ADD A,A ; AND CONVERT
ADD A,A ; TO HBIOS
LD L, A ; RANGE 0-255
RST 08
LD B, BF_SNDVOL
LD C, 0
LD H, 0
LD A, (AYREGS + AmplC)
AND $0F
rlca
rlca
rlca
rlca
LD L, A
;
LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD
LD HL, (AYREGS+TonB) ; DEVICE 0
ld A, H ; GET 12-BIT ONE PERIOD
AND $0F ; MASK OFF HIGH
LD H, A ; NIBBLE
RST 08
LD B, BF_SNDPRD
LD C, 0
LD HL, (AYREGS+TonC)
ld a, h
AND $0F
LD H, A
;
LD BC, (BF_SNDPLAY*256)+0 ; PLAY
LD D, 1 ; DEVICE 0
RST 08 ; CHANNEL 0
;
; CHANNEL 2 (RIGHT)
;
LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME
LD A, (AYREGS + AmplC) ; DEVICE 0
ADD A,A ; GET 4-BIT
ADD A,A ; VOLUME 0-15
ADD A,A ; AND CONVERT
ADD A,A ; TO HBIOS
LD L, A ; RANGE 0-255
RST 08
LD B, BF_SNDPLAY
LD C, 0
LD D, 2
;
LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD
LD HL, (AYREGS+TonC) ; DEVICE 0
LD A, H ; GET 12-BIT ONE PERIOD
AND $0F ; MASK OFF HIGH
LD H, A ; NIBBLE
RST 08
;
LD BC, (BF_SNDPLAY*256)+0 ; PLAY
LD D, 2 ; DEVICE 0
RST 08 ; CHANNEL 0
RET
#ENDIF

15
Source/Apps/Tune/cli.inc

@ -7,15 +7,20 @@ CLI_ABRT_IF_OPT_FIRST:
RET
CLI_HAVE_HBIOS_SWITCH:
LD HL, CLIARGS ; TEST FOR --HBIOS ON COMNMAND LINE
LD HL, CLIARGS ; TEST FOR --HBIOS ON COMMAND LINE
LD DE, HBIOSOPT
CALL STRINDEX
JR NZ, CLI_HAVE_HBIOS_SWITCH1
OR $FF ; IS NOT HBIOS
OR $FF ; MATCHED --HBIOS
LD (HBIOSMD), A
RET
CLI_HAVE_HBIOS_SWITCH1:
AND 0 ; IS HBIOS
LD BC,(BF_SYSGET*256)+BF_SND
RST 08 ; CHECK WE HAVE
XOR A ; AT LEAST ONE
CP E ; SOUND DEVICE
RET NZ
JP ERRHW
CLI_HAVE_HBIOS_SWITCH1 ; NOT MATCHED --HBIOS
XOR A
LD (HBIOSMD), A
RET

8
Source/Apps/Tune/hbios.inc

@ -6,10 +6,10 @@ RMN .EQU 1 ; intended CBIOS version - minor
BF_SYSVER .EQU $F1 ; BIOS: VER function
BF_SYSGET .EQU $F8 ; HBIOS: SYSGET function
;
BF_SND .EQU $50
BF_SNDRESET .EQU BF_SND + 0 ; RESET SOUND SYSTEM
BF_SNDVOL .EQU BF_SND + 1 ; REQUEST SOUND VOL - D IS CHANNEL, E CONTAINS VOLUME (255 MAX, 0 SILENT) - SCALED AS REQUIRED BY DRIVER (EG: MAPS TO JUST 4 BIT RESOLUTION FOR SN76489)
BF_SNDPRD .EQU BF_SND + 2 ; REQUEST SOUND PERIOD - D IS CHANNEL, HL CONTAINS PERIOD (0 LOWEST NOTE) - SCALED BY DRIVER (EG: MAPS TO JUST 10 BITS FOR SN76489 )
BF_SNDVOL .EQU BF_SND + 1 ; REQUEST SOUND VOL - L CONTAINS VOLUME (255 MAX, 0 SILENT) - SCALED AS REQUIRED BY DRIVER (EG: MAPS TO JUST 4 BIT RESOLUTION FOR SN76489)
BF_SNDPRD .EQU BF_SND + 2 ; REQUEST SOUND PERIOD - HL CONTAINS DRIVER SPECIFIC VALUE
BF_SNDNOTE .EQU BF_SND + 3 ; REQUEST NOTE - L CONTAINS NOTE - EACH VALUE IS QUARTER NOTE
BF_SNDPLAY .EQU BF_SND + 4 ; INITIATE THE REQUESTED SOUND COMMAND
BF_SNDQUERY .EQU BF_SND + 5 ; D IS CHANNEL, E IS SUBCOMMAND
BF_SNDQUERY .EQU BF_SND + 5 ; E IS SUBFUNCTION

150
Source/BPBIOS/diskdefs

@ -297,121 +297,169 @@ diskdef wbw_rom1024
os 2.2
end
# UNA 512KB ROM (128KB reserved, 384KB ROM Disk)
# RomWBW 720K floppy media
diskdef wbw_fd720
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
diskdef una_rom512
# RomWBW 1.44M floppy media
diskdef wbw_fd144
seclen 512
tracks 12
sectrk 64
tracks 160
sectrk 18
blocksize 2048
maxdir 256
skew 0
boottrk 0
boottrk 2
os 2.2
end
# UNA 512KB ROM (128KB reserved, 896KB ROM Disk)
# RomWBW 360K floppy media
diskdef wbw_fd360
seclen 512
tracks 80
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
diskdef una_rom1024
# RomWBW 1.20M floppy media
diskdef wbw_fd120
seclen 512
tracks 28
sectrk 64
tracks 160
sectrk 15
blocksize 2048
maxdir 256
skew 0
boottrk 0
boottrk 2
os 2.2
end
# RomWBW 8MB Hard Disk, LU 0-3
# RomWBW 8320KB Hard Disk Slice
# Legacy format, 512 dir entries, 16,630 sectors / slice
diskdef wbw_hd
seclen 512
tracks 1040
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 16
os 2.2
end
# First 4 slices of wbw_hd
diskdef wbw_hd0
seclen 512
tracks 65
sectrk 256
tracks 1040
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 1
boottrk 16
os 2.2
end
diskdef wbw_hd1
seclen 512
tracks 130
sectrk 256
tracks 2080
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 66
boottrk 1056
os 2.2
end
diskdef wbw_hd2
seclen 512
tracks 195
sectrk 256
tracks 3120
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 131
boottrk 2096
os 2.2
end
diskdef wbw_hd3
seclen 512
tracks 260
sectrk 256
tracks 4160
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 196
boottrk 3136
os 2.2
end
# RomWBW 720K floppy media
diskdef wbw_fd720
# RomWBW 8MB Hard Disk
# New format, 1024 dir entries, 16,384 sectors / slice
# Pure filesystem image, no prefix
diskdef wbw_hdnew
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 128
tracks 1024
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 4
boottrk 2
os 2.2
end
# RomWBW 1.44M floppy media
diskdef wbw_fd144
# First 4 slices of wbw_hdnew
# Assumes 128KB prefix (256 sectors)
diskdef wbw_hdnew0
seclen 512
tracks 160
sectrk 18
blocksize 2048
maxdir 256
tracks 1040
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 2
boottrk 18
os 2.2
end
# RomWBW 360K floppy media
diskdef wbw_fd360
diskdef wbw_hdnew1
seclen 512
tracks 80
sectrk 9
blocksize 2048
maxdir 128
tracks 2064
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 4
boottrk 1042
os 2.2
end
# RomWBW 1.20M floppy media
diskdef wbw_fd120
diskdef wbw_hdnew2
seclen 512
tracks 160
sectrk 15
blocksize 2048
maxdir 256
tracks 3112
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 2
boottrk 2066
os 2.2
end
diskdef wbw_hdnew3
seclen 512
tracks 4136
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 3114
os 2.2
end

720
Source/CBIOS/cbios.asm

File diff suppressed because it is too large

12
Source/CBIOS/util.asm

@ -430,3 +430,15 @@ PRTHEXBUF1:
INC DE
DJNZ PRTHEXBUF1
RET
;
; LEFT SHIFT DE:HL BY B BITS (B > 0)
;
RL32:
OR A ; CLEAR CARRY
RL L
RL H
RL E
RL D
DJNZ RL32
RET

5
Source/CPM3/bioskrnl.asm

@ -507,6 +507,11 @@ seldsk:
mov a,m ! inx h ! mov h,m ! mov l,a ; get address of LOGIN routine
call ipchl ; call LOGIN
pop h ; recover DPH pointer
; WBW Start
ora a
rz ; successful return
lxi h,0 ; error occurred, clear HL
; WBW End
not$first$select:
ret

720
Source/CPM3/biosldr.z80

@ -51,109 +51,211 @@
jp 0 ; reserved for future expansion
jp 0 ; reserved for future expansion
boot:
if cmdline
mbrsec equ dtabuf
boot:
; The main module (cpmldr.asm) does not expect the
; boot call to use much stack. We use our own during
; this routine to avoid issues.
ld (stksav),sp
ld sp,stack
boot1:
ld de,msgunit
call writestr
call cin
push af
call cout
pop af
sub '0'
ld (unit),a
jr c,selerr
ld bc,0F810h ; HBIOS, get disk unit count
call 0FFF0h ; do it, E := disk unit count
ld a,(unit) ; get unit num back
cp e ; compare to entry
jr nc,selerr ; loop if too high
; Do the real work
call boot0
ld de,msgslc
call writestr
call cin
push af
call cout
pop af
sub '0'
ld (slice),a
jr c,selerr
cp 10
jr nc,selerr
; Restore original stack and return
ld sp,(stksav)
ret
boot0:
if cmdline
jr boot2
boot1:
; Get disk unit from user
ld de,msgunit ; disk unit prompt
call writestr ; display on console
call cin ; get a character
push af ; save it
call cout ; echo character
pop af ; restore it
sub '0' ; convert to binary
ld (unit),a ; save it
jr c,selerr ; loop if below 0 entered
ld bc,0F810h ; HBIOS, get disk unit count
call 0FFF0h ; do it, E := disk unit count
ld a,(unit) ; get unit num back
cp e ; compare to entry
jr nc,selerr ; loop if too high
; Get disk slice from user
ld de,msgslc ; slice prompt
call writestr ; display on console
call cin ; get a character
push af ; save it
call cout ; echo it
pop af ; restore it
sub '0' ; convert to binary
ld (slice),a ; save it
jr c,selerr ; loop if below 0 entered
cp 10 ; check for over 9
jr nc,selerr ; loop if over 9
ld de,crlf ; linefeed
call writestr ; ... to console
jr boot2 ; boot w/ unit & slice
selerr:
ld de,msginv
call writestr
jr boot1
; Display invalid entry message and restart
ld de,msginv ; error message
call writestr ; display on console
jr boot1 ; loop
boot2:
ld de,crlf
call writestr
; Record unit & slice w/ HBIOS
ld bc,0F9E0h ; HBIOS func: set boot info
ld a,(unit) ; get unit
ld d,a ; put in D
ld a,(slice) ; get slice
ld e,a ; put in E
ld l,0 ; Bank is always zero
call 0FFF0h ; do it
ld sp,(stksav)
ld bc,0F9E0h ; HBIOS func: set boot info
ld a,(unit) ; get unit
ld d,a ; put in D
ld a,(slice) ; get slice
ld e,a ; put in E
ld l,0 ; Bank is always zero
call 0FFF0h ; do it
else
ld bc,0F8E0h ; HBIOS func: get boot info
call 0FFF0h ; do it, D := boot unit, E: := slice
ld a,d ; move unit to A
ld (unit),a ; save it
ld a,e ; move slice to A
ld (slice),a ; save it
; Get unit & slice from HBIOS
ld bc,0F8E0h ; HBIOS func: get boot info
call 0FFF0h ; do it, D := boot unit, E: := slice
ld a,d ; move unit to A
ld (unit),a ; save it
ld a,e ; move slice to A
ld (slice),a ; save it
endif
ld a,(unit) ; Get boot unit
ld c,a ; put in C
ld b,18h ; HBIOS Media function
ld e,1 ; Enable media check/discovery
call 0FFF0H ; HBIOS call
ld a,e ; Resultant media id to accum
or a ; Set flags
;halt
;
; !!! Need to do something on error !!!
;
ret z ; Bail out on error
; Check that drive actually exists
ld bc,0F810h ; HBIOS func: get disk count
call 0FFF0h ; do it, E=disk count
ld a,(unit) ; get boot disk unit
cp e ; compare to count
jp nc,err_nodisk ; handle no disk err
; Sense media to determine media format
ld a,(unit) ; Get boot unit
ld c,a ; put in C
ld b,18h ; HBIOS Media function
ld e,1 ; Enable media check/discovery
call 0FFF0H ; HBIOS call
jp nz,err_diskio ; handle error
ld a,e ; resultant media id to accum
ld (medid),a ; save media id
or a ; set flags, 0 is no media
jp z,err_diskio ; handle no media error
; Initialize slice start LBA & sectors per slice
ld hl,0 ; assume slice starts
ld (lba),hl ; ... at LBA offset
ld (lba+2),hl ; ... of zero
ld hl,16640 ; assume legacy value for
ld (sps),hl ; ... sectors per slice
; If not hard disk, skip partition & slice stuff
ld a,(medid) ; get media id
cp 4 ; hard disk?
jr nz,boot9 ; if not, jump ahead
; Read MBR
ld de,8000h ; LBA address zero
ld hl,0 ; ... to read first sector
ld bc,mbrsec ; read into MBR buffer
ld (dma),bc ; save
ld b,1 ; one sector
ld a,(unit) ; get bootunit
ld c,a ; put in C
call diskread ; do it, no return on err
; Check signature
ld hl,(mbrsec+1FEh) ; get signature
ld a,l ; first byte
cp 055h ; should be $55
jr nz,boot5 ; if not, no part table
ld a,h ; second byte
cp 0AAh ; should be $AA
jr nz,boot5 ; if not, no part table
; Search part table for CP/M entry (type 0x2E)
ld b,4 ; four entries in part table
ld hl,mbrsec+1BEh+4 ; offset of first part type
boot3:
ld a,(hl) ; get part type
cp 2Eh ; CP/M partition?
jr z,boot4 ; cool, grab the LBA offset
ld de,16 ; part table entry size
add hl,de ; bump to next part type
djnz boot3 ; loop thru table
jr boot5 ; too bad, no CP/M partition
boot4:
; Capture the starting LBA of the CP/M partition we found
ld de,4 ; LBA is 4 bytes after part type
add hl,de ; point to it
ld de,lba ; loc to store lba offset
ld bc,4 ; 4 bytes (32 bits)
ldir ; copy it
; For now, it is implied that a slice within a partition
; table will be in the "new" disk format. So, we now
; adjust the sectors per slice and media id.
; Use new slice format sectors per slice value
ld hl,16384 ; new sectors per slice
ld (sps),hl ; save it
; Update media id for new hard disk format
ld a,10 ; new media id
ld (medid),a ; save it
boot5:
; Adjust LBA offset based on target slice
ld a,(slice) ; get boot slice, A is loop cnt
ld hl,(lba) ; set DE:HL
ld de,(lba+2) ; ... to starting LBA
ld bc,(sps) ; sectors per slice
boot6:
or a ; set flags to check loop cntr
jr z,boot8 ; done if counter exhausted
add hl,bc ; add one slice to low word
jr nc,boot7 ; check for carry
inc de ; if so, bump high word
boot7:
dec a ; dec loop downcounter
jr boot6 ; and loop
boot8:
ld (lba),hl ; save new lba, low word
ld (lba+2),de ; save new lba, high word
boot9:
; Locate DPB corresponding to media id
ld hl,dpb$start - dpb$sz
ld de,dpb$sz
ld b,a ; loop count
dsk$login1:
add hl,de ; next dpb
djnz dsk$login1 ; loop as needed
; hl is ptr to desired dpb
ld de,dph0 ; load DPH pointer
ex de,hl ; de = DPB adr, hl = DPH adr
push de ; save DPB adr
ld de,12 ; offset of DPB in DPH
add hl,de ; hl = adr of DPB field in DPH
pop de ; recover DPB adr
ld (hl),e ; update LSB
inc hl
ld (hl),d ; udpate MSB
ld a,(medid) ; get media id
ld b,a ; to loop count
boot10:
add hl,de ; next dpb
djnz boot10 ; loop as needed
; Stuff DPB ptr (HL) into DPH
ld de,dph0 ; load DPH pointer
ex de,hl ; de = DPB adr, hl = DPH adr
push de ; save DPB adr
ld de,12 ; offset of DPB in DPH
add hl,de ; hl = adr of DPB field in DPH
pop de ; recover DPB adr
ld (hl),e ; update LSB
inc hl ; point to MSB
ld (hl),d ; update MSB
ret ; done
ret
wboot:
ld a,81H
halt
@ -162,15 +264,14 @@ const:
ld a,82H
halt
conin:
ld bc,0080H ; unit 80h (console), func 0 = CIN
call 0FFF0H
ld bc,0080h ; unit 80h (console), func 0 = CIN
call 0FFF0h ; do it
ld a,e ; put in C
ret ; done
conout:
ld e,c ; output character in E
ld bc,0180H ; unit 80h (console), func 1 = COUT
;rst 08 ; do it
call 0FFF0H
ret ; return
ld e,c ; output character in E
ld bc,0180h ; unit 80h (console), func 1 = COUT
jp 0FFF0h
list:
ld a,85H
halt
@ -197,61 +298,100 @@ setsec:
setdma:
ld (dma),bc
ret
read:
ld a,(unit) ; get unit
ld c,a ; BIOS Disk Unit in C
ld b,12H ; HBIOS SEEK function
push bc ; save it
;push de ; save XDPH pointer
ld b,17h ; HBIOS DEVICE function
rst 08 ; Do it, D=device type
ld a,d ; put in accum
and 0F0h ; isolate high bits
ld b,1 ; assume it is floppy, 1 head bit
ld c,01h ; 1 bit head mask
cp 10h ; floppy?
jr z,seek0 ; yup, skip ahead
ld b,4 ; must be hard disk, 4 head bits
ld c,0Fh ; 4 bit head mask
seek0:
;pop de ; recover XDPH pointer
push bc ; save bc
ld a,(slice) ; get slice
ld e,a ; slice to E
ld h,65 ; number of tracks per slice
call mult8 ; HL now has track offset for slice
pop bc ; recover bc
push hl ; save track offset for now
ld hl,(trk) ; get track value
ld a,l ; lsb of track to a
and c ; apply mask
ld d,a ; save in d
seek1:
srl h ; shift one bit out
rr l ; ... of hl
djnz seek1 ; do all bits
ld a,(sect) ; get sector
ld e,a ; stuff it in e
ex de,hl ; de=track, hl=head/sect
ex (sp),hl ; save head/sect, hl = offset
add hl,de ; hl has final track value
pop de ; recover head/sect to de
pop bc ; recover function & unit
;rst 08 ; perform seek
call 0FFF0H
; Read Sector
ld b,13h ; HBIOS read
ld a,(unit) ; get boot unit
ld c,a ; put in C
ld hl,(dma) ; dma address
ld a,(0FFE0H) ; current bank
ld d,a ; ... to D
ld e,1 ; 1 sector
;rst 08
call 0FFF0H
; Check device type
ld a,(unit) ; get unit
ld c,a ; BIOS Disk Unit in C
ld b,17h ; HBIOS DEVICE function
rst 08 ; Do it, D=device type
ld a,d ; put in accum
and 0F0h ; isolate high bits
cp 10h ; floppy?
jr nz,read2 ; if not, do LBA i/o
ret
; Floppy I/O
ld de,(sect) ; sector -> de, head(d) becomes zero
ld hl,(trk) ; track -> hl (low bit has head)
srl h ; shift head bit out of hl
rr l ; ... and into carry
rl d ; carry bit (head) into d
jr read3 ; do the disk i/o
; ; *** Simplify this to get rid of slice!!! ***
; ld b,1 ; assume it is floppy, 1 head bit
; ld c,01h ; 1 bit head mask
; push bc ; save bc
; ld a,(slice) ; get slice
; ld e,a ; slice to E
; ld h,65 ; number of tracks per slice
; call mult8 ; HL now has track offset for slice
; pop bc ; recover bc
; push hl ; save track offset for now
; ld hl,(trk) ; get track value
; ld a,l ; lsb of track to a
; and c ; apply mask
; ld d,a ; save in d
;read1:
; srl h ; shift one bit out
; rr l ; ... of hl
; djnz read1 ; do all bits
; ld a,(sect) ; get sector
; ld e,a ; stuff it in e
; ex de,hl ; DE=track, HL=head/sect
; ex (sp),hl ; save head/sect, HL = offset
; add hl,de ; HL has final track value
; pop de ; recover head/sect to de
; jr read3
; LBA I/O
read2:
ld hl,(trk) ; get track
ld de,0 ; clear hiword
ld b,4 ; x16 (16 spt assumed)
call rl32 ; do it
; combine with sector
ld a,(sect) ; get sector
or l ; combine
ld l,a ; and back to L
; add in lba offset
ld bc,(lba) ; lba offset loword
add hl,bc ; add to cur loword
ex de,hl ; swap
ld bc,(lba+2) ; lba offset hiword
adc hl,bc ; add w/ carry to cur hiword
ex de,hl ; swap back
set 7,d ; set lba access bit
read3:
; DE:HL has sector address to read (LBA or CHS)
ld a,(unit) ; get disk unit
ld c,a ; put in C
ld b,1 ; read 1 sector
jr diskread ; read sector and return
diskread:
; Read disk sector(s)
; DE:HL is LBA, B is sector count, C is disk unit
; Seek to requested sector in DE:HL
push bc ; save unit & count
ld b,012h ; HBIOS func: seek
call 0FFF0h ; do it
pop bc ; recover unit & count
jp nz,err_diskio ; handle error
; Read sector(s) into buffer
ld e,b ; transfer count
ld b,013h ; HBIOS func: disk read
ld hl,(dma) ; read into info sec buffer
ld a,(0FFE0h) ; get current bank
ld d,a ; put in D
call 0FFF0h ; do it
jp nz,err_diskio ; handle error
xor a ; signal success
ret ; and done
write:
ld a,8EH
halt
@ -291,10 +431,11 @@ flush:
halt
move:
ex de,hl ; we are passed source in DE and dest in HL
ldir ; use Z80 block move instruction
ex de,hl ; need next addresses in same regs
ret
; On input, DE=src, HL=dest
ex de,hl ; swap HL/DE for LDIR
ldir ; Z80 block move
ex de,hl ; swap back (required!)
ret ; done
time:
ld a,9AH
halt
@ -307,22 +448,21 @@ setbnk:
xmove:
ld a,9DH
halt
cin:
; input character from console via hbios
ld c,080H ; console unit to c
ld b,00H ; hbios func: input char
call 0FFF0H ; hbios reads character
ld a,e ; move character to a for return
ret
; Input character from console via HBIOS
ld c,080H ; console unit to C
ld b,00H ; HBIOS func: input char
call 0FFF0H ; HBIOS reads character
ld a,e ; To A for return
ret ; done
cout:
; output character to console via hbios
ld e,a ; output char to e
ld c,080H ; console unit to c
ld b,01H ; hbios func: output char
call 0FFF0H ; hbios outputs character
ret
; Output character to console via HBIOS
ld e,a ; output char to E
ld c,080H ; console unit to C
ld b,01H ; HBIOS func: output char
jp 0FFF0H ; output & return
writestr:
push af
@ -339,12 +479,8 @@ writestr2:
pop af
ret
;
; multiply 8-bit values
; in: multiply h by e
; out: hl = result, e = 0, b = 0
;
mult8:
; Multiply: H := H * E
ld d,0
ld l,d
ld b,8
@ -356,6 +492,46 @@ mult8_noadd:
djnz mult8_loop
ret
rl32:
; Left shift DE:HL by B bits (B > 0)
or a ; clear carry
rl l ; rotate L thru carry
rl h ; rotate H thru carry
rl e ; rotate E thru carry
rl d ; rotate D thru carry
djnz rl32 ; loop B times
ret ; done
err_nodisk:
ld hl,str_err_nodisk
jr err
err_noslice:
ld hl,str_err_noslice
jr err
err_diskio:
ld hl,str_err_diskio
jr err
err_sig:
ld hl,str_err_sig
jr err
err_api:
ld hl,str_err_api
jr err
err:
push hl
ld de,str_err_prefix
call writestr
pop de
call writestr
halt
str_err_prefix db "\r\n\r\n*** ","$"
str_err_nodisk db "Disk unit not available","$"
str_err_noslice db "Disk unit does not support slices","$"
str_err_diskio db "Disk I/O failure","$"
str_err_sig db "No system image on disk","$"
str_err_api db "HBIOS API failure","$"
msgunit db 13,10,13,10,'Boot CP/M 3 from Disk Unit: $'
msgslc db ' Slice: $'
msginv db 13,10,13,10,'*** Invalid Selection ***$'
@ -363,129 +539,143 @@ crlf db 13,10,'$'
dpb$start:
dpb$rom: ; 384K ROM Drive
dw 64 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 1 ; exm: extent mask
dw 192 - 1 ; dsm: total storage in blocks - 1 = (384kb / 2k bls) - 1 = 191
dw 256 - 1 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k
dw 64 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 1 ; exm: extent mask
dw 192 - 1 ; dsm: total storage in blocks - 1 = (384kb / 2k bls) - 1 = 191
dw 256 - 1 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb$sz equ $ - dpb$start
dpb$ram: ; 256K RAM Drive
dw 64 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 1 ; exm: extent mask
dw 128 - 1 ; dsm: total storage in blocks - 1 = (256kb / 2k bls) - 1 = 127
dw 256 - 1 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k
dw 64 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 1 ; exm: extent mask
dw 128 - 1 ; dsm: total storage in blocks - 1 = (256kb / 2k bls) - 1 = 127
dw 256 - 1 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb$rf: ; 4MB RAM Floppy Drive
dw 64 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 2047 ; dsm: total storage in blocks - 1 = (4mb / 2k bls) - 1 = 2047
dw 255 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 0 ; off: reserved tracks = 0 trks
dw 64 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 2047 ; dsm: total storage in blocks - 1 = (4mb / 2k bls) - 1 = 2047
dw 255 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 0 ; off: reserved tracks = 0 trks
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb$hd: ; 8MB Hard Disk Drive
dw 64 ; spt: sectors per track
db 5 ; bsh: block shift factor
db 31 ; blm: block mask
db 1 ; exm: extent mask
dw 2047 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047
dw 511 ; drm: dir entries - 1 = 512 - 1 = 511
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 16 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k
dw 64 ; spt: sectors per track
db 5 ; bsh: block shift factor
db 31 ; blm: block mask
db 1 ; exm: extent mask
dw 2047 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047
dw 512-1 ; drm: dir entries - 1 = 512 - 1 = 511
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 16 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb$fd720: ; 3.5" DS/DD Floppy Drive (720K)
dw 36 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 350 ; dsm: total storage in blocks - 1 blk = ((720k - 18k off) / 2k bls) - 1 = 350
dw 127 ; drm: dir entries - 1 = 128 - 1 = 127
db 11000000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 32 ; cks: directory check vector size = 128 / 4
dw 4 ; off: reserved tracks = 4 trks * (512 b/sec * 36 sec/trk) = 18k
dw 36 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 350 ; dsm: total storage in blocks - 1 blk = ((720k - 18k off) / 2k bls) - 1 = 350
dw 127 ; drm: dir entries - 1 = 128 - 1 = 127
db 11000000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 32 ; cks: directory check vector size = 128 / 4
dw 4 ; off: reserved tracks = 4 trks * (512 b/sec * 36 sec/trk) = 18k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb_fd144: ; 3.5" DS/HD Floppy Drive (1.44M)
dw 72 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 710 ; dsm: total storage in blocks - 1 blk = ((1,440k - 18k off) / 2k bls) - 1 = 710
dw 255 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 64 ; cks: directory check vector size = 256 / 4
dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 72 sec/trk) = 18k
dw 72 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 710 ; dsm: total storage in blocks - 1 blk = ((1,440k - 18k off) / 2k bls) - 1 = 710
dw 255 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 64 ; cks: directory check vector size = 256 / 4
dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 72 sec/trk) = 18k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb_fd360: ; 5.25" DS/DD Floppy Drive (360K)
dw 36 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 1 ; exm: extent mask
dw 170 ; dsm: total storage in blocks - 1 blk = ((360k - 18k off) / 2k bls) - 1 = 170
dw 127 ; drm: dir entries - 1 = 128 - 1 = 127
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 32 ; cks: directory check vector size = 128 / 4
dw 4 ; off: reserved tracks = 4 trks * (512 b/sec * 36 sec/trk) = 18k
dpb_fd360: ; 5.25" DS/DD Floppy Drive (360K)
dw 36 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 1 ; exm: extent mask
dw 170 ; dsm: total storage in blocks - 1 blk = ((360k - 18k off) / 2k bls) - 1 = 170
dw 127 ; drm: dir entries - 1 = 128 - 1 = 127
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 32 ; cks: directory check vector size = 128 / 4
dw 4 ; off: reserved tracks = 4 trks * (512 b/sec * 36 sec/trk) = 18k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb_fd120: ; 5.25" DS/HD Floppy Drive (1.2M)
dw 60 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 591 ; dsm: total storage in blocks - 1 blk = ((1,200k - 15k off) / 2k bls) - 1 = 591
dw 255 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 64 ; cks: directory check vector size = 256 / 4
dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 60 sec/trk) = 15k
dw 60 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 591 ; dsm: total storage in blocks - 1 blk = ((1,200k - 15k off) / 2k bls) - 1 = 591
dw 255 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 64 ; cks: directory check vector size = 256 / 4
dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 60 sec/trk) = 15k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb_fd111: ; 8" DS/DD Floppy Drive (1.11M)
dw 60 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 569 ; dsm: total storage in blocks - 1 blk = ((1,155k - 15k off) / 2k bls) - 1 = 569
dw 255 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 64 ; cks: directory check vector size = 256 / 4
dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 60 sec/trk) = 15k
dw 60 ; spt: sectors per track
db 4 ; bsh: block shift factor
db 15 ; blm: block mask
db 0 ; exm: extent mask
dw 569 ; dsm: total storage in blocks - 1 blk = ((1,155k - 15k off) / 2k bls) - 1 = 569
dw 255 ; drm: dir entries - 1 = 256 - 1 = 255
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 64 ; cks: directory check vector size = 256 / 4
dw 2 ; off: reserved tracks = 2 trks * (512 b/sec * 60 sec/trk) = 15k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb$hdnew: ; 8MB Hard Disk Drive (new format)
dw 64 ; spt: sectors per track
db 5 ; bsh: block shift factor
db 31 ; blm: block mask
db 1 ; exm: extent mask
dw 2048 - 1 - 4 ; dsm: total storage in blocks - 1 = 2048 - 1 - resvd tracks
dw 1024 - 1 ; drm: dir entries
db 11111111b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 2 ; off: reserved tracks
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
@ -493,13 +683,13 @@ dph0: dw 0 ; xlt, 0 means no translation
db 0,0,0,0,0,0,0,0,0 ; scratch (9 bytes)
db 0 ; mf: media flag
dw dpb$hd ; dpb
dw csvbuf ; csv:
dw alvbuf ; alv:
dw csvbuf ; csv:
dw alvbuf ; alv:
dw dirbcb ; dirbcb
dw dtabcb ; dtabcb
dw 0ffffh ; hash (disabled)
db 0 ; hbank
dtbl: dtbl dph0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dirbcb: db 0ffh ; drv
@ -524,6 +714,10 @@ trk ds 2 ; current track
sect ds 2 ; current sector
dma ds 2 ; current DMA address
medid ds 1 ; media id
lba ds 4 ; current lba
sps ds 2 ; sectors per slice
csvbuf ds 128 ; length (CSV) = ((DRM+1)/4)
alvbuf ds 512 ; length (ALV) = ((DSM+1)/4)
dirbuf ds 512 ; sector buffer
@ -531,6 +725,6 @@ dtabuf ds 512 ; sector buffer
ds 64
stack equ $
stksav dw 0
stksav ds 2
end

39
Source/CPM3/boot.z80

@ -41,7 +41,7 @@ tpa$bank equ 0
if banked
; Clone page zero from bank 0 to additional banks
ld b,3 ; last bank
ld b,4 ; last bank
ld c,0 ; src bank
init$2:
push bc ; save bank id's
@ -228,25 +228,26 @@ dinit6:
pop de ; restore drive list ptr
inc de ; increment active drive list ptr
djnz dinit6 ; loop as needed
ret
; zero out remaining dph table entries
ld a,16 ; dph table entries
sub l ; subtract entries used
ret z ; return if all entries used
ld b,a ; save as loop counter
ld a,l ; current dph to accum
rlca ; *2 for word entry
ld hl,@dtbl ; start of dtbl
call addhla ; hl now points to entry
dinit6a:
xor a ; zero accum
ld (hl),a ; zero lsb
inc hl ; next byte
ld (hl),a ; zero msb
inc hl ; next byte
djnz dinit6a
ret ; finished
; ; zero out remaining dph table entries
; ld a,16 ; dph table entries
; sub l ; subtract entries used
; ret z ; return if all entries used
; ld b,a ; save as loop counter
; ld a,l ; current dph to accum
; rlca ; *2 for word entry
; ld hl,@dtbl ; start of dtbl
; call addhla ; hl now points to entry
;
;dinit6a:
; xor a ; zero accum
; ld (hl),a ; zero lsb
; inc hl ; next byte
; ld (hl),a ; zero msb
; inc hl ; next byte
; djnz dinit6a
; ret ; finished
dinit7: ; process a unit (all slices)
ld e,0 ; initialize slice index

588
Source/CPM3/diskio.z80

@ -37,7 +37,7 @@
extrn ?bnkxlt
;extrn phex8, cout
extrn phex8, cout
; CP/M 3 Disk definition macros
@ -60,113 +60,129 @@ bell equ 7
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph0: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph1: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph2: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph3: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph4: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph5: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph6: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph7: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph8: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph9: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph10: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph11: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph12: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph13: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph14: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
dw dsk$write
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph15: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
cseg ; DPB must be resident
@ -176,10 +192,11 @@ dpb$max:
db 31 ; blm: block mask
db 1 ; exm: extent mask
dw 2047 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047
dw 511 ; drm: dir entries - 1 = 512 - 1 = 511
db 11110000b ; al0: dir blk bit map, first byte
dw 1024 - 1 ; drm: dir entries - 1
db 11111111b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 64 ; cks: directory check vector size - 256 / 4
;dw 64 ; cks: directory check vector size - 256 / 4
dw 256 ; cks: directory check vector size - 1024 / 4
dw 0 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
@ -228,16 +245,16 @@ dpb$rf: ; 4MB RAM Floppy Drive
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb$hd: ; 8MB Hard Disk Drive
dpb$hd: ; 8MB Hard Disk Drive w/ 512 dir entries
dw 64 ; spt: sectors per track
db 5 ; bsh: block shift factor
db 31 ; blm: block mask
db 1 ; exm: extent mask
dw 2047 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047
dw 511 ; drm: dir entries - 1 = 512 - 1 = 511
dw 512 - 1 ; drm: dir entries - 1 = 512 - 1 = 511
db 11110000b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8000h ; cks: directory check vector size - permanent storage = 8000H
dw 8080h ; cks: directory check vector size - permanent storage = 8000H
dw 16 ; off: reserved tracks = 16 trks * (16 trks * 16 heads * 16 secs * 512 bytes) = 128k
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
@ -312,6 +329,20 @@ dpb_fd111: ; 8" DS/DD Floppy Drive (1.11M)
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dpb$hdnew: ; 8MB Hard Disk Drive (new format)
dw 64 ; spt: sectors per track
db 5 ; bsh: block shift factor
db 31 ; blm: block mask
db 1 ; exm: extent mask
dw 2048 - 1 - 4 ; dsm: total storage in blocks - 1 = 2048 - 1 - resvd tracks
dw 1024 - 1 ; drm: dir entries
db 11111111b ; al0: dir blk bit map, first byte
db 00000000b ; al1: dir blk bit map, second byte
dw 8100h ; cks: directory check vector size - permanent storage = 8000H
dw 2 ; off: reserved tracks
db 2 ; psh: 2 for 512 byte sectors
db 3 ; phm: (512 / 128) - 1
dseg ; rest is banked
@ -370,48 +401,191 @@ dsk$login:
;ld a,'L'
;call cout
ld (curdph),de ; save working DPH
ex de,hl ; DPH adr to HL
dec hl ; point to slice
ld a,(hl) ; get slice
ld (slice),a ; save it
dec hl ; point to disk unit
ld a,(hl) ; get unit
ld (unit),a ; save it
inc a ; 0FFh -> 000h
jp z,err_ret ; bail out on no disk mapped here
;call media ; update DPH for media
;ret
push de ; save DPH ptr
media:
; Set retry address
ld hl,media
ld (retry$adr),hl
; check media
ld a,(@rdrv) ; get disk unit
;halt
ld c,a ; put in C
ld b,18h ; HBIOS Media function
ld e,1 ; Enable media check/discovery
;rst 08
call 0FFF0H ; HBIOS call
ld a,e ; Resultant media id to accum
or a ; Set flags
;halt
;
; !!! Need to do something on error !!!
;
jr nz,dsk$login0 ; continue if OK
pop de ; else error
ret ; return
; Sense media to determine media format
ld a,(unit) ; get disk unit
ld c,a ; put in C
ld b,18h ; HBIOS Media function
ld e,1 ; Enable media check/discovery
call 0FFF0H ; HBIOS call
jp nz,err_diskio ; handle error
ld a,e ; resultant media id to accum
ld (medid),a ; save media id
or a ; set flags, 0 is no media
jp z,err_diskio ; handle no media error
; Initialize slice start LBA & sectors per slice
ld hl,0 ; assume slice starts
ld (lba),hl ; ... at LBA offset
set 7,h ; ... of zero
ld (lba+2),hl ; ... w/ LBA access
; Check device type
ld a,(unit) ; get disk unit
ld c,a ; put in C
ld b,17h ; HBIOS func: report device info
call 0FFF0h ; get unit info, device type in D
ld a,d ; device type -> A
and 0F0h ; isolate high bits
cp 10h ; floppy?
jr nz,media1 ; if not, do LBA I/O
ld hl,lba+3 ; point to high order byte
res 7,(hl) ; switch from LBA -> CHS
media1:
ld hl,16640 ; assume legacy value for
ld (sps),hl ; ... sectors per slice
; If not hard disk, skip partition & slice stuff
ld a,(medid) ; get media id
cp 4 ; hard disk?
jp nz,media9 ; if not, jump ahead
; Read MBR
ld de,8000h ; LBA address zero
ld hl,0 ; ... to read first sector
ld bc,mbrsec ; read into MBR buffer
ld (dma),bc ; save
ld a,(0FFE0h) ; get current HBIOS bank
ld (bank),a ; set DMA bank
ld a,(unit) ; get bootunit
ld c,a ; put in C
ld b,013h ; HBIOS func: disk read
call dsk$io ; do it
ret nz ; abort on error
; Check signature
ld hl,(mbrsec+1FEh) ; get signature
ld a,l ; first byte
cp 055h ; should be $55
jr nz,media5 ; if not, no part table
ld a,h ; second byte
cp 0AAh ; should be $AA
jr nz,media5 ; if not, no part table
; Search part table for CP/M entry (type 0x2E)
ld b,4 ; four entries in part table
ld hl,mbrsec+1BEh+4 ; offset of first part type
media3:
ld a,(hl) ; get part type
cp 2Eh ; CP/M partition?
jr z,media4 ; cool, grab the LBA offset
ld de,16 ; part table entry size
add hl,de ; bump to next part type
djnz media3 ; loop thru table
jr media5 ; too bad, no CP/M partition
media4:
; Capture the starting LBA of the CP/M partition we found
ld de,4 ; LBA is 4 bytes after part type
add hl,de ; point to it
ld de,lba ; loc to store lba offset
ld bc,4 ; 4 bytes (32 bits)
ldir ; copy it
dsk$login0:
; Check that requested slice is "inside" partition.
; Slice size is exactly 16,384 sectors (8mb), so we can just
; right shift partition sector count by 14 bits
ld e,(hl) ; HL points to first byte
inc hl ; ... of 32 bit partition
ld d,(hl) ; ... sector count,
inc hl ; ... load sector count
push de ; ... into DE:HL
ld e,(hl) ; ...
inc hl ; ...
ld d,(hl) ; ...
pop hl ; ... DE:HL = part size in sectors
ld b,2 ; DE = DE:HL >> 2 (tricky!)
call rl32 ; DE = slicecnt
ex de,hl ; HL = slicecnt
ld a,(slice) ; get target slice
ld c,a ; put in C
ld b,0 ; BC := requested slice #
scf ; set carry!
sbc hl,bc ; max slices - slice - 1
jp c,err_noslice ; slice too high, error exit
; For now, it is implied that a slice within a partition
; table will be in the "new" disk format. So, we now
; adjust the sectors per slice and media id.
; Use new slice format sectors per slice value
ld hl,16384 ; new sectors per slice
ld (sps),hl ; save it
; Update media id for new hard disk format
ld a,10 ; new media id
ld (medid),a ; save it
media5:
; Adjust LBA offset based on target slice
ld a,(slice) ; get slice, A is loop cnt
ld hl,(lba) ; set DE:HL
ld de,(lba+2) ; ... to starting LBA
ld bc,(sps) ; sectors per slice
boot6:
or a ; set flags to check loop cntr
jr z,boot8 ; done if counter exhausted
add hl,bc ; add one slice to low word
jr nc,boot7 ; check for carry
inc de ; if so, bump high word
boot7:
dec a ; dec loop downcounter
jr boot6 ; and loop
boot8:
set 7,d ; set LBA access flag
ld (lba),hl ; save new lba, low word
ld (lba+2),de ; save new lba, high word
media9:
; Locate DPB corresponding to media id
ld hl,dpb$start - dpb$sz
ld de,dpb$sz
ld b,a ; loop count
dsk$login1:
add hl,de ; next dpb
djnz dsk$login1 ; loop as needed
; hl is ptr to desired dpb
pop de ; restore DPH ptr
;halt
ex de,hl ; de = DPB adr, hl = DPH adr
push de ; save DPB adr
ld de,12 ; offset of DPB in DPH
add hl,de ; hl = adr of DPB field in DPH
pop de ; recover DPB adr
ld (hl),e ; update LSB
inc hl
ld (hl),d ; udpate MSB
ret ; done
ld a,(medid) ; get media id
ld b,a ; to loop count
media10:
add hl,de ; next dpb
djnz media10 ; loop as needed
; Stuff DPB ptr (HL) and LBA offset into DPH
; DPH: DPB @ +12, LBA @ +25
ld de,(curdph) ; load DPH pointer
ex de,hl ; de = DPB adr, hl = DPH adr
push de ; save DPB adr
ld de,12 ; offset of DPB in DPH
add hl,de ; hl = adr of DPB field in DPH
pop de ; recover DPB adr
ld (hl),e ; update LSB
inc hl ; point to MSB
ld (hl),d ; update MSB
ld de,12 ; 12 more bytes to LBA
add hl,de ; HL points to LBA offset field
ld de,lba ; DE points to LBA offset
ex de,hl ; swap for copy
ld bc,4 ; 4 bytes
ldir ; do it
xor a ; signal success
ret ; done
; disk READ and WRITE entry points.
@ -429,116 +603,114 @@ dsk$login1:
; if necessary, then return an error code in <A>
dsk$read:
; ld ix,30H
; halt
ld a,13h ; HBIOS disk read function
ld (func),a ; save it
jr dsk$rw ; common disk read/write code
;ld a,'R'
;call cout
dsk$write:
ld a,14h ; HBIOS disk write function
ld (func),a ; save it
jr dsk$rw ; common disk read/write code
push de ; save XDPH pointer
call dsk$seek ; disk seek
pop hl ; restore pointer to HL
ret nz ; abort on seek error
;
dec hl ; point to unit field of XDPH
dec hl
ld c,(hl) ; BIOS Disk Unit in C
ld b,13H ; HBIOS READ function
ld hl,(@dma) ; Dest buffer adr
dsk$rw:
; Common disk read/write routine
; Assumes func is set to HBIOS read or write
; Set retry address
ld hl,dsk$rw$retry
ld (retry$adr),hl
; Save XDPH address
ld (curdph),de ; save to curdph
dsk$rw$retry:
; Get LBA offset from DPH to DE:HL
ld hl,(curdph) ; HL := DPH adr
ld de,25 ; LBA value adr
add hl,de ; HL := LBA offset
ld e,(hl) ; lobyte of loword
inc hl ; bump
ld d,(hl) ; hibyte of loword
inc hl ; bump
push de ; save loword
ld e,(hl) ; lobyte of hiword
inc hl ; bump
ld d,(hl) ; hibyte of hiword
pop hl ; recover loword
bit 7,d ; LBA access bit set?
jr nz,dsk$rw2 ; if so, go to LBA I/O
; Floppy I/O
ld de,(@sect) ; sector -> de, head(d) becomes zero
ld hl,(@trk) ; track -> hl (low bit has head)
srl h ; shift head bit out of hl
rr l ; ... and into carry
rl d ; carry bit (head) into d
jr dsk$rw9 ; do the disk I/O
dsk$rw2:
push de ; save hiword of LBA
push hl ; save loword of LBA
; Get track and shift into correct bits
ld hl,(@trk) ; get track
ld de,0 ; clear hiword
ld b,4 ; x16 (16 spt assumed)
call rl32 ; do it
; Combine with sector
ld a,(@sect) ; get sector
or l ; combine
ld l,a ; and back to L
; Add in LBA offset
pop bc ; lba offset loword
add hl,bc ; add to cur loword
ex de,hl ; swap
pop bc ; lba offset hiword
adc hl,bc ; add w/ carry to cur hiword
ex de,hl ; swap back
dsk$rw9:
; DE:HL has sector address to read (LBA or CHS)
ld bc,(@dma) ; get dma address
ld (dma),bc ; save for dsk$io
if banked
ld a,(@dbnk) ; destination bank
call ?bnkxlt
ld a,(@dbnk) ; destination bank
call ?bnkxlt ; xlat to HBIOS
else
ld a,(0FFE0H) ; get current bank
ld a,(0FFE0H) ; get current bank
endif
ld d,a ; set desk bank
ld e,1 ; 1 sector
rst 08 ; do it
;call 0FFF0H
ld (bank),a
ld a,(func) ; get HBIOS func code
ld b,a ; put in B
ld a,(@rdrv) ; get disk unit
ld c,a ; put in C
;jr dsk$io ; fall thru to dsk$io!
dsk$io:
; Read/write a disk sector
; DE:HL is CHS/LBA, B is HBIOS func, C is disk unit
; Seek to requested sector in DE:HL
push bc ; save func & unit
ld b,012h ; HBIOS func: seek
call 0FFF0h ; do it
pop bc ; recover func & unit
jp nz,err_diskio ; handle error
; Read sector(s) into buffer
ld e,1 ; transfer count
ld hl,(dma) ; read into info sec buffer
ld a,(bank) ; HBIOS DMA bank
ld d,a ; put in D
call 0FFF0h ; do it
jp nz,err_diskio ; handle error
xor a ; signal success
ret ; and done
;call phex8
ret ; return
; lxi h,read$msg ; point at " Read "
; mvi a,88h ! mvi b,01h ; 1797 read + Z80DMA direction
; jmp rw$common
dsk$write:
;ld ix,32H
;halt
push de ; save XDPH pointer
call dsk$seek ; disk seek
pop hl ; restore pointer to XDPH
ret nz ; abort on seek error
;
dec hl ; point to unit field of XDPH
dec hl
ld c,(hl) ; BIOS Disk Unit in C
ld b,14H ; HBIOS WRITE function
ld hl,(@dma) ; Dest buffer adr
if banked
ld a,(@dbnk) ; destination bank
call ?bnkxlt
else
ld a,(0FFE0H) ; get current bank
endif
ld d,a ; set desk bank
ld e,1 ; 1 sector
rst 08 ; do it
;call 0FFF0H
ret ; return
; lxi h,write$msg ; point at " Write "
; mvi a,0A8h ! mvi b,05h ; 1797 write + Z80DMA direction
; ; jmp wr$common
dsk$seek:
dec de ; point to unit field of XDPH
dec de
ld a,(de) ; get it
ld c,a ; BIOS Disk Unit in C
ld b,12H ; HBIOS SEEK function
push bc ; save it
push de ; save XDPH pointer
ld b,17h ; HBIOS DEVICE function
rst 08 ; Do it, D=device type
ld a,d ; put in accum
and 0F0h ; isolate high bits
ld b,1 ; assume it is floppy, 1 head bit
ld c,01h ; 1 bit head mask
cp 10h ; floppy?
jr z,seek0 ; yup, skip ahead
ld b,4 ; must be hard disk, 4 head bits
ld c,0Fh ; 4 bit head mask
seek0:
pop de ; recover XDPH pointer
push bc ; save bc
inc de ; point to slice field of XDPH
ld a,(de) ; get it
ld e,a ; slice to E
ld h,65 ; number of tracks per slice
call mult8 ; HL now has track offset for slice
pop bc ; recover bc
push hl ; save track offset for now
ld hl,(@trk) ; get track value
ld a,l ; lsb of track to a
and c ; apply mask
ld d,a ; save in d
seek1:
srl h ; shift one bit out
rr l ; ... of hl
djnz seek1 ; do all bits
ld a,(@sect) ; get sector
ld e,a ; stuff it in e
ex de,hl ; de=track, hl=head/sect
ex (sp),hl ; save head/sect, hl = offset
add hl,de ; hl has final track value
pop de ; recover head/sect to de
pop bc ; recover function & unit
rst 08 ; perform seek
;call 0FFF0H
ret
;
; multiply 8-bit values
@ -557,6 +729,96 @@ mult8_noadd:
djnz mult8_loop
ret
rl32:
; Left shift DE:HL by B bits (B > 0)
or a ; clear carry
rl l ; rotate L thru carry
rl h ; rotate H thru carry
rl e ; rotate E thru carry
rl d ; rotate D thru carry
djnz rl32 ; loop B times
ret ; done
cin$echo: ; get console input, echo it, and shift to upper case
call ?const ; check for char
or a ; set flags
jr z,cin$echo1 ; nope, continue
call ?conin ; eat extraneous char
jr cin$echo ; and loop
cin$echo1:
call ?conin ; get char
push af ; save it
ld c,a ; put in C
call ?cono ; echo
pop af ; recover it
cp 'a' ; compare
ret c ; done if carry
sub 'a' - 'A' ; make upper case
ret ; and done
; call ?const ! ora a ! jz u$c1 ; see if any char already struck
; call ?conin ! jmp u$conin$echo ; yes, eat it and try again
;u$c1:
; call ?conin ! push psw
; mov c,a ! call ?cono
; pop psw ! cpi 'a' ! rc
; sui 'a'-'A' ; make upper case
; ret
err_nodisk:
ld hl,str_err_nodisk
jr err
err_noslice:
ld hl,str_err_noslice
jr err
err_diskio:
ld hl,str_err_diskio
jr err
err_sig:
ld hl,str_err_sig
jr err
err_api:
ld hl,str_err_api
jr err
err:
ld a,(@ermde) ; get error mode
cp 0FFh ; FFh means suppress
jr z,err_ret ; if so, go to err return
push hl
call ?pderr
pop hl
call ?pmsg
ld hl,str_err_retry
call ?pmsg
call cin$echo
cp 'Y'
jr nz,err_ret ; return error to caller
ld hl,(retry$adr) ; get retry address
jp (hl) ; and go there
err_ret:
ld a,1 ; signal I/O error
ret ; and done
str_err_retry db ", Retry (Y/N) ? ",0
str_err_nodisk db ", No disk",0
str_err_noslice db ", No slice",0
str_err_diskio db ", Disk I/O",0
str_err_sig db ", No system",0
str_err_api db ", API failure",0
retry$adr dw ?wboot ; error retry address
curdph dw 0 ; working dph value
medid db 0 ; working media id value
unit db 0 ; working disk unit num
slice db 0 ; working slice num
lba dw 0,0 ; working lba
sps dw 0 ; sectors per slice
mbrsec ds 512 ; MBR sector buffer
dma dw 0 ; current DMA address
bank db 0 ; HBIOS DMA bank
func db 0 ; HBIOS function
;rw$common: ; seek to correct track (if necessary),
; ; initialize DMA controller,
; ; and issue 1797 command.

4
Source/CPM3/genbnk.dat

@ -8,12 +8,12 @@ MEMTOP = FD
BNKSWT = Y
COMBAS = 80
LERROR = Y
NUMSEGS = 03
NUMSEGS = 04
MEMSEG00 = 01,43,00
MEMSEG01 = 0E,72,02
MEMSEG02 = 01,7F,03
MEMSEG03 = 01,7F,04
MEMSEG04 = 00,C0,05
MEMSEG04 = 01,7F,05
MEMSEG05 = 00,C0,06
MEMSEG06 = 00,C0,07
MEMSEG07 = 00,C0,08

3
Source/CPM3/move.z80

@ -69,7 +69,8 @@ xbnkmov:
; 1: TPA BID_AUX 8Ch
; 2: BUFS BID_AUX-1 8Bh
; 3: BUFS BID_AUX-2 8Ah
; ...
; 4: BUFS BID_AUX-3 89h
; 5: BUFS BID_AUX-4 88h
;
; N.B., Below BID_AUX is considered RAM disk bank. Need to
; make sure RAM disk is kept small enough to stay below

3
Source/CPM3/optzpm.lib

@ -1,5 +1,4 @@
; global assembler options for BANKED BIOS
; with Boot Drive swapped into Drive A
; global assembler options for ZPM BIOS
true equ -1
false equ not true

2
Source/CPM3/util.z80

@ -51,7 +51,7 @@ bin2bcd1:
pop bc
ret
if 0
if 1
;
; Print the hex word value in HL
;

88
Source/Doc/Architecture.md

@ -912,6 +912,51 @@ to by HL. HL must point to a location in the top 32K of CPU address space.
Write the entire contents of the Non-Volatile RAM from the buffer pointed
to by HL. HL must point to a location in the top 32K of CPU address space.
### Function 0x26 -- RTC Get Alarm (RTCGETALM)
| _Entry Parameters_
| B: 0x26
| _Exit Results_
| A: Status (0=OK, else error)
Documentation required...
### Function 0x27 -- RTC Set Alarm (RTCSETALM)
| _Entry Parameters_
| B: 0x27
| _Exit Results_
| A: Status (0=OK, else error)
Documentation required...
### Function 0x28 -- RTC DEVICE (DIODEVICE)
| _Entry Parameters_
| B: 0x28
| C: RTC Device Unit ID
| _Exit Results_
| A: Status (0=OK, else error)
| D: Device Type
| E: Device Number
Reports information about the RTC device unit specified. Register D
indicates the device type (driver) and register E indicates the physical
device number assigned by the driver.
Each RTC device is handled by an appropriate driver (DSRTC, BQRTC,
etc.) which is identified by a device type id from the table below.
**Type ID** | **Disk Device Type**
----------- | --------------------
0x00 | DS1302
0x10 | BQ4845P
0x20 | SIMH
0x30 | System Periodic Timer
`\clearpage`{=latex}
Video Display Adapter (VDA)
@ -1329,7 +1374,7 @@ chip provides.
| _Entry Parameters_
| B: 0x52
| C: Audio Device Unit ID
| HL: Period (0000=lowest note, FFFF=highest note)
| HL: Period
| _Returned Values_
| A: Status (0=OK, else error)
@ -1338,7 +1383,9 @@ This function sets the sound chip period parameter. The period will
be applied when the next SNDPLAY function is invoked.
The period value is a driver specific value. To play standardized
notes, use the SNDNOTE function.
notes, use the SNDNOTE function. A higher value will generate a lower
note. The maximum value that can be used is driver specific. If value
supplied is beyond driver capabilities, register A will be set to $FF.
### Function 0x53 -- Sound Note (SNDNOTE)
@ -1357,7 +1404,7 @@ The value corresponds to standard musical notes. The value allows
for selection of a quarter of a semitone by giving a value between 0
and up to the drivers maximum supported value. The lowest note is (0).
For the SN76490 chip, 0 corresponds to note A1# and the value 249 is
For the SN76489 chip, 0 corresponds to note A1# and the value 249 is
the maximum supported value, and it corresponds to note C7.
### Function 0x54 -- Sound Play (SNDPLAY)
@ -1365,7 +1412,7 @@ the maximum supported value, and it corresponds to note C7.
| _Entry Parameters_
| B: 0x54
| C: Audio Device Unit ID
| E: Channel
| D: Channel
| _Returned Values_
| A: Status (0=OK, else error)
@ -1386,7 +1433,7 @@ HBIOS B=54 C=00 D=01 ; Play note on Channel 1
### Function 0x55 -- Sound Query (SNDQUERY)
| _Entry Parameters_
| B: 0x54
| B: 0x55
| C: Audio Device Unit ID
| E: Subfunction
@ -1399,7 +1446,7 @@ key aspects of the specific Audio Device.
#### SNDQUERY Subfunction 0x01 -- Get count of audio channels supported (SNDQ_CHCNT)
| _Entry Parameters_
| B: 0x54
| B: 0x55
| E: 0x01
| _Returned Values_
@ -1407,10 +1454,10 @@ key aspects of the specific Audio Device.
| B: Count of standard tone channels
| C: Count of noise tone channels
#### SNDQUERY Subfunction 0x01 -- Get current volume setting (SNDQ_VOL)
#### SNDQUERY Subfunction 0x02 -- Get current volume setting (SNDQ_VOL)
| _Entry Parameters_
| B: 0x54
| B: 0x55
| E: 0x02
| _Returned Values_
@ -1421,7 +1468,7 @@ key aspects of the specific Audio Device.
#### SNDQUERY Subfunction 0x03 -- Get current period setting (SNDQ_PERIOD)
| _Entry Parameters_
| B: 0x54
| B: 0x55
| E: 0x03
| _Returned Values_
@ -1431,7 +1478,7 @@ key aspects of the specific Audio Device.
#### SNDQUERY Subfunction 0x04 -- Get device details (SNDQ_DEV)
| _Entry Parameters_
| B: 0x54
| B: 0x55
| E: 0x04
| _Returned Values_
@ -1455,7 +1502,7 @@ The currently defined audio device types are:
AUDIO ID | Value | Device | Returned registers
-------------- | ----- | ---------- | --------------------------------------------
SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel port
SND_SNAY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port
SND_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port
`\clearpage`{=latex}
@ -1639,6 +1686,15 @@ available along with the registers/information returned.
| A: Status (0=OK, else error)
| E: Count of Disk Device Units
#### SYSGET Subfunction 0x20 -- Get Disk Device Unit Count (RTCCNT)
| _Entry Parameters_
| BC: 0xF820
| _Returned Values_
| A: Status (0=OK, else error)
| E: Count of RTC Device Units
#### SYSGET Subfunction 0x40 -- Get Video Device Unit Count (VDACNT)
| _Entry Parameters_
@ -1665,6 +1721,7 @@ available along with the registers/information returned.
| _Returned Values_
| A: Status (0=OK, else error)
| DE:HL: Current Timer Tick Count Value
| C: Tick frequency (typically 50 or 60)
#### SYSGET Subfunction 0xD1 -- Get Seconds Count (SECONDS)
@ -1750,15 +1807,6 @@ available along with the registers/information used as input.
| _Returned Values_
| A: Status (0=OK, else error)
#### SYSSET Subfunction 0xD2 -- Inc Timer (TIMER)
| _Entry Parameters_
| BC: 0xF9D2
| _Returned Values_
| A: Status (0=OK, else error)
#### SYSSET Subfunction 0xE0 -- Set Boot Information (BOOTINFO)
| _Entry Parameters_

4
Source/Doc/GettingStarted.md

@ -1190,8 +1190,8 @@ these applications are no longer provided.
driver.
* Ed Brindley contributed some of the code that supports the RC2014
platform.
* Phil Summers contributed Forth and BASIC in ROM as well as a long
list of general code enhancements.
* Phil Summers contributed Forth and BASIC in ROM, the AY-3-8910 sound
driver as well as a long list of general code enhancements.
* Phillip Stevens contributed support for FreeRTOS.
* Curt Mayer contributed the Linux / MacOS build process.
* UNA BIOS and FDISK80 are the products of John Coffman.

BIN
Source/Doc/Graphics/Hard Disk Anatomy.vsd

Binary file not shown.

BIN
Source/Doc/SIO+CTC Baud Rate Options.xlsx

Binary file not shown.

4
Source/HBIOS/API.txt

@ -49,6 +49,10 @@ GET ($F8):
BC=Function/Subfunction A=Result
E=Disk Unit Count
RTCCNT ($20):
BC=Function/Subfunction A=Result
E=RTC Unit Count
VDACNT ($40):
BC=Function/Subfunction A=Result
E=Video Unit Count

2
Source/HBIOS/Config/MK4_std.asm

@ -37,7 +37,7 @@ CVDUENABLE .SET TRUE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
VGAENABLE .SET TRUE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
;
IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
;

2
Source/HBIOS/Config/RCZ180_ext.asm

@ -40,7 +40,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
;
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
;
IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
;

2
Source/HBIOS/Config/RCZ180_nat.asm

@ -40,7 +40,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
;
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
;
IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
;

4
Source/HBIOS/Config/RCZ80_std.asm

@ -33,10 +33,8 @@ ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
;
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
;
IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
;
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
;
SN76489ENABLE .SET FALSE ; SN76489 SOUND DRIVER

2
Source/HBIOS/Config/SBC_std.asm

@ -33,7 +33,7 @@ CVDUENABLE .SET TRUE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
VGAENABLE .SET TRUE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
;
IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
;

2
Source/HBIOS/Config/SCZ180_126.asm

@ -42,7 +42,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
;
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
;
IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
;

2
Source/HBIOS/Config/SCZ180_130.asm

@ -48,7 +48,7 @@ ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM)
ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
;
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDENABLE .SET FALSE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
;
IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)

2
Source/HBIOS/Config/SCZ180_131.asm

@ -49,7 +49,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
;
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
;
IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
;

53
Source/HBIOS/audio.inc

@ -6,10 +6,13 @@
#DEFINE AUDTRACE_E PUSH AF \ LD A, E \ CALL PRTHEXBYTE \ POP AF
#DEFINE AUDTRACE_L PUSH AF \ LD A, L \ CALL PRTHEXBYTE \ POP AF
#DEFINE AUDTRACE_HL CALL PRTHEXWORDHL
#DEFINE AUDTRACE_DE PUSH DE \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP DE
#DEFINE AUDTRACE_BC PUSH HL \ PUSH BC \ POP HL \ CALL PRTHEXWORDHL \ POP HL
#DEFINE AUDTRACE_DE PUSH HL \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP HL
#DEFINE AUDTRACE_IY PUSH HL \ PUSH IY \ POP HL \ CALL PRTHEXWORDHL \ POP HL
#DEFINE AUDDEBUG(S) CALL PRTSTRD \ .TEXT S \ .TEXT "$" ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED
#DEFINE AUDDEBUG(S) push hl \ CALL PRTSTRD \ .TEXT S \ .TEXT "$" \ pop hl ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED
#DEFINE AUDTRACE_CR AUDDEBUG("\r\n$")
#ELSE
#DEFINE AUDTRACE(S)
@ -18,9 +21,55 @@
#DEFINE AUDTRACE_D
#DEFINE AUDTRACE_E
#DEFINE AUDTRACE_L
#DEFINE AUDTRACE_BC
#DEFINE AUDTRACE_HL
#DEFINE AUDTRACE_DE
#DEFINE AUDTRACE_IY
#DEFINE AUDDEBUG(STR)
#DEFINE AUDTRACE_CR
#ENDIF
#IFNDEF AUDIOUTILS
#DEFINE AUDIOUTILS
AUD_NOTE:
AUDDEBUG("AUDNOTE ")
AUDTRACE_HL
AUDTRACE_CR
AUDTRACE_DE
AUDTRACE_CR
push de
LD DE, 48
CALL DIV16
; BC IS OCTAVE COUNT
; HL is NOTE WITIN OCTAVE
ADD HL, HL
pop de
ADD HL, DE
LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL
INC HL
LD H, (HL)
LD L, A
INC C
AUD_NOTE1:
DEC C
JR Z, AUD_NOTE2
SRL H
RR L
JR AUD_NOTE1
AUD_NOTE2:
LD A, L ; IF NOT ZERO
OR H
RET NZ ; RETURN THE CALCULATED PERIOD
LD H, $FF ; OTHERWISE RETURN -1 PERIOD (ERROR)
LD L, $FF
RET
#ENDIF

122
Source/HBIOS/ay.asm

@ -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

@ -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

12
Source/HBIOS/bqrtc.asm

@ -159,6 +159,10 @@ BQRTC_DISPATCH:
JP Z, BQRTC_GETALM ; Get Alarm
DEC A
JP Z, BQRTC_SETALM ; Set Alarm
DEC A
JP Z, BQRTC_DEVICE ; Report RTC device info
CALL PANIC
;
; NVRAM FUNCTIONS ARE NOT AVAILABLE
;
@ -328,6 +332,14 @@ BQRTC_SETALM:
; clean up and return
XOR A ; Signal success
RET ; And return
;
; REPORT RTC DEVICE INFO
;
BQRTC_DEVICE:
LD D,RTCDEV_BQ ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL DEVICE NUMBER
XOR A ; SIGNAL SUCCESS
RET
BQRTC_SUSPEND:
IN0 A, (BQRTC_CONTROL) ; Suspend Clock

20
Source/HBIOS/cfg_dyno.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -93,16 +93,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_DYNO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_DYNO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -156,6 +152,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS
PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

20
Source/HBIOS/cfg_ezz80.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 10000000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -118,16 +118,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -181,6 +177,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS
PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

20
Source/HBIOS/cfg_master.asm

@ -18,7 +18,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -156,16 +156,12 @@ TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_NONE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_NONE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -236,6 +232,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

20
Source/HBIOS/cfg_mk4.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -111,16 +111,12 @@ TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -190,6 +186,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

20
Source/HBIOS/cfg_n8.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -114,16 +114,12 @@ TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU TRUE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -190,6 +186,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

20
Source/HBIOS/cfg_rcz180.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -121,16 +121,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -190,6 +186,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS
PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

20
Source/HBIOS/cfg_rcz80.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 7372800 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -139,16 +139,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -208,6 +204,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS
PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

20
Source/HBIOS/cfg_sbc.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -115,16 +115,12 @@ TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -192,6 +188,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

20
Source/HBIOS/cfg_scz180.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -116,16 +116,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -185,6 +181,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS
PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

2
Source/HBIOS/cfg_una.asm

@ -16,7 +16,7 @@
PLATFORM .EQU PLT_UNA ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO]
BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA]
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2

19
Source/HBIOS/cfg_zeta.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 0 ; INTERRUPT MODE: 0=NONE, 1=MODE 1, 2=MODE 2
@ -91,15 +91,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -136,6 +133,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS
PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

19
Source/HBIOS/cfg_zeta2.asm

@ -21,7 +21,7 @@ HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION
TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ)
;
BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
@ -101,15 +101,12 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
AYENABLE .EQU FALSE ; AY: ENABLE AY PSG SOUND DRIVER
;
MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM)
MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
;
FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3|DYNO]
FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC]
FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2)
FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL)
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111]
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111]
@ -146,6 +143,12 @@ PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS
PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
;
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180]
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

13
Source/HBIOS/dbgmon.asm

@ -104,6 +104,8 @@ SERIALCMDLOOP:
JP Z,FILLMEM ; FILL MEMORY COMMAND
CP 'H' ; IS IT A "H" (Y/N)
JP Z,HELP ; HELP COMMAND
CP 'X' ; IS IT A "X" (Y/N)
JP Z,HALT ; HALT COMMAND
LD HL,TXT_COMMAND ; POINT AT ERROR TEXT
CALL PRTSTRH ; PRINT COMMAND LABEL
@ -150,6 +152,16 @@ BOOT:
LD HL,0 ; ADDRESS ZERO
CALL HB_BNKCALL ; DOES NOT RETURN
#ENDIF
;
;__HALT_______________________________________________________________________
;
; PERFORM HALT ACTION
;_____________________________________________________________________________
;
HALT:
DI
HALT
;
;__RUN________________________________________________________________________
;
; TRANSFER OUT OF MONITOR, USER OPTION "R"
@ -912,6 +924,7 @@ TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):"
.TEXT "\r\nO xx yy - Output to port xx value yy"
.TEXT "\r\nP xxxx - Program RAM at xxxx"
.TEXT "\r\nR xxxx - Run code at xxxx"
.TEXT "\r\nX - Halt system"
.TEXT "$"
;
#IF DSKYENABLE

150
Source/HBIOS/diskdefs

@ -297,121 +297,169 @@ diskdef wbw_rom1024
os 2.2
end
# UNA 512KB ROM (128KB reserved, 384KB ROM Disk)
# RomWBW 720K floppy media
diskdef wbw_fd720
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
diskdef una_rom512
# RomWBW 1.44M floppy media
diskdef wbw_fd144
seclen 512
tracks 12
sectrk 64
tracks 160
sectrk 18
blocksize 2048
maxdir 256
skew 0
boottrk 0
boottrk 2
os 2.2
end
# UNA 512KB ROM (128KB reserved, 896KB ROM Disk)
# RomWBW 360K floppy media
diskdef wbw_fd360
seclen 512
tracks 80
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
diskdef una_rom1024
# RomWBW 1.20M floppy media
diskdef wbw_fd120
seclen 512
tracks 28
sectrk 64
tracks 160
sectrk 15
blocksize 2048
maxdir 256
skew 0
boottrk 0
boottrk 2
os 2.2
end
# RomWBW 8MB Hard Disk, LU 0-3
# RomWBW 8320KB Hard Disk Slice
# Legacy format, 512 dir entries, 16,630 sectors / slice
diskdef wbw_hd
seclen 512
tracks 1040
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 16
os 2.2
end
# First 4 slices of wbw_hd
diskdef wbw_hd0
seclen 512
tracks 65
sectrk 256
tracks 1040
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 1
boottrk 16
os 2.2
end
diskdef wbw_hd1
seclen 512
tracks 130
sectrk 256
tracks 2080
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 66
boottrk 1056
os 2.2
end
diskdef wbw_hd2
seclen 512
tracks 195
sectrk 256
tracks 3120
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 131
boottrk 2096
os 2.2
end
diskdef wbw_hd3
seclen 512
tracks 260
sectrk 256
tracks 4160
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 196
boottrk 3136
os 2.2
end
# RomWBW 720K floppy media
diskdef wbw_fd720
# RomWBW 8MB Hard Disk
# New format, 1024 dir entries, 16,384 sectors / slice
# Pure filesystem image, no prefix
diskdef wbw_hdnew
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 128
tracks 1024
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 4
boottrk 2
os 2.2
end
# RomWBW 1.44M floppy media
diskdef wbw_fd144
# First 4 slices of wbw_hdnew
# Assumes 128KB prefix (256 sectors)
diskdef wbw_hdnew0
seclen 512
tracks 160
sectrk 18
blocksize 2048
maxdir 256
tracks 1040
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 2
boottrk 18
os 2.2
end
# RomWBW 360K floppy media
diskdef wbw_fd360
diskdef wbw_hdnew1
seclen 512
tracks 80
sectrk 9
blocksize 2048
maxdir 128
tracks 2064
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 4
boottrk 1042
os 2.2
end
# RomWBW 1.20M floppy media
diskdef wbw_fd120
diskdef wbw_hdnew2
seclen 512
tracks 160
sectrk 15
blocksize 2048
maxdir 256
tracks 3112
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 2
boottrk 2066
os 2.2
end
diskdef wbw_hdnew3
seclen 512
tracks 4136
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 3114
os 2.2
end

16
Source/HBIOS/dsrtc.asm

@ -235,12 +235,20 @@ DSRTC_DISPATCH:
JP Z,DSRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES
DEC A
JP Z,DSRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES
DEC A
JP Z,DSRTC_GETALM ; GET ALARM
DEC A
JP Z,DSRTC_SETALM ; SET ALARM
DEC A
JP Z,DSRTC_DEVICE ; REPORT RTC DEVICE INFO
CALL PANIC
;
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR
;
DSRTC_GETBLK:
DSRTC_SETBLK:
DSRTC_GETALM:
DSRTC_SETALM:
CALL PANIC
;
; RTC GET TIME
@ -350,6 +358,14 @@ DSRTC_SETBYT:
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
; REPORT RTC DEVICE INFO
;
DSRTC_DEVICE:
LD D,RTCDEV_DS ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL DEVICE NUMBER
XOR A ; SIGNAL SUCCESS
RET
;
; CONVERT DATA IN CLOCK BUFFER TO TIME BUFFER AT HL
;
DSRTC_CLK2TIM:

25
Source/HBIOS/fd.asm

@ -61,6 +61,13 @@ FDC_DOR .EQU FDC_BASE + $02 ; DIGITAL OUTPUT REGISTER
FDC_DCR .EQU FDC_BASE + $03 ; CONFIGURATION CONTROL REGISTER
FDC_TC .EQU FDC_BASE + $02 ; TERMINAL COUNT (W/ DACK)
#ENDIF
#IF (FDMODE == FDMODE_EPFDC)
FDC_MSR .EQU $48 ; 8272 MAIN STATUS REGISTER
FDC_DATA .EQU $49 ; 8272 DATA PORT
FDC_DOR .EQU $4A ; DIGITAL OUTPUT REGISTER
FDC_DCR .EQU $4B ; CONFIGURATION CONTROL REGISTER
FDC_TC .EQU $4C ; TERMINAL COUNT (W/ DACK)
#ENDIF
;
; DISK OPERATIONS
;
@ -94,7 +101,7 @@ FRC_TOSEEKWT .EQU -15H ; EB
;
; FD DEVICE CONFIGURATION
;
FD_DEVCNT .EQU 2 ; 2 DEVICES SUPPORTED
FD_DEVCNT .EQU FDCNT ; 2 DEVICES SUPPORTED
FD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES
;
; PER DEVICE DATA OFFSETS
@ -399,7 +406,7 @@ DOR_INIT .EQU 11100000B ; INITIAL DEFAULT LATCH VALUE
;
; *** DIDE/N8/ZETA V2 ***
;
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC))
DOR_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED
DOR_BR250 .EQU DOR_INIT
DOR_BR500 .EQU DOR_INIT
@ -638,7 +645,9 @@ FD_INIT:
PRTS("FD: IO=0x$")
LD A,FDC_MSR
CALL PRTHEXBYTE
PRTS(" UNITS=2$")
PRTS(" UNITS=$")
LD A, FD_DEVCNT + '0'
CALL COUT
;
; SETUP THE DISPATCH TABLE ENTRIES
;
@ -1235,7 +1244,7 @@ FC_SETDOR
;
; SET FST_DCR
;
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC))
;
FC_SETDCR
LD (FST_DCR),A
@ -1267,7 +1276,7 @@ FC_RESETFDC:
#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_RCSMC))
RES 7,A
#ENDIF
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC))
LD A,0
#ENDIF
CALL FC_SETDOR
@ -1282,7 +1291,7 @@ FC_RESETFDC:
; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE
;
FC_PULSETC:
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC))
IN A,(FDC_TC)
#ELSE
LD A,(FST_DOR)
@ -1299,7 +1308,7 @@ FC_MOTORON:
; LD BC,300H
; LD BC,50H
; LD (FCD_IDLECNT),BC
LD A,(CB_CPUMHZ)
RLCA
LD (FCD_IDLECNT),A
@ -1339,7 +1348,7 @@ FC_MOTORON1:
CP C ; COMPARE TO NEW MOTOR BITS
RET Z ; SKIP DELAY, MOTOR WAS ALREADY ON
#ENDIF
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC))
; SETUP DCR FOR DIDE HARDWARE
LD A,(FCD_DCR) ; GET NEW DCR VALUE
CALL FC_SETDCR ; AND IMPLEMENT IT

44
Source/HBIOS/hbios.asm

@ -1283,7 +1283,7 @@ HB_CPU2:
;
LD A,FORCECON ; CALCULATE PRE-INIT TABLE ; A IS INDEX OF CONSOLE DEVICE ENTRY
RLCA ; ENTRY THAT WE WANT TO ; A IS OFFSET OF CONSOLE DEVICE ENTRY
LD DE,(HB_PCINITTBL) ; EXECUTE FIRST ; DE IS VALUE OF TOP ENTRY
LD DE,(HB_PCINITTBL) ; EXECUTE FIRST ; DE IS VALUE OF TOP ENTRY
LD HL,HB_PCINITTBL ; HL IS ADDRESS OF TOP OF TABLE
PUSH HL ; PUSH (1) TOP OF TABLE
PUSH DE ; PUSH (2) VALUE OF TOP ENTRY
@ -1672,14 +1672,14 @@ HB_INITTBL:
.DW CTC_INIT
#ENDIF
#IF (SPKENABLE)
.DW SPK_INIT ; AUDIBLE INDICATOR OF BOOT START
#ENDIF
#IF (AYENABLE)
.DW AY_INIT ; AUDIBLE INDICATOR OF BOOT START
.DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START
#ENDIF
#IF (SN76489ENABLE)
.DW SN76489_INIT
#ENDIF
#IF (AY38910ENABLE)
.DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START
#ENDIF
#IF (ASCIENABLE)
.DW ASCI_INIT
#ENDIF
@ -2289,7 +2289,7 @@ SND_ADDENT:
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
;
SND_FNCNT .EQU 6 ; NUMBER OF SND FUNCS (FOR RANGE CHECK)
SND_MAX .EQU 2 ; UP TO 2 UNITS
SND_MAX .EQU 3 ; UP TO 2 UNITS
SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES
;
.DB SND_FNCNT ; SND FUNCTION COUNT (FOR RANGE CHECK)
@ -2434,6 +2434,8 @@ SYS_GET:
JR Z,SYS_GETCIOCNT
CP BF_SYSGET_DIOCNT
JR Z,SYS_GETDIOCNT
CP BF_SYSGET_RTCCNT
JR Z,SYS_GETRTCCNT
CP BF_SYSGET_VDACNT
JR Z,SYS_GETVDACNT
CP BF_SYSGET_SNDCNT
@ -2462,6 +2464,7 @@ SYS_GETTIMER:
HB_DI
CALL LD32
HB_EI
LD C, TICKFREQ
XOR A
RET
;
@ -2549,6 +2552,18 @@ SYS_GETDIOCNT:
XOR A ; SIGNALS SUCCESS
RET
;
; GET RTC UNIT COUNT
;
SYS_GETRTCCNT:
LD E,0 ; ASSUME 0 RTC DEVICES
LD A,(RTC_DISPACT) ; IS RTC ACTIVE?
OR A ; SET FLAGS
JR Z,SYS_GETRTCCNT1 ; IF NONE, DONE
INC E ; SET ONE DEVICE
SYS_GETRTCCNT1:
XOR A ; SIGNALS SUCCESS
RET
;
; GET VIDEO UNIT COUNT
;
SYS_GETVDACNT:
@ -3311,15 +3326,6 @@ SIZ_SPK .EQU $ - ORG_SPK
.ECHO " bytes.\n"
#ENDIF
;
#IF (AYENABLE)
ORG_AY .EQU $
#INCLUDE "ay.asm"
SIZ_AY .EQU $ - ORG_AY
.ECHO "AY occupies "
.ECHO SIZ_AY
.ECHO " bytes.\n"
#ENDIF
;
#IF (PIO_4P | PIO_ZP | PPI_SBC)
ORG_PIO .EQU $
#INCLUDE "pio.asm"
@ -3353,6 +3359,14 @@ SIZ_SN76489 .EQU $ - ORG_SN76489
.ECHO SIZ_SN76489
.ECHO " bytes.\n"
#ENDIF
#IF (AY38910ENABLE)
ORG_AY38910 .EQU $
#INCLUDE "ay38910.asm"
SIZ_AY38910 .EQU $ - ORG_AY38910
.ECHO "AY38910 occupies "
.ECHO SIZ_AY38910
.ECHO " bytes.\n"
#ENDIF
;
#DEFINE USEDELAY
#INCLUDE "util.asm"

31
Source/HBIOS/hbios.inc

@ -32,6 +32,9 @@ BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX
BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX
BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK
BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK
BF_RTCGETALM .EQU BF_RTC + 6 ; GET ALARM
BF_RTCSETALM .EQU BF_RTC + 7 ; SET ALARM
BF_RTCDEVICE .EQU BF_RTC + 8 ; RTC DEVICE INFO REPORT
;
BF_EMU .EQU $30 ; DEPRECATED
;
@ -66,11 +69,11 @@ BF_SNDQ_CHCNT .EQU BF_SNDQ_STATUS + 1 ; RETURN COUNT OF CHANNELS
BF_SNDQ_VOLUME .EQU BF_SNDQ_STATUS + 2 ; 8 BIT NUMBER
BF_SNDQ_PERIOD .EQU BF_SNDQ_STATUS + 3 ; 16 BIT NUMBER
BF_SNDQ_DEV .EQU BF_SNDQ_STATUS + 4 ; RETURN DEVICE TYPE CODE AND IO PORTS - TYPE IN B, PORTS IN DE, HL
;
BF_SNDDEV .EQU 0 ; TYPES OF SOUND DRIVERS
BF_SND_SN76489 .EQU BF_SNDDEV + 1
BF_SND_SNAY38910 .EQU BF_SNDDEV + 2
BF_SND_AY38910 .EQU BF_SNDDEV + 2
BF_SND_BITMODE .EQU BF_SNDDEV + 3
;
BF_SYS .EQU $F0
BF_SYSRESET .EQU BF_SYS + 0 ; SOFT RESET HBIOS
@ -89,6 +92,7 @@ BF_SYSINT .EQU BF_SYS + 12 ; MANAGE INTERRUPT VECTORS
;
BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT
BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT
BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT
BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT
BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT
BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE
@ -108,6 +112,20 @@ BF_SYSINT_SET .EQU $20 ; SET INT VECTOR ADDRESS
;
CIO_CONSOLE .EQU $80 ; CIO UNIT NUM FOR CUR CON
;
; MEDIA ID VALUES
;
MID_NONE .EQU 0
MID_MDROM .EQU 1
MID_MDRAM .EQU 2
MID_RF .EQU 3
MID_HD .EQU 4
MID_FD720 .EQU 5
MID_FD144 .EQU 6
MID_FD360 .EQU 7
MID_FD120 .EQU 8
MID_FD111 .EQU 9
MID_HDNEW .EQU 10
;
; CHAR DEVICE IDS
;
CIODEV_UART .EQU $00
@ -141,6 +159,13 @@ DIODEV_PRPSD .EQU $70
DIODEV_PPPSD .EQU $80
DIODEV_HDSK .EQU $90
;
; RTC DEVICE IDS
;
RTCDEV_DS .EQU $00 ; DS1322
RTCDEV_BQ .EQU $10 ; BQ4845P
RTCDEV_SIMH .EQU $30 ; SIMH
RTCDEV_INT .EQU $40 ; PERIODIC INT TIMER
;
; VIDEO DEVICE IDS
;
VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545

12
Source/HBIOS/hdsk.asm

@ -27,10 +27,12 @@ HDSK_CFGTBL:
.DB 0 ; DRIVER DEVICE NUMBER
.DB 0 ; DEVICE STATUS
.DW 0,0 ; CURRENT LBA
#IF (HDSK_DEVCNT >= 2)
; DEVICE 1
.DB 1 ; DEVICE NUMBER
.DB 0 ; DEVICE STATUS
.DW 0,0 ; CURRENT LBA
#ENDIF
;
#IF ($ - HDSK_CFGTBL) != (HDSK_DEVCNT * HDSK_CFGSIZ)
.ECHO "*** INVALID HDSK CONFIG TABLE ***\n"
@ -135,15 +137,11 @@ HDSK_RESET:
;
; GET DISK CAPACITY
; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE
; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS
; ASSUME 8 SLICES, SO 16640 X 8 = 133,120 TOTAL SECTORS
;
; 2048 TRKS X 16 HDS X 16 SPT = 524288 OR 80000H
; ASSUME 1GB MEDIA SIZE, SO 1GB / 512B
; IS $200000 SECTORS
;
HDSK_CAP:
;LD DE,133120 >> 16 ; BLOCK COUNT MSW
;LD HL,133120 & $FFFF ; BLOCK COUNT LSW
LD DE,8 ; BLOCK COUNT MSW
LD DE,$20 ; BLOCK COUNT MSW
LD HL,0 ; BLOCK COUNT LSW
LD BC,512 ; 512 BYTE SECTOR
XOR A ; SIGNAL SUCCESS

16
Source/HBIOS/intrtc.asm

@ -50,6 +50,12 @@ INTRTC_DISPATCH:
JP Z,INTRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES
DEC A
JP Z,INTRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES
DEC A
JP Z,INTRTC_GETALM ; GET ALARM
DEC A
JP Z,INTRTC_SETALM ; SET ALARM
DEC A
JP Z,INTRTC_DEVICE ; REPORT RTC DEVICE INFO
CALL PANIC
;
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR
@ -58,6 +64,8 @@ INTRTC_GETBYT:
INTRTC_SETBYT:
INTRTC_GETBLK:
INTRTC_SETBLK:
INTRTC_GETALM:
INTRTC_SETALM:
CALL PANIC
;
; RTC GET TIME
@ -119,6 +127,14 @@ INTRTC_SETTIM:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
; REPORT RTC DEVICE INFO
;
INTRTC_DEVICE:
LD D,RTCDEV_INT ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL DEVICE NUMBER
XOR A ; SIGNAL SUCCESS
RET
;
; HANDLER FOR TIMER SECONDS INTERRUPT
;
INTRTC_INT:

622
Source/HBIOS/romldr.asm

@ -106,7 +106,7 @@ bid_cur .equ -1 ; used below to indicate current bank
;
start:
ld sp,bl_stack ; setup private stack
call DELAY_INIT ; init delay functions
call delay_init ; init delay functions
;
; Disable interrupts if IM1 is active because we are switching to page
; zero in user bank and it has not been prepared with IM1 vector yet.
@ -123,7 +123,7 @@ start:
rst 08 ; do it
ld a,c ; previous bank to A
ld (bid_ldr),a ; save previous bank for later
cp BID_IMG0 ; starting from ROM?
bit 7,a ; starting from ROM?
#endif
;
#if (BIOS == BIOS_UNA)
@ -131,8 +131,7 @@ start:
ld de,BID_USR ; select user bank
rst 08 ; do it
ld (bid_ldr),de ; ... for later
ld a,d ; starting from ROM?
or e ; ... bank == 0?
bit 7,d ; starting from ROM?
#endif
;
; For app mode startup, use alternate table
@ -164,20 +163,22 @@ start1:
call pstr ; do it
call clrbuf ; zero fill the cmd buffer
;
#if (BOOT_TIMEOUT > 0)
#if (BOOT_TIMEOUT != -1)
; Initialize auto command timeout downcounter
or $FF ; auto cmd active value
ld (acmd_act),a ; set flag
ld bc,BOOT_TIMEOUT * 100 ; hundredths of seconds
ld (acmd_to),bc ; save auto cmd timeout
;ld a,b ; check for
;or c ; ... zero
;jr nz,prompt ; not zero, prompt w/ timeout
;call nl2 ; formatting
;ld hl,str_boot ; command string prefix
;call pstr ; show it
;call autocmd ; else, handle w/o prompt
;jr reprompt ; restart w/ autocmd disable
;
; If timeout is zero, boot auto command immediately
ld a,b ; check for
or c ; ... zero
jr nz,prompt ; not zero, prompt w/ timeout
call nl2 ; formatting
ld hl,str_autoboot ; auto command prefix
call pstr ; show it
call autocmd ; handle w/o prompt
jr reprompt ; restart w/ autocmd disable
#endif
;
prompt:
@ -205,7 +206,7 @@ wtkey:
jp nz,dskycmd ; if pending, do DSKY command
#endif
;
#if (BOOT_TIMEOUT > 0)
#if (BOOT_TIMEOUT != -1)
; check for timeout and handle auto boot here
ld a,(acmd_act) ; get auto cmd active flag
or a ; set flags
@ -217,7 +218,7 @@ wtkey:
dec bc ; decrement
ld (acmd_to),bc ; resave it
ld de,625 ; 16us * 625 = 10ms
call VDELAY ; 10ms delay
call vdelay ; 10ms delay
#endif
;
jr wtkey ; loop
@ -454,7 +455,7 @@ setcon:
ld hl,str_newcon ; new console msg
call pstr ; print string on cur console
pop af ; restore new console unit
call PRTDECB ; print unit num
call prtdecb ; print unit num
;
; Set console unit
ld b,BF_SYSPOKE ; HBIOS func: POKE
@ -477,7 +478,7 @@ setcon:
reboot:
ld hl,str_reboot ; point to message
call pstr ; print it
call LDELAY ; wait for message to display
call ldelay ; wait for message to display
;
#if (BIOS == BIOS_WBW)
;
@ -616,11 +617,11 @@ diskboot:
ld hl,str_boot1
call pstr
ld a,(bootunit)
call PRTDECB
call prtdecb
ld hl,str_boot2
call pstr
ld a,(bootslice)
call PRTDECB
call prtdecb
;
#if (DSKYENABLE)
ld hl,msg_load ; point to load message
@ -630,13 +631,22 @@ diskboot:
#if (BIOS == BIOS_WBW)
;
; Check that drive actually exists
ld c,a ; put in C for func call
ld b,BF_SYSGET ; HBIOS func: sys get
ld c,BF_SYSGET_DIOCNT ; HBIOS sub-func: disk count
rst 08 ; do it, E=disk count
ld a,(bootunit) ; get boot disk unit
cp e ; compare to count
jp nc,err_nodisk ; handle no disk err
;
; Sense media
ld a,(bootunit) ; get boot disk unit
ld c,a ; put in C for func call
ld b,BF_DIOMEDIA ; HBIOS func: media
ld e,1 ; enable media check/discovery
rst 08 ; do it
jp nz,err_diskio ; handle error
ld a,e ; media id to A
ld (mediaid),a ; save media id
;
; If non-zero slice requested, confirm device can handle it
ld a,(bootslice) ; get slice
@ -650,40 +660,6 @@ diskboot:
cp DIODEV_IDE ; IDE is max slice device type
jp c,err_noslice ; no such slice, handle err
;
diskboot1:
; Sense media
ld a,(bootunit) ; get boot disk unit
ld c,a ; put in C for func call
ld b,BF_DIOMEDIA ; HBIOS func: media
ld e,1 ; enable media check/discovery
rst 08 ; do it
jp nz,err_diskio ; handle error
call pdot ; show progress
;
; Seek to boot info sector, third sector
ld a,(bootslice) ; get boot slice
ld e,a ; move to E for mult
ld h,65 ; 65 tracks per slice
call MULT8 ; hl := h * e
ld de,$0002 ; head 0, sector 2
ld b,BF_DIOSEEK ; HBIOS func: seek
ld a,(bootunit) ; get boot disk unit
ld c,a ; put in C
rst 08 ; do it
jp nz,err_diskio ; handle error
call pdot ; show progress
;
; Read sector into local buffer
ld b,BF_DIOREAD ; HBIOS func: disk read
ld a,(bootunit) ; get boot disk unit
ld c,a ; put in C for func call
ld hl,bl_infosec ; read into info sec buffer
ld d,BID_USR ; user bank
ld e,1 ; transfer one sector
rst 08 ; do it
jp nz,err_diskio ; handle error
call pdot ; show progress
;
#endif
;
#if (BIOS == BIOS_UNA)
@ -698,59 +674,129 @@ diskboot1:
; If non-zero slice requested, confirm device can handle it
ld a,(bootslice) ; get slice
or a ; set flags
jr z,diskboot1 ; slice 0, skip slice check
jr z,diskboot0 ; slice 0, skip slice check
ld a,d ; disk type to A
cp $41 ; IDE?
jr z,diskboot1 ; if so, OK
jr z,diskboot0 ; if so, OK
cp $42 ; PPIDE?
jr z,diskboot1 ; if so, OK
jr z,diskboot0 ; if so, OK
cp $43 ; SD?
jr z,diskboot1 ; if so, OK
jr z,diskboot0 ; if so, OK
cp $44 ; DSD?
jr z,diskboot1 ; if so, OK
jr z,diskboot0 ; if so, OK
jp err_noslice ; no such slice, handle err
;
diskboot0:
; Below is wrong. It assumes we are booting from a hard
; disk, but it could also be a RAM/ROM disk. However, it is
; not actually possible to boot from those, so not gonna
; worry about this.
ld a,4 ; assume legacy hard disk
ld (mediaid),a ; save media id
;
#endif
;
diskboot1:
; Initialize working LBA value
ld hl,0 ; zero HL
ld (lba),hl ; init
ld (lba+2),hl ; ... LBA
;
; Set legacy sectors per slice
ld hl,16640 ; legacy sectors per slice
ld (sps),hl ; save it
;
; Check for hard disk
ld a,(mediaid) ; load media id
cp 4 ; legacy hard disk?
jr nz,diskboot8 ; if not hd, no part table
;
; Attempt to read MBR
ld de,0 ; MBR is at
ld hl,0 ; ... first sector
ld bc,bl_mbrsec ; read into MBR buffer
ld (dma),bc ; save
ld b,1 ; one sector
ld a,(bootunit) ; get bootunit
ld c,a ; put in C
call diskread ; do it
ret nz ; abort on error
;
; Check signature
ld hl,(bl_mbrsec+$1FE) ; get signature
ld a,l ; first byte
cp $55 ; should be $55
jr nz,diskboot4 ; if not, no part table
ld a,h ; second byte
cp $AA ; should be $AA
jr nz,diskboot4 ; if not, no part table
;
; Try to find our entry in part table and capture lba offset
ld b,4 ; four entries in part table
ld hl,bl_mbrsec+$1BE+4 ; offset of first entry part type
diskboot2:
ld a,(hl) ; get part type
cp $2E ; cp/m partition?
jr z,diskboot3 ; cool, grab the lba offset
ld de,16 ; part table entry size
add hl,de ; bump to next entry part type
djnz diskboot2 ; loop thru table
jr diskboot4 ; too bad, no cp/m partition
;
diskboot3:
; Capture the starting LBA of the CP/M partition we found
ld de,4 ; LBA is 4 bytes after part type
add hl,de ; point to it
ld de,lba ; loc to store lba offset
ld bc,4 ; 4 bytes (32 bits)
ldir ; copy it
; If boot from partition, use new sectors per slice value
ld hl,16384 ; new sectors per slice
ld (sps),hl ; save it
;
diskboot4:
; Add slice offset
ld a,(bootslice) ; get boot slice, A is loop cnt
ld hl,0 ; DE:HL is LBA
ld de,0 ; ... initialize to zero
ld bc,16640 ; sectors per slice
diskboot2:
ld hl,(lba) ; set DE:HL
ld de,(lba+2) ; ... to starting LBA
ld bc,(sps) ; sectors per slice
diskboot5:
or a ; set flags to check loop ctr
jr z,diskboot4 ; done if counter exhausted
jr z,diskboot7 ; done if counter exhausted
add hl,bc ; add one slice to low word
jr nc,diskboot3 ; check for carry
jr nc,diskboot6 ; check for carry
inc de ; if so, bump high word
diskboot3:
diskboot6:
dec a ; dec loop downcounter
jr diskboot2 ; and loop
jr diskboot5 ; and loop
;
diskboot4:
ld (loadlba),hl ; save lba, low word
ld (loadlba+2),de ; save lba, high word
diskboot7:
ld (lba),hl ; update lba, low word
ld (lba+2),de ; update lba, high word
;
; Seek to boot info sector, third sector
diskboot8:
; Note that we could be coming from diskboot1!
ld hl,str_ldsec ; display prefix
call pstr ; do it
ld hl,(lba) ; recover lba loword
ld de,(lba+2) ; recover lba hiword
call prthex32 ; display starting sector
call pdot ; show progress
;
; Read boot info sector, third sector
ld bc,2 ; sector offset
add hl,bc ; add to LBA value low word
jr nc,diskboot5 ; check for carry
jr nc,diskboot9 ; check for carry
inc de ; if so, bump high word
diskboot5:
ld a,(bootunit) ; get disk unit to boot
ld b,a ; put in B for func call
ld c,$41 ; UNA func: set lba
rst 08 ; set lba
jp nz,err_api ; handle error
diskboot9:
ld bc,bl_infosec ; read buffer
ld (dma),bc ; save
ld a,(bootunit) ; disk unit to read
ld c,a ; put in C
ld b,1 ; one sector
call diskread ; do it
ret nz ; abort on error
call pdot ; show progress
;
; Read sector into local buffer
ld c,$42 ; UNA func: read sectors
ld de,bl_infosec ; dest of cpm image
ld l,1 ; sectors to read
rst 08 ; do read
jp nz,err_diskio ; handle error
;
#endif
;
; Check signature
ld de,(bb_sig) ; get signature read
@ -760,6 +806,7 @@ diskboot5:
ld a,$5A ; expected value of second byte
cp e ; compare
jp nz,err_sig ; handle error
call pdot ; show progress
;
; Print disk boot info
; Volume "xxxxxxx" (0xXXXX-0xXXXX, entry @ 0xXXXX)
@ -772,17 +819,17 @@ diskboot5:
call pstr ; print
push hl ; save string ptr
ld bc,(bb_cpmloc) ; get load loc
call PRTHEXWORD ; print it
call prthexword ; print it
pop hl ; restore string ptr
call pstr ; print
push hl ; save string ptr
ld bc,(bb_cpmend) ; get load end
call PRTHEXWORD ; print it
call prthexword ; print it
pop hl ; restore string ptr
call pstr ; print
push hl ; save string ptr
ld bc,(bb_cpment) ; get load end
call PRTHEXWORD ; print it
call prthexword ; print it
pop hl ; restore string ptr
call pstr ; print
;
@ -796,19 +843,25 @@ diskboot5:
ld (loadcnt),a ; ... and save it
call pdot ; show progress
;
#if (BIOS == BIOS_WBW)
;
; Load image into memory
ld b,BF_DIOREAD ; HBIOS func: read sectors
; Start OS load at sector 3
ld hl,(lba) ; low word of saved LBA
ld de,(lba+2) ; high word of saved LBA
ld bc,3 ; offset for sector 3
add hl,bc ; apply it
jr nc,diskboot10 ; check for carry
inc de ; bump high word if so
diskboot10:
ld bc,(bb_cpmloc) ; load address
ld (dma),bc ; and save it
ld a,(loadcnt) ; get sectors to read
ld b,a ; put in B
ld a,(bootunit) ; get boot disk unit
ld c,a ; put in C
ld hl,(bb_cpmloc) ; load address
ld d,BID_USR ; user bank
ld a,(loadcnt) ; get sectors to read
ld e,a ; number of sectors to load
rst 08 ; do it
jp nz,err_diskio ; handle errors
call diskread ; read image
ret nz ; abort on error
call pdot ; show progress
;
#if (BIOS == BIOS_WBW)
;
; Record boot unit/slice
ld b,BF_SYSSET ; hb func: set hbios parameter
@ -821,36 +874,10 @@ diskboot5:
ld e,a ; save in E
rst 08
jp nz,err_api ; handle errors
call pdot ; show progress
;
#endif
;
#if (BIOS == BIOS_UNA)
;
; Start os load at sector 3
ld hl,(loadlba) ; low word of saved LBA
ld de,(loadlba+2) ; high word of saved LBA
ld bc,3 ; offset for sector 3
add hl,bc ; apply it
jr nc,diskboot6 ; check for carry
inc de ; bump high word if so
diskboot6:
ld c,$41 ; UNA func: set lba
ld a,(bootunit) ; get boot disk unit
ld b,a ; move to B
rst 08 ; set lba
jp nz,err_api ; handle error
;
; Read OS image into memory
ld c,$42 ; UNA func: read sectors
ld a,(bootunit) ; get boot disk unit
ld b,a ; move to B
ld de,(bb_cpmloc) ; dest of cpm image
ld a,(loadcnt) ; get sectors to read
ld l,a ; sectors to read
rst 08 ; do read
jp nz,err_diskio ; handle error
call pdot ; show progress
;
; Record boot unit/slice
; UNA provides only a single byte to record the boot unit
@ -871,9 +898,10 @@ diskboot6:
ld bc,$01FC ; UNA func: set bootstrap hist
rst 08 ; call UNA
jp nz,err_api ; handle error
call pdot ; show progress
;
#endif
;
call pdot ; show progress
;
#if (DSKYENABLE)
ld hl,msg_go ; point to go message
@ -884,6 +912,55 @@ diskboot6:
ld hl,(bb_cpment) ; get entry vector
jp (hl) ; and go there
;
; Read disk sector(s)
; DE:HL is LBA, B is sector count, C is disk unit
;
diskread:
;
#if (BIOS == BIOS_UNA)
;
; Seek to requested sector in DE:HL
push bc ; save unit and count
ld b,c ; unit to read in B
ld c,$41 ; UNA func: set lba
rst 08 ; set lba
pop bc ; recover unit and count
jp nz,err_api ; handle error
;
; Read sector(s) into buffer
ld l,b ; sectors to read
ld b,c ; unit to read in B
ld c,$42 ; UNA func: read sectors
ld de,(dma) ; dest for read
rst 08 ; do read
jp nz,err_diskio ; handle error
xor a ; signal success
ret ; and done
;
#endif
;
#if (BIOS == BIOS_WBW)
;
; Seek to requested sector in DE:HL
push bc ; save unit & count
set 7,d ; set LBA access flag
ld b,BF_DIOSEEK ; HBIOS func: seek
rst 08 ; do it
pop bc ; recover unit & count
jp nz,err_diskio ; handle error
;
; Read sector(s) into buffer
ld e,b ; transfer count
ld b,BF_DIOREAD ; HBIOS func: disk read
ld hl,(dma) ; read into info sec buffer
ld d,BID_USR ; user bank
rst 08 ; do it
jp nz,err_diskio ; handle error
xor a ; signal success
ret ; and done
;
#endif
;
;=======================================================================
; Utility functions
;=======================================================================
@ -1077,6 +1154,269 @@ isnum1:
or $FF ; set NZ
ret ; and done
;
; Delay 16us (cpu speed compensated) incuding call/ret invocation
; Register A and flags destroyed
; No compensation for z180 memory wait states
; There is an overhead of 3ts per invocation
; Impact of overhead diminishes as cpu speed increases
;
; cpu scaler (cpuscl) = (cpuhmz - 2) for 16us + 3ts delay
; note: cpuscl must be >= 1!
;
; example: 8mhz cpu (delay goal is 16us)
; loop = ((6 * 16) - 5) = 91ts
; total cost = (91 + 40) = 131ts
; actual delay = (131 / 8) = 16.375us
;
; --- total cost = (loop cost + 40) ts -----------------+
delay: ; 17ts (from invoking call) |
ld a,(cpuscl) ; 13ts |
; |
delay1: ; |
; --- loop = ((cpuscl * 16) - 5) ts ------------+ |
dec a ; 4ts | |
#if (BIOS == BIOS_WBW) ; | |
#if (CPUFAM == CPU_Z180) ; | |
or a ; +4ts for z180 | |
#endif ; | |
#endif ; | |
jr nz,delay1 ; 12ts (nz) / 7ts (z) | |
; ----------------------------------------------+ |
; |
ret ; 10ts (return) |
;-------------------------------------------------------+
;
; Delay 16us * DE (cpu speed compensated)
; Register DE, A, and flags destroyed
; No compensation for z180 memory wait states
; There is a 27ts overhead for call/ret per invocation
; Impact of overhead diminishes as DE and/or cpu speed increases
;
; cpu scaler (cpuscl) = (cpuhmz - 2) for 16us outer loop cost
; note: cpuscl must be > 0!
;
; Example: 8MHz cpu, DE=6250 (delay goal is .1 sec or 100,000us)
; inner loop = ((16 * 6) - 5) = 91ts
; outer loop = ((91 + 37) * 6250) = 800,000ts
; actual delay = ((800,000 + 27) / 8) = 100,003us
;
; --- total cost = (outer loop + 27) ts ------------------------+
vdelay: ; 17ts (from invoking call) |
; |
; --- outer loop = ((inner loop + 37) * de) ts ---------+ |
ld a,(cpuscl) ; 13ts | |
; | |
vdelay1: ; | |
; --- inner loop = ((cpuscl * 16) - 5) ts ------+ | |
#if (BIOS == BIOS_WBW) ; | | |
#if (CPUFAM == CPU_Z180) ; | | |
or a ; +4ts for z180 | | |
#endif ; | | |
#endif ; | | |
dec a ; 4ts | | |
jr nz,vdelay1 ; 12ts (nz) / 7ts (z) | | |
; ----------------------------------------------+ | |
; | |
dec de ; 6ts | |
#if (BIOS == BIOS_WBW) ; | | |
#if (CPUFAM == CPU_Z180) ; | |
or a ; +4ts for z180 | |
#endif ; | |
#endif ; | |
ld a,d ; 4ts | |
or e ; 4ts | |
jp nz,vdelay ; 10ts | |
;-------------------------------------------------------+ |
; |
ret ; 10ts (final return) |
;---------------------------------------------------------------+
;
; Delay about 0.5 seconds
; 500000us / 16us = 31250
;
ldelay:
push af
push de
ld de,31250
call vdelay
pop de
pop af
ret
;
; Initialize delay scaler based on operating cpu speed
; HBIOS *must* be installed and available via rst 8!!!
; CPU scaler := max(1, (phimhz - 2))
;
delay_init:
#if (BIOS == BIOS_UNA)
ld c,$F8 ; UNA bios get phi function
rst 08 ; returns speed in hz in de:hl
ld b,4 ; divide mhz in de:hl by 100000h
delay_init0:
srl d ; ... to get approx cpu speed in
rr e ; ...mhz. throw away hl, and
djnz delay_init0 ; ...right shift de by 4.
inc e ; fix up for value truncation
ld a,e ; put in a
#else
ld b,BF_SYSGET ; HBIOS func=get sys info
ld c,BF_SYSGET_CPUINFO ; HBIOS subfunc=get cpu info
rst 08 ; call HBIOS, rst 08 not yet installed
ld a,l ; put speed in mhz in accum
#endif
cp 3 ; test for <= 2 (special handling)
jr c,delay_init1 ; if <= 2, special processing
sub 2 ; adjust as required by delay functions
jr delay_init2 ; and continue
delay_init1:
ld a,1 ; use the min value of 1
delay_init2:
ld (cpuscl),a ; update cpu scaler value
ret
#if (CPUMHZ < 3)
cpuscl .db 1 ; cpu scaler must be > 0
#else
cpuscl .db CPUMHZ - 2 ; otherwise 2 less than phi mhz
#endif
;
; Print value of a in decimal with leading zero suppression
;
prtdecb:
push hl
push af
ld l,a
ld h,0
call prtdec
pop af
pop hl
ret
;
; Print value of HL in decimal with leading zero suppression
;
prtdec:
push bc
push de
push hl
ld e,'0'
ld bc,-10000
call prtdec1
ld bc,-1000
call prtdec1
ld bc,-100
call prtdec1
ld c,-10
call prtdec1
ld e,0
ld c,-1
call prtdec1
pop hl
pop de
pop bc
ret
prtdec1:
ld a,'0' - 1
prtdec2:
inc a
add hl,bc
jr c,prtdec2
sbc hl,bc
cp e
jr z,prtdec3
ld e,0
call cout
prtdec3:
ret
;
; Short delay functions. No clock speed compensation, so they
; will run longer on slower systems. The number indicates the
; number of call/ret invocations. A single call/ret is
; 27 t-states on a z80, 25 t-states on a z180.
;
; ; z80 z180
; ; ---- ----
dly64: call dly32 ; 1728 1600
dly32: call dly16 ; 864 800
dly16: call dly8 ; 432 400
dly8: call dly4 ; 216 200
dly4: call dly2 ; 108 100
dly2: call dly1 ; 54 50
dly1: ret ; 27 25
;
; Add hl,a
;
; A register is destroyed!
;
addhla:
add a,l
ld l,a
ret nc
inc h
ret
;
; Print the hex byte value in A
;
prthexbyte:
push af
push de
call hexascii
ld a,d
call cout
ld a,e
call cout
pop de
pop af
ret
;
; Print the hex word value in BC
;
prthexword:
push af
ld a,b
call prthexbyte
ld a,c
call prthexbyte
pop af
ret
;
; Print the hex dword value in DE:HL
;
prthex32:
push bc
push de
pop bc
call prthexword
push hl
pop bc
call prthexword
pop bc
ret
;
; Convert binary value in A to ASCII hex characters in DE
;
hexascii:
ld d,a
call hexconv
ld e,a
ld a,d
rlca
rlca
rlca
rlca
call hexconv
ld d,a
ret
;
; Convert low nibble of A to ASCII hex
;
hexconv:
and 0Fh ; low nibble only
add a,90h
daa
adc a,40h
daa
ret
;
;=======================================================================
; Console character I/O helper routines (registers preserved)
;=======================================================================
@ -1239,7 +1579,7 @@ prtall1:
ld hl,str_disk ; prefix string
call pstr ; display it
ld a,c ; index
call PRTDECB ; print it
call prtdecb ; print it
ld hl,str_on ; separator string
call pstr
push bc ; save loop control
@ -1266,7 +1606,7 @@ prtdrv:
and $0F ; isolate device bits
add a,a ; multiple by two for word table
ld hl,devtbl ; point to start of table
call ADDHLA ; add A to HL for table entry
call addhla ; add A to HL for table entry
ld a,(hl) ; deref HL for string adr
inc hl ; ...
ld h,(hl) ; ...
@ -1275,7 +1615,7 @@ prtdrv:
pop hl ; recover HL
pop de ; recover DE
ld a,e ; device number
call PRTDECB ; print it
call prtdecb ; print it
ld a,':' ; suffix
call cout ; print it
ret
@ -1338,7 +1678,7 @@ prtdrv:
ld hl,str_disk ; prefix string
call pstr ; display it
ld a,b ; index
call PRTDECB ; print it
call prtdecb ; print it
ld a,' ' ; formatting
call cout ; do it
ld a,'=' ; formatting
@ -1378,7 +1718,7 @@ prtdrv2: ; print device
pop bc ; recover unit
call pstr ; print device name
ld a,b ; unit to a
call PRTDECB ; print it
call prtdecb ; print it
ld a,':' ; device name suffix
call cout ; print it
ret ; done
@ -1450,10 +1790,12 @@ str_err_api .db "Unexpected hardware BIOS API failure",0
;=======================================================================
;
#define USEDELAY
#include "util.asm"
; #include "util.asm"
;
#if (DSKYENABLE)
#define DSKY_KBD
VDELAY .equ vdelay
DLY2 .equ dly2
#include "dsky.asm"
#endif
;
@ -1472,6 +1814,7 @@ acmd_to .dw BOOT_TIMEOUT ; auto cmd timeout
;=======================================================================
;
str_banner .db PLATFORM_NAME," Boot Loader",0
str_autoboot .db "AutoBoot: ",0
str_prompt .db "Boot [H=Help]: ",0
str_bs .db bs,' ',bs,0
str_reboot .db "\r\n\r\nRestarting System...",0
@ -1489,6 +1832,7 @@ str_binfo2 .db $22," [0x",0
str_binfo3 .db "-0x",0
str_binfo4 .db ", entry @ 0x",0
str_binfo5 .db "]",0
str_ldsec .db ", Sector 0x",0
;
str_help .db "\r\n"
.db "\r\n L - List ROM Applications"
@ -1648,9 +1992,13 @@ bid_ldr .ds 1 ; bank at startup
#endif
#if (BIOS == BIOS_UNA)
bid_ldr .ds 2 ; bank at startup
loadlba .ds 4 ; lba for load, dword
#endif
;
lba .ds 4 ; lba for load, dword
dma .ds 2 ; address for load
sps .ds 2 ; sectors per slice
mediaid .ds 1 ; media id
;
ra_tbl_loc .ds 2 ; points to active ra_tbl
bootunit .ds 1 ; boot disk unit
bootslice .ds 1 ; boot disk slice
@ -1682,5 +2030,11 @@ bb_biloc .ds 2 ; loc to patch boot drive info
bb_cpmloc .ds 2 ; final ram dest for cpm/cbios
bb_cpmend .ds 2 ; end address for load
bb_cpment .ds 2 ; CP/M entry point (cbios boot)
;
;
; Master Boot Record sector is read into area below.
;
bl_mbrsec .equ $
.ds 512
;
.end

31
Source/HBIOS/sd.asm

@ -866,7 +866,7 @@ SD_INITCARD1:
; MAKE SURE WE FINISH SENDING
#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC))
CALL SD_WAITTX ; WAIT FOR TE TO CLEAR
CALL DLY4 ; WAIT A BIT MORE FOR FINAL BIT
CALL DLY32 ; WAIT A BIT MORE FOR FINAL BIT
#ENDIF
;
; PUT CARD IN IDLE STATE
@ -1025,7 +1025,7 @@ SD_INITCARD5:
; PER SPEC, THE CARD SHOULD NOW BE ABLE TO HANDLE FULL SPEED OPERATION
; SO, FOR CSIO OPERATION, WE SET CSIO TO MAXIMUM SPEED
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING
CALL DLY4 ; WAIT A BIT MORE FOR FINAL BIT
CALL DLY32 ; WAIT A BIT MORE FOR FINAL BIT
XOR A ; ZERO MEANS MAX SPEED
OUT (Z180_CNTR),A ; NOW SET CSIO PORT
#ENDIF
@ -1335,7 +1335,19 @@ SD_EXECCMD1:
; THE FIRST FILL BYTE IS DISCARDED! THIS HACK IS REQUIRED BY
; STUPID SD CARD ADAPTERS THAT NOW OMIT THE MISO PULL-UP. SEE
; COMMENTS AT TOP OF THIS FILE.
CALL SD_GET ; GET A BYTE AND DISCARD IT
;
;CALL SD_GET ; GET A BYTE AND DISCARD IT
;
; THE Z180 -K REVISION CSIO DOES NOT KEEP MOSI HIGH WHEN
; RECEIVING VIA MISO. INSTEAD MOSI IS LEFT AT WHICHEVER LOGIC
; LEVEL IT WAS LAST SET TO. THIS CAUSES SOME SD CARDS A PROBLEM
; BECAUSE THEY EXPECT MOSI TO BE CONSISTENTLY HIGH WHEN IDLE.
; BY USING A PUT INSTEAD OF A GET, WE CAN FORCE MOSI TO BE
; LEFT AT THE PROPER LOGIC LEVEL. THE SD CARD DOES NOT CARE
; IF A PUT OR A GET IS USED TO IGNORE THE BYTE BECAUSE THE
; CLOCK RUNS IN EITHER CASE.
LD A,$FF ; KEEP MOSI HI
CALL SD_PUT ; SEND 8 CLOCKS
#ENDIF
;
; GET RESULT
@ -1661,6 +1673,11 @@ SD_SELECT2:
#ENDIF
LD (SD_OPRVAL),A
OUT (SD_OPRREG),A
;;
;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC))
; CALL DLY32 ; DELAY FOR FINAL BIT
;#ENDIF
;
RET
;
; DESELECT CARD
@ -1674,12 +1691,10 @@ SD_DESELECT:
; FINISH SENDING AFTER TE IS CLEARED. THE DELAY BELOW WILL
; DO THIS FOR THE SLOWEST POSSIBLE SEND RATE WHICH IS
; CLK / 1320, SO DELAY AT LEAST 1320 T-STATES
;CALL DLY64 ; DELAY FOR FINAL BIT
;
; IN PRACTICE, IT LOOKS LIKE THIS WORST CASE SCENARIO NEVER
; OCCURS. FOR NOW, USE A SMALL DELAY WHICH SEEMS TO BE MORE
; THAN ADEQUATE BASED ON LOGIC ANALYZER TRACES.
CALL DLY4 ; DELAY FOR FINAL BIT
; IN PRACTICE, A SMALLER DELAY IS FINE BASED ON LOGIC ANALYZER
; TRACES.
CALL DLY32 ; DELAY FOR FINAL BIT
#ENDIF
;
LD A,(SD_OPRVAL)

16
Source/HBIOS/simrtc.asm

@ -49,6 +49,12 @@ SIMRTC_DISPATCH:
JP Z,SIMRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES
DEC A
JP Z,SIMRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES
DEC A
JP Z,SIMRTC_GETALM ; GET ALARM
DEC A
JP Z,SIMRTC_SETALM ; SET ALARM
DEC A
JP Z,SIMRTC_DEVICE ; REPORT RTC DEVICE INFO
CALL PANIC
;
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR
@ -57,6 +63,8 @@ SIMRTC_GETBYT:
SIMRTC_SETBYT:
SIMRTC_GETBLK:
SIMRTC_SETBLK:
SIMRTC_GETALM:
SIMRTC_SETALM:
CALL PANIC
;
; RTC GET TIME
@ -121,6 +129,14 @@ SIMRTC_SETTIM:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
; REPORT RTC DEVICE INFO
;
SIMRTC_DEVICE:
LD D,RTCDEV_SIMH ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL DEVICE NUMBER
XOR A ; SIGNAL SUCCESS
RET
;
; WORKING VARIABLES
;
SIMRTC_BUF: ; ALL IN BCD!!!

455
Source/HBIOS/sn76489.asm

@ -5,6 +5,8 @@
;======================================================================
;
; TODO:
; 1. PROVIDE SUPPORT FOR NOISE CHANNEL
; 2. DOES THIS WORK FOR FASTER CPUS? ONLY BEEN TESTED ON A Z80 7MHZ UNIT
;
;======================================================================
; CONSTANTS
@ -22,22 +24,11 @@ CHANNEL_1_SILENT .EQU $BF
CHANNEL_2_SILENT .EQU $DF
CHANNEL_3_SILENT .EQU $FF
SN7CLKDIVIDER .EQU 4
SN7CLK .EQU CPUOSC / SN7CLKDIVIDER
SN7RATIO .EQU SN7CLK * 100 / 32
SN7_FIRST_NOTE .EQU 5827 ; A1#
SN7_LAST_NOTE .EQU 209300 ; C7
A1S .EQU SN7RATIO / SN7_FIRST_NOTE
C7 .EQU SN7RATIO / SN7_LAST_NOTE
.ECHO "SN76489: range of A1# (period: "
.ECHO A1S
.ECHO ") to C7 (period: "
.ECHO C7
.ECHO ")\n"
.ECHO "SN76489 CLOCK: "
.ECHO SN7CLK
.ECHO "\n"
#INCLUDE "audio.inc"
@ -69,13 +60,13 @@ SN7_INIT1:
;
SN7_RESET:
AUDTRACE(TRACE_INIT)
AUDTRACE(SNT_INIT)
CALL SN7_VOLUME_OFF
XOR A ; SIGNAL SUCCESS
RET
SN7_VOLUME_OFF:
AUDTRACE(TRACE_VOLUME_OFF)
AUDTRACE(SNT_VOLOFF)
LD A, CHANNEL_0_SILENT
OUT (SN76489_PORT_LEFT), A
@ -103,73 +94,51 @@ SN7_VOLUME_OFF:
; 1 CC 1 VVVV
SN7_VOLUME:
AUDDEBUG("SN7VOL ")
AUDTRACE(SNT_VOL)
AUDTRACE_L
AUDDEBUG("\r\n")
AUDTRACE_CR
LD A, L
LD (PENDING_VOLUME), A
LD (SN7_PENDING_VOLUME), A
XOR A ; SIGNAL SUCCESS
RET
SN7_NOTE:
AUDDEBUG("SN7NOT ")
AUDTRACE_L
AUDDEBUG("\r\n")
ADD HL, HL ; SHIFT RIGHT (MULT 2) -INDEX INTO SN7NOTETBL TABLE OF WORDS
; TEST IF HL IS LARGER THAN SN7NOTETBL SIZE
OR A ; CLEAR CARRY FLAG
LD DE, SIZ_SN7NOTETBL
SBC HL, DE
JR NC, SN7_NOTE1 ; INCOMING HL DOES NOT MAP INTO SN7NOTETBL
ADD HL, DE ; RESTORE HL
LD E, L ; HL = SN7NOTETBL + HL
LD D, H
LD HL, SN7NOTETBL
ADD HL, DE
LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL
INC HL
LD H, (HL)
LD L, A
JR SN7_PERIOD ; APPLY PERIOD
SN7_NOTE1:
OR $FF ; NOT IMPLEMENTED YET
RET
LD DE, SN7NOTETBL
CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU
; TO SET THIS PERIOD
SN7_PERIOD:
AUDDEBUG("SN7PRD ")
AUDTRACE(SNT_PERIOD)
AUDTRACE_HL
AUDDEBUG("\r\n")
AUDTRACE_CR
LD A, H
CP $04
JP NC, SN7_QUERY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE
LD A, H ; IF ZERO - ERROR
OR L
JR Z, SN7_QUERY_PERIOD1
LD (SN7_PENDING_PERIOD), HL ;ASSUME SUCCESS
OR A ; IF >= 401 ERROR
LD DE, $401
SBC HL, DE
JR NC, SN7_QUERY_PERIOD1
LD (PENDING_PERIOD), HL
XOR A ; SIGNAL SUCCESS
RET
SN7_QUERY_PERIOD1: ; REQUESTED PERIOD IS LARGER THAN THE SN76489 CAN SUPPORT
LD L, $FF
LD H, $FF
LD (PENDING_PERIOD), HL
OR $FF ; SIGNAL FAILURE
LD A, $FF
LD L, A
LD H, A
LD (SN7_PENDING_PERIOD), HL
RET
SN7_PLAY:
AUDDEBUG("SN7PLY ")
AUDTRACE(SNT_PLAY)
AUDTRACE_D
AUDDEBUG("\r\n")
AUDTRACE_CR
LD A, (PENDING_PERIOD + 1)
LD A, (SN7_PENDING_PERIOD + 1)
CP $FF
JR Z, SN7_PLAY1 ; PERIOD IS TOO LARGE, UNABLE TO PLAY
CALL SN7_APPLY_VOL
@ -179,13 +148,13 @@ SN7_PLAY:
RET
SN7_PLAY1: ; TURN CHANNEL VOL TO OFF AND STOP PLAYING
LD A, (PENDING_VOLUME)
LD A, (SN7_PENDING_VOLUME)
PUSH AF
LD A, 0
LD (PENDING_VOLUME), A
LD (SN7_PENDING_VOLUME), A
CALL SN7_APPLY_VOL
POP AF
LD (PENDING_VOLUME), A
LD (SN7_PENDING_VOLUME), A
OR $FF ; SIGNAL FAILURE
RET
@ -214,12 +183,12 @@ SN7_QUERY_CHCNT:
RET
SN7_QUERY_PERIOD:
LD HL, (PENDING_PERIOD)
LD HL, (SN7_PENDING_PERIOD)
XOR A
RET
SN7_QUERY_VOLUME:
LD A, (PENDING_VOLUME)
LD A, (SN7_PENDING_VOLUME)
LD L, A
LD H, 0
@ -251,7 +220,7 @@ SN7_APPLY_VOL: ; APPLY VOLUME TO BOTH LEFT AND RIGHT CHANNELS
OR $90
LD B, A
LD A, (PENDING_VOLUME)
LD A, (SN7_PENDING_VOLUME)
RRCA
RRCA
RRCA
@ -264,9 +233,9 @@ SN7_APPLY_VOL: ; APPLY VOLUME TO BOTH LEFT AND RIGHT CHANNELS
AND $0F
OR B ; A CONTAINS COMMAND TO SET VOLUME FOR CHANNEL
AUDTRACE(TRACE_PORT_WR)
AUDTRACE(SNT_REGWR)
AUDTRACE_A
AUDTRACE(TRACE_NEWLINE)
AUDTRACE_CR
OUT (SN76489_PORT_LEFT), A
OUT (SN76489_PORT_RIGHT), A
@ -279,7 +248,7 @@ SN7_APPLY_PRD:
PUSH DE
PUSH BC
PUSH AF
LD HL, (PENDING_PERIOD)
LD HL, (SN7_PENDING_PERIOD)
LD A, D
AND $3
@ -295,9 +264,9 @@ SN7_APPLY_PRD:
AND $F
OR B ; A NOW CONATINS FIRST PERIOD COMMAND
AUDTRACE(TRACE_PORT_WR)
AUDTRACE(SNT_REGWR)
AUDTRACE_A
AUDTRACE(TRACE_NEWLINE)
AUDTRACE_CR
OUT (SN76489_PORT_LEFT), A
OUT (SN76489_PORT_RIGHT), A
@ -318,9 +287,9 @@ SN7_APPLY_PRD:
RLCA ; AND PLACE IN BITS 5 AND 6
OR B ; OR THE TWO SETS OF BITS TO MAKE 2ND PERIOD COMMAND
AUDTRACE(TRACE_PORT_WR)
AUDTRACE(SNT_REGWR)
AUDTRACE_A
AUDTRACE(TRACE_NEWLINE)
AUDTRACE_CR
OUT (SN76489_PORT_LEFT), A
OUT (SN76489_PORT_RIGHT), A
@ -344,282 +313,76 @@ SN7_FNTBL:
!!!!!
#ENDIF
PENDING_PERIOD
SN7_PENDING_PERIOD
.DW 0 ; PENDING PERIOD (10 BITS)
PENDING_VOLUME
.DB 0 ; PENDING VOL (8 BITS -> DOWNOVERTED TO 4 BITS AND INVERTED)
SN7_PENDING_VOLUME
.DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED)
STR_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$"
STR_MESSAGERT .DB ", RIGHT IO=0x$"
#IF AUDIOTRACE
TRACE_INIT .DB "\r\nSN7_INIT CALLED\r\n$"
TRACE_VOLUME_OFF .DB "\r\nSN7_VOLUME_OFF\r\n$"
TRACE_VOLUME_SET .DB "\r\nSN7_VOLUME_SET CH: $"
TRACE_PLAY .DB "\r\nPLAY\r\n$"
TRACE_VOLUME .DB ", VOL: $"
TRACE_PORT_WR .DB "\r\nOUT SN76489, $"
TRACE_PERIOD_SET .DB "\r\nSN7_PERIOD_SET CH: $"
TRACE_PERIOD .DB ", PERIOD: $"
TRACE_NEWLINE .DB "\r\n$"
SNT_INIT .DB "\r\nSN7_INIT\r\n$"
SNT_VOLOFF .DB "\r\nSN7_VOLUME OFF\r\n$"
SNT_VOL .DB "\r\nSN7_VOLUME: $"
SNT_NOTE .DB "\r\nSN7_NOTE: $"
SNT_PERIOD .DB "\r\nSN7_PERIOD: $"
SNT_PLAY .DB "\r\nSN7_PLAY CH: $"
SNT_REGWR .DB "\r\nOUT SN76489, $"
#ENDIF
; THE FREQUENCY BY QUATER TONE STARTING AT A1#
; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCATVE 0
; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP)
; FIRST PLAYABLE NOTE WILL BE $2E
; ASSUMING A CLOCK OF 1843200 THIS MAPS TO
; 2 QUATER TONES BELOW A1#, WITH A1# AT $30
SN7NOTETBL:
.DW A1S
.DW SN7RATIO / 5912
.DW SN7RATIO / 5998
.DW SN7RATIO / 6085
.DW SN7RATIO / 6174
.DW SN7RATIO / 6264
.DW SN7RATIO / 6355
.DW SN7RATIO / 6447
.DW SN7RATIO / 6541
.DW SN7RATIO / 6636
.DW SN7RATIO / 6733
.DW SN7RATIO / 6831
.DW SN7RATIO / 6930
.DW SN7RATIO / 7031
.DW SN7RATIO / 7133
.DW SN7RATIO / 7237
.DW SN7RATIO / 7342
.DW SN7RATIO / 7449
.DW SN7RATIO / 7557
.DW SN7RATIO / 7667
.DW SN7RATIO / 7778
.DW SN7RATIO / 7891
.DW SN7RATIO / 8006
.DW SN7RATIO / 8122
.DW SN7RATIO / 8241
.DW SN7RATIO / 8361
.DW SN7RATIO / 8482
.DW SN7RATIO / 8606
.DW SN7RATIO / 8731
.DW SN7RATIO / 8858
.DW SN7RATIO / 8987
.DW SN7RATIO / 9118
.DW SN7RATIO / 9250
.DW SN7RATIO / 9385
.DW SN7RATIO / 9521
.DW SN7RATIO / 9660
.DW SN7RATIO / 9800
.DW SN7RATIO / 9943
.DW SN7RATIO / 10087
.DW SN7RATIO / 10234
.DW SN7RATIO / 10383
.DW SN7RATIO / 10534
.DW SN7RATIO / 10687
.DW SN7RATIO / 10843
.DW SN7RATIO / 11000
.DW SN7RATIO / 11160
.DW SN7RATIO / 11322
.DW SN7RATIO / 11487
.DW SN7RATIO / 11654
.DW SN7RATIO / 11824
.DW SN7RATIO / 11995
.DW SN7RATIO / 12170
.DW SN7RATIO / 12347
.DW SN7RATIO / 12527
.DW SN7RATIO / 12709
.DW SN7RATIO / 12894
.DW SN7RATIO / 13081
.DW SN7RATIO / 13271
.DW SN7RATIO / 13464
.DW SN7RATIO / 13660
.DW SN7RATIO / 13859
.DW SN7RATIO / 14061
.DW SN7RATIO / 14265
.DW SN7RATIO / 14473
.DW SN7RATIO / 14683
.DW SN7RATIO / 14897
.DW SN7RATIO / 15113
.DW SN7RATIO / 15333
.DW SN7RATIO / 15556
.DW SN7RATIO / 15782
.DW SN7RATIO / 16012
.DW SN7RATIO / 16245
.DW SN7RATIO / 16481
.DW SN7RATIO / 16721
.DW SN7RATIO / 16964
.DW SN7RATIO / 17211
.DW SN7RATIO / 17461
.DW SN7RATIO / 17715
.DW SN7RATIO / 17973
.DW SN7RATIO / 18234
.DW SN7RATIO / 18500
.DW SN7RATIO / 18769
.DW SN7RATIO / 19042
.DW SN7RATIO / 19319
.DW SN7RATIO / 19600
.DW SN7RATIO / 19885
.DW SN7RATIO / 20174
.DW SN7RATIO / 20468
.DW SN7RATIO / 20765
.DW SN7RATIO / 21067
.DW SN7RATIO / 21373
.DW SN7RATIO / 21684
.DW SN7RATIO / 22000
.DW SN7RATIO / 22320
.DW SN7RATIO / 22645
.DW SN7RATIO / 22974
.DW SN7RATIO / 23308
.DW SN7RATIO / 23647
.DW SN7RATIO / 23991
.DW SN7RATIO / 24340
.DW SN7RATIO / 24694
.DW SN7RATIO / 25053
.DW SN7RATIO / 25418
.DW SN7RATIO / 25787
.DW SN7RATIO / 26163
.DW SN7RATIO / 26544
.DW SN7RATIO / 26930
.DW SN7RATIO / 27321
.DW SN7RATIO / 27718
.DW SN7RATIO / 28121
.DW SN7RATIO / 28530
.DW SN7RATIO / 28945
.DW SN7RATIO / 29366
.DW SN7RATIO / 29793
.DW SN7RATIO / 30226
.DW SN7RATIO / 30666
.DW SN7RATIO / 31113
.DW SN7RATIO / 31566
.DW SN7RATIO / 32025
.DW SN7RATIO / 32490
.DW SN7RATIO / 32963
.DW SN7RATIO / 33442
.DW SN7RATIO / 33929
.DW SN7RATIO / 34422
.DW SN7RATIO / 34923
.DW SN7RATIO / 35431
.DW SN7RATIO / 35946
.DW SN7RATIO / 36469
.DW SN7RATIO / 36999
.DW SN7RATIO / 37537
.DW SN7RATIO / 38083
.DW SN7RATIO / 38637
.DW SN7RATIO / 39200
.DW SN7RATIO / 39770
.DW SN7RATIO / 40349
.DW SN7RATIO / 40936
.DW SN7RATIO / 41530
.DW SN7RATIO / 42134
.DW SN7RATIO / 42747
.DW SN7RATIO / 43369
.DW SN7RATIO / 44000
.DW SN7RATIO / 44640
.DW SN7RATIO / 45289
.DW SN7RATIO / 45948
.DW SN7RATIO / 46616
.DW SN7RATIO / 47294
.DW SN7RATIO / 47982
.DW SN7RATIO / 48680
.DW SN7RATIO / 49388
.DW SN7RATIO / 50106
.DW SN7RATIO / 50835
.DW SN7RATIO / 51575
.DW SN7RATIO / 52325
.DW SN7RATIO / 53086
.DW SN7RATIO / 53858
.DW SN7RATIO / 54642
.DW SN7RATIO / 55437
.DW SN7RATIO / 56243
.DW SN7RATIO / 57061
.DW SN7RATIO / 57891
.DW SN7RATIO / 58733
.DW SN7RATIO / 59587
.DW SN7RATIO / 60454
.DW SN7RATIO / 61333
.DW SN7RATIO / 62225
.DW SN7RATIO / 63130
.DW SN7RATIO / 64048
.DW SN7RATIO / 64980
.DW SN7RATIO / 65925
.DW SN7RATIO / 66884
.DW SN7RATIO / 67857
.DW SN7RATIO / 68844
.DW SN7RATIO / 69846
.DW SN7RATIO / 70862
.DW SN7RATIO / 71893
.DW SN7RATIO / 72938
.DW SN7RATIO / 73999
.DW SN7RATIO / 75075
.DW SN7RATIO / 76167
.DW SN7RATIO / 77275
.DW SN7RATIO / 78399
.DW SN7RATIO / 79539
.DW SN7RATIO / 80696
.DW SN7RATIO / 81870
.DW SN7RATIO / 83061
.DW SN7RATIO / 84269
.DW SN7RATIO / 85495
.DW SN7RATIO / 86738
.DW SN7RATIO / 88000
.DW SN7RATIO / 89280
.DW SN7RATIO / 90579
.DW SN7RATIO / 91896
.DW SN7RATIO / 93233
.DW SN7RATIO / 94589
.DW SN7RATIO / 95965
.DW SN7RATIO / 97361
.DW SN7RATIO / 98777
.DW SN7RATIO / 100214
.DW SN7RATIO / 101671
.DW SN7RATIO / 103150
.DW SN7RATIO / 104650
.DW SN7RATIO / 106172
.DW SN7RATIO / 107716
.DW SN7RATIO / 109283
.DW SN7RATIO / 110873
.DW SN7RATIO / 112486
.DW SN7RATIO / 114122
.DW SN7RATIO / 115782
.DW SN7RATIO / 117466
.DW SN7RATIO / 119175
.DW SN7RATIO / 120908
.DW SN7RATIO / 122667
.DW SN7RATIO / 124451
.DW SN7RATIO / 126261
.DW SN7RATIO / 128098
.DW SN7RATIO / 129961
.DW SN7RATIO / 131851
.DW SN7RATIO / 133769
.DW SN7RATIO / 135715
.DW SN7RATIO / 137689
.DW SN7RATIO / 139691
.DW SN7RATIO / 141723
.DW SN7RATIO / 143784
.DW SN7RATIO / 145876
.DW SN7RATIO / 147998
.DW SN7RATIO / 150151
.DW SN7RATIO / 152335
.DW SN7RATIO / 154550
.DW SN7RATIO / 156798
.DW SN7RATIO / 159079
.DW SN7RATIO / 161393
.DW SN7RATIO / 163740
.DW SN7RATIO / 166122
.DW SN7RATIO / 168538
.DW SN7RATIO / 170990
.DW SN7RATIO / 173477
.DW SN7RATIO / 176000
.DW SN7RATIO / 178560
.DW SN7RATIO / 181157
.DW SN7RATIO / 183792
.DW SN7RATIO / 186466
.DW SN7RATIO / 189178
.DW SN7RATIO / 191930
.DW SN7RATIO / 194722
.DW SN7RATIO / 197553
.DW SN7RATIO / 200426
.DW SN7RATIO / 203342
.DW SN7RATIO / 206299
.DW C7
SIZ_SN7NOTETBL .EQU $ - SN7NOTETBL
.ECHO "SN76489 approx "
.ECHO SIZ_SN7NOTETBL / 2 / 4 /12
.ECHO " Octaves. Last note index supported: "
.ECHO SIZ_SN7NOTETBL / 2
.ECHO "\n"
.DW SN7RATIO / 2913
.DW SN7RATIO / 2956
.DW SN7RATIO / 2999
.DW SN7RATIO / 3042
.DW SN7RATIO / 3086
.DW SN7RATIO / 3131
.DW SN7RATIO / 3177
.DW SN7RATIO / 3223
.DW SN7RATIO / 3270
.DW SN7RATIO / 3318
.DW SN7RATIO / 3366
.DW SN7RATIO / 3415
.DW SN7RATIO / 3464
.DW SN7RATIO / 3515
.DW SN7RATIO / 3566
.DW SN7RATIO / 3618
.DW SN7RATIO / 3670
.DW SN7RATIO / 3724
.DW SN7RATIO / 3778
.DW SN7RATIO / 3833
.DW SN7RATIO / 3889
.DW SN7RATIO / 3945
.DW SN7RATIO / 4003
.DW SN7RATIO / 4061
.DW SN7RATIO / 4120
.DW SN7RATIO / 4180
.DW SN7RATIO / 4241
.DW SN7RATIO / 4302
.DW SN7RATIO / 4365
.DW SN7RATIO / 4428
.DW SN7RATIO / 4493
.DW SN7RATIO / 4558
.DW SN7RATIO / 4624
.DW SN7RATIO / 4692
.DW SN7RATIO / 4760
.DW SN7RATIO / 4829
.DW SN7RATIO / 4899
.DW SN7RATIO / 4971
.DW SN7RATIO / 5043
.DW SN7RATIO / 5116
.DW SN7RATIO / 5191
.DW SN7RATIO / 5266
.DW SN7RATIO / 5343
.DW SN7RATIO / 5421
.DW SN7RATIO / 5499
.DW SN7RATIO / 5579
.DW SN7RATIO / 5661
.DW SN7RATIO / 5743

207
Source/HBIOS/spk.asm

@ -1,46 +1,161 @@
;======================================================================
;
; BIT MODE SOUND DRIVER FOR SBC V2 USING BIT 0 OF RTC DRIVER
;
;======================================================================
;
; DRIVER FUNCTION TABLE AND INSTANCE DATA
;
SP_FNTBL:
.DW SP_RESET
.DW SP_VOLUME
.DW SP_PERIOD
.DW SP_NOTE
.DW SP_PLAY
.DW SP_QUERY
;
#IF (($ - SP_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
!!!!!
#ENDIF
;
SP_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE
;
SP_TONECNT .EQU 1 ; COUNT NUMBER OF TONE CHANNELS
SP_NOISECNT .EQU 0 ; COUNT NUMBER OF NOISE CHANNELS
;
SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS)
SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS)
;
;======================================================================
; I/O BIT DRIVER FOR CONSOLE BELL FOR SBC V2 USING BIT 0 OF RTC DRIVER
; DRIVER INITIALIZATION
;======================================================================
;
SPK_INIT:
CALL NEWLINE ; FORMATTING
SP_INIT:
LD IY, SP_IDAT ; SETUP FUNCTION TABLE
LD BC, SP_FNTBL ; POINTER TO INSTANCE DATA
LD DE, SP_IDAT ; BC := FUNCTION TABLE ADDRESS
CALL SND_ADDENT ; DE := INSTANCE DATA PTR
;
CALL NEWLINE ; ANNOUNCE DEVICE
PRTS("SPK: IO=0x$")
LD A,RTCIO
CALL PRTHEXBYTE
CALL SPK_SETTBL
CALL SPK_BEEP ; PLAY A NOTE
CALL SP_SETTBL ; SETUP TONE TABLE
CALL SP_PLAY ; PLAY DEFAULT NOTE
XOR A
RET
;
; SETUP THE SPEAKER NOTE TABLE ACCORDING TO THE CPU SPEED.
; FREQUENCY ACCURACY DECREASES AS CLOCK SPEED MULITPLIER INCREASES.
; 1MHZ ERROR MAY OCCUR IF CPU CLOCK IS UNDER. I.E 3.999 = 3MHZ
SPK_SETTBL:
;======================================================================
; SOUND DRIVER FUNCTION - RESET
;======================================================================
;
SP_RESET:
; XOR A ; SUCCESSFULL RESET
; RET
;
;======================================================================
; SOUND DRIVER FUNCTION - VOLUME
;======================================================================
;
SP_VOLUME:
XOR A ; SIGNAL SUCCESS
RET
;
;======================================================================
; SOUND DRIVER FUNCTION - PERIOD
;======================================================================
;
SP_PERIOD:
LD (SP_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL
XOR A
RET
;
;======================================================================
; SOUND DRIVER FUNCTION - NOTE
;======================================================================
;
SP_NOTE:
PUSH HL
PUSH DE ; ON ENTRY L IS A NOTE INDEX
LD H,0 ; CONVERT THIS NOTE INDEX
ADD HL,HL ; TO THE ASSOCIATED ENTRY
ADD HL,HL ; IN THE TUNE ABLE.
LD DE,SP_TUNTBL ; SAVE THIS ADDRESS AS
ADD HL,DE ; THE PERIOD
LD (SP_PENDING_PERIOD),HL
POP DE
POP HL
RET
;
;======================================================================
; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS
;======================================================================
;
SP_QUERY:
LD A, E
CP BF_SNDQ_CHCNT ; SUB FUNCTION 01
JR Z, SP_QUERY_CHCNT
;
CP BF_SNDQ_VOLUME ; SUB FUNCTION 02
JR Z, SP_QUERY_VOLUME
;
CP BF_SNDQ_PERIOD ; SUB FUNCTION 03
JR Z, SP_QUERY_PERIOD
;
CP BF_SNDQ_DEV ; SUB FUNCTION 04
JR Z, SP_QUERY_DEV
;
OR $FF ; SIGNAL FAILURE
RET
;
SP_QUERY_CHCNT:
LD BC,(SP_TONECNT*256)+SP_NOISECNT ; RETURN NUMBER OF
XOR A ; TONE AND NOISE
RET ; CHANNELS IN BC
;
SP_QUERY_PERIOD:
LD HL, (SP_PENDING_PERIOD) ; RETURN 16-BIT PERIOD
XOR A ; IN HL REGISTER
RET
;
SP_QUERY_VOLUME:
LD L, 255 ; RETURN 8-BIT VOLUME
XOR A ; IN L REGISTER
RET
;
SP_QUERY_DEV:
LD B, BF_SND_BITMODE ; RETURN DEVICE IDENTIFIER
LD DE, 0 ; AND ADDRESS AND DATA PORT
XOR A
RET
;
;======================================================================
; INITIALIZE THE TONE TABLE
;======================================================================
;
SP_SETTBL:
LD A,(CB_CPUMHZ) ; GET CPU SPEED.
LD C,A
LD B,SPK_NOTCNT ; SET NUMBER OF NOTES TO
LD HL,SPK_TUNTBL+2 ; ADJUST AND START POINT
SPK_SETTBL2:
LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO
LD HL,SP_TUNTBL+2 ; ADJUST AND START POINT
;
SP_SETTBL2:
PUSH HL
LD A,(HL) ; READ
LD E,A ; IN
INC HL ; THE
LD A,(HL) ; 1MHZ
LD D,A ; NOTE
LD E,(HL) ; READ IN
INC HL ; THE 1MHZ
LD D,(HL) ; NOTE
;
PUSH BC
LD B,C
LD HL,0 ; MULTIPLY
SPK_SETTBL1: ; 1MHZ NOTE
SP_SETTBL1: ; 1MHZ NOTE
ADD HL,DE ; VALUE BY
DJNZ SPK_SETTBL1 ; SYSTEM MHZ
DJNZ SP_SETTBL1 ; SYSTEM MHZ
POP BC
;
LD DE,30 ; ADD OVEREAD
LD DE,30 ; ADD OVERHEAD
ADD HL,DE ; COMPENSATION
;
POP DE ; RECALL NOTE
@ -52,34 +167,35 @@ SPK_SETTBL1: ; 1MHZ NOTE
INC HL ; NOTE
INC HL ; AND MOVE
INC HL ; TO NEXT
DJNZ SPK_SETTBL2 ; NEXT NOTE
;
DJNZ SP_SETTBL2 ; NEXT NOTE
RET
SPK_BEEP:
LD HL,SPK_NOTE_C8 ; SELECT NOTE
;
LD A,(HL) ; LOAD 1ST ARG
;======================================================================
; SOUND DRIVER FUNCTION - PLAY
;======================================================================
;
SP_PLAY:
LD HL,(SP_PENDING_PERIOD) ; SELECT NOTE
;
LD E,(HL) ; LOAD 1ST ARG
INC HL ; IN DE
LD E,A
LD A,(HL)
LD D,(HL)
INC HL
LD D,A
;
LD A,(HL) ; LOAD 2ND ARG
LD C,(HL) ; LOAD 2ND ARG
INC HL ; IN BC
LD C,A
LD A,(HL)
LD B,(HL)
INC HL
LD B,A
;
PUSH BC ; SETUP ARG IN HL
POP HL
;
CALL SPK_BEEPER ; PLAY
CALL SP_BEEPER ; PLAY
;
RET
;
; The following SPK_BEEPER routine is a modification of code from
; The following SP_BEEPER routine is a modification of code from
; "The Complete SPECTRUM ROM DISSASSEMBLY" by Dr Ian Logan & Dr Frank O’Hara
;
; https://www.esocop.org/docs/CompleteSpectrumROMDisassemblyThe.pdf
@ -87,7 +203,7 @@ SPK_BEEP:
; DE Number of passes to make through the sound generation loop
; HL Loop delay parameter
;
SPK_BEEPER:
SP_BEEPER:
PUSH IX
DI ; Disable the interrupt for the duration of a 'beep'.
LD A,L ; Save L temporarily.
@ -146,13 +262,13 @@ BE_END:
POP IX
RET
;
; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SPK_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL
; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SP_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL
;
; EXCEL SPREADSHEET FOR CALCULATION CAN BE FOUND HERE:
;
; https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=boards:sbc:sbc_v2:sbc_v2-004:spk_beep_tuntbl.xlsx
;
SPK_TUNTBL:
SP_TUNTBL:
.DW $13, $191A ; D
.DW $14, $17B3 ; E0
.DW $15, $165E ; F0
@ -246,7 +362,7 @@ SPK_TUNTBL:
.DW $DC0, $23 ; A7
.DW $E91, $21 ; A
.DW $F6F, $1F ; B7
SPK_NOTE_C8:
SP_NOTE_C8:
.DW $105A, $1D ; C8
.DW $1152, $1C ; C
.DW $125A, $1A ; D8
@ -259,5 +375,6 @@ SPK_NOTE_C8:
.DW $1B80, $11 ; A8
.DW $1D22, $10 ; A
.DW $1EDE, $F ; B8
SPK_NOTCNT .EQU ($-SPK_TUNTBL) / 4
;
SP_NOTCNT .EQU ($-SP_TUNTBL-1) / 4
;

14
Source/HBIOS/std.asm

@ -89,19 +89,6 @@ FDM360 .EQU 2 ; 5.25" FLOPPY, 360KB, 2 SIDES, 40 TRKS, 9 SECTORS
FDM120 .EQU 3 ; 5.25" FLOPPY, 1.2MB, 2 SIDES, 80 TRKS, 15 SECTORS
FDM111 .EQU 4 ; 8" FLOPPY, 1.11MB, 2 SIDES, 74 TRKS, 15 SECTORS
;
; MEDIA ID VALUES
;
MID_NONE .EQU 0
MID_MDROM .EQU 1
MID_MDRAM .EQU 2
MID_RF .EQU 3
MID_HD .EQU 4
MID_FD720 .EQU 5
MID_FD144 .EQU 6
MID_FD360 .EQU 7
MID_FD120 .EQU 8
MID_FD111 .EQU 9
;
; ZILOG CTC MODE SELECTIONS
;
CTCMODE_NONE .EQU 0 ; NO CTC
@ -141,6 +128,7 @@ FDMODE_DIO3 .EQU 6 ; DISKIO V3
FDMODE_RCSMC .EQU 7 ; RC2014 SMC 9266 @ $40 (SCOTT BAKER)
FDMODE_RCWDC .EQU 8 ; RC2014 WDC 37C65 @ $40 (SCOTT BAKER)
FDMODE_DYNO .EQU 9 ; DYNO WDC 37C65 @ $84
FDMODE_EPFDC .EQU 10 ; RC2014 ETCHED PIXELS FDC
;
; IDE MODE SELECTIONS
;

48
Source/Images/Build.cmd

@ -4,25 +4,43 @@ setlocal
echo.
echo Building Floppy Disk Images...
echo.
call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw.sys
call BuildFD.cmd zsdos ..\zsdos\zsys_wbw.sys
call BuildFD.cmd nzcom ..\zsdos\zsys_wbw.sys
call BuildFD.cmd cpm3 ..\cpm3\cpmldr.sys
call BuildFD.cmd zpm3 ..\cpm3\cpmldr.sys
call BuildFD.cmd ws4
call BuildDisk.cmd cpm22 wbw_fd144 ..\cpm22\cpm_wbw.sys
call BuildDisk.cmd zsdos wbw_fd144 ..\zsdos\zsys_wbw.sys
call BuildDisk.cmd nzcom wbw_fd144 ..\zsdos\zsys_wbw.sys
call BuildDisk.cmd cpm3 wbw_fd144 ..\cpm3\cpmldr.sys
call BuildDisk.cmd zpm3 wbw_fd144 ..\cpm3\cpmldr.sys
call BuildDisk.cmd ws4 wbw_fd144
echo.
echo Building Hard Disk Images...
echo Building Legacy Hard Disk Images...
echo.
call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw.sys
call BuildHD.cmd zsdos ..\zsdos\zsys_wbw.sys
call BuildHD.cmd nzcom ..\zsdos\zsys_wbw.sys
call BuildHD.cmd cpm3 ..\cpm3\cpmldr.sys
call BuildHD.cmd zpm3 ..\cpm3\cpmldr.sys
call BuildHD.cmd ws4
call BuildDisk.cmd cpm22 wbw_hd ..\cpm22\cpm_wbw.sys
call BuildDisk.cmd zsdos wbw_hd ..\zsdos\zsys_wbw.sys
call BuildDisk.cmd nzcom wbw_hd ..\zsdos\zsys_wbw.sys
call BuildDisk.cmd cpm3 wbw_hd ..\cpm3\cpmldr.sys
call BuildDisk.cmd zpm3 wbw_hd ..\cpm3\cpmldr.sys
call BuildDisk.cmd ws4 wbw_hd
if exist ..\BPBIOS\bpbio-ww.rel call BuildHD.cmd bp
if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp wbw_hd
echo.
echo Building Combo Disk Image...
echo Building Combo Disk (legacy format) Image...
copy /b ..\..\Binary\hd_cpm22.img + ..\..\Binary\hd_zsdos.img + ..\..\Binary\hd_nzcom.img + ..\..\Binary\hd_cpm3.img + ..\..\Binary\hd_zpm3.img + ..\..\Binary\hd_ws4.img ..\..\Binary\hd_combo.img
echo.
echo Building New Hard Disk Images...
echo.
call BuildDisk.cmd cpm22 wbw_hdnew ..\cpm22\cpm_wbw.sys
call BuildDisk.cmd zsdos wbw_hdnew ..\zsdos\zsys_wbw.sys
call BuildDisk.cmd nzcom wbw_hdnew ..\zsdos\zsys_wbw.sys
call BuildDisk.cmd cpm3 wbw_hdnew ..\cpm3\cpmldr.sys
call BuildDisk.cmd zpm3 wbw_hdnew ..\cpm3\cpmldr.sys
call BuildDisk.cmd ws4 wbw_hdnew
if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp wbw_hdnew
copy hdnew_prefix.bin ..\..\Binary\
echo.
echo Building Combo Disk (new format) Image...
copy /b hdnew_prefix.bin + ..\..\Binary\hdnew_cpm22.img + ..\..\Binary\hdnew_zsdos.img + ..\..\Binary\hdnew_nzcom.img + ..\..\Binary\hdnew_cpm3.img + ..\..\Binary\hdnew_zpm3.img + ..\..\Binary\hdnew_ws4.img ..\..\Binary\hdnew_combo.img

1
Source/Images/BuildDisk.cmd

@ -0,0 +1 @@
@PowerShell -ExecutionPolicy Unrestricted .\BuildDisk.ps1 %*

95
Source/Images/BuildDisk.ps1

@ -0,0 +1,95 @@
Param($Disk, $Format="", $SysFile="")
$ErrorAction = 'Stop'
$CpmToolsPath = '../../Tools/cpmtools'
$env:PATH = $CpmToolsPath + ';' + $env:PATH
if ($Format.Length -eq 0)
{
Write-Error "No disk format specified!" -ErrorAction Stop
return
}
switch ($Format)
{
"wbw_fd144"
{
# 1.44MB Floppy Disk
$Desc = "1.44MB Floppy Disk"
$ImgFile = "fd144_${Disk}.img"
$MediaID = 6
$Size = 1440KB
}
"wbw_hd"
{
# Legacy Hard Disk Format
$Desc = "Hard Disk (legacy format)"
$ImgFile = "hd_${Disk}.img"
$MediaID = 4
$Size = 8MB + 128KB
}
"wbw_hdnew"
{
# New Hard Disk Format
$Desc = "Hard Disk (new format)"
$ImgFile = "hdnew_${Disk}.img"
$MediaID = 10
$Size = 8MB
}
}
if (-not (Test-Path("d_${Disk}/")))
{
Write-Error "Source directory d_${Disk} for disk ${Disk} not found!" -ErrorAction Stop
return
}
"Generating $Desc $Disk..."
if ($SysFile.Length -gt 0)
{ [byte[]]$SysImg = [System.IO.File]::ReadAllBytes($SysFile) }
else
{ [byte[]]$SysImg = @() }
$Image = ($SysImg + ([byte[]](0xE5) * ($Size - $SysImg.length)))
# $Image[1410] = 0x4D
# $Image[1411] = 0x49
# $Image[1412] = 0x44
# $Image[1413] = $MediaID
[System.IO.File]::WriteAllBytes($ImgFile, $Image)
for ($Usr=0; $Usr -lt 16; $Usr++)
{
if (Test-Path ("d_${Disk}/u${Usr}/*"))
{
$Cmd = "cpmcp -f $Format $ImgFile d_${Disk}/u${Usr}/*.* ${Usr}:"
$Cmd
Invoke-Expression $Cmd
}
}
if (Test-Path("d_${Disk}.txt"))
{
foreach($Line in Get-Content "d_${Disk}.txt")
{
$Spec = $Line.Trim()
if (($Spec.Length -gt 0) -and ($Spec.Substring(0,1) -ne "#"))
{
$Cmd = "cpmcp -f $Format $ImgFile ${Spec}"
$Cmd
Invoke-Expression $Cmd
}
}
}
"Moving image $ImgFile into output directory..."
Move-Item $ImgFile -Destination "..\..\Binary\" -Force
return

1
Source/Images/BuildFD.cmd

@ -1 +0,0 @@
@PowerShell -ExecutionPolicy Unrestricted .\BuildFD.ps1 %*

69
Source/Images/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
Source/Images/BuildHD.cmd

@ -1 +0,0 @@
@PowerShell -ExecutionPolicy Unrestricted .\BuildHD.ps1 %*

69
Source/Images/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

BIN
Source/Images/Common/FDISK80.COM

Binary file not shown.

0
Source/Images/d_bp/u0/MBASIC.COM → Source/Images/Common/MBASIC.COM

77
Source/Images/Makefile

@ -1,16 +1,27 @@
#
# this makefile subsumes all the work done in Build.cmd, Build{Hd,Fd}.*
# this makefile subsumes all the work done in Build.cmd, BuildDisk.cmd, BuildDisk.ps1
#
SYSTEMS = ../CPM22/cpm_wbw.sys ../ZSDOS/zsys_wbw.sys ../CPM3/cpmldr.sys
FDIMGS = fd_cpm22.img fd_zsdos.img fd_nzcom.img \
fd_cpm3.img fd_zpm3.img fd_ws4.img
FDIMGS = fd144_cpm22.img fd144_zsdos.img fd144_nzcom.img \
fd144_cpm3.img fd144_zpm3.img fd144_ws4.img
HDIMGS = hd_cpm22.img hd_zsdos.img hd_nzcom.img \
hd_cpm3.img hd_zpm3.img hd_ws4.img
# HDIMGS += hd_bp.img
HDNEWIMGS = hdnew_cpm22.img hdnew_zsdos.img hdnew_nzcom.img \
hdnew_cpm3.img hdnew_zpm3.img hdnew_ws4.img
# HDNEWIMGS += hdnew_bp.img
OBJECTS = $(FDIMGS) $(HDIMGS) hd_combo.img
OTHERS = blank144 blankhd
HDPREFIX =
HDNEWPREFIX = hdnew_prefix.bin
OBJECTS = $(FDIMGS)
OBJECTS += $(HDIMGS) hd_combo.img $(HDPREFIX)
OBJECTS += $(HDNEWIMGS) hdnew_combo.img $(HDNEWPREFIX)
OTHERS = blank144 blankhd blankhdnew
NODELETE = $(HDPREFIX) $(HDNEWPREFIX)
DEST=../../Binary
@ -19,8 +30,11 @@ include $(TOOLS)/Makefile.inc
DIFFPATH = $(DIFFTO)/Binary
hd_combo.img: $(HDIMGS)
cat $(HDIMGS) > $@
hd_combo.img: $(HDPREFIX) $(HDIMGS)
cat $^ > $@
hdnew_combo.img: $(HDNEWPREFIX) $(HDNEWIMGS)
cat $^ > $@
#
# this somewhat impenetrable and fragile code is used to build each of the images
@ -30,27 +44,39 @@ hd_combo.img: $(HDIMGS)
# then process the d_{d}.txt file, copying in those files, and finally maybe put
# an OS at the start of each image
#
FDSIZE := 1440
blank144:
@echo Making Blank Floppy of size 1440k
@LANG=en_US.US-ASCII tr '\000' '\345' </dev/zero | dd of=$@ bs=1024 count=1440 2>/dev/null
@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 := $(shell expr 128 '*' 65)
HDSIZE := 8320
HDNEWSIZE := 8192
blankhd:
@echo Making Blank Hd of size $(HDSIZE)k
@LANG=en_US.US-ASCII tr '\000' '\345' </dev/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 \

BIN
Source/Images/d_cpm22/u0/MBASIC.COM

Binary file not shown.

BIN
Source/Images/d_cpm22/u0/SUBMIT.COM

Binary file not shown.

BIN
Source/Images/d_nzcom/u0/SUBMIT.COM

Binary file not shown.

BIN
Source/Images/d_zpm3/u15/mbasic.com

Binary file not shown.

BIN
Source/Images/d_zsdos/u0/MBASIC.COM

Binary file not shown.

150
Source/Images/diskdefs

@ -297,121 +297,169 @@ diskdef wbw_rom1024
os 2.2
end
# UNA 512KB ROM (128KB reserved, 384KB ROM Disk)
# RomWBW 720K floppy media
diskdef wbw_fd720
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
diskdef una_rom512
# RomWBW 1.44M floppy media
diskdef wbw_fd144
seclen 512
tracks 12
sectrk 64
tracks 160
sectrk 18
blocksize 2048
maxdir 256
skew 0
boottrk 0
boottrk 2
os 2.2
end
# UNA 512KB ROM (128KB reserved, 896KB ROM Disk)
# RomWBW 360K floppy media
diskdef wbw_fd360
seclen 512
tracks 80
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
diskdef una_rom1024
# RomWBW 1.20M floppy media
diskdef wbw_fd120
seclen 512
tracks 28
sectrk 64
tracks 160
sectrk 15
blocksize 2048
maxdir 256
skew 0
boottrk 0
boottrk 2
os 2.2
end
# RomWBW 8MB Hard Disk, LU 0-3
# RomWBW 8320KB Hard Disk Slice
# Legacy format, 512 dir entries, 16,630 sectors / slice
diskdef wbw_hd
seclen 512
tracks 1040
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 16
os 2.2
end
# First 4 slices of wbw_hd
diskdef wbw_hd0
seclen 512
tracks 65
sectrk 256
tracks 1040
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 1
boottrk 16
os 2.2
end
diskdef wbw_hd1
seclen 512
tracks 130
sectrk 256
tracks 2080
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 66
boottrk 1056
os 2.2
end
diskdef wbw_hd2
seclen 512
tracks 195
sectrk 256
tracks 3120
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 131
boottrk 2096
os 2.2
end
diskdef wbw_hd3
seclen 512
tracks 260
sectrk 256
tracks 4160
sectrk 16
blocksize 4096
maxdir 512
skew 0
boottrk 196
boottrk 3136
os 2.2
end
# RomWBW 720K floppy media
diskdef wbw_fd720
# RomWBW 8MB Hard Disk
# New format, 1024 dir entries, 16,384 sectors / slice
# Pure filesystem image, no prefix
diskdef wbw_hdnew
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 128
tracks 1024
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 4
boottrk 2
os 2.2
end
# RomWBW 1.44M floppy media
diskdef wbw_fd144
# First 4 slices of wbw_hdnew
# Assumes 128KB prefix (256 sectors)
diskdef wbw_hdnew0
seclen 512
tracks 160
sectrk 18
blocksize 2048
maxdir 256
tracks 1040
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 2
boottrk 18
os 2.2
end
# RomWBW 360K floppy media
diskdef wbw_fd360
diskdef wbw_hdnew1
seclen 512
tracks 80
sectrk 9
blocksize 2048
maxdir 128
tracks 2064
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 4
boottrk 1042
os 2.2
end
# RomWBW 1.20M floppy media
diskdef wbw_fd120
diskdef wbw_hdnew2
seclen 512
tracks 160
sectrk 15
blocksize 2048
maxdir 256
tracks 3112
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 2
boottrk 2066
os 2.2
end
diskdef wbw_hdnew3
seclen 512
tracks 4136
sectrk 16
blocksize 4096
maxdir 1024
skew 0
boottrk 3114
os 2.2
end

BIN
Source/Images/hdnew_prefix.bin

Binary file not shown.

2
Source/Makefile

@ -9,7 +9,7 @@ SUBDIRS += Fonts
SUBDIRS += CPM22 ZCPR ZCPR-DJ ZSDOS
SUBDIRS += HBIOS CPM3
SUBDIRS += ZPM3
SUBDIRS += BPBIOS
#SUBDIRS += BPBIOS
SUBDIRS += Images
TOOLS = ../Tools
include $(TOOLS)/Makefile.inc

9
Source/Prop/Spin/ParPortProp.spin

@ -3,8 +3,8 @@
************************************
* ParPortProp for RomWBW *
* Interface to RBC ParPortProp *
* Version 0.96 *
* March 11, 2018 *
* Version 0.97 *
* May 9, 2020 *
************************************
Wayne Warthen
@ -29,11 +29,12 @@
Updates:
2018-03-11 WBW: Implement character attributes
2020-05-09 WBW: Switch monitor refresh to 60Hz
}}
CON
VERSION = (((0 << 8) + 96) << 16) + 0
VERSION = (((0 << 8) + 97) << 16) + 0
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
@ -608,7 +609,7 @@ PRI Activity
DAT
strVer byte "F/W v0.96",0
strVer byte "F/W v0.97",0
strHW byte "ParPortProp",0
strROM byte "RomWBW",0

9
Source/Prop/Spin/PropIO.spin

@ -3,8 +3,8 @@
*******************************
* PropIO for RomWBW *
* Interface to RBC PropIO *
* Version 0.96 *
* March 11, 2018 *
* Version 0.97 *
* May 9, 2020 *
*******************************
Wayne Warthen
@ -34,11 +34,12 @@
2014-02-09 WBW: Clean up
2015-11-15 WBW: Added SD card capacity reporting
2018-03-11 WBW: Implement character attributes
2020-05-09 WBW: Switch monitor refresh to 60Hz
}}
CON
VERSION = (((0 << 8) + 96) << 16) + 0
VERSION = (((0 << 8) + 97) << 16) + 0
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
@ -337,7 +338,7 @@ PRI DumpBuffer(Buffer) | i, j
DAT
strVer byte "F/W v0.96",0
strVer byte "F/W v0.97",0
strHW byte "PropIO",0
strROM byte "RomWBW",0

9
Source/Prop/Spin/PropIO2.spin

@ -3,8 +3,8 @@
*********************************
* PropIO 2 for RomWBW *
* Interface to RBC PropIO 2 *
* Version 0.96 *
* March 11, 2018 *
* Version 0.97 *
* May 9, 2020 *
*********************************
Wayne Warthen
@ -34,11 +34,12 @@
2014-02-08 WBW: Adaptation for PropIO 2
2015-11-15 WBW: Added SD card capacity reporting
2018-03-11 WBW: Implement character attributes
2020-05-09 WBW: Switch monitor refresh to 60Hz
}}
CON
VERSION = (((0 << 8) + 96) << 16) + 0
VERSION = (((0 << 8) + 97) << 16) + 0
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
@ -337,7 +338,7 @@ PRI DumpBuffer(Buffer) | i, j
DAT
strVer byte "F/W v0.96",0
strVer byte "F/W v0.97",0
strHW byte "PropIO v2",0
strROM byte "RomWBW",0

19
Source/Prop/Spin/vgacolour.spin

@ -20,6 +20,7 @@
CON
{
' 640 x 480 @ 69Hz settings: 80 x 30 characters
hp = 640 ' horizontal pixels
@ -33,6 +34,24 @@ CON
hn = 1 ' horizontal normal sync state (0|1)
vn = 1 ' vertical normal sync state (0|1)
pr = 30 ' pixel rate in MHz at 80MHz system clock (5MHz granularity)
}
'{
' 640 x 480 @ 60Hz settings: 80 x 40 characters
hp = 640 'horizontal pixels
vp = 480 'vertical pixels
hf = 16 'horizontal front porch pixels
hs = 96 'horizontal sync pixels
hb = 48 'horizontal back porch pixels
vf = 10 'vertical front porch lines
vs = 2 'vertical sync lines
vb = 33 'vertical back porch lines
hn = 1 'horizontal normal sync state (0|1)
vn = 1 'vertical normal sync state (0|1)
pr = 25 'pixel rate in MHz at 80MHz system clock (5MHz granularity)
'}
' columns and rows

BIN
Source/RomDsk/ROM_1024KB/FDISK80.COM

Binary file not shown.

BIN
Source/RomDsk/ROM_512KB/FDISK80.COM

Binary file not shown.

34
Source/UBIOS/ubios.inc

@ -11,27 +11,17 @@ BF_CIOOST .EQU BF_CIO + 4 ; CHARACTER OUTPUT STATUS
BF_DIO .EQU $40
BF_DIOREAD .EQU BF_DIO + 2 ; DISK READ
BF_DIOWRITE .EQU BF_DIO + 3 ; DISK WRITE
;;
;; MEMORY BANK CONFIGURATION
;;
;ROMSIZE .EQU 512
;RAMSIZE .EQU 512
;
;BID_ROM0 .EQU $0000
;BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
;BID_RAM0 .EQU $8000
;BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
; MEDIA ID VALUES
;
;BID_BOOT .EQU BID_ROM0 ; BOOT BANK
;BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
;BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
;BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
;BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
;BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK
;
;BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK
;BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK
;BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.)
;BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK
;BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.)
;BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K
MID_NONE .EQU 0
MID_MDROM .EQU 1
MID_MDRAM .EQU 2
MID_RF .EQU 3
MID_HD .EQU 4
MID_FD720 .EQU 5
MID_FD144 .EQU 6
MID_FD360 .EQU 7
MID_FD120 .EQU 8
MID_FD111 .EQU 9
MID_HDNEW .EQU 10

4
Source/ver.inc

@ -1,5 +1,5 @@
#DEFINE RMJ 3
#DEFINE RMN 1
#DEFINE RUP 0
#DEFINE RUP 1
#DEFINE RTP 0
#DEFINE BIOSVER "3.1-pre.12"
#DEFINE BIOSVER "3.1.1-pre.7"

4
Source/ver.lib

@ -1,7 +1,7 @@
rmj equ 3
rmn equ 1
rup equ 0
rup equ 1
rtp equ 0
biosver macro
db "3.1-pre.12"
db "3.1.1-pre.7"
endm

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save