From 49359cc221e608f7216a0cec75dfdccc9d246ed7 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 11 May 2020 11:10:31 +1000 Subject: [PATCH 1/8] 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/8] 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/8] 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/8] 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 From 9aaa929800170af00bd305c2a433579604ade0b2 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 13 May 2020 12:50:33 +1000 Subject: [PATCH 5/8] AY38910: Fix issue with interrupt handling during boot beep --- Source/HBIOS/ay38910.asm | 54 ++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 38744a31..284f7557 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -137,10 +137,15 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD HL, AY_TIMER ; INSTALL TIMER HOOK HANDLER LD (VEC_TICK + 1), HL + LD A, $02 ; NOT READY & IN INTERUPT HANDLER + LD (AY_READY), A + #ELSE CALL LDELAY ; HALF SECOND DELAY LD E,$00 ; SET VOLUME OFF - CALL AY_SETV ; ON ALL CHANNELS + CALL AY_SETV ; ON ALL CHANNELS + LD A, $01 ; READY & NOT IN INTERUPT HANDLER + LD (AY_READY), A #ENDIF ; @@ -159,6 +164,8 @@ AY_TIMER: LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS + LD A, $01 ; READY & NOT IN INTERUPT HANDLER + LD (AY_READY), A AY_TIMER1: JP 0 ; OVERWRITTEN WITH NEXT HANDLER @@ -174,8 +181,16 @@ AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP ; 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 + JP AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE + +AY_CHKREDY: + LD A, (AY_READY) + BIT 0, A + RET NZ + + POP HL ; REMOVE LAST RETURN ADDRESS + OR $FF + RET ; RETURN NZ ; ;====================================================================== ; SET VOLUME ALL CHANNELS @@ -200,7 +215,8 @@ AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS ; AY_RESET: AUDTRACE(AYT_INIT) -; + CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY + PUSH DE PUSH HL CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION @@ -227,6 +243,7 @@ AY_VOLUME: AUDTRACE(AYT_VOL) AUDTRACE_L AUDTRACE_CR + LD A,L ; SAVE VOLUME LD (AY_PENDING_VOLUME), A ; @@ -283,6 +300,8 @@ AY_PLAY: AUDTRACE(AYT_PLAY) AUDTRACE_D AUDTRACE_CR + CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY + ; LD A, (AY_PENDING_PERIOD + 1) ; CHECK THE HIGH BYTE OF THE PERIOD INC A @@ -390,6 +409,21 @@ AY_QUERY_DEV: LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT XOR A RET + +AY_DI: + LD A, (AY_READY) + BIT 1, A + RET NZ + HB_DI + RET + +AY_EI: + LD A, (AY_READY) + BIT 1, A + RET NZ + HB_EI + RET + ; ;====================================================================== ; @@ -399,7 +433,7 @@ AY_QUERY_DEV: ;====================================================================== ; AY_WRTPSG: - HB_DI + CALL AY_DI #IF (SBCV2004) LD A,8 ; SBC-V2-004 CHANGE OUT (112),A ; TO HALF CLOCK SPEED @@ -422,8 +456,7 @@ AY_WRTPSG: LD A,0 ; SBC-V2-004 CHANGE TO OUT (112),A ; NORMAL CLOCK SPEED #ENDIF - HB_EI - RET + JP AY_EI ; ;====================================================================== @@ -431,7 +464,7 @@ AY_WRTPSG: ; READ FROM REGISTER D AND RETURN WITH RESULT IN E ; AY_RDPSG: - HB_DI + CALL AY_DI #IF (SBCV2004) LD A,8 ; SBC-V2-004 CHANGE OUT (112),A ; TO HALF CLOCK SPEED @@ -454,13 +487,14 @@ AY_RDPSG: LD A,0 ; SBC-V2-004 CHANGE TO OUT (112),A ; NORMAL CLOCK SPEED #ENDIF - HB_EI - RET + JP AY_EI ; ;====================================================================== ; AY_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) ; ORDER AY_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) ; SIGNIFICANT +AY_READY .DB 0 ; BIT 0 -> NZ DRIVER IS READY TO RECEIVE PLAY COMMAND + ; BIT 1 -> NZ EXECUTING WITHIN TIMER HANDLER = DO NOT DIS/ENABLE INT ; #IF AUDIOTRACE AYT_INIT .DB "\r\nAY_INIT\r\n$" From 6f00dd56c4fcf611f2dbd88df8dcf3b15a75e930 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 13 May 2020 13:10:01 +1000 Subject: [PATCH 6/8] AY38910: Fix issue with interrupt handling --- Source/HBIOS/ay38910.asm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 284f7557..0e3c7c5d 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -159,14 +159,16 @@ AY_TIMER: 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 LD A, $01 ; READY & NOT IN INTERUPT HANDLER LD (AY_READY), A + LD DE, AY_TIMER ; MAKE AY_TIMER A NO_OP HANDLER + LD HL, AY_TIMER1 + LD BC, 3 + LDIR + AY_TIMER1: JP 0 ; OVERWRITTEN WITH NEXT HANDLER AY_TIMHOOK: .EQU $ - 2 From 2dec8dacc94859aa5c886546ac6ecc5d150b7a98 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 13 May 2020 11:19:13 -0700 Subject: [PATCH 7/8] Improve Build and Doc for CP/M 3 and ZPM3 - Put CP/M 3 and ZPM3 built system files into Binary directory to make them easier to access for manual upgrades. - Improve upgrade documentation. --- Binary/Apps/Makefile | 2 +- Binary/Apps/ReadMe.txt | 9 +++- Binary/CPM3/Clean.cmd | 11 +++++ Binary/CPM3/Makefile | 7 +++ Binary/CPM3/ReadMe.txt | 17 +++++++ Binary/Clean.cmd | 2 + Binary/DiskList.txt | 6 +++ Binary/Makefile | 4 +- Binary/ReadMe.txt | 6 +++ Binary/ZPM3/Clean.cmd | 10 ++++ Binary/ZPM3/Makefile | 7 +++ Binary/ZPM3/ReadMe.txt | 17 +++++++ Doc/RomWBW Applications.pdf | Bin 141708 -> 141708 bytes Doc/RomWBW Architecture.pdf | Bin 410127 -> 410127 bytes Doc/RomWBW Disk Catalog.pdf | Bin 130980 -> 130980 bytes Doc/RomWBW Getting Started.pdf | Bin 166356 -> 169551 bytes ReadMe.md | 78 ++++++++++++++++++++++++++++--- ReadMe.txt | 76 ++++++++++++++++++++++++++++--- Source/CPM3/Build.cmd | 20 ++++++++ Source/CPM3/Makefile | 27 +++++++---- Source/Doc/GettingStarted.md | 81 ++++++++++++++++++++++++++++++--- Source/HBIOS/cfg_state.inc | 8 ++-- Source/ZPM3/Build.cmd | 22 ++++++++- Source/ZPM3/Makefile | 20 ++++---- Source/ver.inc | 2 +- Source/ver.lib | 2 +- Tools/Makefile.inc | 2 +- 27 files changed, 386 insertions(+), 50 deletions(-) create mode 100644 Binary/CPM3/Clean.cmd create mode 100644 Binary/CPM3/Makefile create mode 100644 Binary/CPM3/ReadMe.txt create mode 100644 Binary/ZPM3/Clean.cmd create mode 100644 Binary/ZPM3/Makefile create mode 100644 Binary/ZPM3/ReadMe.txt diff --git a/Binary/Apps/Makefile b/Binary/Apps/Makefile index cfa80100..7e63d751 100644 --- a/Binary/Apps/Makefile +++ b/Binary/Apps/Makefile @@ -7,4 +7,4 @@ all:: mkdir -p Tunes clobber:: - rm -f *.bin *.com *.img *.rom *.pdf *.log *.eeprom *.COM *.BIN Tunes/*.mym Tunes/*.pt? + @rm -f *.bin *.com *.img *.rom *.pdf *.log *.eeprom *.COM *.BIN Tunes/*.mym Tunes/*.pt? diff --git a/Binary/Apps/ReadMe.txt b/Binary/Apps/ReadMe.txt index 6fb4ccf8..1c8781b5 100644 --- a/Binary/Apps/ReadMe.txt +++ b/Binary/Apps/ReadMe.txt @@ -11,4 +11,11 @@ are specific to RomWBW. The source for these applications is found in the Source\Apps directory of the distribution. The Tunes subdirectory contains some sample ProTracker and MYM sound -files that can be played by the TUNE application. \ No newline at end of file +files that can be played by the TUNE application. + +All of these files are already included in the pre-built boot disk +images. They are also included on the ROM disk except for +FAT.COM, TUNE.COM, and the sample tune files in the Tunes directory. + +If you upgrade your ROM to a new version, you should also copy +these files over to any hard disk images you are using. \ No newline at end of file diff --git a/Binary/CPM3/Clean.cmd b/Binary/CPM3/Clean.cmd new file mode 100644 index 00000000..c909fdae --- /dev/null +++ b/Binary/CPM3/Clean.cmd @@ -0,0 +1,11 @@ +@echo off +setlocal + +if exist *.spr del *.spr +if exist *.com del *.com +if exist *.sys del *.sys +if exist *.pat del *.pat +if exist *.dat del *.dat +if exist *.1st del *.1st +if exist *.spr del *.spr +if exist *.pat del *.pat diff --git a/Binary/CPM3/Makefile b/Binary/CPM3/Makefile new file mode 100644 index 00000000..2105f8de --- /dev/null +++ b/Binary/CPM3/Makefile @@ -0,0 +1,7 @@ +TOOLS = ../../Tools +MOREDIFF := $(shell $(TOOLS)/unix/casefn.sh *.spr) + +include $(TOOLS)/Makefile.inc + +clobber:: + @rm -f *.spr diff --git a/Binary/CPM3/ReadMe.txt b/Binary/CPM3/ReadMe.txt new file mode 100644 index 00000000..18f1ecb3 --- /dev/null +++ b/Binary/CPM3/ReadMe.txt @@ -0,0 +1,17 @@ +*********************************************************************** +*** *** +*** R o m W B W *** +*** *** +*** Z80/Z180 System Software *** +*** *** +*********************************************************************** + +This directory contains the CP/M 3 system files for the RomWBW CP/M 3 +adaptation. All of these files are already included on the CP/M 3 +boot disk images. However if you are creating a CP/M 3 boot disk +manually, you should copy all of these files to the boot disk. + +These files should also be copied to any CP/M 3 boot disks on your +system when you upgrade your ROM firmware. Some of these files +*must* match the version of the RomWBW firmware you are using for +proper operation of your system. \ No newline at end of file diff --git a/Binary/Clean.cmd b/Binary/Clean.cmd index ad11adad..28826acb 100644 --- a/Binary/Clean.cmd +++ b/Binary/Clean.cmd @@ -11,3 +11,5 @@ if exist *.log del *.log if exist *.eeprom del *.eeprom setlocal & cd Apps && call Clean || exit /b 1 & endlocal +setlocal & cd CPM3 && call Clean || exit /b 1 & endlocal +setlocal & cd ZPM3 && call Clean || exit /b 1 & endlocal diff --git a/Binary/DiskList.txt b/Binary/DiskList.txt index 8ecedd63..7701d6ed 100644 --- a/Binary/DiskList.txt +++ b/Binary/DiskList.txt @@ -17,6 +17,12 @@ a floppy or hard/CF/SD disk. You can use your modern computer media. The disk media will then be ready to use in your RomWBW System. +WARNING: The hdnew_*.img disk images are part of a new disk +format that is a work in progress. Do not use these disk +images without knowing exactly what you are doing! The +hd_*.img disk images continue to be the images you should +be using under normal circumstances. + A description of the disk images is provided later in this file. For more information on the creatioin of these images including instructions for customizing them or creating your own, refer to diff --git a/Binary/Makefile b/Binary/Makefile index c856d1b8..8e01338f 100644 --- a/Binary/Makefile +++ b/Binary/Makefile @@ -1,8 +1,8 @@ TOOLS = ../Tools MOREDIFF := $(shell $(TOOLS)/unix/casefn.sh *.img *.rom *.com *.eeprom) -SUBDIRS = Apps +SUBDIRS = Apps CPM3 ZPM3 include $(TOOLS)/Makefile.inc clobber:: - rm -f *.bin *.com *.img *.rom *.pdf *.log *.eeprom + @rm -f *.bin *.com *.img *.rom *.pdf *.log *.eeprom diff --git a/Binary/ReadMe.txt b/Binary/ReadMe.txt index 70156630..87cf1a25 100644 --- a/Binary/ReadMe.txt +++ b/Binary/ReadMe.txt @@ -92,6 +92,12 @@ intended to be copied to the start of any type of hard disk media (typically a CF Card or SD Card). The resulting media will be usable on any RomWBW-based system that accepts the corresponding media type. +WARNING: The hdnew_*.img disk images are part of a new disk +format that is a work in progress. Do not use these disk +images without knowing exactly what you are doing! The +hd_*.img disk images continue to be the images you should +be using under normal circumstances. + Documentation of the pre-built disk images is contained in the DiskList.txt file in this directory. diff --git a/Binary/ZPM3/Clean.cmd b/Binary/ZPM3/Clean.cmd new file mode 100644 index 00000000..116507c8 --- /dev/null +++ b/Binary/ZPM3/Clean.cmd @@ -0,0 +1,10 @@ +@echo off +setlocal + +if exist *.spr del *.spr +if exist *.com del *.com +if exist *.sys del *.sys +if exist *.pat del *.pat +if exist *.dat del *.dat +if exist *.zpm del *.zpm +if exist *.spr del *.spr diff --git a/Binary/ZPM3/Makefile b/Binary/ZPM3/Makefile new file mode 100644 index 00000000..2105f8de --- /dev/null +++ b/Binary/ZPM3/Makefile @@ -0,0 +1,7 @@ +TOOLS = ../../Tools +MOREDIFF := $(shell $(TOOLS)/unix/casefn.sh *.spr) + +include $(TOOLS)/Makefile.inc + +clobber:: + @rm -f *.spr diff --git a/Binary/ZPM3/ReadMe.txt b/Binary/ZPM3/ReadMe.txt new file mode 100644 index 00000000..dcdef396 --- /dev/null +++ b/Binary/ZPM3/ReadMe.txt @@ -0,0 +1,17 @@ +*********************************************************************** +*** *** +*** R o m W B W *** +*** *** +*** Z80/Z180 System Software *** +*** *** +*********************************************************************** + +This directory contains the ZPM3 system files for the RomWBW ZPM3 +adaptation. All of these files are already included on the ZPM3 +boot disk images. However if you are creating a CP/M 3 boot disk +manually, you should copy all of these files to the boot disk. + +These files should also be copied to any ZPM3 boot disks on your +system when you upgrade your ROM firmware. Some of these files +*must* match the version of the RomWBW firmware you are using for +proper operation of your system. \ No newline at end of file diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 0837e86f31443cad8b6aa952383b4316896a8204..6ab7d2a46ea87e3cb1c63f7cd17f4691ad60ea51 100644 GIT binary patch delta 133 zcmeCV%+Yh1qhSl<+W%U{hK2?vCdRr3=IRCp>Y7~ozWFIGi6yBD8ZK5w21W)3riM@@ z+pqs;4ApdYGjcJpv@kR>GdDJMb#pW@v~YB`bT%<^HFI`#adR`XQ?MbVWO}|PlPmz& C$|DT` delta 133 zcmeCV%+Yh1qhSl<+W%TchQ@{_h9Y7~ozWFIGi6yBD8ZK5w21W)3riM@@ z+pqs;4ApdYGuGBU6DLK*H)WSR|DcLO5viWh!_QxrViJcfS?IG_NftU%1nSq#P zd&oQ1Ig(t)hK2?vCg!>Z=F=Nhm_&Gt3=B*Sp@Q3`IM}9ICKwvK8oIbR8o4jifJDa#zm>4>mIht7*7}+V<5L6PYU}wiwT#{H+Qc;we#${}2YHVT3rK;-c@5TiH DuunTm delta 206 zcmeBgk?e1g+;BNXz{D)gI3+E~GR-tCInBbW(O diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index aa9400af10959e908b55d55b8e6440e12f34f001..2d688b6312e4335b2890e5f140d622480a1bd1c8 100644 GIT binary patch delta 111 zcmZ4TpMA-H_J%EtM_;lV8yXszm>Nw#^O8{p#@YV|1-)00HZD+TL1t6 delta 111 zcmZ4TpMA-H_J%EtM_;lV85$d!7#UAL^O8{p#@YV|1-)00IAd;mjD0& diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index da962bbd52d12dbba4cb6cb4743eb646c53acefd..426d0b3247170d382b2b84c5f8c16cf4b5359ac3 100644 GIT binary patch delta 30596 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 delta 27550 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 yTuorJ# @@ -1060,12 +1060,76 @@ your choice. This process is described below in the Disk Images section. If you wish to update existing disk media in your system, you need to perform the following steps. -If the disk is bootable, you need to update the system tracks of the -disk. This is done using a SYSCOPY command such as `SYSCOPY -C:=B:ZSYS.SYS`. For a ZSDOS boot disk, use ZSYS.SYS. For a CP/M 2.2 -disk, use CPM.SYS. For a CP/M 3 or ZPM3 disk, use CPMLDR.SYS. CPMLDR.SYS -is not provided on the ROM disk, so you will need to upload it from the -distribution. +If the disk is bootable, you need to update the system image on the disk +using the procedure described below corresponsing to the operating +system on your disk. + + - **CP/M 2.2** + + Boot to CP/M 2.2 from ROM, then use `SYSCOPY` to update the system + image on **all** CP/M 2.2 boot disks/slices. The CP/M 2.2 system + image is called CPM.SYS and is found on the ROM disk. For example: + + `B>SYSCOPY C:=CPM.SYS` + + - **ZSDOS** + + Boot to Z-System from ROM, then use `SYSCOPY` to update the system + image on **all** ZSDOS boot disks/slices. The ZSDOS system image is + called ZSYS.SYS and is found on the ROM disk. For example: + + `B>SYSCOPY C:=ZSYS.SYS` + + - **NZCOM** + + NZCOM runs on top of either CP/M 2.2 or ZSDOS. By default, the + RomWBW disk image for NZCOM uses ZSDOS. Follow the corresponding + procedure above to update the system image on the NZCOM boot + disks/slices. + + - **CP/M 3** + + CP/M 3 uses a multi-step boot process involving multiple files. The + CP/M 3 boot files are not included on the ROM disk due to space + constraints. You will need to transfer the files to your system from + the RomWBW distribution directory Binary\\CPM3. + + After this is done, you will need to use `SYSCOPY` to place the CP/M + 3 loader image on the boot tracks of all CP/M 3 boot disks/slices. + The loader image is called `CPMLDR.SYS`. You must then copy (at a + minimum) `CPM3.SYS` and `CCP.COM` onto the disk/slice. Assuming you + copied the CP/M 3 boot files onto your RAM disk at A:, you would + use: + + A>B:SYSCOPY C:=CPMLDR.SYS + A>B:COPY CPM3.SYS C: + A>B:COPY CCP.COM C: + + - **ZPM3** + + ZPM3 uses a multi-step boot process involving multiple files. The + ZPM3 boot files are not included on the ROM disk due to space + constraints. You will need to transfer the files to your system from + the RomWBW distribution directory Binary\\ZPM3. + + After this is done, you will need to use `SYSCOPY` to place the ZPM3 + loader image on the boot tracks of all ZPM3 boot disks/slices. The + loader image is called `CPMLDR.SYS`. You must then copy (at a + minimum) `CPM3.SYS`, `ZCCP.COM`, `ZINSTAL.ZPM`, and `STARTZPM.COM` + onto the disk/slice. Assuming you copied the ZPM3 boot files onto + your RAM disk at A:, you would use: + + A>B:SYSCOPY C:=CPMLDR.SYS + A>B:COPY CPM3.SYS C: + A>B:COPY ZCCP.COM C: + A>B:COPY ZINSTAL.ZPM C: + A>B:COPY STARTZPM.COM C: + + You may be wondering if the references to `CPMLDR.SYS` and + `CPM3.SYS` are typos. They are not. ZPM3 uses the same loader image + as CPM3. The ZPM3 main system code file is called `CPM3.SYS` which + is the same name as CP/M 3 uses, but the file contents are not the + same. Finally, if you have copies of any of the RomWBW custom applications on your hard disk, you need to update them with the latest copies. The diff --git a/ReadMe.txt b/ReadMe.txt index 601e8101..4ce8acd7 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -3,7 +3,7 @@ RomWBW Z80/Z180 System Software Version 3.1 Pre-release -Friday 8 May 2020 +Wednesday 13 May 2020 Wayne Warthen wwarthen@gmail.com @@ -1084,12 +1084,74 @@ your choice. This process is described below in the Disk Images section. If you wish to update existing disk media in your system, you need to perform the following steps. -If the disk is bootable, you need to update the system tracks of the -disk. This is done using a SYSCOPY command such as -SYSCOPY C:=B:ZSYS.SYS. For a ZSDOS boot disk, use ZSYS.SYS. For a CP/M -2.2 disk, use CPM.SYS. For a CP/M 3 or ZPM3 disk, use CPMLDR.SYS. -CPMLDR.SYS is not provided on the ROM disk, so you will need to upload -it from the distribution. +If the disk is bootable, you need to update the system image on the disk +using the procedure described below corresponsing to the operating +system on your disk. + +- CP/M 2.2 + + Boot to CP/M 2.2 from ROM, then use SYSCOPY to update the system + image on all CP/M 2.2 boot disks/slices. The CP/M 2.2 system image + is called CPM.SYS and is found on the ROM disk. For example: + + B>SYSCOPY C:=CPM.SYS + +- ZSDOS + + Boot to Z-System from ROM, then use SYSCOPY to update the system + image on all ZSDOS boot disks/slices. The ZSDOS system image is + called ZSYS.SYS and is found on the ROM disk. For example: + + B>SYSCOPY C:=ZSYS.SYS + +- NZCOM + + NZCOM runs on top of either CP/M 2.2 or ZSDOS. By default, the + RomWBW disk image for NZCOM uses ZSDOS. Follow the corresponding + procedure above to update the system image on the NZCOM boot + disks/slices. + +- CP/M 3 + + CP/M 3 uses a multi-step boot process involving multiple files. The + CP/M 3 boot files are not included on the ROM disk due to space + constraints. You will need to transfer the files to your system from + the RomWBW distribution directory Binary\CPM3. + + After this is done, you will need to use SYSCOPY to place the CP/M 3 + loader image on the boot tracks of all CP/M 3 boot disks/slices. The + loader image is called CPMLDR.SYS. You must then copy (at a minimum) + CPM3.SYS and CCP.COM onto the disk/slice. Assuming you copied the + CP/M 3 boot files onto your RAM disk at A:, you would use: + + A>B:SYSCOPY C:=CPMLDR.SYS + A>B:COPY CPM3.SYS C: + A>B:COPY CCP.COM C: + +- ZPM3 + + ZPM3 uses a multi-step boot process involving multiple files. The + ZPM3 boot files are not included on the ROM disk due to space + constraints. You will need to transfer the files to your system from + the RomWBW distribution directory Binary\ZPM3. + + After this is done, you will need to use SYSCOPY to place the ZPM3 + loader image on the boot tracks of all ZPM3 boot disks/slices. The + loader image is called CPMLDR.SYS. You must then copy (at a minimum) + CPM3.SYS, ZCCP.COM, ZINSTAL.ZPM, and STARTZPM.COM onto the + disk/slice. Assuming you copied the ZPM3 boot files onto your RAM + disk at A:, you would use: + + A>B:SYSCOPY C:=CPMLDR.SYS + A>B:COPY CPM3.SYS C: + A>B:COPY ZCCP.COM C: + A>B:COPY ZINSTAL.ZPM C: + A>B:COPY STARTZPM.COM C: + + You may be wondering if the references to CPMLDR.SYS and CPM3.SYS + are typos. They are not. ZPM3 uses the same loader image as CPM3. + The ZPM3 main system code file is called CPM3.SYS which is the same + name as CP/M 3 uses, but the file contents are not the same. Finally, if you have copies of any of the RomWBW custom applications on your hard disk, you need to update them with the latest copies. The diff --git a/Source/CPM3/Build.cmd b/Source/CPM3/Build.cmd index 1d0e1a9c..557b6c53 100644 --- a/Source/CPM3/Build.cmd +++ b/Source/CPM3/Build.cmd @@ -101,3 +101,23 @@ rem Loader tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst copy /b loader.bin + cpmldr.bin cpmldr.sys + +rem Copy OS files to Binary directory + +copy cpmldr.com ..\..\Binary\CPM3 +copy cpmldr.sys ..\..\Binary\CPM3 +copy ccp.com ..\..\Binary\CPM3 +copy gencpm.com ..\..\Binary\CPM3 +copy genres.dat ..\..\Binary\CPM3 +copy genbnk.dat ..\..\Binary\CPM3 +copy bios3.spr ..\..\Binary\CPM3 +copy bnkbios3.spr ..\..\Binary\CPM3 +copy bdos3.spr ..\..\Binary\CPM3 +copy bnkbdos3.spr ..\..\Binary\CPM3 +copy resbdos3.spr ..\..\Binary\CPM3 +copy cpm3res.sys ..\..\Binary\CPM3 +copy cpm3bnk.sys ..\..\Binary\CPM3 +copy gencpm.dat ..\..\Binary\CPM3 +copy cpm3.sys ..\..\Binary\CPM3 +copy readme.1st ..\..\Binary\CPM3 +copy cpm3fix.pat ..\..\Binary\CPM3 \ No newline at end of file diff --git a/Source/CPM3/Makefile b/Source/CPM3/Makefile index 4eb2a352..a75b03b3 100644 --- a/Source/CPM3/Makefile +++ b/Source/CPM3/Makefile @@ -4,11 +4,19 @@ # # it does this by overriding OBJECTS in an invoked sub-make # -OBJECTS = cpmldr.com cpmldr.sys cpm3res cpm3bnk zpmbios3 cpm3.sys gencpm.dat -OTHERS = cpmldr.rel biosldr.rel cpm3res.sys cpm3bnk.sys zpmbios3.spr loader.bin cpmldr.bin +OBJECTS = cpmldr.com cpmldr.sys cpm3res.sys cpm3bnk.sys zpmbios3 +OBJECTS += ccp.com gencpm.com genres.dat genbnk.dat +OBJECTS += bdos3.spr bnkbdos3.spr resbdos3.spr +OBJECTS += readme.1st cpm3fix.pat cpm3.sys gencpm.dat +NOCOPY = zpmbios3 +OTHERS = cpmldr.rel biosldr.rel cpm3res.sys cpm3bnk.sys loader.bin cpmldr.bin OTHERS += biosldrc.rel biosldrd.rel +NODELETE = ccp.com gencpm.com genres.dat genbnk.dat bdos3.spr bnkbdos3.spr resbdos3.spr +NODELETE += readme.1st cpm3fix.pat +DEST = ../../Binary/CPM3 TOOLS = ../../Tools + include $(TOOLS)/Makefile.inc export ZXINCDIR = ../ @@ -25,11 +33,11 @@ DEFCPM3 = bnk clean:: biosclean @rm -f bios3.spr bnkbios3.spr zpmbios3.spr cpmldr.com gencpm.dat options.lib ldropts.lib - + biosclean: @rm -f $(BIOSOBJS) -cpm3res: +cpm3res.sys: make biosclean cp optres.lib options.lib cp genres.dat gencpm.dat @@ -38,7 +46,7 @@ cpm3res: mv cpm3.sys cpm3res.sys rm gencpm.dat -cpm3bnk: +cpm3bnk.sys: make biosclean cp optbnk.lib options.lib cp genbnk.dat gencpm.dat @@ -50,9 +58,7 @@ cpm3bnk: zpmbios3: make biosclean cp optzpm.lib options.lib - cp genbnk.dat gencpm.dat - make OBJECTS=zpmbios3.spr - rm gencpm.dat + make OBJECTS=zpmbios3.spr DEST= cpmldr.bin: biosldrd.rel cpmldr.rel $(ZXCC) $(TOOLS)/cpm/bin/LINK -CPMLDRD[L100]=CPMLDR,BIOSLDRD @@ -83,9 +89,12 @@ zpmbios3.spr: $(BIOSOBJS) cpm3.sys: cpm3$(DEFCPM3).sys cp cpm3$(DEFCPM3).sys cpm3.sys + rm -f /tmp/casefn.cache gencpm.dat: gen$(DEFCPM3).dat cp gen$(DEFCPM3).dat gencpm.dat - + rm -f /tmp/casefn.cache + cpmldr.sys: loader.bin cpmldr.bin cat loader.bin cpmldr.bin > $@ + diff --git a/Source/Doc/GettingStarted.md b/Source/Doc/GettingStarted.md index cd6bc2da..a8be357a 100644 --- a/Source/Doc/GettingStarted.md +++ b/Source/Doc/GettingStarted.md @@ -1114,12 +1114,81 @@ your choice. This process is described below in the Disk Images section. If you wish to update existing disk media in your system, you need to perform the following steps. -If the disk is bootable, you need to update the system tracks of the -disk. This is done using a SYSCOPY command such as `SYSCOPY -C:=B:ZSYS.SYS`. For a ZSDOS boot disk, use ZSYS.SYS. For a CP/M 2.2 -disk, use CPM.SYS. For a CP/M 3 or ZPM3 disk, use CPMLDR.SYS. -CPMLDR.SYS is not provided on the ROM disk, so you will need to -upload it from the distribution. +If the disk is bootable, you need to update the system image on the +disk using the procedure described below corresponsing to the +operating system on your disk. + +* **CP/M 2.2** + + Boot to CP/M 2.2 from ROM, then use `SYSCOPY` to update the system + image on **all** CP/M 2.2 boot disks/slices. The CP/M 2.2 system image + is called CPM.SYS and is found on the ROM disk. For example: + + `B>SYSCOPY C:=CPM.SYS` + +* **ZSDOS** + + Boot to Z-System from ROM, then use `SYSCOPY` to update the system + image on **all** ZSDOS boot disks/slices. The ZSDOS system image + is called ZSYS.SYS and is found on the ROM disk. For example: + + `B>SYSCOPY C:=ZSYS.SYS` + +* **NZCOM** + + NZCOM runs on top of either CP/M 2.2 or ZSDOS. By default, the + RomWBW disk image for NZCOM uses ZSDOS. Follow the corresponding + procedure above to update the system image on the NZCOM boot + disks/slices. + +* **CP/M 3** + + CP/M 3 uses a multi-step boot process involving multiple files. + The CP/M 3 boot files are not included on the ROM disk due to + space constraints. You will need to transfer the files to your + system from the RomWBW distribution directory Binary\\CPM3. + + After this is done, you will need to use `SYSCOPY` to place + the CP/M 3 loader image on the boot tracks of all CP/M 3 + boot disks/slices. The loader image is called `CPMLDR.SYS`. + You must then copy (at a minimum) `CPM3.SYS` and `CCP.COM` + onto the disk/slice. Assuming you copied the CP/M 3 boot files + onto your RAM disk at A:, you would use: + + ``` + A>B:SYSCOPY C:=CPMLDR.SYS + A>B:COPY CPM3.SYS C: + A>B:COPY CCP.COM C: + ``` + +* **ZPM3** + + ZPM3 uses a multi-step boot process involving multiple files. + The ZPM3 boot files are not included on the ROM disk due to + space constraints. You will need to transfer the files to your + system from the RomWBW distribution directory Binary\\ZPM3. + + After this is done, you will need to use `SYSCOPY` to place + the ZPM3 loader image on the boot tracks of all ZPM3 + boot disks/slices. The loader image is called `CPMLDR.SYS`. + You must then copy (at a minimum) `CPM3.SYS`, `ZCCP.COM`, + `ZINSTAL.ZPM`, and `STARTZPM.COM` onto the disk/slice. + Assuming you copied the ZPM3 boot files onto your RAM disk + at A:, you would use: + + ``` + A>B:SYSCOPY C:=CPMLDR.SYS + A>B:COPY CPM3.SYS C: + A>B:COPY ZCCP.COM C: + A>B:COPY ZINSTAL.ZPM C: + A>B:COPY STARTZPM.COM C: + ``` + + You may be wondering if the references to `CPMLDR.SYS` and + `CPM3.SYS` are typos. They are not. ZPM3 uses the same loader + image as CPM3. The ZPM3 main system code file is called `CPM3.SYS` + which is the same name as CP/M 3 uses, but the file contents are + not the same. Finally, if you have copies of any of the RomWBW custom applications on your hard disk, you need to update them with the latest copies. The diff --git a/Source/HBIOS/cfg_state.inc b/Source/HBIOS/cfg_state.inc index 754f434b..d7d1ab3f 100644 --- a/Source/HBIOS/cfg_state.inc +++ b/Source/HBIOS/cfg_state.inc @@ -4,19 +4,19 @@ SYSTIMEN .EQU FALSE -#IF (CTCENABLE & INTMODE == 2 & CTCTIMER) +#IF (CTCENABLE & (INTMODE == 2) & (CTCTIMER)) SYSTIMEN .SET TRUE #ENDIF -#IF (TMSENABLE & INTMODE == 1 & TMSTIMENABLE) +#IF (TMSENABLE & (INTMODE == 1) & TMSTIMENABLE) SYSTIMEN .SET TRUE #ENDIF -#IF (INTMODE == 1 & PLATFORM == PLT_SBC & HTIMENABLE) +#IF ((INTMODE == 1) & (PLATFORM == PLT_SBC) & HTIMENABLE) SYSTIMEN .SET TRUE #ENDIF -#IF (INTMODE == 2 & CPUFAM == CPU_Z180) +#IF ((INTMODE == 2) & (CPUFAM == CPU_Z180)) SYSTIMEN .SET TRUE #ENDIF diff --git a/Source/ZPM3/Build.cmd b/Source/ZPM3/Build.cmd index 47018c83..2bf6f800 100644 --- a/Source/ZPM3/Build.cmd +++ b/Source/ZPM3/Build.cmd @@ -19,7 +19,8 @@ copy ..\CPM3\zpmbios3.spr bnkbios3.spr copy ..\CPM3\gencpm.com . copy ..\CPM3\biosldrd.rel . copy ..\CPM3\biosldrc.rel . -rem copy ..\CPM3\cpmldr.com . +copy ..\CPM3\cpmldr.com . +copy ..\CPM3\cpmldr.sys . rem ZPM Loader echo. @@ -46,3 +47,22 @@ rem Loader tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst copy /b loader.bin + zpmldr.bin zpmldr.sys + +rem Copy OS files to Binary directory + +copy zpmldr.com ..\..\Binary\ZPM3 +copy zpmldr.sys ..\..\Binary\ZPM3 +copy cpmldr.com ..\..\Binary\ZPM3 +copy cpmldr.sys ..\..\Binary\ZPM3 +copy autotog.com ..\..\Binary\ZPM3 +copy clrhist.com ..\..\Binary\ZPM3 +copy setz3.com ..\..\Binary\ZPM3 +copy cpm3.sys ..\..\Binary\ZPM3 +copy zccp.com ..\..\Binary\ZPM3 +copy zinstal.zpm ..\..\Binary\ZPM3 +copy startzpm.com ..\..\Binary\ZPM3 +copy makedos.com ..\..\Binary\ZPM3 +copy gencpm.dat ..\..\Binary\ZPM3 +copy bnkbios3.spr ..\..\Binary\ZPM3 +copy bnkbdos3.spr ..\..\Binary\ZPM3 +copy resbdos3.spr ..\..\Binary\ZPM3 diff --git a/Source/ZPM3/Makefile b/Source/ZPM3/Makefile index d72e77bd..30859cef 100644 --- a/Source/ZPM3/Makefile +++ b/Source/ZPM3/Makefile @@ -1,10 +1,12 @@ OBJECTS = zpmldr.com zpmldr.sys cpm3.sys startzpm.com zccp.com -ifdef REBUILD_ZPM_TOOLS +#ifdef REBUILD_ZPM_TOOLS OBJECTS += setz3.com clrhist.com autotog.com -else -NODELETE = setz3.com clrhist.com autotog.com -endif -OTHERS = zpmldr.bin loader.bin biosldrd.rel biosldrc.rel gencpm.com gencpm.dat bnkbios3.spr +#else +NODELETE = setz3.com clrhist.com autotog.com makedos.com zinstal.zpm bnkbdos3.spr resbdos3.spr +#endif +OBJECTS += cpmldr.com cpmldr.sys zinstal.zpm makedos.com gencpm.dat bnkbios3.spr bnkbdos3.spr resbdos3.spr +OTHERS = zpmldr.bin loader.bin biosldrd.rel biosldrc.rel gencpm.com +DEST = ../../Binary/ZPM3/ TOOLS =../../Tools include $(TOOLS)/Makefile.inc @@ -47,8 +49,8 @@ zinstal.zpm: ../ZCCP/zinstal.zpm startzpm.com: ../ZCCP/startzpm.com cp $< $@ -setz3.com: setz3.z80 - -clrhist.com: clrhist.z80 +cpmldr.com: ../CPM3/cpmldr.com + cp $< $@ -autotog.com: autotog.z80 +cpmldr.sys: ../CPM3/cpmldr.sys + cp $< $@ diff --git a/Source/ver.inc b/Source/ver.inc index 3cc80df6..bd32d35c 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.8" +#DEFINE BIOSVER "3.1.1-pre.9" diff --git a/Source/ver.lib b/Source/ver.lib index 2f03066f..2fd6a46f 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.8" + db "3.1.1-pre.9" endm diff --git a/Tools/Makefile.inc b/Tools/Makefile.inc index bccb2e26..d410246d 100644 --- a/Tools/Makefile.inc +++ b/Tools/Makefile.inc @@ -112,7 +112,7 @@ all:: $(OBJECTS) @for dir in $(SUBDIRS) ; do \ ( echo "building in `pwd`/$$dir" ; $(MAKE) --directory "$$dir" all ) ; \ done - @if [ "$(DEST)" ] ; then for file in $(OBJECTS) ; do \ + @if [ "$(DEST)" ] ; then for file in $(filter-out $(NOCOPY),$(OBJECTS)) ; do \ mkdir -p $(DEST) ; \ echo copy $$file to $(DEST) ; \ cp $$($(CASEFN) $$file) $(DEST) ; \ From b474445c52329d1a7930407a5ae6969502ec10a3 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 13 May 2020 12:51:10 -0700 Subject: [PATCH 8/8] Update to CLRDIR for CP/M 3 Thanks to Max Scane for this update. It fixes a situation where CLRDIR may not clear all directory entries under CP/M 3 depending on the disk geometry. --- Source/Images/Common/CLRDIR.COM | Bin 1681 -> 1704 bytes Source/RomDsk/ROM_1024KB/CLRDIR.COM | Bin 1681 -> 1704 bytes Source/RomDsk/ROM_512KB/CLRDIR.COM | Bin 1681 -> 1704 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Source/Images/Common/CLRDIR.COM b/Source/Images/Common/CLRDIR.COM index c6b05cc9de2a72ba763f63fe0b8eb2b605cd5ec8..ca65cbed7f56d8047b7274079c2ba398417c0df7 100644 GIT binary patch delta 1125 zcmZ8fQD{?F7{2%B-t%K@LZfqS8R%(lU=q=_XB&eHW>kY9SS_{)zQ}5NE1_a-TDIvL zGZptRC?X-$T5D*lrVoNIzEsDo_v)4#IYlan4EEq443bH4Na z|2hBn|5rkDp&T#hdk-8=?mtYA*qPz<;3?X^i_wnLne<7@+E^Pseuj4TeoMPky{GI@ zFc{-Ay7j%{E0skf(gM~6i0Nhb)(#|60GvVl^;8DV>%MI!MY74r>gSZMx+ZcmbVz;5H}PaGprkM zXsg19NJ71b52)Z_pJp{fsnVoH2Edwv7lD79G#B|hnsp0GkJSKQ4zx0@YLzgnrn@nn zKMTZXVMlZpMoUgi%L+gzk{_otc4}lWbB3l)+PxXOZx;>4co1AgIc6TIMGH`iY*4J` z{E)giHx4yZeDK7qMJMVzDVv0vcv0Cr$ELuGPeQZ^t%?$zhWG@S{2vX!c(>HxgG=Sr zI*aQ*&&o{Kq-5fqLm58^%{VH|B#{z=?&o&B4*PxI48%jYX35p)qY3TO}z5)c;9h`<^l`XPLk Uj&6eE1JMs4%p#4DUp8jm0J=(=oB#j- delta 1122 zcmZXSO=ufO6vt;*qc>Rbiipx08tRO-qJb?*?dc(O4+?H{Db%FICeR*A9cj~u6pPA2 z`M{D~#c_n|CNa9?Y+4lhML$AAn;u+E30jANU}y+A)dyXwQz$;kM<18I4;iN|Y6K&$C0r zM7;}X<0=-gj*B_dHCStX$V^NzcahzWJQy-1#=kP%3#|3qpQgGK84+gJy@b2=BGRJj zr--x6UP&&qxmG)6Rp<53bm~WW7HNu?5!C6?N>YSY*Dlz>*C%LP&CnIdx{MO%uO(cF17Ct8?S{krj5*w%UJ0qWJTT z6{d0!wr)Sg^ofjvzN^cSnNTyJ>hM3J)<8s^f@jfX@Y7TO8s;=ucMdJutf1f|%t>>- zJo$uK`VWI%`tbpLb=dvQs@)Az9pq${#s@Ko59fPY3C7mMiv~j%4!-^B1b>ZZyb>Dc z<*Zl=Ti3i9aRz%7)9$J8uW8U-Hl7&6knfsAdT6Us5FYZI~Z+JhSd diff --git a/Source/RomDsk/ROM_1024KB/CLRDIR.COM b/Source/RomDsk/ROM_1024KB/CLRDIR.COM index c6b05cc9de2a72ba763f63fe0b8eb2b605cd5ec8..ca65cbed7f56d8047b7274079c2ba398417c0df7 100644 GIT binary patch delta 1125 zcmZ8fQD{?F7{2%B-t%K@LZfqS8R%(lU=q=_XB&eHW>kY9SS_{)zQ}5NE1_a-TDIvL zGZptRC?X-$T5D*lrVoNIzEsDo_v)4#IYlan4EEq443bH4Na z|2hBn|5rkDp&T#hdk-8=?mtYA*qPz<;3?X^i_wnLne<7@+E^Pseuj4TeoMPky{GI@ zFc{-Ay7j%{E0skf(gM~6i0Nhb)(#|60GvVl^;8DV>%MI!MY74r>gSZMx+ZcmbVz;5H}PaGprkM zXsg19NJ71b52)Z_pJp{fsnVoH2Edwv7lD79G#B|hnsp0GkJSKQ4zx0@YLzgnrn@nn zKMTZXVMlZpMoUgi%L+gzk{_otc4}lWbB3l)+PxXOZx;>4co1AgIc6TIMGH`iY*4J` z{E)giHx4yZeDK7qMJMVzDVv0vcv0Cr$ELuGPeQZ^t%?$zhWG@S{2vX!c(>HxgG=Sr zI*aQ*&&o{Kq-5fqLm58^%{VH|B#{z=?&o&B4*PxI48%jYX35p)qY3TO}z5)c;9h`<^l`XPLk Uj&6eE1JMs4%p#4DUp8jm0J=(=oB#j- delta 1122 zcmZXSO=ufO6vt;*qc>Rbiipx08tRO-qJb?*?dc(O4+?H{Db%FICeR*A9cj~u6pPA2 z`M{D~#c_n|CNa9?Y+4lhML$AAn;u+E30jANU}y+A)dyXwQz$;kM<18I4;iN|Y6K&$C0r zM7;}X<0=-gj*B_dHCStX$V^NzcahzWJQy-1#=kP%3#|3qpQgGK84+gJy@b2=BGRJj zr--x6UP&&qxmG)6Rp<53bm~WW7HNu?5!C6?N>YSY*Dlz>*C%LP&CnIdx{MO%uO(cF17Ct8?S{krj5*w%UJ0qWJTT z6{d0!wr)Sg^ofjvzN^cSnNTyJ>hM3J)<8s^f@jfX@Y7TO8s;=ucMdJutf1f|%t>>- zJo$uK`VWI%`tbpLb=dvQs@)Az9pq${#s@Ko59fPY3C7mMiv~j%4!-^B1b>ZZyb>Dc z<*Zl=Ti3i9aRz%7)9$J8uW8U-Hl7&6knfsAdT6Us5FYZI~Z+JhSd diff --git a/Source/RomDsk/ROM_512KB/CLRDIR.COM b/Source/RomDsk/ROM_512KB/CLRDIR.COM index c6b05cc9de2a72ba763f63fe0b8eb2b605cd5ec8..ca65cbed7f56d8047b7274079c2ba398417c0df7 100644 GIT binary patch delta 1125 zcmZ8fQD{?F7{2%B-t%K@LZfqS8R%(lU=q=_XB&eHW>kY9SS_{)zQ}5NE1_a-TDIvL zGZptRC?X-$T5D*lrVoNIzEsDo_v)4#IYlan4EEq443bH4Na z|2hBn|5rkDp&T#hdk-8=?mtYA*qPz<;3?X^i_wnLne<7@+E^Pseuj4TeoMPky{GI@ zFc{-Ay7j%{E0skf(gM~6i0Nhb)(#|60GvVl^;8DV>%MI!MY74r>gSZMx+ZcmbVz;5H}PaGprkM zXsg19NJ71b52)Z_pJp{fsnVoH2Edwv7lD79G#B|hnsp0GkJSKQ4zx0@YLzgnrn@nn zKMTZXVMlZpMoUgi%L+gzk{_otc4}lWbB3l)+PxXOZx;>4co1AgIc6TIMGH`iY*4J` z{E)giHx4yZeDK7qMJMVzDVv0vcv0Cr$ELuGPeQZ^t%?$zhWG@S{2vX!c(>HxgG=Sr zI*aQ*&&o{Kq-5fqLm58^%{VH|B#{z=?&o&B4*PxI48%jYX35p)qY3TO}z5)c;9h`<^l`XPLk Uj&6eE1JMs4%p#4DUp8jm0J=(=oB#j- delta 1122 zcmZXSO=ufO6vt;*qc>Rbiipx08tRO-qJb?*?dc(O4+?H{Db%FICeR*A9cj~u6pPA2 z`M{D~#c_n|CNa9?Y+4lhML$AAn;u+E30jANU}y+A)dyXwQz$;kM<18I4;iN|Y6K&$C0r zM7;}X<0=-gj*B_dHCStX$V^NzcahzWJQy-1#=kP%3#|3qpQgGK84+gJy@b2=BGRJj zr--x6UP&&qxmG)6Rp<53bm~WW7HNu?5!C6?N>YSY*Dlz>*C%LP&CnIdx{MO%uO(cF17Ct8?S{krj5*w%UJ0qWJTT z6{d0!wr)Sg^ofjvzN^cSnNTyJ>hM3J)<8s^f@jfX@Y7TO8s;=ucMdJutf1f|%t>>- zJo$uK`VWI%`tbpLb=dvQs@)Az9pq${#s@Ko59fPY3C7mMiv~j%4!-^B1b>ZZyb>Dc z<*Zl=Ti3i9aRz%7)9$J8uW8U-Hl7&6knfsAdT6Us5FYZI~Z+JhSd