From 49359cc221e608f7216a0cec75dfdccc9d246ed7 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 11 May 2020 11:10:31 +1000 Subject: [PATCH 1/4] ay38910: Updated boot beep to use a timer, if active for termination of boot beep sound --- Source/HBIOS/audio.inc | 2 +- Source/HBIOS/ay38910.asm | 45 ++++++++++++++++++++++++++++++++++---- Source/HBIOS/cfg_state.inc | 30 +++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 Source/HBIOS/cfg_state.inc diff --git a/Source/HBIOS/audio.inc b/Source/HBIOS/audio.inc index a3ca68da..b6365494 100644 --- a/Source/HBIOS/audio.inc +++ b/Source/HBIOS/audio.inc @@ -72,4 +72,4 @@ AUD_NOTE2: LD H, $FF ; OTHERWISE RETURN -1 PERIOD (ERROR) LD L, $FF RET -#ENDIF \ No newline at end of file +#ENDIF diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 01dc90a5..38744a31 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -4,6 +4,10 @@ ; ;====================================================================== ; + +#include "cfg_state.inc" + + AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE ; #IF (AYMODE == AYMODE_SCG) @@ -123,13 +127,46 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE 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 + +#IF SYSTIMEN + LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND + LD (AY_TIMTIK), A + + LD HL, (VEC_TICK + 1) ; GET CUR SECONDS VECTOR + LD (AY_TIMHOOK), HL ; SAVE IT INTERNALLY + LD HL, AY_TIMER ; INSTALL TIMER HOOK HANDLER + LD (VEC_TICK + 1), HL + +#ELSE + CALL LDELAY ; HALF SECOND DELAY + LD E,$00 ; SET VOLUME OFF + CALL AY_SETV ; ON ALL CHANNELS + +#ENDIF ; XOR A ; SUCCESSFULL INIT RET + +#IF SYSTIMEN +AY_TIMER: + LD A, (AY_TIMTIK) + DEC A + LD (AY_TIMTIK), A + JR NZ, AY_TIMER1 + + LD HL, (AY_TIMHOOK) ; REMOVE US FROM THE TIMER HOOKS LIST + LD (VEC_TICK + 1), HL + + LD E,$00 ; SET VOLUME OFF + CALL AY_SETV ; ON ALL CHANNELS + +AY_TIMER1: + JP 0 ; OVERWRITTEN WITH NEXT HANDLER +AY_TIMHOOK: .EQU $ - 2 + +AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP + +#ENDIF ; ;====================================================================== ; INITIALIZE DEVICE diff --git a/Source/HBIOS/cfg_state.inc b/Source/HBIOS/cfg_state.inc new file mode 100644 index 00000000..754f434b --- /dev/null +++ b/Source/HBIOS/cfg_state.inc @@ -0,0 +1,30 @@ + +#IFNDEF CFG_STATE +#DEFINE CFG_STATE + +SYSTIMEN .EQU FALSE + +#IF (CTCENABLE & INTMODE == 2 & CTCTIMER) +SYSTIMEN .SET TRUE +#ENDIF + +#IF (TMSENABLE & INTMODE == 1 & TMSTIMENABLE) +SYSTIMEN .SET TRUE +#ENDIF + +#IF (INTMODE == 1 & PLATFORM == PLT_SBC & HTIMENABLE) +SYSTIMEN .SET TRUE +#ENDIF + +#IF (INTMODE == 2 & CPUFAM == CPU_Z180) +SYSTIMEN .SET TRUE +#ENDIF + + .ECHO "TIMER INTERRUPT " +#IF SYSTIMEN + .ECHO "ACTIVE\n" +#ELSE + .ECHO "NOT ACTIVE\n" +#ENDIF + +#ENDIF From 05e2c5c52c705800ad053488ae0d951e18f27c70 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 11 May 2020 14:17:13 +1000 Subject: [PATCH 2/4] tune.com: Added optional switch shift ocatves --- Source/Apps/Tune/Tune.asm | 115 +++++++++++++++++++------------------ Source/Apps/Tune/cli.inc | 54 ++++++++++++++++- Source/Doc/Applications.md | 20 ++++++- 3 files changed, 128 insertions(+), 61 deletions(-) diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 79bb1aac..a6e4bfb4 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -95,6 +95,7 @@ Id .EQU 1 ; 5) Insert official identificator CALL CLI_ABRT_IF_OPT_FIRST CALL CLI_HAVE_HBIOS_SWITCH + CALL CLI_OCTAVE_ADJST JP CONTINUE CONTINUE: @@ -581,14 +582,14 @@ FILTYP .DB 0 ; Sound file type (TYPPT2, TYPPT3, TYPMYM) ; TMP .DB 0 ; work around use of undocumented Z80 -HBIOSOPT: .DB "--HBIOS", 0 HBIOSMD .DB 0 ; NON-ZERO IF USING HBIOS SOUND DRIVER, ZERO OTHERWISE +OCTAVEADJ .DB 0 ; AMOUNT TO ADJUST OCTAVE UP OR DOWN MSGBAN .DB "Tune Player for RomWBW v3.1, 25-Apr-2020",0 MSGUSE .DB "Copyright (C) 2020, Wayne Warthen, GNU GPL v3",13,10 .DB "PTxPlayer Copyright (C) 2004-2007 S.V.Bulba",13,10 .DB "MYMPlay by Marq/Lieves!Tuore",13,10,13,10 - .DB "Usage: TUNE .[PT2|PT3|MYM] [--hbios]",0 + .DB "Usage: TUNE .[PT2|PT3|MYM] [--hbios] [+tn|-tn]",0 MSGBIO .DB "Incompatible BIOS or version, " .DB "HBIOS v", '0' + RMJ, ".", '0' + RMN, " required",0 MSGPLT .DB "Hardware error, system not supported!",0 @@ -2003,74 +2004,74 @@ LOUT2 CALL NORMIO RET ; AND DONE PLAYVIAHBIOS: -; -; CHANNEL 0 (LEFT) -; - LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME - LD A, (AYREGS + AmplA) ; DEVICE 0 - ADD A,A ; GET 4-BIT +; CHANNEL 0 + LD HL, AYREGS + AmplA + LD DE, AYREGS + TonA + LD B, 0 + CALL PLAYNOTE +; +; CHANNEL 1 + LD HL, AYREGS + AmplB + LD DE, AYREGS + TonB + LD B, 1 + CALL PLAYNOTE + +; CHANNEL 2 + LD HL, AYREGS + AmplC + LD DE, AYREGS + TonC + LD B, 2 + JP PLAYNOTE + +PLAYNOTE: + PUSH BC ; CHANNEL IN B + PUSH DE ; PERIOD ADDR IN DE + + LD A, (HL) + ADD A,A ; GET 4-BIT ADD A,A ; VOLUME 0-15 ADD A,A ; AND CONVERT - ADD A,A ; TO HBIOS + ADD A,A ; TO HBIOS LD L, A ; RANGE 0-255 + LD BC, (BF_SNDVOL*256)+0 ; SET VOLUME RST 08 ; - LD BC, (BF_SNDPRD*256)+0 ; SET PERIOD - LD HL, (AYREGS+TonA) ; DEVICE 0 + POP HL ; RESTORE PERIOD ADDR + LD A, (HL) ; DEVICE 0 + INC HL + LD H, (HL) + LD L, A 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, 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 H, A ; NIBBLE + + LD A, (OCTAVEADJ) + OR A + JR Z, PLAYNOTE3 ; NO OCTAVE ADJUSTMENT + BIT 7, A + JR Z, PLAYNOTE2 ; OCTAVE DOWN ADJUSTMENT + +PLAYNOTE1: + ADD HL, HL ; MULTIPLE BY 2 FOR EACH OCTAVE + INC A + JR NZ, PLAYNOTE1 + JR PLAYNOTE3 + +PLAYNOTE2: + SRL H ; DIVIDE BY 2 FOR EACH OCTAVE + RR L + DEC A + JR NZ, PLAYNOTE2 + +PLAYNOTE3 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 ; + POP DE ; RESTORE CHANNEL IN D (FROM B) 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 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 #IF ACBBAC diff --git a/Source/Apps/Tune/cli.inc b/Source/Apps/Tune/cli.inc index 9f8b2551..fc901068 100644 --- a/Source/Apps/Tune/cli.inc +++ b/Source/Apps/Tune/cli.inc @@ -1,5 +1,4 @@ - CLI_ABRT_IF_OPT_FIRST: LD A, (FCB+1) CP '-' ; OPTION FIRST OR - MISSING FILENAME? @@ -11,7 +10,7 @@ CLI_HAVE_HBIOS_SWITCH: LD DE, HBIOSOPT CALL STRINDEX JR NZ, CLI_HAVE_HBIOS_SWITCH1 - OR $FF ; MATCHED --HBIOS + OR $FF ; MATCHED --HBIOS LD (HBIOSMD), A LD BC,(BF_SYSGET*256)+BF_SND RST 08 ; CHECK WE HAVE @@ -35,4 +34,53 @@ CLI_ABRT_UNSUPPFILTYP: CLI_ABRT_UNSUPPFILTYP1: POP AF - RET \ No newline at end of file + RET + +CLI_OCTAVE_ADJST: ; SEARCH FOR OCTAVE ADJUSTMENT SWITCH (-n or +n) + LD HL, CLIARGS ; TEST FOR --HBIOS ON COMMAND LINE + LD DE, DOWN1 + CALL STRINDEX + JR NZ, CLI_OCTAVE_ADJST1 + + LD A, -1 + JR CLI_OCTAVE_ADJST5 + +CLI_OCTAVE_ADJST1: + LD HL, CLIARGS ; TEST FOR --HBIOS ON COMMAND LINE + LD DE, DOWN2 + CALL STRINDEX + JR NZ, CLI_OCTAVE_ADJST2 + + LD A, -2 + JR CLI_OCTAVE_ADJST5 + +CLI_OCTAVE_ADJST2: + LD HL, CLIARGS ; TEST FOR --HBIOS ON COMMAND LINE + LD DE, UP1 + CALL STRINDEX + JR NZ, CLI_OCTAVE_ADJST3 + + LD A, 1 + JR CLI_OCTAVE_ADJST5 + +CLI_OCTAVE_ADJST3: + LD HL, CLIARGS ; TEST FOR --HBIOS ON COMMAND LINE + LD DE, UP2 + CALL STRINDEX + JR NZ, CLI_OCTAVE_ADJST4 + + LD A, 2 + JR CLI_OCTAVE_ADJST5 + +CLI_OCTAVE_ADJST4: + LD A, 0 + +CLI_OCTAVE_ADJST5: + LD (OCTAVEADJ), A + RET + +HBIOSOPT: .DB "--HBIOS", 0 +DOWN1 .DB "-t1", 0 ; DOWN AN OCTAVE +DOWN2 .DB "-t2", 0 ; DOWN TWO OCTAVE +UP1 .DB "+t1", 0 ; UP AN OCTAVE +UP2 .DB "+t2", 0 ; UP TWO OCTAVE diff --git a/Source/Doc/Applications.md b/Source/Doc/Applications.md index 4a145533..236b02e2 100644 --- a/Source/Doc/Applications.md +++ b/Source/Doc/Applications.md @@ -949,6 +949,24 @@ accurately pace the sound file output. If no system timer is available, a delay loop is calculated instead. The delay loop will not be as accurate as the system timer. +There are two modes of operations. A direct hardware interface for the +AY-3-8910 or YM2149 chips, or a compatibility layer thru HBIOS supporting +the SN76489 chip. + +By default the application will attempt to interface directly to the sound +chip. The optional argument `--hbios` supplied after the filename, will +enable the application to use the HBIOS sound driver. + +The HBIOS mode also support other switch as desribed below. + +| Switch | Description | +| ----------- | ------------------------------------------------------ | +| `--hbios` | Utilise HBIOS' sound driver | +| `+t1` | Play tune an octave higher | +| `+t2` | Play tune two octaves higher | +| `-t1` | Play tune an octave lower | +| `-t2` | Play tune two octaves lower | + All RomWBW operating system boot disks include a selection of sound files in user area 3. @@ -960,4 +978,4 @@ software was adapted and embedded from pre-existing sources. The YM player code is from MYMPLAY 0.4 by Lieves!Tuore and the PT player code is (c)2004-2007 S.V.Bulba . -The source code is provided in the RomWBW distribution. \ No newline at end of file +The source code is provided in the RomWBW distribution. From 8f6e33bd79b83011b575859095af37d1219171c3 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 11 May 2020 14:57:03 +1000 Subject: [PATCH 3/4] sounddriver: updated documentation - musical note scale --- Source/Doc/Architecture.md | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index ffc3120e..bad37ccd 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1392,20 +1392,38 @@ supplied is beyond driver capabilities, register A will be set to $FF. | _Entry Parameters_ | B: 0x53 | C: Audio Device Unit ID -| L: Note (0 to 255 quarter notes) +| HL: Value of note to play | _Returned Values_ | A: Status (0=OK, else error) -This function sets the sound chip period parameter according to -standardized notes. - -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 SN76489 chip, 0 corresponds to note A1# and the value 249 is -the maximum supported value, and it corresponds to note C7. +This function sets the sound chip period parameter with steps of quarter +of a semitone. The value of 0 (lowest) corresponds to B♭/A♯ in octave 0. + +Increase by steps of 4 to select the next corresponding note. + +Increase by steps of 48 to select the same note in next octave. + +If the driver is able to generate the requested note, a success (0) is +returned, otherwise a non-zero error state will be returned. + +The following table shows the mapping of the input value in HL +to the corresponding octave and note. + +| Note | Octave 0 | Octave 1 | Octave 2 | Octave 3 | Octave 4 | Octave 5 | Octave 6 | +|-------|----------|----------|----------|----------|----------|----------|----------| +| B♭/A♯ | 0 | 48 | 96 | 144 | 192 | 240 | 288 | +| B | 4 | 52 | 100 | 148 | 196 | 244 | 292 | +| C | 8 | 56 | 104 | 152 | 200 | 248 | 296 | +| C♯/D♭ | 12 | 60 | 108 | 156 | 204 | 252 | 300 | +| D | 16 | 64 | 112 | 160 | 208 | 256 | 304 | +| E♭/D♯ | 20 | 68 | 116 | 164 | 212 | 260 | 308 | +| E | 24 | 72 | 120 | 168 | 216 | 264 | 312 | +| F | 28 | 76 | 124 | 172 | 220 | 268 | 316 | +| F♯/G♭ | 32 | 80 | 128 | 176 | 224 | 272 | 320 | +| G | 36 | 84 | 132 | 180 | 228 | 276 | 324 | +| A♭/G♯ | 40 | 88 | 136 | 184 | 232 | 280 | 328 | +| A | 44 | 92 | 140 | 188 | 236 | 284 | 332 | ### Function 0x54 -- Sound Play (SNDPLAY) From 84d206ced44cfdbd1c61fe8ed51e13e2f50129c2 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 12 May 2020 13:32:06 -0700 Subject: [PATCH 4/4] Misc. Cleanup - Regenerate documentation - Improve CP/M 3 drive assignment handling - Fixed SYSCOPY issue with new partition handling --- Doc/RomWBW Applications.pdf | Bin 140215 -> 141708 bytes Doc/RomWBW Architecture.pdf | Bin 407538 -> 410127 bytes Doc/RomWBW Disk Catalog.pdf | Bin 130980 -> 130980 bytes Doc/RomWBW Getting Started.pdf | Bin 166356 -> 166356 bytes Source/Apps/Assign.asm | 11 ++++++----- Source/CBIOS/cbios.asm | 8 ++++++++ Source/CPM3/diskio.z80 | 35 +++++++++++++++++---------------- Source/CPM3/genbnk.dat | 4 ++-- Source/CPM3/loader.asm | 5 ++++- Source/Doc/Architecture.md | 12 +++++------ Source/ZPM3/loader.asm | 5 ++++- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 13 files changed, 50 insertions(+), 34 deletions(-) diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index dcf863fc2959eed05dfe1f18e4cc5cf0dff97ddf..0837e86f31443cad8b6aa952383b4316896a8204 100644 GIT binary patch delta 18472 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 Djs{8% diff --git a/Doc/RomWBW Architecture.pdf b/Doc/RomWBW Architecture.pdf index 8a116e0a0433e25d98b60868ba8b96e1e590e784..3ca943e0c3b049fc743716efb5cdda8df4ebbc23 100644 GIT binary patch delta 40512 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 delta 38524 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 diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index eb0583edc1a054199fa7a2992ad659f1c6a20590..aa9400af10959e908b55d55b8e6440e12f34f001 100644 GIT binary patch delta 113 zcmZ4TpMA-H_J%EtM_zIm8W|cJniv^RKl74N8qVAP{v~6msI#Gwg{g_Fn}xHvo1v41 hfq{{erJk-4d*xuuA5lbM;T grL(J}vnf!$p{a?HtDB{%qn&~cAtlq>|1-)00QjLGnE(I) diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index 65d149831ae7b7771556d83da402721a21779a10..da962bbd52d12dbba4cb6cb4743eb646c53acefd 100644 GIT binary patch delta 136 zcmcaInd{1Au7(!IEldhA+J;7k#)c+_2D%33>IMetnq2z6`6(`mC8-J;E>=bcMg|6^ zFeTf)W0*8`oh=<5&7B+_4PDIKj4ezoObwh2jm!)UTn!ve42{h#jO`R`2q~Gqy^~26 E06!-oHvj+t delta 136 zcmcaInd{1Au7(!IEldhA+6ESemPUq##<~XP>IMetnq2z6`6(`mC8-J;E>=bcMg|6^ zFeTf)W0*8`ot>Oqoz2|LU0qz998C?(%?yoQj9g93olKmZ9L*dp4D1wa2q~Gqy^~26 E0Bc1eI{*Lx diff --git a/Source/Apps/Assign.asm b/Source/Apps/Assign.asm index c6214c65..c080991b 100644 --- a/Source/Apps/Assign.asm +++ b/Source/Apps/Assign.asm @@ -26,6 +26,7 @@ ; 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 +; 2020-05-12 [WBW] Back out media change flag ;_______________________________________________________________________________ ; ; ToDo: @@ -778,10 +779,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 +; 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 ; ... @@ -1892,7 +1893,7 @@ stack .equ $ ; stack top ; Messages ; indent .db " ",0 -msgban1 .db "ASSIGN v1.3 for RomWBW CP/M, 10-May-2020",0 +msgban1 .db "ASSIGN v1.4 for RomWBW CP/M, 12-May-2020",0 msghb .db " (HBIOS Mode)",0 msgub .db " (UBIOS Mode)",0 msgban2 .db "Copyright 2020, Wayne Warthen, GNU GPL v3",0 diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index acaaa3df..a1036ccd 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -1358,6 +1358,8 @@ DSK_MBR0: ; #IFDEF PLTWBW ; SWITCH TO BIOS BANK TO ACCESS DISK BUFFER + LD (STKSAV),SP ; SAVE CUR STACK + LD SP,XSTACK ; NEW STACK IN HI MEM LD A,(HB_CURBNK) ; GET CUR BANK PUSH AF ; SAVE CUR BANK LD A,(BNKBIOS) ; BIOS BANK @@ -1370,7 +1372,12 @@ DSK_MBR0: LD A,H ; PREV BANK TO A CALL HB_BNKSEL ; SELECT IT POP AF ; ORIGINAL RESULT BACK + LD SP,(STKSAV) ; RESTORE ORIGINAL STACK RET + + .FILL 32,0 +XSTACK .EQU $ + #ENDIF ; DSK_MBR1: @@ -1700,6 +1707,7 @@ CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID SLICE .DB 0 ; CURRENT SLICE SPS .DW 0 ; SECTORS PER SLICE +STKSAV .DW 0 ; TEMP SAVED STACK POINTER ; #IFDEF PLTWBW BNKBIOS .DB 0 ; BIOS BANK ID diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 1856eefa..45df4372 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -191,7 +191,7 @@ dpb$max: 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 2048 - 1 ; dsm: total storage in blocks - 1 = (8mb / 4k bls) - 1 = 2047 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 @@ -211,7 +211,7 @@ dpb$rom: ; 384K ROM Drive 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 8040h ; 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 @@ -226,7 +226,7 @@ dpb$ram: ; 256K RAM Drive 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 8040h ; 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 @@ -236,11 +236,11 @@ dpb$rf: ; 4MB RAM Floppy Drive 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 + dw 2048 - 1 ; dsm: total storage in blocks - 1 = (4mb / 2k bls) - 1 = 2047 + 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 8040h ; 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 @@ -250,7 +250,7 @@ dpb$hd: ; 8MB Hard Disk Drive w/ 512 dir entries 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 2048 - 1 ; 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 @@ -264,8 +264,8 @@ dpb$fd720: ; 3.5" DS/DD Floppy Drive (720K) 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 + dw 351 - 1 ; dsm: total storage in blocks - 1 blk = ((720k - 18k off) / 2k bls) - 1 = 350 + dw 128 - 1 ; 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 @@ -278,8 +278,8 @@ dpb_fd144: ; 3.5" DS/HD Floppy Drive (1.44M) 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 + dw 711 - 1 ; dsm: total storage in blocks - 1 blk = ((1,440k - 18k off) / 2k bls) - 1 = 710 + 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 64 ; cks: directory check vector size = 256 / 4 @@ -292,8 +292,8 @@ dpb_fd360: ; 5.25" DS/DD Floppy Drive (360K) 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 + dw 171 - 1 ; dsm: total storage in blocks - 1 blk = ((360k - 18k off) / 2k bls) - 1 = 170 + dw 128 - 1 ; 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 @@ -306,8 +306,8 @@ dpb_fd120: ; 5.25" DS/HD Floppy Drive (1.2M) 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 + dw 592 - 1 ; dsm: total storage in blocks - 1 blk = ((1,200k - 15k off) / 2k bls) - 1 = 591 + 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 64 ; cks: directory check vector size = 256 / 4 @@ -320,8 +320,8 @@ dpb_fd111: ; 8" DS/DD Floppy Drive (1.11M) 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 + dw 570 - 1 ; dsm: total storage in blocks - 1 blk = ((1,155k - 15k off) / 2k bls) - 1 = 569 + 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 64 ; cks: directory check vector size = 256 / 4 @@ -650,6 +650,7 @@ dsk$rw$retry: jr dsk$rw9 ; do the disk I/O dsk$rw2: + ; LBA I/O push de ; save hiword of LBA push hl ; save loword of LBA diff --git a/Source/CPM3/genbnk.dat b/Source/CPM3/genbnk.dat index 060a2c79..7ece8384 100644 --- a/Source/CPM3/genbnk.dat +++ b/Source/CPM3/genbnk.dat @@ -57,7 +57,7 @@ ALTBNKSM = Y ALTBNKSN = Y ALTBNKSO = Y ALTBNKSP = Y -NDIRRECA = 02 +NDIRRECA = 08 NDIRRECB = 00 NDIRRECC = 00 NDIRRECD = 00 @@ -73,7 +73,7 @@ NDIRRECM = 00 NDIRRECN = 00 NDIRRECO = 00 NDIRRECP = 00 -NDTARECA = 02 +NDTARECA = 10 NDTARECB = 00 NDTARECC = 00 NDTARECD = 00 diff --git a/Source/CPM3/loader.asm b/Source/CPM3/loader.asm index ef80711d..42a8082d 100644 --- a/Source/CPM3/loader.asm +++ b/Source/CPM3/loader.asm @@ -27,9 +27,12 @@ ; #INCLUDE "../ver.inc" ; +; BELOW, SYS_END MUST BE SET TO THE SIZE OF CPMLDR.BIN + SYS_LOC. IF +; THE SIZE OF CPMLDR.BIN CHANGES, SYS_END MUST BE UPDATED!!! +; SYS_ENT .EQU $0100 ; SYSTEM (OS) ENTRY POINT ADDRESS SYS_LOC .EQU $0100 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE -SYS_END .EQU $1480 ; ENDING ADDRESS OF SYSTEM IMAGE +SYS_END .EQU $1580 + SYS_LOC ; ENDING ADDRESS OF SYSTEM IMAGE ; SEC_SIZE .EQU 512 ; DISK SECTOR SIZE BLK_SIZE .EQU 128 ; OS BLOCK/RECORD SIZE diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index bad37ccd..f3e20ea3 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1398,7 +1398,7 @@ supplied is beyond driver capabilities, register A will be set to $FF. | A: Status (0=OK, else error) This function sets the sound chip period parameter with steps of quarter -of a semitone. The value of 0 (lowest) corresponds to B♭/A♯ in octave 0. +of a semitone. The value of 0 (lowest) corresponds to Bb/A# in octave 0. Increase by steps of 4 to select the next corresponding note. @@ -1412,17 +1412,17 @@ to the corresponding octave and note. | Note | Octave 0 | Octave 1 | Octave 2 | Octave 3 | Octave 4 | Octave 5 | Octave 6 | |-------|----------|----------|----------|----------|----------|----------|----------| -| B♭/A♯ | 0 | 48 | 96 | 144 | 192 | 240 | 288 | +| Bb/A# | 0 | 48 | 96 | 144 | 192 | 240 | 288 | | B | 4 | 52 | 100 | 148 | 196 | 244 | 292 | | C | 8 | 56 | 104 | 152 | 200 | 248 | 296 | -| C♯/D♭ | 12 | 60 | 108 | 156 | 204 | 252 | 300 | +| C#/Db | 12 | 60 | 108 | 156 | 204 | 252 | 300 | | D | 16 | 64 | 112 | 160 | 208 | 256 | 304 | -| E♭/D♯ | 20 | 68 | 116 | 164 | 212 | 260 | 308 | +| Eb/D# | 20 | 68 | 116 | 164 | 212 | 260 | 308 | | E | 24 | 72 | 120 | 168 | 216 | 264 | 312 | | F | 28 | 76 | 124 | 172 | 220 | 268 | 316 | -| F♯/G♭ | 32 | 80 | 128 | 176 | 224 | 272 | 320 | +| F#/Gb | 32 | 80 | 128 | 176 | 224 | 272 | 320 | | G | 36 | 84 | 132 | 180 | 228 | 276 | 324 | -| A♭/G♯ | 40 | 88 | 136 | 184 | 232 | 280 | 328 | +| Ab/G# | 40 | 88 | 136 | 184 | 232 | 280 | 328 | | A | 44 | 92 | 140 | 188 | 236 | 284 | 332 | ### Function 0x54 -- Sound Play (SNDPLAY) diff --git a/Source/ZPM3/loader.asm b/Source/ZPM3/loader.asm index ef80711d..42a8082d 100644 --- a/Source/ZPM3/loader.asm +++ b/Source/ZPM3/loader.asm @@ -27,9 +27,12 @@ ; #INCLUDE "../ver.inc" ; +; BELOW, SYS_END MUST BE SET TO THE SIZE OF CPMLDR.BIN + SYS_LOC. IF +; THE SIZE OF CPMLDR.BIN CHANGES, SYS_END MUST BE UPDATED!!! +; SYS_ENT .EQU $0100 ; SYSTEM (OS) ENTRY POINT ADDRESS SYS_LOC .EQU $0100 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE -SYS_END .EQU $1480 ; ENDING ADDRESS OF SYSTEM IMAGE +SYS_END .EQU $1580 + SYS_LOC ; ENDING ADDRESS OF SYSTEM IMAGE ; SEC_SIZE .EQU 512 ; DISK SECTOR SIZE BLK_SIZE .EQU 128 ; OS BLOCK/RECORD SIZE diff --git a/Source/ver.inc b/Source/ver.inc index 86655b37..3cc80df6 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.7" +#DEFINE BIOSVER "3.1.1-pre.8" diff --git a/Source/ver.lib b/Source/ver.lib index ee5204d5..2f03066f 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.7" + db "3.1.1-pre.8" endm