From 1a789278543dc702638c7062b9922f3bcc9b04dd Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 26 Jul 2021 10:00:04 -0700 Subject: [PATCH 01/16] Make and Build Refactoring --- Build.cmd | 6 +++ Clean.cmd | 5 +++ Source/Apps/I2C/Makefile | 19 ++-------- Source/Apps/Makefile | 2 +- Source/Apps/ramtest/Makefile | 2 +- Source/HBIOS/Build.cmd | 71 ++++++++++++++++++++++++++++++++---- Source/Images/Makefile | 2 + Source/RomDsk/Build.cmd | 6 +++ Tools/Makefile.inc | 46 ++++++++++++++++------- Tools/unix/Makefile | 7 ++-- Tools/unix/bin2asm/Makefile | 4 +- Tools/unix/bst/Makefile | 2 +- Tools/unix/lzsa/Makefile | 4 +- Tools/unix/uz80as/Makefile | 2 +- Tools/unix/zx/Makefile | 2 +- 15 files changed, 131 insertions(+), 49 deletions(-) create mode 100644 Build.cmd create mode 100644 Clean.cmd diff --git a/Build.cmd b/Build.cmd new file mode 100644 index 00000000..2b4a31d1 --- /dev/null +++ b/Build.cmd @@ -0,0 +1,6 @@ +@echo off +setlocal + +pushd Source && call Build %* || exit /b & popd + +pause diff --git a/Clean.cmd b/Clean.cmd new file mode 100644 index 00000000..3c7b25e2 --- /dev/null +++ b/Clean.cmd @@ -0,0 +1,5 @@ +@echo off +setlocal + +pushd Binary && call Clean || exit /b 1 & popd +pushd Source && call Clean || exit /b 1 & popd diff --git a/Source/Apps/I2C/Makefile b/Source/Apps/I2C/Makefile index e205dc82..a6715214 100644 --- a/Source/Apps/I2C/Makefile +++ b/Source/Apps/I2C/Makefile @@ -2,20 +2,7 @@ OBJECTS = i2cscan.com rtcds7.com i2clcd.com DEST = ../../../Binary/Apps TOOLS = ../../../Tools -include $(TOOLS)/Makefile.inc - -DEPS1 := i2cscan.asm $(shell find . -name '*.inc') -DEPS2 := rtcds7.asm $(shell find . -name '*.inc') -DEPS3 := i2clcd.asm $(shell find . -name '*.inc') - - -i2cscan.com: $(DEPS1) - $(TASM) -dWBW i2cscan.asm i2cscan.com i2cscan.lst - -rtcds7.com: $(DEPS2) - $(TASM) -dWBW rtcds7.asm rtcds7.com rtcds7.lst - -i2clcd.com: $(DEPS3) - $(TASM) -dWBW i2clcd.asm i2clcd.com i2clcd.lst - +USETASM=1 +TASMFLAGS=-dWBW +include $(TOOLS)/Makefile.inc diff --git a/Source/Apps/Makefile b/Source/Apps/Makefile index cbcd6675..7f87a2d0 100644 --- a/Source/Apps/Makefile +++ b/Source/Apps/Makefile @@ -10,5 +10,5 @@ include $(TOOLS)/Makefile.inc USETASM = 1 -survey.com: USETASM=0 +survey.com: USETASM = 0 diff --git a/Source/Apps/ramtest/Makefile b/Source/Apps/ramtest/Makefile index f99ee0bc..7e910bca 100644 --- a/Source/Apps/ramtest/Makefile +++ b/Source/Apps/ramtest/Makefile @@ -6,5 +6,5 @@ OTHERS = loader.bin dbgmon.bin include $(TOOLS)/Makefile.inc ramtest.com: loader.bin dbgmon.bin - cat loader.bin dbgmon.bin >ramtest.com + cat $^ >$@ diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index f6639106..64bd4a01 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -15,19 +15,46 @@ set ZXBINDIR=%TOOLS%/cpm/bin/ set ZXLIBDIR=%TOOLS%/cpm/lib/ set ZXINCDIR=%TOOLS%/cpm/include/ +:: +:: This PowerShell script validates the build variables passed in. If +:: necessary, the user is prmopted to pick the variables. It then creates +:: an include file that is imbedded in the HBIOS assembly (build.inc). +:: It also creates a batch command file that sets environment variables +:: for use by the remainder of this batch file (build_env.cmd). +:: + PowerShell -ExecutionPolicy Unrestricted .\Build.ps1 %* || exit /b +:: +:: Below, we process the command file created by the PowerShell script. +:: This sets the environment variables: Platform, Config, ROMName, +:: ROMSize, & CPUType. +:: + call build_env.cmd +:: +:: Start of the actual build process for a given ROM. +:: + echo Building %ROMSize%K ROM %ROMName% for Z%CPUType% CPU... +:: +:: UNA is a special case, check for it and jump if needed. +:: + if %Platform%==UNA goto :UNA +:: +:: Bring the previously build font files into this directory +:: + copy ..\Fonts\font*.asm . || exit /b :: :: Build HBIOS Core (all variants) :: + tasm -t%CPUType% -g3 -dROMBOOT hbios.asm hbios_rom.bin hbios_rom.lst || exit /b tasm -t%CPUType% -g3 -dAPPBOOT hbios.asm hbios_app.bin hbios_app.lst || exit /b tasm -t%CPUType% -g3 -dIMGBOOT hbios.asm hbios_img.bin hbios_img.lst || exit /b @@ -35,6 +62,7 @@ tasm -t%CPUType% -g3 -dIMGBOOT hbios.asm hbios_img.bin hbios_img.lst || exit /b :: :: Build ROM Components :: + call :asm dbgmon call :asm romldr call :asm eastaegg @@ -46,27 +74,40 @@ call :asm updater call :asm imgpad2 :: -:: Create ROM bank images by assembling components +:: Create additional ROM bank images by assembling components into +:: 32K chunks which can be concatenated later. Note that +:: osimg_small is a special case because it is 20K in size. This +:: image is subsequently used to generate the .com loadable file. :: copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin + ..\cpm22\cpm_wbw.bin osimg.bin || exit /b -copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit /b copy /b ..\Forth\camel80.bin + nascom.bin + tastybasic.bin + game.bin + eastaegg.bin + netboot.mod + updater.bin + usrrom.bin osimg1.bin || exit /b copy /b imgpad2.bin osimg2.bin || exit /b +copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit /b + :: -:: Create final ROM images +:: Create final images (.rom, .upd, & .com) +:: The previously created bank images are concatenated as needed. +:: +:: The .rom image is made up of 4 banks followed by the ROM Disk. This +:: is for programming onto a ROM. +:: +:: The .upd image is the same as above, but without the the ROM Disk. +:: This is so you can update just the code portion of your ROM without +:: updating the ROM Disk contents. +:: +:: The .com image is a scaled down version of the ROM that you can run +:: as a standard application under an OS and it will replace your +:: HBIOS on the fly for testing purposes. :: - -set RomDiskDat= -if %ROMSize% GTR 128 set RomDiskDat=..\RomDsk\rom%ROMSize%_wbw.dat copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin + ..\RomDsk\rom%ROMSize%_wbw.dat %ROMName%.rom || exit /b copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b :: -:: Copy to output directory +:: Copy results to output directory :: copy %ROMName%.rom ..\..\Binary || exit /b @@ -81,23 +122,39 @@ goto :eof :UNA +:: +:: This process is basically equivalent to the one above, but tailored +:: for the UNA BIOS. +:: + +:: Build ROM components required by UNA call :asm dbgmon call :asm romldr +:: Create the OS bank copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_una.bin + ..\cpm22\cpm_una.bin osimg.bin || exit /b +:: Copy OS Bank and ROM Disk image files to output copy /b osimg.bin ..\..\Binary\UNA_WBW_SYS.bin || exit /b copy /b ..\RomDsk\rom%ROMSize%_una.dat ..\..\Binary\UNA_WBW_ROM%ROMSize%.bin || exit /b +:: Create the final ROM image copy /b ..\UBIOS\UNA-BIOS.BIN + osimg.bin + ..\UBIOS\FSFAT.BIN + ..\RomDsk\rom%ROMSize%_una.dat %ROMName%.rom || exit /b +:: Copy to output copy %ROMName%.rom ..\..\Binary || exit /b goto :eof +:: +:: Simple procedure to assemble a specified component via TASM. +:: + :asm + echo. echo Building %1... tasm -t80 -g3 -fFF %1.asm %1.bin %1.lst || exit /b + goto :eof diff --git a/Source/Images/Makefile b/Source/Images/Makefile index 7df9706f..1540ddce 100644 --- a/Source/Images/Makefile +++ b/Source/Images/Makefile @@ -28,6 +28,8 @@ DEST=../../Binary TOOLS = ../../Tools include $(TOOLS)/Makefile.inc +.SHELLFLAGS = -ce + DIFFPATH = $(DIFFTO)/Binary hd512_combo.img: $(HD512PREFIX) $(HD512IMGS) diff --git a/Source/RomDsk/Build.cmd b/Source/RomDsk/Build.cmd index 965a2dd0..24f9bbed 100644 --- a/Source/RomDsk/Build.cmd +++ b/Source/RomDsk/Build.cmd @@ -21,6 +21,9 @@ set ZXINCDIR=%TOOLS%/cpm/include/ :: the final ROM size less 128K. :: +copy NUL rom128_wbw.dat +copy NUL rom128_una.dat + :: MakeDisk set RomApps=assign mode rtc syscopy xm @@ -47,13 +50,16 @@ set Bios=%5 echo Making ROM Disk %Output% +:: Create the empty disk image file srec_cat -Generate 0 %Size% --Constant 0xE5 -Output %Output%.dat -Binary || exit /b +:: Populate the disk image via cpmtools cpmcp -f %Format% %Output%.dat %Content%/*.* 0: || exit /b for %%f in (%RomApps%) do cpmcp -f %Format% %Output%.dat ../../Binary/Apps/%%f.com 0: || exit /b cpmcp -f %Format% %Output%.dat ..\cpm22\cpm_%Bios%.sys 0:cpm.sys || exit /b cpmcp -f %Format% %Output%.dat ..\zsdos\zsys_%Bios%.sys 0:zsys.sys || exit /b +:: Mark all disk files R/O for safety cpmchattr -f %Format% %Output%.dat r 0:*.* || exit /b goto :eof diff --git a/Tools/Makefile.inc b/Tools/Makefile.inc index 21ef90b8..28cb24fc 100644 --- a/Tools/Makefile.inc +++ b/Tools/Makefile.inc @@ -34,8 +34,12 @@ DIFFPATH := $(DIFFTO)/$(RELPATH) # CASEFN = $(TOOLS)/unix/casefn.sh +# +# compiler/assembler locations and flags +# ZXCC=$(BINDIR)/zx TASM=$(BINDIR)/uz80as -t z80 +TASMFLAGS= OPENSPIN=$(BINDIR)/openspin BSTC=$(BINDIR)//bstc CPMCP=$(BINDIR)/cpmcp @@ -45,32 +49,42 @@ CPMCP=$(BINDIR)/cpmcp # CPM=$(TOOLS)/cpm/bin +# +# .ONESHELL uses a single shell instance for all shell scripts. +# .SHELLFLAGS is used to cause all shell scripts to echo ("e") and to +# exit if any command returns a non-zero result ("x"). +# +.ONESHELL: +.SHELLFLAGS = -cex + %.com: %.asm - if [ "$(USETASM)" = 1 ] ; then \ - $(TASM) $< $@ ; \ + @if [ "$(USETASM)" = 1 ] ; then \ + $(TASM) $(TASMFLAGS) $< $@ $*.lst ; \ else \ $(ZXCC) $(CPM)/MAC -$< -$$PO ; \ $(ZXCC) $(CPM)/MLOAD25 -tmp.bin=$*.hex ; \ mv tmp.bin $@ ; \ + rm -f /tmp/casefn.cache ; \ rm -f $$($(CASEFN) $*.hex) ; \ fi %.hex: %.asm - $(ZXCC) $(CPM)/MAC -$< -$$PO ; \ + $(ZXCC) $(CPM)/MAC -$< -$$PO %.bin: %.ASM $(ZXCC) $(CPM)/MAC -$< -$$PO $(ZXCC) $(CPM)/MLOAD25 -tmp.bin=$*.hex mv tmp.bin $@ + rm -f /tmp/casefn.cache rm -f $$($(CASEFN) $*.hex) %.com: %.z80 - $(ZXCC) $(CPM)/Z80ASM -$(basename $<)/F ; \ - rm -f /tmp/casefn.cache ; \ + $(ZXCC) $(CPM)/Z80ASM -$(basename $<)/F + rm -f /tmp/casefn.cache mv $$($(CASEFN) $@) tmp.com ; mv tmp.com $@ %.bin: %.asm - $(TASM) $< $@ + $(TASM) $(TASMFLAGS) $< $@ $*.lst %.rel: %.asm $(ZXCC) $(CPM)/RMAC -$< @@ -95,8 +109,6 @@ ifeq ($(UNAME), Linux) $(BSTC) -e -l $< endif -.ONESHELL: - # # darwin bstc won't run, since mac os does not do 32 bit binaries any more # openspin ought to work @@ -110,29 +122,36 @@ endif # first target is default # all:: $(OBJECTS) - @$(foreach subdir,$(SUBDIRS),echo "*** Making directory $(subdir)"; $(MAKE) --directory $(subdir) all || exit 1;) + @for dir in $(SUBDIRS) ; do \ + $(MAKE) --directory $$dir all ; \ + done @if [ "$(DEST)" ] ; then for file in $(filter-out $(NOCOPY),$(OBJECTS)) ; do \ mkdir -p $(DEST) ; \ - echo copy $$file to $(DEST) ; \ + echo Copying $$file to $(DEST) ; \ rm -f /tmp/casefn.cache ; \ cp $$($(CASEFN) $$file) $(DEST) ; \ done ; fi @if [ "$(DOCDEST)" ] ; then for file in $(DOCS) ; do \ mkdir -p $(DOCDEST) ; \ - echo copy $$file to $(DOCDEST) ; \ + echo Copying $$file to $(DOCDEST) ; \ + rm -f /tmp/casefn.cache ; \ cp $$($(CASEFN) $$file) $(DOCDEST) ; \ done ; fi clean:: @-rm -f $$($(CASEFN) make.out *.sym *.lst *.prn *.diff *.dump $(OTHERS) $(filter-out $(NODELETE),$(OBJECTS))) - @$(foreach subdir,$(SUBDIRS),echo "*** Cleaning directory $(subdir)"; $(MAKE) --directory $(subdir) clean || exit 1;) + @for dir in $(SUBDIRS) ; do \ + $(MAKE) --directory $$dir clean ; \ + done clobber:: clean @if [ "$(DEST)" ] ; then for file in $(OBJECTS) ; do \ rm -f $$($(CASEFN) $(DEST)/$$file) ; \ done ; fi @-rm -f $$($(CASEFN) $(filter-out $(NODELETE),$(OBJECTS))) - @$(foreach subdir,$(SUBDIRS),echo "*** Clobbering directory $(subdir)"; $(MAKE) --directory $(subdir) clobber || exit 1;) + @for dir in $(SUBDIRS) ; do \ + $(MAKE) --directory $$dir clobber ; \ + done # # this is used to verify that the unix and windows tool chains are generating # the same objects @@ -165,4 +184,3 @@ endif vdiff: make VERBOSEDIFF=2 diff - diff --git a/Tools/unix/Makefile b/Tools/unix/Makefile index caa6c4ff..cba1782e 100644 --- a/Tools/unix/Makefile +++ b/Tools/unix/Makefile @@ -13,10 +13,11 @@ SUBDIRS = bst uz80as zx cpmtools bin2asm lzsa all: @chmod +x casefn.sh - @$(foreach subdir,$(SUBDIRS),$(MAKE) --directory $(subdir) all || exit 1;) + @$(foreach subdir,$(SUBDIRS),$(MAKE) --directory $(subdir) all;) clobber: - @$(foreach subdir,$(SUBDIRS),$(MAKE) --directory $(subdir) clobber || exit 1;) + @$(foreach subdir,$(SUBDIRS),$(MAKE) --directory $(subdir) clobber;) + @rm -rf ../$(UNAME) clean: - @$(foreach subdir,$(SUBDIRS),$(MAKE) --directory $(subdir) clean || exit 1;) + @$(foreach subdir,$(SUBDIRS),$(MAKE) --directory $(subdir) clean;) \ No newline at end of file diff --git a/Tools/unix/bin2asm/Makefile b/Tools/unix/bin2asm/Makefile index ec98153d..1ffdbd79 100644 --- a/Tools/unix/bin2asm/Makefile +++ b/Tools/unix/bin2asm/Makefile @@ -16,9 +16,9 @@ $(DEST): .PHONY: clean clean: - rm -f $(OBJ_FILES) + rm -f $(OBJ_FILES) $(BINARY) -clobber: +clobber: clean rm -f $(DEST)/$(BINARY) $(BINARY) $(BINARY): $(OBJ_FILES) diff --git a/Tools/unix/bst/Makefile b/Tools/unix/bst/Makefile index d3170586..2e6c8227 100644 --- a/Tools/unix/bst/Makefile +++ b/Tools/unix/bst/Makefile @@ -20,7 +20,7 @@ all: $(DEST) $(DEST): mkdir $(DEST) -clobber: +clobber: clean -for i in *.$(SUFFIX) ; do \ rm $(DEST)/$$(basename $$i .$(SUFFIX)) ; \ done diff --git a/Tools/unix/lzsa/Makefile b/Tools/unix/lzsa/Makefile index 84df4aab..9f9cd895 100644 --- a/Tools/unix/lzsa/Makefile +++ b/Tools/unix/lzsa/Makefile @@ -36,11 +36,11 @@ all: $(APP) cp -p $(APP) ../../$(UNAME) $(APP): $(OBJS) - @mkdir -p ../../bin/posix + #@mkdir -p ../../bin/posix $(CC) $^ $(LDFLAGS) -o $(APP) clean: @rm -rf $(APP) $(OBJDIR) -clobber: +clobber: clean rm -f ../../$(UNAME)/$(APP) diff --git a/Tools/unix/uz80as/Makefile b/Tools/unix/uz80as/Makefile index 1a22b386..164ca7e8 100644 --- a/Tools/unix/uz80as/Makefile +++ b/Tools/unix/uz80as/Makefile @@ -53,7 +53,7 @@ clobber: clean -rm -f uz80as $(DEST)/uz80as clean: - -rm -f $(OBJECTS) + -rm -f $(OBJECTS) uz80as uz80as: $(OBJECTS) $(CC) $(CFLAGS) -o uz80as $(OBJECTS) diff --git a/Tools/unix/zx/Makefile b/Tools/unix/zx/Makefile index 12adc60f..862ec7a3 100644 --- a/Tools/unix/zx/Makefile +++ b/Tools/unix/zx/Makefile @@ -23,7 +23,7 @@ $(DEST): mkdir -p $(DEST) clean: - -rm -f $(OBJECTS) config.h + -rm -f $(OBJECTS) config.h zx clobber: clean -rm -f $(DEST)/zx $(DEST)/bios.bin zx From 5e0f2f89c1e1b91874106771dcb86683cb01421e Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 26 Jul 2021 10:49:15 -0700 Subject: [PATCH 02/16] Update .gitignore --- .gitignore | 6 +++--- Tools/cpm/bin/UNZIP154.COM | Bin 0 -> 5248 bytes Tools/cpm/bin/UNZIP186.COM | Bin 0 -> 8576 bytes 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 Tools/cpm/bin/UNZIP154.COM create mode 100644 Tools/cpm/bin/UNZIP186.COM diff --git a/.gitignore b/.gitignore index ebd567a5..f17a0be4 100644 --- a/.gitignore +++ b/.gitignore @@ -93,9 +93,9 @@ Tools/unix/zx/zx !Source/ZRC/*.bin !Source/ZZR/*.bin !Source/ZZR/*.hex -!Tools/cpm/bin -!Tools/unix/zx -!Tools/zx +!Tools/cpm/bin/* +!Tools/unix/zx/* +!Tools/zx/* Source/ZPM3/gencpm.com Source/ZPM3/startzpm.com diff --git a/Tools/cpm/bin/UNZIP154.COM b/Tools/cpm/bin/UNZIP154.COM new file mode 100644 index 0000000000000000000000000000000000000000..f0572630f7ed298de0b9d21d22ece18683407269 GIT binary patch literal 5248 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 Q*c-y^O?P-HF%QOn0LHJoq5uE@ literal 0 HcmV?d00001 diff --git a/Tools/cpm/bin/UNZIP186.COM b/Tools/cpm/bin/UNZIP186.COM new file mode 100644 index 0000000000000000000000000000000000000000..c750ff5224cc2547a4f1a4fa6ad37bd41c09fc2a GIT binary patch literal 8576 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 literal 0 HcmV?d00001 From 6a796a2f8ddeb0de2d8fa642eda6a757c9313d53 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 26 Jul 2021 11:50:21 -0700 Subject: [PATCH 03/16] Add Support for MBC FDC in FDU - The FDU support is not yet tested! - The MBC FDU is not yet supported in HBIOS! --- Doc/ChangeLog.txt | 1 + Source/Apps/FDU/fdu.asm | 35 ++++++++++++++++++++++++++--------- Source/Apps/FDU/fdu.txt | 18 +++++++++++++++--- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 14adad1e..ad5a0dca 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -45,6 +45,7 @@ Version 3.1.1 - WBW: Added Phil Summers' ROM Updater into ROM Loader - AJL: Added ramtest app (requires SBC and MBC for now) - L?N: Provided SCOPY, XSUB01, and EX applications +- WBW: Added support for MBC FDC to FDU application Version 3.1 ----------- diff --git a/Source/Apps/FDU/fdu.asm b/Source/Apps/FDU/fdu.asm index 6941c682..c8c7fc3f 100644 --- a/Source/Apps/FDU/fdu.asm +++ b/Source/Apps/FDU/fdu.asm @@ -48,6 +48,7 @@ ; 2020-04-29: v5.5 ADDED SUPPORT FOR ETCHED PIXELS FDC ; 2020-12-12: v5.6 UPDATED SMALLZ80 TO NEW I/O ADDRESSES ; 2021-03-24: v5.7 ADDED SOME SINGLE-SIDED FORMATS +; 2021-07-26: v5.8 ADDED SUPPORT MBC FDC ; ;_______________________________________________________________________________ ; @@ -83,6 +84,7 @@ FDC_RCWDC .EQU 7 FDC_SMZ80 .EQU 8 FDC_DYNO .EQU 9 FDC_EPFDC .EQU 10 +FDC_MBC .EQU 11 ; ; FDC MODE ; @@ -217,7 +219,7 @@ INIT5: XOR A RET -STR_BANNER .DB "Floppy Disk Utility (FDU) v5.7, 24-Mar-2021$" +STR_BANNER .DB "Floppy Disk Utility (FDU) v5.8, 26-Jul-2021$" STR_BANNER2 .DB "Copyright (C) 2021, Wayne Warthen, GNU GPL v3","$" STR_HBIOS .DB " [HBIOS]$" STR_UBIOS .DB " [UBIOS]$" @@ -289,6 +291,7 @@ FDCTBL: ; LABEL CONFIG DATA .DW STR_SMZ80, CFG_SMZ80 .DW STR_DYNO, CFG_DYNO .DW STR_EPFDC, CFG_EPFDC + .DW STR_MBC, CFG_MBC FDCCNT .EQU ($-FDCTBL)/4 ; FD CONTROLLER COUNT ; ; FDC LABEL STRINGS @@ -304,6 +307,7 @@ STR_RCWDC .TEXT "RC-WDC$" STR_SMZ80 .TEXT "SMZ80$" STR_DYNO .TEXT "DYNO$" STR_EPFDC .TEXT "EPFDC$" +STR_MBC .TEXT "MBC$" ; ; FDC CONFIGURATION BLOCKS ; @@ -436,6 +440,17 @@ CFG_EPFDC: .DB 0FFH ; PSEUDO DMA DATA PORT .DB _PCAT ; MODE= ; +CFG_MBC: + .DB 030H ; FDC MAIN STATUS REGISTER + .DB 031H ; FDC DATA PORT + .DB 0FFH ; DATA INPUT REGISTER + .DB 036H ; DIGITAL OUTPUT REGISTER (WHEN WRITTEN) + .DB 035H ; CONFIGURATION CONTROL REGISTER + .DB 036H ; DACK (WHEN READ) + .DB 037H ; TERMINAL COUNT (W/ DACK) + .DB 0FFH ; NOT USED BY ZETA SBC V2 + .DB _PCAT ; MODE= +; FDCID .DB 0 ; FDC IDENTIFIER (0 INDEXED) FDCBM .DB 0 ; FDC ID BITMAP FDCLBL .DW 0 ; POINTER TO ACTIVE FDC LABEL STRING @@ -455,6 +470,7 @@ FSS_MENU: .TEXT " (I) SmallZ80 Expansion\r\n" .TEXT " (J) Dyno-Card FDC, D1030\r\n" .TEXT " (K) RC2014 EPFDC\r\n" + .TEXT " (L) Multi-Board Computer FDC\r\n" .TEXT " (X) Exit\r\n" .TEXT "=== OPTION ===> $\r\n" ; @@ -1544,6 +1560,7 @@ MD_MAP: .DB %00000001 ; SMZ80 POLL .DB %00000001 ; DYNO POLL .DB %00000001 ; EPFDC POLL + .DB %00000001 ; MBC POLL ; ; MEDIA DESCRIPTION BLOCK ; @@ -2004,7 +2021,7 @@ FM_DRAW0B: ; ZETA, DIO3 LD A,(FST_DOR) AND 00000010B JR FM_DRAW1 -FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC +FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC LD A,(FST_DOR) AND 11110000B JR FM_DRAW1 @@ -2157,7 +2174,7 @@ FM_MOTOR0B: ; ZETA, DIO3 LD A,(FST_DOR) AND 00000010B JR FM_MOTOR1 -FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC +FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC LD A,(FST_DOR) AND 11110000B JR FM_MOTOR1 @@ -2896,7 +2913,7 @@ FC_INIT1: ; DIO FC_INIT2: ; ZETA, DIO3 LD A,(FCD_DORB) JR FC_INIT5 -FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC +FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC LD A,(FCD_DORC) JR FC_INIT5 FC_INIT4: ; WDSMC @@ -2940,7 +2957,7 @@ FC_RESETFDC1: ; ZETA, DIO3, RCSMC POP AF OUT (C),A JR FC_RESETFDC3 -FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC +FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC LD A,0 OUT (C),A LD A,(FST_DOR) @@ -2967,7 +2984,7 @@ FC_PULSETC: ;RES 0,A ;OUT (C),A ;JR FC_PULSETC2 -;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC +;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC ;LD C,(IY+CFG_TC) ;IN A,(C) ;JR FC_PULSETC2 @@ -2999,7 +3016,7 @@ FC_MOTORON2: ; ZETA, DIO3 LD HL,FST_DOR ; POINT TO FDC_DOR SET 1,(HL) JR FC_MOTORON5 -FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC +FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC LD HL,FST_DOR ; POINT TO FDC_DOR LD A,(HL) ; START WITH CURRENT DOR AND 11111100B ; GET RID OF ANY ACTIVE DS BITS @@ -3063,7 +3080,7 @@ FC_MOTOROFF2: ; ZETA, DIO3 LD HL,FST_DOR ; POINT TO FDC_DOR RES 1,(HL) JR FC_MOTOROFF5 -FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC +FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC LD HL,FST_DOR ; POINT TO FDC_DOR LD A,DORC_INIT LD (HL),A @@ -3933,7 +3950,7 @@ DORB_BR500 .EQU 10100000B ; 500KBPS ; DORB_INIT .EQU DORB_BR250 ; -; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO/EPFDC *** +; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO/EPFDC/MBC *** ; DORC_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED ; diff --git a/Source/Apps/FDU/fdu.txt b/Source/Apps/FDU/fdu.txt index 88fd88a3..38adda12 100644 --- a/Source/Apps/FDU/fdu.txt +++ b/Source/Apps/FDU/fdu.txt @@ -74,10 +74,10 @@ supported: - Zeta 2 - N8 - Mark IV - - RC2014 w/ SMC - - RC2014 w/ WDC + - RC2014 - SmallZ80 - Dyno + - MBC You must be using either a RomWBW or UBA based OS version. @@ -91,6 +91,9 @@ You must have one of the following floppy disk controllers: - N8 SBC onboard FDC - RC2014 Scott Baker SMC-based Floppy Module - RC2014 Scott Baker WDC-based Floppy Module + - SmallZ80 FDC + - Dyno FDC + - MBC FDC Finally, you will need a floppy drive connected via an appropriate cable: @@ -152,12 +155,18 @@ The RC2014 Scott Baker WDC-based floppy module should be jumpered for I/O base address 0x50 (SV1: 11-12), JP1 (/DACK): 1-2, JP2 (TC): 2-3. +The RC2014 FDC by Alan Cox (Etched Pixels) needs to be strapped +for base I/O address 0x48. + SmallZ80 does not have any relevant jumper settings. The hardwired I/O ranges are assumed in the code. Dyno does not have any relevant jumper settings. The hardwired I/O ranges are assumed in the code. +The MBC FDC is expected to be strapped to use neither INT nor NMI. It +is also not expected to use DMA. + Modes of Operation ------------------ @@ -520,4 +529,7 @@ WW 12/12/2020: v5.6 - Updated SmallZ80 support for new I/O map WW 3/24/2021: v5.7 - - Added support for a few single-sided formats \ No newline at end of file + - Added support for a few single-sided formats + +WW 7/26/2021: v5.8 + - Added support for MBC FDC diff --git a/Source/ver.inc b/Source/ver.inc index ce9a1dbe..dcd01dd9 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.96" +#DEFINE BIOSVER "3.1.1-pre.97" diff --git a/Source/ver.lib b/Source/ver.lib index ff448aa9..38ce6f26 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.96" + db "3.1.1-pre.97" endm From 88670cc3eb7ab6c046a9a317f8ee3209a8e2ba5f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 26 Jul 2021 12:24:40 -0700 Subject: [PATCH 04/16] Update FDU.txt --- Doc/FDU.txt | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Doc/FDU.txt b/Doc/FDU.txt index 88fd88a3..38adda12 100644 --- a/Doc/FDU.txt +++ b/Doc/FDU.txt @@ -74,10 +74,10 @@ supported: - Zeta 2 - N8 - Mark IV - - RC2014 w/ SMC - - RC2014 w/ WDC + - RC2014 - SmallZ80 - Dyno + - MBC You must be using either a RomWBW or UBA based OS version. @@ -91,6 +91,9 @@ You must have one of the following floppy disk controllers: - N8 SBC onboard FDC - RC2014 Scott Baker SMC-based Floppy Module - RC2014 Scott Baker WDC-based Floppy Module + - SmallZ80 FDC + - Dyno FDC + - MBC FDC Finally, you will need a floppy drive connected via an appropriate cable: @@ -152,12 +155,18 @@ The RC2014 Scott Baker WDC-based floppy module should be jumpered for I/O base address 0x50 (SV1: 11-12), JP1 (/DACK): 1-2, JP2 (TC): 2-3. +The RC2014 FDC by Alan Cox (Etched Pixels) needs to be strapped +for base I/O address 0x48. + SmallZ80 does not have any relevant jumper settings. The hardwired I/O ranges are assumed in the code. Dyno does not have any relevant jumper settings. The hardwired I/O ranges are assumed in the code. +The MBC FDC is expected to be strapped to use neither INT nor NMI. It +is also not expected to use DMA. + Modes of Operation ------------------ @@ -520,4 +529,7 @@ WW 12/12/2020: v5.6 - Updated SmallZ80 support for new I/O map WW 3/24/2021: v5.7 - - Added support for a few single-sided formats \ No newline at end of file + - Added support for a few single-sided formats + +WW 7/26/2021: v5.8 + - Added support for MBC FDC From aa29fe79f69fc8d78dd545f5a8f44ce1a6d55476 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 26 Jul 2021 13:13:53 -0700 Subject: [PATCH 05/16] Regen Documentation --- Doc/RomWBW Applications.pdf | Bin 142480 -> 142480 bytes Doc/RomWBW Architecture.pdf | Bin 440180 -> 440180 bytes Doc/RomWBW Disk Catalog.pdf | Bin 131009 -> 131009 bytes Doc/RomWBW Getting Started.pdf | Bin 177846 -> 177901 bytes ReadMe.md | 19 +++++++++++-------- ReadMe.txt | 20 ++++++++++++-------- 6 files changed, 23 insertions(+), 16 deletions(-) diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 78024561128c332b01b3c612e67164d338c5e52b..a576103b85c1d56846b3c2aed960600f6b452bbe 100644 GIT binary patch delta 161 zcmbPmlVie7j)oS-EllxDI_5@ZhDJuFh8DU8=IRCp>Y7~ozWFIGi6yBD8ZK5w21bSk za3$NjnV6PpCYYOAxHuZRIlEaJnH#y9IawOJn3|hgm|Gf{n>jgKxY{Y$5L6PYU}wiw bT#{H+Qc;we#${-1XkloY7~ozWFIGi6yBD8ZK5w21bSk za3$NjnV6PpCb$|pnix4dnYp?-T3R}pS{gbTnphf|I9j;6I2szb7}_b=5L6PYU}wiw aT#{H+Qc;we#${*>bb|*BTW^7^U=ImmpU_(I3^sw!0asc0_GzgMe1 ZYUFHe>}Kg|Xy#(4U_(I3^sw!0asZdKd4<8yKi-a_Rf#r?@1Rq$+5*SQ!}@85+Qq zZ0C8!7%G}zVd-S)XlZ6?Vrgb!?C9id=;r2RVr*n+?qulfW@cb+r(i=+NvwjM9anKl ZVo^y&QED2Op^>Sni8+_5s;j>n7Xb2|DUtvH delta 159 zcmX^3pZ(x}_J%Et4_@k+8X6gz8(J8d=^B`;8yKi-a_Rf#r?@1Rq$+5*SQ!}@85+Qq zZ0C8!7%H0J>g;Oj;^gdVVd!Y=X6EQ<;^gXVZfI=iY;0<3VQlJXr(i=+NvwjM9anKl ZVo^y&QED2Op^>Sni8+_5s;j>n7XT0^Df9pU diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index 4c1b6f4ac9b93234a81e373e4f3ce200a87b98ca..e78e795b05d5617c45ac557cbda9b37e34c777f9 100644 GIT binary patch delta 44213 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 delta 44738 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 aoB!A4 diff --git a/ReadMe.md b/ReadMe.md index 87c3b432..13a209d8 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ ## Z80/Z180 System Software Version 3.1 Pre-release -Saturday 13 March 2021 +Thursday 22 July 2021 Wayne Warthen @@ -126,6 +126,7 @@ the appropriate ROM image for your hardware. | SC130 | SCZ180\_130.rom | 115200 | Stephen Cousin’s SC130 Z180 | | SC131 | SCZ180\_131.rom | 115200 | Stephen Cousin’s SC131 Z180 | | Dyno | DYNO\_std.rom | 38400 | Steve Garcia’s Z180 Dyno Computer | +| MBC | MBC\_std.rom | 38400 | Andrew Lynch’s Multi Board Computer | \*The RC2014 Z180 requires a separate RAM/ROM memory module. There are two types of these modules and you must pick the ROM for your type of @@ -183,13 +184,15 @@ disk devices. The following ROM applications are available at the boot loader prompt: -| Application | | -| ----------- | ------------------------------------------------------ | -| Monitor | Z80 system debug monitor w/ Intel Hex loader | -| Forth | Brad Rodriguez’s ANSI compatible Forth language | -| Basic | Nascom 8K BASIC language | -| Tasty BASIC | Dimitri Theuling’s Tiny BASIC implementation | -| Play | A simple video game (requires ANSI terminal emulation) | +| Application | | +| ------------ | ------------------------------------------------------ | +| Monitor | Z80 system debug monitor w/ Intel Hex loader | +| Forth | Brad Rodriguez’s ANSI compatible Forth language | +| Basic | Nascom 8K BASIC language | +| Tasty BASIC | Dimitri Theuling’s Tiny BASIC implementation | +| Play | A simple video game (requires ANSI terminal emulation) | +| Network Boot | Boot through Wiznet MT011 device | +| Flash Update | Upload and flash a new ROMWBW image using xmodem | In general, the command to exit these applications and restart the system is `BYE`. The exceptions are the Monitor which uses `B` and Play diff --git a/ReadMe.txt b/ReadMe.txt index 76559f40..48a802d5 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -3,7 +3,7 @@ RomWBW Z80/Z180 System Software Version 3.1 Pre-release -Saturday 13 March 2021 +Thursday 22 July 2021 Wayne Warthen wwarthen@gmail.com @@ -139,6 +139,8 @@ appropriate ROM image for your hardware. SC131 SCZ180_131.rom 115200 Stephen Cousin’s SC131 Z180 Dyno DYNO_std.rom 38400 Steve Garcia’s Z180 Dyno Computer + + MBC MBC_std.rom 38400 Andrew Lynch’s Multi Board Computer ------------------------------------------------------------------------- *The RC2014 Z180 requires a separate RAM/ROM memory module. There are @@ -197,13 +199,15 @@ disk devices. The following ROM applications are available at the boot loader prompt: - Application - ------------- -------------------------------------------------------- - Monitor Z80 system debug monitor w/ Intel Hex loader - Forth Brad Rodriguez’s ANSI compatible Forth language - Basic Nascom 8K BASIC language - Tasty BASIC Dimitri Theuling’s Tiny BASIC implementation - Play A simple video game (requires ANSI terminal emulation) + Application + -------------- -------------------------------------------------------- + Monitor Z80 system debug monitor w/ Intel Hex loader + Forth Brad Rodriguez’s ANSI compatible Forth language + Basic Nascom 8K BASIC language + Tasty BASIC Dimitri Theuling’s Tiny BASIC implementation + Play A simple video game (requires ANSI terminal emulation) + Network Boot Boot through Wiznet MT011 device + Flash Update Upload and flash a new ROMWBW image using xmodem In general, the command to exit these applications and restart the system is BYE. The exceptions are the Monitor which uses B and Play From 637174373f6f3854533614206a832ada9472b270 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 26 Jul 2021 19:01:49 -0700 Subject: [PATCH 06/16] Make and Build Tweaks --- Source/Fonts/Makefile | 1 - Source/HBIOS/Build.sh | 78 +++-------------------------------------- Source/HBIOS/Makefile | 14 ++++++-- Source/Makefile | 6 ++-- Source/RomDsk/Build.cmd | 40 +++++++++++---------- Source/RomDsk/Makefile | 36 +++++++++++++++++++ Source/ver.inc | 2 +- Source/ver.lib | 2 +- Tools/Makefile.inc | 3 +- 9 files changed, 82 insertions(+), 100 deletions(-) create mode 100644 Source/RomDsk/Makefile diff --git a/Source/Fonts/Makefile b/Source/Fonts/Makefile index c9a06b35..0a3ddf78 100644 --- a/Source/Fonts/Makefile +++ b/Source/Fonts/Makefile @@ -4,7 +4,6 @@ OBJECTS = \ OTHERS = font8x8c.bin font8x11c.bin font8x16c.bin -DEST = ../HBIOS TOOLS = ../../Tools include $(TOOLS)/Makefile.inc diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 65f6b205..777985dc 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -3,9 +3,6 @@ # fail on any error set -e -CPMCP=../../Tools/`uname`/cpmcp -CPMCH=../../Tools/`uname`/cpmchattr - timestamp=$(date +%Y-%m-%d) #timestamp="2020-02-24" @@ -60,22 +57,8 @@ else BIOS=wbw fi -Apps=(assign mode rtc syscopy xm) -if [ $romsize -gt 256 ] ; then - Apps+=(fdu format survey sysgen talk timer inttest) -fi - -blankfile=Blank${romsize}KB.dat -romdiskfile=RomDisk.tmp -romfmt=wbw_rom${romsize} outdir=../../Binary -echo "creating empty rom disk of size $romsize in $blankfile" -#LANG=en_US.US-ASCII tr '\000' '\345' /dev/null -#LC_CTYPE=en_US.US-ASCII tr '\000' '\345' /dev/null -LC_ALL=en_US.US-ASCII tr '\000' '\345' build.inc ; RomWBW Configured for $platform $config $timestamp ; @@ -87,19 +70,9 @@ ROMSIZE .EQU $romsize ; EOF -echo "checking prerequisites" -for need in ../CPM22/cpm_$BIOS.bin ../ZSDOS/zsys_$BIOS.bin \ - ../Forth/camel80.bin font8x11c.asm font8x11u.asm font8x16c.asm \ - font8x16u.asm font8x8c.asm font8x8u.asm ; do - if [ ! -f $need ] ; then - echo $need missing - exit 2 - fi -done - -cp ../Forth/camel80.bin . +make prereq -make dbgmon.bin romldr.bin imgpad2.bin +make dbgmon.bin romldr.bin if [ $platform != UNA ] ; then make nascom.bin tastybasic.bin game.bin eastaegg.bin updater.bin usrrom.bin imgpad2.bin @@ -116,53 +89,12 @@ if [ $platform != UNA ] ; then cat imgpad2.bin >osimg2.bin fi -echo "Building ${romsize}KB $romname ROM disk data file..." - -cp $blankfile $romdiskfile - -if [ $romsize -gt 128 ] ; then - - echo placing files into $romdiskfile - - for file in $(ls -1 ../RomDsk/ROM_${romsize}KB/* | sort -V) ; do - echo " " $file - $CPMCP -f $romfmt $romdiskfile $file 0: - done - - if [ -d ../RomDsk/$platform ] ; then - for file in ../RomDsk/$platform/* ; do - echo " " $file - $CPMCP -f $romfmt $romdiskfile $file 0: - done - fi - - echo "adding apps to $romdiskfile" - for i in ${Apps[@]} ; do - set +e - f=$(../../Tools/unix/casefn.sh ../../Binary/Apps/$i.com) - set -e - if [ -z "$f" ] ; then - echo " " $i "not found" - else - echo " " $f - $CPMCP -f $romfmt $romdiskfile $f 0: - fi - done - - echo "copying systems to $romdiskfile" - $CPMCP -f $romfmt $romdiskfile ../CPM22/cpm_$BIOS.sys 0:cpm.sys - $CPMCP -f $romfmt $romdiskfile ../ZSDOS/zsys_$BIOS.sys 0:zsys.sys - - echo "setting files in the ROM disk image to read only" - $CPMCH -f $romfmt $romdiskfile r 0:*.* -fi - if [ $platform = UNA ] ; then cp osimg.bin $outdir/UNA_WBW_SYS.bin - cp $romdiskfile $outdir/UNA_WBW_ROM$romsize.bin - cat ../UBIOS/UNA-BIOS.BIN osimg.bin ../UBIOS/FSFAT.BIN $romdiskfile >$romname.rom + cp ../RomDsk/rom${romsize}_una.dat $outdir/UNA_WBW_ROM$romsize.bin + cat ../UBIOS/UNA-BIOS.BIN osimg.bin ../UBIOS/FSFAT.BIN ../RomDsk/rom${romsize}_una.dat >$romname.rom else - cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin $romdiskfile >$romname.rom + cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ../RomDsk/rom${romsize}_wbw.dat >$romname.rom cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$romname.upd cat hbios_app.bin osimg_small.bin > $romname.com fi diff --git a/Source/HBIOS/Makefile b/Source/HBIOS/Makefile index a6edb1b0..19d4eade 100644 --- a/Source/HBIOS/Makefile +++ b/Source/HBIOS/Makefile @@ -42,9 +42,11 @@ MOREDIFF = camel80.bin game.bin hbios_rom.bin nascom.bin prefix.bin usrrom.bin \ SUBDIRS = DEST = ../../Binary TOOLS =../../Tools -OTHERS = *.img *.rom *.com *.bin *.z80 cpm.sys zsys.sys Build.inc RomDisk.tmp font*.asm *.dat +OTHERS = *.img *.rom *.com *.bin *.z80 cpm.sys zsys.sys Build.inc font*.asm *.dat include $(TOOLS)/Makefile.inc +FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm font8x8c.asm font8x8u.asm + ifneq ($(findstring $(platform), N8 MK4 RCZ180 SCZ180 DYNO),) TASM=$(BINDIR)/uz80as -t hd64180 endif @@ -64,10 +66,18 @@ ROMSIZE=512 N8_std.rom: ROMSIZE=512 RCZ280_nat_zzr.rom: ROMSIZE=256 -%.rom: +%.rom %.upd %.com: chmod +x Build.sh bash Build.sh $(DIFFBUILD) $(shell echo $* | sed 's/_/ /') $(ROMSIZE) + +prereq: $(FONTS) camel80.bin + +font%.asm: + cp ../Fonts/$@ . +camel80.bin: + cp ../Forth/$@ . + hbios_rom.bin: hbios.asm build.inc $(TASM) -dROMBOOT hbios.asm hbios_rom.bin hbios_rom.lst diff --git a/Source/Makefile b/Source/Makefile index 189430e2..cb096c4a 100644 --- a/Source/Makefile +++ b/Source/Makefile @@ -6,10 +6,10 @@ SUBDIRS += Apps SUBDIRS += CBIOS SUBDIRS += Forth SUBDIRS += Fonts -SUBDIRS += CPM22 ZCPR ZCPR-DJ ZSDOS -SUBDIRS += HBIOS CPM3 -SUBDIRS += ZPM3 +SUBDIRS += CPM22 ZCPR ZCPR-DJ ZSDOS CPM3 ZPM3 #SUBDIRS += BPBIOS +SUBDIRS += RomDsk +SUBDIRS += HBIOS SUBDIRS += Images SUBDIRS += ZRC SUBDIRS += ZZR diff --git a/Source/RomDsk/Build.cmd b/Source/RomDsk/Build.cmd index 24f9bbed..5e784779 100644 --- a/Source/RomDsk/Build.cmd +++ b/Source/RomDsk/Build.cmd @@ -11,6 +11,9 @@ set ZXBINDIR=%TOOLS%/cpm/bin/ set ZXLIBDIR=%TOOLS%/cpm/lib/ set ZXINCDIR=%TOOLS%/cpm/include/ +set RomApps1=assign mode rtc syscopy xm +set RomApps2=fdu format survey sysgen talk timer inttest + :: :: Make all variants of the ROM Disk contents image. Three sizes are :: created for each of the different ROM sizes possible (256K, 512K, 1024K). @@ -21,45 +24,46 @@ set ZXINCDIR=%TOOLS%/cpm/include/ :: the final ROM size less 128K. :: +set RomApps= + copy NUL rom128_wbw.dat copy NUL rom128_una.dat :: MakeDisk -set RomApps=assign mode rtc syscopy xm +set RomApps=%RomApps1% -call :MakeDisk rom256_wbw 0x20000 wbw_rom256 ROM_256KB wbw -call :MakeDisk rom256_una 0x20000 wbw_rom256 ROM_256KB una +call :MakeDisk rom256_wbw 256 0x20000 wbw +call :MakeDisk rom256_una 256 0x20000 una -set RomApps=%RomApps% fdu format survey sysgen talk timer inttest +set RomApps=%RomApps1% %RomApps2% -call :MakeDisk rom512_wbw 0x60000 wbw_rom512 ROM_512KB wbw -call :MakeDisk rom512_una 0x60000 wbw_rom512 ROM_512KB una +call :MakeDisk rom512_wbw 512 0x60000 wbw +call :MakeDisk rom512_una 512 0x60000 una -call :MakeDisk rom1024_wbw 0xE0000 wbw_rom1024 ROM_1024KB wbw -call :MakeDisk rom1024_una 0xE0000 wbw_rom1024 ROM_1024KB una +call :MakeDisk rom1024_wbw 1024 0xE0000 wbw +call :MakeDisk rom1024_una 1024 0xE0000 una goto :eof :MakeDisk set Output=%1 -set Size=%2 -set Format=%3 -set Content=%4 -set Bios=%5 +set RomSize=%2 +set ImgSize=%3 +set Bios=%4 echo Making ROM Disk %Output% :: Create the empty disk image file -srec_cat -Generate 0 %Size% --Constant 0xE5 -Output %Output%.dat -Binary || exit /b +srec_cat -Generate 0 %ImgSize% --Constant 0xE5 -Output %Output%.dat -Binary || exit /b :: Populate the disk image via cpmtools -cpmcp -f %Format% %Output%.dat %Content%/*.* 0: || exit /b -for %%f in (%RomApps%) do cpmcp -f %Format% %Output%.dat ../../Binary/Apps/%%f.com 0: || exit /b -cpmcp -f %Format% %Output%.dat ..\cpm22\cpm_%Bios%.sys 0:cpm.sys || exit /b -cpmcp -f %Format% %Output%.dat ..\zsdos\zsys_%Bios%.sys 0:zsys.sys || exit /b +cpmcp -f wbw_rom%RomSize% %Output%.dat ROM_%RomSize%KB/*.* 0: || exit /b +for %%f in (%RomApps%) do cpmcp -f wbw_rom%RomSize% %Output%.dat ../../Binary/Apps/%%f.com 0: || exit /b +cpmcp -f wbw_rom%RomSize% %Output%.dat ..\cpm22\cpm_%Bios%.sys 0:cpm.sys || exit /b +cpmcp -f wbw_rom%RomSize% %Output%.dat ..\zsdos\zsys_%Bios%.sys 0:zsys.sys || exit /b :: Mark all disk files R/O for safety -cpmchattr -f %Format% %Output%.dat r 0:*.* || exit /b +cpmchattr -f wbw_rom%RomSize% %Output%.dat r 0:*.* || exit /b goto :eof diff --git a/Source/RomDsk/Makefile b/Source/RomDsk/Makefile new file mode 100644 index 00000000..7f4837ac --- /dev/null +++ b/Source/RomDsk/Makefile @@ -0,0 +1,36 @@ +OBJECTS = rom128_wbw.dat rom128_una.dat rom256_wbw.dat rom256_una.dat rom512_wbw.dat rom512_una.dat rom1024_wbw.dat rom1024_una.dat +OTHERS=*.dat + +TOOLS = ../../Tools +include $(TOOLS)/Makefile.inc + +.SHELLFLAGS = -ce + +ROMAPPS1 := assign mode rtc syscopy xm +ROMAPPS2 := fdu format survey sysgen talk timer inttest + +rom256_%.dat: ROMSIZ=256 +rom512_%.dat: ROMSIZ=512 +rom1024_%.dat: ROMSIZ=1024 + +rom256_%.dat: IMGSIZ=0x20000 +rom512_%.dat: IMGSIZ=0x60000 +rom1024_%.dat: IMGSIZ=0xE0000 + +rom256_%.dat: ROMAPPS=$(ROMAPPS1) +rom512_%.dat rom1024_%.dat: ROMAPPS=$(ROMAPPS1) $(ROMAPPS2) + +rom%_wbw.dat: BIOS=wbw +rom%_una.dat: BIOS=una + +rom128%.dat: + >$@ + +%.dat: + ### Making ROM Disk $@ + srec_cat -Generate 0 $(IMGSIZ) --Constant 0xE5 -Output $@ -Binary + $(CPMCP) -f wbw_rom$(ROMSIZ) $@ ROM_$(ROMSIZ)KB/*.* 0: + for i in $(ROMAPPS) ; do $(CPMCP) -f wbw_rom$(ROMSIZ) $@ ../../Binary/Apps/$$i.com 0: ; done + $(CPMCP) -f wbw_rom$(ROMSIZ) $@ ../CPM22/cpm_$(BIOS).sys 0:cpm.sys + $(CPMCP) -f wbw_rom$(ROMSIZ) $@ ../ZSDOS/zsys_$(BIOS).sys 0:zsys.sys + $(CPMCHATTR) -f wbw_rom$(ROMSIZ) $@ r 0:*.* diff --git a/Source/ver.inc b/Source/ver.inc index dcd01dd9..e08be308 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.97" +#DEFINE BIOSVER "3.1.1-pre.98" diff --git a/Source/ver.lib b/Source/ver.lib index 38ce6f26..ff52a610 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.97" + db "3.1.1-pre.98" endm diff --git a/Tools/Makefile.inc b/Tools/Makefile.inc index 28cb24fc..32ad2bb0 100644 --- a/Tools/Makefile.inc +++ b/Tools/Makefile.inc @@ -43,6 +43,7 @@ TASMFLAGS= OPENSPIN=$(BINDIR)/openspin BSTC=$(BINDIR)//bstc CPMCP=$(BINDIR)/cpmcp +CPMCHATTR=$(BINDIR)/cpmchattr # # directory containing cpm binaries @@ -84,7 +85,7 @@ CPM=$(TOOLS)/cpm/bin mv $$($(CASEFN) $@) tmp.com ; mv tmp.com $@ %.bin: %.asm - $(TASM) $(TASMFLAGS) $< $@ $*.lst + $(TASM) $(TASMFLAGS) $< $@ $(basename $<).lst %.rel: %.asm $(ZXCC) $(CPM)/RMAC -$< From 7fafb5cc4b6684a16a730386bde404523cc8d727 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 26 Jul 2021 20:04:03 -0700 Subject: [PATCH 07/16] More Make and Build Tweaks --- Source/Forth/Makefile | 1 - Source/HBIOS/Build.sh | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Forth/Makefile b/Source/Forth/Makefile index 51fbdee2..be6e1607 100644 --- a/Source/Forth/Makefile +++ b/Source/Forth/Makefile @@ -1,6 +1,5 @@ OBJECTS = camel80.bin TOOLS = ../../Tools OTHERS = *.rel -DEST = ../HBIOS include $(TOOLS)/Makefile.inc diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 777985dc..476f0306 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -3,6 +3,9 @@ # fail on any error set -e +# overcome clock resolution issues +sleep 2 + timestamp=$(date +%Y-%m-%d) #timestamp="2020-02-24" From 2a754c8fc6570ba3bfb2314574824a4185eeaa1f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 26 Jul 2021 20:29:20 -0700 Subject: [PATCH 08/16] Update Build.sh --- Source/HBIOS/Build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 476f0306..36732cce 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -3,9 +3,6 @@ # fail on any error set -e -# overcome clock resolution issues -sleep 2 - timestamp=$(date +%Y-%m-%d) #timestamp="2020-02-24" @@ -101,3 +98,6 @@ else cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$romname.upd cat hbios_app.bin osimg_small.bin > $romname.com fi + +# make sure everything is rebuilt on subsequent iterations +rm -f hbios_*.bin From e2d586ca3c4dbbc2dca32eb07069f5645d4007b6 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 27 Jul 2021 11:40:10 -0700 Subject: [PATCH 09/16] More Make and Build Tweaks --- Makefile | 2 +- Source/{HBIOS => RomDsk}/diskdefs | 0 Tools/Makefile.inc | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename Source/{HBIOS => RomDsk}/diskdefs (100%) diff --git a/Makefile b/Makefile index 741e5ef7..f4c60c14 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ all: + echo SHELL=$(SHELL) $(MAKE) --directory Tools/unix $(MAKE) --directory Source @@ -15,4 +16,3 @@ clobber: diff: $(MAKE) --directory Source diff - diff --git a/Source/HBIOS/diskdefs b/Source/RomDsk/diskdefs similarity index 100% rename from Source/HBIOS/diskdefs rename to Source/RomDsk/diskdefs diff --git a/Tools/Makefile.inc b/Tools/Makefile.inc index 32ad2bb0..675535b9 100644 --- a/Tools/Makefile.inc +++ b/Tools/Makefile.inc @@ -123,6 +123,7 @@ endif # first target is default # all:: $(OBJECTS) + echo SHELL=$(SHELL) @for dir in $(SUBDIRS) ; do \ $(MAKE) --directory $$dir all ; \ done From 2809ba5b6dc4d018dc331d09004e591f4160e498 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 27 Jul 2021 12:10:33 -0700 Subject: [PATCH 10/16] More Make and Build Tweaks --- Makefile | 1 - Source/HBIOS/Build.sh | 6 +++--- Tools/Makefile.inc | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index f4c60c14..40ad2bcd 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ all: - echo SHELL=$(SHELL) $(MAKE) --directory Tools/unix $(MAKE) --directory Source diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 36732cce..4f4b9544 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -59,6 +59,9 @@ fi outdir=../../Binary +# Help make realize that build.inc has changed +sleep 1 + cat <<- EOF > build.inc ; RomWBW Configured for $platform $config $timestamp ; @@ -98,6 +101,3 @@ else cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$romname.upd cat hbios_app.bin osimg_small.bin > $romname.com fi - -# make sure everything is rebuilt on subsequent iterations -rm -f hbios_*.bin diff --git a/Tools/Makefile.inc b/Tools/Makefile.inc index 675535b9..32ad2bb0 100644 --- a/Tools/Makefile.inc +++ b/Tools/Makefile.inc @@ -123,7 +123,6 @@ endif # first target is default # all:: $(OBJECTS) - echo SHELL=$(SHELL) @for dir in $(SUBDIRS) ; do \ $(MAKE) --directory $$dir all ; \ done From e544e21f047120af8f68210f0131c279a86a61d9 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 28 Jul 2021 16:28:02 -0700 Subject: [PATCH 11/16] Make Refactoring --- .github/workflows/commit.yml | 4 +- .github/workflows/release.yml | 2 +- Binary/Makefile | 2 +- Makefile | 3 + Source/HBIOS/Build.cmd | 37 ++++++++++ Source/HBIOS/Build.sh | 135 +++++++++++++++++----------------- Source/HBIOS/Makefile | 93 ++++++++++++----------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- Tools/Makefile.inc | 4 +- 10 files changed, 161 insertions(+), 123 deletions(-) diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml index 39efadf0..e2e2af8a 100644 --- a/.github/workflows/commit.yml +++ b/.github/workflows/commit.yml @@ -23,7 +23,7 @@ jobs: export TZ='America/Los_Angeles' sudo apt-get install libncurses-dev sudo apt-get install srecord - make + make dist make clean rm -rf .git* @@ -49,7 +49,7 @@ jobs: run: | export TZ='America/Los_Angeles' brew install srecord - make + make dist make clean rm -rf .git* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5e5fbaaf..4a814905 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ jobs: - name: Build run: | sudo apt-get install libncurses-dev - make + make dist make clean rm -rf .git* diff --git a/Binary/Makefile b/Binary/Makefile index c5a288e1..cdca45ae 100644 --- a/Binary/Makefile +++ b/Binary/Makefile @@ -5,4 +5,4 @@ SUBDIRS = Apps CPM3 ZPM3 include $(TOOLS)/Makefile.inc clobber:: - @rm -f *.bin *.com *.img *.rom *.hex *.pdf *.log *.eeprom *.dat + @rm -f *.bin *.com *.img *.rom *.upd *.hex *.pdf *.log *.eeprom *.dat diff --git a/Makefile b/Makefile index 40ad2bcd..a9c1abae 100644 --- a/Makefile +++ b/Makefile @@ -15,3 +15,6 @@ clobber: diff: $(MAKE) --directory Source diff + +dist: + $(MAKE) ROM_PLATFORM=dist diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index 64bd4a01..7283590f 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -1,6 +1,8 @@ @echo off setlocal +if %1 == dist goto :dist + :: :: Build [ [ [ []]]] :: @@ -158,3 +160,38 @@ tasm -t80 -g3 -fFF %1.asm %1.bin %1.lst || exit /b goto :eof +:: +:: Build all of the official distribution ROMs +:: + +:dist + +call Build SBC std 512 || exit /b +call Build SBC simh 512 || exit /b +call Build MBC std 512 || exit /b +call Build ZETA std 512 || exit /b +call Build ZETA2 std 512 || exit /b +call Build N8 std 512 || exit /b +call Build MK4 std 512 || exit /b +call Build RCZ80 std 512 || exit /b +call Build RCZ80 skz 512 || exit /b +call Build RCZ80 kio 512 || exit /b +call Build RCZ80 mt 512 || exit /b +call Build RCZ80 duart 512 || exit /b +call Build RCZ80 zrc 512 || exit /b +call Build RCZ180 ext 512 || exit /b +call Build RCZ180 nat 512 || exit /b +call Build RCZ280 ext 512 || exit /b +call Build RCZ280 nat 512 || exit /b +call Build RCZ280 nat_zz 512 || exit /b +call Build RCZ280 nat_zzr 256 || exit /b +call Build SCZ180 126 512 || exit /b +call Build SCZ180 130 512 || exit /b +call Build SCZ180 131 512 || exit /b +call Build SCZ180 140 512 || exit /b +call Build EZZ80 std 512 || exit /b +call Build EZZ80 tz80 512 || exit /b +call Build DYNO std 512 || exit /b +call Build UNA std 512 || exit /b + +goto :eof diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 4f4b9544..3ced548c 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -3,101 +3,102 @@ # fail on any error set -e -timestamp=$(date +%Y-%m-%d) -#timestamp="2020-02-24" - -if [ $1 == '-d' ] ; then - shift - diffdir=$1 - shift - if [ -f $diffdir/build.inc ] ; then - timestamp=$(grep TIMESTAMP $diffdir/build.inc | awk '{print $3}' | tr -d '\015"') - echo diff build using $timestamp - fi +export ROM_PLATFORM +export ROM_CONFIG +export ROMSIZE + +if [ "${ROM_PLATFORM}" == "dist" ] ; then + echo "!!!DISTRIBUTION BUILD!!!" + ROM_PLATFORM="DYNO"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="EZZ80"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="EZZ80"; ROM_CONFIG="tz80"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="MK4"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="N8"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ180"; ROM_CONFIG="ext"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ180"; ROM_CONFIG="nat"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ280"; ROM_CONFIG="ext"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ280"; ROM_CONFIG="nat"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ280"; ROM_CONFIG="nat_zz"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ280"; ROM_CONFIG="nat_zzr"; ROMSIZE="256"; bash Build.sh + ROM_PLATFORM="RCZ80"; ROM_CONFIG="kio"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ80"; ROM_CONFIG="mt"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ80"; ROM_CONFIG="duart"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ80"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ80"; ROM_CONFIG="skz"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="SBC"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="SBC"; ROM_CONFIG="simh"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="MBC"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="SCZ180"; ROM_CONFIG="126"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="SCZ180"; ROM_CONFIG="130"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="SCZ180"; ROM_CONFIG="131"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="SCZ180"; ROM_CONFIG="140"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="UNA"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="ZETA"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + ROM_PLATFORM="ZETA2"; ROM_CONFIG="std"; ROMSIZE="512"; bash Build.sh + exit fi -# positional arguments -platform=$1 -config=$2 -romsize=$3 -romname=$4 - -export platform +###if [ $1 == '-d' ] ; then +### shift +### diffdir=$1 +### shift +### if [ -f $diffdir/build.inc ] ; then +### timestamp=$(grep TIMESTAMP $diffdir/build.inc | awk '{print $3}' | tr -d '\015"') +### echo diff build using $timestamp +### fi +###fi # prompt if no match platforms=($(find Config -name \*.asm -print | \ sed -e 's,Config/,,' -e 's/_.*$//' | sort -u)) -while ! echo ${platforms[@]} | grep -q -w -s "$platform" ; do +while ! echo ${platforms[@]} | grep -q -w -s "${ROM_PLATFORM}" ; do echo -n "Enter platform [" ${platforms[@]} "] :" - read platform + read ROM_PLATFORM done -configs=$(find Config -name ${platform}_\* -print | \ - sed -e 's,Config/,,' -e "s/${platform}_//" -e "s/.asm//") -while ! echo ${configs[@]} | grep -s -w -q "$config" ; do +configs=$(find Config -name ${ROM_PLATFORM}_\* -print | \ + sed -e 's,Config/,,' -e "s/${ROM_PLATFORM}_//" -e "s/.asm//") +while ! echo ${configs[@]} | grep -s -w -q "${ROM_CONFIG}" ; do echo -n "Enter config for $platform [" ${configs[@]} "] :" - read config + read ROM_CONFIG done -configfile=Config/${platform}_${config}.asm -while [ ! '(' "$romsize" = 1024 -o "$romsize" = 512 -o "$romsize" = 256 -o "$romsize" = 128 ')' ] ; do +CONFIGFILE=Config/${ROM_PLATFORM}_${ROM_CONFIG}.asm + +while [ ! '(' "${ROMSIZE}" = 1024 -o "${ROMSIZE}" = 512 -o "${ROMSIZE}" = 256 -o "${ROMSIZE}" = 128 ')' ] ; do echo -n "Romsize :" - read romsize + read ROMSIZE done -if [ -z "$romname" ] ; then - romname=${platform}_${config} +if [ -z "${ROMNAME}" ] ; then + ROMNAME=${ROM_PLATFORM}_${ROM_CONFIG} fi -echo Building for $romname for $platform $config $romsize -if [ $platform == UNA ] ; then - BIOS=una -else - BIOS=wbw -fi +TIMESTAMP=$(date +%Y-%m-%d) -outdir=../../Binary +CONFIGFILE=Config/${ROM_PLATFORM}_${ROM_CONFIG}.asm -# Help make realize that build.inc has changed -sleep 1 +echo Building $ROMNAME for $ROM_PLATFORM $ROM_CONFIG $ROMSIZE cat <<- EOF > build.inc -; RomWBW Configured for $platform $config $timestamp +; RomWBW Configured for ${ROM_PLATFORM} ${ROM_CONFIG} ${TIMESTAMP} ; -#DEFINE TIMESTAMP "$timestamp" +#DEFINE TIMESTAMP "${TIMESTAMP}" ; -ROMSIZE .EQU $romsize +ROMSIZE .EQU ${ROMSIZE} ; -#INCLUDE "$configfile" +#INCLUDE "${CONFIGFILE}" ; EOF -make prereq - -make dbgmon.bin romldr.bin - -if [ $platform != UNA ] ; then - make nascom.bin tastybasic.bin game.bin eastaegg.bin updater.bin usrrom.bin imgpad2.bin - make hbios_rom.bin hbios_app.bin hbios_img.bin +export OBJECTS +OBJECTS="${ROMNAME}.rom" +if [ "${ROM_PLATFORM}" != "UNA" ] ; then + OBJECTS+=" ${ROMNAME}.com ${ROMNAME}.upd" fi -echo "Building $romname output files..." +#echo OBJECTS=${OBJECTS} -cat romldr.bin dbgmon.bin ../ZSDOS/zsys_$BIOS.bin ../CPM22/cpm_$BIOS.bin >osimg.bin -cat romldr.bin dbgmon.bin ../ZSDOS/zsys_$BIOS.bin >osimg_small.bin - -if [ $platform != UNA ] ; then - cat camel80.bin nascom.bin tastybasic.bin game.bin eastaegg.bin netboot.mod updater.bin usrrom.bin >osimg1.bin - cat imgpad2.bin >osimg2.bin -fi - -if [ $platform = UNA ] ; then - cp osimg.bin $outdir/UNA_WBW_SYS.bin - cp ../RomDsk/rom${romsize}_una.dat $outdir/UNA_WBW_ROM$romsize.bin - cat ../UBIOS/UNA-BIOS.BIN osimg.bin ../UBIOS/FSFAT.BIN ../RomDsk/rom${romsize}_una.dat >$romname.rom -else - cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ../RomDsk/rom${romsize}_wbw.dat >$romname.rom - cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$romname.upd - cat hbios_app.bin osimg_small.bin > $romname.com -fi +make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE} diff --git a/Source/HBIOS/Makefile b/Source/HBIOS/Makefile index 19d4eade..b243380a 100644 --- a/Source/HBIOS/Makefile +++ b/Source/HBIOS/Makefile @@ -1,38 +1,3 @@ -ifndef ROM_CONFIG - ROM_CONFIG=std -endif - -ifdef ROM_PLATFORM - OBJECTS = ${ROM_PLATFORM}_${ROM_CONFIG}.rom ${ROM_PLATFORM}_${ROM_CONFIG}.com ${ROM_PLATFORM}_${ROM_CONFIG}.upd -else - OBJECTS += DYNO_std.rom DYNO_std.com DYNO_std.upd - OBJECTS += EZZ80_std.rom EZZ80_std.com EZZ80_std.upd - OBJECTS += EZZ80_tz80.rom EZZ80_tz80.com EZZ80_tz80.upd - OBJECTS += MK4_std.rom MK4_std.com MK4_std.upd - OBJECTS += N8_std.rom N8_std.com N8_std.upd - OBJECTS += RCZ180_ext.rom RCZ180_ext.com RCZ180_ext.upd - OBJECTS += RCZ180_nat.rom RCZ180_nat.com RCZ180_nat.upd - OBJECTS += RCZ280_ext.rom RCZ280_ext.com RCZ280_ext.upd - OBJECTS += RCZ280_nat.rom RCZ280_nat.com RCZ280_nat.upd - OBJECTS += RCZ280_nat_zz.rom RCZ280_nat_zz.com RCZ280_nat_zz.upd - OBJECTS += RCZ280_nat_zzr.rom RCZ280_nat_zzr.com RCZ280_nat_zzr.upd - OBJECTS += RCZ80_kio.rom RCZ80_kio.com RCZ80_kio.upd - OBJECTS += RCZ80_mt.rom RCZ80_mt.com RCZ80_mt.upd - OBJECTS += RCZ80_duart.rom RCZ80_duart.com RCZ80_duart.upd - OBJECTS += RCZ80_std.rom RCZ80_std.com RCZ80_std.upd - OBJECTS += RCZ80_skz.rom RCZ80_skz.com RCZ80_skz.upd - OBJECTS += RCZ80_zrc.rom RCZ80_zrc.com RCZ80_zrc.upd - OBJECTS += SBC_std.rom SBC_std.com SBC_std.upd - OBJECTS += SBC_simh.rom SBC_simh.com SBC_simh.upd - OBJECTS += MBC_std.rom MBC_std.com MBC_std.upd - OBJECTS += SCZ180_126.rom SCZ180_126.com SCZ180_126.upd - OBJECTS += SCZ180_130.rom SCZ180_130.com SCZ180_130.upd - OBJECTS += SCZ180_131.rom SCZ180_131.com SCZ180_131.upd - OBJECTS += SCZ180_140.rom SCZ180_140.com SCZ180_140.upd - OBJECTS += UNA_std.rom - OBJECTS += ZETA_std.rom ZETA_std.com ZETA_std.upd - OBJECTS += ZETA2_std.rom ZETA2_std.com ZETA2_std.upd -endif MOREDIFF = camel80.bin game.bin hbios_rom.bin nascom.bin prefix.bin usrrom.bin \ dbgmon.bin hbios_app.bin imgpad2.bin osimg1.bin osimg2.bin romldr.bin \ @@ -42,16 +7,16 @@ MOREDIFF = camel80.bin game.bin hbios_rom.bin nascom.bin prefix.bin usrrom.bin \ SUBDIRS = DEST = ../../Binary TOOLS =../../Tools -OTHERS = *.img *.rom *.com *.bin *.z80 cpm.sys zsys.sys Build.inc font*.asm *.dat +OTHERS = *.img *.rom *.com *.upd *.bin *.z80 cpm.sys zsys.sys Build.inc font*.asm *.dat include $(TOOLS)/Makefile.inc FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm font8x8c.asm font8x8u.asm -ifneq ($(findstring $(platform), N8 MK4 RCZ180 SCZ180 DYNO),) +ifneq ($(findstring $(ROM_PLATFORM), N8 MK4 RCZ180 SCZ180 DYNO),) TASM=$(BINDIR)/uz80as -t hd64180 endif -ifneq ($(findstring $(platform), RCZ280),) +ifneq ($(findstring $(ROM_PLATFORM), RCZ280),) TASM=$(BINDIR)/uz80as -t z280 endif @@ -61,15 +26,47 @@ endif DIFFPATH = $(DIFFTO)/Binary -ROMSIZE=512 +DEPS=prereq dbgmon.bin romldr.bin nascom.bin tastybasic.bin game.bin eastaegg.bin updater.bin usrrom.bin imgpad2.bin -N8_std.rom: ROMSIZE=512 -RCZ280_nat_zzr.rom: ROMSIZE=256 +ifeq ($(ROM_PLATFORM),UNA) + ROMDEPS=romldr.bin dbgmon.bin + BIOS=una +else + ROMDEPS=hbios_rom.bin hbios_app.bin hbios_img.bin + BIOS=wbw +endif + +ROMNAME=${ROM_PLATFORM}_${ROM_CONFIG} + +#$(info DEPS=$(DEPS)) +#$(info ROM_PLATFORM=$(ROM_PLATFORM)) +#$(info ROM_CONFIG=$(ROM_CONFIG)) +#$(info ROMSIZE=$(ROMSIZE)) +#$(info ROMNAME=$(ROMNAME)) + +all:: + if [ -z "$(OBJECTS)" ] ; then \ + chmod +x Build.sh + bash Build.sh ; \ + fi + +$(ROMNAME).rom $(ROMNAME).com $(ROMNAME).img &: $(ROMDEPS) + cat romldr.bin dbgmon.bin ../ZSDOS/zsys_$(BIOS).bin ../CPM22/cpm_$(BIOS).bin >osimg.bin + cat romldr.bin dbgmon.bin ../ZSDOS/zsys_$(BIOS).bin >osimg_small.bin + if [ $(ROM_PLATFORM) != UNA ] ; then \ + cat camel80.bin nascom.bin tastybasic.bin game.bin eastaegg.bin netboot.mod updater.bin usrrom.bin >osimg1.bin ; \ + cat imgpad2.bin >osimg2.bin ; \ + fi + if [ $(ROM_PLATFORM) = UNA ] ; then \ + cp osimg.bin $(DEST)/UNA_WBW_SYS.bin ; \ + cp ../RomDsk/rom$(ROMSIZE)_una.dat $(DEST)/UNA_WBW_ROM$(ROMSIZE).bin ; \ + cat ../UBIOS/UNA-BIOS.BIN osimg.bin ../UBIOS/FSFAT.BIN ../RomDsk/rom$(ROMSIZE)_una.dat >$(ROMNAME).rom ; \ + else \ + cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ../RomDsk/rom$(ROMSIZE)_wbw.dat >$(ROMNAME).rom ; \ + cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \ + cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \ + fi -%.rom %.upd %.com: - chmod +x Build.sh - bash Build.sh $(DIFFBUILD) $(shell echo $* | sed 's/_/ /') $(ROMSIZE) - prereq: $(FONTS) camel80.bin font%.asm: @@ -78,13 +75,13 @@ font%.asm: camel80.bin: cp ../Forth/$@ . -hbios_rom.bin: hbios.asm build.inc +hbios_rom.bin: hbios.asm build.inc $(DEPS) $(TASM) -dROMBOOT hbios.asm hbios_rom.bin hbios_rom.lst -hbios_app.bin: hbios.asm build.inc +hbios_app.bin: hbios.asm build.inc $(DEPS) $(TASM) -dAPPBOOT hbios.asm hbios_app.bin hbios_app.lst -hbios_img.bin: hbios.asm build.inc +hbios_img.bin: hbios.asm build.inc $(DEPS) $(TASM) -dIMGBOOT hbios.asm hbios_img.bin hbios_img.lst romldr.bin: build.inc diff --git a/Source/ver.inc b/Source/ver.inc index e08be308..aff97ccb 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.98" +#DEFINE BIOSVER "3.1.1-pre.99" diff --git a/Source/ver.lib b/Source/ver.lib index ff52a610..7b5ac37c 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.98" + db "3.1.1-pre.99" endm diff --git a/Tools/Makefile.inc b/Tools/Makefile.inc index 32ad2bb0..48910ec8 100644 --- a/Tools/Makefile.inc +++ b/Tools/Makefile.inc @@ -126,13 +126,13 @@ all:: $(OBJECTS) @for dir in $(SUBDIRS) ; do \ $(MAKE) --directory $$dir all ; \ done - @if [ "$(DEST)" ] ; then for file in $(filter-out $(NOCOPY),$(OBJECTS)) ; do \ + @if [ "$(DEST)" ] && [ "$(OBJECTS)" ] ; then for file in $(filter-out $(NOCOPY),$(OBJECTS)) ; do \ mkdir -p $(DEST) ; \ echo Copying $$file to $(DEST) ; \ rm -f /tmp/casefn.cache ; \ cp $$($(CASEFN) $$file) $(DEST) ; \ done ; fi - @if [ "$(DOCDEST)" ] ; then for file in $(DOCS) ; do \ + @if [ "$(DOCDEST)" ] && [ "$(DOCS)" ] ; then for file in $(DOCS) ; do \ mkdir -p $(DOCDEST) ; \ echo Copying $$file to $(DOCDEST) ; \ rm -f /tmp/casefn.cache ; \ From fc3b7f43ce92960f38bf46115631474090f11ca4 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 28 Jul 2021 16:52:15 -0700 Subject: [PATCH 12/16] Update Makefile --- Source/HBIOS/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/Makefile b/Source/HBIOS/Makefile index b243380a..82cdaaaa 100644 --- a/Source/HBIOS/Makefile +++ b/Source/HBIOS/Makefile @@ -46,7 +46,7 @@ ROMNAME=${ROM_PLATFORM}_${ROM_CONFIG} all:: if [ -z "$(OBJECTS)" ] ; then \ - chmod +x Build.sh + chmod +x Build.sh ; \ bash Build.sh ; \ fi From 150a02358e6662adf5d5a172f0b61afb50cf1c68 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 28 Jul 2021 17:19:31 -0700 Subject: [PATCH 13/16] Support MBC FDC in HBIOS - Not yet tested. --- Doc/ChangeLog.txt | 2 ++ Source/HBIOS/Config/MBC_std.asm | 2 ++ Source/HBIOS/cfg_dyno.asm | 2 +- Source/HBIOS/cfg_ezz80.asm | 2 +- Source/HBIOS/cfg_master.asm | 2 +- Source/HBIOS/cfg_mbc.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz280.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 2 +- Source/HBIOS/cfg_sbc.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/cfg_zeta.asm | 2 +- Source/HBIOS/cfg_zeta2.asm | 2 +- Source/HBIOS/fd.asm | 21 ++++++++++++++++----- Source/HBIOS/std.asm | 1 + Source/ver.inc | 2 +- Source/ver.lib | 2 +- 19 files changed, 36 insertions(+), 20 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index ad5a0dca..69098fd3 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -46,6 +46,8 @@ Version 3.1.1 - AJL: Added ramtest app (requires SBC and MBC for now) - L?N: Provided SCOPY, XSUB01, and EX applications - WBW: Added support for MBC FDC to FDU application +- WBW: Added support for MBC FDC to HBIOS +- WBW: Refactored make process Version 3.1 ----------- diff --git a/Source/HBIOS/Config/MBC_std.asm b/Source/HBIOS/Config/MBC_std.asm index a8c21dcd..ef9ca19a 100644 --- a/Source/HBIOS/Config/MBC_std.asm +++ b/Source/HBIOS/Config/MBC_std.asm @@ -29,6 +29,8 @@ ; BATCOND .SET FALSE ; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; DSKYENABLE .SET FALSE ; ENABLES DSKY diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index c83fa6a7..d848cf7b 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -124,7 +124,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_DYNO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_DYNO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index c858c2c7..96d55c21 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -155,7 +155,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 4a198c10..18497330 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -211,7 +211,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_NONE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_NONE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index ac0c488c..d74e37d7 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -148,7 +148,7 @@ MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_MBC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 726c33b9..3f5fa49b 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -146,7 +146,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 8a597d4f..032f7ccc 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -148,7 +148,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index a98fa0b8..5c2ce5b3 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -162,7 +162,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index d807eb5a..77d054fb 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -178,7 +178,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index c0b45afa..7374f0c8 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -167,7 +167,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 1ad20a3e..3f0ab5c0 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -148,7 +148,7 @@ MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 939f8f88..50ce8893 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -157,7 +157,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 79740aa2..8b1aa2af 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -120,7 +120,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 5cbdb2eb..7f71ec8a 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -131,7 +131,7 @@ MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index eb26ac96..3e7bd1c0 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -68,6 +68,13 @@ FDC_DOR .EQU $4A ; DIGITAL OUTPUT REGISTER FDC_DCR .EQU $4B ; CONFIGURATION CONTROL REGISTER FDC_TC .EQU $4C ; TERMINAL COUNT (W/ DACK) #ENDIF +#IF (FDMODE == FDMODE_MBC) +FDC_MSR .EQU $30 ; 8272 MAIN STATUS REGISTER +FDC_DATA .EQU $31 ; 8272 DATA PORT +FDC_DOR .EQU $36 ; DIGITAL OUTPUT REGISTER +FDC_DCR .EQU $35 ; CONFIGURATION CONTROL REGISTER +FDC_TC .EQU $37 ; TERMINAL COUNT (W/ DACK) +#ENDIF ; ; DISK OPERATIONS ; @@ -406,7 +413,7 @@ DOR_INIT .EQU 11100000B ; INITIAL DEFAULT LATCH VALUE ; ; *** DIDE/N8/ZETA V2 *** ; -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) DOR_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED DOR_BR250 .EQU DOR_INIT DOR_BR500 .EQU DOR_INIT @@ -689,6 +696,10 @@ FD_INIT: #IF (FDMODE == FDMODE_EPFDC) PRTS("EPFDC$") #ENDIF +; +#IF (FDMODE == FDMODE_MBC) + PRTS("MBC$") +#ENDIF ; PRTS(" IO=0x$") LD A,FDC_MSR @@ -1343,7 +1354,7 @@ FC_SETDOR: ; ; SET FST_DCR ; -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) ; FC_SETDCR LD (FST_DCR),A @@ -1375,7 +1386,7 @@ FC_RESETFDC: #IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_RCSMC)) RES 7,A #ENDIF -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) LD A,0 #ENDIF CALL FC_SETDOR @@ -1390,7 +1401,7 @@ FC_RESETFDC: ; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE ; FC_PULSETC: -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) IN A,(FDC_TC) #ELSE LD A,(FST_DOR) @@ -1447,7 +1458,7 @@ FC_MOTORON1: CP C ; COMPARE TO NEW MOTOR BITS RET Z ; SKIP DELAY, MOTOR WAS ALREADY ON #ENDIF -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) ; SETUP DCR FOR DIDE HARDWARE LD A,(FCD_DCR) ; GET NEW DCR VALUE CALL FC_SETDCR ; AND IMPLEMENT IT diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 83050926..21f66057 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -167,6 +167,7 @@ FDMODE_RCSMC .EQU 7 ; RC2014 SMC 9266 @ $40 (SCOTT BAKER) FDMODE_RCWDC .EQU 8 ; RC2014 WDC 37C65 @ $40 (SCOTT BAKER) FDMODE_DYNO .EQU 9 ; DYNO WDC 37C65 @ $84 FDMODE_EPFDC .EQU 10 ; RC2014 ETCHED PIXELS FDC +FDMODE_MBC .EQU 11 ; MULTI-BOARD COMPUTER FDC ; ; IDE MODE SELECTIONS ; diff --git a/Source/ver.inc b/Source/ver.inc index aff97ccb..d11bc59a 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.99" +#DEFINE BIOSVER "3.1.1-pre.100" diff --git a/Source/ver.lib b/Source/ver.lib index 7b5ac37c..17928200 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.99" + db "3.1.1-pre.100" endm From d6a348d110aec3b789e539f6978e68ce9775716e Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 29 Jul 2021 09:40:41 -0700 Subject: [PATCH 14/16] Inject ROM Checksum - A ROM checksum is now injected into the last byte of the ROM banks. This does not apply to the ROM disk banks, just the first 4 banks that contain code images. - Fix build prompting - Fix SCOPY help files --- Source/Build.cmd | 6 +- Source/HBIOS/Build.cmd | 12 +- Source/HBIOS/Makefile | 3 + Source/Images/d_zpm3/u10/SCOPY.HLP | 4 +- Source/Images/d_zpm3/u10/SCOPY10F.HLP | 369 ++++++++++++++++++++++++++ 5 files changed, 390 insertions(+), 4 deletions(-) create mode 100644 Source/Images/d_zpm3/u10/SCOPY10F.HLP diff --git a/Source/Build.cmd b/Source/Build.cmd index e5ab6856..acbbb7bc 100644 --- a/Source/Build.cmd +++ b/Source/Build.cmd @@ -8,4 +8,8 @@ REM call BuildBP || exit /b call BuildImages || exit /b call BuildROM %* || exit /b call BuildZRC || exit /b -call BuildZZR || exit /b \ No newline at end of file +call BuildZZR || exit /b + +if "%1" == "dist" ( + call Clean || exit /b +) \ No newline at end of file diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index 7283590f..e0c3985e 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -1,7 +1,7 @@ @echo off setlocal -if %1 == dist goto :dist +if "%1" == "dist" goto :dist :: :: Build [ [ [ []]]] @@ -88,6 +88,16 @@ copy /b imgpad2.bin osimg2.bin || exit /b copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit /b +:: +:: Inject one byte checksum at the last byte of all 4 ROM bank image files. +:: This means that computing a checksum over any of the 32K osimg banks +:: should yield a result of zero. +:: + +for %%f in (hbios_rom.bin osimg.bin osimg1.bin osimg2.bin) do ( + "%TOOLS%\srecord\srec_cat.exe" %%f -Binary -Crop 0 0x7FFF -checksum-neg-b-e 0x7FFF 1 1 -o %%f -Binary +) + :: :: Create final images (.rom, .upd, & .com) :: The previously created bank images are concatenated as needed. diff --git a/Source/HBIOS/Makefile b/Source/HBIOS/Makefile index 82cdaaaa..11edb245 100644 --- a/Source/HBIOS/Makefile +++ b/Source/HBIOS/Makefile @@ -56,6 +56,9 @@ $(ROMNAME).rom $(ROMNAME).com $(ROMNAME).img &: $(ROMDEPS) if [ $(ROM_PLATFORM) != UNA ] ; then \ cat camel80.bin nascom.bin tastybasic.bin game.bin eastaegg.bin netboot.mod updater.bin usrrom.bin >osimg1.bin ; \ cat imgpad2.bin >osimg2.bin ; \ + for f in hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ; do \ + srec_cat $$f -Binary -Crop 0 0x7FFF -checksum-neg-b-e 0x7FFF 1 1 -o $$f -Binary ; \ + done \ fi if [ $(ROM_PLATFORM) = UNA ] ; then \ cp osimg.bin $(DEST)/UNA_WBW_SYS.bin ; \ diff --git a/Source/Images/d_zpm3/u10/SCOPY.HLP b/Source/Images/d_zpm3/u10/SCOPY.HLP index 7f4b3511..2d430bbd 100644 --- a/Source/Images/d_zpm3/u10/SCOPY.HLP +++ b/Source/Images/d_zpm3/u10/SCOPY.HLP @@ -2,7 +2,7 @@  SCOPY.COM  Size (recs) CRC Version Author/Latest Issue Disk - 17k (140) 62B8 1.0e Lars Nelson 2/13 + 18k (141) 62B8 1.0f Lars Nelson 7/21 15k (120) D6DB 0.8 Rob Friefeld 10/91 Z3COM19  1- Syntax 2- SCOPY Commands 3- Notes  @@ -38,7 +38,7 @@ master and which is the target directory. When re-logging from within SCOPY, the syntax has the same meaning, but remember that you will not necessarily be currently logged into the same directory as at startup. -:2 :SCOPY10e +:2 :SCOPY10F :3  SCOPY Notes  diff --git a/Source/Images/d_zpm3/u10/SCOPY10F.HLP b/Source/Images/d_zpm3/u10/SCOPY10F.HLP new file mode 100644 index 00000000..49d09ca6 --- /dev/null +++ b/Source/Images/d_zpm3/u10/SCOPY10F.HLP @@ -0,0 +1,369 @@ +; +======= S C O P Y H E L P ======= + + 1 Copy Move Delete Rename Kompare Quick Set + + 2 Jump ReJump Jump Tag Jump Untag Jump One Jump Two + + 3 Tag Untag Retag Wild Tag + + 4 View + + 5 GROUP Arc Copy Del Move View Kompare Quick Set + + 6 GROUP Equate New + + 7 Cursor + + 8 Options + + 9 Miscellaneous Log Relog New Switch Execute Command +:1 + +C Copy - Send file at pointer to other directory. An arrow at + the top of the screen shows the copy direction. Copying is + controlled by verification flags described below. If there is + inadequate space on the destination disk, the copy is not + attempted, and (for Group operations) the file remains tagged. + +D Delete - Delete file at pointer. + +M Move - Copy, then delete source file. + +R Rename + Rename does not integrate too well with SCOPY's method of file + display. In fact, the display may become useless. Therefore + SCOPY requires a Relog before any copy operations are allowed + following a Rename. + + If an Archived file is renamed, the archive attribute is reset. + (Ditto the Public attribute.) + + ...more + + +Q Quick Copy - Copy current file to alternate directory. Saves + you the trouble of logging in the alternate directory. Quick + Copy bypasses any checks against the destination date stamp + or disk capacity. It is fast, but you don't get the full + benefit of Login. + + +K Kompare - Do a byte for byte comparison of source and + destination files, report the result on the screen divider as + "=" or "~". For Group Kompare, you may then retag files which + tested either equal or unequal. + + +S Set Attributes - Set or clear F1, F3, F4, W/P, R/O, SYS, and + ARC attributes in any combination: + Set: 1,3,4,W,R,S,A Clear: -1,-3,-4,-W,-R,-S,-A +:2 + +JUMP COMMANDS: + +J Jump - Find the next match to the mask entered. The mask is + automatically wildcarded. + +^J, H ReJump - Use the same mask. (^J will not work if your TCAP + defines it as an arrow key. Use H (Hop) instead.) + +1 Jump One - Go to next file which exists only in current + directory. + +2 Jump Two - Go to next file which exists in both directories. + +` Jump Tagged - Go to next tagged file. + +~ Jump Untagged - Go to next untagged file. +:3 + +T Tag - Mark a file for a Group operation. Group Tag tags all files + from the pointer to the end of the list. + +U Untag - Cancels a tag. Group Untag untags all files from the + pointer to the end of the list. + +Y Retag - When a Group operation runs through the tagged file + list, the files are "soft" tagged. This command retags them. + +GR Group Reverse - Reverses the tags on all files. + + + ...more + +WILD COMMAND + + (W)ild Tag/ Untag/ New/ 1/ 2 MASK DATESPEC + + Select a fileset for a Group operation by comparing the + directory to a Mask and/or Datespec, and: + + 1. (T)ag all matches + 2. (U)ntag all matches + 3. (N)ew - Tag match only if the source version is Newer. + 4. (1) -Tag match if it exists in 1 directory only. + 5. (2) -Tag match if it exists in 2 directories. + + "Newness" is determined by comparing the two + Modify dates if possible. If there is no Modify + date for one of the files, its Create date is + used. If neither is valid, the file is not + tagged. The command has no effect on unstamped + disks or systems. Note that one file's Modify + date could be compared to the other file's Create + date (if it has no Modify date.) + + + Wild commands ask for an optional Mask (automatically + wildcarded) and an optional Datespec. The datespec is + compared to the Modify date or, if there is none, to the + Create date. Access date is not used. + + The datespec format is: + + [/C]<, >, or =date[ time] + + Where: + /C Forces comparison to Create date ONLY + < > = Mandatory date signifier (how to use date) + date dd.mm.yy (any part omitted = the current date) + date mm/dd/yy (alternate format) + time hh:mm (any part omitted is ignored) + + Wildcard characters "?" or "*" are allowed in date, time. + + Examples: + <1.9 Selects all modified before 1 Sept this year + = All modified today + >.. 13:00 All modified after 1pm today + /c=* All created any day this month + + European style date format is the default if the date parser + is unable to determine which one you are using. "xx" will be + taken to mean "dd". "xx/" means "mm". + + Some mask and/or date spec must be given, or the Wild command + cancels. You can use a single "." or "*" to test everything. + + WILD Examples: + + WN. + Tag everything in the source dir newer than an existing + file in the destination. + + W2= + Tag all files modified today in the source directory which + also exist in the destination directory. + + WTs /c>.. 10 + Tag all S*.* created after 10AM today. +:4 +V - View + + The main viewer commands are shown highlighted on the bottom + screen line. All viewer functions are controlled with the + left hand. These are: + + F - Next screen + A - Previous screen + T - Top screen + B - Bottom screen + R - Read more file if too big for available buffer + G - GoTo string up to 20 characters. "?" is wild char. + H - Repeat GoTo on same string. Same as G + X - Done with this file. Group View goes on to next file. + S - Scroll continuously forward until a keypress + D - Reverse scroll. + + ...more + + +V - View + + Commands NOT shown while viewing are: + + Next line + - Previous line + Next screen (synonym for Forward) + Hop forward 10 lines + ^C Abort loop (Group View) +:5 +GROUP COMMANDS: + +Group commands operate on tagged files, proceeding from file to +file. To cancel a group operation, press ^C. + + +GA Archive - Copy only tagged files which do NOT have the archive + attribute set, then set the source archive attribute. + +GC Copy Automates single file command. +GD Delete +GM Move +GV View +GK Kompare May retag all equal or unequal files after comparison. +GQ Quick +GS Set Attributes +:6 + +GE - Group Equate + +Copy all tagged files which do not exist in the destination +directory, OR whose datestamp (including the time) is different +from the target file datestamp. Group Equate is equivalent to +copying every tagged file from the source to the destination, but +it does not waste time copying files which are presumably the +same. (The files may not actually BE the same in the case of a +copy error, bad disk sector, faulty clock, etc. If you +suspect you can't trust the datestamps, use GC - Group Copy.) + +Group Equate insists that both Create and Modify fields of the +datestamp be identical. The dates are not checked for validity, +however. (A file does not _have_ to have a valid Modify date.) +If both files have null datestamps, GE will untag. + + ...more + + +GN - Group New + +Copy all tagged files which do not exist in the destination, OR +whose datestamp is newer than the target file datestamp. This +command UPDATES the destination. + +If any dates aren't valid, then a file flunks this test and is +untagged. + + Summary: + + GROUP EQUATE is intended for restoring a directory from + older backup files. GROUP NEW is for updating a directory + with newer files. WILD selects a file set by name and + date criteria for the Group commands to act on. +:7 +FILE POINTER MOVEMENTS: + + + SCREEN Arrow Keys and WS Diamond + ^R - Top Line Up ^E, Up + ^C - Bottom ^ + +,^F - Next ^S Prev File < + > Next File ^D + -,^A - Prev v + FILE Line Down ^X + ^T - Top + ^B - Bottom + CR,SP - Next + BS - Prev + +Note that cursor commands are available to jump to the next FILE +in the current window () or to the next LINE of the display +(^X). The directory displays are interleaved, so there could be +many blank lines in one directory between files entries. + +See also Jump commands. +:8 +O - Options Menu + +Datestamp Oriented Options: + + A. replace by date If Yes, D-F are ignored, else B-C ignored + B. older replace query + C. newer/equal replace query If No query, copy is NOT made. + + Use these options if A. is NO, or the file datestamp is invalid. + D. single replace query + E. group replace query + F. archive replace query + +A. Replace by Date - If Yes, the next two options are operative. + If No, they are ignored. Quick Copy ignores Replace by Date. + +B. Older Replace - Ask before replacing an older file. + +C. Newer/ Equal Replace - Ask before replacing a newer file. You + usually won't want to. Therefore, if this option is set to + NO, the copy does NOT occur. + + + + +If the dates compared aren't valid, then date replace queries +are skipped and fall back on options D-F. SCOPY would then +work like ZFILER for systems/disks without datestamps. + +******** + HINT: Set up SCOPY's query options to allow you to safely + play with the new date selection methods. You will be able to + see on screen what SCOPY intends to do, but can bail out at + the prompt before anything happens. The easiest way to do + this is to Ask For Verification. A ^C at the Y/N prompt will + cancel the command. Files will remain tagged. +******** + + ...more + +G. Verify Query - Ask whether or not to do CRC verification. + +H. Verify Default - If not queried, do CRC verification? + +I. Supress SYS Files - Only takes effect when logging in. + +J. Set Copied File Attributes - Destination file attributes are + cleared unless this option is Yes. + +K. Use Destination Attributes - IF previous option is Yes, use + existing destination attributes on copy, else use source. + +L. Archive Destination - Used when copying files to a work area, + such as a RAM disk. The Group Archive command can then + conveniently move any files you altered back to permanent + storage when you are done. + +M. Show File Attributes - SCOPY uses the extended TCAP SETATR + function to underline filename characters to represent a file + attribute set. This is unobtrusive, but doesn't give good + results on all terminals. SCOPY can be configured to show set + attributes in upper case, or you can just turn the display off. +:9 +L Login - Relog SCOPY with new command line, using the same + syntax as on initial callup. As a convenience, the ":" is + optional following a DIR reference. Note that if you name + only one directory, the current directory is assumed to be + the source, and it is the other directory which changes. + Login does not preserve the old file mask. + +N New DIR - Change the current directory only, same mask. + + Relog - Logs the same directories with the same file mask + You may want to Relog after renaming files, after file + deletions have left big holes in the file list, or when + changing floppy disks during a backup operation. + +TAB - Switch copy direction. + +Z - Command line. Run a Z-System command, and reinvoke SCOPY when + done. The command is run from the original DU: in which SCOPY + was invoked. (This function requires an XFCB and User Reg 21.) + + +IMPORTANT NOTE: SCOPY requires an extended TCAP 4D which includes + Insert/Delete line, and Clear to End of Screen. If available, + it uses cursor on/off, line graphics, and character attributes. + + + + + SCOPY, Version 1.0F + + Copyright 1992 by Rob Friefeld. All rights reserved. + +May not be sold, either alone or as part of a commercial product, +without the prior written consent of the author. May be +distributed among users at nominal cost of media. + +Rob Friefeld +4607 Colorado Street +Long Beach, CA 90814 +(310) 434-7338 voice + \ No newline at end of file From 5e12bc319924a27327e33d759b74ab2abe7149c8 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 29 Jul 2021 13:11:04 -0700 Subject: [PATCH 15/16] ROM Checksum & Verification A ROM checksum is now imbedded at the end of the ROM code banks. At boot, this checksum is verified with results displayed during boot. --- Doc/ChangeLog.txt | 1 + Source/HBIOS/hbios.asm | 59 ++++++++++++++++++++++++++++++++++++++++++ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 69098fd3..c45b61e2 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -48,6 +48,7 @@ Version 3.1.1 - WBW: Added support for MBC FDC to FDU application - WBW: Added support for MBC FDC to HBIOS - WBW: Refactored make process +- WBW: Added ROM verification to boot process Version 3.1 ----------- diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d7990f4a..6ed7af9a 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2066,6 +2066,65 @@ HB_Z280BUS1: CALL PRTHEXWORDHL #ENDIF ; +; ROM CHECKSUM VERIFICATION +; EACH OF THE FIRST 4 ROM BANKS HAS A CHECKSUM INJECTED SUCH THAT +; A COMPUTED CHECKSUM ACROSS THE ENTIRE BANK SHOLD ALWAYS BE ZERO +; +HB_ROMCK: + CALL NEWLINE + PRTS("ROM VERIFY:$") +; + ; COPY CHECKSUM ROUTINE TO UPPER RAM + LD HL,HB_CKBNK + LD DE,$8000 + LD BC,HB_CKBNKSIZ + LDIR +; + ; TEST FIRST 4 BANKS OF ROM + LD B,4 ; 4 BANKS + LD C,0 ; STARTING AT BANK 0 +HB_ROMCK1: + PUSH BC ; SAVE LOOP CONTROL + CALL $8000 ; TEST THE BANK + CALL PC_SPACE ; FORMATTING + CALL PRTHEXBYTE ; PRINT RESULT + POP BC ; RESTORE LOOP CONTROL + OR A ; SET FLAGS + JR NZ,HB_ROMCK2 ; HANDLE FAILURE + INC C ; NEXT BANK + DJNZ HB_ROMCK1 ; LOOP FOR BANKS + PRTS(" PASS$") ; DISPLAY SUCCESS + JR HB_ROMCKZ ; CONTINUE BOOT +HB_ROMCK2: + PRTS(" FAIL$") ; DISPLAY ERROR + JR HB_ROMCKZ ; CONTINUE BOOT +; +; VERIFY ROM CHECKSUM BANK SPECIFIED IN REG C +; THIS MUST BE COPIED TO UPPER RAM TO RUN +; +HB_CKBNK: + LD A,(HB_CURBNK) ; GET CURRENT BANK + LD E,A ; SAVE IN E + LD A,C ; BANK TO TEST + CALL HBX_BNKSEL ; SELECT BANK IT + LD HL,$7FFF ; START AT BANK END + LD BC,1 ; DECREMENT VALUE + XOR A ; ZERO ACCUM +HB_CKBNK1: + ADD A,(HL) ; ADD NEXT BYTE + OR A ; CLEAR CARRY + SBC HL,BC ; DECREMENT + JR NC,HB_CKBNK1 ; LOOP TILL DONE + PUSH AF ; SAVE RESULT + LD A,E ; BANK TO RESTORE + CALL HBX_BNKSEL ; RESTORE ORIG BANK + POP AF ; RECOVER RESULT + RET ; AND DONE +; +HB_CKBNKSIZ .EQU $-HB_CKBNK ; SIZE OF ROUTINE +; +HB_ROMCKZ: +; ; LOW BATTERY DIAGNOSTIC MESSAGE ; #IF (BATCOND) diff --git a/Source/ver.inc b/Source/ver.inc index d11bc59a..5ef69718 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.100" +#DEFINE BIOSVER "3.1.1-pre.101" diff --git a/Source/ver.lib b/Source/ver.lib index 17928200..34f75d1a 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.100" + db "3.1.1-pre.101" endm From 450b3aff887601464c4f39deab89384ab103ef99 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 29 Jul 2021 20:50:04 -0700 Subject: [PATCH 16/16] BPBIOS Doc Updates --- Source/BPBIOS/@WBW Issues.txt | 37 ++++++++++++++++++++++++++++------- Source/BPBIOS/romwbw-mk4.lib | 2 +- Source/BPBIOS/romwbw-sim.lib | 2 +- Source/BPBIOS/romwbw.lib | 2 +- Source/Build.cmd | 4 ++-- Source/HBIOS/cfg_mk4.asm | 2 +- 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/Source/BPBIOS/@WBW Issues.txt b/Source/BPBIOS/@WBW Issues.txt index f7d12f4c..98021418 100644 --- a/Source/BPBIOS/@WBW Issues.txt +++ b/Source/BPBIOS/@WBW Issues.txt @@ -1,8 +1,33 @@ -Loader uses CBIOS Disk I/O prior to CBOOT/WBOOT being run. As a -result, DIOBUF is not properly initialized. At present, it is -initialized to $7C00 which will work unless the location of the -physical disk buffer in HBIOS ever changes! - +In general, the BPBIOS for RomWBW is incomplete. This is +mostly just a proof of concept that it can work. As such, +it is not built or included in the default builds of +RomWBW. You *must* review and adjust the file romwbw.lib +before building BPBIOS. To include BPBIOS in the build +process, you need to uncomment the corresponding line +in the Build.cmd file in the Source directory. + +For now, BPBIOS does not understand the dynamic disk assignment +mechanism of RomWBW. This means that you need to explicitly +tell BPBIOS the console unit number and the disk unit number of +the first hard disk device. Floppy drives are basically not +supported. You should review and adjust the romwbw.lib file +as needed. The RomWBW ASSIGN command is not supported. BPBIOS +will boot from the first hard disk unit number you assign and +always from the first slice. + +As documented in "@WBW Z3ENV.txt", there are two general +configurations of BPBIOS for RomWBW. I strongly recomment +using the T configurations (external HBIOS proxy). This is +the long term direction for BPBIOS on RomWBW. The N +configurations (internal HBIOS proxy) will not work with +interrrupts of any kind. This means that to use the N +configurations, you *must* use a RomWBW ROM built with +interrupts disabled or chaos will ensue. + +BPBIOS does not yet understand the 1024 directory entry +hard disk format. You must use the 512 directory entry +format images. + The clock drivers supplied with BPBIOS (LDDS, LDP2D, and LDNZT) load into ZSYS user memory. If the user segment is not at the same location as the original BPBIOS ($E900), then the clock @@ -11,5 +36,3 @@ is OK because it does not relocate the user segment, but the T config fails because it uses a user segment at $E700. Note that this does not affect ZSDOS2 variants because they do not require a loadable clock driver. - -BPBIOS needs to assign disk units dynamically via discovery of disk type diff --git a/Source/BPBIOS/romwbw-mk4.lib b/Source/BPBIOS/romwbw-mk4.lib index e4dcf70f..bf3ba2b3 100644 --- a/Source/BPBIOS/romwbw-mk4.lib +++ b/Source/BPBIOS/romwbw-mk4.lib @@ -28,7 +28,7 @@ HBCLK EQU YES ; HBIOS clock driver ; HB_IODEV EQU 0 ; Assume we want to use first HBIOS serial device ; -; Set HB_HDDEV to appropriate hard disk driver +; Set HB_HDDEV to the first (boot) hard disk device unit number ; HB_HDDEV EQU 2 ; Assumes disk device #2 is first hard disk device ; diff --git a/Source/BPBIOS/romwbw-sim.lib b/Source/BPBIOS/romwbw-sim.lib index d666295f..4ac87cd5 100644 --- a/Source/BPBIOS/romwbw-sim.lib +++ b/Source/BPBIOS/romwbw-sim.lib @@ -28,7 +28,7 @@ HBCLK EQU YES ; HBIOS clock driver ; HB_IODEV EQU 0 ; Assume we want to use first HBIOS serial device ; -; Set HB_HDDEV to appropriate hard disk driver +; Set HB_HDDEV to the first (boot) hard disk device unit number ; HB_HDDEV EQU 2 ; Assumes disk device #2 is first hard disk device ; diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index d666295f..4ac87cd5 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -28,7 +28,7 @@ HBCLK EQU YES ; HBIOS clock driver ; HB_IODEV EQU 0 ; Assume we want to use first HBIOS serial device ; -; Set HB_HDDEV to appropriate hard disk driver +; Set HB_HDDEV to the first (boot) hard disk device unit number ; HB_HDDEV EQU 2 ; Assumes disk device #2 is first hard disk device ; diff --git a/Source/Build.cmd b/Source/Build.cmd index acbbb7bc..82506681 100644 --- a/Source/Build.cmd +++ b/Source/Build.cmd @@ -1,10 +1,10 @@ @echo off setlocal -REM call BuildDoc || exit /b +:: call BuildDoc || exit /b call BuildProp || exit /b call BuildShared || exit /b -REM call BuildBP || exit /b +:: call BuildBP || exit /b call BuildImages || exit /b call BuildROM %* || exit /b call BuildZRC || exit /b diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 3f5fa49b..c36bfd21 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -227,7 +227,7 @@ SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 ; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ;