From 9aaa929800170af00bd305c2a433579604ade0b2 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 13 May 2020 12:50:33 +1000 Subject: [PATCH 1/4] 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 2/4] 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 3/4] 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 4/4] 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