From fac1974589634e759f5319525a21ed5880d9b21e Mon Sep 17 00:00:00 2001 From: Curt Mayer Date: Thu, 30 Jan 2020 06:47:47 +0000 Subject: [PATCH] makefiles and tools for unix/osx build --- Makefile | 17 + Readme.docker | 12 + Readme.unix | 7 + Source/Apps/Makefile | 23 + Source/BPBIOS/Makefile | 90 + Source/BPBIOS/ZCPR33/Makefile | 18 + Source/CBIOS/Makefile | 10 + Source/CPM22/Makefile | 6 + Source/CPM3/Makefile | 85 + Source/Forth/Makefile | 4 + Source/HBIOS/Makefile | 10 + Source/Images/Makefile | 102 ++ Source/Makefile | 6 + Source/Prop/Makefile | 4 + Source/ZCPR-DJ/Makefile | 10 + Source/ZCPR/Makefile | 12 + Source/ZSDOS/Makefile | 11 + Tools/Makefile.inc | 140 ++ Tools/unix/Makefile | 32 + Tools/unix/bst/Makefile | 29 + Tools/unix/bst/bstc.linux | Bin 0 -> 143652 bytes Tools/unix/bst/bstc.osx | Bin 0 -> 299184 bytes Tools/unix/bst/bstl.linux | Bin 0 -> 103676 bytes Tools/unix/bst/bstl.osx | Bin 0 -> 306544 bytes Tools/unix/bst/openspin.linux | Bin 0 -> 338472 bytes Tools/unix/bst/openspin.osx | Bin 0 -> 207456 bytes Tools/unix/casefn.sh | 16 + Tools/unix/cpmtools/COPYING | 676 ++++++++ Tools/unix/cpmtools/Makefile | 57 + Tools/unix/cpmtools/badfs/Makefile | 7 + Tools/unix/cpmtools/badfs/blocknumber | Bin 0 -> 13312 bytes Tools/unix/cpmtools/badfs/doubleext | Bin 0 -> 13312 bytes Tools/unix/cpmtools/badfs/extension | Bin 0 -> 13312 bytes Tools/unix/cpmtools/badfs/extno | Bin 0 -> 16512 bytes Tools/unix/cpmtools/badfs/hugecom | Bin 0 -> 76544 bytes Tools/unix/cpmtools/badfs/label | Bin 0 -> 9984 bytes Tools/unix/cpmtools/badfs/lcr | Bin 0 -> 16512 bytes Tools/unix/cpmtools/badfs/multipleblocks | Bin 0 -> 13312 bytes Tools/unix/cpmtools/badfs/name | Bin 0 -> 13312 bytes Tools/unix/cpmtools/badfs/recordcount | Bin 0 -> 13312 bytes Tools/unix/cpmtools/badfs/status | Bin 0 -> 13312 bytes Tools/unix/cpmtools/badfs/timestamps | Bin 0 -> 23168 bytes Tools/unix/cpmtools/config.h | 57 + Tools/unix/cpmtools/cpm.5 | 300 ++++ Tools/unix/cpmtools/cpm.ps | 478 ++++++ Tools/unix/cpmtools/cpmchattr.1 | 92 ++ Tools/unix/cpmtools/cpmchattr.c | 119 ++ Tools/unix/cpmtools/cpmchmod.1 | 63 + Tools/unix/cpmtools/cpmchmod.c | 89 + Tools/unix/cpmtools/cpmcp.1 | 98 ++ Tools/unix/cpmtools/cpmcp.c | 299 ++++ Tools/unix/cpmtools/cpmdir.h | 21 + Tools/unix/cpmtools/cpmfs.c | 1920 ++++++++++++++++++++++ Tools/unix/cpmtools/cpmfs.h | 206 +++ Tools/unix/cpmtools/cpmls.1 | 75 + Tools/unix/cpmtools/cpmls.c | 400 +++++ Tools/unix/cpmtools/cpmrm.1 | 59 + Tools/unix/cpmtools/cpmrm.c | 77 + Tools/unix/cpmtools/device.h | 36 + Tools/unix/cpmtools/device_libdsk.c | 135 ++ Tools/unix/cpmtools/device_posix.c | 82 + Tools/unix/cpmtools/device_win32.c | 670 ++++++++ Tools/unix/cpmtools/diskdefs | 1396 ++++++++++++++++ Tools/unix/cpmtools/fsck.cpm.1 | 80 + Tools/unix/cpmtools/fsck.cpm.c | 632 +++++++ Tools/unix/cpmtools/fsed.cpm.1 | 62 + Tools/unix/cpmtools/fsed.cpm.c | 748 +++++++++ Tools/unix/cpmtools/getopt.c | 1195 ++++++++++++++ Tools/unix/cpmtools/getopt1.c | 171 ++ Tools/unix/cpmtools/getopt_.h | 226 +++ Tools/unix/cpmtools/getopt_int.h | 131 ++ Tools/unix/cpmtools/mkfs.cpm.1 | 70 + Tools/unix/cpmtools/mkfs.cpm.c | 234 +++ Tools/unix/uz80as/Makefile | 68 + Tools/unix/uz80as/config.h | 29 + Tools/unix/uz80as/dp2200.c | 208 +++ Tools/unix/uz80as/err.c | 196 +++ Tools/unix/uz80as/err.h | 32 + Tools/unix/uz80as/expr.c | 445 +++++ Tools/unix/uz80as/expr.h | 26 + Tools/unix/uz80as/exprint.c | 32 + Tools/unix/uz80as/exprint.h | 17 + Tools/unix/uz80as/gbcpu.c | 301 ++++ Tools/unix/uz80as/i4004.c | 189 +++ Tools/unix/uz80as/i8008.c | 220 +++ Tools/unix/uz80as/i8048.c | 276 ++++ Tools/unix/uz80as/i8051.c | 244 +++ Tools/unix/uz80as/i8080.c | 214 +++ Tools/unix/uz80as/incl.c | 81 + Tools/unix/uz80as/incl.h | 28 + Tools/unix/uz80as/list.c | 164 ++ Tools/unix/uz80as/list.h | 23 + Tools/unix/uz80as/main.c | 303 ++++ Tools/unix/uz80as/mc6800.c | 338 ++++ Tools/unix/uz80as/mos6502.c | 385 +++++ Tools/unix/uz80as/ngetopt.c | 237 +++ Tools/unix/uz80as/ngetopt.h | 40 + Tools/unix/uz80as/options.c | 33 + Tools/unix/uz80as/options.h | 29 + Tools/unix/uz80as/pp.c | 741 +++++++++ Tools/unix/uz80as/pp.h | 23 + Tools/unix/uz80as/prtable.c | 343 ++++ Tools/unix/uz80as/prtable.h | 11 + Tools/unix/uz80as/sym.c | 103 ++ Tools/unix/uz80as/sym.h | 23 + Tools/unix/uz80as/targets.c | 96 ++ Tools/unix/uz80as/targets.h | 18 + Tools/unix/uz80as/test.asm | 22 + Tools/unix/uz80as/test.lst | 38 + Tools/unix/uz80as/test.obj | Bin 0 -> 35 bytes Tools/unix/uz80as/utils.c | 137 ++ Tools/unix/uz80as/utils.h | 26 + Tools/unix/uz80as/uz80as.c | 1120 +++++++++++++ Tools/unix/uz80as/uz80as.h | 63 + Tools/unix/uz80as/z80.c | 362 ++++ Tools/unix/zx/Makefile | 39 + Tools/unix/zx/bios.bin | Bin 0 -> 384 bytes Tools/unix/zx/cbops.h | 172 ++ Tools/unix/zx/config.h.darwin | 15 + Tools/unix/zx/config.h.linux | 16 + Tools/unix/zx/config.h.windows | 9 + Tools/unix/zx/cpm/bios.bin | Bin 0 -> 384 bytes Tools/unix/zx/cpm/bios.com | Bin 0 -> 384 bytes Tools/unix/zx/cpm/bios.lst | 106 ++ Tools/unix/zx/cpm/bios.z80 | 96 ++ Tools/unix/zx/cpmdrv.c | 275 ++++ Tools/unix/zx/cpmglob.c | 579 +++++++ Tools/unix/zx/cpmint.h | 223 +++ Tools/unix/zx/cpmparse.c | 126 ++ Tools/unix/zx/cpmredir.c | 931 +++++++++++ Tools/unix/zx/cpmredir.h | 151 ++ Tools/unix/zx/dirent.c | 149 ++ Tools/unix/zx/dirent.h | 50 + Tools/unix/zx/drdos.c | 236 +++ Tools/unix/zx/edops.h | 567 +++++++ Tools/unix/zx/readme.txt | 47 + Tools/unix/zx/util.c | 378 +++++ Tools/unix/zx/xlt.c | 191 +++ Tools/unix/zx/z80.c | 270 +++ Tools/unix/zx/z80.h | 86 + Tools/unix/zx/z80ops.h | 1304 +++++++++++++++ Tools/unix/zx/zx.c | 437 +++++ Tools/unix/zx/zx.h | 95 ++ Tools/unix/zx/zx.html | 131 ++ Tools/unix/zx/zxbdos.c | 561 +++++++ Tools/unix/zx/zxbdos.h | 50 + Tools/unix/zx/zxcbdos.c | 114 ++ Tools/unix/zx/zxcbdos.h | 4 + Tools/unix/zx/zxdbdos.c | 88 + Tools/unix/zx/zxdbdos.h | 8 + 150 files changed, 26393 insertions(+) create mode 100644 Makefile create mode 100644 Readme.docker create mode 100644 Readme.unix create mode 100644 Source/Apps/Makefile create mode 100644 Source/BPBIOS/Makefile create mode 100644 Source/BPBIOS/ZCPR33/Makefile create mode 100644 Source/CBIOS/Makefile create mode 100644 Source/CPM22/Makefile create mode 100644 Source/CPM3/Makefile create mode 100644 Source/Forth/Makefile create mode 100644 Source/HBIOS/Makefile create mode 100644 Source/Images/Makefile create mode 100644 Source/Makefile create mode 100644 Source/Prop/Makefile create mode 100644 Source/ZCPR-DJ/Makefile create mode 100644 Source/ZCPR/Makefile create mode 100644 Source/ZSDOS/Makefile create mode 100644 Tools/Makefile.inc create mode 100644 Tools/unix/Makefile create mode 100644 Tools/unix/bst/Makefile create mode 100755 Tools/unix/bst/bstc.linux create mode 100755 Tools/unix/bst/bstc.osx create mode 100755 Tools/unix/bst/bstl.linux create mode 100755 Tools/unix/bst/bstl.osx create mode 100755 Tools/unix/bst/openspin.linux create mode 100755 Tools/unix/bst/openspin.osx create mode 100755 Tools/unix/casefn.sh create mode 100644 Tools/unix/cpmtools/COPYING create mode 100644 Tools/unix/cpmtools/Makefile create mode 100644 Tools/unix/cpmtools/badfs/Makefile create mode 100644 Tools/unix/cpmtools/badfs/blocknumber create mode 100644 Tools/unix/cpmtools/badfs/doubleext create mode 100644 Tools/unix/cpmtools/badfs/extension create mode 100644 Tools/unix/cpmtools/badfs/extno create mode 100644 Tools/unix/cpmtools/badfs/hugecom create mode 100644 Tools/unix/cpmtools/badfs/label create mode 100644 Tools/unix/cpmtools/badfs/lcr create mode 100644 Tools/unix/cpmtools/badfs/multipleblocks create mode 100644 Tools/unix/cpmtools/badfs/name create mode 100644 Tools/unix/cpmtools/badfs/recordcount create mode 100644 Tools/unix/cpmtools/badfs/status create mode 100644 Tools/unix/cpmtools/badfs/timestamps create mode 100644 Tools/unix/cpmtools/config.h create mode 100644 Tools/unix/cpmtools/cpm.5 create mode 100644 Tools/unix/cpmtools/cpm.ps create mode 100644 Tools/unix/cpmtools/cpmchattr.1 create mode 100644 Tools/unix/cpmtools/cpmchattr.c create mode 100644 Tools/unix/cpmtools/cpmchmod.1 create mode 100644 Tools/unix/cpmtools/cpmchmod.c create mode 100644 Tools/unix/cpmtools/cpmcp.1 create mode 100644 Tools/unix/cpmtools/cpmcp.c create mode 100644 Tools/unix/cpmtools/cpmdir.h create mode 100644 Tools/unix/cpmtools/cpmfs.c create mode 100644 Tools/unix/cpmtools/cpmfs.h create mode 100644 Tools/unix/cpmtools/cpmls.1 create mode 100644 Tools/unix/cpmtools/cpmls.c create mode 100644 Tools/unix/cpmtools/cpmrm.1 create mode 100644 Tools/unix/cpmtools/cpmrm.c create mode 100644 Tools/unix/cpmtools/device.h create mode 100644 Tools/unix/cpmtools/device_libdsk.c create mode 100644 Tools/unix/cpmtools/device_posix.c create mode 100644 Tools/unix/cpmtools/device_win32.c create mode 100644 Tools/unix/cpmtools/diskdefs create mode 100644 Tools/unix/cpmtools/fsck.cpm.1 create mode 100644 Tools/unix/cpmtools/fsck.cpm.c create mode 100644 Tools/unix/cpmtools/fsed.cpm.1 create mode 100644 Tools/unix/cpmtools/fsed.cpm.c create mode 100644 Tools/unix/cpmtools/getopt.c create mode 100644 Tools/unix/cpmtools/getopt1.c create mode 100644 Tools/unix/cpmtools/getopt_.h create mode 100644 Tools/unix/cpmtools/getopt_int.h create mode 100644 Tools/unix/cpmtools/mkfs.cpm.1 create mode 100644 Tools/unix/cpmtools/mkfs.cpm.c create mode 100644 Tools/unix/uz80as/Makefile create mode 100644 Tools/unix/uz80as/config.h create mode 100644 Tools/unix/uz80as/dp2200.c create mode 100644 Tools/unix/uz80as/err.c create mode 100644 Tools/unix/uz80as/err.h create mode 100644 Tools/unix/uz80as/expr.c create mode 100644 Tools/unix/uz80as/expr.h create mode 100644 Tools/unix/uz80as/exprint.c create mode 100644 Tools/unix/uz80as/exprint.h create mode 100644 Tools/unix/uz80as/gbcpu.c create mode 100644 Tools/unix/uz80as/i4004.c create mode 100644 Tools/unix/uz80as/i8008.c create mode 100644 Tools/unix/uz80as/i8048.c create mode 100644 Tools/unix/uz80as/i8051.c create mode 100644 Tools/unix/uz80as/i8080.c create mode 100644 Tools/unix/uz80as/incl.c create mode 100644 Tools/unix/uz80as/incl.h create mode 100644 Tools/unix/uz80as/list.c create mode 100644 Tools/unix/uz80as/list.h create mode 100644 Tools/unix/uz80as/main.c create mode 100644 Tools/unix/uz80as/mc6800.c create mode 100644 Tools/unix/uz80as/mos6502.c create mode 100644 Tools/unix/uz80as/ngetopt.c create mode 100644 Tools/unix/uz80as/ngetopt.h create mode 100644 Tools/unix/uz80as/options.c create mode 100644 Tools/unix/uz80as/options.h create mode 100644 Tools/unix/uz80as/pp.c create mode 100644 Tools/unix/uz80as/pp.h create mode 100644 Tools/unix/uz80as/prtable.c create mode 100644 Tools/unix/uz80as/prtable.h create mode 100644 Tools/unix/uz80as/sym.c create mode 100644 Tools/unix/uz80as/sym.h create mode 100644 Tools/unix/uz80as/targets.c create mode 100644 Tools/unix/uz80as/targets.h create mode 100644 Tools/unix/uz80as/test.asm create mode 100644 Tools/unix/uz80as/test.lst create mode 100644 Tools/unix/uz80as/test.obj create mode 100644 Tools/unix/uz80as/utils.c create mode 100644 Tools/unix/uz80as/utils.h create mode 100644 Tools/unix/uz80as/uz80as.c create mode 100644 Tools/unix/uz80as/uz80as.h create mode 100644 Tools/unix/uz80as/z80.c create mode 100644 Tools/unix/zx/Makefile create mode 100644 Tools/unix/zx/bios.bin create mode 100644 Tools/unix/zx/cbops.h create mode 100644 Tools/unix/zx/config.h.darwin create mode 100644 Tools/unix/zx/config.h.linux create mode 100644 Tools/unix/zx/config.h.windows create mode 100644 Tools/unix/zx/cpm/bios.bin create mode 100644 Tools/unix/zx/cpm/bios.com create mode 100644 Tools/unix/zx/cpm/bios.lst create mode 100644 Tools/unix/zx/cpm/bios.z80 create mode 100644 Tools/unix/zx/cpmdrv.c create mode 100644 Tools/unix/zx/cpmglob.c create mode 100644 Tools/unix/zx/cpmint.h create mode 100644 Tools/unix/zx/cpmparse.c create mode 100644 Tools/unix/zx/cpmredir.c create mode 100644 Tools/unix/zx/cpmredir.h create mode 100644 Tools/unix/zx/dirent.c create mode 100644 Tools/unix/zx/dirent.h create mode 100644 Tools/unix/zx/drdos.c create mode 100644 Tools/unix/zx/edops.h create mode 100644 Tools/unix/zx/readme.txt create mode 100644 Tools/unix/zx/util.c create mode 100644 Tools/unix/zx/xlt.c create mode 100644 Tools/unix/zx/z80.c create mode 100644 Tools/unix/zx/z80.h create mode 100644 Tools/unix/zx/z80ops.h create mode 100644 Tools/unix/zx/zx.c create mode 100644 Tools/unix/zx/zx.h create mode 100644 Tools/unix/zx/zx.html create mode 100644 Tools/unix/zx/zxbdos.c create mode 100644 Tools/unix/zx/zxbdos.h create mode 100644 Tools/unix/zx/zxcbdos.c create mode 100644 Tools/unix/zx/zxcbdos.h create mode 100644 Tools/unix/zx/zxdbdos.c create mode 100644 Tools/unix/zx/zxdbdos.h diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..a7b09930 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +all: + cd Tools/unix ; make install + cd Source ; make all + +clean: + cd Tools/unix ; make clean + cd Source ; make clean + cd Binary ; make clean + +clobber: + cd Tools/unix ; make clobber + cd Source ; make clobber + cd Binary ; make clobber + +diff: + cd Source ; make diff + diff --git a/Readme.docker b/Readme.docker new file mode 100644 index 00000000..7c5b752a --- /dev/null +++ b/Readme.docker @@ -0,0 +1,12 @@ +my mac has a case-insensitive filesystem, so I built a case sensitive one and mounted it as /Volumes/sensitive. + +create a docker instance and put tools into it + +docker run -d --name ubuntu -v /Volumes/IronKey:/sensitive -ti ubuntu /bin/bash +docker exec ubuntu /bin/bash -c 'apt update ; apt-get install -y make gcc' +docker attach ubuntu + +inside it: + + cd /sensitive/src/RomWBW + make diff --git a/Readme.unix b/Readme.unix new file mode 100644 index 00000000..fcc12ca3 --- /dev/null +++ b/Readme.unix @@ -0,0 +1,7 @@ +prerequisites: + +gcc +yacc +make +g++ + diff --git a/Source/Apps/Makefile b/Source/Apps/Makefile new file mode 100644 index 00000000..fcf3a5d6 --- /dev/null +++ b/Source/Apps/Makefile @@ -0,0 +1,23 @@ +OBJECTS = SysGen.com Survey.com \ + SysCopy.COM Assign.COM Format.COM Talk.COM OSLdr.COM Mode.COM RTC.COM \ + Timer.COM IntTest.COM +OTHERS = *.hex *.com +SUBDIRS = XM FDU Tune FAT +DEST = ../../Binary/Apps +TOOLS =../../Tools +RELPATH = Source/Apps + +include $(TOOLS)/Makefile.inc + +%.COM: %.asm + $(TASM) $< $@ + +foo: + echo treeroot: $(TREEROOT) here: $(HERE) relpath: $(RELPATH1) + +#diff:: +# -for i in $(OBJECTS) ; do \ +# sf=$$($(CASEFN) $$i) ; df=$$($(CASEFN) $(DIFFTO)/$(RELPATH)/$$i) ; \ +# echo diffing $$sf and $$df ; \ +# diff $$sf $$df ; \ +# done diff --git a/Source/BPBIOS/Makefile b/Source/BPBIOS/Makefile new file mode 100644 index 00000000..9c5ad518 --- /dev/null +++ b/Source/BPBIOS/Makefile @@ -0,0 +1,90 @@ +VERSIONS = \ + 33t 33tbnk \ + 33n 33nbnk \ + 34t 34tbnk \ + 34n 34nbnk \ + 41tbnk 41nbnk + +OBJECTS = $(foreach ver,$(VERSIONS),bp$(ver).img) +OTHERS = zcpr33n.rel zcpr33t.rel bpbio-ww.rel bpsys.dat bpsys.bak +TOOLS = ../../Tools +CPMCP = $(TOOLS)/`uname`/cpmcp + +SUBDIRS = ZCPR33 +include $(TOOLS)/Makefile.inc + +zcpr33n.rel zcpr33t.rel: + (cd $ZCPR33 ; make install) + +all:: $(OBJECTS) + $(CPMCP) -f wbw_hd0 ../../Binary/hd0.img *.img *.rel *.zex myterm.z3t 0: + +%.img: + $(eval VER := $(subst .img,,$(subst bp,,$@))) + cp def-ww-z$(VER).lib def-ww.lib + rm -f bpbio-ww.rel + $(ZXCC) $(CPM)/ZMAC -BPBIO-WW -/P + mv bpbio-ww.prn bp$(VER).prn + cp bp$(VER).dat bpsys.dat + $(ZXCC) ./bpbuild.com -bpsys.dat 0 < bpbld1.rsp + cp bpsys.img bpsys.dat + $(ZXCC) ./bpbuild.com -bpsys.dat 0 < bpbld2.rsp + mv bpsys.img bp$(VER).img + +# +# +# rem cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:*.dat +# rem cpmcp.exe -f wbw_hd0 ../../Binary/hd0.img *.dat 0: +# +# cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:*.zex +# +# cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:myterm.z3t +# +# goto :eof +# +# :makebp +# +# set VER=%1 +# echo. +# echo Building BPBIOS Variant "%VER%"... +# echo. +# +# copy def-ww-z%VER%.lib def-ww.lib +# rem if exist bpbio-ww.rel del bpbio-ww.rel +# zx ZMAC -BPBIO-WW -/P +# if exist bp%VER%.prn del bp%VER%.prn +# ren bpbio-ww.prn bp%VER%.prn +# +# rem pause +# +# rem BPBUILD attempts to rename bpsys.img -> bpsys.bak +# rem while is is still open. Real CP/M does not care, +# rem but zx fails due to host OS. Below, a temp file +# rem is used to avoid the problematic rename. +# +# if exist bpsys.img del bpsys.img +# if exist bpsys.tmp del bpsys.tmp +# copy bp%VER%.dat bpsys.tmp +# rem bpsys.tmp -> bpsys.img +# zx bpbuild -bpsys.tmp bpsys.img +# zx bpbuild -bpsys.tmp B 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�lq+gX?91>Dqk3!ssB@HzbVX2DtWc87X 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 literal 0 HcmV?d00001 diff --git a/Tools/unix/bst/bstc.osx b/Tools/unix/bst/bstc.osx new file mode 100755 index 0000000000000000000000000000000000000000..d69cbe565a5c794f87e23fe0e5508b35284092da GIT binary patch literal 299184 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 M|^cj%vTL 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 z

$Cfb@)#>)88qJ2lG`{8lBHe$Ore`ogL<-%vc=h25!UwZXBUi{O1U@3Zp~;DimN z-<5bWPWu;o6IyUjBr|o3tgVmaim21W%a_pVAaXj;`fkj;pieH2d-5f(5G5XAD?)&} zthBI|2t>X1yJC3;U8|7&Q2j27;#nl%N*v1Ns;A)8%z&8G}WcNm7?eENqIRPD)**ijk7LkBYe zXgbz%EMBR;=nbNubpTf@MU9LLtx1o0mi~+?UuEA8v$MFVtzhJja~zK;c&0FbBAted;rZOMTb)A_;A#LxXyIl2_D6I#_Tt8&ww8+8Tk66w4VCO_7I#{? z)MHS~_{DOrvVVRRZyxl<(<-d&n!LEDP>u?8u*x(=-ddTRD+FD|tMj zZK ztR5-xdsdj9%V?ap!rcK#PJBhyVUGE4$52g!NbYUc7!9*P@93-<}6IoA4Y-eI;X%_~5zV#&~gvP?hC=Ne`Iq zj(+I+s1LI#niH+t*DNz^ZeN%&SVEc}?yP_YUn2hkCdbcLvTz##qC|+TpP80^upQp6!Fn zDS}C9YiwaGq1gh`(gcFUSCDEjGZMo+nnhIp>gDRR>nlEJS6wJnxq1J9!)BY1-{hR|PO7BAS?3D(@hiQA?dQjkWfdC1 zDBl4$B@r(&9=zRc{ti6=s|z&p*JN<(7@4L~(yUq9Ick3HHCa9_K%QB~i zX{!JL?MNwG1oR!IB5)bA$B(gH$!&xPNdU@46UW5DfJo>V{TFDPf7evi0 zGVOZ+;Ot?rn}^@w$1$k#Pe3=*@CR_I(_*&k8S1EebJHaB+)}6Wb{1)peK((Yk(vHO zw9qAgkQR@ue1?7nD8;Z&v)?#8ICM+9KJj9h@LQoAFS&Uwhe|pRudE;9R7Ld^D)aH# zDW4&2Z!N{-_;!ET6y$VX5_5|M1U?3F+IzM{cg=~=)}Axx&i*qV5FTiZu@KqK#R5e# z%Z!J2l}-%KuFS9PiisUf36g^S0gzx&s5cgL<8-D`EHED>ax}w!VgBN|2;^5vW@Xes!UVjo#2Iq+@t(09iN@%cwPXwQGDrc$Z zJoPUT(BmN?Pfxd2Q4-m|=`s3!U8m>Fc1LBVtHbTH9p%lZR77u-l(uq?K<}mR6&Jqx zT3V4+US8hrtV^vZuf12Eh)7Vae=N2iAip3f==bFC3{5yY+IhL+Nhz&>B~$|M++ns% zHRrpfN$yFfKHCizxS$(C~Nh;fBvim6{Yodcdrb_SNCLg^}U(a z8fozDqXR{I*wS*H`yTjOxO9&TNb!YJ5u@b$2V>NOT5sv-(#K4u(K+RY#_%kJs|aHK zqU#EhFl}Z`$Dz{LcnVkxIg%V((lL7RI;-u#M*)1>qG7F$^%woE9(}kg{KpaRdE_N;U^(cui zQytdbDZI6_{AIZ2tlkH}B%6<_UK`I%<84|AzH43mc!$#-4n~iW6sb|BTDs4K{edW9b3|-H>wKb9wW3eMy1c z14tJlXY~p8tJCk3D6Ih=$VV@T+%vC>%|orQeos#=oh#>mgZn5O;6NMt0tt#@;DUL7b< z*C34Te|}#q<#3tL;YP`fVVPdQzsz>kOD7hj1bDyg>$V*R2YtAwWZ-r?+5hM3x0^TD zw6DQlQhT`e^iSOolNQ}uXtPs?bD1?~ph*6>m+x993^}Xr%&Z{Hc z&{%c)wPd z(y$ndy*&w|dp^+$(vwSMWvRLZA+Yc zW30in-(@@XW)pWK$1aTYodLha5W5uO_#;GR*tIkstg+G9;z;x^7_=Q#~D^?`>|}9 zHP&YR1z;EO$tvI4$fWU8(i@L{-~an)+^PzdpbAaZ>hMk>JoFLVpCFuF09+FAi72yuCv??eLcJ5+aq|T8V#) zR40mfaz(9xMtR*LtGjyX(YF;hbb{dcwKeEINGgc;k!%gxvb_Kt3ij)NB2d0Yu2zfn z!Uk-)RK7`O2oge7te&(DNT}#vtC()!0IB93$D6v3t;!md>tI~{mwg0Ej=?$kPluMw883}s}}7HSfqt0=X@$?pRCHtHt*Qs2*^ zT`=hmH~mb5n&x^wgORIG65p9_!Zf5Ucqa;8YU7^hsC76bUniz0t&L(1GgFqBNri{) zkGHz2?>>L3ztKnz*Lha@HYH=^-s*V2g$;|4s*}j*n#WYhA!q3f{%5Ws#&O$Ao+KefbY+Lk6by#Cr4#U1n zrntQUTjJ~#?ULB5+M>!%#eiqA=h!o3u7Ctp&GE^+vAM1?8-S%wS1|AWvW1?;rS zy78&wSD~mF=rbHFV^)*7KQM6F*q{z67w#2!i7Ltq3OT$e@mYObJ?NnK7)oUSZ20fL zYh3px;#?DWMaold4hs?lhxy&ExY^v6%(B9D|&Vko(3 zT-F2M=U{t2fe7fW{4fJ7)0F;-m%sHhZ3>JiosVf56RashK?mzx{OwcifrSO)0lz=N z8r9P(-}J`y+%VOcW%;`)Tbs-IJbIf+TwWp`AdGVDfT-TzpDxPEi8u26_u1wXeU(L_ zeMW^KjEn^tags-hr#L%1ca{>o@b^J?%WTxO5hrp z9!wbI$vqd!elFZ?wRcq%!1f6PdXw#<$^sTzpPD+&dsX5XjS{lB4|2?YXv`)m-nncI zW`=@gn=3D2lnLG0Trda~gPlTtN3>!P+^>GtKI|LB*X*ztt4ixHSp2}G=*tTWo&Nb3EQNTwcFwymXCN`Kt4Tg`C->g`t1^*2wgL{6O|3=Jwlx^KQJ;E^Ujp7^ zN6SZx^y*(=`{~H_iJ8KiIh836U3^3ZI5g>s;cE zQ<~gF~g;OwwyqU+Ki%BqsD=Kd*<0zHHagFt@c$qIHZV* zHL)HqQ{3w6R$e~4uI-7Ly?t<7(_LBazq1z=`M#Ej1{!TDMIrgr*%OUs_6UVi0~GeRUW|Lk0r&NO z5$ej(yubJcPH42zKjBM)x!-%Y0h zGsT>s$60>zs8G4ntPk+Y@@&W&UZR8m5p73&H)hZV=1|)RZsEECxS9*Yk^RLUr^LjmU53|>*Mua z{LTBr`4|>ho!XbU(OiY`dkV)RBYB8&#**?2Rs`7JB?j{6ccPkdUI1}y&IxQk^u@^I zcDA*!;)_`U>`DF+4|E$_An(@mJi_Dbjx-A;YWf>XPE^uZVMb0AC5r2-!go>jm2t7_ zXKr&!ul&|SCg7z2a#Cjx`k4DSqKc#1qA!mYN8OG}JNA{Mb$@NG*~>|`h~F`hp+n%p zd^w7N!_=r0@f;^++Gk2OHS*MI6RdqA5()B9N=;I$1v@+@;_ev%>kZTkU@wGB z*f^}{;aWQ}lQoY7l94{rSAVKaJ~}31SQ|N9euOi8CR_bVZM^1kUVJ0AGT@yIKpBS4 zcA+ecUo&LU7EP$oF;LnwoMjn4cO3o2hGaH!;r5<-{e{U5n6j^{gz!1G=PVh2S(7{D zOY%OM<#Oh$3Ns96wI@&IIv|MYGy;OY$%^pcHMeA^*p z_fHw2i?sPkX7|S07>2~Gl`)PMRlGX*bzZ7S;zL<{j|)v4zb~Bj_mAoBMi6;-uHLkU zu3VGLD76Yl_%dM#&rwzf_zPrL5$UdS&a9uwR(k`zG<8gB5rjMve# zQRZ4gjLn;12S@_Pn}3c?DjFg(dDLt66VsMlH^#9CX(>7kbn==t*EZzqH%x(DaT`h3 zua4L^D9UmXe#gf!c>$@c%tB21WXWseAzP0WhPB4-4Z7fbM+V(9g2gQKpK?ZljlsM^SU?=iFp&P~Io`HHr-=B{D>u zQ667T%X~qW@PxAa2e0UDWRl+V>EWpCEtE#kKO%Wf_J=DMEW`@nB{m%4U%3WwF=po+Rv2VMpxv;XzUU$#YL zT+jMZ=`Yb@6C4*90x59MVU`jS<$gK|ZujBTjuCxHSoqksoh~L-H+Y}JlWWT>c9d)(Ft%h110(TaSn%FMBbC|TdiP#S({|!~u2hdnz9GGp z%D#YH2~g$x(rDmx%woyaW_G{iVJ<{)#)~h;xIJF?$#nM#p9arJDG8F;4l1nHj}+1h zzE)7-Ju=z@(-|mcDhKx?Oul~|8mVJH_TWB04&qAm5ILUy8gLF=%eNCIjTBjgh?@C*l ze<}Oh*yy2y#$}OeEl)BddhlKU0X*`!&4BE({k1<=CXWep9`t|sbju-MBW)B};LWgU znNc!IwsVhWB|vc_JWC2)vIgFAgEen(LmrE^lATq}#2h`sf5`C{{sl5g{o=JS8IZb+ zGZL-cMw_ipefC3%WX>n~-Vf-@J@JrZvF~jd?OWOxgC407uVL+{24+mYFNf_2MGpUa zgcGo_txrhqr&e{W%FQfH3er*uqM#2P(Z2_j_67;D)d}@f6?&4Mb{9atS*ASYQH7%i zSC3J&X^`gc$QX?C_*XadmrnVmm`%tM!scJm?;#65fU?M9GC2oyPBkpW0%|dw18U>O z@*sl@fI3g>sqR-Q)SqkK6X)yUGa0b>bQTo+pz;ZUYyTvIM7#dM9MYGdz&;HmnU(KnXlT77e%z2LVCC_4{ zmhyAMtDc2d+;2bY{4BU%o%Z(6m?yEvsU+Yr0YhmPb_b2{a;`I z`x!!)%2CQ%aCH#U>1^!mRcuN7`12fUvgbmNo1IB-DXL@37UVj2<)W~;i0<=hOj^~j znKvK%ufR$EW4~QHvIT}AaUtT1i0%DdV2*z5Y*dZ?Zvp`g2(`M( zgZRR^$Aj_ytT=AMpDiR}l+ona&}=9eP?&N`rU(v#}&ybgZmeyd=5qt zbK}=VSA^62ihm~{X3b&8{PwCkmXAvd|8P1=cMg5d6nj5(ilvvA1y<}z+q?Hg&ks0@#7#!s)UpY*>|0JVnlrodbY; zVkn7$>6|$}!!iVs(2+?t!5)JMss>j(;movH+i<5+MVE$_H(5M4^FcgtImCTumm+hy&u1ji1*As{`UZ&1>AkQ zGo#4z@wK#pjC;fy_dj5DDhS$nIy*S#4}V-Uqpj(F%rFQBWif^TjO4jq8J_`|(EC|o z(|+(%9;~l)xJDqsS0!Cy6h;KI``k(tY&Mg0oRPVx2jU>O&~8j8zu~wMo|V!atlY98 z+tS0C=_U=bC8 zGpe7c<%_qZA*19|3WHx%Y_#+fRZKFUC>Ikg&f@S7U%k6F=XhFY_3$PoW$Rf0R`vBY zu%esGn`8nubU@HZIYPJYd&FjXr8yc&rM=`I5ZNaQpnO;v;teho^I{f351oj+CKbEf z05&#VWqz*Utw#yF1LP;yc{o{H%MZ16EmyeLwT6P^0XYtbDhnnpXrRk+^-ymW$X=P@ z#D_7yapnGk#`uXvy3e@smnMh1E!ML29?ol<$GSE7)r0?_vWo5-(I9M$%PM_u@TYB4 z)Lv56tBgYp@WDfQE(puP2d7OEI$s3y!n85nH=ND9EGjR;5(49!6Wf5e@PtEH|J20% zP8o4m*Q_pCWp?>j85H_3na3gmCM?D`n0;BKXt_;|WUJJLi`QVQ z&j;JQ;|2d6WxT_peuo#MrZ|aGnq@RQneU4Qr-S~5zOhg+B`8bBMLxAt*|dffJ9^WV z-pMmOqMb*ak&6&EYg0gE(9*C4q78x8q581KN<&UtM6MW5Z*?1hEFi-< zi%1?mMnhM<;G>zUe7HliMIl^cBq)JO6F47}6QTQf*VtAh!9NIlC4^?fG%UOF6UXJ7ZJtW~SHnf;o0a>4sVEur_j_o0naOd(r zK0Q0+d<}y=x{hgarNvPjdlVv_spAD)4rNTxb;!{=IkR*_aKDAlVbY>J2S0mRp7+Ye zKNFBhtds81$d5GMEH06F2IMxo_b$P1Tl&?nNl(b)8LmmFufj;2hyLnJj`nsm0 zHB%v&A*xbG&U;sH!o}famF`2~hZ+ss)V$eB$z0e0(VG-rrm_shcKAu0hyWU|!_@&h z9qZSlIM8m^NdoJEN%uz5c)tDC^LNGh8T@0V&UnK{9L&dRY5 z^y@7w#1+5I+0XxmCCsX-zxK7R-mSW(}jqHRKRL~ zdf9s{uPIGraPW~>YPSIWZV{hwGOJc&_T&M5Gkb)s7RjGFEOcZf>CW%;AY)<&`oihS z7ktAqJo9ik_tj*WIpXM2%Hi~ovEBW>y{vtW>9&i&Tn;whsnb{Vp6y{`6$eXP{H(;4 z5wbIH{!?~L5Ti5r!vz>l+~_`XSZ=z+eepg7)+dgbG5jd*HKuCcem0$B1mo zXr$-{pl{?C&P?>yI?XS2YshH(dN9Z2p}eMN0k`I%Vi5EUjOT*Lnx7CsCEX}A74;PM z%Ayn)(zf1G;N5^B^yo94{%sXOqQ@RtB($C4uJ~^*~7(uD@nlJgf zHJ@t)%P_P}ADK-27^AR*>)6jU{l{wRHeE4(d?=l3B%eyyg88QbfU4FMp5vFs9w1+H zmisN(op6Qy8jv2Z(Id!d4t{^>WYbW?I&Dz8ii&19e*>t+FoB+}<;no!6`NY@rs~yO zxcHxja`3z)Cck;Lrpd%|C?mA$h)aAtx%;` zF*5hg8=bOE7I~TvQBll)FTVKK*#V9xaH0PW_kkM2t8-5M=9f|=c)l%JMb;#H#=G) zIl9$!5tf!9x#Wo-?JF%1^r32pacTLM=Jq2HNto98K0W{A4^4a#{t5`;XQS-keWAH9 zG~EJ1C4KydleM+_2vek4Z(rSkOz0J)tVE|Nyua0`vAc5x=sazA>5*!7S$QCAwh*W} zse_TLNyUCgYfmdq9_o%<^Vo2{(gIC+6e%9*Y*lg%A8C%Ci2~V7FtLzn+T{sax&&7( z&64GY`ozwm(Ya}xmINb9yf`Aec93Bz=~PGv_)<&gPsr>(4kAMGtyb>Q9}rW^V!K}NGu z`sl5lHOrINrTO^JOOX28g}L=E=M-(7WViAQX`s`Up|a!l>2Q`epUOQg(;5{5zO%`h zj6{Z1K|3^Qm%$>-KA^qjN;{`V?eK&O#KeW&ZK`w142WM$Cq|g|LG|8(Zp{|RXzC4RFQtEXU;(JH z)?H`wVfl0@UORAM+0RYMjd8)?=SV+ZwNs_PQo?3YQ)C1%-Y18daEl!`i{N@xw>%gC zF_0_d zbhP9 zd;!6@5waVlBxz`u(fc=74{vP06UPdPF3Z~Ak7ncoj+#2CF6@8#kG`FybzqOnh9pv6)LtBcS}{Dt8itY-#a_3nR;d|k-jVlo(!GtiRPKMZg;Y5Y6~t(cP}p8eGb$-6h}WBjza@?G+Ortp0MCc zDa}PnFOWIBbVL3myc=E6Q#XR;A2kBRqW^V1bBv>w? z+~#bT*M)W;0eznrg8;Z%D-+y~cck-6Hh__aA!fuZw$Kk5JR5FuL91FryqEs&yirw2 zq6#a7mD+>Qa*EA0{8}^=`~B4o%MVPCgwd*R9||Q7zHN7jDCi4bPV9L8@xWyzKFB&| zbjSjTc_8m0o+mFYpzOiN0U&^RJdO$0RV|#ZJ5QH!)%NvAmTWzkWo7by`}PZ&W#}{2 zGhFgD4$Kc5;Ls`K3F|Lh()s<;(ye~s0IK<2HJ!~_7=|}gza;o>A;_1Q&f{h%20I|R zU_cOsaTQ}Wt66Rpe5%z@krUF}!+V}31#zMJ!rc#r3d#Agl{OJOV5zs4l|@wUh4w~* zhlP`|(`^dC3Dm~{^*BBceXe*oA*30PH4+CYOhB^g&C-5S%+;#ygHj>Z8AHDJ9UKFG zd|UL-$x*Sm4}F)SSW8RKKZNwHX3;}uef2GVd8mi}#>azne~@<&`KskDz!9hc(Briy z0xNi2rwSt&K8mt3JEu!07i~aPq9qsEwfnNGXLu6qPE9ch&y%&=%#hlv>TGlBTy0FA zg3t(wM(H!pv7zMhbu3j4{YO1r(~=L>k}92V&cR^IMAjPLw+3cu(VnILYEFB4E90d-hi-5}yv)*ir#kTGwsandd zg=-Fa%;63`Z~vqMaTO17v;^wsTW}!$a=`PcyHPAP;E{D!lk@!?53Ld6+0UAUj7-fb z;a6A{W!n6Urq1GOkf6x@Ld#3I70r zYJLvzJ7f7KUeEiGE7ss;*_XIopr)OLf^L!NgeMh z5VLDJ&p609by9r`c~7&==l<5K=9)@3A_~d7a8o@oU{zdJ70fC&lK+yB6|kn5hbQpw z{cZ8gSGhtAPbAxvdLL<;Vdu-$&SvG70K<7RVtLKIvg37$Q6MA_$M0$41zVN}oK{oJ zVZhqw<4IEgy+&JBUC8lNK$=+wxhDxK_GaFjp~KbV0OJLwfF90}Il@n2R1M1Ez4i6_ z@DB)8xud-?5G|-c)iO%GA<+EP1phSVF@o}1q(J8x$<@O4xzrs zC(RQq&YH#&J@@B+5{z_Bfc(dBXUOn{q&0sXHjlw#3{>xDZS`*|l3uLNR_BbPt2M(K zkqd@XmIUYiZ%FeJKk$b)hJFpaAbfM-Pa@k-yO3lJf+pkH~U!MH^FciS3ys?Nw$ORAoO%Gkq0oUb17#7S3Ss_e?pT zLjQGz3!uz}q`{?EJ%s8_Ae!P3FKOW)8l+7@3(P;U`s^ZRnld4tC;O*=4MZW}3=gsQ z>V%W~0O@+!4<4?U$aNQ9`t#r78a?c$2paIRx(h|k?PkFVx$BD*;zi~av$hR9PPcDh zZP#E=cg0d7SuF@$T!Ev@_rh|aMe7~Q>(xw?=X@zk`rpV@bJF>9=bed7Y`ylu4I_& z9xGVyx?x#Wxn&5v6@i2CMy$H0`J-)1g&AtOJmph5A2L=TY7F#gyd$BZW*^#^{0ah+Gi3_%2>v@<*W0(8LTzMR@!l2?f{TtWz2L$;@c=Lj)5RjmSDl&;?w zaaiCI_FCair*?9W9@eO8Y?3@AF@Zuy@bhfEdiu(R{{y&ayGt6wv{m$I)_j_)0zso(jWUf)}HdJIYV>4oH?2Cz;<3rg~yLy={lE&GYETD zq6#qF95l?qGbn9EgAIwCjMpx5{$R*-_Hu@BP)H=R zrv`LR=GXhb2S%NRx-3=0^Yj`BZbuGa0BvvfnX=0b-WQr-~x6sQi*>1$lLZS z&)63`i4KM}B1&S&J<&^IMc88fecuC>P? zxip=8?8`j*U#~9$%4FWQV$_Vk&)CI!{W2)7Ukq7M8+mupt}sOq1W;Sic=to!YP^c1 z%;V332Q5AnR+WbS#hq3Qcfxd{N)sgTYqU{L1;eE6SXmS|%HpLdLfvCJ{sNNw0xKno zpXC?kl7@7)l}JRsjgWZvCsoq)){mI8l#t-sdvv+15s<)8mGCS9sJc}R9o$5*z0JydOdNOw+dfMKKcDTwk@9{NP^`eKFrE)$(~p-lc8M2AdW3O zij3CKdN-ke-1Fk~vsn9GE{dN%qQ+G;K%(2PBYP|QAJeYouf6Qmwu#k(X}RQ{McAj< znr$d$yEi_G|My8NKZHHj=&fnxQmxAOu#LBl8_>j(md=xg?NmK&ZTI$#C|s@6-K{?3 zF3@!s-RWgV_*u@))yE50v=y}(%d5or@1ZTXKP)UKVJ{JGTVhyY-&H3cER~8Ws^u)O z;(Y59yVN{iCM|4qcr)VU%(eB?w+C|(ZFhkgw;YF$_u*+DMbqxZ&+P zexC0rg8o&(i+QxMYH_36?j*pJAbvm4lE@kk^HX3%>u)tfB4D0XvlQfb^j}<=Z_{zl zJyKLQQRS>-V1koVId|m9P`KC=au5nn8wswy@_t2SOIvW*HyD8Id3omu<*sFXc#H*6 zNo`qpHy!x}t>TI4=mX=vDNcXVf`bR=)cHoBqh28{!0Xa5NUoqLPl@42r$}+GEegSx zg9RN=&#mjThD}GC;orZU!F5BQs=IP5ssK<1*AK(tIQVet-|rx}s)O@HxdQJ<+D{!j2njm9e_`yfw~6;k5+ zz+XYN^5S3R!ESSb6<-x_0XNr*mH1sKU5L?RDtUA+(u@j^tKd>}HusP5%Lu+9FIT3Q z(~qu|0HCIPxfWmk@bdvqjVA4F(G#Z2K+6%H7MEK}5G~~Vm4{N6DoZoyB82frZAf7{ z?hU#gMld`8&|S%BSEwMp8eABE{6c(06sbb!N+qL5L87-|!a3yeF+GeE{k@@`GG~fu!nUK@OQ}1+pDc$z0+n?=bHL|RBOhwUh zQ>w*JX3ndNG{AV%J~m0P3oIn96{*!K7rIsf+p=Y8hk3s8+*E`V{vHz*+P!yu`wu6# zu;qHoK;^(r{)5uI1w@UJS}Pz!t)WW3b2q$IA=ri1Fu=BjQ7-uu8}MfE^uSG==o$G zIiLwHxkYipLL-_a$wEI-Ve5}#gQPsW9S;O3g>hVFB&@A;-5axKmQP#}mHe(Z`hdNOB!6>9{Y3jY1f6)i@7h7-vP`l-fgPYlq~ z`ngs+T3{ykx~F&iWIKnFZ}jnoKN-r5LqYAbkke6<;Md%b*|aC1t~$=WuLb@ZdwcT4 z4Ziu4i@db$lHHGU0$Uaw@nK^j>c>bS6iSpg@e^YP3oVq_0 zrA>>9FT?UdO38SNw;67MLerK>5X%RZ%5iq#_uut-RpVb=L~M$@u(!+18`EN;@47_U zse;A*O0+nSbLZrgpV7VM3fqH4gE#hElw-8g0LHxMlSE9rBYr~(1C2k8`^71}V;tJu68FJ|@Sc&b$ZyE0qP&Tjs zKs98m3@MfE`O4=%AK}9$={e~|129{E&jT^YtCrVg2-36^-sihV%2@{p@lUR+Z`Q zbSfh*0^_eMac;sBi!#sDLa!?;DyNAHph(+ysyLM=jjA950z)p%zUIB4zkmNW%`2w- zrNJ_P-mw`cX8o1I{mn*vQRoulZ$3HmrVbp?HtzV@Dd005h+o86-RXo9JR>%Xqf*HE zJU8OC)k%*Ry56k4X~k9ELL6vu+%zU$`V#=4Z4LqZJfpz=$}UEAf=kW5ll1~uEgj5e zI{XSy+PKvQw_&(!P|fEw*ocgs8tr;(YN;fXU0#fC>V!j8*^ zUZi!@t2Z4Fje&@QPZ$#2NBYw7AgL`NR;v)3 zOpm@&nf?c4oq8_iV_$2BM!gR=0Xk|GDTR0X!7TjsxUAAD5B)@yUQD^9rC#wbxHsFH z`j7gTs-+{J*;rw15fb-sxi-2ruwGl*!2fS$<)l`CbmcX>QD_%p&R4xP7sXEeQKu|TEQWH)KzKQn0bq&pI0yoFMeI;#Ocvk+8 z5*|7kroul>A2NI^9u92R`wd*DD!Bj7&v!HC9p5j+=-J7jDM(wl=IA(N)##ErpIkx~F#-FAfxh^L*U;7_627lRG4-3*1o2y#YAO_0l!|^`LA&$K;0*!0@5BFtt8u zmML5TJj@$9!Z-{{mwlR%J1lBSq^PgtW*ufZx-MODNx_Fp&5#&!1&?56HX>(ypAi4B zZ|qDh#SioK8hG3#P2Y!{SCevPLyIw?f1QmNQO2~~@fGUyDbnb&n;F>!JU%7@$M49QmcbQ0bZ4HI zlnD+;fTtwy4G>Xvc90X52qXOWHOq<&*JVL8#@wMYangh+g* z)MghDDm3DGT=YNA6kk5!i!b_(|HP_Iv&l=Fio~kKd{^X?>qz1FBqq=uAeyA42sR^s z9L<+N@?JoSdK8}SbOaC!!Dz9Z0lmZKZAQX!`8pZttXG~Pp0Jcp&p?8eSUyqvV-4jo+B8w>fvbDK zwZV`vl9~he4bkpWHN)IsUBrV_r#X7x=4*OjOfy8bU4BDSbJo+Rv~ z!My$^@97^_fzxS;FlXNpLS~ zP~!0~UR3gQwHQF96E%=lx&SS#s6r~UQXBYETGYUqLFCpR{v`OAcJdm8D3NJc$^eUe z(=DP6qKcBc3zaPwar=VbY%j6Np|H(VyX$bMI&MSyZDH|~GudOMX;QZc0dj@P#92Lm zA)4kc|C6A*KPxWqU-0jM-;iwV65;WU(LmC*`Q{|8PpI#r`c-vD=mnf#hk=CKU&1XG z;WbCjKeI8ZbkdR!2lMx@8KvJPw2mUPAIo|UuDpulYcs2;#&my539#?L1@U~ALTM_B zj;!-YWvCMSBz!ej1j%tB!0@7flu`ne{@WQV;jYH) z{ia9_>~*4XYy-UP4#P;w#7t3hI_c;;;jXu9?#jm|i5j9ocI2Y0qPE7n{3Xm~Zg)W! z&K=!!!ps|_`PjeHv1$umsr~-gY!XJ z>|*e}fJFTSN%%~*%7@tg3;_f$_c-%9n*CnFIYl*0M}5x&bk_zWZS!?}o@fy$=uwq??1ivS z>7$e03_?z@2a8|+q;&J6`qg~Bd_+4Pjvq650v8Xy<~S!~T)8l3vektbN*N(W%HGZ_ z_~8|jec~+m?A^)WA1Y$3?h&;A>gnx|twm95Gl`-m=AK?6JgR5!hA_fDJjaZdL>EiG zdN_LKXW7HASrW_i9N|L5nZnW50m64q(4kG)ho5)^H>%8tBo)UR!64lsTX*!sVScrzb($st=1$Wz1rzy z)ZY=IJD2d@M-l6*ETiPbSWu?8uJ?X$0W0>p+uE7vOhmIq>(Kr!KfI*pY+ZZvVW~AM z8@&%E^)`(-upS;IrTQEQ3l>RU*)U>Rzfn5KC*oR+Set0_nb*#@xl~8z@rmkBxg6si zOb6ck4(x%j=h_j|CLNB4s}!YAhL zF6ntdM#bg!@M5m|7(OC*a69``vR+6V9`nBW^XPGvuNGKRQi_MVla(+*j;c?cAafvrcsl^`^eG#zJ#uh3`bk}R&Md|h+g2$ zdOk%Nr9X^>pfVQ@STP9Gqtt~=ZLKOiB~E`v`JSJFc7GO+%i5IxWMxV?pYpn0l!$nk zVh{jp97)rLDe3-N)tdte$fUC6xBEF88hmxkr?Abi$7z|zl|y6mJAc3UxQY@Djt2>F ziwRQ+S2sC3eM5sI4=jM+mQR=AKA6Vw*Xecr?%&E$eV+k_Jk;Z>%;>oheU`9xyyb~^ z(AK8RU$wp&frnl!X>HbQXz!YIEh3RlArZwhUX{xjD?oZ2bg!+Pbv*L}`)Kt~as1b% zG^wa<8e6~NjLsmN())JR9T=p2K&Gu)DG?vMhtfr>kG(FD$;*Y4E!00)Ru*|6p1JZfUI>DnzDm zi|!`;_d(9HyDiC)@h!x3&Y@g-IFXvnY%A*nVr9?} zig#K6Nsko>o->GRnl7>Ly~wbI{H+b zr}El~b7;^2JBBd$&HMAnI#Pn(#hU6lQ)?p9VAui9;ON1DV zB@QGC_2vOZOLmLo|LV8rXptOOAZo>@kE3;sFbDxdEbrGCeC}m1!IK0Q@Hzhg@yL^C zWu;_4y15y4aC5juI0>m-ZL+K4HCQ6!sA&$M5A^8gu!PhvddbVC+<2va=nIh%lrJp> zqw#qCIz6QB_4y5b&_NWWTU_zU7ODj-%7AZuk%#oy-8KTvAzajgjM$>Wmld;jg{A=Y zvwU97 zSPA;7=;)~XwG!Ypxa-F!1^~!5^C2W*rX7SGw7c!bDfdP*QSdgM=nroiO!gJhG7_v| z+c}&MdG!IXScfSO68c*xDk7NDp^M5J1r5dJ%X-J$Uo{LvH3qd#4Lt#uO6}I1r#Ks1 z_$%q0g3JMG^5EQc6vs?a!&AQtvIShL?sXrQY(kB_KskDmHK{y*nf^ zc{(NS#)eQFxCz|71W>)037^Z%21wr6^VboYjs61r>=g z27jG5@Z(bv;wo&2vi+oF>g643-T{&rB`7|6H{`QbU}j z3_-Avx#{WY(kv-qmMDxR0AayM6D)`%sB9Cny3gfL&HrbNf}lk=}aZ+a_88R)yFyZ9?T$PBow=zu<*0mYY`1NGrVd7r5u zRO;h8l#EYJ)m_r|iopGfA5O_000|X30hQ!n&b*i{Mg%@2nm;fo# zblya#VrJ^%>FiaPU)0?Raw#Z1UL+020RYmtagu$wVVA>E&<#@(&{e8Ys~D%=uOXPh zYyKnI49v&c?|vY^kZo5hC`b6XllM{k-$K|6cwb%w(F)%T=YC_@2>714%Qpuld8Y#Z zOSWT}k2oQCp7@KFnLAJ*wm_k%zHOB9Qnd8^;bpoo{0={C&aa4A^^SZ*J75)xqp1AP z+jzL`myZSkj{#Dty4<6((qj|b#1fQi3290i{ugj%tmK_SnNZeagzaLKGlA-h{qlTxLu&9 z^?G8~?EARV@%(p#eC)u-a=>H(Uhz|>ID_B(T%^5YW#0V=KFM=NzZh|@z2FBDWBhj) zXL|wrvJWV1g@(oKG}q+GCoZwqh?`wf9>`AAvSe1mg|+PNb11;HkKUixZmy6b8gT{- z$KJl9>WE2qCEQW9#C>s+`a0v4GMLGiiji}DCucSvDHsMh&En%ft6(4^$bXJUT=V29 zm&VpH^W;^p$B`m8k6Qh85hs%WE2tt2o|H(D=1&+Eq!r>nE3SbyGBFdbCI$`MFJ2T1PraApA@8@Gu?i9EXvM#Rj!49D>FAWUrk6g@YpBbsK)SGv@$src6R?Lj zS1kdi54+8+e!Yd5iBMoi@UcrHZZSn!+~kY*cfYxvzNCmCwQZhcyywI}tw;jNu7~rX zv_!&cW_K~a!>fMJAfAE2SYAR74v6J6`fT?m4**(BcM%T8 zDLL#+f2^?8@y(_6yvM;*nZS4%gOR5Yz@=@LO~)H}tDuUfQRO#0PlQgF zW)}xEODSNyU0H3*uJ=)}(bsROr4Q>zfOU>^OW}KPJu6y`U7M?lr5ZR4o*gUvvV^IL ziKTzJ?HQ)vf<1pB=5t;B_n>j068Am|SR)V{Vil^)ZJ=a{zQdqCMaYCiTdi_q%0T2j zPZIf+RicTo_gS}Mj+ow@>b;bpCb)rCJgM-a*7GC-)4L?Fiy}f&_JvN ze=w8Xuj|^oIeQ;4`iOT-xv%Lbw3WlKq`}JY+5P7LCLNf|0fM)5MIsxSxXY(7Bmxuk zgIa9`XR$FYLr@p1g% zi3rF;Xy9K;DM;#l$n5vjLpj6^p7#$9o}q5%ia&`y6H%bYqs|dgNkh!7@v5dsK`&N` zr*QA?OX6L$oTwB_iFlY2qKH7YO^BR3iWfE0^y3a&J6;5iQ|Z5m!-|Ue0GXXtpKd@O zP4JFsAQ-DWkUH|s8aL#4^AIcR+|zN)AQiX4(1m@*m{*)=Zz@0zb?MCCE&Mk-@4hY7>73OH z#>?~bJp#J4tRwk1;+|tD(FePy<^E$Z<{)&3{O zb}b4pB1{l(jC1Cb@k?6`{0ttE8nBaf0u0N6_i`v)u4swa409{NVng`O!kh-aLcMUh zwew1q`rOw_5$CCp*Ffbh*Em%tuT}MTs`?hMBEb+XTXqJ@**ReJve_yBD&p_VmJb5d zJpXyK*r+h0b78Ha4P!>-5NNwLbjoic)nA?GWUGXG^Ub*qIKo>KR;oP$EPr3LMDcx^T7RZi+I@Q?dIjrL_A7Q%SBq%kIsneZ|(iL!@fIJ22^% zc9w7M&oxz+^O+@%fXn90Zt<14r`qPPGu7)j00{Tmg56%$;rjRC>!OHZpdO;#P=x+{j4UY&FS*ZjT1=1849^mY}S zdcZh846+!tUv?r$7;)+|>%fmn2ZD^IutW<}{Mg6Nnqc21rQ0P3f(N$t%%C6btrv_R z@xZ$LSO|gZ=t>y(=w=c*e}n!}d4_HEy) zhav&~P8v4AAlmToa1!d<74xxL8@pJodP7qe~py$29o4qNgepxk1-d)gu zm8JNVlezOsp6i&3-x8AeEVA3SAN?>0;RIIy@CMi7;%Mt<11Ne@gtR#}&)fTy&d80! zxvvcG8X+$~mgTm%#ek{`SDmoqz2i(?n6tv2B@J~AU0aWp=Wp6ufhl0iM;nqPT?hCb|_~%0bWe*gP z`M(}N;hMr%S7cH5$weo|1QKdsa7^#%qEq(yoy^`2cG_&0V4Y7s6)8=W29^+H&H zFJ+k8<9Keq*zBeA2{jcJTp9|Acg8_^$KLux?Yn%AH92Zwl3TeYS2;Jj_XWb~={a)vO z_1|w5{B?DB?U>6j)8hW3zUnaiySHr8&M-4{Cs6LvCfU1<&B>XU(i8TYAZusY^5el4 zh=*eJnN3i*D;K>5=B zL&ACGuvG|wi4wdyLo7MHN$3GmmFA*n8=GkX^O#^L)55^AIXa!;)#mA$I z;~xLlAZFv)1=ae1X*ILQkj_S~PvZbZdCM1PPNMO)-COKKvZziZzDubfrZGIkmVSo2 zeUzqp_H{$2bIaLwmIGrcFGf2?yQ-}G8NI8kE5MOgQ@zv8PCW7D=h}Niy`0{A{#xtE zy1k&i=)K#(^Df}V--EhH@GE#nF8Hn=W%qVza}`(rn6M{q`1)%gY~owxIrA$6VEYYR zIW6I`nF;1z4chV8NV9y*U&=+<)f%*p{03c`%5rNJT-vhIz^RDPIKxfjjo9pbxA z;vN5TH~dD+db%%eBzEvu@|ux13RM?4Ke)1-70D!NO$@_KU9GA3tj&{#c7`ykH1E@w zJTNy80Q;Jw*csf^d*V>s`qloqq7#cvO>NEC3j}Pz;Bib#y2(Jo|nO+F`I;` zcxcKmwq!7P0{pJ#&7dkj*WHVj7ANO!#jyhl`dkyFY*Gq7$q%e5ia1=i^|V4a)9%nP zGLi{aN?z)GG{{v8s}ABZ-+ON!htpkLn|S8Ma_r*s`TRg^9|Or73ayoIlz=s%jFb1| zi;Ew+jnj(TJ7ik!T)W?4+CJ=qe7TzWv`wq(zJNtn`*V2B;$`X+se<$>nXXx0bgKh!qG@V9wYv&9Ljh zH0?dWl59(!^BaSSGZkis(m|PXX#R9qm<9H3szQi$e!8cb8rQ7|cbJc}52Z|T{otVM z1|}&LDHZtgmm(%zkmOxbJ5@2l%ccJo`nJsJpDoz754$$dR&>cRCPDMAOb!LgS@BKJ zF2=ek@Jf65)?$IL9#j!Q(lDKJ_L>9RKfUe zhla+2g~+XM7cKU3OuiQ_$ZIfN4p}m5S^YsVW)Q2x0%yV@R!lql)dLp}TFEKT^&9G1`c2cXiq%>CJnM>k`!Ds7AO~Ro`sh>@RFahBsGF8@ zXf9#R|1?aB#f|z@0x%F!SKg1~YoYvYEbI`MRseyO!V9k;*By@J-TMFGAow;*AhaVg zDxmMN8V7;$SgBRrYc0TAV^E)xNTGN|`BTG}O{P(m!lJu^PxDKRCGP2eINpugt&-Dz z8JJh(=dw$A@>|y9W2QoxncVjP%ljy`Fl(wj_F6WF->tU@WkFaE9a|~a#X!-L=3SK` zTVUHA0sKDS=tCiPk!rTUcp-Na(Y5w28Vpt%0*|EU2Je%1@Sp9mK9W=47P+nV@N0&| zi9QRD5t--(!kc&zOt<#2cZ4Mo&|>At#mR$%g5ro#$!89U333n#j$nb6(EY!k9mV-O z=7G~+D)^g55vyhO$sFk4X~QS{&s=d*{E#b7seU!fIbf%r`P8+<#HOM`P6*# z&QmLg5FIW_zIpAcg}pEymVT|bKS~D(7ZU7^dKC4O+nrA@v|GP>Sr(EE{IgSVb*3W1 z@as9`={GycJ>ui(Wza=aY3ynM|#HvwY0t^-QIw@dLEGcmftQU=jr>Zog5+i z076N~n{QFW=qLuaU;MEIEr`TNDlncdw-JD<21aiz42R?7cneoqD~YR}XG(V$_uk|z z*d9Y()w{LI!rVWxOitcTPdLqrlFxvpMN>n3F>bcZQrk;dbG=M83odg5xim388>}rT zQBHP+ibN0(dkxrK<8=%F!o_!fq(Qx$rZ;$|1T%NU6OAE@xf|-Ree5~$C)1|#GH$W6 z^)Z&fU>?}f9%!q6IZ!|@vtOK0q5nj)XI%##3`z{p28DTL=b#JForlSy>gqwL3e^LQ z_wL}o>GwQKY!-P+PO9F6H&^%_V-=;@hq>_OtM@ukq3-@Q;Q7oxh|>lK;DLszyn+DW zc!N+`Aii!&`9t>U__{F-$B1ygnHv+CiLf>Cw}glH5r4jlfF;Z2$RkM+dJlo>zd?~c zy;W(khoGSwO?UC*)ek=KBK9=D09=Ql|^FJC*NUGfZG!-a38{28y z5Rp4X{c>?)be!6X`e|^798l2D7gHCV@IT%C<08UAV@GqqN7tg4;4@YH6|F)Y zWx6~;Z06prr(-LFj+8tnH>c8ys?#vc+(=oTer(bO4x2rh*x7zN{*FjJy7NHtW+s3R zJh2E5>h&mA;nDSh$vaOpd&=)mMpBt~Fd`#N)qZsyAU*D?NH^^WCWr=yQ46 zRcE0bC8MS#ABz$Bmu?DeW;5;rIEZ}K#RY|pdB8PSwLorgyZUNOP{r#-*VWpm98l8V z>bA_OcR&4@v)$s!-68|vB)R{*3vwU^jsriWl{i(a&GK4fj*Br{x5y>jJe==cPwM7f zbqem6Bl_mydmbQ(^m>N9SczAX7~)BtQhnfraA-wa1p`d`?V8aHm_p$lI zXD&TkmhZ!+IGT&;7Iz5C>Oz7#fDmfHR7(-UAXe#0$|xE`ni*iw+S+mUXIe#57L7ib z_R||hYkkQ$lv8n`F+b|^(*=8{1)h)xOL#>&AFnJ)5PYEKY?uDDnA+TNM5zb zD;JgQTWccEfjEeDMc(8<;jo! zpu3(*-!2nU-%YuI*8b1oC!D|7(fN9YvLYYf`sb&4ZyD$zL*RAm zjgLLk1E&#HXnTSmg!ol$CVMzm)^vR%_B-8lpJW#-P-9k#T;ZV(Jo}Y$ACcyTkl<3f zcInK4F6$V8nxiQl>6-2uBOPxUeYwwLB8GZNTG}?>gPHH>`b=JI!qXMGj;|?0u3h?gN#PulfAiAU zOO`hLX^SOFX%Vi zdG079wKKg0s_J4OFT^JZ>(JoUj##w?UY;05!8lrNk~ds#j!byRb`{MuN!GP(7?Vfq zDWfR0-6%s^S)t#Bb;>wsdPZLKB$mFGI7(@MCO!LogOY3Tbo`uUEj`<+BaEJ+9Fg)cJF}+jHu*fIlCWOeG(~er zwkZtU`oOtZqnLAL6(y_-Sb0`pl?QI%zY|}i4-e4`u_2#sc`$5*ig$(-Ve>lC4OMIJ zIQ#0mgt9LlmheNgtga>*emIGF$2ZYADDSY7AD_M71iMDP2bNgYQHA# zNC>NH^YR&@I@SUr-KRs`Ri*9>9!>I-MqDGg-zeecRPT%4$Sl&lh#lCqekOWMp zM);=atv;6bUruKJ?!#qUX@OsGit@j-)KXPdy$beE$ghbK=vD37#M>%gE;D4+9Ml|$ z^75`X9oSeq*77&tyq_2@>(BpcY}k2I)buAWs1VTSrr}W)x;iYFR@u4JbP&lYDf`Q( z&o3F?7N)Ldd!$bMPagh2B;>1qa)f;NqbM_u!9R>Yj&q6}L=|pC|jOTdu27Ytq+Nm+V3a7{we|@D16ttqQ#2E zOBd(vUE*Gk=qiM>Y+44Is7a+2gW9b@4*U|m9eK8rP2Qo;57)e5k{!8ocf1OZIV#}_ zKV1Ybd3hoEHDYnKgGctdZaPb}?$ZlyTDB6<-;;rbI`f^e$4Y!Ue*SXV>fs^Na z&2?Tzy6YldkD-?*!4V)#^o{>Tc}Me743P`sunP&3~dV%oq@%~6OZ(3ZAs9w(LfihmYJJ>SE ziOD3gr8zI>_4TJaW}vN5DiFTfDX{|y12a3V%UHSw-R{SUP}$p1#Z(Ff@6^y0e#ko7 z3AA?52PS2Gm9JeE8grfy=vrpJ9X(BIuv`v1Z&j~o`PfpV{i)Nc6_-t=!+DZdRz#Rg zq0P%({=2?QZXt(FdEzI&B3JmKqHkUa_DNF-((8lE!wI9(^4#X@#Rp>v_I&2d<;NZa zTMM007UNOl6y_80LiD+(FtT`d1M=r>vGVEXJC1Gu=tmS5>d_T1#C&DB%4LN;t!N4s zAI&V1SaZ=c`5>o>Ot8s?7FAx5AWsWRXPca9>OC8O_>4Q_4vx!lZp%9N45!fkzyUHl zYQ{FK*X$qnxsH;|yXrCzBlrd^TFjM*0OP8r_@jnhsXnhe`E4mkNOjGVZ}@M-N}eze z!C&!Z0I&VD&67A%(;TE)0(jV86kE|kT+|&6^ll#G4AcMhv_eM^{Es7Z%wcfVMq4dA zJm;9(kX_o^BmQ5@tE++)Z$nR69+m_%aC44@B3e~v(?K7qB5$_wOKCNn&WTG5VWcC( z7exz$;57>diOG6b&CYxFbrB6p@NI4SquQFKCyy~kz65a&+5?Y}-m|$09M3*dD6o8e z$8hG#!qgaN7BLQc9O5V=ee5Ui5asD>bT+meVwi6rS)H~1Zedc+6hP(x3G!K}Mq{1B zFZjNM6Lb$m-jiLl^ykPy-f^3b`3(F@GsdsI=l8iT8-j5Wz{+M-0i$CTzVI&ZCIODA z62YQ*2}RE$tAqRx!y~Dr23JmfPpvB0X}VpcL->?Pn!lW%sANHn_tfX<7H>(W|*O_k?lJL%^Rc6O8C2vY5Dgp)|)?F!a}0Oxr1#ZMRF>V8^prO|?U$aQ zsSnDwLr+?3O0Ds~8hSS-{?dt7*_rDvg_PA)w=grriqMIVR1h6M2avxo4!RLA6vL&g zW~sBDAUC2XP0ENEAYQrdMcKt%Fi6dtn}XXUN0gcL+-gV-s5R!M_SAgVimV|2iJzN_ z^Xv41j1-BiP;3lfsNdnIFaV_HF@YyOTW^QRvw|}2)s~O>lxPE&Xo{3= zfnWCB7Im;~%H0nEbK}we4(RE}E899ADGrCv%uC{!G$Y|uZx6fBW}{DBE|Tu>O(Ea= z66UwoFhqysMrx^|Lo)I&xLbY({QLxDb@dcJT<}!|rK5gZ`HzqziJ&OAD05>DhAx+j z7~x&n{vyq*6otHfsK#R#y>;OcSC@+WJ#uZRtoCaIuP#wpEol`tN_?dsdhKC*$+&$5 zS+|kBQxz+waOh+rceS(#5}C_r5;gjP7@%uJXb;_ixQKaRKE48Iv9qhQkf9m|o6Ur;%pI^b`VIlF1k!aR#h9#qgP&Y zu&#|VGuH;V+qp|G))=k%j{w6qk7ovoM`bM=h$XsTN|{hjDrn8NrrrFBxRTC1qXoSF z^4GbDAW#q;e7x@SuWSgn6Pm|rSn&AAKbA%Scg-sbZufs`tQkp+01=`Q*3a`fxN*uT z)Q;IpH+|B`Y2yO|XSPxXXDrm^TS8AeSj;I8?+FA5%uV=S2XUXCdZ|NHFi8{k4uc)P(MhUBaLi+TZPvv82Wn^c6U3 z-oyFsS^@@)Q#?xaoh8o2gI&Rqx30*&WT=BQpz_}!dw2Yd{)s#i#%STxMBvX`Fdro! zi3;_KK9)rak&TG@$L?~^=)d|G92AC|R*!~&Y(hc~YkOs1yat_2C?OaDk4(1Cp5690 zK*4@PUvHn8o)0IE?+s*ZLS0`>2AZ z|7zpk)tC}nSZtq;VJwIhr62>|wYbkrj33BQ~tYtkO(hL<=un(B3D7{W?VKw zxb)$%>vMH$fKbBsm$%}B@mjW|r5a_CCFXKbjr56?om_Oe`jVa9L;Jnr zUbwu7+|9jVip=@?54Ids@ad5Awk?tSPT!?s#fKk;eM{SCT(yzN+rR7bQeu=s>PbtAm&fb}iQ~R!AX)=r^*C5xo}YZm@<_9VwB&zalup)@nZ7jq z+(=D+e&kAeqTPK&01DM2Y}==4s}yn=v@;ijoLVTSt-{+=0GlPR9{4&6>s{{wSqUSS zN1P=ueUEzNVbe8#%R#ot7HBp)|4;b-0D9q=G!}ZkVRIyN#7d2g;fq_}Q?bpGmul`*%np*^$#wtw`D^Jb2-X_9 z56L#;&o#Kep7W-$I$K37Nn=g?v+g;H7kvgqI^XM{)x)I6@ z_@xI?9O@ZvdliBq6`2M&n2G)(ys=xevHR-WvHk(Tb+bB~0~ zplE42roirViFZ9wy8`E5-g_|4i+bvMbHQx2d4YA}na}1opUbTDgB{#7gYPZ9-i|j9 z5w1OG8xh28?iD4dBY!vOE-bT8J#h;d;L!nU3_jq~5SCLRWaEh8tS^}6H0Gf&Nd*&4ct z1K3uq<%#?s&sUAM>q9E8)cxtvjb~&%`N9u?9zYuN{cLel)Oj`UQ=z~6Jzjh(Fi0ET zVf&-;VJO^4FpwrlSD3c3}(}X zJaIeue!G4bvvZ!PUDHNQSp7^wTKbhRsYyUp2W?_7|u{GwB)@UBqs zuC-d2p6LQYA0{-eLs&^%8I;R_0Z$VvfoQUWy9N-+nE$fEbTrH=fdd))_f@9qf5 zh+A5uNLvb}iE8A7{z)(o8Yyl{*HTbp&msIx%(Cl}sP=q@_*9EDLB|G5`rf!_pE1VR z&DdtfPL>g}@B1>C>|bOz$S~6wTV&rALa0QGN+qeRku8OiC4~?w->8&HzNlp0ncw@q z^Urh7d_L!%bMD#hdG2$bqZ|%=i?0s9scdMDnT(UH%WGN`e;uSJNy$>URu-+HM|6zx zbJqS(pdqr=;O!Cq=&%V9ErTVIy+y$u3#a%5Ti`f1(ldCQ#g%|CY^l{ig|^vgYJI4?!Hi zVjcVuUb$yFENv%==K60{R}}pn?%qD!5A>+oKStnvFApw?)4upmhS`v9+B=d`*VmXj6A{Q z)BMBSnGvjUvNjb%i!@eL=IjS7YAx^hfxqTFc_<>9DVz@@KGK<{86-&ixfb9*?X+t#S!v16gWh zqgg3J)TIwe+Pu7qFYQPBNyy~}@m3xCR7*{VDyG4BVA|MB1lx2jM^%*ill-( ziYqDg&n*09jGyxO+)1xr%FI2j^ns2d0M##tw+Ef^hi1!#_*>eKw~l{>T$K_?UEG#P z@D-}aG>3xNRk687hH4sAh1bn~z7oRpphC$_Adl+YYvmaANSk; zGJ(h5DiZBgVMw5D$qRGFw>qpQPVK6XVQo$Z0j@Kew~pe)VPKj2VVw0a`U;|ojgmd-<;$Qn_- zpi7T%na4UB@0y(;XslxYKF_AwN2)wW`fCVQ5t#kPGqzVrrdJ#y%}Y(4JPMaIpf~)4 zmLjMy7g4)>;Y)sn%Q2fUG!@7je*E9xf&)oGGSEgNr`~{Z6Ow^{K7T$stNNZ&!qlHI z-XQX6lWnY*rFoyFK3~(1vl(YZ$SVOB&#t+F&IpKVwh0_s#r*kFSJde=FTSV0Bk+|+ z&_xS3q|vRX6;Cg(=?`F^d#n9Zr*OW(w(O<{NCT-kQD{AvPb_ObKj(211YCM{62Q2o z_<|HktDu5Cg{vNajMq95Y?q*t0pB8tkxQl<)Lw zTe6>55@BUs^FzA})=aTA;0pk4fU#YaM*0JsjY^1(!5B6bi$l6!@?^o-htC?K^T zeUW00h{oxv1@a;I_sK!V!?~ADBb+SAAx|Qo?uu6+pm z_wa)h*l}AiFD>!E5~BEH?}HMz$(1#f->SdGB?(TS>H?>%M-gQzQc< zpf${E&V&By|LyU!JP_|sNxa$I&nfvekkYBJkNz9dCg7qsf{zkC(_w1Gyw6UR6rWVL zDYXS_hm~PMF~?+%L836bVF+ZQxwpt+?=PLxJgCC=ok8`@Uoc)rtxby4f~1G}?eS^0 z1oboXuh8}X{e`7V8Vn~6*(Mw?`BHW6XYd1oP3FxWt$OqCpYVJ&&%YcNwBgaGvM2sr z!)hHISN?2wd>}@?L2(6R%GpJSG|JmfJftBo*JmQjcJU}<>MaID zd(8@gd9iBbkQ;8{lE-b0g-Tpp9)9~$W@}qesPz?Rtk%BL-|K|}wK!vXp9GioMz-WE z+-%ZyfIa^=S;`90gz#CsPpN=-xf?;$M`iL62opz_l29WALU82huo;3sS!)D=;;ZBn zoC(4bMw+O|-4nPAVLmIM@X+@zQz5)l52@+=*)sInTZ5&<*^=_Lm87Zj0lxaf9dKx( zkqMA_=yAMCII0(=9EHVzk=pePWGequR`p=!ucZXI1x|SEqXQMy*e9htmPF_jyFCOP zG`jGka|nDejVqMqd`h+UIXo%;t7}E<%DP@+p3ZvdD>c8e>{u$OOzR1FF?Q&6B5y%j zR(hvg3e|t>{WDvCfWz>$phdU$YuO*X9w5gKxud0R7c$b4m>xL-XXa=kmkLMf?=g99 zW{XI^n;CqlR=W}R5NP*VZ%X0$J;aEUUd5PTP%cyJyePt3Yvk}z6bfa@V30&nC`93T zP#|r)bf#kx@*M5*#h29fI+ABYouCJhZCJ(7)LHujX3xvsmF2Z*FYzM3^ z!U}Nu`_y_I6|f{S^`7FGmj1<93V2i!WphisU^38uX7*%KuEg8U8}?-s^AJaa44UZ1 zQP>i2e(FOB;$!iGERyND;>Dl3)IA{9)D1DEIMw;m?N%sO^diGD5c*c;IbWtM^2WPT zS3uL26uQUES+n=&sppWhS`_xl^kF@pEUQfMzL4RafUbE5w8hCOieXvWtJ0WdqhHd% z)Ne=ha>^JytM_BN&lsnEHPWLXKQ~=n6B-_bw5*o3d+Z1ai4Z()=op~Pe$&`)DE`yK zc~b6YY|{$!AiS)o9r5)eHvM9#GkF0T)f8MA!Q;@sZ$)(9`O@UmPcHA zu(}9&FN_pB?VEluP?y>L!Pm6a%DydLe#&V=muNctSqMxqDg88It!!wpmlijS2=2N2 zIOiC87t$IRM>5(iCR2u=W*pJ+C6H$G%?Yj;k-<8yd1L!Oh?9sYscwXTffb}DE$_eW1ADe|4Uc6n8cR{ z-G&M-fE7}z2IM(bgO(P#E-I4!!mSeZ#*>7)%4 z86l%Q4G)sVKz7JEw)0$BSvdqk5d+0a{#vgaJ87xRdrCQVRq;}g=A2H}kk9wSo|ES~ zAf~!mph4X-%W3{o$6Kb{j6s^h{g{oBhoNHeW47@tvdjEo&ta(@%oY%j?Z1%Nq(gJ< z@r!9lz?%7r5ln3L!H?><*88bqsd*s2&6Qni$JgnJPL1qN<=sTIvMF8PW+YWGCeAO@ zbZA6{yrCvyE0f=c^Uq$%(-<1$oE^?jXfmC;$9hl%%;SsYZ_hs_t$%7ou@mI@8+f39 z@p9CkU5IT5Hh-@~vF&u$`r;}@E}yUWsi>6Vvqk$8U!f%^BBRWizoYeY+lxoB2JF+) z=J;%z4;FguIn8F|TM|$D{$|Ilf?lRyrgWQt^qiiaLR7F~ZN5L|gn8`7}bv zklK#!KH9uO1Yi7|FVUmfQ#y z$+W(&aQ9}QpLtY^SZ|gBULQakag4}4wP8qN{we)HtM>D~+)`upeC5Ozs% z3J>GW0V%I)b00OXtdfVVqZBt<`k1DI028}1Uq}Tw&w0*UT4k0ieO=kOZvVR6k$FSo z?TLLER*spfkSIf7Y#*5Zq5CI~;irwh;tWULq`M{|pY0D$Clz$&Zw;6T7DS4-r@BTd zUdnDUh3T(V4HXLiBFaCSlXOliG%FlUZxAu~iHZvJ7vnGMKbJkI!g66QZi`ZJf``& zha0$~VPN|bI#Z}6&w`=^LxH8V+L9lZVi)}yx+H}9R@XHq9RA%{XKn9Q2!z@1^=C+@ znFy>ztz4J9d%8vIn-|Q6RrMtEns(D;kMTQAk8c{gZg1~d=R{r$G?{NvYC2MOY88|f ziA)NTw2P>!%-1wtsN>&TALMJ=HkscP-<Zsn*r(5 zRS7=lBx7?mvB^^6QF`#MF{7vE$M&6c0nkVG>i8bnaoM8c3|5+vP85)oJeSd!>wH^b z1|leDT(LA%K4ah<5~c2k3TnKw}}^o(??rUiKD3|?Xd;k#F~_sZ%}j_v$#aelqJylFsoKR7je#ZkIY zzu-m3oCIWG1q^I44U>8lDPNF^wc)$?9=Ct*uxxT;pFq5O65ZH3=Br(CZmORBt@f)w zn#=6+Qm!b)3a4e?PV`U_eSWH5oG=+|n`Z*Np$Hl}a@=j9?ZF`s1OTzn$u_CoYx@@| zi8nTOFuxnEh{`Idn!EfqWH2M+l)mYeGQh3M_Xl}MK_I&yd}^;u+YbFbg!%5wR8CnM zu*~8rpPe-4guL%xQA#ty{v!IC~Sm0lRyxue4&B}B+G>|Is z;Akw*@i_$VZ{hJ~sd_1@(;54;9tEAzJmXs+tv2DZuOdfKK3`=YzMValvmqo6*v`%{ zgKu?Cy|*3{o&$HlZ-?>K7k4ZXN?m{EpWCx7u7}9}2>6WeC_rhm4@cbtxWEF!E|(IA)lFp+>m+F9PHPV1w8 zn&hMA8|^P=b4LM(j+mYO!$ox>(_# z0C4<|!QI_w=MPR9xQk6?Hv$qH2Hs2M_CKkLyixpTC*2Pa7#NmJ4GWA3jt&CI}qnJ^_)Too;jKEMdH7*doyU<}B$kd1lq{PRD9-e2jzolQZC0h}+ zG(blPep;HE21HG5qL#ri0)@7a{)f#VL}}~m64VLS!HmS#G)qQsSRBEf&Ux2)-0 zqfrS~v>353qy$Zk!$&l<-69f~`{e1#jHrl6CZSSat)5^(^-$_okL*Zbgva?O1n?mf z!(Pto899v-f|+!~!+M4~3>viWQood(9uW=TI0c|ZKw_L(G&aFAE;u5bU^pKV#|$MX zyV5_o#lhgTO%;OeDnavP6rEC%Aom9%{3^uzG*cs_)BM7&u5U8I*~K{&g*P?|n{*hq;<$B!=A|fG z?_o8KDWNSlPQCNwc(tk12-A7W?!EUQAu2T7wB8y+VA2Rw8swYv4A=U`S;@J-&d^aP#qwEuoP6f4m z{~{78LT}GqnMB6A=$;4224qLqlu_--;pZS!Bu*!Q31xgIk)rnIJ3Q^l8j+^97GaCQ z<{^wMm5nwt`XRzqXe0|=n%x%GA7P+Ose1npc1*xngdM6Ox^UUVSe+KLmIrg*agArv zAxsS-(asv*{*h>hu03`*;ZsRSOx&g=UGD_bxpHrhMo4~W?Hny=G~-I^em$F>^0H1W zX3Wd7yVl;p&YtuS;eGBOwv7+j#?8Um#>K;eBm*q9sNOQ4IuUGU!?7v$iQariXetlx zD6v!yy_|A~D4?q&LvW#~x!5KbmGmmS`zJqSJ0c=4^h6MLKb9FBTV6z^?!5jIJXb`0 zN!1C~*PiB2u zi4rbbeLl*o$VKJiLR>)?3I8sODELhcmRM#ernV;$OVdbPzxzXR|4O=FN zjYz>vVShW5d2wiy;EV0rgh;Skl1r+3{$jGv;)9WO<_OU00I#G*P^bH89@aYcTPyO> zd8-3D-!kFc>=DZym2nwOudL`Jq$_S5Pc=A)>pa`GDu-=s9$S}ev^s0mVgG_0{`HdA zx(+Z={F&qNJ-5W$*^5?Egop*34p}s=s*L5RK^n$nzrL!zJzK#<5^yi+6XJV!YUSqTjW+S*7( zJyOT(N^kUN*niOmhiN6PgyXJY#cfp}e&-M7J>4w{=8cJut|ms;2|lF=1-38y>;8iFjyAE!Uc>v@JEP2A;K#2d zW9py(1Mi2ZmjlqMHCKhDz%IsipqkB7a@}#4LBN+|e`1w2m$L6?0Lkhw)xwpS6q{@J zfad8+skk|IpP6|rO4~yXh%Dos@`$6TNuY{_^iMNR<^iMwP2=hGN@i4849Ei)sX^9J zsJuFumJ;mP8TwDZHTaK1aIv~bFK3gzUk%ppSi^^uwaCHHJoGI9+D+8uUVhJ`CTUaX z{`dEwcKKKW5+Gm^2M155uqG5`syR+&|5FCQSyYh@73mhw$qO3ywim-}p~8^s$LozV}$jH>?!pS&el=}D1nCux49}?%`=6MYIswCittp&-Q2GvLk zK_f0W4?IZ#Y=Y1*wU9F!k+7GLVgT*qu`~5(jfmLz<00`8LD45ppUWg>2)asA3n_?l zuecsXzum!aNOc#o62FY3hHD;YDHA8@MWubn$m268kBa3{WnDTZBV#7;FYN+sfio=L zjzEwtExwiSK$hCXysU{|S_$c7D^E8!jIb5|`>f4Y!hhjMW!RpvaN^B=C4z=j@H6@{ zoqfBf6j%b2X+Hu96!%jKC`%4Z3OgjZrgkkfzK3k0U6OsuXRG{O_8-pF8DIOXyA}2vrRO#- zYy8Y&_4vw&AuTa~#9yx2+H0}3cc{{Q8z_}hCD*nl{{lXmK6%d&DNnDk_O|@T!-i)Yva5Sua_8y^)?Ht5=8Y%MF&^ugRt1{Ywp$3(-M7;70C_!S zI%4~fiu0xfo_0eX=d9>D{G&0H2^3m(+FcTP7mf2yR2PVI)}-FP784NBu<&^zuZL`D z8Bd{H){G6aJxywnscP^Yms5P15wZ77M5-*W1^GPTg^O^@-J#HvFauz@yhAwv0JzKs z5P*QR0002N3H79QmjlH3CuM==#7|}~XX!AqVGzp@0uV6T*S`3RZVv)XYWPB6E%so* z%6QuHohg@B2|vN<{qg()j;Y?iX1xe70Tk!3%rCInW+1ZbC_kejeR5m#hqgIhXi^~s zn*Ak^C*#`qPjW!mZ(zUfx7BKZtzwF%I**m`KAXJ&)X_a9=)sv2!x@y|(C{!<&g)<( z6X2mamxGY3E}M4Q&=SVepXw1tZ;jbr6i5+=f=L5?YU4K&B--($oU0zzwFkia)w(ivw zY;t9VwetOab=Xq}vSz@FX5Xm7tf8boMozLpHrbIeb8+>saIv;? zbxWCdy3uE1Xp(5<>Vm;<$>6;#+*~ak$)1*y$s6)+4x82%kP?Df!b_4J3eV}N*1c8E zrrds7I&0!gAHp zlt8w3x3CPtkHEdGZ0+2wNPTmv*{Pg4$Og)per)QcQ_OL$?mjLyc6dSbdGw|5}Rx-EdVZsJK!wr(~@!>nyK#bWqq_!}NK zmHO^>O-?9HD7iXWyVi2HE_u7~_`*c<$Lc)Ec(^Yy!NT0s#?sXl>*?ka2=2B#OL22` zCga_&1Z{nG@U@9R1QuDV(v<=ef7g+=g77vZn1iihfR!zeW4&}VX2Hx%Z`X#`xf z!C8E%&3&~NLB5W&rK1F4EngQN543Kltb~%URrQ4^5!%YKQgkd-dl^Z*qNI|1AF94- za}@I=VZ`PrM5*4!)^C7-Brf}p44~CZtt_kOvT`4HoFyvcXVF~UoImDDp(ZRXNYE_* z`+NVmV-N+?&5v&{ds|_Ai7pEQ3*~N@o0jgF9*X5EOo#KSMB>-tMT{pN;@)nPbf*;W zYNjbE@m@L+f^msZ)x@q5y{(+@OQ%$jF%vNSasb%6g)?s3=;h4#xAusvYkH+#)slne>5xWf$?lh7nE1Tu(w+bpD@GQ&Bs;5?mjRXHEiqPzT3GyU7%~T z;ReM=Ir~ZO;Xx30e23NDE`l9iLJDtwsdh0Iu8g1uXueAHnGJNcE<@?wdLc;GtdEN8#cHW=Vh zS5Z-cM)708)oTXH2zdySu+_7``7X(8W{iW1FgQPZQ4g_+I0hpKLxrJ?Ink2%a^Rfs z7NiVX%Lz^(#2Y1AITuQj{ZeCGDLsc{Yh+J?Zr@!XgQ5dnFwBvM~#K~nYSN;T@CRF51!_4z7(q+(ok?Bo5o_P{ zU?8ugy~FgWD4a()NGH%f%YN*m zLGmf%!8&GLWyP03BzzdNjn}{cR8ZTux@!3d-_!$fanV?vT!n5kw6-iE{xGbJk`hJ@ zZjRwRFb_mzDuWZ|DQi&TgpsX7ybMlwZUa?u7Q@&_9pmHlk1~P|+MXkL{i*!i&X579 z1ab;11-T4r0`G9HIw3=cjMmCKB+S!rsw->dYvqIu+5I?&pXEBJ09~oL(YR49HLSkW zR@|t#Jq94_Q*E5TF9U#wX)=#(X(XrV=a?R@OvZGt;O0l9dRGn$n*4nnGAjC&z|HGH9_} zz388)*GKNj!`N86)sp!G zykT5iBHl4L_E%Y{Nq7j+IhbKVXUw-vYa}Pe$6}~~1pZuld_N&`2rhw; zvY~1kpr6L~eyJO(Su@D6pwxnipT-lF4V^=ii*=uV8n15y;!xP+y0v6^O=Ei>P93dL zQ%~14zT{kWjx25fm?FlU7z8zaYceO|PyfiIf|}X?j3=7;-O@5UoiSjx z`_Ibz481R1NyP2lEV^0$v zXcuO1KUQ!5XS%knjg6JQ&0&t)5giLH9rZ^RR_a3g=}!*ZF6rp$>S!BS9zKQiu%eaM zyt1I`hQ~V8*RLui+ql|t^u08yJChN0n_qS`HexkmH}j3y;3kzOar5ryf_vW7@Q9Y= zYv?R8jFxB%8|gn$w>G!FXZP&_L=QL|=tUfr2Wxrx_=K4&Ci{>`RwMGn^Hx^Y)(v0F zQO+X#S&A0&Ww+fEV|}3cb4m3Pa=V9-r85pLfpQMEvUzbl(PjdK{BQG4`f_wTUL`1k zq2>yWNSPg@;*72Fp2q^~6GU9RE!5H-Tx?yN<>&;roP)LG(v0L%DKuD(Q@3>xV<;IG z#;s-q6P^R&R&ym!1G06A&3l8Fs7|7V22<4m$|oPNVt)F86IfeiG9W;?%vqT)6$|^E z?WMX3^X&?70D{HCdJxF!h(WS$^Rlj@SSSD=i!YXd2FMcF?B#a;?_dEhuprXyWA6wE(p&a0(Pyvuvs4P)92hdTd%3?$N6siHL z3N--==K)3v7XaD{7Zus*18jv_fQZ5+fPg|>okBg}GV3znD(fnsiO>L8V1HuYVBG-R zWZeWbvKm>p0JmAU0e4t;bXiTbITjmmmvtA=%xVVQW8LdzwVJZp0Uel?^l4VdII9!z zi1i52&Fc1I^#FWqcn==49s_z=z0YLXX6dp|Z*KZJkjdNUt2E(>YQdb+veDlk9pyPM zJ`@8l-9An~ay|6(wR2&0S_KQ}hR(%g+-EN5%}T-BSJkSdcAm$n_tW6&ooi>M`^v%u zI;6JeMRO*zPsN>2EIItLQf5_1}$c zN2oOqEN4c!obCnlUp-A9sdHNK{>wHKd^3yxm`vSi(tN9E2v|Crag@uM9T5wj>}%U@ zm602I=ym?wqY3`&k2~u+LCS~%XyAjlTn_4){Ab?#`KdIbASu%4j&$&Vi8`gd%wjPC zc47h8!)a-3_N$sh0&g}8bMK$Px3$BrulChzzwTVWItowH`32xFY5c_D@Kj-I(C@qX zj;E`e#2~7vVP}Exq)FIaYN^^4$)(#{gZ;z((y)!-m zCEvCHDG3Ph_T~{#qY7=2-VbxR92$Y=HKnV5HFzBTYbl^+^sS0)&16e!G2r8M&IKnc_+}TmpF{Rb)E_(6!Lx@{FHSCKkL;sM1JHJ5O**Li#o==gLla8 zi-_=y6S`FKHIA3^1j*M2E2`6lz9;7e#vI>8(72rCu3x`4drPc(J1}obT7uTE&CH}# zOkEiooYQyPT6X=xXn6-`0+L!{d|E+-K+2Danv?h*sZ5*4AIy+)6oD)T;m zQ108R3OWAJ|0b8io*g_qG1*pJ_f}21dC9M3Fzlk@R_I3Uwd3)~iWtx>Hgt~-x3e7k&WW7t{Lsvet$II2U$Px_vE)@bU+&L3z~Gci*i^VH_V-+Q3e9?LqQIdB#7;$@K2@ z6m$dpTE#82)UR>4$Q&I?;?mIiaJ93qdCJg{@WylE{9|4Poc~(jX8US9h~H_y;A!{7 z)2}}&hM@j@`V9{N!$}7_2Rk@TxOIOHUjdp9-LRX2I})ecZ~*CT+s3 z_1GIINf}-#u!t^0Gk0j4H24t(5MmPD3Qu&{MF{-GE!U;ju~F%gEr8+O6-nFxa{6Bqz)Jc zKzaO@1XBMWQOgXBXhffeyYIH5xBo{RgSWmM;5CQ908+D!5cC+@%=J%4BYeCLpbVNV87GAp1~_1!l?%L z=6z(O&ZiX4qZh*4qeeL8!MPry?b7l^6X4e8v*A8sUU0WN|E4GWcm%~_zKg-j$uY2X z&aT9fgS)?qaaU2mA&DAz{Bdz$jig^~uZb=kd-WQn3SOMPmHxIqgKt#|2Iv`o(gD(u zZvVlpVVuVrBm?aO&z7P>$hd=1c1!~N(n=%hvMdac`sAw^2qm}hb7C5|xA#C=2X3zh zj~Q6_bG2yzSiot1w|*dexKxp@3Uo4}(61Cpa(Ht+c?yej=6>UEu3` zI|m}&U{EUB11=wE5TNw%W#4WU{J`!dNI-c*2|h&L*Zp112Q^mNfj`LU;+svMWt)AG zLVy(HZ-X`NdO%G!AUjGo5cvD9NN#_AI1WSwSzhJad*#S6ko_z0idiQF6S5U4sM-}3 z?Y)3u)B4_Dh_RR){ULE#x;pD$W1J&y1HV~bA#JyBoo+__Kkr=-gi7v*)7g*D!* zjP;yWWq&2Avp+3p1adj_Le0c6RjqSg&I?YYm! z#s)LYU<8X1%k+Wf<&)L`b1B=-Cw6m8hm0z$)Bh&mo?eo2bgauSkSMvs>e12buOr>p zas)kPKDBw>3Jmpm&P_@Z?b~zpzF#zNz%jXDWZ*{9-5{k|pOBHCWVqi(a8=j@$Qa+5cOyKOkXjz0D<|}H=m;U}PkDJ=JVIC= zA$EAG_y%MKq;5(eXq@{Vg)lZ1HkOkUy}7lB0ICyY6o02C)4Y?VQUiEY2{s97n>j=7 zreI|uThMdA#=wS`vXg~)@ivV0MNX+0g*qff8 z;Dr?pz!pxA8XDj2Mq_;)UDaU*Zf>LL$QmYfbpz;p5;`bkNfB(lXq^ zjLjKtYT#ErcR9nu*jXH88Q%Q6>W!w1I8Azh>JNsKXm)}7cM4o!FS$}i#{u*!>ef zcnZ0g!>G!wsLxzX{QN&}4Y*iW@-JvE7qfY)a6SBAE+%@;^UV=1))xOC-x)6E{8IgH z%r`D3ed*Xclc==1wa2Ia3Ilk6oE7iA3Ur0L`}8z-^{cJ@@L?Qx^&9u|CoeB|0bN|| z)Lb1^fszP|LM`V&9X*=$a5^OZS_5F|j>cWs9@a-c3BrwMEgvT0q0>OBY0LVHCB;eg z#W2`n4o6%i;1A6aD%h6v&t}iU9tu}>W1)o(dCkrxD@Or&kiaC zi*^f9*;xv5>^IJ^0FI81eglFzdA+ZGe-s+(ZpCQ=OE3^8(@0*-@wH?WAMoOT?2GPj zd>WhwhJ^A$P+&d~8pywI+HIOpIR4-)5QpcSA7OfWdP9~!UAg@G!O?ZR@C$*JQUpx& z`i|xNxIAobLs}`uU^Ek>f;+&&jbDB`DkhsJQ~4ucWaH=6cp2~UUKxdH(`n4uPdU97 zn8x2F`5V=+vI^+U%WQVV96o>;7M?(4GLtpp<3i%XF{_{U7#y3wL#Ad>iY%(E;uPh&QHqvk#kUw3*R_rk;BSvOg3J2efT!xmga5qvRgUYA1xx(j+(-D zONx?YjgJm*FR^CIh+*@gN0&A2E1@?Z3vZF{vYGS##BZ$5vvy|h1tVHfeJEE=b#;ecVw{XRVfIyCQ9JT`wwx1 zh?a;dvpKE%yebD()p%@+ml8%9P7Epg#lPWOYpfI=PG`_!0OaqMWCKVTh^^@U-yuSJ zYITRj{Y*NqR6D_H7N~XC%v)t)X@2&)O&U?^kwOUbe3A_oZ z?Eh=5Nl@olY62o6=~|kU&7e(9eKmwZ^OjOV)$R6o0sBK?98=9^iX*J!v#18w2J|^2 z@xiA#qv+-TZ?!3vP1NMrY|45#n0htVlppCSRTT=$;AuC6jP!Q{yUYY_$BdL=Yr4H= zV4s7fAI6voRAAWeKn-S6kp4qrpvZYWz7M>)R|htB)Tzg#p1i!Xps9z}RSyYO4^DjN zed37v!TDW|>1K6M!}TtOz+(ZaGs(`)W$z;{<6o|grZ?xNMth{{6_(g@8M68W$B6JQ zHw)+IFA=uMebq20rEg%VIK}-#E1v4f!!0sN3x|K>J~E4Fp?gnd%Ef#8C{aoAbQzfo zIu`?72ET`=lWB1ro7|>}*zgEOrvL88A(?THNW!uIkQe@eQK>$OI?=jriY?#ALIhfE z=ZD&jQ~&8HC`1OHT-n3T4vP1G6r(PFDNNwCRMeNs;qDQ=yYu9d_YlXm2w+7{f~Dn2{A$ zwTk}gJ-t|w`lta{tCrSuNku~!xWTdb{LnE(d%gGXs^u!mJD3q`aDT@|ARbV+CQuh5 zJiZqBWP zHs(4TO!op0>hVLPxg@MI{M-$7(sF@u{jv~0BIw8QGBtwrlp8h{!hRD=n4!^_N}#PT z^99R>RWWS3rzW%n78pmYBhqCPi!j(Q-+o=(% zkaA54+MCUfFM}Utq6@CK5umo^9t;=w^x98Y67==Te?$Oo3{j3`;E%@UoH)#9JMMyoh zJ2+pQ(A`)EMR-sE8jT&FYOM!rsFSqzMrP(L3aK=Ty)uPhb~{uC33scMp6dpv^>Fpg z=-!LpGW3E8%DY1@%@7S#Ui`B!|AoR!S(ijk$Zr9U@?vBf-Q)|hGJ-o9olD=APl&h_gn9bBNzQTJe?= z!y`wAHCmf5sg+cC);uZq9NRcVScuxAD-wR9vua4 zF6h0|){XJLKDIfA^z>!ZV!!yOa3+a`+}4(3M^F&5sFOWq zzwkQ0cWNU{=7uWv5nlQ6-YI+3yAIF#g$nq1fJlE0|o%C{`>SZKGb(5Kn#mNyCTu6yf`y?KTn7LS0S zX`D3OB;7{|M;;Q*_a-NBHc7Cq>-*ml&CayWi%u7 zaS(LA)4F~JOZAy6P%RQl!dj(O7 zx4&Y4Gx=fUO5sGY`uTqD)gdSwL)+;O{kS_A+^ey&11F#6#xFMzjJtCBO|zv6#~V_z zHGdmn_Ro`FwNK-IsW>silakzB*@e=_iU*6xcipCM>zt*+AC$%`?F(ugrX%m2``+Lk zXDQQr;G~UC4CmDmi8yT8pGcKAznP5Yyoxy%rQUMv$?)H$!m6=KY1$6nNkJOd_o&0J zC9`|o4J%>L<{viKwdg*GIueQE9C9CZ~sO8yR*{@peA!e*V*5KaCEx;!%SqLux{ zy{Bdb#E&d|A2X6%detS3BH4k41302FV#PMe&<3)OO9S)?ldivs(t-)G## zUV z%h1gAzBJBkCBQp}KHt^0a!B@r^_v{vC!9t}V+r3TzkM5Ha}O94O6t`r&xq)3=ssj+ zs{+m4m=8VqbYpvWrCWg##`vKaHXZK`{KL1|HuHp<2;uUST*4YHj+?GQAqBM4PO)cfCE zO%XOrulgzh{s%4UiU`PQXg>R4bqu#aultx*4}vioczp6_S74hU`eDu@fLdBv!WWh9 zd@h|lawR-qgtvSvjt`694v5M}h?SSfkFb30AF~eTAV1eUK;6;&qqiB9iiR-*-W^c} zh?WOTb9gIQ-8V1l*3o))1bu){Jw##Rcdb{)M_ImAiIh2noqzP)#Jy>FVR)M|F)uU_ zFy7>Xb3QHSKfhnoIg>moPf5&O=;RGU-iUZtoC!0|I6E$lrF&%Nr(YV;`)1tv;n_#Z zkKtCz5B|{jlD3^@srzJL`@EmVY$?~QUTFL{$NNoCiP^r=!k5#ig*s;VbMd36D^;XQ zui%C@DE!3v6N-T;aZFwBo0`P1;6I-RKVe97vW}5&K?$nr>JM^hm(t#g+=+2o%qN4K zaXT(){uUIIz<$rDnk(eaSv}1vwvqW!{6-3Op50r+QN_hEMMh5hs2ubY9jF8FKt=!>7rJ~w}$#}y}f z^(t5|pFEZ0zl0ubclzSKwcrVGj#XXi=zDLy$LT#nWf`k8nh92EE^xK-U%fiNx(_d= zk&;~~pwCS)UEpYUDyx3mri1c{EOshU30cCz0^60-#~kY}Z4=|iKv>)X?7^1MKTe6N zdWZsPlOszAr5QK5HQguMda%&B!e3?8Cr1_F&ulJ+bBeJ~#$wsCaZhp4V;4^-U~&4& zNgWZ)f1{Y#XO654Vq{9%1v{mk!MLj3EA?c3XKjeCx>jZ^GOR(7!4@ppKSHtxj zRhvAMYOyiXUFxlCB_o=)*=fcU#-Do@&A62&CCP7OqzhxKZ9C}?`FbgaBQem614|KA zImFXPZgnS{hey9=lv+hM3}nXRIEgHSJ%+}%YH8_~f!o3axyPrMlQIq`BoULJA6vpd z&CcBGaOTW*_Z{N-yrcEouHGPBF}674V$}nfW$eFdmooKsb|4|@tn5F*?JT3m7O`wr zT?+FYD=Jk|syRKjmk4=r!tkNuoUeD=i*|Sh96yVHaUed-;o_V-rcrG1b&IMerTTay2ety-Sp8Q&M5yw>*B7T&XeOLfC;lv=~z2} zBd9>k#?6ES3d7Fhf|5^CzO?Z)#yBRk%_lhwmyfN^-?Sn~;vtRW(%mcbqaEYi!M4!F zi0pB!FwEfX$yT)Q_i>q*zOahJ^%^fLj9)sh;4J2BUbcs3HvQ%OlFJIQx7n+^9}X~I zp26I$j8+}WscdfOh>4XVh3a+aF7s-o99aTRiPx;1)>LNT%MsD^AYsG)sLVu7h`Tj` zprxu`7jNkmW`!lV3vYvyb-CE*oBD5oFc&A9Ue+wLk|WCkvEDQnXY~UIzXetky^~h+gtIgyOu8qE}5!t z4Pd!Br%8Gw)37~N*FqT;>E&la77e8vxV(~!r@Pg~Q)%eC2HhYY)MLSo>8OVmPrbs1 z2)5QXtiVr>0{39>TSEXM?!fbqnwB1Oj-Wt*+z-FY3jdQsS@C9G&Pk`>g87wss?#z( z$1bY}$XMP-K_?AN4WwmkrhV0;lCsVETMw%Lw1>KE+u-ICi;JA!48izQ@m)>005}1- zG@Okwm86Bo$WLG5+>kswJ&#?X!!WwmuSciJJl9vxlpWYrUiW_M9?GfI^f{F#}k9*z8LPXWnNnesJb%AvDzAlH_G4Kwoz~ie)@0BdyDY&zjZ7#|f7Di5+o&zwemj`n z_IdNIq69V-RW>6vY4LgDJkwqRiIuzKqex{pQuGuGHGRXDRH?}%Xtsxqg&A&i74LoF z>ARy-AFnpPo{CYgh`i}L?l^3%!*~nbWzBp?*@4>C$a~qd#~A0ZR(ap^-EPw`Sp%3* z!NXk}*X?a7?z+U~zB)?ph{Eo2{>WOqCKB2Wx#slWZ)#_Uq z_XYYU_ajX14qQ5TZuPJJg}+2x;B4UKba!2#|MD#sd3C1bz;$8Rki&D^`Rz}1bZ~iL z?t87ya5U}z?I&KjR+~Int-l$bg0H`Nh1qBDAz4^*xbqX$$>`sh$rasBx42qiJu_cd z3V|i^ILMth)<*F=UB}_tVTr_fKNtUb6C-71MlbzdN)pHOYjqI-={~fqlbq2)P+Yrzr=8*) zmzc;F#B^OUe-D=sTdHK%p^J3B2SJ+qmQWuogJ@R%S6n?`i9aCq&n;N3;2}02xCY@k zc`2KxcD9WdA}_LZHr@H21C-W0hai=Ri47`AgD$& zTT^j2#N8{niLzfGD&V5adY=X<8lno3#el;{_aL<9@d(-@+GAp;my1&&9 zBlS@vPn?L`u_==FBL!{qBsKV5XHxkWc+a1Flyt~f_`24dsjcK7n%t0CSWcxYySrW3 z8Fl2joxVoJg&c>=`B@t?CSU0Z;-v~&Q$Y$Vh*T{RbGZ5RWy0Sa#DxBi6!|*0XLO=N&OGcS*;(=9{c{%wL;z~XD3at3sVxl$z?u( zCun@K+@6~fawVoO@eMmKOE>I;^C!^kkMU&Opz>4Yr_s3ma$1d_M2AK)Zw{TVWNZ%J z_fQb1*k1BiT)X&e;ZuD|rH+l?*S~Y$R=54LgZsH%DzUO1G#9k_ticmn#B$Z69wbWc zxL>*)Enzv3zez!V5GX_H0zns$0!jCQBw`0>SJ>g`xN968KJr+ftF3EU5U%pl^}`o^ z9fK9XI^&S3+IkqQlAyKTFZR?@m{^SAEQaU?Sy!`L9-FCX{Q-m}wdu_paRO?!mO0W- z&~>QK@Fgkk=~_7iZV6+yblbDdBACsrRB5j=Y7{JqjHYyzoW2JEUb`l7U*_~S(r5X{ z0Q+iF8Oa&k0DLU^Y};Pb}pZlV)phV#4R3f{BNV+z^L zlY@~j8L7@7f4uyXA?b5z?tA#;2>Ww_vz^Sc)0^9x8U#5?phoSfu5Zy9L^H+Qm~P~q z%+k{?E>tAV9`!BG#5%_IL-I0zpM<-#zpB}cnl&lF{{+)&Plmljx2gG|MoYwTS^l4` zP|kUYN8dRSzXvMi#EDEkyV_VvY!<1zF(AVe^0j&yn(~`aYZf~xLt6*6B6iZ+Yv&$^ z^Fe9T_&>=`hP=KjwuCyhtQLcr6*$e^AK?0lx zqW)eW;YMj$MM@3Z^?)1=f`$1$k*o_wFsHW9q*rDwrbF_2ioJOZ1{1oNIgl2o$A9%iZM3_2=V_U44? z#x;!qn+I}eQ@HcRc*+!B+8px@4}~?Hlh2q&owid}mXsmenN&V-YOTw=@Co^G>>M7V zum|oy5&nHPP%3cyF>3^1TZzK2wVPGSXG~(V?3_U(*^s-8Fq7nbT~oP&wc#||2|%db z%C7IdBjc987DOrst<*2iv^7N&glwqZr@N_E-?4iuVe3W4XS_Qxin@HcNOQtL@3WoM zgUKkA5n~@)z*E@{vAq-S-zvq|z9)9})76SkW|hvZO-!`2ogCOGlEMT&^-WqvXIIsB zk7cYx=X1%Jl#5GUkXxPyx&CM5Lo1g z{cH=&{Y{*3g8WzGbyM6(r%2^4HL30=;OADRf98!a#@^^XR(76y&{#!Q+1^8ZYaErs z;HJM&>@w$~mRGK;G(2}d{2Nhd0Z|nzrINIjN9}CgOy8N*kTAE z)%iz`C;0EPcXf8Vq-h@_&kbGF0FJu5AwEq@v}X5XaysJ=rr9g7yChDX?p$Yc17aub zG3=i*%Z`F|PD*mNrnlGaon%&p>ba>v0oR4A!vm5K7By6DDa>Tzz8)DHzq6EG4_^n0_H`?f zTFWuG*nn>J3v_vHw{`l1uB&KK^8=k;Sh)eYLh+u2I;KC|J~rX-5JardUvA>U6HPiu z@~U62|FAr(Dfb#u@Ulo%06PeE>c`PJGBRuheU#zZ;k7eaUG<(7+mEKc4ur)Y!|os2 ziw^Io2w#W4zC2YC>@t^2ww6{K4k~316rzWHi;BH9YBcQC!NqXRNh6GG)x=mFD2+uyFr0ZAke-8Se1?Cz^|;NM&}Sm#tjE=@Ug>&TmB1{WvfufMqz1@s@8!V9c6!v?FoYn>KUBo zWQtLn5jqSL2+O&jN`a^TuDWu3hn2x(_^V7Q>OM-v&RaXHupc9gQt9&%%UtII6^2tY z`&uYyg)Bx9Om5R-gH(cWmn8SQ?I$4Q!p(wJJn4EzrIYy!oAH@b*L-w?G+Yxt4ULm_Ayo;epu|KB)zslg=M{_x z!8QBtVUyHDq;;PdKf^I8!*vO!igX#0gbH=RNRwp3nj(e|^jk_^nMxdpfmzZA+A0BA zlGlmptD_`Ic#lrycA$Iu!C`-CLJWyN3%xDVAEPici1C&O(n59-Gup5RnW1*5Ds6ix z3tt(3j;w}M8iFYiH7YPYI_Da&O6%yLyJR93CQHy+$i1z4!hsd}E)wzW`JXi&&MV3q z7v2!riOEdr`2)wpl2#Ii^sT!-x;gE7v0H+Uo&da&*Sjm1i4|x{b6a76C=5Cp^f2FB z0WID>r5i-+R+5h~67D7Hx2xYaoH&NThpPwK(TARR)t#lD8JitS+v-54+(5cjEu(ZDEkwM%Rb>C#&Csl+4w z$I{5^vHfXBI0L3*bLb+w8NRYoMQF3su0g*Tv~+|D-!yy5*cKwyknuHq+B5u)kLBJW zof==HwwNpbr?Ts*{T1yy0s}BwNH?`=R3K(v5L`hBD7tl1_AC|??S%mmf|^>Q?Fvc) zbtG&6#> z>SPa38{RH7ZB{LM8ED-_(6FS)7w*XI-$A)*?vRfc>mi?&ylg^P_Nycgq`;B*ec@N{ z?_wK=xzf#j%tdT-hmvb>tV$$Zaw08kwIx*YDi);4)3h^RSKRjS>R>Jj(@hVOazfXm zNO<~t9u_-IzpryFe$?lMpF_7jhKo_gjHs%2>q>xbZe!F9IWFc}7?sI^1DAOdv1!dJ zg8P2{`?yD7*F)9XC)GO=7U2(Ky5mF2gp<;0VW@Z+M~wP<{57(Yish)Mmi$Epk;tb~ zPBlNjIPNtHh0M`6gz1=9TKZYy7K>Hp5Ru2segs~w*V2|^n$DgL`w+P6X9=->d*s=l z+w|tRnwH!tb?qQXB$wVpSJR!ulLB8#-L)a9wyX7AL}QE!ofgW#9jn;u>4MHs|45U! zQv1>LNeBDOWBCCsq-KM&Y8>R81U)5$7nLnP+1e)WX)oy(-dQHMZX_Cc*`|ZkpHq5Q zsuWDnE)2-O)~?vho`>ejL;ICWWrI;MnB2&ex7!Ha7-!7lwj$+8g?;o=iBYsY4(;sT z?(gLMxdN*_A$2}StkSF*99naDR3oTWFG8h$_d(ss(0ReHR7>C$>}nJdFJ?O2zm$X-*EHW4YBpGa}w zK9diRb%ewLW0>+ z(3z|2$V+iN)tsaC=ngZ8cG9HL?QJsMsQJU!{JA8oWGFwE9qkWDN)uWB@9)aS@xnBd ze7$?xayz|97;(^msR;o|!7AJ@0wtuwC|8@JL6RFRz3w?jLK6$GiL|(y#n;am#$-<#y6^i-iXaY5 z2pAY$KdjLCGG-l4xky(qND~?6AG7FJ7!H)W)-_2=NGX?FMy{(BzYMet3OuNJWtpHo zsaG?JBIwqS(3`?ZLdfnh-oM*^V3c!GKB9ke(I zoLD9hu!M(A4fi!Gq+<+&AEsdKW8}2=@+NtPJ*8o?^?@nId)w`U&957#jdqs80+7Qh zpH#=(Vg{}j21u``-MG3#(eifT1^tR`75av%H{{Y#CB%2C^|^`%RM_1uoe_g`Bo!rv zJ1UlN(V1eWAQch&PR@k_tZe^5sS*Z;U6i-;VITpZlYul?hKv8XE4rktuI`|J5*i#6>XpUH1?#1(H3iZzJdU`gx3P{JPoM zQri%l(MmOPM8y!!H`K|ut)OC{cIa&b|Yc>~x`2x%tD_YQY+?89!2O^+PV>c#~< z$whWQzIl{|`A&h_muSJrwSgloG)LKGQVJ9mVmjZZ&^*pq?Pbyw}@pnk}U!Kq8hC|Qlva6)g`3~k<)gYp2 z*21o_W6*g4!s!mVd(~&3$|4)t9?`w_3oF6Ad!GobG{4F^cjxB9UD;l@)i{g#f~$8? z_u8KKf+iEuw!;eW;Cnqw$ul6<~}Zb=wMpA@RLsUHU+J4;(q!Fr6x%F$&w;E5M3N49e7 z2yal}<$*^8zeudk+u`UujFWJ^tIqfMEG}UdBa?Q+3fn-<{I8x55rGN9z0Y zFA)am$i_;9(ifQYE^U%<4YDk^1sqb=(%%9O?Xq$C7Lw>nJz&EP5inTkxo>qx3(6al zT`wRU&Whm|arWC~tb)&ADqY_O{=idHl42VPlBIGh;nJI~X{8bIrdw7O(k}V%Zxkyx#$ncP2R~P}db|0Auw4jB zHx0gU+!)1cME@$c_j`9WkiH1lI^L6dz?Cjm&=)p4zCv69m)!F))jEJpsnvHk2WIs{%Um?4TsMP>=hQ^9p+r%QrZv2hUey*P*SdvB>K(Z_`BfM^m zyQMMCts&;~*+I==(E7-O&(z=TT4a2#MEA=F1MwIFIuX2l>?M)7WI!Jl)C1HTB69_!;<4O0AoaYC1?6 z1PQQ?UpOVXxNRNhf?>Z6X_=NPV#;hw|n7`49+T<)yXkL$&gyxD{|DdT<| zk_`eZvBDc-EHTm`*b;SE`5h8@kd+bfDb%#`b!SPq*j~}MPO78bu14u1@}r}J#O77F z4{KeuP+wmM24x|VWQt{N=Ht@oGAHGU;%4+8^F!=deUIm=r)2GhsgFEiUj5ReyA^-= zMx{Yiy+r;VrXPR%5kYcdCc1lJ+fBlAa7Q)?4iR4`4*898vI$m}FHc*8n+pfOd2;&7 z^=iEcJ~OJX_itKE-@j`}7$XT2+AoVKcvlJHhX1!HX;V`PBFcMbcIzKD`lz{kxcvzc zndAg_@8w{u(pUL0x%R}&D{)p;o8FTi77i;4U-a|6xwWL^G-aN363&Fwfhzi|Rw_*3 zjp9O2EZe*K0dO5Rg^s~JgD7}mzF7j>BeT|b#oL}zp}Ad^s1Zd`^?AQ9Bf4JYcmJg` zR=j3(2xfEt@unF!w8yQImy3Z{p${K%V4 z!rhN>o=}hMMxfpHtFe;qF2ASxysB3NSf$P;D{auGKo#-4{b7 zdW^Y^3>-{^?+jc-TtL&2#azozGfm0_=?r~m{bUwFsfd3rwpwB{CWNqbAW|;`2trjE z-@!L=C?y}ACnuYWDcOm-{sT3XpjLj+fI_h4c=o~voyw~etOMn9AQNjuZ64KCCfsPe z6+BANKmNueW|Uw9KTe@m{s~MEAcLtgw}n+~BN8XDn9%J-bZ!`y^C0c9QrBno__?5} zPd##Qehhq%-#C$@KTpN@`+K;>OiY}6_kA+aIg2>?Ms~*%d|&owoax<@orDUHV4tR4 z+6}wpmsRvB9^G5rh?Sy!nZLN==|1R378oo;P3F zb+HDy-JlUrOxYIld{7!m`1(j1?W;(O{EZnG(RFm%@>MOFzv;>wyr=;>J6WjE4*ZR>2r)49p)$#e-gb{ct3C>L7F2cKC_Ol*5N%^I@j?F(wzC68%qPoME~HMOkM(HHa5#m|z)k zSpUXBFPLSFO^gFLkSb61Tk#Vef_-1u|Ka<(D{Xf+)dszpL0JW0w&YkuPjWo~S;(ks z2K^NP^zz>MjB}J#nmr#JRT_TSJP{4LJEV`p9l=4d*@j-;@x6Y{{58|5tM(SI&uj>= zqSl+$uba6CBhsCRVwd}xf3)^DHbhqne2JiVMBAprD6adyj1RsdOl$k?>E`DmTHck2V!1{7dAy4t&5oLURC@E>bT z_WDf519oW_(}wmn0;|1g^|{`DeR`%Ajd@F%=SI`#okLa-5ElToWzVO9H#W1{vgdQB z<>VKG>5o=6B>OS5`c_x&@wCW&4QYDuTD;_QOP^jKzVk~WN&(1u+>d*r3^JV;*b+Uq zPbyI@&?z@Gs;hB6yj;6#JE#)Vf=oG>k7UXO`;+*Md=CZ9o&pq`q zVhl|k2dlw$5a8FW%p=BDXEP~!Qvjzc#FqiY+CIsiWulW&CK3>`Urup_$b1<1J#bvB zdV>H8)&VNIg?t(a<`mm3f6VB`u@({JU#m8hpBiTXGa9pa4$OH&&*CqeKsXmXwFXR` zgE?7Wz(#ACAL>H_uo}C|pI_AG)FU*|zml1DORrLAYQ6$vi#0N5e}cuwlW82rHJSEfvs*m-G>(^&L2D$-4tr^6I>NyY~76)uqSNeKiwWzXTmWP-D zUN9|2SKQ9&pGUdlGe$FK^U=mupqoKr$iuW*QERL_>mmTZr1kUZ@WV&GkI?mYg4(C> zy7gYPa6=28#RkvT5jm+XXj5l^kuI`b$}~Fx=DvCm5K?~HJb`)OjC=Z{Yv*k!s~I2; z_74;eG+MRZsBEvR2kv&?8cm|C_IH3L=?y*SK+zRUeTUU4Z{gUCZMfm8_#qlP7RV|GbC|&se6K&$@Sj~X_)rM5cnhA`C|H1BX#4M` zJ2StwV|?}LTE^nar6$-#z!c2bC^xzd{vo2$l92|oMGQo*QsMa z&Fa^#A$o#y(g)iMkDgn;2UH%a1s2D>Ftjn5YZk^%1l4zR- zOkba;tj6&;Gb_9|xY@hyKg`BZbAwN1a#MlKbJrjK3iCuLH|m=L53G-lI*$=^1Vexf zVs>?9)*Wa$WJPSL0j6eu)QK>_hN_+ZF@#|D?s8UoGtulanpKSm?)zDnsY*gDxb`$f zyBfF7f+f;IxVIEHTn)6_p!}>`k9OB0*B}_zQez>@U?U=m?UJtmQ>uDBb_;cxvzdqu zAib$Nwg^#NFS_?rkAA%np^p|=nYG=juS;VciiI4SH-^q?y-8o0MKx`twrZJLelaa1 zX2k;OeGPwp=$;L!g&v^%4$&Q?8@63U z==YHyHK;B(JX^OwO>E>5iCT~Ap4>W$7<~A&I6uGRZu)9m{aWD|P-_Z$yQA|vKy_(M zcMS$&m3xV>12M#Z1ozvh1yD*pA}eO4cbzzfo(EPoNFS!tR;I@;Tfn+{pN;`Cj}VU~ z?3OYG!1w2_#jqEwdzt6%5m7+klRs1K=KneOWDQMydcycIuT#~R-;p`G>a2w}p4Wdm zzm_(-KHGAFA3eyb$-4{GWsPP|kMR+-5Fog>E_qn4H_gJ%tiP}Wh&=>ach}L!PXIlF zsjaSi;TP&9&J+~0I#6ws^Q%Q*Ki$&1u=zM}CbQ1{^x~64faxzSP<58z6MzONlnv*X zc6YaZ;S57lrP7Do^Q$Ipo;2Hf0kI8}yurTacdJtZ!K{AzA*=jb8MA4KntWn@dhO%7 zwLKNsFbnr7AedcC}8K41_#(Wg=RESx|8Yg);M|!HC!`0BdFM<3+FU z%||IemA%hskb&L|1bz9FZ662V_Xo}@Yt?8y7GACs$F##X=){Rc#ZvZ3d%f~wmHs;=UDYkFp$f@*;J91VmZ^3%P+c3K6h8+a|B1*_n!;X8hj z$|wd+7)ERP%>DwJ2kBwUU!gtjPzb7S*+9 zYJo;X@8Aoj-RQVb#+RIj`n%43P8HzDcOh&5MrK`FdLhml0P=elwE9FDBB~A0F+&YZ z_O%%;;iAs~jO5YPy7hFu{Az$d4+9(boE<*6VO+)@EN&VLV3hO08a1omkRhvra=BG= zAs_=`Ef~7q>e~zUmZR2I^}kRK2r8l>9c%>KVgQ6f&fgNf5v}kX*MKozAaS+#r>`Rb zaXJCuOjqNuvmF+^HX9d!N_N_6EE*%dykQV*Nt;EOvxb>7m`Da_;FDhs%AlyRqqmDc zh@QE(UYEHbjs69|Cp3V?jzg}?dd3K05Wy8OJ_q(U`8DXN4c9>ggaTHI*?bF;56mor zdHf*brfN(EsS%g&!2%hGETFm-d{fHk{I4)~z|5I;6nqz_n!l*(0hWCB3=mt{GY|3H zD!K(=>dh<%$Gf`L@eQ~a-e#-lR7O^1>z14hjxWNzHNbcx8*fH>W#2lYt_5|%7yt)U z0PX|ETwVicobr~zEfUB1UvOWXnTRjSa1U81Ow}s_pUY_&tf7IP-&SqW-vJqlhRuKU zjf|}FhK}CV-ci8}2VGPtBdh>-ED)RQ7i}|| z*M#^1VP{X2Lx`CP;GVl|KQ9*Y{XT-6_$= ziC-5WkCVRDn%#v>$kd%29a#mb98g5zo(x}Qs%rA<-2)~RNYJ5 zu_f}FM!R;JZG~A{V0Wu*g>5$mzge}n!c1^@Q;j`8>P1?RFyCN@#F)rbvH0Kf5RlOz zh83O=g-(bKi%O4*OaVP3#72ex6n|M_L?!A)h9^fFfqpTPmyAvHkJUkVm@`72~5a5@Hf-(pJvBO$d(O3XHh>W4quU(YJ5) zltwx-;o%A(!))$={7=w~8*wk@W~|gYkcoWc$Bt%%Hz6Xe(z{dQnHQtt;TfXDiD?~O zdV*deGJ%u+;qfa*K%lw+*#n|Qya(m&IdPn1%UIIx0eJ%uI*yofU49!E6OL4=Z3|EO zaWBmjkdjNBLolOQoaI;a6RAJ8E6x*QEi3sOOxMJ;#5hna;ct4k3O2gwmZj*pO=w-=xd|4LWIPZ!0GqQ5)R|>cmOS?(DPLVFt z%KP$5@pY+m;^!VPF64jRQ{+p$PLfa2|9?>uvF`t0;OFuGeL3>kZ|6wff@GrNz`P8Y zeBO#UIrG^@$-~d`|0`PJV~78J)%U+H6i2|fEvLx-zqcg`^9G>D{)PM$i}RjAk1Lb% z{{2-7L#8U0LLI@Zd!(#?v<11Lz_OG<^X|h+r1OShc^_eEUnNFA;=zD28Xhl6!|U&v zNS1In0t*k`FfG|z;*8e_e^9ddd1op3goI5_qMS`d8jzE{iA)BJ7i=WbbgVEbT4mDF z0}C<(d{p6}!G^@j|D^ukGw-JIK1yWs!@2vYeh=gzcn?-IdoPX_8<&KOj$=mQz#}I- zGX8(~N|Ixva9|sO+zDIy6CMG^_%ApS7n=;aN+Xd{z`-^tn#hVu#^JY;W9)<6X&<(n=J|F7X@;+rA9G`TWK9C zbA=tJnZo^kU8k13rS9{)PQ4CR06b9qGH+1zLFn<&^@T0U%6%{hq<^c&^*}?wOYvby ziRgF=v`newmBF*J{i;1%ef6HHRA|WqgBkh)AYK=DORAN5<59;MaGaQ~U*?R5X~>kJ zkdI1Gd8@r*@kiKkGA!xag9Au2p2TM;&lB)CyC$|71*9HIBD?q{Zx>#QA>G}e_bJId zf%rjXWkAXMpun=DGX78ZSe0=~r4MI=`IuYiCKrg4D+F>pKv=SJ7`||!bg%G00l&;= zAw}s<_N@5Wk1d@^LFU={=6{A2jHJAAm!DqC-ZPN)x3y&2S45I`%{bB;m2ufX+^7+YV?`>D9GOVSa^elr zHRAO_I%W-C=Ks6eg34fUvak#$Dts*|fioB@fJ=V#y}aC@qTyd_y0&n!#4o_-MaNJ0 zunVZv_<7|S)#tyjvd~jyp^gjVJD=x0&~SZB4-UCuP2H9kDB<3=HaGSr7+IjH;&0`o zQRam&nUEN}h!EF{S4vz2C1bi`RJ+=f`PWFuMfxSJ$3aKUghYg}W`P|BeL@zZIR$%c8EcsV?d zA+LinoF>Ie(NQJ4#3|#jDUjf9W9?1v{DMPl@PXpv%698h7?;5n>et-l*?}P_`CYsUTqW|zZp-^K%Rt19dpW1%SX6y@WNt|<#8E-MVZ;9!lR zLyJ1D3%v_utubNXVoAWf!SukA^KrEQ!Y(!OFMn7nR_eN(jLu9WHF()jC*aqB5AL|D z#0vQ=REU{b#^j3Gqqq+DceAiy-rHjn$!A5T1ASqo zcDZ2t{$|f!2y>c94F^b%v^oBdGQ~Os0oZ5vmfHV{ivK15%Ypyp!2fdKe>w2~IR~sC z{_V2g!kqtm8+PR%@O_Nh$A6W1`z%Bpd-^ZGIDYya5ppoxbEwF$W(mHo|w&=SFSCe00HqDMbd*yOLXUw zN&2$*xt+T`PuCuehb(zEa9}7Y<{HYWRCf;b>28)Yw9wJb4nf`W`Kp`lD(q^J%hf|D zlfLm&=Fqb`@5UWFl!|4~{^JVWK1h%;XI|XV0f881O6VHly5OKS5tPTO?1y&9aoHkU z_q!ft5gg*-LfyN27u6nRwsoJ@QJ1+ueBFb;&N~K(bbvGsF4(<046-48ddm(9kFs^V z_`Q6-)ZGGKZOERwlBQB|(avAO^~GCn&VkB-(711J*Vg5&a9oYP29529GW{Afj&-#p zv-hk++kk+jYmV6fkTnwkV0#7ZApl@IyXY7|waPh->8WJcthSj5Pk=8IYp}oECz`eU z+?l5U;0JbV!#@rH6z@l_Qk6ePg#aM`(F_7$Dj2AO#Wgp+uqcE>tMPDEiC3B`eF5aA zPnsI`LOo^E8e(NGh66HKnBlApoat?(9)Q>;yVMzr)}?WcSCxKC_{|kim1?U)g(@j! zyHcqZYQdh^S?8(RhycC|lQ-G>yi3ha@>>K~=7H2I>>l>u)Oa00XX~%m$X}!#T_ght z4b1j$YI(gx3+du~f%@|ayt4Sh@dP7;l2wgVtr-ZN+pjl_2-ry>5Zcjh=ZeVzwhXBS z)$3(&X6Dd~ff)dc8OOiv^s^R-R?T9&I6PRN4&i>mF$Ld2jbI`8(B`I*W6bbKb3h^M z!{8Y)kle#0qVe`}zfUEoP*}J!?FD?-45zfhe~{pROQ0H9?M@e{)Yi#Tljil;G~&=5 zCk+8MGYjwxd-nk|Ru#KowXE6?Pj5>%`)wEO$#bTIYVZ};PgsURe3_)pMYlP@4=?^U$RJ+BEfS8Ma*KO4Wr9OfG` z4h;0*u>i(xo-m}IQ;SdRTcY_;ii2hzzIIjYcQ|OWJAp!#ZNJu#u{CU?zu$)kQys@! z-v))%IzIjLduh<&WW7*|O#8=PhQm z&!Zuyp;&SMpnc^uH2N)f$mu68@GC0IUFF?Pz&++-`(_%ol@CpWC!}rqiu+ zNhSbnU%A0tzEdRXJ9YQ?PVwH~DT(}@(tN*DChI%p2DS0-x`kkvOxgSiPe6D!Kbwtj z1@h$i5XS7<1)4ItZu-j!&r9KXfBefGt(Nv=sTMqXsA!J?aPzylTtWbd;gwL|fM~=y z);g4dZqH0^pI~N!9uj(*k3!ykG{iVGJewNxg3hiAD-Hm#YGVJbdyr7e-nm?Z;~8Qx zHA^s$=`JofWU(h^g(u2==n7_+2fny>f0g5YPvZV6Z-e;R9SWUIAE135J^$-=A%BTTajuU z>?))YPQEr5Fhs-veG9hTTjStv$7M~jd%?l(C&(i3`w!1^ORh#>60y+4-5-vf=VG2h z!rStpdPvh$uXI7(cnXV-KmP9bS{TF zCZ_^S>TaXzKE#uL`*Q)61w`-447CnB8{^wP0~U5_Sch7(EF%CpuvrUHVUgHpJHp1a zj(M1N8x<}1v$9r~Cu&RWsU}10QH9_b2ooL~6!+bw8=bIc*Wta@7<+6xt;ucFo}}g6 zX|oZ~5xC%8j|M7bfdC{2810R@3j=|nyj@4}_1P_rk@}2;s<{p)f8}?i2d9Y>!l?d(E}guc>Nd(DX2%iBq_yWm)*x4 z?jCR5U$wvL+NKp(d&#BjxYYRU%X&Ewi(Q9~;A>kn+W_DYSQnmrpsl4Gun z6JI~idYH-(C-1!b;j(~{knA!P8`CRgatd7TuAy8{cG+L0TO-+XmAWT8?Qa^et8}jE zapokv0bpYefK8y<<@Q!5nM1E^sv50!pGV@MtbAic_pX>Fu!YRwhVhh~FWC-@H8{|v z%m|OVZtqV4Ykod%XXVd|=1>zD2m<6VBHsz7*h&9(VX> zx;Sy>khu(9;mF z$^!8JL~tP5vq>Geek{wM=A4s%UVxXXgPm^K?AZTnKWjZrnLD;r1O z$x!5$M{%WMy!|tM-3;@V$kw3QKo(l#-kC^k+bQm>yCU>|WE+lQkUBv#o&ay=Ai#;) zjMknUQ!q;f%1ndN3JIY^x>(HQr0SPwdoO>|NK0|7i+IXosv8-?cB~{mTV80nlbHdI z-_QeOqJK;R3V-MULUoC<)7m>=Q~tw{vWrWmA;GTNxE>~r3b`M#1Il^%bW6fcp+I^3 zHMf7a&)b0+v2eLSob}@s9D3xOxbNh7GZ|OuFKumXd7Qs^M)QggparEp_n)5e<=L#m zPZ8Mnw(gbhPKa2?-J+kn?eY|tZrNbp8FE;B-RZi4U?P?O^6WXlm3s zpL0Pv8%p|lTgZMQTS!Grt^HiV=~82kN0mfR0^Bm_uuVxJMf$KFe2 zAHHO$efheGoM&p!wE!D-VrPjHcqf)?}<* zgsNS5455k-56@UkSiWS(6Y4(5k~NcgAxu?eh-f$v(u}`t(9{g7+E#Loy#S>Hh@PAn zNCS`ZXwWolOUEg+a747~tWR15UyCJ87o1utr|a##=I*r0Grf z%euZy7-9e{)oT6@qp3+NtdW!J$8wHgt(3`a!LWT%^r9lI~k$6K*64 z2ai`tyOb?MJ8akpJ<(DNE%Y8^#Bsn;$z`AIT8^9UvEq$u`#Nn8jg1MMA}lTTl}&tX z=So$EVj3sG=;fbv9HqFWm562N{^x*fem**cg9@F{p^Sf1kc^@7!G6WSvZo9zJC>K2 zP%F*nRCBM!>Miww3j*)x0;Se$_9>d-kHAG7MtTHUYV>MaY8p8vm1+X#cw{sy10a-Q z6>fq{&$bngOzVsZLhB1p0-0nlEdQFT`*rM4MeAoY2%mSRWq~;&2g0TjnP+DWFPvXD zR6zK6+OqmD$Z|_Zc76A(?#ixT&%T?k!62Gc&!uzQ&9^_R7EVLO`5Ti?+fG|80(0eH zZCy&nszR5SsYcch9{9D`*-`?rXHEu5Xi9mpYZ$y&whRDWDchF<3{I zFwy*kp!~3!h=ugmlomzujV4Qc>$dqg>>k$r4G_!O9^Eg{C>^5sFjd61es&ajq^dM?qIE>syF^=ev(%${bZoZ zu`WD+BP`nb%Y$|}0GKf=FfAiCq}tnD_{6p(GCX7Hx^xY7Wg@wI^~b|b36r>@=TZA- z^P79aaACjd!Ure-iLJR?C(ip-k{9%f^ka_xgRu_B%qgTUJO7e~t-&Zx>Oh=aco&B6 zmNvFTDm|In@Kce0g*B+LWofEz6cBKx8sf_&FMRpw(N#rh3Y6y6#YNC@gr)@e#F6^0 zM){3r&kpVBP*r2Zw=|9KJh92I1qvIyEcQ=Ffn~wRw=VU*o%(or)*@NjU@nEO;D97D zWF^PLPc`f276p1)aTo8Qf`RR616Y4>r^w~w$p=02(KU+u4_3oauNNvI84xa7G-}O& z!aHsL*1gq!4GW0?CqE+~V-^>gLH-%JeCO&EUs?+AMCHk@m1Zcliv+o=}d6ZDiN4L_RH!gdED@xi*p1zefW(UFseA0e+D zhWw^oD(U3BVbQDhqer`UGvi)DX%3HeUPL#E;w>_}YJcn{&@*5pJ^!HbJ!EufFlm0u znSQp}r)j|7yxHRiI{-WqLaITx@BUcrk5_OvPkw}}pQF8U?B@ z00>e)c+!Cz*63b~=}z09Br(PVRK@&M_3N8-aN8iYSv*k6Zcf^%3K|r}Jwwt~bEAOl zx)Zof^?K7}mq(lYtM)~@s9eN|$itG8lPMSp*59vduz5Cnk{vd0;-wxQIl>96&HA2c zg8n`Sv)7)gaK;V|_S@5tk%cqUUnXkpNk{MP_uw8{T+HyFq^1+%Kfn3f{`q7YOZ?k) zjYFIFy@`LY><=f{_vEmTV77c9<+6s|45#z3svvk&@L1<<3ZE^O zN?yD~gzCot5m{gg1Rl(l&!1eu=$vaDri4z`-2-9I3B!ZOc<|v$zu!L5+W~Mch5zEO zEl|P;Lm#mPLXd}_^(D%ogmZ8Pn8FV*R{Uc>V6=k`EZH#}aaK}~rM&T(K#}2k9p(0~ zvb}k25Gj+N|L)?3Hsdg@(!1u?`2If?leFp#Fa+vvTwcw&@$~QcXv@IIO`Q(wH4wh5 z+rn*Oiavr1--UqaQmy;PHiLIUs#RfA7MqQg3xIS6xt7nwAiZa_?%2LeDUt;Uq}9Fq zI`!TqNoIf}!@#bGI}2yxQoioc6T)GQsZ}%aNNf%gKuEpCe~us1;WJa%u%w*F|NMPk ztH+B}9WK0Note`er^(OqALDHCLcZ^uus+|`nE=DP-*6s| z&NJ8R&E6lb*Pf_1)l`)5ymWS;M8XT-^^P(=#r}{XS9d%v{TpUbOjFh+K<=!5v|<>u zDy9j*Z^a73!f)3?KZS(%v1rtVdWu$CLDK+te$LjRO;c$d#8 zfoo(EpPImw1~k18j=cfuyIz<;ld7A5PZ!kY=0ns4^5+>bM+m9x%9LXXr`_`bz!R*A z1h}?nVMMOGc=For=8Kba^<3hCti`{N>%@+SW`i;00=AC-La{id9 ze;oYScXa4Q$EBU+7(~hpr_iu8!iRIu1Z)z{rQ3RJ@bhy5fozIp>~Kq9fx1f)lT}G% zFddpwF6h!vLE_ky+nUJ(pWOlCa$*}Tyq_W3N+BU}#)yjH_U_pNaajC(6f>*k;;d!quJ&$r_T3&3UiUVcilgJQae7t*W?nX4kfri43cOi%O!*TL%boMWCy?T=P*F~r> zSXI&e*zPQ>co$%)qsi#CcHvgt01%khHTQMfd~BE`VRJUZ=Aou;Muz*-4{6v9?QN+L zB2ThK=RTO8|AUxGjSc3pfj<2T9R#gXt+Sl{OQ(tJ%hxiv9-6GdMoi>+#ork09F*8D zhTg7>Y)h%Z8Q1qIl5tX1G+{Px(^hu91UdT>h{K>}$eO6JQw~VM_SScc#hJPi^kz!H zL?)}-wTVdjN}PoZ{fJrdGWZEzL!NPezkwOIbi7gx%c@x3Z%Uv zd{nLX&NB-kP@fIt)=YDcMn#cNP*=CVC#V*PY_~Pp3sGlzMx4doI^UQ!nS-qW7my$S z<3T38fg&^OzHJ?A<0UcAh4l>nH7#>inqqCHvH8ur_o0>OL5-r=RNGKXu}LyWgNq%= zm>yf(*>s!G*D|7mvLgf^4t`MTR?h-JGGS}m+qv>KziP_MjUJ6|#@j2U=su32+uqka zq^)&jV~t;YP^F(dBBXt(#rL#r$(r-3k&xE`mErn9NJMZRk?%{3MsfbkG}xbl%bE_4Q4RpcnK3|a;3H-kJT@?+v1x=zE#q8U zM@*4+gY-)y*XubyT=Ccn#utUW*@|X=^RKwW0Irpw=rLP2g0D5P`|@Q7&8C9t=H5Pe z#=_5yXKqkf>(cDgF2wFq>judj(!hq=r!K_WEdHW=2zIUI5 zGueo*M^j0XS&kZ>-A0+`1R-M#+c^Ydf#{oqe&5JZe1P|?G{!vwT|pj-5a9 z<12L#;ULww&Jc}fnw-raGJCi)sPI0x>gPURp-ba{&1wjkgft|VOt2>@YV6EUS;kb~ z9*YXs@Ep1`tVnIUnJRQ&@VM$Bq0gK@ZA-<2cCpm-;}g@3k#InCr<%XLf1-{a_9Hr^ zgNt+6Aq&U%2(&OZ7Yn_P6iY_#L4`~PRt%c>u$5hMydshe$|<`1L&_hh)R|0kl5UOP zRnK|@BdBWyV%P5uqv~i4yaTx$oPC-o!wN!b3vPK9DoFJ?wkpj>XCgD}B|5c03qmeI zmh@{p!h79w(|nDxp2@yVilXPK{`-l&L6`O|TngD`H3$?#W3+&YfpDvLQ7`KK`)HZe zytGHec{qD$S57#(uQ6ab8d1oV<=sGUOKOT@5+oI+Tiut6egYD?5@sA84763$XK>LB z96T?eaQctPDw!}~PJ4V-OG|Dv#fBc_){wHkL}I)PJbies`lfZ^>-Tv@LiNKmC9SJ=7i8@b^$kbhO^Z_PV^YSG2_=KUx)Q-5GE`=iQHW z+H$oQq`UN(go~+gz@(HVA;u_1?oozfkPR$C#WAag{_Hu0d*ruQx$To6ZHDc zByBZ4AzXQEdsJQmWIb0L@gN)s?unO(UyR+#$3~*}uvNkYffn)Xcc3aQH4H?#UOXeE zU7_HC6G?&qIS9VK%0Z8#2Nnh7Z5vC|t!+WeRWAhI<!&nQBGvfiJXwDijPxWv$GA zJcb@uq-0e_yNBUYI%M!Rh`5r;+w9_Xc#=@R;)?8GkFpOPP66QH(~sK}gG&0DdOTXv zf#bHVsbwmS%4Ad@G|Sq^fhV#M328W)Ky0fB0JYqlec@kX2zn_4VXBQ*)#Hg9osh+? z=B~lZd6A3FRyCHjq`gb_P94T3 zt#4jn#8|%lq}*JadRxTLghe<7QY`DWPkeMw<;hB6P%+^MH?_y()$3q+7<(Rb{D|zZ zb9b*ObCf+;K}vP!WGinjD(%WP`nOv*kl?^3z($!eTzqM520BHxkB=7$Kb_9>Qv^Rr zv&RCH0voZ;Y9Xb`-%DURusH zPD=ae3x1gY0iZ{JO_`sd9GBpb81=uM;dK%28b%?)(IItWe=ExP-Xxt@8yK#p5y|ta z6=j(X1EY9}brYdR*fQGtIb8||6HhOU#>2s@rrP%nbihu@Uv{o)=9lt}&2>nL4K(J$ zJhy}FpV)Oy?goLk|Hjli52Nzpu#}1v*(t{G*l*dC63$o#0IS+NKP;0TkA2_2|B3R4 zYL_0MbYxXeu;OPD1l>7aXt;g2R%xLzMb0^xFG}@;Xze#7o>y%x_F-SjUoK6lP0?#i&7tDvrZ9wRHt`+ zIGMp$5tm5-4?mmRQWC_m1f4vAl_Qs{_TmdKmjTu2WKlW7THrx&!k%wm?E!?-q>4AO znRI!A*t+ZMwQIw{IEn~Nq#>Znm<|k8_lKjDiB^dURr6|ttRBrVF?Q$=E9M|K`6fz3 z!POV}4A6-hQ774*G?a4J5wR?fh*#foa23hl!wolLHv+19a5IutKQYM)cPidu@4Dp3 z8G#!i&Fhen?wnUNN=EH+eME=+6|-9S{PV$cv#djKd_NVmFK*DM3BK&i^)=HtF&7Oi z9x802j(@-*^0KPIwGp?~S@@CJTeg9*LipnE0U;)VOACpdeDWb3nP#4rAd7R&!0U!* zI1nr!%Z(XtXX*xWjK^2Jn5uUnNANdgA%bXL-K;sylfJq7hLl% zKScwk(knJ8ClaA4?J`9{+}uL$ihT-wMZxps)O;tgOl3NVv$1$u`Ol*)+<-!j$U8G> z6a%L7lN~(9E8rER?*<+=Ac;?l0jI;eqvaM|j>E@?TZ|8w- zPeh(X)d@|P0?AqlQ!8<4_big)>t8Bh`=fm|f*FCIpWi=HkbOyyf%<`>uIhUpQnn&u zCMgYfp}_0h3s^E5Itb`Nc2OO=_RXWD;Nl#5S|wH<>7OrUXXzF1^MvGFHqVDSLz``_ zbjf!>eD$x_-*W9~l7Cjk)8sh0MC$2c>TYsGT4#vnyk;g_(-dIq{Gq`Uldmm=bncG% zB2`ud1s}{-E!4;*Ae6nE)M6sQcY1K%^S9oT#)@{C;2NmaMFbhS_Hg$nMUZzeICDEOCfkAm`zQAWCC5hb4{T0o*Zg6Wdov`OR zkCILwx_hBp2lb>IRy844X=v*<<{hip4QaaVN%6E6#&sX4#iN^Q8dtGCB(P(+meLye zCDo0(Oo#Knbq&ZHK_fj^kaUJO@zJ*%Hk-R@ZnGGPnbRpn=E(O)n#WTHQO~*`eOyJK z+ufmdD9H|_Tse>g^}u>SY@X?HJFsZ^ejr~ZZhKR|I~l3-RD6x%q8QR|@CORc_W>-&SvF0m}Ld*x;BLMN;fAxF?ydpdXIzJN{f{3pvv)Tqhp z^wN6VZHWs_0Z9+}W=F@lg9@sabZ?qmF@iA65+O|5(b z5m0mEse&1*rmj^xdTXaHSUx(nTdeKv4u$%d#kY2Th-!*==PYA`vzK6S=W7tNDaq^I zYf=g&DJ0~cRFBORW!9N3F=BL+BxFbMM0G;_^Dnhqg$>YMBhoYc*BxWzg}@a(@el=E z**?xWtmqE%(F_Q6LyYK{J+q^Y9jP^q*>edJFxuPymbL4T1evUxDO~8D{~VKOZzS2B zbSE})=`f&j>L3irSAJIg&@4%~H+=7&?|QGU>;d~@0m`-ko=)b%9Ru16Fp7D&fR}! zV#f*-j}{SJD1>le8k3XN2;-A`qccuvH!8H5*q@2+uYQVKmx9qbYK=!G>SYOFWQ5n% zKWz|Iur-;L-a+($|65ab1;cN3N2<?%Y7Nqg;BY@mJu*x~%M6hNe-+};nRDB8mV>Af>~Hd)MR zOAq@+0yJO^P53?Kb-lgGrO6F1DHfCo2js*A+p5#Z=*96Ej{*S`v1=7rDtz&Kn%91a z7|<8_;Y@V!mL70Dsw1i(<$agZzs+$d@jlK=J2DWnZ7?SAUmR^D%`O{v5&)M1o%!4We7hLmI?TB zWSqhiQ#vxi*C#nW+gO^ffQREbO9AkmMA}(;U;tZi#F#0J0pUAu$7Fk>tpdl)P8O`F z#Zr7$3MS^MD=rn@0cPTn`qUHWX^gI*tXB{)G2-4cCb(_9OWPK?@szFoA#|cEuiR3Q z_!M`zLb&a!ijU@=W}M2a$tl>5I^b}?J9uXH-qaAaFLTti^!(#$s7ucv^KD>)aXWFz z5{bF&>S|0;&045$hF}9nYrC8#ww+fw(ZaSO=Uf`#hW9Y#$Z*c~aN=s2S9(V&|1N}r zTD6sXwwq>zF=q{@OX_tF^sNW85=+}3`z@{5#(hz#?Mi4+dqTJ>Xs^r)Sc}S75+05w zD6N~>G@+Jb+pu4K|OV3JBK8DM+NdL~+qzZ25@UUd#Y^V~iE zff0X~k6zb=?PkoZ-EsX}ep{*Ku|gXYCS2W$4gmq@Medi&psk)U*8 z?TGuni6cZL9->KTB=**F#YG;dzdx~O$?^T7TklW(5#Uv%t2>vJ^~Ziw`j(EY>MYTg zgXex}SE6vzw-?s|&9;a}c%d3XsC4We?gVQF!~^A6&Gzn=qU>_j8Ij6SY8||8fXIV2 zPgO5g9_Qt5y-}(E>WtprJC&>{eVq=!`t->^iFRwE$)g~|=kW(%<-$%hYd&%Af9}2U zT|g3p5c-U>U0O6<2})?5*TB@^=Tha0hG@G+Ye zcD9LuEw!%yBZv(kh;QMnD$~@pxo=XS`&&k)&NB+>snwWb|6>%&9n%!Yw|KV)vuU!D zk+~PX9utHf59(kgzer4#Y7(*{`sN?hRr&z+>wBT~LA8B}l}f>tWALSF8SP*M&|Fh{ zGWQ%i!6X0b564*aw$IYN?`vCt{!;|1xRsbeb&Vd0LsGOsVQx+}i^B#8-`uxt;Hvu< z4t5*5lXl1c651I zCGlV2s>q)4!T|_-N%O@67LHL0D6}d8+zUCgwubtScmNyEk*!nM-L4C|^(YQ#P5=}m zjz?_46)4-KGT@+SstY2^K{Y4T0gc(RJvcFwm2=!VJ%mQGesqzEQgO`FuWU0`n;B?=A|`Lq92(3BHL79 z$+ilcwYKw(Gpu(Hc_Ei4tMMpJk7OF{U=J!U#m;b-=*j^a$3s+-e8 zgK+6o^Rl59&jbLMEE^AnjEG6s(^i`)12d#_K#OI+_pShkDIRI6(!+vU>*9o_;`R_? z$y0X)cyOi^vBTwZZc1IjmfSp%4XdW}r!>GkjtIXVBqhw!_E5@yt1F>8Cy4{8E5MH4&U6Y;3tgv6klLiErVNbac$YJrE@y&ZK^Ef zkSgFV-IG@eNCM9~b3XG+>(S^QW>yXJ_=rDI0~ch0a|Ew%<#YvB1ThY}K|eHw#cL40 zi)B1h@9i}{<@$>2zO7$UTdAD<)K{KO&^&YM>RMzyg&|ztqeX^=)#Z5|Ic!Y;I-Hu& zbC!=D%v5qy5983;=tNrq*zMNXAE!6z)zpY#<$zr*P zz49rQFAz9>&U-%gH}QB`r}y#u2}~|`+X+!8*P?4%dbLPM{V@h|Se#RowidA?O!LaU z(v(R@!Wmf&_53_u-`0#d#11!OWJFj#^r!i}t(9lkQJgQ>tY)mr!)UwedaVL&lS$KN z1;!1~f8q|TZgST`tnSVy4Z04;A@37)`Pp?jVIAAk0un7RUe-sRfPjcf?aP(UmRaO` zuX+Pd28`H-4fWKHhlAODk}+S5jyuB$GoBFNv z>N|RgvgW8TG|3(4Aq=f4Ywyf<@R0zcO`srR3+OG&uSZjfp4#Z{3=~LgMZoOIVL8V@H846wq}s1th~6mYzeJ{b~c3Qw=Yl8bj2;MXY(l%`_^4 zf?_?zySU7G2eW?YkOCq6BQWVVr>4DJLyJWTt;`$=iKqwF<_8;CR>7{jzyFjn7#t81 zv^UOM%(CH6p3l;}G@J*Qi_he4fR3whHLBvdE7#%n)F-Wrn<)^em#d_s;i4TekNpH_ z1a)%3>kwfNPJ(2+_q88BJA(Zewfzs4Wems5GKt!^MH)qw0~A@Xo0MogxbXHk0RUL_ zafk;5x?4;iy=$?B0hvx~GM573+-=K#6^-fO$9OB#Dn^QSkgIlLAwtIE!Mh&Dk>RY8 z+`pzYXP(1`ps6)cU}k8LvU}2{78*D4BU;-bg^%|xGiF1~6X7)@cTo;UV{P0u7hk#$ z4+O1n?32|cNP%-{>8{r1j;l_1a7UXX;fSb!BDiu9#9Z3ay+sJOhk%%x$eVi-5Lgv< zbf4oO-xBVBi&#pX8zZ9T5ryjau<4QId8WX>QN>v)1=Pj4dt-Vy)Ptk*#aK{bU88Ls zmP?bKT0Vc~XS-fd;wnB1V+n=EEYV0U)(Y&866EpV;UODMdOiAcf~)L%hDJt;M0Ub?-@wX)#~Y_`pEe1$`q zt)|5lTsdkB#kf?s^AY$C$N22oHkP#eUtiZBoz^mlyM``inWB#ZQ5cdKR^(f7UsvTJ z{U;F@kM}$3(F8sUOyy?MaEZg60fWa_tPX7F0WOAAc51mpj8;Gr-;v+|sWq4DTd{mC zm&T~6<;Xq5KOF^Hu+8N1j-$X}eJ#)C_b_IK2ZuRw4CB%I`|FXTz)Tm{%bMC{^ZY`+ zEl{4e4j_v@usYz+!Fs&&0~RCqh{)*2QD6HNG8# z0WLgSalgeW=7%CEkyi_EVe!Tl$FbQq(o2SUq7+`@ zJ%Tq$lwC5%dp27ogE)v3IdaTN^K-Ie2Y4X7!*lq{Zc|R^9+)L9cTj%YJv?e-Xcg9l$eKfse*D)%g~gx}b~f#WnJTk*2ALz) zkOifNyJkTpxFT-e`b=s(XXpCCc?ISt`3+EdHD445Tit!vAucWsKd0JiiU@`YaBn?_ zxZO3ajczY9#IIo^93tNI#M5kuJv{+4co>cX?{TwQHQ~iu+vS`@&9je-m4pbeN;0e& z(59!INbSl9Icm?zu@M&)XN%#?jKaWi84H4}YkUW~7&#N_ z8kx&FdIc;pWLYp(LoM4zh(oThr?8Qsh_;Isu`zA?pRlTt$Ro`cEjF*8uP>!aOemgg zBM53qze6J_O;eGp_Tg9g=!U--3V+ug-G$k(yf-KHZmnB zV==QjgS0Mf_C@@RkU4^#r6LRtaIG6jkS5|tel14;MD8SYHA%y4?<-eRh0`lYFnQ1W zjiIy^%Y3KQN?4ppOq8nU%2FE(HYSSrV0K1UAO(9~g2y>m>Y|}TW_djB^q||dCOIuf zmk)gE(fIqY>X28wf|vpFqT~-wI*Lm*p`6H#izdf-*csKDxoJBWY4A*TXpGbe3nHt6 z=_1_zEQeH&Fe0Xuxeonn;Gt5fnXE`WR?8*E^G?OK+duzK$M?iFQ-Xp@F5KQzRL+2X zQojZlc4=EEki^zmJKM*)Opo)Saal#Uy1$47#ydv7joNkl=*d8OW(_%%T$~wVL9{jJ z4jzpWTf{eZI<6#!XhJHuyS-4M^_4+A7v~5nrI+xHhfQ*KQzc}%wp79Ht=#(<5$8fm zMOm63?D$nKzcW(KV!yBjl$;79BZTf1?d=QuTM{AmntLMU3{t3H#g7`LweCn_ihrm1#)1#eisz-0#)7t?XsNew;vb`?2NPn5vir`dU zwY5Geyd*`6z=Hzv!98kAz6fIcS?`+{BzT0bIRF~g-iBkr(tS1c2~z7>x<>S;+g4)E zBU|cUk*?bK-oTPWYl`kGz|K1ziS9+X ztJ*&zaXv#CZUVCZ>oF-j8i=SIHwPvFFG*rs489eH7m~cFoEOhZ3N-t(7hu8Ji)NR0 zEEi~KFhszNFb?>Xt%`0uH_69Fy7u@>V3g6^J~u&{l=B>!c*!J%IP@<$(|io83-XM- zJOIZH^!7Y2!_{0aPR*A+6uODHHEsu+LnL8oe{3XIcOZ!&y2MKz=xP(#$)%!ZP@vB; zIw2AI67&xu=&VX`2a0>;)891}{;iivs5;&qKTUsUPeFXbV^>j_{{VlWd{-p|pu&>F z%2vv#I#r6i3wEIXOr7LWW*A*>*UCnK<(l{x-;&I3R>Q1uB@XlS?tbC9!{(2Eh$kU3rDm$WfNr+CBZ?x8VCx?)K+Tr zuHav?CqEsgLdmsRJ+f3~=BT~dpFJGQb7vIiw&KYN=qV2fF)U$BuUVg#L$Y*xcv}k6)j>JOIb;*#!j=1nTbDBsEWOP@&7Hs$**2e%#T#mD z)_2}APc_^-<}AThDr_DMEaHDc`Ahgqvc9=8fG~ee3a9UAC7?Peh>R71H*%pB*l#zG z_a&U{n{YR{g?N$D@Vmddk8kfcEgoO6XIivYVle(SAvOacHpM_j1-cs#}C1_n|fdT z>3!MNWQIpBi?Mro`x9ScHLwF$^43~RFY;BuYF`g6uKwaI_g!F|cH#CGDYeGgQ*5a5 zQ0}_I&8)H2o?DmVQ&{dJyY5Hj7TSm%fPh0A!Q-4q)D*&2VE1py(zPl8nSP zaf9Huk8pMRUwG^2I5*w+r%*pNre)1t z*t%3>b(qLp%=aiX=z+Nv5Z?_KF7Rt2^O;U9p&>!!-amVD2gyYhQ~|y^w6)OmSN>YC z7+vq}ylee+sfReIfFW|bZI%jd&iN^!KIF|%79NUs-|6)pKE)KI?%B(Yl#-I?=r$E} z(PLV);Zr!{n6{R1tsG9ubVS20L4eXAdpFAS19j?H2NC;(_UvCN1zV7nD70>9DFUpS zPj5F=4imam?a=9svJ1Xr!%vMc?Utun%q)|w+_tD+f62ng(&0*C7M$p2Xp4=_ly38@ zzt6Uj5Z40iMS>|;@;GAsjiXN9bM+HEY5YY~ZDBpKXpuvz0+r2^&)0(Psq!}AR-UaB z05+{fEQFqdvDT(avd)yFWEF7T>^~7j+ZZTD_R3eQz4%QYsgSO#lx|2*_AA_B?;!xq znp%3?shKLZm)F#`Ps_T0>AssK^XLom-@pGHqL>xi4jP^Kx9_lpSV?po|8X9%0jBBd zJTp7lGY?TLIT6BL(_y;ZnjPMiC#lcMjPWhS)s6K?>9*@&=4OC6`^u{JH!E4YdEmXh{<-YWVffbJf?|uRA6e zDe^=RbDCn^D^rCPmVI`iUpd=6vd16qbq_0BlvPWzxU~H7FEbFp(L(VN(gB`xnLBBi zqM2LB%(7W=%R!KJ^vNdjOfrGZQN=k{;hPW)aP;L<<_cyuoXC8Jaf(7Uu znT}U*O*nPVMUXA5wP_3~x`~qDv$G%`+sT`PJMy~FNlR9tb?B060(;-fn!4=h$*3o3 ztkoCx)chZgu01TN>}vxe;3dE^ATvNSz%q`N2_^{|iIo8siIoYOBRZLy)!i!Tg+G` zHP9N(IQ^Z=AOhh=s#1N_=fHGR9=Ul!-o01m4&w1=OfX&1UlKw-WE>5+y?OKOPz3tM zty8#B6Si<5 zRw@{jQ7o4|?ytX4X!q^~R_QD^!m+#bD)m{R;mk3_|j}GS^t#?v>%#KCD13&GAcg z6Gn7&UO)oad*=6Sw<+@w4nII>`IL_1g8jGr}V7G*B{6t=+uz$-+LpdCrTDfZdS zCMH|_`V`TRX%)94cnDCfga6pc2uJ<$HvHk)6X;ZzF92$rP52J;6tw6nIjC8T3M~3> zX26r(?HHb`qQ0*irWY$SK3V2`Q)Zo))hE7DK=elAmD z9H%%LN7HeAK)Mnm)3L*G*hcJJ^YpO4fYbZYSlofl;#r#Tw^Lm7F z5}o&Bowffld;@J<8dI*g)%DP#mL|PS=hiu!u=j;9Vurm5tC_0UA9)ePeak}7=`DW= zAu);6s!Lrfsi|TY>{C~n9^2{e)9=>bE!11Nup@y)!0M^ZME|Ig{_9^up7mYL=sMJn zX4OmS=r9Pby6p2ji1upgy&Zblb3%78Gg1^_8ZTGi$P2HQnistG&g?-Mey6}B{9o-!OA^U;%fpb@7v-czO75Zh#Z4VGYJ(s%QC!_C`Ck3i_ z9wdEL4`Hq#!?e>Cxvb!4i`rn62`B341z~^g^jb--!pc5$#Em`}rTJoJPR&t6bZ#?TD`gUw7-=3HMrBcX5<0Ai`!T5 zptls5Z(tFa*;6y&Jr93UEFlZ~5J1E@{OC#%FR^!g375}7ef66k&tY{^7hqe!AvGhS zZocKWe!I~9xi1H3STlH2`G$}mFq#`Y_Yl||B%W>_Y_FYIx(6#WL3gc7>?7PyN2dnV zIroPHKis;DpxMKLilNPooY@4sbC{p%uSn{RyV9=UWc^juYwEgh7`0#-epMQ}tIB+z z9f_W2{p<t!!Jx_L%XV!NXH`X<|;vaP=IC>vzf0pb~%9Yk2C@QYUu2rRMk?1Lnj_0)mOz>03 z1WT_+q_yppe9>PpyVcZs*;vDGbwwN~D!Yt?P20A+HGzbD*;H+d^zp%GXE23nw%V$Q z^b`L$E_T@6=X-0VPwh8_B72&?Iv()c{pIs)t@SHg?NV3xRv;&j4ZK_WSs6{n%CmDg z9pi4kSBqh*UhlAT06fwUW(oOgM^d{!<&O^^)NqTX&HU1E3RmX=8-lZ9+Gi(f?|ljB(@cX6f{pM+D}vB@xLHV}y=+sMesMiSr~mMa%T3!*YqR$d%;n}e3&2ByhnH8AIpESZaQv^0$1li<1i9$9Gq-5o zTIPjFf^QkSIrmC+dWQR)7}}dvs_EWQ_X8>G751xd=uo(KF1OsN=FXi@S87%!2(AzJ zpk!@I7i%szlh?R;4wjG}S}~kzc2KjB*$f5LpK6!{r(?u`6`F>SraO*Ktyf)sfB7Tq z^3`H_~ zT;umyl;-Z^;_MB5fnL16#J*q>0 zA?V-_VBSm3sM+JczZOJs4Nd9k0fFAzY>!xS%mM8g$etJLUOFlKz~=;tFBzPKmBII` zdlc9csUIkvSfgq5GvH zpyMXH^^{+IqZ83vhAfGJJKus}c-c(|(#hOl-h+Tzkhv6^DC_qxsF#h+-rRC8t6M34 ziCLNvhi`FAO;Bxrx3#%kx*g$xHZlp_(Kk-j{|>bc-EAafTq?q%9969NPP)jN0j3~| zEsub7gC4Da_166sqzf=uiQ`#;QyE>>-c5t>pRG<;EfErOi`H8!XDFG1$cZ&=O$rOo ze8T)pzT_KmXF4+qj(!m{ktYQrAYEO9+Pu9q@CQvQIjnZikxV98c*f=?*G$N%FSpJc zQ<3Y>PM5A{)ESXv48IJZ1q93l=^gDQnsY?ZJ-DZ^S6n`RizDmF@vyDkXEt*_Ud1FB z8M<2!Zw2OVRSy~M0o`b?L;@n$y~>`T5wfn$b>Lx=lMg$*0hw8~X!EKrdJIeyj_)E) zha?)+w1jtYjtSTt&Rf~y`oG=ZEFP+>GqqlcX&0)>D*^9g!nc3XPp!-0Z9C?%T2J=l zylEOe$T5lt)5sN3+0C*yb9Ln_`DGQ#&&j7gIIbNi;zL5s%o1#yXmvqk+bk%yd|)KoA}?x{z?>yGHgZb2m?Q? zle~P62ul$K%sU0sSEE@ft)w1CH=^NJyVnSI#JeTn+f~kg*_m6Cj=1;aTkJSmV zpxLy+3Vx`7RxXEAV|PU~@s&_)=8>N*h5E$I)yL|4>N5DS@BGPP0~o#`#wt-sDMwYa z?-6B~;91W?J!Bk6SWjE+RZR=h9(g^}E`s3`A~t?3IL8)RSWm>;*N7#@Mn~Odr<`y$ zVF{r@j7nMc*^%wSO~Yj6Q(Ac6uK`9q@x_rN8fUWcEp+M{<=pRYrj|RL;c5*mXJv{? zc|NF}xHyoVb*-wtN)XAp{kiIy?ycxWa>=!4y4*MU+af?0ofU5p5sY2B`FAO(m59Dm z?>vs9J0Ft_sCP-Kag+;r;#v*%)sv`}7V=;wLnYSz0dhF0H$C_S)M|-XRuUg5$th(V zzxL_1alc9bG>65gEZTSw8US5HFXje!OCLH5sK zVd_Oh!JGD`qc5JnVW*P{@s2NGu~b3fqr{At5x5tyq{3|==ND;(he5;_@=2QE@4{@5 z+Y43URS@Ncy6`^86Zax+V1_e=1Cu7*q4<3GvjE;kGuY>sk3T^1#W;-|8dBF+55h9 z!R14UC8%eXJ+L7P04>vVsizm7Q|^}d^co_+oNTWOtF-GltI6+$CB#BGk$}Ct*fFRY z>d}8^l_Al-o(?{jlWKfIn z%6sTWH_y3eTH8D{1aG!&Ep#s}4f-9@T3U)|#1fa4et4$cNm`3AU$(Olhg`la4<=r? z482^F^=rh(XIeAIDq^4c(ig&|N>)eVS7r9P8%OC9^QFX(xTGD9EW)MF&+x=$^iSiu zpvP;7Mq8gXvxJLpFHYO~WR_kuU7Tk5f|Dq6ey@Px;hyafzDwx}QTt^b z1cm|}2~a9wI-_WDK`od)XqW9W4*9g*NmA=bGbGf61erp z*`#5&(p3jghYZE+$0<{(Jc61hV0d;eI7q*k2oVF4U$UOA#|EK(?oPhkj3WnYBVFe- zEV60A;op*tM>&i53>=@Z6*gh7*1qrbwjO#kOXFi5$?`S_$C$u2R_m2a3{x5}vv{kW=t4^V}{sFm$%PCEg9 zB0V4*2K&=DO^x)W6Sn6Ko)p!A}^N=W`sgA z@Ys9j>UmmWp73~CL`KxVJYi$3{#a3|G~8*=CgWlNG2OZ=gp*yz1|ScX{1C7GCq&!q z8gqd5ub<}iE#w|VDoxh)h2Of0-7GaYiU!ZDeGT%1dw7tXWccy*KSe||_pDC0O@q-i ziruy|UxU1RuJI}hy&b-T7yw7OriSQ|;wVTZh^apnQ3oOwi2a`SL8K~1}*PKv|!OuhT| zyPM3!=CT)=s|Z|4jqpEW@u9iBYYyE(wxrU;n6ow5;cZXI#~c1G9+MtCT$TEbe55_* zY8ChL9b4uuvi4vqvmd@!FEzVR!`E7&Q&oui5&CD5!( zVH_nwC^QF(wbyJ!s`;X z!UuEwWR>H5`JoNOmPmsDbEZW_VhX!BQ@-LC7@^o4fXXL`75 zV%}$(p9c_BLh(OR0p2Gur*;sncKaQ5a@aW^r zC)jx?hk5#O&%p$!F=u;$-tgJA;;NfQ#XxFqJZY@Pq<-;yH7r2NnDR2< z5oi#^6!J2i*&QXhlLD!%m;Sl2_}lZpCLzOSb6P! zdNwO6I?Af!x3g!XvcXnvlGh>5x%tB0zYDgfj_hHM(yyFU*urw=X z3CQObQ`FZz0$Et?dT45ZFoh4X`YYZWVo#i3w)pu)P$blQ0U0;e?5aRQJ-xA@eJpnX z;v$2FIm9waCsLwm?IP%@l6r0JKd&4I2x{R(f`CnbyLb2ePp8T!fs8a;WsmwQ4+?qO zwPHaM&Aq6bIv#o@C!jj2dwIc&*6@>oz$YG(7F zhZ*O#_+kGBzh?FAB7i7X+vfL1&VpfL-#6aRBbPK742QX?*8cu|J_&vzXo!nQQ7MBu zdq62Zm&NezUYNs_*do&q69u=uqlrQbklyVHaGXs|qdf-tHKPf?+)kz#-JIU~l1B&3V zT)_bh*hjC*V(MI0YUEy$Bv;U~&URg{Hm(?d3uEg%f{<^%>V_4e{tBy^mI-HP{HduG zlG0wBT@PT_3vqm7^E$>Eqd*5SRQBz%`$1j*CE9eOW^`a*fDp03K@WTrK$$WdVF6I4 zhV;R(&-(S)Bu%^j*6CVfeN(_)aPeo6{2;4bdv25Fb2eR>)0j9;Y0efB-c^V91v8YM zyL+MoP>#mUOS3_wjE8o1oKizpiyzm^bVy7f3)moUyA25hUMHajPWVaHZ0RG#V8Y{W zX_)7AXgc+ss8P*~+g!VrX*lTeh)T`;>LC-l4Q_AqO#c{O!0=+wZ<>6z%fB*+0pD~+InZ~6(nZ39;6Vm>Oh*y zO6x8x%-nS0WKW0zJ;(r(tO;;Rf5%EP}lpF1O z?zb+Yd{2|L+F22cxF~LxVv}52*S6|ETL)Hwo8B6BwtI#$!N`3(R4k&~iI zvsmP_>FWRake|;f`NeY8*;3W7F6)1c!VD~l)Ka>xA2FnySLRrX5#OtEEFkvfk|>3Q zx*Xhf{Mk36z+)E}syzgAIcUtOTvAssx2%IFbm`3SaQ+WH=|)(YU>?;6*pDMu6CA%n z=d~mk&Whp#x8jK_XTO^xSLnSFl2AI}rs&ur%&W`-Jz^S@le3~5oIF7YUl$?Ni2`(k zYu6eHapLu>mEPYK(dj*Pj~9;9k3=msIyUY9o8_ah&zNHzN_M`7h_NCQWp9CwZX!Z< zy@hgCXV?S(#X9k==$+iTQz3+|EG3)Hm+Fp1AB$ai9*lrS0>UHqdp)&$t#<&OPo;j~ ze1Lk|wS!{0J)a|KrVbYKoaXZHY(ESz&YSn8)?Z&rDD<$ep{TJ5Y zhxPRFD;sz4L6m32QVb1B8)M`_|Iq7 zwmimu=WP`SKKf+1dEf+j)@B~*=9yR3+&q+Q<|RPMVB%md<44GC8L`h#SP7kMmmJQ5 zfi68dh~QF(tY^ThhMx=UK?vS=g)8rp(?ktm1X!Bf&m+#EKsGbys03;+)a7qXFBU9) z9qqG=3MZ^gyZr~I4BW(VP|HwOjVZbTFUexsNL>y-^*b13M3@EtXS8zrCaF}^)2QCd zm*J-=tjr{l*|)2JtJT7vV^vOCnE{`aG#osP%U^M9z)`T)qRfsqRH#n6n41;w-)Gzs z2hg}oS~>)0I{$SKTN)q#?AxG76wwnP9MJ61i(~??@-71}-XMQ=DBC#1e& zrXpR43j34bYBZQRh6M*yo8ZFu_zCv%R2N5J(Br@MtShMqm-P3)Goa1W!2hI~J;;==-AuI)j@L;TZ-tCf^DAdlteUnbcoS z-iZL3L}0Ju*fu^ACuzhuKlC5JM8MIUN7^5#xUPDItv(|dYislMxeS?D8Q(TH=UB)X_BR^U}xmh-S1DQCtB2J@2jL z$Hb$5czF^55A3`i`~;jYm8=bcUZeoFSx1{JJ+fnNl)>*oh-5e7;0{aS$6zIJ5g4Uz zn_8vS`dQc4n9p!!Y^pB{oV{MnbP3t^3vSYo^8om^L(+1~A zuICn+C?Tq;hyagWa!-j}(&0q%Iet8By)Zd}@MlgY}+XBxON0W|I5ei{6 z0o0J=-fG+Njin+asQ-qH0MaV%A_$GN)Dn}e_wweT=IE2_z)&N#TS>$wTh~bTZPwR` zWG4328_bdD(vo#9y6Ez=zz0W6$cT5^%E+_?cd;ncWSeT;8`N8#wJJ_O8%vp1+FGbg zO%l%f!<2FK;wJ^{q1nSM^AkDjNs{xLb;~#P?iTIoJ_LlW8ulL{xNy#UYxQHV-NmT{SvHz)<*<5mcx}2d<3DA=P{s?6 ztnDpdc5=cob#v)FEdZ&mM=;&Rwa0M$F}N`xvQe+2Y5v%GH{K(I-}kdat@i4=Acqrf z#}1pXXT7HhWxvhw%^GpNf9WBhQM-eL``G2)-w(eYy z<2*F6VqYRLXBW$x4*dO?9`sTWm>elxxgrLMQ--VfVF&YOO0lq@?N6sN zFUvUe<$z6-%rnT*zmBN0MBF~;T}n^Z)fQr@M7FUY>www)xcf=o+-$gGB(^gg!7%|+ zs%a+|G+n~(PL5cn|068S-C8EKh z+Vkn(_)7*4q&Y^CO$X99#scvF`2pLvL`UyiY)^r zn5Qw-d(ow*Ih)e+H+3)FuJ+_8(cog|l&L^}_bB5Bx*N{K1Se%O3bnehS7GCYXI!Vf z=z!KEsnD)Ie7irp^M?P>h_=uD_&!03Ak7ZZ#ib_!T2c~7{rcr=^d2>_ zxmul^wOOU8-~0c&(cUVbAYj((m_xlMGFUeCZvhf0El_BJ9 z$n^Rw{Tb~SK%1vKN2yD!6u2!|o0_a)zI1@H-1;U&q@B(Q@5ed&_5p=t2vIgCk8q5? zwI8d8HK*RaV-cENV00+`sV3XlxUaT6f5k9eYY|pEv@<(GLVkh!KEV+n8U1im_N_9s zta3%2kcsS2*&>*(2`m0I3X^vZ%z>j(yb@k1`Lur7)+B%jCMJV+xivp@AH5mI^D9xV z%?j`HL&x#XfAI&4ibEt7kGuOA4AIT*3MU@lUJ`(CT`JLDs6>d`eaClPunqC+a{O{C zEr5BJkx|Wiruz1I$Qc>Vua0Gumvwp0JJ}8eJPG7d&zr{PV<=c*3A3VV79*(_Xdgf|nZ!UG-W_)Jd-W+SnA_$t^+M}SwoFcI=bea zZK7Kuj8tWtha*(CuY1AK41sMxi0t_}--={?P{7!b=FzAriPYibOEfu; zNpUpiG)v!Mo63`Txcc8@Qe99>j1(>|vjsOr88$_wttf-L*^(e$0n!406 zv&?Cy6rv&0PQ|F;he8#}FCi^R!gepEq6)ryWImX$CSv^TB;i?sDmF21!OMDy*tU@~{|2u+XqfKMzVcFg`ErN!pwJQFNF3BX`@=w0#G+coFJ`e^}Um zmzs`wOITjNIGr(iyPuB(X=)+eH)OKa>9z5G_+!$$Y&Kh_%`kr3e*iv`moB1s+h2E@ z!n(&jXf$tL`Y^QF(9RLQ1NGb|SrKZMsjSR_$A(7h4D&1MWKs6Sz(j{H!PX*>Z~5Vx zrpH1vaK$S3aF#cU&1}57^q-$TI$B7j%tN)8BJCFwJv>gYHwSRTZ_>;l2J4RdESl>S z$eES}MG0ET%&=EGhm6MeUFW@M>Q^I4Ay-NPW@j+an0uy<$qX!CID0JmZRZrL6AM0w z@JobKcTm=x`o*FuONZvgoVKpON06G2yAfWqrR;ci5-DKRY6lUJe!IEW_83712`38m zZnGqDER3ZBc6z2q<4IubfdcZfMW zzFDU-XE9j`JAxBvV3!Xu-pYn}&v}-YsP$vjMtqoT3{4xm=h<{r!E;WGA>udSe(85( zXtui#>Uj*eQ#YQIWTF7C8Pwv5IhJ`^!n(oW$pR;hOn0ut9|>-SshnQAz$~f;N((VR_Puu^PZYq`_5vG{L4d^ zK8TsNRj#VcMLUY%sAt2F7ACxqkogjXf{J{~T`YB9pQ^oKz>1xU0HX|Nw})q)u>_IDBpiDDj~xiQRc2VSsb6=uy1XjfM`~> zsPoq?w%tjBFn?+MZ%npovBjO?7tvR@75ODe~dBAu?Z za8s*}KntgdHxQ?D_Nf75{4J7K3a#S_*+l5w`OC|04975iRh5XQ22*(KskjD{Va!@YgWp}#GR@`gyPOqYBz$J4S!ZT#Ovk>_vBDLmsceIN`Foxfs&w6Z7% z8WSIl+7B|RpDC8B$kSO)H(fQdk2M`vJ-;?@08vlt;RnY76#7!vVHiBbzaQn1C0p>c zycPy~vVq78rLIg~=gn_V2O0pgi%+W>I0U#}vOV?8DA$HvF_}DK4|Pvn&P@RVGYGH< zsEg$mgcjnurnNlf=~KD(Ur{!~&9z3V<)z|!Gc}?FSW!rhkvYpV`b^uRA@O6Pbk6G$dbsPNS3U1v%GmQ@zV7iPXS|m?hcL z3MJukJfjd6>B$K|AZ-X~p=bL1vN<8C1nlU+C#MxHRI< zjdxzou0Uh(0mXFm+Oz}`RkXY$VF@=Clj_-}>dC}p_-kvFlMo35(i3uOpIaMqcCBM* zfkAe&sJzXvt_lC2+mR}0st!~GqtCXYaEsLPkt2U~UsgxGm9wQ_@1q^wd=x5yzR-Sx zOv#r9!{QGFMWlkeX-B)3c$IxwoH?%h*PB8I)ZDkDs7xvts|dj# z7cG-tlsQLu$z)4BZYRNJ$`+1`ZxJ+yJRXw$-JCrJ3}0B(17>~HI@QR!kVis0iTb5`_{7#rKg=SV!O zwk&#cqVKpd_DF2>H$!WM!ifRJ&qE0j%@Dr5DkE^daC3E|R?~rx+MpQDgC(5Yb9{#u z!eFGARsP2qJe>U|8b_^u>vyZd&X0%^M^7J3`f)BX6f?ZE=Gl(2SDQXGXGr2gB4WN_m8*@$bfP zBJXx$xmBA|(J>+fY){>)Q#RqE{bTdn7thL1UwU$tGxLG)ynDN&R^9nWq<&!r!x~%M zUK%7v4w6e;;Gb?SVgrOfWHWAySn1hpRORtrJXoX&;6_*PY?(Z)MiLnIPXyNt9Wo1< zEq+Zm`Ku)0U5*|NG@)`!qfp$)eA3*`vV)^xKtA}#X1!hOXG`!4v7jc1qi=zna5kF2 zX32@uv6i&K0Hy{Z8;)0hGvQ*yCaJUJ>NO5o?>YDogAv%AyKlDLt#}vt76oo(#pw%V zX2*hl7rx9AjMs&~0s^=V`Ec;z z5ZUS$YCuB#w}5PRB>KpGz{s|YDN5It1jLoQH|sW1ZCj(@VKe=­g}8`t%AZGblZ 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 _T1kwcnMFb&?r$LVeKNyLIBGi6Mr+?$It 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 DwB9vS literal 0 HcmV?d00001 diff --git a/Tools/unix/bst/bstl.linux b/Tools/unix/bst/bstl.linux new file mode 100755 index 0000000000000000000000000000000000000000..03ee91cc12d65d703484028f950ecd8222ddd357 GIT binary patch literal 103676 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

y0=aVN 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%0DE#=o((<)~YgIS|iVZ&<{ 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�HtnD4})YzorL&5GdxjLW?NJq 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
  • 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 literal 0 HcmV?d00001 diff --git a/Tools/unix/bst/openspin.osx b/Tools/unix/bst/openspin.osx new file mode 100755 index 0000000000000000000000000000000000000000..f55a81318cf49d3e561f952a6a8f846750638161 GIT binary patch literal 207456 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�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⪻4G0}87v)D58<9u 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%0D*Ho&*J@$0ADX&cDP6PncQ4)(t$DDZ% zM-Q0*6CRPEkNGLOr z{Qz&o7|t}|j_w(7YAP0K!2oRgBQZm;bcQlFjV|W+6+E^iy4T zC$lnsA=JJID<#WHg-3~DMJG(GcuE>Z5t+HbZYh}s#}%2{S)m<(Z`swDkykln*g-c1Wm_7BV@@YwNSdUTz0w|sSb9g3u?xx8sZ9>l zl#(s#z^StB$A%!D9z-7Fhy7|Gmxyd^IpsU;mXQ;;iC)fCqU*`B3*e0yd9|se$h44F z=8KttCU12amj+AQCxq$~S{KTp>HwLGiRR=YjFuP})wa~!Lre>#SIgNPcl2|z&Cm-b zI!#-Aoig~G>=Hz2Pz+%fCyxkcV-_rPo;TgugetSmJ#%B~qP8P$)Xt4649D_i+^Lm)Y}|!@%W}~3#N?|kCPA5Zl*vr1D*VMxdrj^H ziCYGm&7I7-&c7wMq`6DXL|dPi2-xUAfSOp4)V+)tdRrIHdE;Virq&r^1JG*8{dH?H zpfG*Rc~8-t)~2- z#24(*YG13=4d0#P6sEvG)f8)5u^uT0jnrLOoE6wZbInrFQmY&_Vf74%=CxdtfgU;n zH!-AaHRT2XwbG0QbCbL`Xf87Ci19`xD@1<7-6&P8u1UiuTRjmUI3N$feX*Y2A+)7F z5(~V?_?aCsJ+AJQ9ZO&c31kk7MD|&0gP_Rjn@kM61cBygwAvEu zo{dtqZ=ll(20%1WRs$b*55E&?-ZJT!3pyBt7Viv#M)bV(ui@KZfzw zJDV0FKa^DHom(0OCB!LU#{si+P>WN;%<`cDyTC}**jAq#$WBS z+)E~>cKfno#nZ!*mCL%Wbf+7ndf#~F3SSZqPRkP-R?d0Cgq8G?jO9~D#ImsAb_8PI z*xZ*Q$C5*d_jYmKxYHBOyrd`ll04bV?&aR0q=}`lv1)GV($bFHZ3>06#Pc_vN^YSe ziv*WST)9loTtW+kBvnEQM+w6tvT!pMy6k#r9y|N|dpYKg;^%%ic8va*j-R{Edc!SU z_pxJ`W`-9}f1|qk-aH}h>KeVyQm}N0ZgEsH#NLHY zT5XX`A?zcO6Z^*ZgrFpzRSFGaS*24-K*1u+r``WaA_7~_zyHnEUbaws*bJT5UZwZ0 zvT)b1JWR;K#9N?|k1&G)8X6;qs&ezLb+ mfD5=+>wXtFW%!PSl2$7ka0h)~Ci)Ll*o-3YeS4`d + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/Tools/unix/cpmtools/Makefile b/Tools/unix/cpmtools/Makefile new file mode 100644 index 00000000..0d83e0ad --- /dev/null +++ b/Tools/unix/cpmtools/Makefile @@ -0,0 +1,57 @@ +# +# cpmtools makefile stripped down to remove autoconf +# + +UNAME := $(shell uname) +DEST = ../../$(UNAME) + +CC = gcc +CFLAGS = -g + +DEFFORMAT = ibm-3740 +DEVICE = posix +CPPFLAGS = -DDISKDEFS=\"$(DISKDEFS)\" -DFORMAT=\"$(DEFFORMAT)\" + +DEVICEOBJ = device_posix.o + +OBJECTS = cpmls cpmrm cpmcp cpmchmod cpmchattr mkfs.cpm fsck.cpm + +all: $(OBJECTS) + +cpmls: cpmls.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + $(CC) $(LDFLAGS) -o $@ cpmls.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + +cpmrm: cpmrm.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + $(CC) $(LDFLAGS) -o $@ cpmrm.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + +cpmcp: cpmcp.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + $(CC) $(LDFLAGS) -o $@ cpmcp.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + +cpmchmod: cpmchmod.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + $(CC) $(LDFLAGS) -o $@ cpmchmod.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + +cpmchattr: cpmchattr.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + $(CC) $(LDFLAGS) -o $@ cpmchattr.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + +mkfs.cpm: mkfs.cpm.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + $(CC) $(LDFLAGS) -o $@ mkfs.cpm.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + +fsck.cpm: fsck.cpm.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + $(CC) $(LDFLAGS) -o $@ fsck.cpm.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + +fsed.cpm: fsed.cpm.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + $(CC) $(LDFLAGS) -o $@ fsed.cpm.o cpmfs.o getopt.o getopt1.o $(DEVICEOBJ) + +$(DEST): + mkdir -p $(DEST) + +install: all $(DEST) + cp $(OBJECTS) $(DEST) + +clean: + -rm -f *.o $(OBJECTS) + +clobber: clean + -for i in $(OBJECTS) ; do \ + rm -f $(DEST)/$$i ; \ + done diff --git a/Tools/unix/cpmtools/badfs/Makefile b/Tools/unix/cpmtools/badfs/Makefile new file mode 100644 index 00000000..75c4ee00 --- /dev/null +++ b/Tools/unix/cpmtools/badfs/Makefile @@ -0,0 +1,7 @@ +# +# Dummy makefile +# +all: +clean: +distclean: + diff --git a/Tools/unix/cpmtools/badfs/blocknumber b/Tools/unix/cpmtools/badfs/blocknumber new file mode 100644 index 0000000000000000000000000000000000000000..9259cacb19e82bf3525eab4d46979e21fb442db0 GIT binary patch literal 13312 zcmeHLU2o&Y72TqJ;!o()g`ea=W+koHYrAa#fA|Uix4&Q0 zTK^x{qH0af+gj(eGJZjRq3OXq>52;bU@}#Zd(^8mN#EQhS9Ejtr?-?F_ehzoyfT%; z1GUzKVU)W}(ht)lb<1SBc3zj{Yn44Z>e;0?wo=7$lFsVn*3>$~lxsdZG$t;q%?yj5 zt!3$RTNHL>st0mQote4G$eADX?$YGl8IN;sQ-7$+aWez(V6(S}fCX03-PRE{F6Di2yP-sxhV5=|U__H9l%*{8_BwhL1L}tI)I6m#jYoN``$Ph%sKV>I zr2F|Kn7;zAjbGo-?@+^)T07FuS<&P=7MN+z^xo$~n!K}KV-Cd=u_TN;H2yY&{#lGH zboHRAsf>r7rPH})xwJJ968a|63E1F=gVAZ9MuXGyKAjFO&iZsdycmfq49{MkpN6i0 zQT|Z@1m9H3>tfA5U|hng2LQ3Z9D4of{SjU3!ssVd!^6X1QNB;L=7sCLkhZunuiDP% z8@l9{@1)1duIRp}t0XmZswmCDg^Et(&~FaI4IjS+tZ$L@j{dHyM%8N?o*jDqSOm?C zFV&LQUKqF%^LEamMyl>m#(yrbB$Z{_IgSP@$!kO;xsm;BZfZQ{O$n3@Hl(TjU}<6s`8q>j(W2%^*anW=w)O5nd5Nk6T?3EBCL$LJf8vNzB+>ZDHBE z{8HCU^N_2yz@b}G%t8I&ItR}`eHva|ygs5MDV(>qa5(tJ#P$q(JWA5(xAgAn?KsJn z@W7K$V=+PoXU_M=z8ADD58RHYHyib4lFj6?qFB&uTRN*Wkpcg<{KYKK6cN|fr1rmsqu+6iH^L3N?rq7mM$JaNv5^|K^ zy;_>8;W@)~mJKFX<oE8L1qyU{$*ACyv`{!EwjSNa=$MgOM%ps7Mu*A|On#Vu8yqr$Q| zn-!{h1T0}QCd4b%ni{n1lFbF36*07G%>_*290xSu&2aY?4Y^zF4N{kqjV>`;wt%hW z*u{;LyJl8k^TTss1NUT{;U?Ks9B~DAOp0D1d!FMMZPC<1!wkA-!Y8A26w2CL+lH34 zouS*V>7jv_;x>;Wp!mMQB!g%D3a#YiYjNK`4eq}}UwJtU=XU1n^NMqErorKQO zOyDXdp*E$oGodCf1{?JTx38%eXNkm3Q3%v|jpnyHX22mL@!qBK@D_FoXHg=F17hG= z0e!*!0@3-AQnYE|T&h}wV|b9Qi#5tcUoEsQg2pg%j~!RfRa1DGkFfoExy#g+NS~)G zZjT-*H`pO^6Zg9d>s{kJ&qIv?*&Zg7pukU_A70XOYbw+epYMk+LBXcJ^xj_}GLnR? zwoLxtMrw(8pg-t6>^jzxydo{$64c}am5+0ma)Rm&kNa{42L*?1 z5qZR*r{a>g&5B`=&uoEKShXC*w7ImVf-OT@@d7=m0^NmM-ri=FV5{t-@R!l6v*bH$ z+K~6@UsJ>l1Sh;mVDO1x7?(!>6}8bkC0U4*Q*SfmtX0L{n0VE#UPQSYGv23g>_}HT z35Y>)*rRX;XYV1uvNCmhLWbH2I`KZqJ7`brkV;Gf6&}Mf4@CQR+I_=C5fULn&igFk z1-_>t0&JW(Y|K9A#BEyOqy#rk_MEsC2=YcA%Agt5qAT{sQS zM;>hLl)(^`Byh0yA}yE|(u8VgLcVIemJo9_y_rm?jW7u^$t6DKT>pi>{<2@czKj-+ m(B{F+4X?$e$GqW?>E(r`H>g}_{<-V${>=_a`V*EENB9|{O`z@o literal 0 HcmV?d00001 diff --git a/Tools/unix/cpmtools/badfs/doubleext b/Tools/unix/cpmtools/badfs/doubleext new file mode 100644 index 0000000000000000000000000000000000000000..8ee7d65b78a042a9d87beaff6f9fe8c5262b419b GIT binary patch literal 13312 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 I?@|>0{{_)qYybcN literal 0 HcmV?d00001 diff --git a/Tools/unix/cpmtools/badfs/label b/Tools/unix/cpmtools/badfs/label new file mode 100644 index 0000000000000000000000000000000000000000..982928d18d0a1ea8e1c6d2f3d08654bb1e834786 GIT binary patch literal 9984 zcmeIuu?>ST07b!UL6L@J6C%;kFf^lhj|iF!@R|tSms~zuzA=md0RjXF5FkK+009C7 z2oNAZ;LZZ`wtUuYzP3MpJD%_9JoWFddO_^H9|2>|KLW;_e*}y<{|Fd!{t+h1$ttv`Tzg` literal 0 HcmV?d00001 diff --git a/Tools/unix/cpmtools/badfs/lcr b/Tools/unix/cpmtools/badfs/lcr new file mode 100644 index 0000000000000000000000000000000000000000..da20f4b5b08a1e603b7b47ba99ea680925fd5c91 GIT binary patch literal 16512 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 literal 0 HcmV?d00001 diff --git a/Tools/unix/cpmtools/badfs/multipleblocks b/Tools/unix/cpmtools/badfs/multipleblocks new file mode 100644 index 0000000000000000000000000000000000000000..52c1d922b9344fff5c4a9a2a7618687fec4e3d93 GIT binary patch literal 13312 zcmeHLU2o&Y6*ZdVg+HNB7k-ihiIucoukE%8{GlL9_QP0hQJ{4nM&!sEnB*v&p=IU& z=703uJEJdW7byB*0|AWyS&HO*oO{l>XZYK1?O%&Pi$IG&i$IG&i$IG&i$IG&i$IG& zi$IG&i$IG&i$IG&i$IG&i$IG&i$IG&i@+ZVfrG1?cf^0Mi4G19=ucmL{SE%V{afEZ z3HJ}a`g(g0|N0|g@e+GcwI=6nt#eu$KPNxebY~uPMTNaHnJUQL>t&jxZ*P(dy1Mzx zJIal_r_5GfnabgXT5G~E%AF_a$4Qd9MKW1AuS@c^%I+O??7|ycsp2R}r*(2|YMo)q z6<@u?o_FVTS#74+{B$K-pV^|YOH})&ZZwn$tSSi?QvJMA=H>!>mdr2qsXet zgBFZ;x|pRz`pPEi}z+T|WPg_h)25Zkd~} zrAfN-wTaAryLN&|eHg+Ma@X4F`T;W918)QC1xH$FPFHhI=+}G*tAzkXi z=m%88!^2=vzDu>{jqALSwzxL0+RkQcy5yFhr2EP)>9(V*BsDXtD9yozih6SC*O%de zPd@_IcSw4NKdGuw^@;{3&%NKL^I;P-HNI2}-g{x-O3d3ChZ?E6LmB@$$Cgxo-4vze*!nl~k^UU)NYOaUCY-0Q&+6*8nO3~Z5$@KUter|Ws{YtSFj3__G@ z#w3Uz!V(emxYY%*a{nqU)L>_k#Ei|w7M88cFLcc`54ma!9J(dN9Mlc2^WyoZOM|ns zH-~g6h4a=H4i`U|*q&jJheKXj zY5d`RGE(r@ZFY_h0L&2>Rv}w|+EN0#z%2!&era?CBZcGqt}#H+eR3zHTz#)OwrJ2b_9ycoWYTOTU}qhr!3FQyA|H-P2WWRCR<`VE9l1 zmewEi@ZaF<&8Z{;9udRMZBuhNzP!4YkfZ$W-O^MI&l&EsY%sYh7p_aw#?#I4`on~B zt6iFmL71HfBtpf7nkvx@>kM<@+_Dc4yf!qoons2DeIc9WqGdR*a4Rx zr05lL<~fSd7ELWQ%%FQFd@@Xjp{$*iZD>*3DZ1^7?izS09`h&yitigt(tp&i(Mo#X ziTie`fBP-^%Bw;6ZD+nN?>HA{>OT(SeWppEQ8;CuM)C?um11xHJ(Nkh;U`Y5>l47- z+|4qy z?{pJ}9O~d%7PWpb7U+ay_CCvz&-cZ=0aN6*Mqn$TIESh8UZJo-4EF+*-<#4ULR#=P zco-b5f`1e_FdH)lu%=8oR8Ke?jZO#$>*MqmnZQ*_LTyTEXF^Tf3^wWw9$!%>&Ju~6 zq7bO_3e9hM#DGIY;=K#y;VtYG&Z0yT2gJa$0{Vjc1)}pSrD)T_xm2|R$M7Os7i*M@ zzMN}a1dUda1Chm7P*15!Yp1T?YvOSE) zL4i-+ADq)-Ybw+cpYMh*LBXcJwC*nu8A-xcTPFX1Bkhs#1up0V>^jzxy^u>7iP+YKZ0=ZgihFPL!$X=S!7p%F*C@+t2_XRx~*i$Y{N zoQy_v@pke732OY2%KMp1IYD&>M_u^^7X^oH5qZR*qvDpg&5B`=&uoEK*tJ~6w7IaR zf-OT@@diDp0^NmM-rixAV5{t-@R#B1ljLU{+K~6@UlYU)1Sc#cFt{fe#;wu+L~S%r zNfzSd)L9QX-Kb)3Oe}S)7g6rojQ1%VJJQ8Y0%A}c&M2J0*?Y(@txUc7L5A81I`KKl zJ7`brkV;Gf6&}GdUx4y^Q|=osijW8qaz1AXFYrAL5n%1a;b8VTC*Gt5PD*g&WY38= z0^wX4jymhJJ?NPH`NjTrf;AVjCt)lySQk!%^N|NzJ7q8gB?%m?y+{jYg*2fWnvky= zZzRNAOs>Xb+C-QHndBTFb1wfz-+kGy-<(H_M`-h4=9<^y(jz`_$n>&c=?y9unt$#- PynlT{lKzA(#S#7s^45iN literal 0 HcmV?d00001 diff --git a/Tools/unix/cpmtools/badfs/name b/Tools/unix/cpmtools/badfs/name new file mode 100644 index 0000000000000000000000000000000000000000..67265aca96e0332f1628a01416886f8bebf0f52d GIT binary patch literal 13312 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 literal 0 HcmV?d00001 diff --git a/Tools/unix/cpmtools/badfs/status b/Tools/unix/cpmtools/badfs/status new file mode 100644 index 0000000000000000000000000000000000000000..33da248169b72872435ff70f6de33737b51a34a8 GIT binary patch literal 13312 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 literal 0 HcmV?d00001 diff --git a/Tools/unix/cpmtools/badfs/timestamps b/Tools/unix/cpmtools/badfs/timestamps new file mode 100644 index 0000000000000000000000000000000000000000..a434cc96935e8cf128804f30e5de6109b464c441 GIT binary patch literal 23168 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 literal 0 HcmV?d00001 diff --git a/Tools/unix/cpmtools/config.h b/Tools/unix/cpmtools/config.h new file mode 100644 index 00000000..2b5cd544 --- /dev/null +++ b/Tools/unix/cpmtools/config.h @@ -0,0 +1,57 @@ +/* config.h. Generated from config.h.in by configure. */ +#define HAVE_FCNTL_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_WINDOWS_H 0 +#define HAVE_WINIOCTL_H 0 +#define HAVE_LIBDSK_H 0 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_MODE_T 0 +#define NEED_NCURSES 0 +#define HAVE_NCURSES_NCURSES_H 0 + +#if HAVE_SYS_STAT_H +#include +#endif + +#if HAVE_SYS_TYPES_H +#include +#endif + +#if HAVE_LIMITS_H +#include +#endif + +#if HAVE_UNISTD_H +#include +#endif + +#if HAVE_WINDOWS_H +#include +#endif + +#if HAVE_WINIOCTL_H +#include +#endif + +#if HAVE_LIBDSK_H +#include +#endif + +#if HAVE_FCNTL_H +#include +#endif + +#ifndef _POSIX_PATH_MAX +#define _POSIX_PATH_MAX _MAX_PATH +#endif + +#include + +/* Define either for large file support, if your OS needs them. */ +/* #undef _FILE_OFFSET_BITS */ +/* #undef _LARGE_FILES */ + +/* Define if using dmalloc */ +/* #undef USE_DMALLOC */ diff --git a/Tools/unix/cpmtools/cpm.5 b/Tools/unix/cpmtools/cpm.5 new file mode 100644 index 00000000..9f11ff98 --- /dev/null +++ b/Tools/unix/cpmtools/cpm.5 @@ -0,0 +1,300 @@ +.\" Believe it or not, reportedly there are nroffs which do not know \(en +.if n .ds en - +.if t .ds en \(en +.TH CPM 5 "October 25, 2014" "CP/M tools" "File formats" +.SH NAME \"{{{roff}}}\"{{{ +cpm \- CP/M disk and file system format +.\"}}} +.SH DESCRIPTION \"{{{ +.SS "Characteristic sizes" \"{{{ +Each CP/M disk format is described by the following specific sizes: +.RS +.sp +Sector size in bytes +.br +Number of tracks +.br +Number of sectors +.br +Block size +.br +Number of directory entries +.br +Logical sector skew +.br +Number of reserved system tracks (optional) +.br +Offset to start of volume (optional and not covered by operating system, +but disk driver specific) +.sp +.RE +A block is the smallest allocatable storage unit. CP/M supports block +sizes of 1024, 2048, 4096, 8192 and 16384 bytes. Unfortunately, this +format specification is not stored on the disk and there are lots of +formats. Accessing a block is performed by accessing its sectors, which +are stored with the given software skew. +.\"}}} +.SS "Device areas" \"{{{ +A CP/M disk contains four areas: +.RS +.sp +Volume offset (optional and not covered by operating system, but disk driver specific) +.br +System tracks (optional) +.br +Directory +.br +Data +.sp +.RE +The system tracks store the boot loader and CP/M itself. In order to save +disk space, there are non-bootable formats which omit those system tracks. +The term \fIdisk capacity\fP always excludes the space for system tracks. +Note that there is no bitmap or list for free blocks. When accessing a +drive for the first time, CP/M builds this bitmap in core from the directory. +.LP +A hard disk can have the additional notion of a \fIvolume offset\fP to +locate the start of the drive image (which may or may not have system +tracks associated with it). The base unit for volume offset is byte +count from the beginning of the physical disk, but specifiers of +\fIK\fP, \fIM\fP, \fIT\fP or \fIS\fP may be appended to denote +kilobytes, megabytes, tracks or sectors. If provided, a specifier +must immediately follow the numeric value with no whitespace. For +convenience upper and lower case are both accepted and only the first +letter is significant, thus 2KB, 8MB, 1000trk and 16sec are valid +values. The \fBoffset\fP must appear subsequent to track, sector and sector +length values for the sector and track units to work. +.\"}}} +.SS "Directory entries" \"{{{ +The directory is a sequence of directory entries (also called extents), +which contain 32 bytes of the following structure: +.RS +.sp +.ta 3n 6n 9n 12n 15n 18n 21n 24n 27n 30n 33n 36n 39n 42n 45n +St F0 F1 F2 F3 F4 F5 F6 F7 E0 E1 E2 Xl Bc Xh Rc +.br +Al Al Al Al Al Al Al Al Al Al Al Al Al Al Al Al +.sp +.RE +.\"{{{ St = status +\fBSt\fP is the status; possible values are: +.RS +.sp +0\*(en15: used for file, status is the user number +.br +16\*(en31: used for file, status is the user number (P2DOS) +or used for password extent (CP/M 3 or higher) +.br +32: disc label +.br +33: time stamp (P2DOS) +.br +0xE5: unused +.sp +.RE +.\"}}} +.LP +.\"{{{ F0-E2 = file name and extension +\fBF0\*(enE2\fP are the file name and its extension. They may consist of +any printable 7 bit ASCII character but: \fB< > . , ; : = ? * [ ]\fP. +The file name must not be empty, the extension may be empty. Both are +padded with blanks. The highest bit of each character of the file name +and extension is used as attribute. The attributes have the following +meaning: +.RS +.sp +F0: requires set wheel byte (Backgrounder II) +.br +F1: public file (P2DOS, ZSDOS), forground-only command (Backgrounder II) +.br +F2: date stamp (ZSDOS), background-only commands (Backgrounder II) +.br +F7: wheel protect (ZSDOS) +.br +E0: read-only +.br +E1: system file +.br +E2: archived +.sp +.RE +Public files (visible under each user number) are not supported by CP/M +2.2, but there is a patch and some free CP/M clones support them without +any patches. +.LP +The wheel byte is (by default) the memory location at 0x4b. If it is +zero, only non-privileged commands may be executed. +.\"}}} +.LP +.\"{{{ Xl, Xh = extent number +\fBXl\fP and \fBXh\fP store the extent number. A file may use more than +one directory entry, if it contains more blocks than an extent can hold. +In this case, more extents are allocated and each of them is numbered +sequentially with an extent number. If a physical extent stores more than +16k, it is considered to contain multiple logical extents, each pointing +to 16k data, and the extent number of the last used logical extent +is stored. Note: Some formats decided to always store only one logical +extent in a physical extent, thus wasting extent space. CP/M 2.2 allows +512 extents per file, CP/M 3 and higher allow up to 2048. Bit 5\*(en7 of +Xl are 0, bit 0\*(en4 store the lower bits of the extent number. Bit 6 +and 7 of Xh are 0, bit 0\*(en5 store the higher bits of the extent number. +.\"}}} +.LP +.\"{{{ Rc, Bc = record count, byte count +\fBRc\fP and \fBBc\fP determine the length of the data used by this extent. The +physical extent is divided into logical extents, each of them being 16k +in size (a physical extent must hold at least one logical extent, e.g. a +blocksize of 1024 byte with two-byte block pointers is not allowed). +Rc stores the number of 128 byte records of the last used logical extent. +Bc stores the number of bytes in the last used record. The value 0 means +128 for backward compatibility with CP/M 2.2, which did not support Bc. +ISX records the number of unused instead of used bytes in Bc. +.\"}}} +.LP +.\"{{{ Al = allocated blocks +\fBAl\fP stores block pointers. If the disk capacity minus boot +tracks but including the directory area is less than 256 blocks, Al +is interpreted as 16 byte-values, otherwise as 8 double-byte-values. +Since the directory area is not subtracted, the directory area starts +with block 0 and files can never allocate block 0, which is why this +value can be given a new meaning: A block pointer of 0 marks a hole in +the file. If a hole covers the range of a full extent, the extent will +not be allocated. In particular, the first extent of a file does not +neccessarily have extent number 0. A file may not share blocks with other +files, as its blocks would be freed if the other files is erased without +a following disk system reset. CP/M returns EOF when it reaches a hole, +whereas UNIX returns zero-value bytes, which makes holes invisible. +.\"}}} +.\"}}} +.SS "Native time stamps" \"{{{ +P2DOS and CP/M Plus support time stamps, which are stored in each fourth +directory entry. This entry contains the time stamps for +the extents using the previous three directory entries. Note that you +really have time stamps for each extent, no matter if it is the first +extent of a file or not. The structure of time stamp entries is: +.RS +.sp +1 byte status 0x21 +.br +8 bytes time stamp for third-last directory entry +.br +2 bytes unused +.br +8 bytes time stamp for second-last directory entry +.br +2 bytes unused +.br +8 bytes time stamp for last directory entry +.sp +.RE +A time stamp consists of two dates: Creation and modification date (the +latter being recorded when the file is closed). CP/M Plus further +allows optionally to record the access instead of creation date as first +time stamp. +.RS +.sp +2 bytes (little-endian) days starting with 1 at 01-01-1978 +.br +1 byte hour in BCD format +.br +1 byte minute in BCD format +.sp +.RE +All time stamps are stored in local time. +.\"}}} +.SS "DateStamper time stamps" \"{{{ +The DateStamper software added functions to the BDOS to manage +time stamps by allocating a read only file with the name "!!!TIME&.DAT" +in the very first directory entry, covering the very first data +blocks. It contains one entry per directory entry with the +following structure of 16 bytes: +.RS +.sp +5 bytes create datefield +.br +5 bytes access datefield +.br +5 bytes modify datefield +.br +1 byte magic number/checksum +.sp +.RE +The magic number is used for the first 7 entries of each 128-byte record +and contains the characters \fB!\fP, \fB!\fP, \fB!\fP, \fBT\fP, \fBI\fP, +\fBM\fP and \fBE\fP. The checksum is used on every 8th entry (last entry +in 128-byte record) and is the sum of the first 127 bytes of the record. +Each datefield has this structure: +.RS +.sp +1 byte BCD coded year (no century, so it is sane assuming any year < 70 +means 21st century) +.br +1 byte BCD coded month +.br +1 byte BCD coded day +.br +1 byte BCD coded hour or, if the high bit is set, the high byte of a +counter for systems without real time clock +.br +1 byte BCD coded minute, or the low byte of the counter +.sp +.DE +.\"}}} +.SS "Disc labels" \"{{{ +CP/M Plus support disc labels, which are stored in an arbitrary directory +entry. +The structure of disc labels is: +.RS +.sp +1 byte status 0x20 +.br +\fBF0\*(enE2\fP are the disc label +.br +1 byte mode: bit 7 activates password protection, bit 6 causes time stamps on +access, but 5 causes time stamps on modifications, bit 4 causes time stamps on +creation and bit 0 is set when a label exists. Bit 4 and 6 are exclusively set. +.br +1 byte password decode byte: To decode the password, xor this byte with the password +bytes in reverse order. To encode a password, add its characters to get the +decode byte. +.br +2 reserved bytes +.br +8 password bytes +.br +4 bytes label creation time stamp +.br +4 bytes label modification time stamp +.sp +.RE +.\"}}} +.SS "Passwords" \"{{{ +CP/M Plus supports passwords, which are stored in an arbitrary directory +entry. +The structure of these entries is: +.RS +.sp +1 byte status (user number plus 16) +.br +\fBF0\*(enE2\fP are the file name and its extension. +.br +1 byte password mode: bit 7 means password required for reading, bit 6 for writing +and bit 5 for deleting. +.br +1 byte password decode byte: To decode the password, xor this byte with the password +bytes in reverse order. To encode a password, add its characters to get the +decode byte. +.br +2 reserved bytes +.br +8 password bytes +.sp +.RE +.\"}}} +.\"}}} +.SH "SEE ALSO" \"{{{ +.IR mkfs.cpm (1), +.IR fsck.cpm (1), +.IR fsed.cpm (1), +.IR cpmls (1) +.\"}}} diff --git a/Tools/unix/cpmtools/cpm.ps b/Tools/unix/cpmtools/cpm.ps new file mode 100644 index 00000000..6c631338 --- /dev/null +++ b/Tools/unix/cpmtools/cpm.ps @@ -0,0 +1,478 @@ +%!PS-Adobe-3.0 +%%Creator: groff version 1.19 +%%CreationDate: Sun Feb 3 19:48:55 2013 +%%DocumentNeededResources: font Times-Roman +%%+ font Times-Bold +%%+ font Times-Italic +%%DocumentSuppliedResources: procset grops 1.19 0 +%%Pages: 4 +%%PageOrder: Ascend +%%DocumentMedia: Default 595 842 0 () () +%%Orientation: Portrait +%%EndComments +%%BeginDefaults +%%PageMedia: Default +%%EndDefaults +%%BeginProlog +%%BeginResource: procset grops 1.19 0 +/setpacking where{ +pop +currentpacking +true setpacking +}if +/grops 120 dict dup begin +/SC 32 def +/A/show load def +/B{0 SC 3 -1 roll widthshow}bind def +/C{0 exch ashow}bind def +/D{0 exch 0 SC 5 2 roll awidthshow}bind def +/E{0 rmoveto show}bind def +/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def +/G{0 rmoveto 0 exch ashow}bind def +/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/I{0 exch rmoveto show}bind def +/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def +/K{0 exch rmoveto 0 exch ashow}bind def +/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/M{rmoveto show}bind def +/N{rmoveto 0 SC 3 -1 roll widthshow}bind def +/O{rmoveto 0 exch ashow}bind def +/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/Q{moveto show}bind def +/R{moveto 0 SC 3 -1 roll widthshow}bind def +/S{moveto 0 exch ashow}bind def +/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/SF{ +findfont exch +[exch dup 0 exch 0 exch neg 0 0]makefont +dup setfont +[exch/setfont cvx]cvx bind def +}bind def +/MF{ +findfont +[5 2 roll +0 3 1 roll +neg 0 0]makefont +dup setfont +[exch/setfont cvx]cvx bind def +}bind def +/level0 0 def +/RES 0 def +/PL 0 def +/LS 0 def +/MANUAL{ +statusdict begin/manualfeed true store end +}bind def +/PLG{ +gsave newpath clippath pathbbox grestore +exch pop add exch pop +}bind def +/BP{ +/level0 save def +1 setlinecap +1 setlinejoin +72 RES div dup scale +LS{ +90 rotate +}{ +0 PL translate +}ifelse +1 -1 scale +}bind def +/EP{ +level0 restore +showpage +}bind def +/DA{ +newpath arcn stroke +}bind def +/SN{ +transform +.25 sub exch .25 sub exch +round .25 add exch round .25 add exch +itransform +}bind def +/DL{ +SN +moveto +SN +lineto stroke +}bind def +/DC{ +newpath 0 360 arc closepath +}bind def +/TM matrix def +/DE{ +TM currentmatrix pop +translate scale newpath 0 0 .5 0 360 arc closepath +TM setmatrix +}bind def +/RC/rcurveto load def +/RL/rlineto load def +/ST/stroke load def +/MT/moveto load def +/CL/closepath load def +/Fr{ +setrgbcolor fill +}bind def +/setcmykcolor where{ +pop +/Fk{ +setcmykcolor fill +}bind def +}if +/Fg{ +setgray fill +}bind def +/FL/fill load def +/LW/setlinewidth load def +/Cr/setrgbcolor load def +/setcmykcolor where{ +pop +/Ck/setcmykcolor load def +}if +/Cg/setgray load def +/RE{ +findfont +dup maxlength 1 index/FontName known not{1 add}if dict begin +{ +1 index/FID ne{def}{pop pop}ifelse +}forall +/Encoding exch def +dup/FontName exch def +currentdict end definefont pop +}bind def +/DEFS 0 def +/EBEGIN{ +moveto +DEFS begin +}bind def +/EEND/end load def +/CNT 0 def +/level1 0 def +/PBEGIN{ +/level1 save def +translate +div 3 1 roll div exch scale +neg exch neg exch translate +0 setgray +0 setlinecap +1 setlinewidth +0 setlinejoin +10 setmiterlimit +[]0 setdash +/setstrokeadjust where{ +pop +false setstrokeadjust +}if +/setoverprint where{ +pop +false setoverprint +}if +newpath +/CNT countdictstack def +userdict begin +/showpage{}def +/setpagedevice{}def +}bind def +/PEND{ +clear +countdictstack CNT sub{end}repeat +level1 restore +}bind def +end def +/setpacking where{ +pop +setpacking +}if +%%EndResource +%%BeginFeature: *PageSize Default +<< /PageSize [ 595 842 ] /ImagingBBox null >> setpagedevice +%%EndFeature +%%IncludeResource: font Times-Roman +%%IncludeResource: font Times-Bold +%%IncludeResource: font Times-Italic +grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 +def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron +/Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent +/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen +/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O +/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex +/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y +/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft +/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl +/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut +/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash +/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen +/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft +/logicalnot/minus/registered/macron/degree/plusminus/twosuperior +/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior +/ordmasculine/guilsinglright/onequarter/onehalf/threequarters +/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE +/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex +/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn +/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla +/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis +/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash +/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE +/Times-Roman@0 ENC0/Times-Roman RE +%%EndProlog +%%Page: 1 1 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 174.415(CPM\(5\) File)72 48 R 174.415 +(formats CPM\(5\))2.5 F/F1 10.95/Times-Bold@0 SF -.219(NA)72 84 S(ME) +.219 E F0(cpm \255 CP/M disk and \214le system format)108 96 Q F1 +(DESCRIPTION)72 112.8 Q/F2 10/Times-Bold@0 SF(Characteristic sizes)87 +124.8 Q F0(Each CP/M disk format is described by the follo)108 136.8 Q +(wing speci\214c sizes:)-.25 E(Sector size in bytes)144 160.8 Q +(Number of tracks)144 172.8 Q(Number of sectors)144 184.8 Q(Block size) +144 196.8 Q(Number of directory entries)144 208.8 Q(Logical sector sk) +144 220.8 Q -.25(ew)-.1 G(Number of reserv)144 232.8 Q +(ed system tracks \(optional\))-.15 E(Of)144 244.8 Q(fset to start of v) +-.25 E(olume \(optional\))-.2 E 2.848(Ab)108 268.8 S .348 +(lock is the smallest allocatable storage unit.)-2.848 F .347 +(CP/M supports block sizes of 1024, 2048, 4096, 8192 and)5.348 F .207 +(16384 bytes.)108 280.8 R(Unfortunately)5.207 E 2.707(,t)-.65 G .208(hi\ +s format speci\214cation is not stored on the disk and there are lots o\ +f formats.)-2.707 F(Accessing a block is performed by accessing its sec\ +tors, which are stored with the gi)108 292.8 Q -.15(ve)-.25 G 2.5(ns).15 +G(oftw)-2.5 E(are sk)-.1 E -.25(ew)-.1 G(.)-.4 E F2(De)87 309.6 Q +(vice ar)-.15 E(eas)-.18 E F0 2.5(AC)108 321.6 S +(P/M disk contains three areas:)-2.5 E -1.29(Vo)144 345.6 S(lume of)1.29 +E(fset \(optional\))-.25 E(System tracks \(optional\))144 357.6 Q +(Directory)144 369.6 Q(Data)144 381.6 Q .058 +(The system tracks store the boot loader and CP/M itself.)108 405.6 R +.058(In order to sa)5.058 F .358 -.15(ve d)-.2 H .057 +(isk space, there are non-bootable).15 F 1.55 +(formats which omit those system tracks.)108 417.6 R 1.55(The term)6.55 +F/F3 10/Times-Italic@0 SF 1.55(disk capacity)4.05 F F0(al)4.05 E -.1(wa) +-.1 G 1.55(ys e).1 F 1.55(xcludes the space for system)-.15 F 2.748 +(tracks. Note)108 429.6 R .248 +(that there is no bitmap or list for free blocks.)2.748 F .248 +(When accessing a dri)5.248 F .548 -.15(ve f)-.25 H .248 +(or the \214rst time, CP/M).15 F -.2(bu)108 441.6 S +(ilds this bitmap in core from the directory).2 E(.)-.65 E 3.15(Ah)108 +458.4 S .65(ard disk can ha)-3.15 F .95 -.15(ve t)-.2 H .65 +(he additional notion of a).15 F F3 .65(volume of)3.15 F(fset)-.18 E F0 +.65(to locate the start of the dri)3.15 F .95 -.15(ve i)-.25 H .65 +(mage \(which).15 F .531(may or may not ha)108 470.4 R .831 -.15(ve s) +-.2 H .531(ystem tracks associated with it\). The base unit for v).15 F +.53(olume of)-.2 F .53(fset is byte count from)-.25 F 1.224(the be)108 +482.4 R 1.224(ginning of the ph)-.15 F 1.224(ysical disk, b)-.05 F 1.225 +(ut speci\214ers of)-.2 F F3(K)3.725 E F0(,)A F3(M)3.725 E F0(,)A F3(T) +3.725 E F0(or)3.725 E F3(S)3.725 E F0 1.225 +(may be appended to denote kilobytes,)3.725 F(me)108 494.4 Q -.05(ga) +-.15 G .806(bytes, tracks or sectors.).05 F .806(If pro)5.806 F .805 +(vided, a speci\214er must immediately follo)-.15 F 3.305(wt)-.25 G .805 +(he numeric v)-3.305 F .805(alue with no)-.25 F 2.881(whitespace. F)108 +506.4 R .381(or con)-.15 F -.15(ve)-.4 G .381(nience upper and lo).15 F +.381(wer case are both accepted and only the \214rst letter is signi\ +\214cant,)-.25 F .02(thus 2KB, 8MB, 1000trk and 16sec are v)108 518.4 R +.019(alid v)-.25 F .019(alues. Of)-.25 F .019 +(fset must appear subsequent to track, sector and sec-)-.25 F +(tor length v)108 530.4 Q(alues.)-.25 E F2(Dir)87 547.2 Q +(ectory entries)-.18 E F0 .408 +(The directory is a sequence of directory entries \(also called e)108 +559.2 R .409(xtents\), which contain 32 bytes of the follo)-.15 F(w-) +-.25 E(ing structure:)108 571.2 Q 4.16(St F0)144 595.2 R 1.94 +(F1 F2 F3 F4 F5 F6 F7 E0)4.44 F 1.39(E1 E2 Xl)3.89 F 1.39(Bc Xh)5 F(Rc) +2.78 E 2.5(Al Al Al Al Al Al Al Al Al Al Al Al Al Al Al Al)144 607.2 R +F2(St)108 631.2 Q F0(is the status; possible v)2.5 E(alues are:)-.25 E +(0\21115: used for \214le, status is the user number)144 655.2 Q .795(1\ +6\21131: used for \214le, status is the user number \(P2DOS\) or used f\ +or passw)144 667.2 R .794(ord e)-.1 F .794(xtent \(CP/M 3 or)-.15 F +(higher\))144 679.2 Q(32: disc label)144 691.2 Q +(33: time stamp \(P2DOS\))144 703.2 Q(0xE5: unused)144 715.2 Q +(CP/M tools)72 768 Q(February 18, 2012)151.35 E(1)192.2 E 0 Cg EP +%%Page: 2 2 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 174.415(CPM\(5\) File)72 48 R 174.415 +(formats CPM\(5\))2.5 F/F1 10/Times-Bold@0 SF(F0\211E2)108 84 Q F0 .412 +(are the \214le name and its e)2.912 F 2.913(xtension. The)-.15 F 2.913 +(ym)-.15 G .413(ay consist of an)-2.913 F 2.913(yp)-.15 G .413 +(rintable 7 bit ASCII character b)-2.913 F(ut:)-.2 E F1(<)2.913 E 3.362 +(>.,;:=?*[])108 96 S F0 5.862(.T)-3.362 G .862 +(he \214le name must not be empty)-5.862 F 3.361(,t)-.65 G .861(he e) +-3.361 F .861(xtension may be empty)-.15 F 5.861(.B)-.65 G .861 +(oth are padded with)-5.861 F 2.831(blanks. The)108 108 R .331 +(highest bit of each character of the \214le name and e)2.831 F .331 +(xtension is used as attrib)-.15 F 2.832(ute. The)-.2 F(attrib)2.832 E +(utes)-.2 E(ha)108 120 Q .3 -.15(ve t)-.2 H(he follo).15 E +(wing meaning:)-.25 E(F0: requires set wheel byte \(Backgrounder II\)) +144 144 Q(F1: public \214le \(P2DOS, ZSDOS\), for)144 156 Q +(ground-only command \(Backgrounder II\))-.18 E +(F2: date stamp \(ZSDOS\), background-only commands \(Backgrounder II\)) +144 168 Q(F7: wheel protect \(ZSDOS\))144 180 Q(E0: read-only)144 192 Q +(E1: system \214le)144 204 Q(E2: archi)144 216 Q -.15(ve)-.25 G(d).15 E +.338(Public \214les \(visible under each user number\) are not supporte\ +d by CP/M 2.2, b)108 240 R .338(ut there is a patch and some)-.2 F +(free CP/M clones support them without an)108 252 Q 2.5(yp)-.15 G +(atches.)-2.5 E .827(The wheel byte is \(by def)108 268.8 R .828 +(ault\) the memory location at 0x4b)-.1 F 5.828(.I)-.4 G 3.328(fi)-5.828 +G 3.328(ti)-3.328 G 3.328(sz)-3.328 G .828(ero, only non-pri)-3.328 F +(vile)-.25 E .828(ged commands)-.15 F(may be e)108 280.8 Q -.15(xe)-.15 +G(cuted.).15 E F1(Xl)108 297.6 Q F0(and)2.546 E F1(Xh)2.546 E F0 .046 +(store the e)2.546 F .046(xtent number)-.15 F 5.046(.A)-.55 G .045 +(\214le may use more than one directory entry)-2.5 F 2.545(,i)-.65 G +2.545(fi)-2.545 G 2.545(tc)-2.545 G .045(ontains more blocks)-2.545 F +.21(than an e)108 309.6 R .21(xtent can hold.)-.15 F .21 +(In this case, more e)5.21 F .21 +(xtents are allocated and each of them is numbered sequentially)-.15 F +.457(with an e)108 321.6 R .457(xtent number)-.15 F 5.457(.I)-.55 G +2.957(fap)-5.457 G -.05(hy)-2.957 G .457(sical e).05 F .456 +(xtent stores more than 16k, it is considered to contain multiple logi-) +-.15 F .234(cal e)108 333.6 R .234 +(xtents, each pointing to 16k data, and the e)-.15 F .234 +(xtent number of the last used logical e)-.15 F .235(xtent is stored.) +-.15 F(Note:)5.235 E 1.55(Some formats decided to al)108 345.6 R -.1(wa) +-.1 G 1.549(ys store only one logical e).1 F 1.549(xtent in a ph)-.15 F +1.549(ysical e)-.05 F 1.549(xtent, thus w)-.15 F 1.549(asting e)-.1 F +(xtent)-.15 E 2.81(space. CP/M)108 357.6 R .31(2.2 allo)2.81 F .31 +(ws 512 e)-.25 F .31(xtents per \214le, CP/M 3 and higher allo)-.15 F +2.811(wu)-.25 G 2.811(pt)-2.811 G 2.811(o2)-2.811 G 2.811(048. Bit) +-2.811 F .311(5\2117 of Xl are 0, bit)2.811 F .577(0\2114 store the lo) +108 369.6 R .577(wer bits of the e)-.25 F .576(xtent number)-.15 F 5.576 +(.B)-.55 G .576 +(it 6 and 7 of Xh are 0, bit 0\2115 store the higher bits of the)-5.576 +F -.15(ex)108 381.6 S(tent number).15 E(.)-.55 E F1(Rc)108 398.4 Q F0 +(and)2.946 E F1(Bc)2.946 E F0 .446 +(determine the length of the data used by this e)2.946 F 2.946 +(xtent. The)-.15 F(ph)2.947 E .447(ysical e)-.05 F .447(xtent is di)-.15 +F .447(vided into logical)-.25 F -.15(ex)108 410.4 S .156 +(tents, each of them being 16k in size \(a ph).15 F .156(ysical e)-.05 F +.156(xtent must hold at least one logical e)-.15 F .156 +(xtent, e.g. a block-)-.15 F .053(size of 1024 byte with tw)108 422.4 R +.054(o-byte block pointers is not allo)-.1 F 2.554(wed\). Rc)-.25 F .054 +(stores the number of 128 byte records of)2.554 F .457 +(the last used logical e)108 434.4 R 2.957(xtent. Bc)-.15 F .456 +(stores the number of bytes in the last used record.)2.957 F .456(The v) +5.456 F .456(alue 0 means 128)-.25 F .654(for backw)108 446.4 R .654 +(ard compatibility with CP/M 2.2, which did not support Bc.)-.1 F .655 +(ISX records the number of unused)5.655 F(instead of used bytes in Bc.) +108 458.4 Q F1(Al)108 475.2 Q F0 .9(stores block pointers.)3.4 F .899(I\ +f the disk capacity is less than 256 blocks, Al is interpreted as 16 by\ +te-v)5.9 F(alues,)-.25 E .243(otherwise as 8 double-byte-v)108 487.2 R +2.743(alues. A)-.25 F .243 +(block pointer of 0 marks a hole in the \214le.)2.743 F .243 +(If a hole co)5.243 F -.15(ve)-.15 G .243(rs the range).15 F .341 +(of a full e)108 499.2 R .341(xtent, the e)-.15 F .341 +(xtent will not be allocated.)-.15 F .34(In particular)5.341 F 2.84(,t) +-.4 G .34(he \214rst e)-2.84 F .34 +(xtent of a \214le does not neccessarily)-.15 F(ha)108 511.2 Q .479 -.15 +(ve ex)-.2 H .179(tent number 0.).15 F 2.679<418c>5.179 G .18 +(le may not share blocks with other \214les, as its blocks w)-2.679 F +.18(ould be freed if the other)-.1 F .822 +(\214les is erased without a follo)108 523.2 R .822 +(wing disk system reset.)-.25 F .822 +(CP/M returns EOF when it reaches a hole, whereas)5.822 F +(UNIX returns zero-v)108 535.2 Q(alue bytes, which mak)-.25 E +(es holes in)-.1 E(visible.)-.4 E F1(Nati)87 552 Q .2 -.1(ve t)-.1 H +(ime stamps).1 E F0 1.053(P2DOS and CP/M Plus support time stamps, whic\ +h are stored in each fourth directory entry)108 564 R 6.054(.T)-.65 G +1.054(his entry)-6.054 F 1.3(contains the time stamps for the e)108 576 +R 1.299(xtents using the pre)-.15 F 1.299 +(vious three directory entries.)-.25 F 1.299(Note that you really)6.299 +F(ha)108 588 Q 1.294 -.15(ve t)-.2 H .994(ime stamps for each e).15 F +.994(xtent, no matter if it is the \214rst e)-.15 F .994 +(xtent of a \214le or not.)-.15 F .995(The structure of time)5.994 F +(stamp entries is:)108 600 Q 2.5(1b)144 624 S(yte status 0x21)-2.5 E 2.5 +(8b)144 636 S(ytes time stamp for third-last directory entry)-2.5 E 2.5 +(2b)144 648 S(ytes unused)-2.5 E 2.5(8b)144 660 S +(ytes time stamp for second-last directory entry)-2.5 E 2.5(2b)144 672 S +(ytes unused)-2.5 E 2.5(8b)144 684 S +(ytes time stamp for last directory entry)-2.5 E 2.872(At)108 708 S .372 +(ime stamp consists of tw)-2.872 F 2.872(od)-.1 G .372(ates: Creation a\ +nd modi\214cation date \(the latter being recorded when the \214le) +-2.872 F .935(is closed\).)108 720 R .936(CP/M Plus further allo)5.935 F +.936(ws optionally to record the access instead of creation date as \ +\214rst time)-.25 F(CP/M tools)72 768 Q(February 18, 2012)151.35 E(2) +192.2 E 0 Cg EP +%%Page: 3 3 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 174.415(CPM\(5\) File)72 48 R 174.415 +(formats CPM\(5\))2.5 F(stamp.)108 84 Q 2.5(2b)144 108 S +(ytes \(little-endian\) days starting with 1 at 01-01-1978)-2.5 E 2.5 +(1b)144 120 S(yte hour in BCD format)-2.5 E 2.5(1b)144 132 S +(yte minute in BCD format)-2.5 E/F1 10/Times-Bold@0 SF +(DateStamper time stamps)87 160.8 Q F0 .552(The DateStamper softw)108 +172.8 R .552(are added functions to the BDOS to manage time stamps by a\ +llocating a read only)-.1 F .441(\214le with the name "!!!TIME&.D)108 +184.8 R -1.11(AT)-.4 G 2.941("i)1.11 G 2.941(nt)-2.941 G .441(he v) +-2.941 F .441(ery \214rst directory entry)-.15 F 2.941(,c)-.65 G -.15 +(ove)-2.941 G .441(ring the v).15 F .442(ery \214rst data blocks.)-.15 F +(It)5.442 E(contains one entry per directory entry with the follo)108 +196.8 Q(wing structure of 16 bytes:)-.25 E 2.5(5b)144 220.8 S +(ytes create date\214eld)-2.5 E 2.5(5b)144 232.8 S +(ytes access date\214eld)-2.5 E 2.5(5b)144 244.8 S +(ytes modify date\214eld)-2.5 E 2.5(1b)144 256.8 S(yte checksum)-2.5 E +.237(The checksum is only used on e)108 280.8 R -.15(ve)-.25 G .236(ry \ +8th entry \(last entry in 128-byte record\) and is the sum of the \214r\ +st 127).15 F(bytes of the record.)108 292.8 Q +(Each date\214eld has this structure:)5 E 2.5(1b)144 316.8 S +(yte BCD coded year \(no century)-2.5 E 2.5(,s)-.65 G 2.5(oi)-2.5 G 2.5 +(ti)-2.5 G 2.5(ss)-2.5 G(ane assuming an)-2.5 E 2.5(yy)-.15 G +(ear < 70 means 21st century\))-2.5 E 2.5(1b)144 328.8 S +(yte BCD coded month)-2.5 E 2.5(1b)144 340.8 S(yte BCD coded day)-2.5 E +2.608(1b)144 352.8 S .108(yte BCD coded hour or)-2.608 F 2.608(,i)-.4 G +2.608(ft)-2.608 G .108(he high bit is set, the high byte of a counter f\ +or systems without real)-2.608 F(time clock)144 364.8 Q 2.5(1b)144 376.8 +S(yte BCD coded minute, or the lo)-2.5 E 2.5(wb)-.25 G +(yte of the counter)-2.5 E F1(Disc labels)87 405.6 Q F0 .258(CP/M Plus \ +support disc labels, which are stored in an arbitrary directory entry) +108 417.6 R 5.257(.T)-.65 G .257(he structure of disc labels)-5.257 F +(is:)108 429.6 Q 2.5(1b)144 453.6 S(yte status 0x20)-2.5 E F1(F0\211E2) +144 465.6 Q F0(are the disc label)2.5 E 2.886(1b)144 477.6 S .386 +(yte mode: bit 7 acti)-2.886 F -.25(va)-.25 G .386(tes passw).25 F .387 +(ord protection, bit 6 causes time stamps on access, b)-.1 F .387 +(ut 5 causes)-.2 F .874(time stamps on modi\214cations, bit 4 causes ti\ +me stamps on creation and bit 0 is set when a label)144 489.6 R -.15(ex) +144 501.6 S 2.5(ists. Bit).15 F 2.5(4a)2.5 G(nd 6 are e)-2.5 E(xclusi) +-.15 E -.15(ve)-.25 G(ly set.).15 E 3.45(1b)144 513.6 S .95(yte passw) +-3.45 F .95(ord decode byte: T)-.1 F 3.45(od)-.8 G .951(ecode the passw) +-3.45 F .951(ord, xor this byte with the passw)-.1 F .951(ord bytes in) +-.1 F(re)144 525.6 Q -.15(ve)-.25 G(rse order).15 E 5(.T)-.55 G 2.5(oe) +-5.8 G(ncode a passw)-2.5 E +(ord, add its characters to get the decode byte.)-.1 E 2.5(2r)144 537.6 +S(eserv)-2.5 E(ed bytes)-.15 E 2.5(8p)144 549.6 S(assw)-2.5 E(ord bytes) +-.1 E 2.5(4b)144 561.6 S(ytes label creation time stamp)-2.5 E 2.5(4b) +144 573.6 S(ytes label modi\214cation time stamp)-2.5 E F1 -.1(Pa)87 +602.4 S(ssw).1 E(ords)-.1 E F0 1.484(CP/M Plus supports passw)108 614.4 +R 1.484(ords, which are stored in an arbitrary directory entry)-.1 F +6.484(.T)-.65 G 1.484(he structure of these)-6.484 F(entries is:)108 +626.4 Q 2.5(1b)144 650.4 S(yte status \(user number plus 16\))-2.5 E F1 +(F0\211E2)144 662.4 Q F0(are the \214le name and its e)2.5 E(xtension.) +-.15 E 3.171(1b)144 674.4 S .671(yte passw)-3.171 F .671 +(ord mode: bit 7 means passw)-.1 F .672 +(ord required for reading, bit 6 for writing and bit 5 for)-.1 F +(deleting.)144 686.4 Q 3.451(1b)144 698.4 S .951(yte passw)-3.451 F .951 +(ord decode byte: T)-.1 F 3.451(od)-.8 G .951(ecode the passw)-3.451 F +.95(ord, xor this byte with the passw)-.1 F .95(ord bytes in)-.1 F(re) +144 710.4 Q -.15(ve)-.25 G(rse order).15 E 5(.T)-.55 G 2.5(oe)-5.8 G +(ncode a passw)-2.5 E(ord, add its characters to get the decode byte.) +-.1 E 2.5(2r)144 722.4 S(eserv)-2.5 E(ed bytes)-.15 E(CP/M tools)72 768 +Q(February 18, 2012)151.35 E(3)192.2 E 0 Cg EP +%%Page: 4 4 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 174.415(CPM\(5\) File)72 48 R 174.415 +(formats CPM\(5\))2.5 F 2.5(8p)144 84 S(assw)-2.5 E(ord bytes)-.1 E/F1 +10.95/Times-Bold@0 SF(SEE ALSO)72 112.8 Q/F2 10/Times-Italic@0 SF +(mkfs.cpm)108 124.8 Q F0(\(1\),).32 E F2(fsc)2.5 E(k.cpm)-.2 E F0 +(\(1\),).32 E F2(fsed.cpm)2.5 E F0(\(1\),).32 E F2(cpmls)2.5 E F0(\(1\)) +.27 E(CP/M tools)72 768 Q(February 18, 2012)151.35 E(4)192.2 E 0 Cg EP +%%Trailer +end +%%EOF diff --git a/Tools/unix/cpmtools/cpmchattr.1 b/Tools/unix/cpmtools/cpmchattr.1 new file mode 100644 index 00000000..f130d5c2 --- /dev/null +++ b/Tools/unix/cpmtools/cpmchattr.1 @@ -0,0 +1,92 @@ +.TH CPMCHATTR 1 "October 25, 2014" "CP/M tools" "User commands" +.SH NAME \"{{{roff}}}\"{{{ +cpmchattr \- change file attributes on CP/M files +.\"}}} +.SH SYNOPSIS \"{{{ +.ad l +.B cpmchattr +.RB [ \-f +.IR format ] +.I image +.I attrib +.I file-pattern +\&... +.ad b +.\"}}} +.SH DESCRIPTION \"{{{ +\fBCpmchattr\fP changes the file attributes for files on CP/M disks. +.\"}}} +.SH OPTIONS \"{{{ +.IP "\fB\-f\fP \fIformat\fP" +Use the given CP/M disk \fIformat\fP instead of the default format. +.IP "\fB\-T\fP \fIlibdsk-type\fP" +libdsk driver type, e.g. \fBtele\fP for Teledisk images or \fBraw\fP for raw images +(requires building cpmtools with support for libdsk). +.IP "\fIattrib\fP" +Set the file attributes as given. +.\"}}} +.SH "FILE ATTRIBUTES" \"{{{ +The file attribute string can contain the characters +1,2,3,4,r,s,a,n and m. +The meanings of these are: +.TP +.B 1-4 +The CP/M "user attributes" F1-F4. CP/M does not assign any +meaning to these attributes, though MP/M does. +.TP +.B r +The file is read-only. This is the same as using +.I cpmchmod(1) +to revoke write permissions. +.TP +.B s +The file is a system file. This attribute can also be set by +.I cpmchmod(1). +.TP +.B a +The file has been backed up. +.TP +.B n +Reset all attributes to zero. So the string "n1r" resets all attributes and +then sets F1 and Read-Only. +.TP +.B m +Attributes after an m are unset rather than set. The string "12m34" sets +atttributes F1 and F2, and unsets F3 and F4. +.\"}}} +.SH "RETURN VALUE" \"{{{ +Upon successful completion, exit code 0 is returned. +.\"}}} +.SH ERRORS \"{{{ +Any errors are indicated by exit code 1. +.\"}}} +.SH ENVIRONMENT \"{{{ +CPMTOOLSFMT Default format +.\"}}} +.SH FILES \"{{{ +${prefix}/share/diskdefs CP/M disk format definitions +.\"}}} +.SH AUTHORS \"{{{ +This program is copyright 1997\(en2012 Michael Haardt + and copyright 2000, 2001, 2011 John Elliott +. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License along +with this program. If not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\"}}} +.SH "SEE ALSO" \"{{{ +.IR cpmls (1), +.IR cpmchmod (1), +.IR cpm (5) +.\"}}} diff --git a/Tools/unix/cpmtools/cpmchattr.c b/Tools/unix/cpmtools/cpmchattr.c new file mode 100644 index 00000000..be39130b --- /dev/null +++ b/Tools/unix/cpmtools/cpmchattr.c @@ -0,0 +1,119 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include + +#include "getopt_.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ + +const char cmd[]="cpmchattr"; + +int main(int argc, char *argv[]) /*{{{*/ +{ + /* variables */ /*{{{*/ + const char *err; + const char *image; + const char *format; + const char *devopts=NULL; + int c,i,usage=0,exitcode=0; + struct cpmSuperBlock drive; + struct cpmInode root; + int gargc; + char **gargv; + const char *attrs; + /*}}}*/ + + /* parse options */ /*{{{*/ + if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT; + while ((c=getopt(argc,argv,"T:f:h?"))!=EOF) switch(c) + { + case 'T': devopts=optarg; break; + case 'f': format=optarg; break; + case 'h': + case '?': usage=1; break; + } + + if (optind>=(argc-2)) usage=1; + else + { + image=argv[optind++]; + attrs = argv[optind++]; + } + + if (usage) + { + fprintf(stderr,"Usage: %s [-f format] [-T dsktype] image [NMrsa1234] pattern ...\n",cmd); + exit(1); + } + /*}}}*/ + /* open image */ /*{{{*/ + if ((err=Device_open(&drive.dev, image, O_RDWR, devopts))) + { + fprintf(stderr,"%s: cannot open %s (%s)\n",cmd,image,err); + exit(1); + } + if (cpmReadSuper(&drive,&root,format)==-1) + { + fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo); + exit(1); + } + /*}}}*/ + cpmglob(optind,argc,argv,&root,&gargc,&gargv); + for (i=0; i and copyright 2000, 2001, 2011 John Elliott +. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License along +with this program. If not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\"}}} +.SH "SEE ALSO" \"{{{ +.IR cpmls (1), +.IR chmod (1), +.IR cpm (5) +.\"}}} diff --git a/Tools/unix/cpmtools/cpmchmod.c b/Tools/unix/cpmtools/cpmchmod.c new file mode 100644 index 00000000..ad146965 --- /dev/null +++ b/Tools/unix/cpmtools/cpmchmod.c @@ -0,0 +1,89 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include +#include + +#include "getopt_.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ + +const char cmd[]="cpmchmod"; + +int main(int argc, char *argv[]) /*{{{*/ +{ + /* variables */ /*{{{*/ + const char *err; + const char *image; + const char *format; + const char *devopts=NULL; + int c,i,usage=0,exitcode=0; + struct cpmSuperBlock drive; + struct cpmInode root; + int gargc; + char **gargv; + unsigned int mode; + /*}}}*/ + + /* parse options */ /*{{{*/ + if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT; + while ((c=getopt(argc,argv,"T:f:h?"))!=EOF) switch(c) + { + case 'T': devopts=optarg; break; + case 'f': format=optarg; break; + case 'h': + case '?': usage=1; break; + } + + if (optind>=(argc-2)) usage=1; + else + { + image=argv[optind++]; + if (!sscanf(argv[optind++], "%o", &mode)) usage=1; + } + + if (usage) + { + fprintf(stderr,"Usage: %s [-f format] image mode pattern ...\n",cmd); + exit(1); + } + /*}}}*/ + /* open image */ /*{{{*/ + if ((err=Device_open(&drive.dev, image, O_RDWR, devopts))) + { + fprintf(stderr,"%s: cannot open %s (%s)\n",cmd,image,err); + exit(1); + } + if (cpmReadSuper(&drive,&root,format)==-1) + { + fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo); + exit(1); + } + /*}}}*/ + cpmglob(optind,argc,argv,&root,&gargc,&gargv); + for (i=0; i. The Windows port is copyright 2000, 2001, 2011 John Elliott +. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License along +with this program. If not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\"}}} +.SH "SEE ALSO" \"{{{ +.IR cpmls (1), +.IR cpm (5) +.\"}}} diff --git a/Tools/unix/cpmtools/cpmcp.c b/Tools/unix/cpmtools/cpmcp.c new file mode 100644 index 00000000..561c451f --- /dev/null +++ b/Tools/unix/cpmtools/cpmcp.c @@ -0,0 +1,299 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "getopt_.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ + +const char cmd[]="cpmcp"; +static int text=0; +static int preserve=0; + +/** + * Return the user number. + * @param s CP/M filename in 0[0]:aaaaaaaa.bbb format. + * @returns The user number or -1 for no match. + */ +static int userNumber(const char *s) /*{{{*/ +{ + if (isdigit(*s) && *(s+1)==':') return (*s-'0'); + if (isdigit(*s) && isdigit(*(s+1)) && *(s+2)==':') return (10*(*s-'0')+(*(s+1)-'0')); + return -1; +} +/*}}}*/ + +/** + * Copy one file from CP/M to UNIX. + * @param root The inode for the root directory. + * @param src The CP/M filename in 00aaaaaaaabbb format. + * @param dest The UNIX filename. + * @returns 0 for success, 1 for error. + */ +static int cpmToUnix(const struct cpmInode *root, const char *src, const char *dest) /*{{{*/ +{ + struct cpmInode ino; + int exitcode=0; + + if (cpmNamei(root,src,&ino)==-1) { fprintf(stderr,"%s: can not open `%s': %s\n",cmd,src,boo); exitcode=1; } + else + { + struct cpmFile file; + FILE *ufp; + + cpmOpen(&ino,&file,O_RDONLY); + if ((ufp=fopen(dest,text ? "w" : "wb"))==(FILE*)0) { fprintf(stderr,"%s: can not create %s: %s\n",cmd,dest,strerror(errno)); exitcode=1; } + else + { + int crpending=0; + int ohno=0; + int res; + char buf[4096]; + + while ((res=cpmRead(&file,buf,sizeof(buf)))>0) + { + int j; + + for (j=0; j=argc) usage(); + image=argv[optind++]; + + if (userNumber(argv[optind])>=0) /* cpm -> unix? */ /*{{{*/ + { + int i; + struct stat statbuf; + + for (i=optind; i<(argc-1); ++i) if (userNumber(argv[i])==-1) usage(); + todir=((argc-optind)>2); + if (stat(argv[argc-1],&statbuf)==-1) { if (todir) usage(); } + else if (S_ISDIR(statbuf.st_mode)) todir=1; else if (todir) usage(); + readcpm=1; + } + /*}}}*/ + else if (userNumber(argv[argc-1])>=0) /* unix -> cpm */ /*{{{*/ + { + int i; + + todir=0; + for (i=optind; i<(argc-1); ++i) if (userNumber(argv[i])>=0) usage(); + if ((argc-optind)>2 && *(strchr(argv[argc-1],':')+1)!='\0') usage(); + if (*(strchr(argv[argc-1],':')+1)=='\0') todir=1; + readcpm=0; + } + /*}}}*/ + else usage(); + /*}}}*/ + /* open image file */ /*{{{*/ + if ((err=Device_open(&super.dev,image,readcpm ? O_RDONLY : O_RDWR, devopts))) + { + fprintf(stderr,"%s: cannot open %s (%s)\n",cmd,image,err); + exit(1); + } + if (cpmReadSuper(&super,&root,format)==-1) + { + fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo); + exit(1); + } + /*}}}*/ + if (readcpm) /* copy from CP/M to UNIX */ /*{{{*/ + { + int i; + char *last=argv[argc-1]; + + cpmglob(optind,argc-1,argv,&root,&gargc,&gargv); + /* trying to copy multiple files to a file? */ + if (gargc>1 && !todir) usage(); + for (i=0; i=' ' && !((c)&~0x7f) && (c)!='<' && (c)!='>' && (c)!='.' && (c)!=',' && (c)!=';' && (c)!=':' && (c)!='=' && (c)!='?' && (c)!='*' && (c)!= '[' && (c)!=']') +#define EXTENT(low,high) (((low)&0x1f)|(((high)&0x3f)<<5)) +#define EXTENTL(extent) ((extent)&0x1f) +#define EXTENTH(extent) (((extent>>5))&0x3f) + +#endif diff --git a/Tools/unix/cpmtools/cpmfs.c b/Tools/unix/cpmtools/cpmfs.c new file mode 100644 index 00000000..eaba3ad4 --- /dev/null +++ b/Tools/unix/cpmtools/cpmfs.c @@ -0,0 +1,1920 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cpmdir.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ +/* #defines */ /*{{{*/ +#undef CPMFS_DEBUG + +/* Number of _used_ bits per int */ + +#define INTBITS ((int)(sizeof(int)*8)) + +/* Convert BCD datestamp digits to binary */ + +#define BCD2BIN(x) ((((x)>>4)&0xf)*10 + ((x)&0xf)) + +#define BIN2BCD(x) (((((x)/10)&0xf)<<4) + (((x)%10)&0xf)) + +/* There are four reserved directory entries: ., .., [passwd] and [label]. +The first two of them refer to the same inode. */ + +#define RESERVED_ENTRIES 4 + +/* CP/M does not support any kind of inodes, so they are simulated. +Inode 0-(maxdir-1) correlate to the lowest extent number (not the first +extent of the file in the directory) of a file. Inode maxdir is the +root directory, inode maxdir+1 is the optional passwd file and inode +maxdir+2 the optional disk label. */ + +#define RESERVED_INODES 3 + +#define PASSWD_RECLEN 24 +/*}}}*/ + +extern char **environ; +const char *boo; +static mode_t s_ifdir=1; +static mode_t s_ifreg=1; + +/* memcpy7 -- Copy string, leaving 8th bit alone */ /*{{{*/ +static void memcpy7(char *dest, const char *src, int count) +{ + while (count--) + { + *dest = ((*dest) & 0x80) | ((*src) & 0x7F); + ++dest; + ++src; + } +} +/*}}}*/ + +/* file name conversions */ +/* splitFilename -- split file name into name and extension */ /*{{{*/ +static int splitFilename(const char *fullname, int type, char *name, char *ext, int *user) +{ + int i,j; + + assert(fullname!=(const char*)0); + assert(name!=(char*)0); + assert(ext!=(char*)0); + assert(user!=(int*)0); + memset(name,' ',8); + memset(ext,' ',3); + if (!isdigit(fullname[0]) || !isdigit(fullname[1])) + { + boo="illegal CP/M filename"; + return -1; + } + *user=10*(fullname[0]-'0')+(fullname[1]-'0'); + fullname+=2; + if ((fullname[0]=='\0') || *user>=((type&CPMFS_HI_USER) ? 32 : 16)) + { + boo="illegal CP/M filename"; + return -1; + } + for (i=0; i<8 && fullname[i] && fullname[i]!='.'; ++i) if (!ISFILECHAR(i,fullname[i])) + { + boo="illegal CP/M filename"; + return -1; + } + else name[i]=toupper(fullname[i]); + if (fullname[i]=='.') + { + ++i; + for (j=0; j<3 && fullname[i]; ++i,++j) if (!ISFILECHAR(1,fullname[i])) + { + boo="illegal CP/M filename"; + return -1; + } + else ext[j]=toupper(fullname[i]); + if (i==1 && j==0) + { + boo="illegal CP/M filename"; + return -1; + } + } + return 0; +} +/*}}}*/ +/* isMatching -- do two file names match? */ /*{{{*/ +static int isMatching(int user1, const char *name1, const char *ext1, int user2, const char *name2, const char *ext2) +{ + int i; + + assert(name1!=(const char*)0); + assert(ext1!=(const char*)0); + assert(name2!=(const char*)0); + assert(ext2!=(const char*)0); + if (user1!=user2) return 0; + for (i=0; i<8; ++i) if ((name1[i]&0x7f)!=(name2[i]&0x7f)) return 0; + for (i=0; i<3; ++i) if ((ext1[i]&0x7f)!=(ext2[i]&0x7f)) return 0; + return 1; +} +/*}}}*/ + +/* time conversions */ +/* cpm2unix_time -- convert CP/M time to UTC */ /*{{{*/ +static time_t cpm2unix_time(int days, int hour, int min) +{ + /* CP/M stores timestamps in local time. We don't know which */ + /* timezone was used and if DST was in effect. Assuming it was */ + /* the current offset from UTC is most sensible, but not perfect. */ + + int year,days_per_year; + static int days_per_month[]={31,0,31,30,31,30,31,31,30,31,30,31}; + char **old_environ; + static char gmt0[]="TZ=GMT0"; + static char *gmt_env[]={ gmt0, (char*)0 }; + struct tm tms; + time_t lt,t; + + time(<); + t=lt; + tms=*localtime(<); + old_environ=environ; + environ=gmt_env; + lt=mktime(&tms); + lt-=t; + tms.tm_sec=0; + tms.tm_min=((min>>4)&0xf)*10+(min&0xf); + tms.tm_hour=((hour>>4)&0xf)*10+(hour&0xf); + tms.tm_mday=1; + tms.tm_mon=0; + tms.tm_year=78; + tms.tm_isdst=-1; + for (;;) + { + year=tms.tm_year+1900; + days_per_year=((year%4)==0 && ((year%100) || (year%400)==0)) ? 366 : 365; + if (days>days_per_year) + { + days-=days_per_year; + ++tms.tm_year; + } + else break; + } + for (;;) + { + days_per_month[1]=(days_per_year==366) ? 29 : 28; + if (days>days_per_month[tms.tm_mon]) + { + days-=days_per_month[tms.tm_mon]; + ++tms.tm_mon; + } + else break; + } + t=mktime(&tms)+(days-1)*24*3600; + environ=old_environ; + t-=lt; + return t; +} +/*}}}*/ +/* unix2cpm_time -- convert UTC to CP/M time */ /*{{{*/ +static void unix2cpm_time(time_t now, int *days, int *hour, int *min) +{ + struct tm *tms; + int i; + + tms=localtime(&now); + *min=((tms->tm_min/10)<<4)|(tms->tm_min%10); + *hour=((tms->tm_hour/10)<<4)|(tms->tm_hour%10); + for (i=1978,*days=0; i<1900+tms->tm_year; ++i) + { + *days+=365; + if (i%4==0 && (i%100!=0 || i%400==0)) ++*days; + } + *days += tms->tm_yday+1; +} +/*}}}*/ +/* ds2unix_time -- convert DS to Unix time */ /*{{{*/ +static time_t ds2unix_time(const struct dsEntry *entry) +{ + struct tm tms; + int yr; + + if (entry->minute==0 && + entry->hour==0 && + entry->day==0 && + entry->month==0 && + entry->year==0) return 0; + + tms.tm_isdst = -1; + tms.tm_sec = 0; + tms.tm_min = BCD2BIN( entry->minute ); + tms.tm_hour = BCD2BIN( entry->hour ); + tms.tm_mday = BCD2BIN( entry->day ); + tms.tm_mon = BCD2BIN( entry->month ) - 1; + + yr = BCD2BIN(entry->year); + if (yr<70) yr+=100; + tms.tm_year = yr; + + return mktime(&tms); +} +/*}}}*/ +/* unix2ds_time -- convert Unix to DS time */ /*{{{*/ +static void unix2ds_time(time_t now, struct dsEntry *entry) +{ + struct tm *tms; + int yr; + + if ( now==0 ) + { + entry->minute=entry->hour=entry->day=entry->month=entry->year = 0; + } + else + { + tms=localtime(&now); + entry->minute = BIN2BCD( tms->tm_min ); + entry->hour = BIN2BCD( tms->tm_hour ); + entry->day = BIN2BCD( tms->tm_mday ); + entry->month = BIN2BCD( tms->tm_mon + 1 ); + + yr = tms->tm_year; + if ( yr>100 ) yr -= 100; + entry->year = BIN2BCD( yr ); + } +} +/*}}}*/ + +/* allocation vector bitmap functions */ +/* alvInit -- init allocation vector */ /*{{{*/ +static void alvInit(const struct cpmSuperBlock *d) +{ + int i,j,offset,block; + + assert(d!=(const struct cpmSuperBlock*)0); + /* clean bitmap */ /*{{{*/ + memset(d->alv,0,d->alvSize*sizeof(int)); + /*}}}*/ + /* mark directory blocks as used */ /*{{{*/ + *d->alv=(1<<((d->maxdir*32+d->blksiz-1)/d->blksiz))-1; + /*}}}*/ + for (i=0; imaxdir; ++i) /* mark file blocks as used */ /*{{{*/ + { + if (d->dir[i].status>=0 && d->dir[i].status<=(d->type&CPMFS_HI_USER ? 31 : 15)) + { +#ifdef CPMFS_DEBUG + fprintf(stderr,"alvInit: allocate extent %d\n",i); +#endif + for (j=0; j<16; ++j) + { + block=(unsigned char)d->dir[i].pointers[j]; + if (d->size>=256) block+=(((unsigned char)d->dir[i].pointers[++j])<<8); + if (block && blocksize) + { +#ifdef CPMFS_DEBUG + fprintf(stderr,"alvInit: allocate block %d\n",block); +#endif + offset=block/INTBITS; + d->alv[offset]|=(1<alvSize; ++i) + { + for (j=0,bits=drive->alv[i]; j=drive->size) + { + boo="device full"; + return -1; + } + drive->alv[i] |= (1<>= 1; + } + } + boo="device full"; + return -1; +} +/*}}}*/ + +/* logical block I/O */ +/* readBlock -- read a (partial) block */ /*{{{*/ +static int readBlock(const struct cpmSuperBlock *d, int blockno, char *buffer, int start, int end) +{ + int sect, track, counter; + + assert(d); + assert(blockno>=0); + assert(buffer); + if (blockno>=d->size) + { + boo="Attempting to access block beyond end of disk"; + return -1; + } + if (end<0) end=d->blksiz/d->secLength-1; + sect=(blockno*(d->blksiz/d->secLength)+ d->sectrk*d->boottrk)%d->sectrk; + track=(blockno*(d->blksiz/d->secLength)+ d->sectrk*d->boottrk)/d->sectrk; + for (counter=0; counter<=end; ++counter) + { + const char *err; + + assert(d->skewtab[sect]>=0); + assert(d->skewtab[sect]sectrk); + if (counter>=start && (err=Device_readSector(&d->dev,track,d->skewtab[sect],buffer+(d->secLength*counter)))) + { + boo=err; + return -1; + } + ++sect; + if (sect>=d->sectrk) + { + sect = 0; + ++track; + } + } + return 0; +} +/*}}}*/ +/* writeBlock -- write a (partial) block */ /*{{{*/ +static int writeBlock(const struct cpmSuperBlock *d, int blockno, const char *buffer, int start, int end) +{ + int sect, track, counter; + + assert(blockno>=0); + assert(blocknosize); + assert(buffer!=(const char*)0); + if (end < 0) end=d->blksiz/d->secLength-1; + sect = (blockno*(d->blksiz/d->secLength))%d->sectrk; + track = (blockno*(d->blksiz/d->secLength))/d->sectrk+d->boottrk; + for (counter = 0; counter<=end; ++counter) + { + const char *err; + + if (counter>=start && (err=Device_writeSector(&d->dev,track,d->skewtab[sect],buffer+(d->secLength*counter)))) + { + boo=err; + return -1; + } + ++sect; + if (sect>=d->sectrk) + { + sect=0; + ++track; + } + } + return 0; +} +/*}}}*/ + +/* directory management */ +/* findFileExtent -- find first/next extent for a file */ /*{{{*/ +static int findFileExtent(const struct cpmSuperBlock *sb, int user, const char *name, const char *ext, int start, int extno) +{ + boo="file already exists"; + for (; startmaxdir; ++start) + { + if + ( + ((unsigned char)sb->dir[start].status)<=(sb->type&CPMFS_HI_USER ? 31 : 15) + && (extno==-1 || (EXTENT(sb->dir[start].extnol,sb->dir[start].extnoh)/sb->extents)==(extno/sb->extents)) + && isMatching(user,name,ext,sb->dir[start].status,sb->dir[start].name,sb->dir[start].ext) + ) return start; + } + boo="file not found"; + return -1; +} +/*}}}*/ +/* findFreeExtent -- find first free extent */ /*{{{*/ +static int findFreeExtent(const struct cpmSuperBlock *drive) +{ + int i; + + for (i=0; imaxdir; ++i) if (drive->dir[i].status==(char)0xe5) return (i); + boo="directory full"; + return -1; +} +/*}}}*/ +/* updateTimeStamps -- convert time stamps to CP/M format */ /*{{{*/ +static void updateTimeStamps(const struct cpmInode *ino, int extent) +{ + struct PhysDirectoryEntry *date; + int i; + int ca_min,ca_hour,ca_days,u_min,u_hour,u_days; + + if (!S_ISREG(ino->mode)) return; +#ifdef CPMFS_DEBUG + fprintf(stderr,"CPMFS: updating time stamps for inode %d (%d)\n",extent,extent&3); +#endif + unix2cpm_time(ino->sb->cnotatime ? ino->ctime : ino->atime,&ca_days,&ca_hour,&ca_min); + unix2cpm_time(ino->mtime,&u_days,&u_hour,&u_min); + if ((ino->sb->type&CPMFS_CPM3_DATES) && (date=ino->sb->dir+(extent|3))->status==0x21) + { + ino->sb->dirtyDirectory=1; + switch (extent&3) + { + case 0: /* first entry */ /*{{{*/ + { + date->name[0]=ca_days&0xff; date->name[1]=ca_days>>8; + date->name[2]=ca_hour; + date->name[3]=ca_min; + date->name[4]=u_days&0xff; date->name[5]=u_days>>8; + date->name[6]=u_hour; + date->name[7]=u_min; + break; + } + /*}}}*/ + case 1: /* second entry */ /*{{{*/ + { + date->ext[2]=ca_days&0xff; date->extnol=ca_days>>8; + date->lrc=ca_hour; + date->extnoh=ca_min; + date->blkcnt=u_days&0xff; date->pointers[0]=u_days>>8; + date->pointers[1]=u_hour; + date->pointers[2]=u_min; + break; + } + /*}}}*/ + case 2: /* third entry */ /*{{{*/ + { + date->pointers[5]=ca_days&0xff; date->pointers[6]=ca_days>>8; + date->pointers[7]=ca_hour; + date->pointers[8]=ca_min; + date->pointers[9]=u_days&0xff; date->pointers[10]=u_days>>8; + date->pointers[11]=u_hour; + date->pointers[12]=u_min; + break; + } + /*}}}*/ + } + } +} +/*}}}*/ +/* updateDsStamps -- set time in datestamper file */ /*{{{*/ +static void updateDsStamps(const struct cpmInode *ino, int extent) +{ + int yr; + struct tm *cpm_time; + struct dsDate *stamp; + + if (!S_ISREG(ino->mode)) return; + if ( !(ino->sb->type&CPMFS_DS_DATES) ) return; + +#ifdef CPMFS_DEBUG + fprintf(stderr,"CPMFS: updating ds stamps for inode %d (%d)\n",extent,extent&3); +#endif + + /* Get datestamp struct */ + stamp = ino->sb->ds+extent; + + unix2ds_time( ino->mtime, &stamp->modify ); + unix2ds_time( ino->ctime, &stamp->create ); + unix2ds_time( ino->atime, &stamp->access ); + + ino->sb->dirtyDs = 1; +} +/*}}}*/ +/* readTimeStamps -- read CP/M time stamp */ /*{{{*/ +static int readTimeStamps(struct cpmInode *i, int lowestExt) +{ + /* variables */ /*{{{*/ + struct PhysDirectoryEntry *date; + int u_days=0,u_hour=0,u_min=0; + int ca_days=0,ca_hour=0,ca_min=0; + int protectMode=0; + /*}}}*/ + + if ( (i->sb->type&CPMFS_CPM3_DATES) && (date=i->sb->dir+(lowestExt|3))->status==0x21 ) + { + switch (lowestExt&3) + { + case 0: /* first entry of the four */ /*{{{*/ + { + ca_days=((unsigned char)date->name[0])+(((unsigned char)date->name[1])<<8); + ca_hour=(unsigned char)date->name[2]; + ca_min=(unsigned char)date->name[3]; + u_days=((unsigned char)date->name[4])+(((unsigned char)date->name[5])<<8); + u_hour=(unsigned char)date->name[6]; + u_min=(unsigned char)date->name[7]; + protectMode=(unsigned char)date->ext[0]; + break; + } + /*}}}*/ + case 1: /* second entry */ /*{{{*/ + { + ca_days=((unsigned char)date->ext[2])+(((unsigned char)date->extnol)<<8); + ca_hour=(unsigned char)date->lrc; + ca_min=(unsigned char)date->extnoh; + u_days=((unsigned char)date->blkcnt)+(((unsigned char)date->pointers[0])<<8); + u_hour=(unsigned char)date->pointers[1]; + u_min=(unsigned char)date->pointers[2]; + protectMode=(unsigned char)date->pointers[3]; + break; + } + /*}}}*/ + case 2: /* third one */ /*{{{*/ + { + ca_days=((unsigned char)date->pointers[5])+(((unsigned char)date->pointers[6])<<8); + ca_hour=(unsigned char)date->pointers[7]; + ca_min=(unsigned char)date->pointers[8]; + u_days=((unsigned char)date->pointers[9])+(((unsigned char)date->pointers[10])<<8); + u_hour=(unsigned char)date->pointers[11]; + u_min=(unsigned char)date->pointers[12]; + protectMode=(unsigned char)date->pointers[13]; + break; + } + /*}}}*/ + } + if (i->sb->cnotatime) + { + i->ctime=cpm2unix_time(ca_days,ca_hour,ca_min); + i->atime=0; + } + else + { + i->ctime=0; + i->atime=cpm2unix_time(ca_days,ca_hour,ca_min); + } + i->mtime=cpm2unix_time(u_days,u_hour,u_min); + } + else + { + i->atime=i->mtime=i->ctime=0; + protectMode=0; + } + + return protectMode; +} +/*}}}*/ +/* readDsStamps -- read datestamper time stamp */ /*{{{*/ +static void readDsStamps(struct cpmInode *i, int lowestExt) +{ + struct dsDate *stamp; + + if ( !(i->sb->type&CPMFS_DS_DATES) ) return; + + /* Get datestamp */ + stamp = i->sb->ds+lowestExt; + + i->mtime = ds2unix_time(&stamp->modify); + i->ctime = ds2unix_time(&stamp->create); + i->atime = ds2unix_time(&stamp->access); +} +/*}}}*/ + +/* match -- match filename against a pattern */ /*{{{*/ +static int recmatch(const char *a, const char *pattern) +{ + int first=1; + + assert(a); + assert(pattern); + while (*pattern) + { + switch (*pattern) + { + case '*': + { + if (*a=='.' && first) return 1; + ++pattern; + while (*a) if (recmatch(a,pattern)) return 1; else ++a; + break; + } + case '?': + { + if (*a) { ++a; ++pattern; } else return 0; + break; + } + default: if (tolower(*a)==tolower(*pattern)) { ++a; ++pattern; } else return 0; + } + first=0; + } + return (*pattern=='\0' && *a=='\0'); +} + +int match(const char *a, const char *pattern) +{ + int user; + char pat[255]; + + assert(a); + assert(pattern); + assert(strlen(pattern)<255); + if (isdigit(*pattern) && *(pattern+1)==':') { user=(*pattern-'0'); pattern+=2; } + else if (isdigit(*pattern) && isdigit(*(pattern+1)) && *(pattern+2)==':') { user=(10*(*pattern-'0')+(*(pattern+1)-'0')); pattern+=3; } + else user=-1; + if (user==-1) sprintf(pat,"??%s",pattern); + else sprintf(pat,"%02d%s",user,pattern); + return recmatch(a,pat); +} + +/*}}}*/ +/* cpmglob -- expand CP/M style wildcards */ /*{{{*/ +void cpmglob(int optin, int argc, char * const argv[], struct cpmInode *root, int *gargc, char ***gargv) +{ + struct cpmFile dir; + int entries,dirsize=0; + struct cpmDirent *dirent=(struct cpmDirent*)0; + int gargcap=0,i,j; + + *gargv=(char**)0; + *gargc=0; + cpmOpendir(root,&dir); + entries=0; + dirsize=8; + dirent=malloc(sizeof(struct cpmDirent)*dirsize); + while (cpmReaddir(&dir,&dirent[entries])) + { + ++entries; + if (entries==dirsize) dirent=realloc(dirent,sizeof(struct cpmDirent)*(dirsize*=2)); + } + for (i=optin; ilibdskGeometry[0] = '\0'; + d->type=0; + if ( + (fp=fopen("diskdefs","r"))==(FILE*)0 && + (ddenv && ((fp=fopen(DISKDEFS,"r"))==(FILE*)0)) && + (fp=fopen(DISKDEFS,"r"))==(FILE*)0) + { + fprintf(stderr,"%s: Neither `diskdefs' nor `" DISKDEFS "' could be opened.\n",cmd); + exit(1); + } + while (fgets(line,sizeof(line),fp)!=(char*)0) + { + int argc; + char *argv[2]; + char *s; + + /* Allow inline comments preceded by ; or # */ + s = strchr(line, '#'); + if (s) strcpy(s, "\n"); + s = strchr(line, ';'); + if (s) strcpy(s, "\n"); + + for (argc=0; argc<1 && (argv[argc]=strtok(argc ? (char*)0 : line," \t\n")); ++argc); + if ((argv[argc]=strtok((char*)0,"\n"))!=(char*)0) ++argc; + if (insideDef) + { + if (argc==1 && strcmp(argv[0],"end")==0) + { + insideDef=0; + d->size=(d->secLength*d->sectrk*(d->tracks-d->boottrk))/d->blksiz; + if (d->extents==0) d->extents=((d->size>=256 ? 8 : 16)*d->blksiz)/16384; + if (d->extents==0) d->extents=1; + if (found) break; + } + else if (argc==2) + { + if (strcmp(argv[0],"seclen")==0) d->secLength=strtol(argv[1],(char**)0,0); + else if (strcmp(argv[0],"tracks")==0) d->tracks=strtol(argv[1],(char**)0,0); + else if (strcmp(argv[0],"sectrk")==0) d->sectrk=strtol(argv[1],(char**)0,0); + else if (strcmp(argv[0],"blocksize")==0) d->blksiz=strtol(argv[1],(char**)0,0); + else if (strcmp(argv[0],"maxdir")==0) d->maxdir=strtol(argv[1],(char**)0,0); + else if (strcmp(argv[0],"skew")==0) d->skew=strtol(argv[1],(char**)0,0); + else if (strcmp(argv[0],"skewtab")==0) + { + int pass,sectors; + + for (pass=0; pass<2; ++pass) + { + sectors=0; + for (s=argv[1]; *s; ) + { + int phys; + char *end; + + phys=strtol(s,&end,10); + if (pass==1) d->skewtab[sectors]=phys; + if (end==s) + { + fprintf(stderr,"%s: invalid skewtab `%s' at `%s'\n",cmd,argv[1],s); + exit(1); + } + s=end; + ++sectors; + if (*s==',') ++s; + } + if (pass==0) d->skewtab=malloc(sizeof(int)*sectors); + } + } + else if (strcmp(argv[0],"boottrk")==0) d->boottrk=strtol(argv[1],(char**)0,0); + else if (strcmp(argv[0],"offset")==0) + { + off_t val; + unsigned int multiplier; + char *endptr; + + errno=0; + multiplier=1; + val = strtol(argv[1],&endptr,10); + if ((errno==ERANGE && val==LONG_MAX)||(errno!=0 && val<=0)) + { + fprintf(stderr,"%s: invalid offset value \"%s\" - %s\n",cmd,argv[1],strerror(errno)); + exit(1); + } + if (endptr==argv[1]) + { + fprintf(stderr,"%s: offset value \"%s\" is not a number\n",cmd,argv[1]); + exit(1); + } + if (*endptr!='\0') + { + /* Have a unit specifier */ + switch (toupper(*endptr)) + { + case 'K': + multiplier=1024; + break; + case 'M': + multiplier=1024*1024; + break; + case 'T': + if (d->sectrk<0||d->tracks<0||d->secLength<0) + { + fprintf(stderr,"%s: offset must be specified after sectrk, tracks and secLength\n",cmd); + exit(1); + } + multiplier=d->sectrk*d->secLength; + break; + case 'S': + if (d->sectrk<0||d->tracks<0||d->secLength<0) + { + fprintf(stderr,"%s: offset must be specified after sectrk, tracks and secLength\n",cmd); + exit(1); + } + multiplier=d->secLength; + break; + default: + fprintf(stderr,"%s: unknown unit specifier \"%c\"\n",cmd,*endptr); + exit(1); + } + } + if (val*multiplier>INT_MAX) + { + fprintf(stderr,"%s: effective offset is out of range\n",cmd); + exit(1); + } + d->offset=val*multiplier; + } + else if (strcmp(argv[0],"logicalextents")==0) d->extents=strtol(argv[1],(char**)0,0); + else if (strcmp(argv[0],"os")==0) + { + if (strcmp(argv[1],"2.2" )==0) d->type|=CPMFS_DR22; + else if (strcmp(argv[1],"3" )==0) d->type|=CPMFS_DR3; + else if (strcmp(argv[1],"isx" )==0) d->type|=CPMFS_ISX; + else if (strcmp(argv[1],"p2dos")==0) d->type|=CPMFS_P2DOS; + else if (strcmp(argv[1],"zsys" )==0) d->type|=CPMFS_ZSYS; + else + { + fprintf(stderr, "%s: invalid OS type `%s'\n", cmd, argv[1]); + exit(1); + } + } + else if (strcmp(argv[0], "libdsk:format")==0) + { + strncpy(d->libdskGeometry, argv[1], sizeof(d->libdskGeometry) - 1); + d->libdskGeometry[sizeof(d->libdskGeometry) - 1] = 0; + } + } + else if (argc>0 && argv[0][0]!='#' && argv[0][0]!=';') + { + fprintf(stderr,"%s: invalid keyword `%s'\n",cmd,argv[0]); + exit(1); + } + } + else if (argc==2 && strcmp(argv[0],"diskdef")==0) + { + insideDef=1; + d->skew=1; + d->extents=0; + d->type=CPMFS_DR22; + d->skewtab=(int*)0; + d->offset=0; + d->boottrk=d->secLength=d->sectrk=d->tracks=-1; + d->libdskGeometry[0] = 0; + if (strcmp(argv[1],format)==0) found=1; + } + } + fclose(fp); + if (!found) + { + fprintf(stderr,"%s: unknown format %s\n",cmd,format); + exit(1); + } + if (d->boottrk<0) + { + fprintf(stderr, "%s: boottrk parameter invalid or missing from diskdef\n",cmd); + exit(1); + } + if (d->secLength<0) + { + fprintf(stderr, "%s: secLength parameter invalid or missing from diskdef\n",cmd); + exit(1); + } + if (d->sectrk<0) + { + fprintf(stderr, "%s: sectrk parameter invalid or missing from diskdef\n",cmd); + exit(1); + } + if (d->tracks<0) + { + fprintf(stderr, "%s: tracks parameter invalid or missing from diskdef\n",cmd); + exit(1); + } + return 0; +} +/*}}}*/ +/* amsReadSuper -- read super block from amstrad disk */ /*{{{*/ +static int amsReadSuper(struct cpmSuperBlock *d, const char *format) +{ + unsigned char boot_sector[512], *boot_spec; + const char *err; + + Device_setGeometry(&d->dev,512,9,40,0,"pcw180"); + if ((err=Device_readSector(&d->dev, 0, 0, (char *)boot_sector))) + { + fprintf(stderr,"%s: Failed to read Amstrad superblock (%s)\n",cmd,err); + exit(1); + } + boot_spec=(boot_sector[0] == 0 || boot_sector[0] == 3)?boot_sector:(unsigned char*)0; + /* Check for JCE's extension to allow Amstrad and MSDOS superblocks + * in the same sector (for the PCW16) + */ + if + ( + (boot_sector[0] == 0xE9 || boot_sector[0] == 0xEB) + && !memcmp(boot_sector + 0x2B, "CP/M", 4) + && !memcmp(boot_sector + 0x33, "DSK", 3) + && !memcmp(boot_sector + 0x7C, "CP/M", 4) + ) boot_spec = boot_sector + 128; + if (boot_spec==(unsigned char*)0) + { + fprintf(stderr,"%s: Amstrad superblock not present\n",cmd); + exit(1); + } + /* boot_spec[0] = format number: 0 for SS SD, 3 for DS DD + [1] = single/double sided and density flags + [2] = cylinders per side + [3] = sectors per cylinder + [4] = Physical sector shift, 2 => 512 + [5] = Reserved track count + [6] = Block shift + [7] = No. of directory blocks + */ + d->type = 0; + d->type |= CPMFS_DR3; /* Amstrads are CP/M 3 systems */ + d->secLength = 128 << boot_spec[4]; + d->tracks = boot_spec[2]; + if (boot_spec[1] & 3) d->tracks *= 2; + d->sectrk = boot_spec[3]; + d->blksiz = 128 << boot_spec[6]; + d->maxdir = (d->blksiz / 32) * boot_spec[7]; + d->skew = 1; /* Amstrads skew at the controller level */ + d->skewtab = (int*)0; + d->boottrk = boot_spec[5]; + d->offset = 0; + d->size = (d->secLength*d->sectrk*(d->tracks-d->boottrk))/d->blksiz; + d->extents = ((d->size>=256 ? 8 : 16)*d->blksiz)/16384; + d->libdskGeometry[0] = 0; /* LibDsk can recognise an Amstrad superblock + * and autodect */ + + return 0; +} +/*}}}*/ +/* cpmCheckDs -- read all datestamper timestamps */ /*{{{*/ +int cpmCheckDs(struct cpmSuperBlock *sb) +{ + int dsoffset, dsblks, dsrecs, off, i; + unsigned char *buf; + + if (!isMatching(0,"!!!TIME&","DAT",sb->dir->status,sb->dir->name,sb->dir->ext)) return -1; + + /* Offset to ds file in alloc blocks */ + dsoffset=(sb->maxdir*32+(sb->blksiz-1))/sb->blksiz; + + dsrecs=(sb->maxdir+7)/8; + dsblks=(dsrecs*128+(sb->blksiz-1))/sb->blksiz; + + /* Allocate buffer */ + sb->ds=malloc(dsblks*sb->blksiz); + + /* Read ds file in its entirety */ + off=0; + for (i=dsoffset; ids)+off,0,-1)==-1) return -1; + off+=sb->blksiz; + } + + /* Verify checksums */ + buf = (unsigned char *)sb->ds; + for (i=0; ids); + sb->ds = (struct dsDate *)0; + return -1; + } + buf += 128; + } + return 0; +} +/*}}}*/ +/* cpmReadSuper -- get DPB and init in-core data for drive */ /*{{{*/ +int cpmReadSuper(struct cpmSuperBlock *d, struct cpmInode *root, const char *format) +{ + while (s_ifdir && !S_ISDIR(s_ifdir)) s_ifdir<<=1; + assert(s_ifdir); + while (s_ifreg && !S_ISREG(s_ifreg)) s_ifreg<<=1; + assert(s_ifreg); + if (strcmp(format,"amstrad")==0) amsReadSuper(d,format); + else diskdefReadSuper(d,format); + boo = Device_setGeometry(&d->dev,d->secLength,d->sectrk,d->tracks,d->offset,d->libdskGeometry); + if (boo) return -1; + + if (d->skewtab==(int*)0) /* generate skew table */ /*{{{*/ + { + int i,j,k; + + if (( d->skewtab = malloc(d->sectrk*sizeof(int))) == (int*)0) + { + boo=strerror(errno); + return -1; + } + memset(d->skewtab,0,d->sectrk*sizeof(int)); + for (i=j=0; isectrk; ++i,j=(j+d->skew)%d->sectrk) + { + while (1) + { + assert(isectrk); + assert(jsectrk); + for (k=0; kskewtab[k]!=j; ++k); + if (ksectrk; + else break; + } + d->skewtab[i]=j; + } + } + /*}}}*/ + /* initialise allocation vector bitmap */ /*{{{*/ + { + d->alvSize=((d->secLength*d->sectrk*(d->tracks-d->boottrk))/d->blksiz+INTBITS-1)/INTBITS; + if ((d->alv=malloc(d->alvSize*sizeof(int)))==(int*)0) + { + boo=strerror(errno); + return -1; + } + } + /*}}}*/ + /* allocate directory buffer */ /*{{{*/ + assert(sizeof(struct PhysDirectoryEntry)==32); + if ((d->dir=malloc(((d->maxdir*32+d->blksiz-1)/d->blksiz)*d->blksiz))==(struct PhysDirectoryEntry*)0) + { + boo=strerror(errno); + return -1; + } + /*}}}*/ + if (d->dev.opened==0) /* create empty directory in core */ /*{{{*/ + { + memset(d->dir,0xe5,d->maxdir*32); + } + /*}}}*/ + else /* read directory in core */ /*{{{*/ + { + int i,blocks,entry; + + blocks=(d->maxdir*32+d->blksiz-1)/d->blksiz; + entry=0; + for (i=0; idir+entry),0,-1)==-1) return -1; + entry+=(d->blksiz/32); + } + } + /*}}}*/ + alvInit(d); + if (d->type&CPMFS_CPM3_OTHER) /* read additional superblock information */ /*{{{*/ + { + int i; + + /* passwords */ /*{{{*/ + { + int passwords=0; + + for (i=0; imaxdir; ++i) if (d->dir[i].status>=16 && d->dir[i].status<=31) ++passwords; +#ifdef CPMFS_DEBUG + fprintf(stderr,"getformat: found %d passwords\n",passwords); +#endif + if ((d->passwdLength=passwords*PASSWD_RECLEN)) + { + if ((d->passwd=malloc(d->passwdLength))==(char*)0) + { + boo="out of memory"; + return -1; + } + for (i=0,passwords=0; imaxdir; ++i) if (d->dir[i].status>=16 && d->dir[i].status<=31) + { + int j,pb; + char *p=d->passwd+(passwords++*PASSWD_RECLEN); + + p[0]='0'+(d->dir[i].status-16)/10; + p[1]='0'+(d->dir[i].status-16)%10; + for (j=0; j<8; ++j) p[2+j]=d->dir[i].name[j]&0x7f; + p[10]=(d->dir[i].ext[0]&0x7f)==' ' ? ' ' : '.'; + for (j=0; j<3; ++j) p[11+j]=d->dir[i].ext[j]&0x7f; + p[14]=' '; + pb=(unsigned char)d->dir[i].lrc; + for (j=0; j<8; ++j) p[15+j]=((unsigned char)d->dir[i].pointers[7-j])^pb; +#ifdef CPMFS_DEBUG + p[23]='\0'; + fprintf(stderr,"getformat: %s\n",p); +#endif + p[23]='\n'; + } + } + } + /*}}}*/ + /* disc label */ /*{{{*/ + for (i=0; imaxdir; ++i) if (d->dir[i].status==(char)0x20) + { + int j; + + d->cnotatime=d->dir[i].extnol&0x10; + if (d->dir[i].extnol&0x1) + { + d->labelLength=12; + if ((d->label=malloc(d->labelLength))==(char*)0) + { + boo="out of memory"; + return -1; + } + for (j=0; j<8; ++j) d->label[j]=d->dir[i].name[j]&0x7f; + for (j=0; j<3; ++j) d->label[8+j]=d->dir[i].ext[j]&0x7f; + d->label[11]='\n'; + } + else + { + d->labelLength=0; + } + break; + } + if (i==d->maxdir) + { + d->cnotatime=1; + d->labelLength=0; + } + /*}}}*/ + } + /*}}}*/ + else + { + d->passwdLength=0; + d->cnotatime=1; + d->labelLength=0; + } + d->root=root; + d->dirtyDirectory = 0; + root->ino=d->maxdir; + root->sb=d; + root->mode=(s_ifdir|0777); + root->size=0; + root->atime=root->mtime=root->ctime=0; + + d->dirtyDs=0; + if (cpmCheckDs(d)==0) d->type|=CPMFS_DS_DATES; + else d->ds=(struct dsDate*)0; + + return 0; +} +/*}}}*/ +/* syncDs -- write all datestamper timestamps */ /*{{{*/ +static int syncDs(const struct cpmSuperBlock *sb) +{ + if (sb->dirtyDs) + { + int dsoffset, dsblks, dsrecs, off, i; + unsigned char *buf; + + dsrecs=(sb->maxdir+7)/8; + + /* Re-calculate checksums */ + buf = (unsigned char *)sb->ds; + for ( i=0; imaxdir*32+(sb->blksiz-1))/sb->blksiz; + dsblks=(dsrecs*128+(sb->blksiz-1))/sb->blksiz; + + off=0; + for (i=dsoffset; ids))+off,0,-1)==-1) return -1; + off+=sb->blksiz; + } + } + return 0; +} +/*}}}*/ +/* cpmSync -- write directory back */ /*{{{*/ +int cpmSync(struct cpmSuperBlock *sb) +{ + if (sb->dirtyDirectory) + { + int i,blocks,entry; + + blocks=(sb->maxdir*32+sb->blksiz-1)/sb->blksiz; + entry=0; + for (i=0; idir+entry),0,-1)==-1) return -1; + entry+=(sb->blksiz/32); + } + sb->dirtyDirectory=0; + } + if (sb->type&CPMFS_DS_DATES) syncDs(sb); + return 0; +} +/*}}}*/ +/* cpmUmount -- free super block */ /*{{{*/ +void cpmUmount(struct cpmSuperBlock *sb) +{ + cpmSync(sb); + if (sb->type&CPMFS_DS_DATES) free(sb->ds); + free(sb->alv); + free(sb->skewtab); + free(sb->dir); + if (sb->passwdLength) free(sb->passwd); +} +/*}}}*/ + +/* cpmNamei -- map name to inode */ /*{{{*/ +int cpmNamei(const struct cpmInode *dir, const char *filename, struct cpmInode *i) +{ + /* variables */ /*{{{*/ + int user; + char name[8],extension[3]; + int highestExtno,highestExt=-1,lowestExtno,lowestExt=-1; + int protectMode=0; + /*}}}*/ + + if (!S_ISDIR(dir->mode)) + { + boo="No such file"; + return -1; + } + if (strcmp(filename,".")==0 || strcmp(filename,"..")==0) /* root directory */ /*{{{*/ + { + *i=*dir; + return 0; + } + /*}}}*/ + else if (strcmp(filename,"[passwd]")==0 && dir->sb->passwdLength) /* access passwords */ /*{{{*/ + { + i->attr=0; + i->ino=dir->sb->maxdir+1; + i->mode=s_ifreg|0444; + i->sb=dir->sb; + i->atime=i->mtime=i->ctime=0; + i->size=i->sb->passwdLength; + return 0; + } + /*}}}*/ + else if (strcmp(filename,"[label]")==0 && dir->sb->labelLength) /* access label */ /*{{{*/ + { + i->attr=0; + i->ino=dir->sb->maxdir+2; + i->mode=s_ifreg|0444; + i->sb=dir->sb; + i->atime=i->mtime=i->ctime=0; + i->size=i->sb->labelLength; + return 0; + } + /*}}}*/ + if (splitFilename(filename,dir->sb->type,name,extension,&user)==-1) return -1; + /* find highest and lowest extent */ /*{{{*/ + { + int extent; + + i->size=0; + extent=-1; + highestExtno=-1; + lowestExtno=2049; + while ((extent=findFileExtent(dir->sb,user,name,extension,extent+1,-1))!=-1) + { + int extno=EXTENT(dir->sb->dir[extent].extnol,dir->sb->dir[extent].extnoh); + + if (extno>highestExtno) + { + highestExtno=extno; + highestExt=extent; + } + if (extnosize=highestExtno*16384; + if (dir->sb->size<256) for (block=15; block>=0; --block) + { + if (dir->sb->dir[highestExt].pointers[block]) break; + } + else for (block=7; block>=0; --block) + { + if (dir->sb->dir[highestExt].pointers[2*block] || dir->sb->dir[highestExt].pointers[2*block+1]) break; + } + if (dir->sb->dir[highestExt].blkcnt) i->size+=((dir->sb->dir[highestExt].blkcnt&0xff)-1)*128; + if (dir->sb->type & CPMFS_ISX) + { + i->size += (128 - dir->sb->dir[highestExt].lrc); + } + else + { + i->size+=dir->sb->dir[highestExt].lrc ? (dir->sb->dir[highestExt].lrc&0xff) : 128; + } +#ifdef CPMFS_DEBUG + fprintf(stderr,"cpmNamei: size=%ld\n",(long)i->size); +#endif + } + /*}}}*/ + i->ino=lowestExt; + i->mode=s_ifreg; + i->sb=dir->sb; + + /* read timestamps */ /*{{{*/ + protectMode = readTimeStamps(i,lowestExt); + /*}}}*/ + + /* Determine the inode attributes */ + i->attr = 0; + if (dir->sb->dir[lowestExt].name[0]&0x80) i->attr |= CPM_ATTR_F1; + if (dir->sb->dir[lowestExt].name[1]&0x80) i->attr |= CPM_ATTR_F2; + if (dir->sb->dir[lowestExt].name[2]&0x80) i->attr |= CPM_ATTR_F3; + if (dir->sb->dir[lowestExt].name[3]&0x80) i->attr |= CPM_ATTR_F4; + if (dir->sb->dir[lowestExt].ext [0]&0x80) i->attr |= CPM_ATTR_RO; + if (dir->sb->dir[lowestExt].ext [1]&0x80) i->attr |= CPM_ATTR_SYS; + if (dir->sb->dir[lowestExt].ext [2]&0x80) i->attr |= CPM_ATTR_ARCV; + if (protectMode&0x20) i->attr |= CPM_ATTR_PWDEL; + if (protectMode&0x40) i->attr |= CPM_ATTR_PWWRITE; + if (protectMode&0x80) i->attr |= CPM_ATTR_PWREAD; + + if (dir->sb->dir[lowestExt].ext[1]&0x80) i->mode|=01000; + i->mode|=0444; + if (!(dir->sb->dir[lowestExt].ext[0]&0x80)) i->mode|=0222; + if (extension[0]=='C' && extension[1]=='O' && extension[2]=='M') i->mode|=0111; + + readDsStamps(i,lowestExt); + + return 0; +} +/*}}}*/ +/* cpmStatFS -- statfs */ /*{{{*/ +void cpmStatFS(const struct cpmInode *ino, struct cpmStatFS *buf) +{ + int i; + struct cpmSuperBlock *d; + + d=ino->sb; + buf->f_bsize=d->blksiz; + buf->f_blocks=d->size; + buf->f_bfree=0; + buf->f_bused=-(d->maxdir*32+d->blksiz-1)/d->blksiz; + for (i=0; ialvSize; ++i) + { + int temp,j; + + temp = *(d->alv+i); + for (j=0; jsize) + { + if (1&temp) + { +#ifdef CPMFS_DEBUG + fprintf(stderr,"cpmStatFS: block %d allocated\n",(i*INTBITS+j)); +#endif + ++buf->f_bused; + } + else ++buf->f_bfree; + } + temp >>= 1; + } + } + buf->f_bavail=buf->f_bfree; + buf->f_files=d->maxdir; + buf->f_ffree=0; + for (i=0; imaxdir; ++i) + { + if (d->dir[i].status==(char)0xe5) ++buf->f_ffree; + } + buf->f_namelen=11; +} +/*}}}*/ +/* cpmUnlink -- unlink */ /*{{{*/ +int cpmUnlink(const struct cpmInode *dir, const char *fname) +{ + int user; + char name[8],extension[3]; + int extent; + struct cpmSuperBlock *drive; + + if (!S_ISDIR(dir->mode)) + { + boo="No such file"; + return -1; + } + drive=dir->sb; + if (splitFilename(fname,dir->sb->type,name,extension,&user)==-1) return -1; + if ((extent=findFileExtent(drive,user,name,extension,0,-1))==-1) return -1; + drive->dirtyDirectory=1; + drive->dir[extent].status=(char)0xe5; + do + { + drive->dir[extent].status=(char)0xe5; + } while ((extent=findFileExtent(drive,user,name,extension,extent+1,-1))>=0); + alvInit(drive); + return 0; +} +/*}}}*/ +/* cpmRename -- rename */ /*{{{*/ +int cpmRename(const struct cpmInode *dir, const char *old, const char *new) +{ + struct cpmSuperBlock *drive; + int extent; + int olduser; + char oldname[8], oldext[3]; + int newuser; + char newname[8], newext[3]; + + if (!S_ISDIR(dir->mode)) + { + boo="No such file"; + return -1; + } + drive=dir->sb; + if (splitFilename(old,dir->sb->type, oldname, oldext,&olduser)==-1) return -1; + if (splitFilename(new,dir->sb->type, newname, newext,&newuser)==-1) return -1; + if ((extent=findFileExtent(drive,olduser,oldname,oldext,0,-1))==-1) return -1; + if (findFileExtent(drive,newuser,newname, newext,0,-1)!=-1) + { + boo="file already exists"; + return -1; + } + do + { + drive->dirtyDirectory=1; + drive->dir[extent].status=newuser; + memcpy7(drive->dir[extent].name, newname, 8); + memcpy7(drive->dir[extent].ext, newext, 3); + } while ((extent=findFileExtent(drive,olduser,oldname,oldext,extent+1,-1))!=-1); + return 0; +} +/*}}}*/ +/* cpmOpendir -- opendir */ /*{{{*/ +int cpmOpendir(struct cpmInode *dir, struct cpmFile *dirp) +{ + if (!S_ISDIR(dir->mode)) + { + boo="No such file"; + return -1; + } + dirp->ino=dir; + dirp->pos=0; + dirp->mode=O_RDONLY; + return 0; +} +/*}}}*/ +/* cpmReaddir -- readdir */ /*{{{*/ +int cpmReaddir(struct cpmFile *dir, struct cpmDirent *ent) +{ + /* variables */ /*{{{*/ + struct PhysDirectoryEntry *cur=(struct PhysDirectoryEntry*)0; + char buf[2+8+1+3+1]; /* 00foobarxy.zzy\0 */ + char *bufp; + int hasext; + /*}}}*/ + + if (!(S_ISDIR(dir->ino->mode))) /* error: not a directory */ /*{{{*/ + { + boo="not a directory"; + return -1; + } + /*}}}*/ + while (1) + { + int i; + + if (dir->pos==0) /* first entry is . */ /*{{{*/ + { + ent->ino=dir->ino->sb->maxdir; + ent->reclen=1; + strcpy(ent->name,"."); + ent->off=dir->pos; + ++dir->pos; + return 1; + } + /*}}}*/ + else if (dir->pos==1) /* next entry is .. */ /*{{{*/ + { + ent->ino=dir->ino->sb->maxdir; + ent->reclen=2; + strcpy(ent->name,".."); + ent->off=dir->pos; + ++dir->pos; + return 1; + } + /*}}}*/ + else if (dir->pos==2) + { + if (dir->ino->sb->passwdLength) /* next entry is [passwd] */ /*{{{*/ + { + ent->ino=dir->ino->sb->maxdir+1; + ent->reclen=8; + strcpy(ent->name,"[passwd]"); + ent->off=dir->pos; + ++dir->pos; + return 1; + } + /*}}}*/ + } + else if (dir->pos==3) + { + if (dir->ino->sb->labelLength) /* next entry is [label] */ /*{{{*/ + { + ent->ino=dir->ino->sb->maxdir+2; + ent->reclen=7; + strcpy(ent->name,"[label]"); + ent->off=dir->pos; + ++dir->pos; + return 1; + } + /*}}}*/ + } + else if (dir->pos>=RESERVED_ENTRIES && dir->pos<(int)dir->ino->sb->maxdir+RESERVED_ENTRIES) + { + int first=dir->pos-RESERVED_ENTRIES; + + if ((cur=dir->ino->sb->dir+(dir->pos-RESERVED_ENTRIES))->status>=0 && cur->status<=(dir->ino->sb->type&CPMFS_HI_USER ? 31 : 15)) + { + /* determine first extent for the current file */ /*{{{*/ + for (i=0; iino->sb->maxdir; ++i) if (i!=(dir->pos-RESERVED_ENTRIES)) + { + if (isMatching(cur->status,cur->name,cur->ext,dir->ino->sb->dir[i].status,dir->ino->sb->dir[i].name,dir->ino->sb->dir[i].ext) && EXTENT(cur->extnol,cur->extnoh)>EXTENT(dir->ino->sb->dir[i].extnol,dir->ino->sb->dir[i].extnoh)) first=i; + } + /*}}}*/ + if (first==(dir->pos-RESERVED_ENTRIES)) + { + ent->ino=dir->pos-RESERVED_INODES; + /* convert file name to UNIX style */ /*{{{*/ + buf[0]='0'+cur->status/10; + buf[1]='0'+cur->status%10; + for (bufp=buf+2,i=0; i<8 && (cur->name[i]&0x7f)!=' '; ++i) *bufp++=tolower(cur->name[i]&0x7f); + for (hasext=0,i=0; i<3 && (cur->ext[i]&0x7f)!=' '; ++i) + { + if (!hasext) { *bufp++='.'; hasext=1; } + *bufp++=tolower(cur->ext[i]&0x7f); + } + *bufp='\0'; + /*}}}*/ + assert(bufp<=buf+sizeof(buf)); + ent->reclen=bufp-buf; + strcpy(ent->name,buf); + ent->off=dir->pos; + ++dir->pos; + return 1; + } + } + } + else return 0; + ++dir->pos; + } +} +/*}}}*/ +/* cpmStat -- stat */ /*{{{*/ +void cpmStat(const struct cpmInode *ino, struct cpmStat *buf) +{ + buf->ino=ino->ino; + buf->mode=ino->mode; + buf->size=ino->size; + buf->atime=ino->atime; + buf->mtime=ino->mtime; + buf->ctime=ino->ctime; +} +/*}}}*/ +/* cpmOpen -- open */ /*{{{*/ +int cpmOpen(struct cpmInode *ino, struct cpmFile *file, mode_t mode) +{ + if (S_ISREG(ino->mode)) + { + if ((mode&O_WRONLY) && (ino->mode&0222)==0) + { + boo="permission denied"; + return -1; + } + file->pos=0; + file->ino=ino; + file->mode=mode; + return 0; + } + else + { + boo="not a regular file"; + return -1; + } +} +/*}}}*/ +/* cpmRead -- read */ /*{{{*/ +int cpmRead(struct cpmFile *file, char *buf, int count) +{ + int findext=1,findblock=1,extent=-1,block=-1,extentno=-1,got=0,nextblockpos=-1,nextextpos=-1; + int blocksize=file->ino->sb->blksiz; + int extcap; + + extcap=(file->ino->sb->size<256 ? 16 : 8)*blocksize; + if (extcap>16384) extcap=16384*file->ino->sb->extents; + if (file->ino->ino==(ino_t)file->ino->sb->maxdir+1) /* [passwd] */ /*{{{*/ + { + if ((file->pos+count)>file->ino->size) count=file->ino->size-file->pos; + if (count) memcpy(buf,file->ino->sb->passwd+file->pos,count); + file->pos+=count; +#ifdef CPMFS_DEBUG + fprintf(stderr,"cpmRead passwd: read %d bytes, now at position %ld\n",count,(long)file->pos); +#endif + return count; + } + /*}}}*/ + else if (file->ino->ino==(ino_t)file->ino->sb->maxdir+2) /* [label] */ /*{{{*/ + { + if ((file->pos+count)>file->ino->size) count=file->ino->size-file->pos; + if (count) memcpy(buf,file->ino->sb->label+file->pos,count); + file->pos+=count; +#ifdef CPMFS_DEBUG + fprintf(stderr,"cpmRead label: read %d bytes, now at position %ld\n",count,(long)file->pos); +#endif + return count; + } + /*}}}*/ + else while (count>0 && file->posino->size) + { + char buffer[16384]; + + if (findext) + { + extentno=file->pos/16384; + extent=findFileExtent(file->ino->sb,file->ino->sb->dir[file->ino->ino].status,file->ino->sb->dir[file->ino->ino].name,file->ino->sb->dir[file->ino->ino].ext,0,extentno); + nextextpos=(file->pos/extcap)*extcap+extcap; + findext=0; + findblock=1; + } + if (findblock) + { + if (extent!=-1) + { + int start,end,ptr; + + ptr=(file->pos%extcap)/blocksize; + if (file->ino->sb->size>=256) ptr*=2; + block=(unsigned char)file->ino->sb->dir[extent].pointers[ptr]; + if (file->ino->sb->size>=256) block+=((unsigned char)file->ino->sb->dir[extent].pointers[ptr+1])<<8; + if (block==0) + { + memset(buffer,0,blocksize); + } + else + { + start=(file->pos%blocksize)/file->ino->sb->secLength; + end=((file->pos%blocksize+count)>blocksize ? blocksize-1 : (file->pos%blocksize+count-1))/file->ino->sb->secLength; + if (readBlock(file->ino->sb,block,buffer,start,end)==-1) + { + if (got==0) got=-1; + break; + } + } + } + nextblockpos=(file->pos/blocksize)*blocksize+blocksize; + findblock=0; + } + if (file->pospos%blocksize]; + ++file->pos; + ++got; + --count; + } + else if (file->pos==nextextpos) findext=1; else findblock=1; + } +#ifdef CPMFS_DEBUG + fprintf(stderr,"cpmRead: read %d bytes, now at position %ld\n",got,(long)file->pos); +#endif + return got; +} +/*}}}*/ +/* cpmWrite -- write */ /*{{{*/ +int cpmWrite(struct cpmFile *file, const char *buf, int count) +{ + int findext=1,findblock=-1,extent=-1,extentno=-1,got=0,nextblockpos=-1,nextextpos=-1; + int blocksize=file->ino->sb->blksiz; + int extcap=(file->ino->sb->size<256 ? 16 : 8)*blocksize; + int block=-1,start=-1,end=-1,ptr=-1,last=-1; + char buffer[16384]; + + while (count>0) + { + if (findext) /*{{{*/ + { + extentno=file->pos/16384; + extent=findFileExtent(file->ino->sb,file->ino->sb->dir[file->ino->ino].status,file->ino->sb->dir[file->ino->ino].name,file->ino->sb->dir[file->ino->ino].ext,0,extentno); + nextextpos=(file->pos/extcap)*extcap+extcap; + if (extent==-1) + { + if ((extent=findFreeExtent(file->ino->sb))==-1) return (got==0 ? -1 : got); + file->ino->sb->dir[extent]=file->ino->sb->dir[file->ino->ino]; + memset(file->ino->sb->dir[extent].pointers,0,16); + file->ino->sb->dir[extent].extnol=EXTENTL(extentno); + file->ino->sb->dir[extent].extnoh=EXTENTH(extentno); + file->ino->sb->dir[extent].blkcnt=0; + file->ino->sb->dir[extent].lrc=0; + time(&file->ino->ctime); + updateTimeStamps(file->ino,extent); + updateDsStamps(file->ino,extent); + } + findext=0; + findblock=1; + } + /*}}}*/ + if (findblock) /*{{{*/ + { + ptr=(file->pos%extcap)/blocksize; + if (file->ino->sb->size>=256) ptr*=2; + block=(unsigned char)file->ino->sb->dir[extent].pointers[ptr]; + if (file->ino->sb->size>=256) block+=((unsigned char)file->ino->sb->dir[extent].pointers[ptr+1])<<8; + if (block==0) /* allocate new block, set start/end to cover it */ /*{{{*/ + { + if ((block=allocBlock(file->ino->sb))==-1) return (got==0 ? -1 : got); + file->ino->sb->dir[extent].pointers[ptr]=block&0xff; + if (file->ino->sb->size>=256) file->ino->sb->dir[extent].pointers[ptr+1]=(block>>8)&0xff; + start=0; + end=(blocksize-1)/file->ino->sb->secLength; + memset(buffer,0,blocksize); + time(&file->ino->ctime); + updateTimeStamps(file->ino,extent); + updateDsStamps(file->ino,extent); + } + /*}}}*/ + else /* read existing block and set start/end to cover modified parts */ /*{{{*/ + { + start=(file->pos%blocksize)/file->ino->sb->secLength; + end=((file->pos%blocksize+count)>blocksize ? blocksize-1 : (file->pos%blocksize+count-1))/file->ino->sb->secLength; + if (file->pos%file->ino->sb->secLength) + { + if (readBlock(file->ino->sb,block,buffer,start,start)==-1) + { + if (got==0) got=-1; + break; + } + } + if (end!=start && (file->pos+count-1)ino->sb,block,buffer+end*file->ino->sb->secLength,end,end)==-1) + { + if (got==0) got=-1; + break; + } + } + } + /*}}}*/ + nextblockpos=(file->pos/blocksize)*blocksize+blocksize; + findblock=0; + } + /*}}}*/ + /* fill block and write it */ /*{{{*/ + file->ino->sb->dirtyDirectory=1; + while (file->pos!=nextblockpos && count) + { + buffer[file->pos%blocksize]=*buf++; + ++file->pos; + if (file->ino->sizepos) file->ino->size=file->pos; + ++got; + --count; + } + (void)writeBlock(file->ino->sb,block,buffer,start,end); + time(&file->ino->mtime); + if (file->ino->sb->size<256) for (last=15; last>=0; --last) + { + if (file->ino->sb->dir[extent].pointers[last]) + { + break; + } + } + else for (last=14; last>0; last-=2) + { + if (file->ino->sb->dir[extent].pointers[last] || file->ino->sb->dir[extent].pointers[last+1]) + { + last/=2; + break; + } + } + if (last>0) extentno+=(last*blocksize)/extcap; + file->ino->sb->dir[extent].extnol=EXTENTL(extentno); + file->ino->sb->dir[extent].extnoh=EXTENTH(extentno); + file->ino->sb->dir[extent].blkcnt=((file->pos-1)%16384)/128+1; + if (file->ino->sb->type & CPMFS_EXACT_SIZE) + { + file->ino->sb->dir[extent].lrc = (128 - (file->pos%128)) & 0x7F; + } + else + { + file->ino->sb->dir[extent].lrc=file->pos%128; + } + updateTimeStamps(file->ino,extent); + updateDsStamps(file->ino,extent); + /*}}}*/ + if (file->pos==nextextpos) findext=1; + else if (file->pos==nextblockpos) findblock=1; + } + return got; +} +/*}}}*/ +/* cpmClose -- close */ /*{{{*/ +int cpmClose(struct cpmFile *file) +{ + return 0; +} +/*}}}*/ +/* cpmCreat -- creat */ /*{{{*/ +int cpmCreat(struct cpmInode *dir, const char *fname, struct cpmInode *ino, mode_t mode) +{ + int user; + char name[8],extension[3]; + int extent; + struct cpmSuperBlock *drive; + struct PhysDirectoryEntry *ent; + + if (!S_ISDIR(dir->mode)) + { + boo="No such file or directory"; + return -1; + } + if (splitFilename(fname,dir->sb->type,name,extension,&user)==-1) return -1; +#ifdef CPMFS_DEBUG + fprintf(stderr,"cpmCreat: %s -> %d:%-.8s.%-.3s\n",fname,user,name,extension); +#endif + if (findFileExtent(dir->sb,user,name,extension,0,-1)!=-1) return -1; + drive=dir->sb; + if ((extent=findFreeExtent(dir->sb))==-1) return -1; + ent=dir->sb->dir+extent; + drive->dirtyDirectory=1; + memset(ent,0,32); + ent->status=user; + memcpy(ent->name,name,8); + memcpy(ent->ext,extension,3); + ino->ino=extent; + ino->mode=s_ifreg|mode; + ino->size=0; + + time(&ino->atime); + time(&ino->mtime); + time(&ino->ctime); + ino->sb=dir->sb; + updateTimeStamps(ino,extent); + updateDsStamps(ino,extent); + return 0; +} +/*}}}*/ + +/* cpmAttrGet -- get CP/M attributes */ /*{{{*/ +int cpmAttrGet(struct cpmInode *ino, cpm_attr_t *attrib) +{ + *attrib = ino->attr; + return 0; +} +/*}}}*/ +/* cpmAttrSet -- set CP/M attributes */ /*{{{*/ +int cpmAttrSet(struct cpmInode *ino, cpm_attr_t attrib) +{ + struct cpmSuperBlock *drive; + int extent; + int user; + char name[8], extension[3]; + + memset(name, 0, sizeof(name)); + memset(extension, 0, sizeof(extension)); + drive = ino->sb; + extent = ino->ino; + + drive->dirtyDirectory=1; + /* Strip off existing attribute bits */ + memcpy7(name, drive->dir[extent].name, 8); + memcpy7(extension, drive->dir[extent].ext, 3); + user = drive->dir[extent].status; + + /* And set new ones */ + if (attrib & CPM_ATTR_F1) name[0] |= 0x80; + if (attrib & CPM_ATTR_F2) name[1] |= 0x80; + if (attrib & CPM_ATTR_F3) name[2] |= 0x80; + if (attrib & CPM_ATTR_F4) name[3] |= 0x80; + if (attrib & CPM_ATTR_RO) extension[0] |= 0x80; + if (attrib & CPM_ATTR_SYS) extension[1] |= 0x80; + if (attrib & CPM_ATTR_ARCV) extension[2] |= 0x80; + + do + { + memcpy(drive->dir[extent].name, name, 8); + memcpy(drive->dir[extent].ext, extension, 3); + } while ((extent=findFileExtent(drive, user,name,extension,extent+1,-1))!=-1); + + /* Update the stored (inode) copies of the file attributes and mode */ + ino->attr=attrib; + if (attrib&CPM_ATTR_RO) ino->mode&=~(S_IWUSR|S_IWGRP|S_IWOTH); + else ino->mode|=(S_IWUSR|S_IWGRP|S_IWOTH); + + return 0; +} +/*}}}*/ +/* cpmChmod -- set CP/M r/o & sys */ /*{{{*/ +int cpmChmod(struct cpmInode *ino, mode_t mode) +{ + /* Convert the chmod() into a chattr() call that affects RO */ + int newatt = ino->attr & ~CPM_ATTR_RO; + + if (!(mode & (S_IWUSR|S_IWGRP|S_IWOTH))) newatt |= CPM_ATTR_RO; + return cpmAttrSet(ino, newatt); +} +/*}}}*/ +/* cpmUtime -- set timestamps */ /*{{{*/ +void cpmUtime(struct cpmInode *ino, struct utimbuf *times) +{ + ino->atime = times->actime; + ino->mtime = times->modtime; + time(&ino->ctime); + updateTimeStamps(ino,ino->ino); + updateDsStamps(ino,ino->ino); +} +/*}}}*/ diff --git a/Tools/unix/cpmtools/cpmfs.h b/Tools/unix/cpmtools/cpmfs.h new file mode 100644 index 00000000..06126c86 --- /dev/null +++ b/Tools/unix/cpmtools/cpmfs.h @@ -0,0 +1,206 @@ +#ifndef CPMFS_H +#define CPMFS_H + +#include +#include +#include + +#ifdef _WIN32 + #include + #include + /* To make it compile on NT: extracts from Linux 2.0 * + * and */ + #define __S_IFMT 0170000 /* These bits determine file type. */ + #define __S_IFDIR 0040000 /* Directory. */ + #define __S_IFREG 0100000 /* Regular file. */ + #define __S_IWUSR 0000200 /* Writable for user. */ + #define __S_IWGRP 0000200 /* Writable for group. */ + #define __S_IWOTH 0000200 /* Writable for others. */ + + #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) + #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) + /* These bits are defined in Borland C++ 5 but not in MS Visual C++ */ + #ifndef S_ISDIR + # define S_ISDIR(mode) __S_ISTYPE((mode), __S_IFDIR) + #endif + #ifndef S_ISREG + # define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG) + #endif + #ifndef S_IWUSR + #define S_IWUSR __S_IWUSR + #endif + #ifndef S_IWGRP + #define S_IWGRP __S_IWGRP + #endif + #ifndef S_IWOTH + #define S_IWOTH __S_IWOTH + #endif + + #include /* For open(), lseek() etc. */ + #ifndef HAVE_MODE_T + typedef int mode_t; + #endif +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#include "device.h" + +/* CP/M file attributes */ +#define CPM_ATTR_F1 1 +#define CPM_ATTR_F2 2 +#define CPM_ATTR_F3 4 +#define CPM_ATTR_F4 8 +/* F5-F8 are banned in CP/M 2 & 3, F7 is used by ZSDOS */ +#define CPM_ATTR_RO 256 /* Read-only */ +#define CPM_ATTR_SYS 512 /* System */ +#define CPM_ATTR_ARCV 1024 /* Archive */ +#define CPM_ATTR_PWDEL 2048 /* Password required to delete */ +#define CPM_ATTR_PWWRITE 4096 /* Password required to write */ +#define CPM_ATTR_PWREAD 8192 /* Password required to read */ + +typedef int cpm_attr_t; + +struct cpmInode +{ + ino_t ino; + mode_t mode; + off_t size; + cpm_attr_t attr; + time_t atime; + time_t mtime; + time_t ctime; + struct cpmSuperBlock *sb; +}; + +struct cpmFile +{ + mode_t mode; + off_t pos; + struct cpmInode *ino; +}; + +struct cpmDirent +{ + ino_t ino; + off_t off; + size_t reclen; + char name[2+8+1+3+1]; /* 00foobarxy.zzy\0 */ +}; + +struct cpmStat +{ + ino_t ino; + mode_t mode; + off_t size; + time_t atime; + time_t mtime; + time_t ctime; +}; + +#define CPMFS_HI_USER (0x1<<0) /* has user numbers up to 31 */ +#define CPMFS_CPM3_DATES (0x1<<1) /* has CP/M+ style time stamps */ +#define CPMFS_CPM3_OTHER (0x1<<2) /* has passwords and disc label */ +#define CPMFS_DS_DATES (0x1<<3) /* has datestamper timestamps */ +#define CPMFS_EXACT_SIZE (0x1<<4) /* has reverse exact file size */ + +#define CPMFS_DR22 0 +#define CPMFS_P2DOS (CPMFS_CPM3_DATES|CPMFS_HI_USER) +#define CPMFS_DR3 (CPMFS_CPM3_DATES|CPMFS_CPM3_OTHER|CPMFS_HI_USER) +#define CPMFS_ISX (CPMFS_EXACT_SIZE) +#define CPMFS_ZSYS (CPMFS_HI_USER) + +struct dsEntry +{ + char year; + char month; + char day; + char hour; + char minute; +}; + +struct dsDate +{ + struct dsEntry create; + struct dsEntry access; + struct dsEntry modify; + char checksum; +}; + +struct cpmSuperBlock +{ + struct Device dev; + + int secLength; + int tracks; + int sectrk; + int blksiz; + int maxdir; + int skew; + int boottrk; + off_t offset; + int type; + int size; + int extents; /* logical extents per physical extent */ + struct PhysDirectoryEntry *dir; + int alvSize; + int *alv; + int *skewtab; + int cnotatime; + char *label; + size_t labelLength; + char *passwd; + size_t passwdLength; + struct cpmInode *root; + int dirtyDirectory; + struct dsDate *ds; + int dirtyDs; + char libdskGeometry[256]; +}; + +struct cpmStatFS +{ + long f_bsize; + long f_blocks; + long f_bfree; + long f_bused; + long f_bavail; + long f_files; + long f_ffree; + long f_namelen; +}; + +extern const char cmd[]; +extern const char *boo; + +int match(const char *a, const char *pattern); +void cpmglob(int opti, int argc, char * const argv[], struct cpmInode *root, int *gargc, char ***gargv); + +int cpmReadSuper(struct cpmSuperBlock *drive, struct cpmInode *root, const char *format); +int cpmNamei(const struct cpmInode *dir, const char *filename, struct cpmInode *i); +void cpmStatFS(const struct cpmInode *ino, struct cpmStatFS *buf); +int cpmUnlink(const struct cpmInode *dir, const char *fname); +int cpmRename(const struct cpmInode *dir, const char *old, const char *newname); +int cpmOpendir(struct cpmInode *dir, struct cpmFile *dirp); +int cpmReaddir(struct cpmFile *dir, struct cpmDirent *ent); +void cpmStat(const struct cpmInode *ino, struct cpmStat *buf); +int cpmAttrGet(struct cpmInode *ino, cpm_attr_t *attrib); +int cpmAttrSet(struct cpmInode *ino, cpm_attr_t attrib); +int cpmChmod(struct cpmInode *ino, mode_t mode); +int cpmOpen(struct cpmInode *ino, struct cpmFile *file, mode_t mode); +int cpmRead(struct cpmFile *file, char *buf, int count); +int cpmWrite(struct cpmFile *file, const char *buf, int count); +int cpmClose(struct cpmFile *file); +int cpmCreat(struct cpmInode *dir, const char *fname, struct cpmInode *ino, mode_t mode); +void cpmUtime(struct cpmInode *ino, struct utimbuf *times); +int cpmSync(struct cpmSuperBlock *sb); +void cpmUmount(struct cpmSuperBlock *sb); +int cpmCheckDs(struct cpmSuperBlock *sb); + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/Tools/unix/cpmtools/cpmls.1 b/Tools/unix/cpmtools/cpmls.1 new file mode 100644 index 00000000..91326400 --- /dev/null +++ b/Tools/unix/cpmtools/cpmls.1 @@ -0,0 +1,75 @@ +.TH CPMLS 1 "October 25, 2014" "CP/M tools" "User commands" +.SH NAME \"{{{roff}}}\"{{{ +cpmls \- list sorted contents of directory +.\"}}} +.SH SYNOPSIS \"{{{ +.ad l +.B cpmls +.RB [ \-f +.IR format ] +.RB [ \-T +.IR libdsk-type ] +.RB [ \-d | \-D | \-F | \-A | \-l [ \-c ][ \-i ]] +.I image +.RI [ file-pattern "...]" +.ad b +.\"}}} +.SH DESCRIPTION \"{{{ +\fBCpmls\fP lists the sorted contents of the directory. +.\"}}} +.SH OPTIONS \"{{{ +.IP "\fB\-f\fP \fIformat\fP" +Use the given CP/M disk \fIformat\fP instead of the default format. +.IP "\fB\-T\fP \fIlibdsk-type\fP" +libdsk driver type, e.g. \fBtele\fP for Teledisk images or \fBraw\fP for raw images +(requires building cpmtools with support for libdsk). +.IP \fB\-d\fP +Old CP/M 2.2 dir output. +.IP \fB\-D\fP +P2DOS 2.3 ddir-like output. +.IP \fB\-F\fp +CP/M 3.x dir output. +.IP \fB\-A\fp +E2fs lsattr-like output. +.IP \fB\-l\fP +Long UNIX-style directory listing including size, time stamp and user number. +.IP \fB\-c\fP +Output the creation time, not the modification time. +.IP \fB\-i\fP +Print index number of each file. +.\"}}} +.SH "RETURN VALUE" \"{{{ +Upon successful completion, exit code 0 is returned. +.\"}}} +.SH ERRORS \"{{{ +Any errors are indicated by exit code 1. +.\"}}} +.SH ENVIRONMENT \"{{{ +CPMTOOLSFMT Default format +.\"}}} +.SH FILES \"{{{ +${prefix}/share/diskdefs CP/M disk format definitions +.\"}}} +.SH AUTHORS \"{{{ +This program is copyright 1997\(en2012 Michael Haardt +. The Windows port is copyright 2000, 2001, 2011 John Elliott +. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License along +with this program. If not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\"}}} +.SH "SEE ALSO" \"{{{ +.IR cpmcp (1), +.IR cpm (5) +.\"}}} diff --git a/Tools/unix/cpmtools/cpmls.c b/Tools/unix/cpmtools/cpmls.c new file mode 100644 index 00000000..3721d2e0 --- /dev/null +++ b/Tools/unix/cpmtools/cpmls.c @@ -0,0 +1,400 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "getopt_.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ + +/* variables */ /*{{{*/ +static const char * const month[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" }; +/*}}}*/ + +/* namecmp -- compare two entries */ /*{{{*/ +static int namecmp(const void *a, const void *b) +{ + if (**((const char * const *)a)=='[') return -1; + return strcmp(*((const char * const *)a),*((const char * const *)b)); +} +/*}}}*/ +/* olddir -- old style output */ /*{{{*/ +static void olddir(char **dirent, int entries) +{ + int i,j,k,l,user,announce; + + announce=0; + for (user=0; user<32; ++user) + { + for (i=l=0; itm_mday,month[tmp->tm_mon],tmp->tm_year+1900,tmp->tm_hour,tmp->tm_min); + } + else if (statbuf.ctime) printf(" "); + if (statbuf.ctime) + { + tmp=localtime(&statbuf.ctime); + printf(" %02d-%s-%04d %02d:%02d",tmp->tm_mday,month[tmp->tm_mon],tmp->tm_year+1900,tmp->tm_hour,tmp->tm_min); + } + putchar('\n'); + ++l; + } + } + if (announce==2) announce=1; + } + printf("%5.1d Files occupying %6.1ldK",l,(buf.f_bused*buf.f_bsize)/1024); + printf(", %7.1ldK Free.\n",(buf.f_bfree*buf.f_bsize)/1024); + } + else printf("No files found\n"); +} +/*}}}*/ +/* old3dir -- old CP/M Plus style long output */ /*{{{*/ +static void old3dir(char **dirent, int entries, struct cpmInode *ino) +{ + struct cpmStatFS buf; + struct cpmStat statbuf; + struct cpmInode file; + + if (entries) + { + int i,j,k,l,announce,user, attrib; + int totalBytes=0,totalRecs=0; + + qsort(dirent,entries,sizeof(char*),namecmp); + cpmStatFS(ino,&buf); + announce=1; + for (l=0,user=0; user<32; ++user) + { + for (i=0; itm_mon+1,tmp->tm_mday,tmp->tm_year%100,tmp->tm_hour,tmp->tm_min); + } + else if (statbuf.ctime) printf(" "); + if (statbuf.ctime) + { + tmp=localtime(&statbuf.ctime); + printf("%02d/%02d/%02d %02d:%02d",tmp->tm_mon+1,tmp->tm_mday,tmp->tm_year%100,tmp->tm_hour,tmp->tm_min); + } + putchar('\n'); + ++l; + } + } + if (announce==2) announce=1; + } + printf("\nTotal Bytes = %6.1dk ",(totalBytes+1023)/1024); + printf("Total Records = %7.1d ",totalRecs); + printf("Files Found = %4.1d\n",l); + printf("Total 1k Blocks = %6.1ld ",(buf.f_bused*buf.f_bsize)/1024); + printf("Used/Max Dir Entries For Drive A: %4.1ld/%4.1ld\n",buf.f_files-buf.f_ffree,buf.f_files); + } + else printf("No files found\n"); +} +/*}}}*/ +/* ls -- UNIX style output */ /*{{{*/ +static void ls(char **dirent, int entries, struct cpmInode *ino, int l, int c, int iflag) +{ + int i,user,announce,any; + time_t now; + struct cpmStat statbuf; + struct cpmInode file; + + time(&now); + qsort(dirent,entries,sizeof(char*),namecmp); + announce=0; + any=0; + for (user=0; user<32; ++user) + { + announce=0; + for (i=0; itm_mon],tmp->tm_mday); + if ((c ? statbuf.ctime : statbuf.mtime)<(now-182*24*3600)) printf("%04d ",tmp->tm_year+1900); + else printf("%02d:%02d ",tmp->tm_hour,tmp->tm_min); + } + printf("%s\n",dirent[i]+2); + } + } + } +} +/*}}}*/ +/* lsattr -- output something like e2fs lsattr */ /*{{{*/ +static void lsattr(char **dirent, int entries, struct cpmInode *ino) +{ + int i,user,announce,any; + struct cpmStat statbuf; + struct cpmInode file; + cpm_attr_t attrib; + + qsort(dirent,entries,sizeof(char*),namecmp); + announce=0; + any=0; + for (user=0; user<32; ++user) + { + announce=0; + for (i=0; i. The Windows port is copyright 2000, 2001, 2011 John Elliott +. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License along +with this program. If not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\"}}} +.SH "SEE ALSO" \"{{{ +.IR cpmls (1), +.IR cpm (5) +.\"}}} diff --git a/Tools/unix/cpmtools/cpmrm.c b/Tools/unix/cpmtools/cpmrm.c new file mode 100644 index 00000000..65430da6 --- /dev/null +++ b/Tools/unix/cpmtools/cpmrm.c @@ -0,0 +1,77 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include +#include + +#include "getopt_.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ + +const char cmd[]="cpmrm"; + +int main(int argc, char *argv[]) /*{{{*/ +{ + /* variables */ /*{{{*/ + const char *err; + const char *image; + const char *format; + const char *devopts=NULL; + int c,i,usage=0,exitcode=0; + struct cpmSuperBlock drive; + struct cpmInode root; + int gargc; + char **gargv; + /*}}}*/ + + /* parse options */ /*{{{*/ + if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT; + while ((c=getopt(argc,argv,"T:f:h?"))!=EOF) switch(c) + { + case 'T': devopts=optarg; break; + case 'f': format=optarg; break; + case 'h': + case '?': usage=1; break; + } + + if (optind>=(argc-1)) usage=1; + else image=argv[optind++]; + + if (usage) + { + fprintf(stderr,"Usage: %s [-f format] [-T dsktype] image pattern ...\n",cmd); + exit(1); + } + /*}}}*/ + /* open image */ /*{{{*/ + if ((err=Device_open(&drive.dev, image, O_RDWR, devopts))) + { + fprintf(stderr,"%s: cannot open %s (%s)\n",cmd,image,err); + exit(1); + } + if (cpmReadSuper(&drive,&root,format)==-1) + { + fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo); + exit(1); + } + /*}}}*/ + cpmglob(optind,argc,argv,&root,&gargc,&gargv); + for (i=0; i +#include +#include +#include + +#include "device.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ + +static const char *lookupFormat(DSK_GEOMETRY *geom, const char *name) +{ + dsk_format_t fmt = FMT_180K; + const char *fname; + + while (dg_stdformat(NULL, fmt, &fname, NULL) == DSK_ERR_OK) + { + if (!strcmp(name, fname)) + { + dg_stdformat(geom, fmt, &fname, NULL); + return NULL; + } + ++fmt; + } + return "Unrecognised LibDsk geometry specification"; +} + +/* Device_open -- Open an image file */ /*{{{*/ +const char *Device_open(struct Device *this, const char *filename, int mode, const char *deviceOpts) +{ + char *format; + char driverName[80]; + const char *boo; + dsk_err_t e; + + /* Assume driver name & format name both fit in 80 characters, rather than + * malloccing the exact size */ + if (deviceOpts == NULL) + { + e = dsk_open(&this->dev, filename, NULL, NULL); + format = NULL; + } + else + { + strncpy(driverName, deviceOpts, 79); + driverName[79] = 0; + format = strchr(driverName, ','); + if (format) + { + *format = 0; + ++format; + } + e = dsk_open(&this->dev, filename, driverName, NULL); + } + this->opened = 0; + if (e) return dsk_strerror(e); + this->opened = 1; + if (format) + { + boo = lookupFormat(&this->geom, format); + if (boo) return boo; + } + else + { + dsk_getgeom(this->dev, &this->geom); + } + return NULL; +} +/*}}}*/ +/* Device_setGeometry -- Set disk geometry */ /*{{{*/ +const char *Device_setGeometry(struct Device *this, int secLength, int sectrk, int tracks, off_t offset, const char *libdskGeometry) +{ + char *boo; + + this->secLength=secLength; + this->sectrk=sectrk; + this->tracks=tracks; + /* Must be an even multiple of sector size */ + assert(offset%secLength==0); + this->offset=offset; + /* If a geometry is named in diskdefs, use it */ + if (libdskGeometry && libdskGeometry[0]) + { + return lookupFormat(&this->geom, libdskGeometry); + } + + this->geom.dg_secsize = secLength; + this->geom.dg_sectors = sectrk; + /* Did the autoprobe guess right about the number of sectors & cylinders? */ + if (this->geom.dg_cylinders * this->geom.dg_heads == tracks) return NULL; + /* Otherwise we guess: <= 43 tracks: single-sided. Else double. This + * fails for 80-track single-sided if there are any such beasts */ + if (tracks <= 43) + { + this->geom.dg_cylinders = tracks; + this->geom.dg_heads = 1; + } + else + { + this->geom.dg_cylinders = tracks/2; + this->geom.dg_heads = 2; + } + return NULL; +} +/*}}}*/ +/* Device_close -- Close an image file */ /*{{{*/ +const char *Device_close(struct Device *this) +{ + dsk_err_t e; + this->opened=0; + e = dsk_close(&this->dev); + return (e?dsk_strerror(e):(const char*)0); +} +/*}}}*/ +/* Device_readSector -- read a physical sector */ /*{{{*/ +const char *Device_readSector(const struct Device *this, int track, int sector, char *buf) +{ + dsk_err_t e; + e = dsk_lread(this->dev, &this->geom, buf, (track * this->sectrk) + sector + this->offset/this->secLength); + return (e?dsk_strerror(e):(const char*)0); +} +/*}}}*/ +/* Device_writeSector -- write physical sector */ /*{{{*/ +const char *Device_writeSector(const struct Device *this, int track, int sector, const char *buf) +{ + dsk_err_t e; + e = dsk_lwrite(this->dev, &this->geom, buf, (track * this->sectrk) + sector + this->offset/this->secLength); + return (e?dsk_strerror(e):(const char*)0); +} +/*}}}*/ diff --git a/Tools/unix/cpmtools/device_posix.c b/Tools/unix/cpmtools/device_posix.c new file mode 100644 index 00000000..5a28dcdc --- /dev/null +++ b/Tools/unix/cpmtools/device_posix.c @@ -0,0 +1,82 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include +#include + +#include "device.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ + +/* Device_open -- Open an image file */ /*{{{*/ +const char *Device_open(struct Device *this, const char *filename, int mode, const char *deviceOpts) +{ + this->fd=open(filename,mode); + this->opened=(this->fd==-1?0:1); + return ((this->fd==-1)?strerror(errno):(const char*)0); +} +/*}}}*/ +/* Device_setGeometry -- Set disk geometry */ /*{{{*/ +const char *Device_setGeometry(struct Device *this, int secLength, int sectrk, int tracks, off_t offset, const char *libdskGeometry) +{ + this->secLength=secLength; + this->sectrk=sectrk; + this->tracks=tracks; + this->offset=offset; + return NULL; +} +/*}}}*/ +/* Device_close -- Close an image file */ /*{{{*/ +const char *Device_close(struct Device *this) +{ + this->opened=0; + return ((close(this->fd)==-1)?strerror(errno):(const char*)0); +} +/*}}}*/ +/* Device_readSector -- read a physical sector */ /*{{{*/ +const char *Device_readSector(const struct Device *this, int track, int sector, char *buf) +{ + int res; + + assert(this); + assert(sector>=0); + assert(sectorsectrk); + assert(track>=0); + assert(tracktracks); + assert(buf); + if (lseek(this->fd,(off_t)(((sector+track*this->sectrk)*this->secLength)+this->offset),SEEK_SET)==-1) + { + return strerror(errno); + } + if ((res=read(this->fd, buf, this->secLength)) != this->secLength) + { + if (res==-1) + { + return strerror(errno); + } + else memset(buf+res,0,this->secLength-res); /* hit end of disk image */ + } + return (const char*)0; +} +/*}}}*/ +/* Device_writeSector -- write physical sector */ /*{{{*/ +const char *Device_writeSector(const struct Device *this, int track, int sector, const char *buf) +{ + assert(sector>=0); + assert(sectorsectrk); + assert(track>=0); + assert(tracktracks); + if (lseek(this->fd,(off_t)(((sector+track*this->sectrk)*this->secLength)+this->offset),SEEK_SET)==-1) + { + return strerror(errno); + } + if (write(this->fd, buf, this->secLength) == this->secLength) return (const char*)0; + return strerror(errno); +} +/*}}}*/ diff --git a/Tools/unix/cpmtools/device_win32.c b/Tools/unix/cpmtools/device_win32.c new file mode 100644 index 00000000..18294432 --- /dev/null +++ b/Tools/unix/cpmtools/device_win32.c @@ -0,0 +1,670 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include + +#include "cpmdir.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ +/* types */ /*{{{*/ +#define PHYSICAL_SECTOR_1 1 /* First physical sector */ + +/* Use the INT13 interface rather than INT25/INT26. This appears to + * improve performance, but is less well tested. */ +#define USE_INT13 + +/* Windows 95 disk I/O functions - based on Stan Mitchell's DISKDUMP.C */ +#define VWIN32_DIOC_DOS_IOCTL 1 /* DOS ioctl calls 4400h-4411h */ +#define VWIN32_DIOC_DOS_INT25 2 /* absolute disk read, DOS int 25h */ +#define VWIN32_DIOC_DOS_INT26 3 /* absolute disk write, DOS int 26h */ +#define VWIN32_DIOC_DOS_INT13 4 /* BIOS INT13 functions */ + +typedef struct _DIOC_REGISTERS { + DWORD reg_EBX; + DWORD reg_EDX; + DWORD reg_ECX; + DWORD reg_EAX; + DWORD reg_EDI; + DWORD reg_ESI; + DWORD reg_Flags; + } + DIOC_REGISTERS, *PDIOC_REGISTERS; + +#define LEVEL0_LOCK 0 +#define LEVEL1_LOCK 1 +#define LEVEL2_LOCK 2 +#define LEVEL3_LOCK 3 +#define LEVEL1_LOCK_MAX_PERMISSION 0x0001 + +#define DRIVE_IS_REMOTE 0x1000 +#define DRIVE_IS_SUBST 0x8000 + +/********************************************************* + **** Note: all MS-DOS data structures must be packed **** + **** on a one-byte boundary. **** + *********************************************************/ +#pragma pack(1) + +typedef struct _DISKIO { + DWORD diStartSector; /* sector number to start at */ + WORD diSectors; /* number of sectors */ + DWORD diBuffer; /* address of buffer */ + } + DISKIO, *PDISKIO; + +typedef struct MID { + WORD midInfoLevel; /* information level, must be 0 */ + DWORD midSerialNum; /* serial number for the medium */ + char midVolLabel[11]; /* volume label for the medium */ + char midFileSysType[8]; /* type of file system as 8-byte ASCII */ + } + MID, *PMID; + +typedef struct driveparams { /* Disk geometry */ + BYTE special; + BYTE devicetype; + WORD deviceattrs; + WORD cylinders; + BYTE mediatype; + /* BPB starts here */ + WORD bytespersector; + BYTE sectorspercluster; + WORD reservedsectors; + BYTE numberofFATs; + WORD rootdirsize; + WORD totalsectors; + BYTE mediaid; + WORD sectorsperfat; + WORD sectorspertrack; + WORD heads; + DWORD hiddensectors; + DWORD bigtotalsectors; + BYTE reserved[6]; + /* BPB ends here */ + WORD sectorcount; + WORD sectortable[80]; + } DRIVEPARAMS, *PDRIVEPARAMS; +/*}}}*/ + +static char *strwin32error(void) /*{{{*/ +{ + static char buffer[1024]; + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ + (LPTSTR)buffer, + 1023, NULL); + return buffer; +} +/*}}}*/ +static BOOL LockVolume( HANDLE hDisk ) /*{{{*/ +{ + DWORD ReturnedByteCount; + + return DeviceIoControl( hDisk, FSCTL_LOCK_VOLUME, NULL, 0, NULL, + 0, &ReturnedByteCount, NULL ); +} +/*}}}*/ +static BOOL UnlockVolume( HANDLE hDisk ) /*{{{*/ +{ + DWORD ReturnedByteCount; + + return DeviceIoControl( hDisk, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, + 0, &ReturnedByteCount, NULL ); +} +/*}}}*/ +static BOOL DismountVolume( HANDLE hDisk ) /*{{{*/ +{ + DWORD ReturnedByteCount; + + return DeviceIoControl( hDisk, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, + 0, &ReturnedByteCount, NULL ); +} +/*}}}*/ +static int GetDriveParams( HANDLE hVWin32Device, int volume, DRIVEPARAMS* pParam ) /*{{{*/ + { + DIOC_REGISTERS reg; + BOOL bResult; + DWORD cb; + + reg.reg_EAX = 0x440d; /* IOCTL for block device */ + reg.reg_EBX = volume; /* one-based drive number */ + reg.reg_ECX = 0x0860; /* Get Device params */ + reg.reg_EDX = (DWORD)pParam; + reg.reg_Flags = 1; /* preset the carry flag */ + + bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); + + if ( !bResult || (reg.reg_Flags & 1) ) + return (reg.reg_EAX & 0xffff); + + return 0; + } +/*}}}*/ +static int SetDriveParams( HANDLE hVWin32Device, int volume, DRIVEPARAMS* pParam ) /*{{{*/ + { + DIOC_REGISTERS reg; + BOOL bResult; + DWORD cb; + + reg.reg_EAX = 0x440d; /* IOCTL for block device */ + reg.reg_EBX = volume; /* one-based drive number */ + reg.reg_ECX = 0x0840; /* Set Device params */ + reg.reg_EDX = (DWORD)pParam; + reg.reg_Flags = 1; /* preset the carry flag */ + + bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); + + if ( !bResult || (reg.reg_Flags & 1) ) + return (reg.reg_EAX & 0xffff); + + return 0; + } +/*}}}*/ +static int GetMediaID( HANDLE hVWin32Device, int volume, MID* pMid ) /*{{{*/ + { + DIOC_REGISTERS reg; + BOOL bResult; + DWORD cb; + + reg.reg_EAX = 0x440d; /* IOCTL for block device */ + reg.reg_EBX = volume; /* one-based drive number */ + reg.reg_ECX = 0x0866; /* Get Media ID */ + reg.reg_EDX = (DWORD)pMid; + reg.reg_Flags = 1; /* preset the carry flag */ + + bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); + + if ( !bResult || (reg.reg_Flags & 1) ) + return (reg.reg_EAX & 0xffff); + + return 0; + } +/*}}}*/ +static int VolumeCheck(HANDLE hVWin32Device, int volume, WORD* flags ) /*{{{*/ +{ + DIOC_REGISTERS reg; + BOOL bResult; + DWORD cb; + + reg.reg_EAX = 0x4409; /* Is Drive Remote */ + reg.reg_EBX = volume; /* one-based drive number */ + reg.reg_Flags = 1; /* preset the carry flag */ + + bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); + + if ( !bResult || (reg.reg_Flags & 1) ) + return (reg.reg_EAX & 0xffff); + + *flags = (WORD)(reg.reg_EDX & 0xffff); + return 0; +} +/*}}}*/ +static int LockLogicalVolume(HANDLE hVWin32Device, int volume, int lock_level, int permissions) /*{{{*/ +{ + DIOC_REGISTERS reg; + BOOL bResult; + DWORD cb; + + reg.reg_EAX = 0x440d; /* generic IOCTL */ + reg.reg_ECX = 0x084a; /* lock logical volume */ + reg.reg_EBX = volume | (lock_level << 8); + reg.reg_EDX = permissions; + reg.reg_Flags = 1; /* preset the carry flag */ + + bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); + + if ( !bResult || (reg.reg_Flags & 1) ) + return (reg.reg_EAX & 0xffff); + + return 0; +} +/*}}}*/ +static int UnlockLogicalVolume( HANDLE hVWin32Device, int volume ) /*{{{*/ +{ + DIOC_REGISTERS reg; + BOOL bResult; + DWORD cb; + + reg.reg_EAX = 0x440d; + reg.reg_ECX = 0x086a; /* lock logical volume */ + reg.reg_EBX = volume; + reg.reg_Flags = 1; /* preset the carry flag */ + + bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); + + if ( !bResult || (reg.reg_Flags & 1) ) return -1; + return 0; +} +/*}}}*/ +static int w32mode(int mode) /*{{{*/ +{ + switch(mode) + { + case O_RDONLY: return GENERIC_READ; + case O_WRONLY: return GENERIC_WRITE; + } + return GENERIC_READ | GENERIC_WRITE; +} +/*}}}*/ + +/* Device_open -- Open an image file */ /*{{{*/ +const char *Device_open(struct Device *sb, const char *filename, int mode, const char *deviceOpts) +{ + /* Windows 95/NT: floppy drives using handles */ + if (strlen(filename) == 2 && filename[1] == ':') /* Drive name */ + { + char vname[20]; + DWORD dwVers; + + sb->fd = -1; + dwVers = GetVersion(); + + if (dwVers & 0x80000000L) /* Win32s (3.1) or Win32c (Win95) */ + { + int lock, driveno, res, permissions; + unsigned short drive_flags; + MID media; + + vname[0] = toupper(filename[0]); + driveno = vname[0] - 'A' + 1; /* 1=A: 2=B: */ + sb->drvtype = CPMDRV_WIN95; + sb->hdisk = CreateFile( "\\\\.\\vwin32", + 0, + 0, + NULL, + 0, + FILE_FLAG_DELETE_ON_CLOSE, + NULL ); + if (!sb->hdisk) + { + return "Failed to open VWIN32 driver."; + } + if (VolumeCheck(sb->hdisk, driveno, &drive_flags)) + { + CloseHandle(sb->hdisk); + return "Invalid drive"; + } + res = GetMediaID( sb->hdisk, driveno, &media ); + if ( res ) + { + const char *lboo = NULL; + + if ( res == ERROR_INVALID_FUNCTION && + (drive_flags & DRIVE_IS_REMOTE )) + lboo = "Network drive"; + else if (res == ERROR_ACCESS_DENIED) lboo = "Access denied"; + /* nb: It's perfectly legitimate for GetMediaID() to fail; most CP/M */ + /* CP/M disks won't have a media ID. */ + + if (lboo != NULL) + { + CloseHandle(sb->hdisk); + return lboo; + } + } + if (!res && + (!memcmp( media.midFileSysType, "CDROM", 5 ) || + !memcmp( media.midFileSysType, "CD001", 5 ) || + !memcmp( media.midFileSysType, "CDAUDIO", 5 ))) + { + CloseHandle(sb->hdisk); + return "CD-ROM drive"; + } + if (w32mode(mode) & GENERIC_WRITE) + { + lock = LEVEL0_LOCK; /* Exclusive access */ + permissions = 0; + } + else + { + lock = LEVEL1_LOCK; /* Allow other processes access */ + permissions = LEVEL1_LOCK_MAX_PERMISSION; + } + if (LockLogicalVolume( sb->hdisk, driveno, lock, permissions)) + { + CloseHandle(sb->hdisk); + return "Could not acquire a lock on the drive."; + } + + sb->fd = driveno; /* 1=A: 2=B: etc - we will need this later */ + + } + else + { + sprintf(vname, "\\\\.\\%s", filename); + sb->drvtype = CPMDRV_WINNT; + sb->hdisk = CreateFile(vname, /* Name */ + w32mode(mode), /* Access mode */ + FILE_SHARE_READ|FILE_SHARE_WRITE, /*Sharing*/ + NULL, /* Security attributes */ + OPEN_EXISTING, /* See MSDN */ + 0, /* Flags & attributes */ + NULL); /* Template file */ + + if (sb->hdisk != INVALID_HANDLE_VALUE) + { + sb->fd = 1; /* Arbitrary value >0 */ + if (LockVolume(sb->hdisk) == FALSE) /* Lock drive */ + { + char *lboo = strwin32error(); + CloseHandle(sb->hdisk); + sb->fd = -1; + return lboo; + } + } + else return strwin32error(); + } + sb->opened = 1; + return NULL; + } + + /* Not a floppy. Treat it as a normal file */ + + mode |= O_BINARY; + sb->fd = open(filename, mode); + if (sb->fd == -1) return strerror(errno); + sb->drvtype = CPMDRV_FILE; + sb->opened = 1; + return NULL; +} +/*}}}*/ +/* Device_setGeometry -- Set disk geometry */ /*{{{*/ +const char * Device_setGeometry(struct Device *this, int secLength, int sectrk, int tracks, off_t offset, const char *libdskGeometry) +{ + int n; + + this->secLength=secLength; + this->sectrk=sectrk; + this->tracks=tracks; + // Bill Buckels - add this->offset + this->offset=offset; + + + // Bill Buckels - not sure what to do here + if (this->drvtype == CPMDRV_WIN95) + { + DRIVEPARAMS drvp; + memset(&drvp, 0, sizeof(drvp)); + if (GetDriveParams( this->hdisk, this->fd, &drvp )) return "GetDriveParams failed"; + + drvp.bytespersector = secLength; + drvp.sectorspertrack = sectrk; + drvp.totalsectors = sectrk * tracks; + +/* Guess the cylinder/head configuration from the track count. This will + * get single-sided 80-track discs wrong, but it's that or double-sided + * 40-track (or add cylinder/head counts to diskdefs) + */ + if (tracks < 44) + { + drvp.cylinders = tracks; + drvp.heads = 1; + } + else + { + drvp.cylinders = tracks / 2; + drvp.heads = 2; + } + +/* Set up "reasonable" values for the other members */ + + drvp.sectorspercluster = 1024 / secLength; + drvp.reservedsectors = 1; + drvp.numberofFATs = 2; + drvp.sectorcount = sectrk; + drvp.rootdirsize = 64; + drvp.mediaid = 0xF0; + drvp.hiddensectors = 0; + drvp.sectorsperfat = 3; + for (n = 0; n < sectrk; n++) + { + drvp.sectortable[n*2] = n + PHYSICAL_SECTOR_1; /* Physical sector numbers */ + drvp.sectortable[n*2+1] = secLength; + } + drvp.special = 6; +/* We have not set: + + drvp.mediatype + drvp.devicetype + drvp.deviceattrs + + which should have been read correctly by GetDriveParams(). + */ + SetDriveParams( this->hdisk, this->fd, &drvp ); + } + return NULL; +} +/*}}}*/ +/* Device_close -- Close an image file */ /*{{{*/ +const char *Device_close(struct Device *sb) +{ + sb->opened = 0; + switch(sb->drvtype) + { + case CPMDRV_WIN95: + UnlockLogicalVolume(sb->hdisk, sb->fd ); + if (!CloseHandle( sb->hdisk )) return strwin32error(); + return NULL; + + case CPMDRV_WINNT: + DismountVolume(sb->hdisk); + UnlockVolume(sb->hdisk); + if (!CloseHandle(sb->hdisk)) return strwin32error(); + return NULL; + } + if (close(sb->fd)) return strerror(errno); + return NULL; +} +/*}}}*/ +/* Device_readSector -- read a physical sector */ /*{{{*/ +const char *Device_readSector(const struct Device *drive, int track, int sector, char *buf) +{ + int res; + off_t offset; + + assert(sector>=0); + assert(sectorsectrk); + assert(track>=0); + assert(tracktracks); + + offset = ((sector+track*drive->sectrk)*drive->secLength); + + if (drive->drvtype == CPMDRV_WINNT) + { + LPVOID iobuffer; + DWORD bytesread; + + // Bill Buckels - add drive->offset + if (SetFilePointer(drive->hdisk, offset+drive->offset, NULL, FILE_BEGIN) == INVALID_FILE_SIZE) + { + return strwin32error(); + } + iobuffer = VirtualAlloc(NULL, drive->secLength, MEM_COMMIT, PAGE_READWRITE); + if (!iobuffer) + { + return strwin32error(); + } + res = ReadFile(drive->hdisk, iobuffer, drive->secLength, &bytesread, NULL); + if (!res) + { + char *lboo = strwin32error(); + VirtualFree(iobuffer, drive->secLength, MEM_RELEASE); + return lboo; + } + + memcpy(buf, iobuffer, drive->secLength); + VirtualFree(iobuffer, drive->secLength, MEM_RELEASE); + + if (bytesread < (unsigned)drive->secLength) + { + memset(buf + bytesread, 0, drive->secLength - bytesread); + } + return NULL; + } + + // Bill Buckels - not sure what to do here + if (drive->drvtype == CPMDRV_WIN95) + { + DIOC_REGISTERS reg; + BOOL bResult; + DWORD cb; + +#ifdef USE_INT13 + int cyl, head; + + if (drive->tracks < 44) { cyl = track; head = 0; } + else { cyl = track/2; head = track & 1; } + + reg.reg_EAX = 0x0201; /* Read 1 sector */ + reg.reg_EBX = (DWORD)buf; + reg.reg_ECX = (cyl << 8) | (sector + PHYSICAL_SECTOR_1); + reg.reg_EDX = (head << 8) | (drive->fd - 1); + reg.reg_Flags = 1; /* preset the carry flag */ + bResult = DeviceIoControl( drive->hdisk, VWIN32_DIOC_DOS_INT13, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); +#else + DISKIO di; + + reg.reg_EAX = drive->fd - 1; /* zero-based volume number */ + reg.reg_EBX = (DWORD)&di; + reg.reg_ECX = 0xffff; /* use DISKIO structure */ + reg.reg_Flags = 1; /* preset the carry flag */ + di.diStartSector = sector+track*drive->sectrk; + di.diSectors = 1; + di.diBuffer = (DWORD)buf; + bResult = DeviceIoControl( drive->hdisk, VWIN32_DIOC_DOS_INT25, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); + +#endif + if ( !bResult || (reg.reg_Flags & 1) ) + { + if (GetLastError()) return strwin32error(); + return "Unknown read error."; + } + return 0; + } + + // Bill Buckels - add drive->offset + if (lseek(drive->fd,offset+drive->offset,SEEK_SET)==-1) + { + return strerror(errno); + } + if ((res=read(drive->fd, buf, drive->secLength)) != drive->secLength) + { + if (res==-1) + { + return strerror(errno); + } + else memset(buf+res,0,drive->secLength-res); /* hit end of disk image */ + } + return NULL; +} +/*}}}*/ +/* Device_writeSector -- write physical sector */ /*{{{*/ +const char *Device_writeSector(const struct Device *drive, int track, int sector, const char *buf) +{ + off_t offset; + int res; + + assert(sector>=0); + assert(sectorsectrk); + assert(track>=0); + assert(tracktracks); + + offset = ((sector+track*drive->sectrk)*drive->secLength); + + if (drive->drvtype == CPMDRV_WINNT) + { + LPVOID iobuffer; + DWORD byteswritten; + + // Bill Buckels - add drive->offset + if (SetFilePointer(drive->hdisk, offset+drive->offset, NULL, FILE_BEGIN) == INVALID_FILE_SIZE) + { + return strwin32error(); + } + iobuffer = VirtualAlloc(NULL, drive->secLength, MEM_COMMIT, PAGE_READWRITE); + if (!iobuffer) + { + return strwin32error(); + } + memcpy(iobuffer, buf, drive->secLength); + res = WriteFile(drive->hdisk, iobuffer, drive->secLength, &byteswritten, NULL); + if (!res || (byteswritten < (unsigned)drive->secLength)) + { + char *lboo = strwin32error(); + VirtualFree(iobuffer, drive->secLength, MEM_RELEASE); + return lboo; + } + + VirtualFree(iobuffer, drive->secLength, MEM_RELEASE); + return NULL; + } + + // Bill Buckels - not sure what to do here + if (drive->drvtype == CPMDRV_WIN95) + { + DIOC_REGISTERS reg; + BOOL bResult; + DWORD cb; + +#ifdef USE_INT13 + int cyl, head; + + if (drive->tracks < 44) { cyl = track; head = 0; } + else { cyl = track/2; head = track & 1; } + + reg.reg_EAX = 0x0301; /* Write 1 sector */ + reg.reg_EBX = (DWORD)buf; + reg.reg_ECX = (cyl << 8) | (sector + PHYSICAL_SECTOR_1); + reg.reg_EDX = (head << 8) | (drive->fd - 1); + reg.reg_Flags = 1; /* preset the carry flag */ + bResult = DeviceIoControl( drive->hdisk, VWIN32_DIOC_DOS_INT13, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); +#else + DISKIO di; + + reg.reg_EAX = drive->fd - 1; /* zero-based volume number */ + reg.reg_EBX = (DWORD)&di; + reg.reg_ECX = 0xffff; /* use DISKIO structure */ + reg.reg_Flags = 1; /* preset the carry flag */ + di.diStartSector = sector+track*drive->sectrk; + di.diSectors = 1; + di.diBuffer = (DWORD)buf; + bResult = DeviceIoControl( drive->hdisk, VWIN32_DIOC_DOS_INT26, + ®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 ); +#endif + + if ( !bResult || (reg.reg_Flags & 1) ) + { + if (GetLastError()) return strwin32error(); + return "Unknown write error."; + } + return NULL; + } + + // Bill Buckels - add drive->offset + if (lseek(drive->fd,offset+drive->offset, SEEK_SET)==-1) + { + return strerror(errno); + } + if (write(drive->fd, buf, drive->secLength) == drive->secLength) return NULL; + return strerror(errno); +} +/*}}}*/ diff --git a/Tools/unix/cpmtools/diskdefs b/Tools/unix/cpmtools/diskdefs new file mode 100644 index 00000000..630317a0 --- /dev/null +++ b/Tools/unix/cpmtools/diskdefs @@ -0,0 +1,1396 @@ +diskdef ibm-3740 + seclen 128 + tracks 77 + sectrk 26 + blocksize 1024 + maxdir 64 + skew 6 + boottrk 2 + os 2.2 +end + +diskdef 4mb-hd + seclen 128 + tracks 1024 + sectrk 32 + blocksize 2048 + maxdir 256 + skew 1 + boottrk 0 + os p2dos +end + +diskdef pcw + seclen 512 + tracks 40 + sectrk 9 + blocksize 1024 + maxdir 64 + skew 1 + boottrk 1 + os 3 + libdsk:format pcw180 +end + +diskdef pc1.2m + seclen 512 + tracks 80 + # this format uses 15 sectors per track, but 30 per cylinder + sectrk 30 + blocksize 4096 + maxdir 256 + skew 1 + boottrk 0 + os 3 +end + +# CP/M 86 on 1.44MB floppies +diskdef cpm86-144feat + seclen 512 + tracks 160 + sectrk 18 + blocksize 4096 + maxdir 256 + skew 1 + boottrk 2 + os 3 + libdsk:format ibm1440 +end + +# CP/M 86 on 720KB floppies +diskdef cpm86-720 + seclen 512 + tracks 160 + sectrk 9 + blocksize 2048 + maxdir 256 + skew 1 + boottrk 2 + os 3 +end + +diskdef cf2dd + seclen 512 + tracks 160 + sectrk 9 + blocksize 2048 + maxdir 256 + skew 1 + boottrk 1 + os 3 + libdsk:format pcw720 +end + +#amstrad: values are read from super block (special name hardcoded) + +# Royal alphatronic +# setfdprm /dev/fd1 dd ssize=256 cyl=40 sect=16 head=2 +diskdef alpha + seclen 256 + tracks 40 + sectrk 32 + blocksize 2048 + maxdir 128 + skew 1 + boottrk 2 + os 2.2 +end + +# Apple II CP/M skew o Apple II DOS 3.3 skew +diskdef apple-do + seclen 256 + tracks 35 + sectrk 16 + blocksize 1024 + maxdir 64 + skewtab 0,6,12,3,9,15,14,5,11,2,8,7,13,4,10,1 + boottrk 3 + os 2.2 +end + +# Apple II CP/M skew o Apple II PRODOS skew +diskdef apple-po + seclen 256 + tracks 35 + sectrk 16 + blocksize 1024 + maxdir 64 + skewtab 0,9,3,12,6,15,1,10,4,13,7,8,2,11,5,14 + boottrk 3 + os 2.2 +end + +# MYZ80 hard drive (only works with libdsk, because it has a 256-byte header) +diskdef myz80 + seclen 1024 + tracks 64 + sectrk 128 + blocksize 4096 + maxdir 1024 + skew 1 + boottrk 0 + os 3 + libdsk:format pcw720 +end + +# Despite being Amstrad formats, CPC System and CPC Data don't have an Amstrad +# superblock. You'll need to use libdsk to access them because the Linux +# and Windows kernel drivers won't touch them. +diskdef cpcsys + seclen 512 + tracks 40 + sectrk 9 + blocksize 1024 + maxdir 64 + skew 1 + boottrk 2 + os 3 + libdsk:format cpcsys +end +diskdef cpcdata + seclen 512 + tracks 40 + sectrk 9 + blocksize 1024 + maxdir 64 + skew 1 + boottrk 0 + os 3 + libdsk:format cpcdata +end + +# after being read in with no sector skew. +diskdef nigdos + seclen 512 + # NigDos double sided disk format, 42 tracks * 2 sides + tracks 84 + sectrk 10 + blocksize 2048 + maxdir 128 + skew 1 + boottrk 0 + # this format wastes half of the directory entry + logicalextents 1 + os 3 +end + +diskdef epsqx10 + seclen 512 + tracks 40 + sectrk 20 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 +end + +diskdef ibm-8ss + seclen 512 + tracks 40 + sectrk 8 + blocksize 1024 + maxdir 64 + skew 0 + boottrk 1 + os 2.2 +end + +diskdef ibm-8ds + seclen 512 + tracks 40 + sectrk 8 + blocksize 1024 + maxdir 64 + skew 0 + boottrk 1 + os 2.2 +end + +diskdef electroglas + seclen 512 + tracks 80 + sectrk 10 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 1 + os 3 +end + +# IBM CP/M-86 +# setfdprm /dev/fd1 sect=8 dtr=1 hd ssize=512 tpi=48 head=1 +diskdef ibmpc-514ss + seclen 512 + tracks 40 + sectrk 8 + blocksize 1024 + maxdir 64 + skew 1 + boottrk 1 + os 2.2 + libdsk:format ibm160 +end + +# IBM CP/M-86 +# setfdprm /dev/fd1 sect=8 dtr=1 hd ssize=512 tpi=48 +diskdef ibmpc-514ds + seclen 512 + tracks 80 + sectrk 8 + blocksize 2048 + maxdir 64 + skew 0 + boottrk 2 + os 2.2 + libdsk:format ibm320 +end + +diskdef p112 + seclen 512 + tracks 160 + sectrk 18 + blocksize 2048 + maxdir 256 + skew 1 + boottrk 2 + os 3 +end + +diskdef p112-old + seclen 512 + tracks 160 + sectrk 18 + blocksize 2048 + maxdir 128 + skew 1 + boottrk 1 + os 3 +end + +diskdef gide-cfa + seclen 512 + tracks 1000 + sectrk 16 + blocksize 4096 + maxdir 1024 + skew 0 + boottrk 2 + os 3 +end + +diskdef gide-cfb + seclen 512 + tracks 1000 + sectrk 16 + blocksize 4096 + maxdir 1024 + skew 0 + boottrk 0 +# Start of second partition + offset 1000trk + os 3 +end + +# AT&T/Olivetti Word Processor +diskdef attwp + seclen 256 + tracks 80 + sectrk 32 + blocksize 2048 + maxdir 128 + boottrk 1 + logicalextents 1 + skewtab 0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15,16,18,20,22,24,26,28,30,17,19,21,23,25,27,29,31 + os 2.2 +end + +# setfdprm /dev/fd0 zerobased SS DD ssize=512 cyl=40 sect=10 head=1 +# Kaypro II +diskdef kpii + seclen 512 + tracks 40 + sectrk 10 + blocksize 1024 + maxdir 64 + skew 0 + boottrk 1 + os 2.2 +end + +# setfdprm /dev/fd0 zerobased DS DD ssize=512 cyl=40 sect=10 head=2 +# Kayro IV +diskdef kpiv + seclen 512 + tracks 80 + sectrk 10 + blocksize 2048 + maxdir 64 + skew 0 + boottrk 1 + os 2.2 +end + +# setfdprm /dev/fd0 dd sect=10 +diskdef interak + seclen 512 + tracks 80 + sectrk 20 + blocksize 4096 + maxdir 256 + skew 1 + boottrk 2 + os 2.2 +end + +# Timex FDD3000 3" +diskdef fdd3000 + seclen 256 + tracks 40 + sectrk 16 + blocksize 1024 + maxdir 128 + boottrk 4 + os 2.2 + skew 7 +end + +# Timex FDD3000 3" +diskdef fdd3000_2 + seclen 256 + tracks 40 + sectrk 16 + blocksize 1024 + maxdir 128 + boottrk 2 + os 2.2 + skew 5 +end + +# Robotron 1715 +diskdef 1715 + seclen 1024 + tracks 40 + sectrk 5 + blocksize 1024 + maxdir 64 + skew 0 + boottrk 3 + os 2.2 +end + +# Robotron 1715 with SCP3 +diskdef 17153 + seclen 1024 + tracks 160 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 4 + os 3 +end + +#DDR +diskdef scp624 + seclen 256 + tracks 160 + sectrk 16 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 +end + +diskdef scp640 + seclen 256 + tracks 160 + sectrk 16 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 0 + os 2.2 +end + +diskdef scp780 + seclen 1024 + tracks 160 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 +end + +diskdef scp800 + seclen 1024 + tracks 160 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 0 + os 2.2 +end + +diskdef z9001 + seclen 1024 + tracks 160 + sectrk 5 + blocksize 2048 + maxdir 192 + skew 0 + boottrk 0 + os 2.2 +end + +# Visual Technology Visual 1050 computer +diskdef v1050 + seclen 512 + tracks 80 + sectrk 10 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 3 +end + +# Microbee 40 track 5.25" disks +diskdef microbee40 + seclen 512 + tracks 80 + sectrk 10 + blocksize 2048 + maxdir 128 + skewtab 1,4,7,0,3,6,9,2,5,8 + boottrk 2 + os 2.2 +end + +diskdef dreamdisk40 + seclen 512 + tracks 80 + sectrk 10 + blocksize 2048 + maxdir 128 + skewtab 1,4,7,0,3,6,9,2,5,8 + boottrk 2 + os 2.2 +end + +diskdef dreamdisk80 + seclen 512 + tracks 160 + sectrk 10 + blocksize 2048 + maxdir 256 + skewtab 1,4,7,0,3,6,9,2,5,8 + boottrk 2 + os 2.2 +end + +diskdef rc759 + seclen 1024 + tracks 154 + sectrk 8 + blocksize 2048 + maxdir 512 + boottrk 4 + os 3 +end + +# ICL Comet: 40 track 5.25" Single Sided +# +diskdef icl-comet-525ss + seclen 512 + tracks 40 + sectrk 10 + blocksize 1024 + maxdir 64 + skewtab 0,3,6,9,2,5,8,1,4,7 + boottrk 2 + os 2.2 +end + +diskdef z80pack-hd + seclen 128 + tracks 255 + sectrk 128 + blocksize 2048 + maxdir 1024 + skew 0 + boottrk 0 + os 2.2 +end + +diskdef z80pack-hdb + seclen 128 + tracks 256 + sectrk 16384 + blocksize 16384 + maxdir 8192 + skew 0 + boottrk 0 + os 2.2 +end + +# Bondwell 12 and 14 disk images in IMD raw binary format +diskdef bw12 + seclen 256 + tracks 40 + sectrk 18 + blocksize 2048 + maxdir 64 + skew 1 + boottrk 2 + os 2.2 +end + +diskdef bw14 + seclen 256 + tracks 80 + sectrk 18 + blocksize 2048 + maxdir 64 + skew 1 + boottrk 2 + os 2.2 +end + +############################ +# north star cp/m disks +############################ + +#North Star floppy 360K + +diskdef nsfd + seclen 512 + tracks 70 + sectrk 10 + blocksize 2048 + maxdir 64 + skew 5 + boottrk 2 + os 2.2 +end + + +#North Star CP/M Virtual-Disk file on Hard Disk +# prepared with allocation factor = 4 +# as in "CR CPMB 4000 4" +# needs to be copied off hard drive before you can +# work on it with cpmtools + +diskdef nshd4 + seclen 512 + tracks 512 + sectrk 16 + blocksize 4096 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + + +#North Star CP/M Virtual-Disk file on Hard Disk +# prepared with allocation factor = 8 +# as in "CR CPMB 6000 8" +# needs to be copied off hard drive before you can +# work on it with cpmtools + +diskdef nshd8 + seclen 512 + tracks 1024 + sectrk 16 + blocksize 8192 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + +# Northstar Micro-Disk System MDS-A-D 175 +diskdef mdsad175 + seclen 512 + blocksize 1024 + tracks 35 + maxdir 64 + boottrk 2 + sectrk 10 + skew 5 + os 2.2 +end + + +# Northstar Micro-Disk System MDS-A-D 350 +diskdef mdsad350 + seclen 512 + blocksize 2048 + tracks 70 + maxdir 64 + boottrk 2 + sectrk 10 + skew 5 + os 2.2 +end + + +# Osborne 1 +diskdef osborne1 + seclen 1024 + tracks 40 + sectrk 5 + blocksize 1024 + maxdir 64 + boottrk 3 + os 2.2 +end + +# Osborne Nuevo/Vixen/4 +diskdef osborne4 + seclen 1024 + tracks 80 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 2 + boottrk 2 + os 2.2 +end + +# Lobo Max-80 8" CP/M 2 +diskdef lobo2 + seclen 256 + tracks 77 + sectrk 30 + blocksize 2048 + maxdir 64 + skew 0 + boottrk 2 + os 2.2 +end + +#Lobo Max-80 8" CP/M 3 +diskdef lobo3 + seclen 512 + tracks 77 + sectrk 17 + blocksize 2048 + maxdir 64 + skew 0 + boottrk 2 + os 3 +end + +# PRO CP/M RZ50 DZ format (Perhaps only 79 tracks should be used?) +diskdef dec_pro + seclen 512 + tracks 80 + sectrk 10 + blocksize 2048 + maxdir 128 + skew 2 + boottrk 2 + os 2.2 +end + +# TDOS with DateStamper +diskdef tdos-ds + seclen 1024 + tracks 77 + sectrk 16 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 1 + os zsys +end + +# The following entires are tested and working +# Most of the images are either from Don Maslin's archive or from +# Dave Dunfield's site, but not all - they are noted as well as +# their size. + +# PMC Micromate +# Dave Dunfield's Imagedisk information from DSK conversion from IMD: +# IMageDisk Utility 1.18 / Mar 07 2012 +# IMD 1.14: 10/03/2007 11:13:27 +# PMC-101 MicroMate +# CP/M Plus +# System Master +# Assuming 1:1 for Binary output +# 0/0 250 kbps DD 5x1024 +# 80 tracks(40/40), 400 sectors (12 Compressed) +# Entry derived from above - image size = 409,600, from Dave Dunfield +diskdef pmc101 + seclen 1024 + tracks 80 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 3 +end + +# BEGIN td143ssdd8 Turbo Dos 1.43 - SSDD 8" - 512 x 16 +# Test OK - image size = 630,784, from Don Maslin's archive +diskdef td143ssdd8 + seclen 512 + tracks 77 + sectrk 9 + blocksize 1024 + maxdir 64 + skew 0 + boottrk 0 + os 2.2 +# DENSITY MFM ,LOW +end + +# BEGIN headsdd8 Heath H89, Magnolia CP/M - SSDD 8" - 512 x 16 +# Test OK - image size = 630,784, from Don Maslin's archive +diskdef heassdd8 + seclen 512 + tracks 77 + sectrk 16 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 +# DENSITY MFM ,LOW +end + +# Morrow Designs Micro-Decision DOUBLE +# 64k CP/M Vers. 2.2 Rev.2.3 SIDED +# Copyright '76, '77, '78, '79, '80 +# Digital Research +# Copyright 1982,1983 Morrow Designs, Inc. +# Assuming 1:1 for Binary output +# 0/0 250 kbps DD 5x1024 +# 80 tracks(40/40), 400 sectors (128 Compressed) +# Entry derived from above data +# Test OK - image siae = 409600, from Dave Dunfield +diskdef mordsdd + seclen 1024 + tracks 80 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 3 + boottrk 2 + OS 2.2 +end + + +# BEGIN morsddd Morrow MD2 - SSDD 48 tpi 5.25" - 1024 x 5 +# Test OK - image size = 204,800, from Don Maslin's archive +# Also tested with image from Dave Dunfield +diskdef morsddd + seclen 1024 + tracks 40 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 3 + boottrk 2 + os 2.2 +# DENSITY MFM ,LOW +# BSH 4 BLM 15 EXM 1 DSM 94 DRM 127 AL0 0C0H AL1 0 OFS 2 +end + +# BEGIN osb1sssd Osborne 1 - SSSD 48 tpi 5.25" - 256 x 10 +# Test OK - image size = 102,400, from Don Maslin's archive +diskdef osb1sssd + seclen 256 + tracks 40 + sectrk 10 + blocksize 2048 + maxdir 64 + skew 2 + boottrk 3 + os 2.2 +# DENSITY MFM ,LOW +# BSH 4 BLM 15 EXM 1 DSM 45 DRM 63 AL0 080H AL1 0 OFS 3 +end + +# BEGIN ampdsdd Ampro - DSDD 48 tpi 5.25" - 512 x 10 +# Test OK - image size = 409,600, from Don Maslin's archive +diskdef ampdsdd + seclen 1024 + tracks 80 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 + libdsk:format ampro400d +# DENSITY MFM ,LOW +# BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2 +end + +# BEGIN ampdsdd80 Ampro - DSDD 96 tpi 5.25" - 512 x 10 +# Test OK - image size = 819,200, from Don Maslin's archive +diskdef ampdsdd80 + seclen 1024 + tracks 160 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 + libdsk:format ampro800 +# DENSITY MFM ,LOW +# BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2 +end + +# BEGIN altdsdd Altos - DSDD 5" - 512 x 9 +# Test OK - both CP/M and MP/M - image size = 737,280, from Dave Dunfield +diskdef altdsdd + seclen 512 + tracks 160 + sectrk 9 + blocksize 4096 + maxdir 177 + skew 0 + boottrk 2 + os 3 +# DENSITY MFM ,HIGH +# BSH 5 BLM 31 EXM 3 DSM 176 DRM 176 AL0 0C0H AL1 0 OFS 2 +end + +# BEGIN trsomsssd TRS-80 Model 1, Omikron CP/M - SSSD 48 tpi 5.25" - 128 x 18 +# Test OK - image size = 80,640, from TRS-80 Yahoo Group posting +diskdef trsomsssd + seclen 128 + tracks 35 + sectrk 18 + blocksize 1024 + maxdir 64 + skew 4 + boottrk 3 + os 2.2 +# DENSITY FM ,LOW +# BSH 3 BLM 7 EXM 0 DSM 71 DRM 63 AL0 0C0H AL1 0 OFS 3 +end + +# Memotech type 03, ie: 3.5" or 5.25", D/S, D/D, S/T +# 40 tracks, 2 sides, 16 sectors/track, 256 bytes/sector +# Bytes on the media = 2*40*16*256 = 327680 +# CP/M sees 26 128 byte records per track (similar to 8" disks). +# Tracks = 327680/(26*128) = 98 +# Data is in 2048 byte blocks, on track 2 onwards +# Blocks = ((98-2)*26*128)/2048 = 156, which agrees with DPB + +diskdef memotech-type03 + seclen 128 + tracks 98 + sectrk 26 + blocksize 2048 + maxdir 64 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 07, ie: 3.5" or 5.25", D/S, D/D, D/T +# 80 tracks, 2 sides, 16 sectors/track, 256 bytes/sector +# Bytes on the media = 2*80*16*256 = 655360 +# CP/M sees 26 128 byte records per track (similar to 8" disks). +# Tracks = 655360/(26*128) = 196 +# Data is in 2048 byte blocks, on track 2 onwards +# Blocks = ((196-2)*26*128)/2048 = 315, which agrees with DPB + +diskdef memotech-type07 + seclen 128 + tracks 196 + sectrk 26 + blocksize 2048 + maxdir 128 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 43, ie: 1MB Silicon Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for Silicon Discs includes blocks on the last incomplete track +# Tracks = 1048576/(26*128) = 315.07 +# Data is in 4096 byte blocks, on track 2 onwards +# Blocks = (1048576-2*26*128)/4096 = 254, which agrees with DPB +# Blocks = ((315-2)*26*128)/4096 = 254, so we don't need the 0.07 track +diskdef memotech-type43 + seclen 128 + tracks 315 + sectrk 26 + blocksize 4096 + maxdir 256 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 47, ie: 2MB Silicon Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for Silicon Discs includes blocks on the last incomplete track +# Tracks = 2097152/(26*128) = 630.15 +# Data is in 4096 byte blocks, on track 2 onwards +# Blocks = (2097152-2*26*128)/4096 = 510, which agrees with DPB +# Blocks = ((630-2)*26*128)/4096 = 510, so we don't need the 0.15 track +diskdef memotech-type47 + seclen 128 + tracks 630 + sectrk 26 + blocksize 4096 + maxdir 256 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 4B, ie: 4MB Silicon Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for Silicon Discs includes blocks on the last incomplete track +# Tracks = 4194304/(26*128) = 1260.3 +# Data is in 4096 byte blocks, on track 2 onwards +# Blocks = (4194304-2*26*128)/4096 = 1022, which agrees with DPB +# Blocks = ((1260-2)*26*128)/4096 = 1022, so we don't need the 0.3 track +diskdef memotech-type4B + seclen 128 + tracks 1260 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 4F, ie: 8MB Silicon Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for Silicon Discs includes blocks on the last incomplete track +# Tracks = 8388608/(26*128) = 2520.61 +# Data is in 4096 byte blocks, on track 2 onwards +# Blocks = (8388608-2*26*128)/4096 = 2046, which agrees with DPB +# Blocks = ((2520-2)*26*128)/4096 = 2045, so we need the extra 0.61 track +diskdef memotech-type4F + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 18, ie: 8MB SD Card +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for SD Cards includes blocks on the last incomplete track +# Tracks = 8388608/(26*128) = 2520.61 +# Data is in 4096 byte blocks, on track 2 onwards +# Blocks = (8388608-2*26*128)/4096 = 2046, which agrees with DPB +# Blocks = ((2520-2)*26*128)/4096 = 2045, so we need the extra 0.61 track +diskdef memotech-type18 + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 19, ie: 8MB SD Card +diskdef memotech-type19 + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 + offset 8M +end + +# Memotech type 1A, ie: 8MB SD Card +diskdef memotech-type1A + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 + offset 16M +end + +# Memotech type 1B, ie: 8MB SD Card +diskdef memotech-type1B + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 + offset 24M +end + +# Memotech type 1C, ie: 8MB SD Card +diskdef memotech-type1C + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 + offset 32M +end + +# Memotech type 1D, ie: 8MB SD Card +diskdef memotech-type1D + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 + offset 40M +end + +# Memotech type 1E, ie: 8MB SD Card +diskdef memotech-type1E + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 + offset 48M +end + +# Memotech type 1F, ie: 8MB SD Card +diskdef memotech-type1F + seclen 128 + tracks 2521 + sectrk 26 + blocksize 4096 + maxdir 512 + skew 1 + boottrk 2 + os 2.2 + offset 56M +end + +# Memotech type 50, ie: 256KB RAM Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for RAM Discs includes blocks on the last incomplete track +# Tracks = 262144/(26*128) = 78.76 +# Data is in 1024 byte blocks, on track 2 onwards +# Blocks = (262144-2*26*128)/1024 = 249, which agrees with DPB +# Blocks = ((78-2)*26*128)/1024 = 247, so we need the extra 0.76 track +diskdef memotech-type50 + seclen 128 + tracks 79 + sectrk 26 + blocksize 1024 + maxdir 64 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 51, ie: 512KB RAM Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for RAM Discs includes blocks on the last incomplete track +# Tracks = 524288/(26*128) = 157.53 +# Data is in 2048 byte blocks, on track 2 onwards +# Blocks = (524288-2*26*128)/2048 = 252, which agrees with DPB +# Blocks = ((157-2)*26*128)/2048 = 251, so we need the extra 0.53 track +diskdef memotech-type51 + seclen 128 + tracks 158 + sectrk 26 + blocksize 2048 + maxdir 128 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 51, as used in Italy, ie: 480KB RAM Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for RAM Discs includes blocks on the last incomplete track +# Tracks = 491520/(26*128) = 147.69 +# Data is in 2048 byte blocks, on track 2 onwards +# Blocks = (491520-2*26*128)/2048 = 236, which agrees with DPB +# Blocks = ((147-2)*26*128)/2048 = 235, so we need the extra 0.69 track +diskdef memotech-type51-italy + seclen 128 + tracks 148 + sectrk 26 + blocksize 2048 + maxdir 128 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 51, after S2R64.COM, ie: 448KB RAM Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for RAM Discs includes blocks on the last incomplete track +# Tracks = 458752/(26*128) = 137.84 +# Data is in 2048 byte blocks, on track 2 onwards +# Blocks = (458752-2*26*128)/2048 = 220, which agrees with DPB, after S2R64.COM +# Blocks = ((137-2)*26*128)/2048 = 219, so we need the extra 0.84 track +diskdef memotech-type51-s2r64 + seclen 128 + tracks 138 + sectrk 26 + blocksize 2048 + maxdir 128 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 51, after S2R.COM, ie: 144KB RAM Disc +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for RAM Discs includes blocks on the last incomplete track +# Tracks = 147456/(26*128) = 44.3 +# Data is in 2048 byte blocks, on track 2 onwards +# Blocks = (147456-2*26*128)/2048 = 68, which agrees with DPB, after S2R.COM +# Blocks = ((44-2)*26*128)/2048 = 68, so we don't need the extra 0.3 track +diskdef memotech-type51-s2r + seclen 128 + tracks 44 + sectrk 26 + blocksize 2048 + maxdir 128 + skew 1 + boottrk 2 + os 2.2 +end + +# Memotech type 52, ie: 320KB RAM Disc +# Added for REMEMOTECH +# CP/M sees 26 128 byte records per track +# Note: Unlike common practice with real physical disks, with real geometry, +# the DPB for RAM Discs includes blocks on the last incomplete track +# Tracks = 327680/(26*128) = 98.46 +# Data is in 2048 byte blocks, on track 2 onwards +# Blocks = (327680-2*26*128)/2048 = 156 +# Blocks = ((98-2)*26*128)/2048 = 156, so we don't need the extra 0.46 track +# This type very deliberately and conveniently exactly matches type 03 +diskdef memotech-type52 + seclen 128 + tracks 98 + sectrk 26 + blocksize 2048 + maxdir 64 + skew 1 + boottrk 2 + os 2.2 +end + +# Research Machines 380Z/480Z 5.25" "Single Density" or "MDS" format. +# All tracks are formatted FM 16x128. +diskdef rm-sd + seclen 128 + tracks 40 + sectrk 16 + blocksize 1024 + maxdir 64 + skew 3 + boottrk 3 + os 2.2 +end + +# Research Machines 380Z/480Z 5.25" "Double Density" or "MD" format. +# Track 0 is formatted FM 16x128; 1+ are MFM 9x512. +# If you're working with an image file, make sure that track 0 is +# padded to be the same size as the other tracks. +diskdef rm-dd + seclen 512 + tracks 40 + sectrk 9 + blocksize 1024 + maxdir 64 + skew 5 + boottrk 3 + os 2.2 +end + +# Research Machines 380Z/480Z 5.25" "Quad Density" or "MQ" format. +# Track 0 is formatted FM 16x128; 1+ are MFM 9x512. +diskdef rm-qd + seclen 512 + tracks 80 + sectrk 9 + blocksize 2048 + maxdir 128 + skew 5 + boottrk 3 + os 2.2 +end + +# Ampro Little Board Z80 running CP/M 2.21 +# BEGIN AMP1 Ampro - SSDD 48 tpi 5.25" +# DENSITY MFM, LOW +# CYLINDERS 40 SIDES 1 SECTORS 10,512 SKEW 2 +# SIDE1 0 1,2,3,4,5,6,7,8,9,10 +# BSH 4 BLM 15 EXM 1 DSM 94 DRM 63 AL0 080H AL1 0 OFS 2 +# END + +diskdef amp1 + seclen 512 #= Sectors xx,512 + tracks 40 #= (Cylinders * Sides) = 40*1 = 40 + sectrk 10 #= Sectors 10,xxx + blocksize 2048 #= (128*(BLM+1)) = 2048 + maxdir 64 #(DRM+1) = 64 + skew 0 #= SKEW = 0 + boottrk 2 #= OFS = 2 + os 2.2 +end + +#BEGIN AMP2 Ampro - DSDD 48 tpi 5.25" +#DENSITY MFM, LOW +#CYLINDERS 40 SIDES 2 +#SECTORS 10,512 +#SKEW 2 +#SIDE1 0 17,18,19,20,21,22,23,24,25,26 +#SIDE2 1 17,18,19,20,21,22,23,24,25,26 +#ORDER SIDES +#BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2 +#END + +# setfdprm /dev/fd0 DS DD ssize=512 cyl=40 sect=10 head=2 +diskdef amp2 + seclen 512 + tracks 80 + sectrk 10 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 +end + +#BEGIN AMP3 Ampro - SSDD 96 tpi 3.5" +#DENSITY MFM, LOW +#CYLINDERS 80 SIDES 1 SECTORS 5,1024 SKEW 2 +#SIDE1 0 1,2,3,4,5 +#BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2 +#END + +# setfdprm /dev/fd0 SS DD ssize=1024 cyl=80 sect=5 head=1 +diskdef amp3 + seclen 1024 + tracks 80 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 +end + +#BEGIN AMP4 Ampro - DSDD 96 tpi 3.5" +#DENSITY MFM, LOW +#CYLINDERS 80 SIDES 2 SECTORS 5,1024 SKEW 2 +#SIDE1 0 17,18,19,20,21 +#SIDE2 1 17,18,19,20,21 +#ORDER SIDES +#BSH 4 BLM 15 EXM 0 DSM 394 DRM 255 AL0 0F0H AL1 0 OFS 2 +#END + +# setfdprm /dev/fd0 DS DD ssize=1024 cyl=80 sect=5 head=2 +diskdef amp4 + seclen 1024 + tracks 160 + sectrk 5 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 2 + os 2.2 +end + +#BEGIN AMP5 Ampro - SSDD 3.5" +#DENSITY MFM, LOW +#CYLINDERS 80 SIDES 1 SECTORS 5,1024 SKEW 2 +#SIDE1 0 1,2,3,4,5 +#BSH 4 BLM 15 EXM 1 DSM 194 DRM 127 AL0 0C0H AL1 0 OFS 2 +#END + +# setfdprm /dev/fd0 SS DD ssize=1024 cyl=80 sect=5 head=1 +diskdef amp5 + seclen 1024 + tracks 80 + sectrk 5 + blocksize 2048 + maxdir 128 + skew 0 + boottrk 2 + os 2.2 +end + +#BEGIN AMP6 Ampro - DSDD 3.5" +#DENSITY MFM, LOW +#CYLINDERS 80 SIDES 2 SECTORS 5,1024 SKEW 2 +#SIDE1 0 17,18,19,20,21 +#SIDE2 1 17,18,19,20,21 +#ORDER SIDES +#BSH 4 BLM 15 EXM 0 DSM 394 DRM 255 AL0 0F0H AL1 0 OFS 2 +#END + +# setfdprm /dev/fd0 DS DD ssize=1024 cyl=80 sect=5 head=2 +diskdef amp6 + seclen 1024 + tracks 160 + sectrk 5 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 2 + os 2.2 +end + +diskdef ampro800 + seclen 1024 + tracks 160 + sectrk 5 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 2 + os 2.2 +end diff --git a/Tools/unix/cpmtools/fsck.cpm.1 b/Tools/unix/cpmtools/fsck.cpm.1 new file mode 100644 index 00000000..a167ef0e --- /dev/null +++ b/Tools/unix/cpmtools/fsck.cpm.1 @@ -0,0 +1,80 @@ +.TH FSCK.CPM 1 "October 25, 2014" "CP/M tools" "User commands" +.SH NAME ..\"{{{roff}}}\"{{{ +fsck.cpm \- check a CP/M file system +.\"}}} +.SH SYNOPSIS .\"{{{ +.ad l +.B fsck.cpm +.RB [ \-f +.IR format ] +.RB [ \-n ] +.I image +.ad b +.\"}}} +.SH DESCRIPTION .\"{{{ +\fBfsck.cpm\fP is used to check and repair a CP/M file system. After +reading the directory, it makes two passes. The first pass checks extent +fields for range and format violations (bad status, extent number, last +record byte count, file name, extension, block number, record count, +size of \&.COM files, time stamp format, invalid password characters, +invalid time stamp mode). The second pass checks extent connectivity +(multiple allocated blocks and duplicate directory entries). +.P +\fBfsck.cpm\fP can not yet repair all errors. +.\"}}} +.SH OPTIONS .\"{{{ +.IP "\fB\-f\fP \fIformat\fP" +Use the given CP/M disk \fIformat\fP instead of the default format. +.IP "\fB\-T\fP \fIlibdsk-type\fP" +libdsk driver type, e.g. \fBtele\fP for Teledisk images or \fBraw\fP for raw images +(requires building cpmtools with support for libdsk). +.IP "\fB\-n\fP" +Open the file system read-only and do not repair any errors. +.\"}}} +.SH "RETURN VALUE" .\"{{{ +Upon successful completion, exit code 0 is returned. +.\"}}} +.SH ERRORS .\"{{{ +Any errors are indicated by exit code 1. +.\"}}} +.SH FILES .\"{{{ +${prefix}/share/diskdefs CP/M disk format definitions +.\"}}} +.SH ENVIRONMENT \"{{{ +CPMTOOLSFMT Default format +.\"}}} +.SH DIAGNOSTICS .\"{{{ +.IP "\fIimage\fP: \fIused\fP/\fItotal\fP files (\fIn\fP.\fIn\fP% non-contiguos), \fIused\fP/\fItotal\fP blocks" +No inconsistencies could be found. The number of used files actually +is the number of used extents. Since a file may use more than +one extent, this may be greather than the actual number of files, but a +correct measure would not reflect how many files could still be created +at most. A file is considered fragmented, if sequential data blocks +pointed to by the same extent do not have sequential block numbers. +The number of used blocks includes the blocks used for system tracks +and the directory. +.\"}}} +.SH AUTHORS .\"{{{ +This program is copyright 1997\(en2012 Michael Haardt +. The Windows port is copyright 2000, 2001, 2011 John Elliott +. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License along +with this program. If not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\"}}} +.SH "SEE ALSO" .\"{{{ +.IR fsck (8), +.IR mkfs.cpm (1), +.IR cpm (5) +.\"}}} diff --git a/Tools/unix/cpmtools/fsck.cpm.c b/Tools/unix/cpmtools/fsck.cpm.c new file mode 100644 index 00000000..585015b0 --- /dev/null +++ b/Tools/unix/cpmtools/fsck.cpm.c @@ -0,0 +1,632 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "getopt_.h" +#include "cpmdir.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ +/* #defines */ /*{{{*/ +/* your favourite password *:-) */ + +#define T0 'G' +#define T1 'E' +#define T2 'H' +#define T3 'E' +#define T4 'I' +#define T5 'M' +#define T6 ' ' +#define T7 ' ' + +#define PB ((char)(T0+T1+T2+T3+T4+T5+T6+T7)) +#define P0 ((char)(T7^PB)) +#define P1 ((char)(T6^PB)) +#define P2 ((char)(T5^PB)) +#define P3 ((char)(T4^PB)) +#define P4 ((char)(T3^PB)) +#define P5 ((char)(T2^PB)) +#define P6 ((char)(T1^PB)) +#define P7 ((char)(T0^PB)) +/*}}}*/ + +/* types */ /*{{{*/ +enum Result { OK=0, MODIFIED=1, BROKEN=2 }; +/*}}}*/ +/* variables */ /*{{{*/ +static int norepair=0; +/*}}}*/ + +/* bcdCheck -- check format and range of BCD digit */ /*{{{*/ +static int bcdCheck(int n, int max, const char *msg, const char *unit, int extent1, int extent2) +{ + if (((n>>4)&0xf)>10 || (n&0xf)>10 || (((n>>4)&0xf)*10+(n&0xf))>=max) + { + printf("Error: Bad %s %s (extent=%d/%d, %s=%02x)\n",msg,unit,extent1,extent2,unit,n&0xff); + return -1; + } + else return 0; +} +/*}}}*/ +/* pwdCheck -- check password */ /*{{{*/ +static int pwdCheck(int extent, const char *pwd, char decode) +{ + char c; + int i; + + for (i=0; i<8; ++i) if ((c=((char)(pwd[7-i]^decode)))<' ' || c&0x80) + { + printf("Error: non-printable character in password (extent=%d, password=",extent); + for (i=0; i<8; ++i) + { + c=pwd[7-i]^decode; + if (c<' ' || c&0x80) + { + putchar('\\'); putchar('0'+((c>>6)&0x01)); + putchar('0'+((c>>3)&0x03)); + putchar('0'+(c&0x03)); + } + else putchar(c); + } + printf(")\n"); + return -1; + } + return 0; +} +/*}}}*/ +/* ask -- ask user and return answer */ /*{{{*/ +static int ask(const char *msg) +{ + while (1) + { + char buf[80]; + + if (norepair) return 0; + printf("%s [Y]? ",msg); fflush(stdout); + if (fgets(buf,sizeof(buf),stdin)==(char*)0) exit(1); + switch (toupper(buf[0])) + { + case '\n': + case 'Y': return 1; + case 'N': return 0; + } + } +} +/*}}}*/ +/* prfile -- print file name */ /*{{{*/ +static char *prfile(struct cpmSuperBlock *sb, int extent) +{ + struct PhysDirectoryEntry *dir; + static char name[80]; + char *s=name; + int i; + char c; + + dir=sb->dir+extent; + for (i=0; i<8; ++i) + { + c=dir->name[i]; + if ((c&0x7f)<' ') + { + *s++='\\'; *s++=('0'+((c>>6)&0x01)); + *s++=('0'+((c>>3)&0x03)); + *s++=('0'+(c&0x03)); + } + else *s++=(c&0x7f); + } + *s++='.'; + for (i=0; i<3; ++i) + { + c=dir->ext[i]; + if ((c&0x7f)<' ') + { + *s++='\\'; *s++=('0'+((c>>6)&0x01)); + *s++=('0'+((c>>3)&0x03)); + *s++=('0'+(c&0x03)); + } + else *s++=(c&0x7f); + } + *s='\0'; + return name; +} +/*}}}*/ +/* fsck -- file system check */ /*{{{*/ +static int fsck(struct cpmInode *root, const char *image) +{ + /* variables */ /*{{{*/ + enum Result ret=OK; + int extent,extent2; + struct PhysDirectoryEntry *dir,*dir2; + struct cpmSuperBlock *sb=root->sb; + /*}}}*/ + + /* Phase 1: check extent fields */ /*{{{*/ + printf("Phase 1: check extent fields\n"); + for (extent=0; extentmaxdir; ++extent) + { + char *status; + int usedBlocks=0; + + dir=sb->dir+extent; + status=&dir->status; + if (*status>=0 && *status<=(sb->type==CPMFS_P2DOS ? 31 : 15)) /* directory entry */ /*{{{*/ + { + /* check name and extension */ /*{{{*/ + { + int i; + char *c; + + for (i=0; i<8; ++i) + { + c=&(dir->name[i]); + if (!ISFILECHAR(i,*c&0x7f) || islower(*c&0x7f)) + { + printf("Error: Bad name (extent=%d, name=\"%s\", position=%d)\n",extent,prfile(sb,extent),i); + if (ask("Remove file")) + { + *status=(char)0xE5; + ret|=MODIFIED; + break; + } + else ret|=BROKEN; + } + } + if (*status==(char)0xe5) continue; + for (i=0; i<3; ++i) + { + c=&(dir->ext[i]); + if (!ISFILECHAR(1,*c&0x7f) || islower(*c&0x7f)) + { + printf("Error: Bad name (extent=%d, name=\"%s\", position=%d)\n",extent,prfile(sb,extent),i); + if (ask("Remove file")) + { + *status=(char)0xE5; + ret|=MODIFIED; + break; + } + else ret|=BROKEN; + } + } + if (*status==(char)0xe5) continue; + } + /*}}}*/ + /* check extent number */ /*{{{*/ + if ((dir->extnol&0xff)>0x1f) + { + printf("Error: Bad lower bits of extent number (extent=%d, name=\"%s\", low bits=%d)\n",extent,prfile(sb,extent),dir->extnol&0xff); + if (ask("Remove file")) + { + *status=(char)0xE5; + ret|=MODIFIED; + } + else ret|=BROKEN; + } + if (*status==(char)0xe5) continue; + if ((dir->extnoh&0xff)>0x3f) + { + printf("Error: Bad higher bits of extent number (extent=%d, name=\"%s\", high bits=%d)\n",extent,prfile(sb,extent),dir->extnoh&0xff); + if (ask("Remove file")) + { + *status=(char)0xE5; + ret|=MODIFIED; + } + else ret|=BROKEN; + } + if (*status==(char)0xe5) continue; + /*}}}*/ + /* check last record byte count */ /*{{{*/ + if ((dir->lrc&0xff)>128) + { + printf("Error: Bad last record byte count (extent=%d, name=\"%s\", lrc=%d)\n",extent,prfile(sb,extent),dir->lrc&0xff); + if (ask("Clear last record byte count")) + { + dir->lrc=(char)0; + ret|=MODIFIED; + } + else ret|=BROKEN; + } + if (*status==(char)0xe5) continue; + /*}}}*/ + /* check block number range */ /*{{{*/ + { + int block,min,max,i; + + min=(sb->maxdir*32+sb->blksiz-1)/sb->blksiz; + max=sb->size; + for (i=0; i<16; ++i) + { + block=dir->pointers[i]&0xff; + if (sb->size>=256) block+=(dir->pointers[++i]&0xff)<<8; + if (block>0) + { + ++usedBlocks; + if (block=max) + { + printf("Error: Bad block number (extent=%d, name=\"%s\", block=%d)\n",extent,prfile(sb,extent),block); + if (ask("Remove file")) + { + *status=(char)0xE5; + ret|=MODIFIED; + break; + } + else ret|=BROKEN; + } + } + } + if (*status==(char)0xe5) continue; + } + /*}}}*/ + /* check number of used blocks ? */ /*{{{*/ + /*}}}*/ + /* check record count */ /*{{{*/ + { + int i,min,max,recordsInBlocks,used=0; + + min=(dir->extnol%sb->extents)*16/sb->extents; + max=((dir->extnol%sb->extents)+1)*16/sb->extents; + assert(minpointers[i] || (sb->size>=256 && dir->pointers[i+1])) ++used; + if (sb->size >= 256) ++i; + } + recordsInBlocks=(((unsigned char)dir->blkcnt)*128+sb->blksiz-1)/sb->blksiz; + if (recordsInBlocks!=used) + { + printf("Error: Bad record count (extent=%d, name=\"%s\", record count=%d)\n",extent,prfile(sb,extent),dir->blkcnt&0xff); + if (ask("Remove file")) + { + *status=(char)0xE5; + ret|=MODIFIED; + } + else ret|=BROKEN; + } + if (*status==(char)0xe5) continue; + } + /*}}}*/ + /* check for too large .com files */ /*{{{*/ + if (((EXTENT(dir->extnol,dir->extnoh)==3 && dir->blkcnt>=126) || EXTENT(dir->extnol,dir->extnoh)>=4) && (dir->ext[0]&0x7f)=='C' && (dir->ext[1]&0x7f)=='O' && (dir->ext[2]&0x7f)=='M') + { + printf("Warning: Oversized .COM file (extent=%d, name=\"%s\")\n",extent,prfile(sb,extent)); + } + /*}}}*/ + } + /*}}}*/ + else if ((sb->type==CPMFS_P2DOS || sb->type==CPMFS_DR3) && *status==33) /* check time stamps ? */ /*{{{*/ + { + unsigned long created,modified; + char s; + + if ((s=sb->dir[extent2=(extent&~3)].status)>=0 && s<=(sb->type==CPMFS_P2DOS ? 31 : 15)) /* time stamps for first of the three extents */ /*{{{*/ + { + bcdCheck(dir->name[2],24,sb->cnotatime ? "creation date" : "access date","hour",extent,extent2); + bcdCheck(dir->name[3],60,sb->cnotatime ? "creation date" : "access date","minute",extent,extent2); + bcdCheck(dir->name[6],24,"modification date","hour",extent,extent2); + bcdCheck(dir->name[7],60,"modification date","minute",extent,extent2); + created=(dir->name[4]+(dir->name[1]<<8))*(0x60*0x60)+dir->name[2]*0x60+dir->name[3]; + modified=(dir->name[0]+(dir->name[5]<<8))*(0x60*0x60)+dir->name[6]*0x60+dir->name[7]; + if (sb->cnotatime && modifieddir[extent2=(extent&~3)+1].status)>=0 && s<=(sb->type==CPMFS_P2DOS ? 31 : 15)) /* time stamps for second */ /*{{{*/ + { + bcdCheck(dir->lrc,24,sb->cnotatime ? "creation date" : "access date","hour",extent,extent2); + bcdCheck(dir->extnoh,60,sb->cnotatime ? "creation date" : "access date","minute",extent,extent2); + bcdCheck(dir->pointers[1],24,"modification date","hour",extent,extent2); + bcdCheck(dir->pointers[2],60,"modification date","minute",extent,extent2); + created=(dir->ext[2]+(dir->extnol<<8))*(0x60*0x60)+dir->lrc*0x60+dir->extnoh; + modified=(dir->blkcnt+(dir->pointers[0]<<8))*(0x60*0x60)+dir->pointers[1]*0x60+dir->pointers[2]; + if (sb->cnotatime && modifieddir[extent2=(extent&~3)+2].status)>=0 && s<=(sb->type==CPMFS_P2DOS ? 31 : 15)) /* time stamps for third */ /*{{{*/ + { + bcdCheck(dir->pointers[7],24,sb->cnotatime ? "creation date" : "access date","hour",extent,extent2); + bcdCheck(dir->pointers[8],60,sb->cnotatime ? "creation date" : "access date","minute",extent,extent2); + bcdCheck(dir->pointers[11],24,"modification date","hour",extent,extent2); + bcdCheck(dir->pointers[12],60,"modification date","minute",extent,extent2); + created=(dir->pointers[5]+(dir->pointers[6]<<8))*(0x60*0x60)+dir->pointers[7]*0x60+dir->pointers[8]; + modified=(dir->pointers[9]+(dir->pointers[10]<<8))*(0x60*0x60)+dir->pointers[11]*0x60+dir->pointers[12]; + if (sb->cnotatime && modifiedtype==CPMFS_DR3 && *status==32) /* disc label */ /*{{{*/ + { + unsigned long created,modified; + + bcdCheck(dir->pointers[10],24,sb->cnotatime ? "creation date" : "access date","hour",extent,extent); + bcdCheck(dir->pointers[11],60,sb->cnotatime ? "creation date" : "access date","minute",extent,extent); + bcdCheck(dir->pointers[14],24,"modification date","hour",extent,extent); + bcdCheck(dir->pointers[15],60,"modification date","minute",extent,extent); + created=(dir->pointers[8]+(dir->pointers[9]<<8))*(0x60*0x60)+dir->pointers[10]*0x60+dir->pointers[11]; + modified=(dir->pointers[12]+(dir->pointers[13]<<8))*(0x60*0x60)+dir->pointers[14]*0x60+dir->pointers[15]; + if (sb->cnotatime && modifiedextnol&0x40 && dir->extnol&0x10) + { + printf("Error: Bit 4 and 6 can only be exclusively be set (extent=%d, label byte=0x%02x)\n",extent,(unsigned char)dir->extnol); + if (ask("Time stamp on creation")) + { + dir->extnol&=~0x40; + ret|=MODIFIED; + } + else if (ask("Time stamp on access")) + { + dir->extnol&=~0x10; + ret|=MODIFIED; + } + else ret|=BROKEN; + } + if (dir->extnol&0x80 && pwdCheck(extent,dir->pointers,dir->lrc)) + { + char msg[80]; + + sprintf(msg,"Set password to %c%c%c%c%c%c%c%c",T0,T1,T2,T3,T4,T5,T6,T7); + if (ask(msg)) + { + dir->pointers[0]=P0; + dir->pointers[1]=P1; + dir->pointers[2]=P2; + dir->pointers[3]=P3; + dir->pointers[4]=P4; + dir->pointers[5]=P5; + dir->pointers[6]=P6; + dir->pointers[7]=P7; + dir->lrc=PB; + ret|=MODIFIED; + } + else ret|=BROKEN; + } + } + /*}}}*/ + else if (sb->type==CPMFS_DR3 && *status>=16 && *status<=31) /* password */ /*{{{*/ + { + /* check name and extension */ /*{{{*/ + { + int i; + char *c; + + for (i=0; i<8; ++i) + { + c=&(dir->name[i]); + if (!ISFILECHAR(i,*c&0x7f) || islower(*c&0x7f)) + { + printf("Error: Bad name (extent=%d, name=\"%s\", position=%d)\n",extent,prfile(sb,extent),i); + if (ask("Clear password entry")) + { + *status=(char)0xE5; + ret|=MODIFIED; + break; + } + else ret|=BROKEN; + } + } + if (*status==(char)0xe5) continue; + for (i=0; i<3; ++i) + { + c=&(dir->ext[i]); + if (!ISFILECHAR(1,*c&0x7f) || islower(*c&0x7f)) + { + printf("Error: Bad name (extent=%d, name=\"%s\", position=%d)\n",extent,prfile(sb,extent),i); + if (ask("Clear password entry")) + { + *status=(char)0xE5; + ret|=MODIFIED; + break; + } + else ret|=BROKEN; + } + } + if (*status==(char)0xe5) continue; + } + /*}}}*/ + /* check password */ /*{{{*/ + if (dir->extnol&(0x80|0x40|0x20) && pwdCheck(extent,dir->pointers,dir->lrc)) + { + char msg[80]; + + sprintf(msg,"Set password to %c%c%c%c%c%c%c%c",T0,T1,T2,T3,T4,T5,T6,T7); + if (ask(msg)) + { + dir->pointers[0]=P0; + dir->pointers[1]=P1; + dir->pointers[2]=P2; + dir->pointers[3]=P3; + dir->pointers[4]=P4; + dir->pointers[5]=P5; + dir->pointers[6]=P6; + dir->pointers[7]=P7; + dir->lrc=PB; + ret|=MODIFIED; + } + else ret|=BROKEN; + } + /*}}}*/ + } + /*}}}*/ + else if (*status!=(char)0xe5) /* bad status */ /*{{{*/ + { + printf("Error: Bad status (extent=%d, name=\"%s\", status=0x%02x)\n",extent,prfile(sb,extent),*status&0xff); + if (ask("Clear entry")) + { + *status=(char)0xE5; + ret|=MODIFIED; + } + else ret|=BROKEN; + continue; + } + /*}}}*/ + } + /*}}}*/ + /* Phase 2: check extent connectivity */ /*{{{*/ + printf("Phase 2: check extent connectivity\n"); + /* check multiple allocated blocks */ /*{{{*/ + for (extent=0; extentmaxdir; ++extent) if ((dir=sb->dir+extent)->status>=0 && dir->status<=(sb->type==CPMFS_P2DOS ? 31 : 15)) + { + int i,j,block,block2; + + for (i=0; i<16; ++i) + { + block=dir->pointers[i]&0xff; + if (sb->size>=256) block+=(dir->pointers[++i]&0xff)<<8; + for (extent2=0; extent2maxdir; ++extent2) if ((dir2=sb->dir+extent2)->status>=0 && dir2->status<=(sb->type==CPMFS_P2DOS ? 31 : 15)) + { + for (j=0; j<16; ++j) + { + block2=dir2->pointers[j]&0xff; + if (sb->size>=256) block2+=(dir2->pointers[++j]&0xff)<<8; + if (block!=0 && block2!=0 && block==block2 && !(extent==extent2 && i==j)) + { + printf("Error: Multiple allocated block (extent=%d,%d, name=\"%s\"",extent,extent2,prfile(sb,extent)); + printf(",\"%s\" block=%d)\n",prfile(sb,extent2),block); + ret|=BROKEN; + } + } + } + } + } + /*}}}*/ + /* check multiple extents */ /*{{{*/ + for (extent=0; extentmaxdir; ++extent) if ((dir=sb->dir+extent)->status>=0 && dir->status<=(sb->type==CPMFS_P2DOS ? 31 : 15)) + { + for (extent2=0; extent2maxdir; ++extent2) if ((dir2=sb->dir+extent2)->status>=0 && dir2->status<=(sb->type==CPMFS_P2DOS ? 31 : 15)) + { + if (extent!=extent2 && EXTENT(dir->extnol,dir->extnoh)==EXTENT(dir2->extnol,dir2->extnoh) && dir->status==dir2->status) + { + int i; + + for (i=0; i<8 && (dir->name[i]&0x7f)==(dir2->name[i]&0x7f); ++i); + if (i==8) + { + for (i=0; i<3 && (dir->ext[i]&0x7f)==(dir2->ext[i]&0x7f); ++i); + if (i==3) + { + printf("Error: Duplicate extent (extent=%d,%d)\n",extent,extent2); + ret|=BROKEN; + } + } + } + } + } + /*}}}*/ + /*}}}*/ + if (ret==0) /* print statistics */ /*{{{*/ + { + struct cpmStatFS statfsbuf; + int fragmented=0,borders=0; + + cpmStatFS(root,&statfsbuf); + for (extent=0; extentmaxdir; ++extent) if ((dir=sb->dir+extent)->status>=0 && dir->status<=(sb->type==CPMFS_P2DOS ? 31 : 15)) + { + int i,block,previous=-1; + + for (i=0; i<16; ++i) + { + block=dir->pointers[i]&0xff; + if (sb->size>=256) block+=(dir->pointers[++i]&0xff)<<8; + if (previous!=-1) + { + if (block!=0 && block!=(previous+1)) ++fragmented; + ++borders; + } + previous=block; + } + } + fragmented=(borders ? (1000*fragmented)/borders : 0); + printf("%s: %ld/%ld files (%d.%d%% non-contigous), %ld/%ld blocks\n",image,statfsbuf.f_files-statfsbuf.f_ffree,statfsbuf.f_files,fragmented/10,fragmented%10,statfsbuf.f_blocks-statfsbuf.f_bfree,statfsbuf.f_blocks); + } + /*}}}*/ + return ret; +} +/*}}}*/ + +const char cmd[]="fsck.cpm"; + +/* main */ /*{{{*/ +int main(int argc, char *argv[]) +{ + const char *err; + const char *image; + const char *format; + const char *devopts=NULL; + int c,usage=0; + struct cpmSuperBlock sb; + struct cpmInode root; + enum Result ret; + + if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT; + while ((c=getopt(argc,argv,"T:f:nh?"))!=EOF) switch(c) + { + case 'f': format=optarg; break; + case 'T': devopts=optarg; break; + case 'n': norepair=1; break; + case 'h': + case '?': usage=1; break; + } + + if (optind!=(argc-1)) usage=1; + else image=argv[optind++]; + + if (usage) + { + fprintf(stderr,"Usage: %s [-f format] [-n] image\n",cmd); + exit(1); + } + if ((err=Device_open(&sb.dev, image, (norepair ? O_RDONLY : O_RDWR), devopts))) + { + if ((err=Device_open(&sb.dev, image,O_RDONLY, devopts))) + { + fprintf(stderr,"%s: cannot open %s: %s\n",cmd,image,err); + exit(1); + } + else + { + fprintf(stderr,"%s: cannot open %s for writing, no repair possible\n",cmd,image); + } + } + if (cpmReadSuper(&sb,&root,format)==-1) + { + fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo); + exit(1); + } + ret=fsck(&root,image); + if (ret&MODIFIED) + { + if (cpmSync(&sb)==-1) + { + fprintf(stderr,"%s: write error on %s: %s\n",cmd,image,strerror(errno)); + ret|=BROKEN; + } + fprintf(stderr,"%s: FILE SYSTEM ON %s MODIFIED",cmd,image); + if (ret&BROKEN) fprintf(stderr,", PLEASE CHECK AGAIN"); + fprintf(stderr,"\n"); + } + cpmUmount(&sb); + if (ret&BROKEN) return 2; + else return 0; +} +/*}}}*/ diff --git a/Tools/unix/cpmtools/fsed.cpm.1 b/Tools/unix/cpmtools/fsed.cpm.1 new file mode 100644 index 00000000..a6d58738 --- /dev/null +++ b/Tools/unix/cpmtools/fsed.cpm.1 @@ -0,0 +1,62 @@ +.TH FSED.CPM 1 "October 25, 2014" "CP/M tools" "User commands" +.SH NAME ..\"{{{roff}}}\"{{{ +fsed.cpm \- edit a CP/M file system +.\"}}} +.SH SYNOPSIS .\"{{{ +.ad l +.B fsed.cpm +.RB [ \-f +.IR format ] +.I image +.ad b +.\"}}} +.SH DESCRIPTION .\"{{{ +\fBfsed.cpm\fP edits a CP/M file system on an image file or device. +It knows about the system, directory and data area, using sector skew on +the last two. Directory entries are decoded. The interactive usage is +self-explanatory. +.\"}}} +.SH OPTIONS .\"{{{ +.IP "\fB\-f\fP \fIformat\fP" +Use the given CP/M disk \fIformat\fP instead of the default format. +.IP "\fB\-T\fP \fIlibdsk-type\fP" +libdsk driver type, e.g. \fBtele\fP for Teledisk images or \fBraw\fP for raw images +(requires building cpmtools with support for libdsk). +.\"}}} +.SH "RETURN VALUE" .\"{{{ +Upon successful completion, exit code 0 is returned. +.\"}}} +.SH ERRORS .\"{{{ +Any errors are indicated by exit code 1. +.\"}}} +.SH ENVIRONMENT \"{{{ +CPMTOOLSFMT Default format +.\"}}} +.SH FILES .\"{{{ +${prefix}/share/diskdefs CP/M disk format definitions +.\"}}} +.SH AUTHORS \"{{{ +This program is copyright 1997\(en2012 Michael Haardt +. The Windows port is copyright 2000, 2001, 2011 John Elliott +. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License along +with this program. If not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\"}}} +.SH "SEE ALSO" .\"{{{ +.IR fsck.cpm (1), +.IR mkfs.cpm (1), +.IR cpmls (1), +.IR cpm (5) +.\"}}} diff --git a/Tools/unix/cpmtools/fsed.cpm.c b/Tools/unix/cpmtools/fsed.cpm.c new file mode 100644 index 00000000..f120b77c --- /dev/null +++ b/Tools/unix/cpmtools/fsed.cpm.c @@ -0,0 +1,748 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#if NEED_NCURSES +#if HAVE_NCURSES_NCURSES_H +#include +#else +#include +#endif +#else +#include +#endif +#include +#include +#include +#include +#include + +#include "cpmfs.h" +#include "getopt_.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ + +extern char **environ; + +static char *mapbuf; + +static struct tm *cpmtime(char lday, char hday, char hour, char min) /*{{{*/ +{ + static struct tm tm; + unsigned long days=(lday&0xff)|((hday&0xff)<<8); + int d; + unsigned int md[12]={31,0,31,30,31,30,31,31,30,31,30,31}; + + tm.tm_sec=0; + tm.tm_min=((min>>4)&0xf)*10+(min&0xf); + tm.tm_hour=((hour>>4)&0xf)*10+(hour&0xf); + tm.tm_mon=0; + tm.tm_year=1978; + tm.tm_isdst=-1; + if (days) --days; + while (days>=(d=(((tm.tm_year%400)==0 || ((tm.tm_year%4)==0 && (tm.tm_year%100))) ? 366 : 365))) + { + days-=d; + ++tm.tm_year; + } + md[1]=((tm.tm_year%400)==0 || ((tm.tm_year%4)==0 && (tm.tm_year%100))) ? 29 : 28; + while (days>=md[tm.tm_mon]) + { + days-=md[tm.tm_mon]; + ++tm.tm_mon; + } + tm.tm_mday=days+1; + tm.tm_year-=1900; + return &tm; +} +/*}}}*/ +static void info(struct cpmSuperBlock *sb, const char *format, const char *image) /*{{{*/ +{ + const char *msg; + + clear(); + msg="File system characteristics"; + move(0,(COLS-strlen(msg))/2); printw(msg); + move(2,0); printw(" Image: %s",image); + move(3,0); printw(" Format: %s",format); + move(4,0); printw(" File system: "); + switch (sb->type) + { + case CPMFS_DR22: printw("CP/M 2.2"); break; + case CPMFS_P2DOS: printw("P2DOS 2.3"); break; + case CPMFS_DR3: printw("CP/M Plus"); break; + } + + move(6,0); printw(" Sector length: %d",sb->secLength); + move(7,0); printw(" Number of tracks: %d",sb->tracks); + move(8,0); printw(" Sectors per track: %d",sb->sectrk); + + move(10,0);printw(" Block size: %d",sb->blksiz); + move(11,0);printw("Number of directory entries: %d",sb->maxdir); + move(12,0);printw(" Logical sector skew: %d",sb->skew); + move(13,0);printw(" Number of system tracks: %d",sb->boottrk); + move(14,0);printw(" Logical extents per extent: %d",sb->extents); + move(15,0);printw(" Allocatable data blocks: %d",sb->size-(sb->maxdir*32+sb->blksiz-1)/sb->blksiz); + + msg="Any key to continue"; + move(23,(COLS-strlen(msg))/2); printw(msg); + getch(); +} +/*}}}*/ +static void map(struct cpmSuperBlock *sb) /*{{{*/ +{ + const char *msg; + char bmap[18*80]; + int secmap,sys,directory; + int pos; + + clear(); + msg="Data map"; + move(0,(COLS-strlen(msg))/2); printw(msg); + + secmap=(sb->tracks*sb->sectrk+80*18-1)/(80*18); + memset(bmap,' ',sizeof(bmap)); + sys=sb->boottrk*sb->sectrk; + memset(bmap,'S',sys/secmap); + directory=(sb->maxdir*32+sb->secLength-1)/sb->secLength; + memset(bmap+sys/secmap,'D',directory/secmap); + memset(bmap+(sys+directory)/secmap,'.',sb->sectrk*sb->tracks/secmap); + + for (pos=0; pos<(sb->maxdir*32+sb->secLength-1)/sb->secLength; ++pos) + { + int entry; + + Device_readSector(&sb->dev,sb->boottrk+pos/(sb->sectrk*sb->secLength),pos/sb->secLength,mapbuf); + for (entry=0; entrysecLength/32 && (pos*sb->secLength/32)+entrymaxdir; ++entry) + { + int i; + + if (mapbuf[entry*32]>=0 && mapbuf[entry*32]<=(sb->type==CPMFS_P2DOS ? 31 : 15)) + { + for (i=0; i<16; ++i) + { + int sector; + + sector=mapbuf[entry*32+16+i]&0xff; + if (sb->size>=256) sector|=(((mapbuf[entry*32+16+ ++i]&0xff)<<8)); + if (sector>0 && sector<=sb->size) + { + /* not entirely correct without the last extent record count */ + sector=sector*(sb->blksiz/sb->secLength)+sb->sectrk*sb->boottrk; + memset(bmap+sector/secmap,'#',sb->blksiz/(sb->secLength*secmap)); + } + } + } + } + } + + for (pos=0; pos<(int)sizeof(bmap); ++pos) + { + move(2+pos%18,pos/18); + addch(bmap[pos]); + } + move(21,0); printw("S=System area D=Directory area #=File data .=Free"); + msg="Any key to continue"; + move(23,(COLS-strlen(msg))/2); printw(msg); + getch(); +} +/*}}}*/ +static void data(struct cpmSuperBlock *sb, const char *buf, unsigned long int pos) /*{{{*/ +{ + int offset=(pos%sb->secLength)&~0x7f; + unsigned int i; + + for (i=0; i<128; ++i) + { + move(4+(i>>4),(i&0x0f)*3+!!(i&0x8)); printw("%02x",buf[i+offset]&0xff); + if (pos%sb->secLength==i+offset) attron(A_REVERSE); + move(4+(i>>4),50+(i&0x0f)); printw("%c",isprint(buf[i+offset]) ? buf[i+offset] : '.'); + attroff(A_REVERSE); + } + move(4+((pos&0x7f)>>4),((pos&0x7f)&0x0f)*3+!!((pos&0x7f)&0x8)+1); +} +/*}}}*/ + +const char cmd[]="fsed.cpm"; + +int main(int argc, char *argv[]) /*{{{*/ +{ + /* variables */ /*{{{*/ + const char *devopts=(const char*)0; + char *image; + const char *err; + struct cpmSuperBlock drive; + struct cpmInode root; + const char *format; + int c,usage=0; + off_t pos; + chtype ch; + int reload; + char *buf; + /*}}}*/ + + /* parse options */ /*{{{*/ + if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT; + while ((c=getopt(argc,argv,"T:f:h?"))!=EOF) switch(c) + { + case 'f': format=optarg; break; + case 'T': devopts=optarg; break; + case 'h': + case '?': usage=1; break; + } + + if (optind!=(argc-1)) usage=1; + else image=argv[optind++]; + + if (usage) + { + fprintf(stderr,"Usage: fsed.cpm [-f format] image\n"); + exit(1); + } + /*}}}*/ + /* open image */ /*{{{*/ + if ((err=Device_open(&drive.dev,image,O_RDONLY,devopts))) + { + fprintf(stderr,"%s: cannot open %s (%s)\n",cmd,image,err); + exit(1); + } + if (cpmReadSuper(&drive,&root,format)==-1) + { + fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo); + exit(1); + } + /*}}}*/ + /* alloc sector buffers */ /*{{{*/ + if ((buf=malloc(drive.secLength))==(char*)0 || (mapbuf=malloc(drive.secLength))==(char*)0) + { + fprintf(stderr,"fsed.cpm: can not allocate sector buffer (%s).\n",strerror(errno)); + exit(1); + } + /*}}}*/ + /* init curses */ /*{{{*/ + initscr(); + noecho(); + raw(); + nonl(); + idlok(stdscr,TRUE); + idcok(stdscr,TRUE); + keypad(stdscr,TRUE); + clear(); + /*}}}*/ + + pos=0; + reload=1; + do + { + /* display position and load data */ /*{{{*/ + clear(); + move(2,0); printw("Byte %8lu (0x%08lx) ",pos,pos); + if (pos<(drive.boottrk*drive.sectrk*drive.secLength)) + { + printw("Physical sector %3lu ",((pos/drive.secLength)%drive.sectrk)+1); + } + else + { + printw("Sector %3lu ",((pos/drive.secLength)%drive.sectrk)+1); + printw("(physical %3d) ",drive.skewtab[(pos/drive.secLength)%drive.sectrk]+1); + } + printw("Offset %5lu ",pos%drive.secLength); + printw("Track %5lu",pos/(drive.secLength*drive.sectrk)); + move(LINES-3,0); printw("N)ext track P)revious track"); + move(LINES-2,0); printw("n)ext record p)revious record f)orward byte b)ackward byte"); + move(LINES-1,0); printw("i)nfo q)uit"); + if (reload) + { + if (pos<(drive.boottrk*drive.sectrk*drive.secLength)) + { + err=Device_readSector(&drive.dev,pos/(drive.secLength*drive.sectrk),(pos/drive.secLength)%drive.sectrk,buf); + } + else + { + err=Device_readSector(&drive.dev,pos/(drive.secLength*drive.sectrk),drive.skewtab[(pos/drive.secLength)%drive.sectrk],buf); + } + if (err) + { + move(4,0); printw("Data can not be read: %s",err); + } + else reload=0; + } + /*}}}*/ + + if /* position before end of system area */ /*{{{*/ + (pos<(drive.boottrk*drive.sectrk*drive.secLength)) + { + const char *msg; + + msg="System area"; move(0,(COLS-strlen(msg))/2); printw(msg); + move(LINES-3,36); printw("F)orward 16 byte B)ackward 16 byte"); + if (!reload) data(&drive,buf,pos); + switch (ch=getch()) + { + case 'F': /* next 16 byte */ /*{{{*/ + { + if (pos+16<(drive.sectrk*drive.tracks*(off_t)drive.secLength)) + { + if (pos/drive.secLength!=(pos+16)/drive.secLength) reload=1; + pos+=16; + } + break; + } + /*}}}*/ + case 'B': /* previous 16 byte */ /*{{{*/ + { + if (pos>=16) + { + if (pos/drive.secLength!=(pos-16)/drive.secLength) reload=1; + pos-=16; + } + break; + } + /*}}}*/ + } + } + /*}}}*/ + else if /* position before end of directory area */ /*{{{*/ + (pos<(drive.boottrk*drive.sectrk*drive.secLength+drive.maxdir*32)) + { + const char *msg; + unsigned long entrystart=(pos&~0x1f)%drive.secLength; + int entry=(pos-(drive.boottrk*drive.sectrk*drive.secLength))>>5; + int offset=pos&0x1f; + + msg="Directory area"; move(0,(COLS-strlen(msg))/2); printw(msg); + move(LINES-3,36); printw("F)orward entry B)ackward entry"); + + move(13,0); printw("Entry %3d: ",entry); + if /* free or used directory entry */ /*{{{*/ + ((buf[entrystart]>=0 && buf[entrystart]<=(drive.type==CPMFS_P2DOS ? 31 : 15)) || buf[entrystart]==(char)0xe5) + { + int i; + + if (buf[entrystart]==(char)0xe5) + { + if (offset==0) attron(A_REVERSE); + printw("Free"); + attroff(A_REVERSE); + } + else printw("Directory entry"); + move(15,0); + if (buf[entrystart]!=(char)0xe5) + { + printw("User: "); + if (offset==0) attron(A_REVERSE); + printw("%2d",buf[entrystart]); + attroff(A_REVERSE); + printw(" "); + } + printw("Name: "); + for (i=0; i<8; ++i) + { + if (offset==1+i) attron(A_REVERSE); + printw("%c",buf[entrystart+1+i]&0x7f); + attroff(A_REVERSE); + } + printw(" Extension: "); + for (i=0; i<3; ++i) + { + if (offset==9+i) attron(A_REVERSE); + printw("%c",buf[entrystart+9+i]&0x7f); + attroff(A_REVERSE); + } + move(16,0); printw("Extent: %3d",((buf[entrystart+12]&0xff)+((buf[entrystart+14]&0xff)<<5))/drive.extents); + printw(" (low: "); + if (offset==12) attron(A_REVERSE); + printw("%2d",buf[entrystart+12]&0xff); + attroff(A_REVERSE); + printw(", high: "); + if (offset==14) attron(A_REVERSE); + printw("%2d",buf[entrystart+14]&0xff); + attroff(A_REVERSE); + printw(")"); + move(17,0); printw("Last extent record count: "); + if (offset==15) attron(A_REVERSE); + printw("%3d",buf[entrystart+15]&0xff); + attroff(A_REVERSE); + move(18,0); printw("Last record byte count: "); + if (offset==13) attron(A_REVERSE); + printw("%3d",buf[entrystart+13]&0xff); + attroff(A_REVERSE); + move(19,0); printw("Data blocks:"); + for (i=0; i<16; ++i) + { + unsigned int block=buf[entrystart+16+i]&0xff; + if (drive.size>=256) + { + printw(" "); + if (offset==16+i || offset==16+i+1) attron(A_REVERSE); + printw("%5d",block|(((buf[entrystart+16+ ++i]&0xff)<<8))); + attroff(A_REVERSE); + } + else + { + printw(" "); + if (offset==16+i) attron(A_REVERSE); + printw("%3d",block); + attroff(A_REVERSE); + } + } + } + /*}}}*/ + else if /* disc label */ /*{{{*/ + (buf[entrystart]==0x20 && drive.type==CPMFS_DR3) + { + int i; + const struct tm *tm; + char s[30]; + + if (offset==0) attron(A_REVERSE); + printw("Disc label"); + attroff(A_REVERSE); + move(15,0); + printw("Label: "); + for (i=0; i<11; ++i) + { + if (i+1==offset) attron(A_REVERSE); + printw("%c",buf[entrystart+1+i]&0x7f); + attroff(A_REVERSE); + } + move(16,0); + printw("Bit 0,7: "); + if (offset==12) attron(A_REVERSE); + printw("Label %s",buf[entrystart+12]&1 ? "set" : "not set"); + printw(", password protection %s",buf[entrystart+12]&0x80 ? "set" : "not set"); + attroff(A_REVERSE); + move(17,0); + printw("Bit 4,5,6: "); + if (offset==12) attron(A_REVERSE); + printw("Time stamp "); + if (buf[entrystart+12]&0x10) printw("on create, "); + else printw("not on create, "); + if (buf[entrystart+12]&0x20) printw("on modification, "); + else printw("not on modifiction, "); + if (buf[entrystart+12]&0x40) printw("on access"); + else printw("not on access"); + attroff(A_REVERSE); + move(18,0); + printw("Password: "); + for (i=0; i<8; ++i) + { + char printable; + + if (offset==16+(7-i)) attron(A_REVERSE); + printable=(buf[entrystart+16+(7-i)]^buf[entrystart+13])&0x7f; + printw("%c",isprint(printable) ? printable : ' '); + attroff(A_REVERSE); + } + printw(" XOR value: "); + if (offset==13) attron(A_REVERSE); + printw("0x%02x",buf[entrystart+13]&0xff); + attroff(A_REVERSE); + move(19,0); + printw("Created: "); + tm=cpmtime(buf[entrystart+24],buf[entrystart+25],buf[entrystart+26],buf[entrystart+27]); + if (offset==24 || offset==25) attron(A_REVERSE); + strftime(s,sizeof(s),"%x",tm); + printw("%s",s); + attroff(A_REVERSE); + printw(" "); + if (offset==26) attron(A_REVERSE); + printw("%2d",tm->tm_hour); + attroff(A_REVERSE); + printw(":"); + if (offset==27) attron(A_REVERSE); + printw("%02d",tm->tm_min); + attroff(A_REVERSE); + printw(" Updated: "); + tm=cpmtime(buf[entrystart+28],buf[entrystart+29],buf[entrystart+30],buf[entrystart+31]); + if (offset==28 || offset==29) attron(A_REVERSE); + strftime(s,sizeof(s),"%x",tm); + printw("%s",s); + attroff(A_REVERSE); + printw(" "); + if (offset==30) attron(A_REVERSE); + printw("%2d",tm->tm_hour); + attroff(A_REVERSE); + printw(":"); + if (offset==31) attron(A_REVERSE); + printw("%02d",tm->tm_min); + attroff(A_REVERSE); + } + /*}}}*/ + else if /* time stamp */ /*{{{*/ + (buf[entrystart]==0x21 && (drive.type==CPMFS_P2DOS || drive.type==CPMFS_DR3)) + { + const struct tm *tm; + char s[30]; + + if (offset==0) attron(A_REVERSE); + printw("Time stamps"); + attroff(A_REVERSE); + move(15,0); + printw("3rd last extent: Created/Accessed "); + tm=cpmtime(buf[entrystart+1],buf[entrystart+2],buf[entrystart+3],buf[entrystart+4]); + if (offset==1 || offset==2) attron(A_REVERSE); + strftime(s,sizeof(s),"%x",tm); + printw("%s",s); + attroff(A_REVERSE); + printw(" "); + if (offset==3) attron(A_REVERSE); + printw("%2d",tm->tm_hour); + attroff(A_REVERSE); + printw(":"); + if (offset==4) attron(A_REVERSE); + printw("%02d",tm->tm_min); + attroff(A_REVERSE); + printw(" Modified "); + tm=cpmtime(buf[entrystart+5],buf[entrystart+6],buf[entrystart+7],buf[entrystart+8]); + if (offset==5 || offset==6) attron(A_REVERSE); + strftime(s,sizeof(s),"%x",tm); + printw("%s",s); + attroff(A_REVERSE); + printw(" "); + if (offset==7) attron(A_REVERSE); + printw("%2d",tm->tm_hour); + attroff(A_REVERSE); + printw(":"); + if (offset==8) attron(A_REVERSE); + printw("%02d",tm->tm_min); + attroff(A_REVERSE); + + move(16,0); + printw("2nd last extent: Created/Accessed "); + tm=cpmtime(buf[entrystart+11],buf[entrystart+12],buf[entrystart+13],buf[entrystart+14]); + if (offset==11 || offset==12) attron(A_REVERSE); + strftime(s,sizeof(s),"%x",tm); + printw("%s",s); + attroff(A_REVERSE); + printw(" "); + if (offset==13) attron(A_REVERSE); + printw("%2d",tm->tm_hour); + attroff(A_REVERSE); + printw(":"); + if (offset==14) attron(A_REVERSE); + printw("%02d",tm->tm_min); + attroff(A_REVERSE); + printw(" Modified "); + tm=cpmtime(buf[entrystart+15],buf[entrystart+16],buf[entrystart+17],buf[entrystart+18]); + if (offset==15 || offset==16) attron(A_REVERSE); + strftime(s,sizeof(s),"%x",tm); + printw("%s",s); + attroff(A_REVERSE); + printw(" "); + if (offset==17) attron(A_REVERSE); + printw("%2d",tm->tm_hour); + attroff(A_REVERSE); + printw(":"); + if (offset==18) attron(A_REVERSE); + printw("%02d",tm->tm_min); + attroff(A_REVERSE); + + move(17,0); + printw(" Last extent: Created/Accessed "); + tm=cpmtime(buf[entrystart+21],buf[entrystart+22],buf[entrystart+23],buf[entrystart+24]); + if (offset==21 || offset==22) attron(A_REVERSE); + strftime(s,sizeof(s),"%x",tm); + printw("%s",s); + attroff(A_REVERSE); + printw(" "); + if (offset==23) attron(A_REVERSE); + printw("%2d",tm->tm_hour); + attroff(A_REVERSE); + printw(":"); + if (offset==24) attron(A_REVERSE); + printw("%02d",tm->tm_min); + attroff(A_REVERSE); + printw(" Modified "); + tm=cpmtime(buf[entrystart+25],buf[entrystart+26],buf[entrystart+27],buf[entrystart+28]); + if (offset==25 || offset==26) attron(A_REVERSE); + strftime(s,sizeof(s),"%x",tm); + printw("%s",s); + attroff(A_REVERSE); + printw(" "); + if (offset==27) attron(A_REVERSE); + printw("%2d",tm->tm_hour); + attroff(A_REVERSE); + printw(":"); + if (offset==28) attron(A_REVERSE); + printw("%02d",tm->tm_min); + attroff(A_REVERSE); + } + /*}}}*/ + else if /* password */ /*{{{*/ + (buf[entrystart]>=16 && buf[entrystart]<=31 && drive.type==CPMFS_DR3) + { + int i; + + if (offset==0) attron(A_REVERSE); + printw("Password"); + attroff(A_REVERSE); + + move(15,0); + printw("Name: "); + for (i=0; i<8; ++i) + { + if (offset==1+i) attron(A_REVERSE); + printw("%c",buf[entrystart+1+i]&0x7f); + attroff(A_REVERSE); + } + printw(" Extension: "); + for (i=0; i<3; ++i) + { + if (offset==9+i) attron(A_REVERSE); + printw("%c",buf[entrystart+9+i]&0x7f); + attroff(A_REVERSE); + } + + move(16,0); + printw("Password required for: "); + if (offset==12) attron(A_REVERSE); + if (buf[entrystart+12]&0x80) printw("Reading "); + if (buf[entrystart+12]&0x40) printw("Writing "); + if (buf[entrystart+12]&0x20) printw("Deleting "); + attroff(A_REVERSE); + + move(17,0); + printw("Password: "); + for (i=0; i<8; ++i) + { + char printable; + + if (offset==16+(7-i)) attron(A_REVERSE); + printable=(buf[entrystart+16+(7-i)]^buf[entrystart+13])&0x7f; + printw("%c",isprint(printable) ? printable : ' '); + attroff(A_REVERSE); + } + printw(" XOR value: "); + if (offset==13) attron(A_REVERSE); + printw("0x%02x",buf[entrystart+13]&0xff); + attroff(A_REVERSE); + } + /*}}}*/ + else /* bad status */ /*{{{*/ + { + printw("Bad status "); + if (offset==0) attron(A_REVERSE); + printw("0x%02x",buf[entrystart]); + attroff(A_REVERSE); + } + /*}}}*/ + if (!reload) data(&drive,buf,pos); + switch (ch=getch()) + { + case 'F': /* next entry */ /*{{{*/ + { + if (pos+32<(drive.sectrk*drive.tracks*(off_t)drive.secLength)) + { + if (pos/drive.secLength!=(pos+32)/drive.secLength) reload=1; + pos+=32; + } + break; + } + /*}}}*/ + case 'B': /* previous entry */ /*{{{*/ + { + if (pos>=32) + { + if (pos/drive.secLength!=(pos-32)/drive.secLength) reload=1; + pos-=32; + } + break; + } + /*}}}*/ + } + } + /*}}}*/ + else /* data area */ /*{{{*/ + { + const char *msg; + + msg="Data area"; move(0,(COLS-strlen(msg))/2); printw(msg); + if (!reload) data(&drive,buf,pos); + ch=getch(); + } + /*}}}*/ + + /* process common commands */ /*{{{*/ + switch (ch) + { + case 'n': /* next record */ /*{{{*/ + { + if (pos+128<(drive.sectrk*drive.tracks*(off_t)drive.secLength)) + { + if (pos/drive.secLength!=(pos+128)/drive.secLength) reload=1; + pos+=128; + } + break; + } + /*}}}*/ + case 'p': /* previous record */ /*{{{*/ + { + if (pos>=128) + { + if (pos/drive.secLength!=(pos-128)/drive.secLength) reload=1; + pos-=128; + } + break; + } + /*}}}*/ + case 'N': /* next track */ /*{{{*/ + { + if ((pos+drive.sectrk*drive.secLength)<(drive.sectrk*drive.tracks*drive.secLength)) + { + pos+=drive.sectrk*drive.secLength; + reload=1; + } + break; + } + /*}}}*/ + case 'P': /* previous track */ /*{{{*/ + { + if (pos>=drive.sectrk*drive.secLength) + { + pos-=drive.sectrk*drive.secLength; + reload=1; + } + break; + } + /*}}}*/ + case 'b': /* byte back */ /*{{{*/ + { + if (pos) + { + if (pos/drive.secLength!=(pos-1)/drive.secLength) reload=1; + --pos; + } + break; + } + /*}}}*/ + case 'f': /* byte forward */ /*{{{*/ + { + if (pos+1 +#include +#include +#include + +#ifdef __VMS +# include +#endif + +#ifdef _LIBC +# include +#else +#if 0 +# include +# define _(msgid) gettext (msgid) +#else +# define _(msgid) (msgid) +#endif +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + +/* Unlike standard Unix `getopt', functions like `getopt_long' + let the user intersperse the options with the other arguments. + + As `getopt_long' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Using `getopt' or setting the environment variable POSIXLY_CORRECT + disables permutation. + Then the application's behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt_int.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Keep a global copy of all internal members of getopt_data. */ + +static struct _getopt_data getopt_data; + + +#if defined HAVE_DECL_GETENV && !HAVE_DECL_GETENV +extern char *getenv (); +#endif + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (d->__nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +static void +exchange (char **argv, struct _getopt_data *d) +{ + int bottom = d->__first_nonopt; + int middle = d->__last_nonopt; + int top = d->optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + d->__nonoption_flags_max_len), + '\0', top + 1 - d->__nonoption_flags_max_len); + d->__nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + d->__first_nonopt += (d->optind - d->__last_nonopt); + d->__last_nonopt = d->optind; +} + +/* Initialize the internal data when the first call is made. */ + +static const char * +_getopt_initialize (int argc, char **argv, const char *optstring, + int posixly_correct, struct _getopt_data *d) +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + d->__first_nonopt = d->__last_nonopt = d->optind; + + d->__nextchar = NULL; + + d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + d->__ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + d->__ordering = REQUIRE_ORDER; + ++optstring; + } + else if (d->__posixly_correct) + d->__ordering = REQUIRE_ORDER; + else + d->__ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (!d->__posixly_correct + && argc == __libc_argc && argv == __libc_argv) + { + if (d->__nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + d->__nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = d->__nonoption_flags_max_len = strlen (orig_str); + if (d->__nonoption_flags_max_len < argc) + d->__nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (d->__nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + d->__nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', d->__nonoption_flags_max_len - len); + } + } + d->__nonoption_flags_len = d->__nonoption_flags_max_len; + } + else + d->__nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. + + If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT + environment variable were set. */ + +int +_getopt_internal_r (int argc, char **argv, const char *optstring, + const struct option *longopts, int *longind, + int long_only, int posixly_correct, struct _getopt_data *d) +{ + int print_errors = d->opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + d->optarg = NULL; + + if (d->optind == 0 || !d->__initialized) + { + if (d->optind == 0) + d->optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring, + posixly_correct, d); + d->__initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ + || (d->optind < d->__nonoption_flags_len \ + && __getopt_nonoption_flags[d->optind] == '1')) +#else +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') +#endif + + if (d->__nextchar == NULL || *d->__nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (d->__last_nonopt > d->optind) + d->__last_nonopt = d->optind; + if (d->__first_nonopt > d->optind) + d->__first_nonopt = d->optind; + + if (d->__ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__last_nonopt != d->optind) + d->__first_nonopt = d->optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (d->optind < argc && NONOPTION_P) + d->optind++; + d->__last_nonopt = d->optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (d->optind != argc && !strcmp (argv[d->optind], "--")) + { + d->optind++; + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__first_nonopt == d->__last_nonopt) + d->__first_nonopt = d->optind; + d->__last_nonopt = argc; + + d->optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (d->optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (d->__first_nonopt != d->__last_nonopt) + d->optind = d->__first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (d->__ordering == REQUIRE_ORDER) + return -1; + d->optarg = argv[d->optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + d->__nextchar = (argv[d->optind] + 1 + + (longopts != NULL && argv[d->optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[d->optind][1] == '-' + || (long_only && (argv[d->optind][2] + || !strchr (optstring, argv[d->optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[d->optind]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[d->optind]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + d->optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + d->optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (argv[d->optind - 1][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("\ +%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); +#else + fprintf (stderr, _("\ +%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("\ +%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[d->optind - 1][0], + pfound->name); +#else + fprintf (stderr, _("\ +%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[d->optind - 1][0], + pfound->name); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + + d->__nextchar += strlen (d->__nextchar); + + d->optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[d->optind][1] == '-' + || strchr (optstring, *d->__nextchar) == NULL) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (argv[d->optind][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), + argv[0], d->__nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], d->__nextchar); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[d->optind][0], d->__nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[d->optind][0], d->__nextchar); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + d->__nextchar = (char *) ""; + d->optind++; + d->optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *d->__nextchar++; + char *temp = strchr (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*d->__nextchar == '\0') + ++d->optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (d->__posixly_correct) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: illegal option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); +#endif + } + else + { +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: invalid option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + d->optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, + _("%s: option requires an argument -- %c\n"), + argv[0], c) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `d->optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; + nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[d->optind]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[d->optind]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); +#endif + } + + d->__nextchar += strlen (d->__nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + d->__nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else + d->optarg = NULL; + d->__nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option requires an argument -- %c\n"), + argv[0], c) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + __fxprintf (NULL, "%s", buf); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + d->__nextchar = NULL; + } + } + return c; + } +} + +int +_getopt_internal (int argc, char **argv, const char *optstring, + const struct option *longopts, int *longind, + int long_only, int posixly_correct) +{ + int result; + + getopt_data.optind = optind; + getopt_data.opterr = opterr; + + result = _getopt_internal_r (argc, argv, optstring, longopts, longind, + long_only, posixly_correct, &getopt_data); + + optind = getopt_data.optind; + optarg = getopt_data.optarg; + optopt = getopt_data.optopt; + + return result; +} + +/* glibc gets a LSB-compliant getopt. + Standalone applications get a POSIX-compliant getopt. */ +#if _LIBC +enum { POSIXLY_CORRECT = 0 }; +#else +enum { POSIXLY_CORRECT = 1 }; +#endif + +int +getopt (int argc, char *const *argv, const char *optstring) +{ + return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0, + POSIXLY_CORRECT); +} + + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/Tools/unix/cpmtools/getopt1.c b/Tools/unix/cpmtools/getopt1.c new file mode 100644 index 00000000..7fa0c4e5 --- /dev/null +++ b/Tools/unix/cpmtools/getopt1.c @@ -0,0 +1,171 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004,2006 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef _LIBC +# include +#else +# include "config.h" +# include "getopt_.h" +#endif +#include "getopt_int.h" + +#include + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, (char **) argv, options, long_options, + opt_index, 0, 0); +} + +int +_getopt_long_r (int argc, char **argv, const char *options, + const struct option *long_options, int *opt_index, + struct _getopt_data *d) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 0, 0, d); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (int argc, char *__getopt_argv_const *argv, + const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, (char **) argv, options, long_options, + opt_index, 1, 0); +} + +int +_getopt_long_only_r (int argc, char **argv, const char *options, + const struct option *long_options, int *opt_index, + struct _getopt_data *d) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 1, 0, d); +} + + +#ifdef TEST + +#include + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/Tools/unix/cpmtools/getopt_.h b/Tools/unix/cpmtools/getopt_.h new file mode 100644 index 00000000..615ef9a3 --- /dev/null +++ b/Tools/unix/cpmtools/getopt_.h @@ -0,0 +1,226 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2005,2006,2007 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* Standalone applications should #define __GETOPT_PREFIX to an + identifier that prefixes the external functions and variables + defined in this header. When this happens, include the + headers that might declare getopt so that they will not cause + confusion if included after this file. Then systematically rename + identifiers so that they do not collide with the system functions + and variables. Renaming avoids problems with some compilers and + linkers. */ +#if defined __GETOPT_PREFIX && !defined __need_getopt +# include +# include +# include +# undef __need_getopt +# undef getopt +# undef getopt_long +# undef getopt_long_only +# undef optarg +# undef opterr +# undef optind +# undef optopt +# define __GETOPT_CONCAT(x, y) x ## y +# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) +# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) +# define getopt __GETOPT_ID (getopt) +# define getopt_long __GETOPT_ID (getopt_long) +# define getopt_long_only __GETOPT_ID (getopt_long_only) +# define optarg __GETOPT_ID (optarg) +# define opterr __GETOPT_ID (opterr) +# define optind __GETOPT_ID (optind) +# define optopt __GETOPT_ID (optopt) +#endif + +/* Standalone applications get correct prototypes for getopt_long and + getopt_long_only; they declare "char **argv". libc uses prototypes + with "char *const *argv" that are incorrect because getopt_long and + getopt_long_only can permute argv; this is required for backward + compatibility (e.g., for LSB 2.0.1). + + This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt', + but it caused redefinition warnings if both unistd.h and getopt.h were + included, since unistd.h includes getopt.h having previously defined + __need_getopt. + + The only place where __getopt_argv_const is used is in definitions + of getopt_long and getopt_long_only below, but these are visible + only if __need_getopt is not defined, so it is quite safe to rewrite + the conditional as follows: +*/ +#if !defined __need_getopt +# if defined __GETOPT_PREFIX +# define __getopt_argv_const /* empty */ +# else +# define __getopt_argv_const const +# endif +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + +#ifndef __THROW +# ifndef __GNUC_PREREQ +# define __GNUC_PREREQ(maj, min) (0) +# endif +# if defined __cplusplus && __GNUC_PREREQ (2,8) +# define __THROW throw () +# else +# define __THROW +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ + const char *name; + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `-', then non-option arguments are treated as + arguments to the option '\1'. This behavior is specific to the GNU + `getopt'. If OPTS begins with `+', or POSIXLY_CORRECT is set in + the environment, then do not permute arguments. */ + +extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) + __THROW; + +#ifndef __need_getopt +extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind) + __THROW; +extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind) + __THROW; + +#endif + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/Tools/unix/cpmtools/getopt_int.h b/Tools/unix/cpmtools/getopt_int.h new file mode 100644 index 00000000..401579fd --- /dev/null +++ b/Tools/unix/cpmtools/getopt_int.h @@ -0,0 +1,131 @@ +/* Internal declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _GETOPT_INT_H +#define _GETOPT_INT_H 1 + +extern int _getopt_internal (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only, int __posixly_correct); + + +/* Reentrant versions which can handle parsing multiple argument + vectors at the same time. */ + +/* Data type for reentrant functions. */ +struct _getopt_data +{ + /* These have exactly the same meaning as the corresponding global + variables, except that they are used for the reentrant + versions of getopt. */ + int optind; + int opterr; + int optopt; + char *optarg; + + /* Internal members. */ + + /* True if the internal members have been initialized. */ + int __initialized; + + /* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + char *__nextchar; + + /* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters, or by calling getopt. + + PERMUTE is the default. We permute the contents of ARGV as we + scan, so that eventually all the non-options are at the end. + This allows options to be given in any order, even with programs + that were not written to expect this. + + RETURN_IN_ORDER is an option available to programs that were + written to expect options and other ARGV-elements in any order + and that care about the ordering of the two. We describe each + non-option ARGV-element as if it were the argument of an option + with character code 1. Using `-' as the first character of the + list of option characters selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + + enum + { + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } __ordering; + + /* If the POSIXLY_CORRECT environment variable is set + or getopt was called. */ + int __posixly_correct; + + + /* Handle permutation of arguments. */ + + /* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first + of them; `last_nonopt' is the index after the last of them. */ + + int __first_nonopt; + int __last_nonopt; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + int __nonoption_flags_max_len; + int __nonoption_flags_len; +# endif +}; + +/* The initializer is necessary to set OPTIND and OPTERR to their + default values and to clear the initialization flag. */ +#define _GETOPT_DATA_INITIALIZER { 1, 1 } + +extern int _getopt_internal_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only, int __posixly_correct, + struct _getopt_data *__data); + +extern int _getopt_long_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + struct _getopt_data *__data); + +extern int _getopt_long_only_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind, + struct _getopt_data *__data); + +#endif /* getopt_int.h */ diff --git a/Tools/unix/cpmtools/mkfs.cpm.1 b/Tools/unix/cpmtools/mkfs.cpm.1 new file mode 100644 index 00000000..b31fb7ce --- /dev/null +++ b/Tools/unix/cpmtools/mkfs.cpm.1 @@ -0,0 +1,70 @@ +.TH MKFS.CPM 1 "October 25, 2014" "CP/M tools" "User commands" +.SH NAME \"{{{roff}}}\"{{{ +mkfs.cpm \- make a CP/M file system +.\"}}} +.SH SYNOPSIS \"{{{ +.ad l +.B mkfs.cpm +.RB [ \-f +.IR format ] +.RB [ \-b +.IR boot ] +.RB [ \-L +.IR label ] +.RB [ \-t ] +.I image +.ad b +.\"}}} +.SH DESCRIPTION \"{{{ +\fBmkfs.cpm\fP makes a CP/M file system on an image file or device. +.\"}}} +.SH OPTIONS \"{{{ +.IP "\fB\-f\fP \fIformat\fP" +Use the given CP/M disk \fIformat\fP instead of the default format. +.IP "\fB\-b\fP \fIbootblock\fP" +Write the contents of the file \fIbootblock\fP to the system tracks +instead of filling them with 0xe5. This option can be used up to four +times. The file contents (typically boot block, CCP, BDOS and BIOS) +are written to sequential sectors, padding with 0xe5 if needed. +.IP "\fB\-L\fP \fIlabel\fP" +Label the file system. This is only supported by CP/M Plus. +.IP "\fB\-t\fP" +Create time stamps. +.\"}}} +.SH "RETURN VALUE" \"{{{ +Upon successful completion, exit code 0 is returned. +.\"}}} +.SH ERRORS \"{{{ +Any errors are indicated by exit code 1. +.\"}}} +.SH ENVIRONMENT \"{{{ +CPMTOOLSFMT Default format +.\"}}} +.SH FILES \"{{{ +${prefix}/share/diskdefs CP/M disk format definitions +.\"}}} +.SH AUTHORS \"{{{ +This program is copyright 1997\(en2012 Michael Haardt +. The Windows port is copyright 2000, 2001, 2011 John Elliott +. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License along +with this program. If not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\"}}} +.SH "SEE ALSO" \"{{{ +.IR fsck.cpm (1), +.IR cpmls (1), +.IR mkfs (1), +.IR cpm (5) +.\"}}} diff --git a/Tools/unix/cpmtools/mkfs.cpm.c b/Tools/unix/cpmtools/mkfs.cpm.c new file mode 100644 index 00000000..2c37bdfd --- /dev/null +++ b/Tools/unix/cpmtools/mkfs.cpm.c @@ -0,0 +1,234 @@ +/* #includes */ /*{{{C}}}*//*{{{*/ +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "getopt_.h" +#include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif +/*}}}*/ +/* #defines */ /*{{{*/ +#ifndef O_BINARY +#define O_BINARY 0 +#endif +/*}}}*/ + +/* mkfs -- make file system */ /*{{{*/ +static int mkfs(struct cpmSuperBlock *drive, const char *name, const char *format, const char *label, char *bootTracks, int timeStamps) +{ + /* variables */ /*{{{*/ + unsigned int i; + char buf[128]; + char firstbuf[128]; + int fd; + unsigned int bytes; + unsigned int trkbytes; + /*}}}*/ + + /* open image file */ /*{{{*/ + if ((fd = open(name, O_BINARY|O_CREAT|O_WRONLY, 0666)) < 0) + { + boo=strerror(errno); + return -1; + } + /*}}}*/ + /* write system tracks */ /*{{{*/ + /* this initialises only whole tracks, so it skew is not an issue */ + trkbytes=drive->secLength*drive->sectrk; + for (i=0; iboottrk; i+=drive->secLength) if (write(fd, bootTracks+i, drive->secLength)!=(ssize_t)drive->secLength) + { + boo=strerror(errno); + close(fd); + return -1; + } + /*}}}*/ + /* write directory */ /*{{{*/ + memset(buf,0xe5,128); + bytes=drive->maxdir*32; + if (bytes%trkbytes) bytes=((bytes+trkbytes)/trkbytes)*trkbytes; + if (timeStamps && (drive->type==CPMFS_P2DOS || drive->type==CPMFS_DR3)) buf[3*32]=0x21; + memcpy(firstbuf,buf,128); + if (drive->type==CPMFS_DR3) + { + time_t now; + struct tm *t; + int min,hour,days; + + firstbuf[0]=0x20; + for (i=0; i<11 && *label; ++i,++label) firstbuf[1+i]=toupper(*label&0x7f); + while (i<11) firstbuf[1+i++]=' '; + firstbuf[12]=timeStamps ? 0x11 : 0x01; /* label set and first time stamp is creation date */ + memset(&firstbuf[13],0,1+2+8); + if (timeStamps) + { + int year; + + /* Stamp label. */ + time(&now); + t=localtime(&now); + min=((t->tm_min/10)<<4)|(t->tm_min%10); + hour=((t->tm_hour/10)<<4)|(t->tm_hour%10); + for (year=1978,days=0; year<1900+t->tm_year; ++year) + { + days+=365; + if (year%4==0 && (year%100!=0 || year%400==0)) ++days; + } + days += t->tm_yday + 1; + firstbuf[24]=firstbuf[28]=days&0xff; firstbuf[25]=firstbuf[29]=days>>8; + firstbuf[26]=firstbuf[30]=hour; + firstbuf[27]=firstbuf[31]=min; + } + } + for (i=0; itype==CPMFS_P2DOS || drive->type==CPMFS_DR3)) /*{{{*/ + { + int offset,j; + struct cpmInode ino, root; + static const char sig[] = "!!!TIME"; + unsigned int records; + struct dsDate *ds; + struct cpmSuperBlock super; + const char *err; + + if ((err=Device_open(&super.dev,name,O_RDWR,NULL))) + { + fprintf(stderr,"%s: can not open %s (%s)\n",cmd,name,err); + exit(1); + } + cpmReadSuper(&super,&root,format); + + records=root.sb->maxdir/8; + if (!(ds=malloc(records*128))) + { + cpmUmount(&super); + return -1; + } + memset(ds,0,records*128); + offset=15; + for (i=0; ids=ds; + root.sb->dirtyDs=1; + cpmUmount(&super); + } + /*}}}*/ + + return 0; +} +/*}}}*/ + +const char cmd[]="mkfs.cpm"; + +int main(int argc, char *argv[]) /*{{{*/ +{ + char *image; + const char *format; + int c,usage=0; + struct cpmSuperBlock drive; + struct cpmInode root; + const char *label="unlabeled"; + int timeStamps=0; + size_t bootTrackSize,used; + char *bootTracks; + const char *boot[4]={(const char*)0,(const char*)0,(const char*)0,(const char*)0}; + + if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT; + while ((c=getopt(argc,argv,"b:f:L:th?"))!=EOF) switch(c) + { + case 'b': + { + if (boot[0]==(const char*)0) boot[0]=optarg; + else if (boot[1]==(const char*)0) boot[1]=optarg; + else if (boot[2]==(const char*)0) boot[2]=optarg; + else if (boot[3]==(const char*)0) boot[3]=optarg; + else usage=1; + break; + } + case 'f': format=optarg; break; + case 'L': label=optarg; break; + case 't': timeStamps=1; break; + case 'h': + case '?': usage=1; break; + } + + if (optind!=(argc-1)) usage=1; + else image=argv[optind++]; + + if (usage) + { + fprintf(stderr,"Usage: %s [-f format] [-b boot] [-L label] [-t] image\n",cmd); + exit(1); + } + drive.dev.opened=0; + cpmReadSuper(&drive,&root,format); + bootTrackSize=drive.boottrk*drive.secLength*drive.sectrk; + if ((bootTracks=malloc(bootTrackSize))==(void*)0) + { + fprintf(stderr,"%s: can not allocate boot track buffer: %s\n",cmd,strerror(errno)); + exit(1); + } + memset(bootTracks,0xe5,bootTrackSize); + used=0; + for (c=0; c<4 && boot[c]; ++c) + { + int fd; + size_t size; + + if ((fd=open(boot[c],O_BINARY|O_RDONLY))==-1) + { + fprintf(stderr,"%s: can not open %s: %s\n",cmd,boot[c],strerror(errno)); + exit(1); + } + size=read(fd,bootTracks+used,bootTrackSize-used); +#if 0 + fprintf(stderr,"%d %04x %s\n",c,used+0x800,boot[c]); +#endif + if (size%drive.secLength) size=(size|(drive.secLength-1))+1; + used+=size; + close(fd); + } + if (mkfs(&drive,image,format,label,bootTracks,timeStamps)==-1) + { + fprintf(stderr,"%s: can not make new file system: %s\n",cmd,boo); + exit(1); + } + else exit(0); +} +/*}}}*/ diff --git a/Tools/unix/uz80as/Makefile b/Tools/unix/uz80as/Makefile new file mode 100644 index 00000000..32e4f46d --- /dev/null +++ b/Tools/unix/uz80as/Makefile @@ -0,0 +1,68 @@ +# =========================================================================== +# uz80as, an assembler for the Zilog Z80 and several other microprocessors. +# =========================================================================== + +DEST = ../../`uname` +CC = gcc +CFLAGS = -g + +OBJECTS = ngetopt.o main.o options.o \ + utils.o err.o incl.o sym.o \ + expr.o exprint.o pp.o list.o \ + prtable.o uz80as.o targets.o \ + z80.o gbcpu.o \ + dp2200.o i4004.o \ + i8008.o i8048.o \ + i8051.o i8080.o \ + mos6502.o mc6800.o + +SOURCES = \ + config.h \ + ngetopt.c ngetopt.h \ + main.c \ + options.c options.h \ + utils.c utils.h \ + err.c err.h \ + incl.c incl.h \ + sym.c sym.h \ + expr.c expr.h \ + exprint.c exprint.h \ + pp.c pp.h \ + list.c list.h \ + prtable.c prtable.h \ + uz80as.c uz80as.h \ + targets.c targets.h \ + z80.c \ + gbcpu.c \ + dp2200.c \ + i4004.c \ + i8008.c \ + i8048.c \ + i8051.c \ + i8080.c \ + mos6502.c \ + mc6800.c + +all: uz80as + +$(DEST): + mkdir -p $(DEST) + +install: uz80as $(DEST) + cp uz80as $(DEST) + +clobber: clean + -rm -f uz80as $(DEST)/uz80as + +clean: + -rm -f $(OBJECTS) + +uz80as: $(OBJECTS) + $(CC) $(CFLAGS) -o uz80as $(OBJECTS) + +test: test.asm uz80as + ./uz80as test.asm + cat test.lst + +.c.o: + $(CC) $(CFLAGS) -I. -c $< -o $@ diff --git a/Tools/unix/uz80as/config.h b/Tools/unix/uz80as/config.h new file mode 100644 index 00000000..cca14cbd --- /dev/null +++ b/Tools/unix/uz80as/config.h @@ -0,0 +1,29 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Years of copyright */ +#define COPYRIGHT_YEARS "2018" + +/* Name of package */ +#define PACKAGE "uz80as" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "jorge.giner@hotmail.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "uz80as" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "uz80as 1.10" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "uz80as" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "https://jorgicor.niobe.org/uz80as" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.10" + +/* Version number of package */ +#define VERSION "1.10" diff --git a/Tools/unix/uz80as/dp2200.c b/Tools/unix/uz80as/dp2200.c new file mode 100644 index 00000000..c6599247 --- /dev/null +++ b/Tools/unix/uz80as/dp2200.c @@ -0,0 +1,208 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Datapoint 2200. + * =========================================================================== + */ + +/* + * Datapoint 2200 Version I, 2K to 8K mem (program counter 13 bits). + * Datapoint 2200 Version II, 2K to 16K mem (protram counter 14 bits). + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: ADA,ADB,ADC,ADD,ADH,ADL,ADM, + * ACA,ACB,ACC,ACD,ACH,ACL,ACM, + * SUA,SUB,SUC,SUD,SUH,SUL,SUM, + * SBA,SBB,SBC,SBD,SBH,SBL,SBM, + * NDA,NDB,NDC,NDD,NDH,NDL,NDM, + * XRA,XRB,XRC,XRD,XRH,XRL,XRM, + * ORA,ORB,ORC,ORD,ORH,ORL,ORM, + * CPA,CPB,CPC,CPD,CPH,CPL,CPM + * c: NOP,LAB,LAC,LAD,LAE,LAH,LAL,LAM, + * LBA,LBC,LBD,LBE,LBH,LBL,LBM, + * LCA,LCB,LCD,LCE,LCH,LCL,LCM, + * LDA,LDB,LDC,LDE,LDH,LDL,LDM, + * LEA,LEB,LEC,LED,LEH,LEL,LEM, + * LHA,LHB,LHC,LHD,LHE,LHL,LHM, + * LLA,LLB,LLC,LLD,LLE,LLH,LLM, + * LMA,LMB,LMC,LMD,LME,LMH,LML,HALT + * d: ADR,STATUS,DATA,WRITE,COM1,COM2,COM3,COM4 + * BEEP,CLICK,DECK1,DECK2, + * RBK,WBK,BSP,SF,SB,REWND,TSTOP + * e: RFC,RFS,RTC,RTS,RFZ,RFP,RTZ,RTP + * f: JFC,JFZ,JFS,JFP,JTC,JTZ,JTS,JTP + * g: AD,SU,ND,OR,AC,SB,XR,CP + * h: LA,LB,LC,LD,LE,LH,LL + * i: CFC,CFZ,CFS,CFP,CTC,CTZ,CTS,CTP + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: (op << 1) + lastbyte + * g: (op << 4) | lastbyte + */ + +const struct matchtab s_matchtab_dp2200[] = { + { "SLC", "02.", 3, 0 }, + { "SRC", "0A.", 3, 0 }, + { "RETURN", "07.", 3, 0 }, + { "INPUT", "41.", 3, 0 }, + { "b", "80c0.", 3, 0 }, + { "c", "C0c0.", 3, 0 }, + { "EX d", "51f0.", 3, 0 }, + { "e", "03b0.", 3, 0 }, + { "g a", "04b0.d1.", 3, 0, "e8" }, + { "h a", "06b0.d1.", 3, 0, "e8"}, + { "f a", "40b0.e1", 3, 0 }, + { "i a", "42b0.e1", 3, 0 }, + { "JMP a", "44.e0", 3, 0 }, + { "CALL a", "46.e0", 3, 0 }, + /* version II */ + { "BETA", "10.", 2, 0 }, + { "DI", "20.", 2, 0 }, + { "POP", "30.", 2, 0 }, + { "ALPHA", "18.", 2, 0 }, + { "EI", "28.", 2, 0 }, + { "PUSH", "38.", 2, 0 }, + { NULL, NULL }, +}; + +static const char *const bval[] = { +"ADA", "ADB", "ADC", "ADD", "ADE", "ADH", "ADL", "ADM", +"ACA", "ACB", "ACC", "ACD", "ACE", "ACH", "ACL", "ACM", +"SUA", "SUB", "SUC", "SUD", "SUE", "SUH", "SUL", "SUM", +"SBA", "SBB", "SBC", "SBD", "SBE", "SBH", "SBL", "SBM", +"NDA", "NDB", "NDC", "NDD", "NDE", "NDH", "NDL", "NDM", +"XRA", "XRB", "XRC", "XRD", "XRE", "XRH", "XRL", "XRM", +"ORA", "ORB", "ORC", "ORD", "ORE", "ORH", "ORL", "ORM", +"CPA", "CPB", "CPC", "CPD", "CPE", "CPH", "CPL", "CPM", +NULL }; + +static const char *const cval[] = { +"NOP", "LAB", "LAC", "LAD", "LAE", "LAH", "LAL", "LAM", +"LBA", "", "LBC", "LBD", "LBE", "LBH", "LBL", "LBM", +"LCA", "LCB", "", "LCD", "LCE", "LCH", "LCL", "LCM", +"LDA", "LDB", "LDC", "", "LDE", "LDH", "LDL", "LDM", +"LEA", "LEB", "LEC", "LED", "", "LEH", "LEL", "LEM", +"LHA", "LHB", "LHC", "LHD", "LHE", "", "LHL", "LHM", +"LLA", "LLB", "LLC", "LLD", "LLE", "LLH", "", "LLM", +"LMA", "LMB", "LMC", "LMD", "LME", "LMH", "LML", "HALT", +NULL }; + +static const char *const dval[] = { +"ADR", "STATUS", "DATA", "WRITE", "COM1", "COM2", "COM3", "COM4", +"", "", "", "", "BEEP", "CLICK", "DECK1", "DECK2", +"RBK", "WBK", "", "BSP", "SF", "SB", "REWND", "TSTOP", +NULL }; + +static const char *const eval[] = { "RFC", "RFZ", "RFS", "RFP", + "RTC", "RTZ", "RTS", "RTP", + NULL }; + +static const char *const fval[] = { "JFC", "JFZ", "JFS", "JFP", + "JTC", "JTZ", "JTS", "JTP", + NULL }; + +static const char *const gval[] = { "AD", "AC", "SU", "SB", + "ND", "XR", "OR", "CP", + NULL }; + +static const char *const hval[] = { "LA", "LB", "LC", "LD", + "LE", "LH", "LL", + NULL }; + +static const char *const ival[] = { "CFC", "CFZ", "CFS", "CFP", + "CTC", "CTZ", "CTS", "CTP", + NULL }; + +static const char *const *const valtab[] = { + bval, cval, dval, eval, fval, + gval, hval, ival +}; + +static int match_dp2200(char c, const char *p, const char **q) +{ + int v; + + if (c <= 'i') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_dp2200(int *eb, char p, const int *vs, int i, int savepc) +{ + int b; + + b = *eb; + switch (p) { + case 'f': b += (vs[i] << 1); break; + case 'g': b |= (vs[i] << 4); break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_dp2200(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_dp2200(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'n') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_dp2200 = { + .id = "dp2200", + .descr = "Datapoint 2200 Version I", + .matcht = s_matchtab_dp2200, + .matchf = match_dp2200, + .genf = gen_dp2200, + .pat_char_rewind = pat_char_rewind_dp2200, + .pat_next_str = pat_next_str_dp2200, + .mask = 1 +}; + +const struct target s_target_dp2200ii = { + .id = "dp2200ii", + .descr = "Datapoint 2200 Version II", + .matcht = s_matchtab_dp2200, + .matchf = match_dp2200, + .genf = gen_dp2200, + .pat_char_rewind = pat_char_rewind_dp2200, + .pat_next_str = pat_next_str_dp2200, + .mask = 2 +}; diff --git a/Tools/unix/uz80as/err.c b/Tools/unix/uz80as/err.c new file mode 100644 index 00000000..b6745ae8 --- /dev/null +++ b/Tools/unix/uz80as/err.c @@ -0,0 +1,196 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Error reporting. + * =========================================================================== + */ + +#include "config.h" +#include "err.h" +#include "incl.h" + +#ifndef ASSERT_H +#include +#endif + +#ifndef CTYPE_H +#include +#endif + +#ifndef STDARG_H +#include +#endif + +#ifndef STDIO_H +#include +#endif + +#ifndef STDLIB_H +#include +#endif + +#ifndef STRING_H +#include +#endif + +/* Max number of errors before halt. */ +#define MAXERR 64 + +int s_nerrors; + +static void eprfl(void) +{ + fprintf(stderr, "%s:%d: ", curfile()->name, curfile()->linenum); +} + +static void eprwarn(void) +{ + fputs(_("warning:"), stderr); + fputc(' ', stderr); +} + +/* Print the characters in [p, q[ to stderr. */ +void echars(const char *p, const char *q) +{ + while (*p != '\0' && p != q) { + fputc(*p, stderr); + p++; + } +} + +/* + * Print a space, an opening parenthesis, the characters in [p, q[, + * and a closing parenthesis to stderr. + */ +void epchars(const char *p, const char *q) +{ + fputs(" (", stderr); + echars(p, q); + fputs(")", stderr); +} + +/* + * Increments the number of errors, and exit with failure if + * maximum number of errors allowed is reached. + */ +void newerr(void) +{ + s_nerrors++; + if (s_nerrors >= MAXERR) { + eprogname(); + fprintf(stderr, _("exiting: too many errors")); + enl(); + exit(EXIT_FAILURE); + } +} + +static void evprint(int warn, const char *ecode, va_list args) +{ + if (nfiles() > 0) + eprfl(); + else + eprogname(); + + if (warn) + eprwarn(); + + assert(ecode != NULL); + vfprintf(stderr, ecode, args); +} + +/* Prints only the printable characters, the rst as space. */ +static void eprint_printable(const char *p) +{ + for (; *p != '\0'; p++) { + if (isprint(*p)) + putc(*p, stderr); + else + putc(' ', stderr); + } +} + +/* Prints the line and a marker pointing to the charcater q inside line. */ +void eprcol(const char *line, const char *q) +{ + putc(' ', stderr); + eprint_printable(line); + fputs("\n ", stderr); + while (line != q) { + putc(' ', stderr); + line++; + } + fputs("^\n", stderr); +} + +/* + * Like fprintf but prints to stderr. + * If we are parsing any file (incl.c), print first the file and the line. + * If not, print first the program name. + */ +void eprint(const char *ecode, ...) +{ + va_list args; + + va_start(args, ecode); + evprint(0, ecode, args); + va_end(args); +} + +/* Same as eprint, but print "warning: " before ecode str. */ +void wprint(const char *ecode, ...) +{ + va_list args; + + va_start(args, ecode); + evprint(1, ecode, args); + va_end(args); +} + +/* Print \n on stderr. */ +void enl(void) +{ + fputc('\n', stderr); +} + +/* Print the program name on stderr. */ +void eprogname(void) +{ + fprintf(stderr, PACKAGE": "); +} + +/* Call malloc, but if no memory, print that error and exit with failure. */ +void *emalloc(size_t n) +{ + void *p; + + if ((p = malloc(n)) == NULL) { + eprint(_("malloc fail\n")); + exit(EXIT_FAILURE); + } + // printf("emalloc: %d = %x\n", n, p); + return p; +} + +/* Call realloc, but if no memory, print that error and exit with failure. */ +void *erealloc(void *p, size_t n) +{ + // void *q = p; + if ((p = realloc(p, n)) == NULL) { + eprint(_("realloc fail\n")); + exit(EXIT_FAILURE); + } + // printf("erealloc: %x %d = %x\n", q, n, p); + return p; +} + +/* Call fopen, but if any error, print it and exit with failure. */ +FILE *efopen(const char *fname, const char *ops) +{ + FILE *fp; + + if ((fp = fopen(fname, ops)) == NULL) { + eprint(_("cannot open file %s\n"), fname); + exit(EXIT_FAILURE); + } + return fp; +} diff --git a/Tools/unix/uz80as/err.h b/Tools/unix/uz80as/err.h new file mode 100644 index 00000000..86d8e1dc --- /dev/null +++ b/Tools/unix/uz80as/err.h @@ -0,0 +1,32 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Error reporting. + * =========================================================================== + */ + +#ifndef ERR_H +#define ERR_H + +#ifndef STDIO_H +#define STDIO_H +#include +#endif + +#define _(str) (str) + +extern int s_nerrors; + +void newerr(void); +void eprogname(void); +void echars(const char *p, const char *q); +void epchars(const char *p, const char *q); +void eprint(const char *ecode, ...); +void wprint(const char *ecode, ...); +void eprcol(const char *line, const char *q); +void enl(void); +void *emalloc(size_t n); +void *erealloc(void *p, size_t n); +FILE *efopen(const char *fname, const char *ops); + +#endif diff --git a/Tools/unix/uz80as/expr.c b/Tools/unix/uz80as/expr.c new file mode 100644 index 00000000..2897461f --- /dev/null +++ b/Tools/unix/uz80as/expr.c @@ -0,0 +1,445 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Expression parsing. + * =========================================================================== + */ + +#include "config.h" +#include "expr.h" +#include "utils.h" +#include "err.h" +#include "sym.h" + +#ifndef ASSERT_H +#include +#endif + +#ifndef CTYPE_H +#include +#endif + +#ifndef LIMITS_H +#include +#endif + +#ifndef STDIO_H +#include +#endif + +#ifndef STDLIB_H +#include +#endif + +/* Max nested expressions. */ +#define ESTKSZ 16 +#define ESTKSZ2 (ESTKSZ*2) + +/* Return -1 on syntax error. + * *p must be a digit already. + * *q points to one past the end of the number without suffix. + */ +static int takenum(const char *p, const char *q, int radix) +{ + int k, n; + + n = 0; + while (p != q) { + k = hexval(*p); + p++; + if (k >= 0 && k < radix) + n = n * radix + k; + else + return -1; + } + return n; +} + +/* Go to the end of a number (advance all digits or letters). */ +static const char *goendnum(const char *p) +{ + const char *q; + + for (q = p; isalnum(*q); q++) + ; + return q; +} + +/* + * Returns NULL on error. + * '*p' must be a digit already. + */ +static const char *getnum(const char *p, int *v) +{ + int n; + char c; + const char *q; + + assert(isdigit(*p)); + + n = 0; + q = goendnum(p) - 1; + if (isalpha(*q)) { + c = toupper(*q); + if (c == 'H') { + n = takenum(p, q, 16); + } else if (c == 'D') { + n = takenum(p, q, 10); + } else if (c == 'O') { + n = takenum(p, q, 8); + } else if (c == 'B') { + n = takenum(p, q, 2); + } else { + return NULL; + } + } else { + n = takenum(p, q + 1, 10); + } + + if (n < 0) + return NULL; + + *v = n; + return q + 1; +} + +/* + * Gets a number that was prefixed. + * Returns NULL on error. + */ +static const char *getpnum(const char *p, int radix, int *v) +{ + const char *q; + int n; + + q = goendnum(p); + n = takenum(p, q, radix); + if (n < 0) + return NULL; + *v = n; + return q; +} + +/* Left shift */ +static int shl(int r, int n) +{ + n &= int_precission(); + return r << n; +} + + +/* Portable arithmetic right shift. */ +static int ashr(int r, int n) +{ + n &= int_precission(); + if (r & INT_MIN) { + return ~(~r >> n); + } else { + return r >> n; + } +} + +/* Parses expression pointed by 'p'. + * If success, returns pointer to the end of parsed expression, and + * 'v' contains the calculated value of the expression. + * Returns NULL if a syntactic error has occurred. + * Operators are evaluated left to right. + * To allow precedence use parenthesis. + * 'linepc' is the program counter to consider when we find the $ current + * pointer location symbol ($). + * 'allowfr' stands for 'allow forward references'. We will issue an error + * if we find a label that is not defined. + * 'ecode' will be valid if NULL is returned. NULL can be passed as ecode. + * 'ep' is the pointer to the position where the error ocurred. NULL can be + * passed as ep. + */ +const char *expr(const char *p, int *v, int linepc, int allowfr, + enum expr_ecode *ecode, const char **ep) +{ + int si, usi; + const char *q; + char last; + int stack[ESTKSZ2]; + int uopstk[ESTKSZ]; + int r, n; + struct sym *sym; + int err; + enum expr_ecode ec; + + ec = EXPR_E_NO_EXPR; + err = 0; + usi = 0; + si = 0; + r = 0; + last = 'V'; /* first void */ +loop: + p = skipws(p); + if (*p == '(') { + if (last == 'n') { + goto end; + } else { + if (si >= ESTKSZ2) { + eprint(_("expression too complex\n")); + exit(EXIT_FAILURE); + } + stack[si++] = last; + stack[si++] = r; + p++; + r = 0; + last = 'v'; /* void */ + } + } else if (*p == ')') { + if (last != 'n') { + ec = EXPR_E_CPAR; + goto esyntax; + } else if (si == 0) { + goto end; + } else { + p++; + n = r; + r = stack[--si]; + last = (char) stack[--si]; + goto oper; + } + } else if (*p == '+') { + p++; + if (last == 'n') + last = '+'; + } else if (*p == '-') { + if (last == 'n') { + p++; + last = '-'; + } else { + goto uoper; + } + } else if (*p == '~') { + goto uoper; + } else if (*p == '!') { + if (*(p + 1) == '=') { + if (last != 'n') { + ec = EXPR_E_OPER; + goto esyntax; + } else { + p += 2; + last = 'N'; + } + } else { + goto uoper; + } + } else if (*p == '*') { + if (last == 'n') { + last = *p++; + } else { + p++; + n = linepc; + goto oper; + } + } else if (*p == '/' || *p == '&' || *p == '|' + || *p == '^') + { + if (last != 'n') { + ec = EXPR_E_OPER; + goto esyntax; + } else { + last = *p++; + } + } else if (*p == '>') { + if (last != 'n') { + ec = EXPR_E_OPER; + goto esyntax; + } + p++; + if (*p == '=') { + last = 'G'; + p++; + } else if (*p == '>') { + last = 'R'; + p++; + } else { + last = '>'; + } + } else if (*p == '<') { + if (last != 'n') { + ec = EXPR_E_OPER; + goto esyntax; + } + p++; + if (*p == '=') { + last = 'S'; + p++; + } else if (*p == '<') { + last = 'L'; + p++; + } else { + last = '<'; + } + } else if (*p == '=') { + if (last != 'n') { + ec = EXPR_E_OPER; + goto esyntax; + } + p++; + if (*p == '=') + p++; + last = '='; + } else if (*p == '\'') { + if (last == 'n') + goto end; + p++; + n = *p++; + if (*p != '\'') { + ec = EXPR_E_CHAR; + goto esyntax; + } + p++; + goto oper; + } else if (*p == '$') { + if (last == 'n') + goto end; + p++; + if (hexval(*p) < 0) { + n = linepc; + goto oper; + } + q = getpnum(p, 16, &n); + if (q == NULL) { + p--; + ec = EXPR_E_HEX; + goto esyntax; + } + p = q; + goto oper; + } else if (*p == '@') { + if (last == 'n') + goto end; + p++; + q = getpnum(p, 8, &n); + if (q == NULL) { + p--; + ec = EXPR_E_OCTAL; + goto esyntax; + } + p = q; + goto oper; + } else if (*p == '%') { + if (last == 'n') { + last = *p; + p++; + } else { + p++; + q = getpnum(p, 2, &n); + if (q == NULL) { + ec = EXPR_E_BIN; + goto esyntax; + } + p = q; + goto oper; + } + } else if (isdigit(*p)) { + if (last == 'n') + goto end; + q = getnum(p, &n); + if (q == NULL) { + ec = EXPR_E_DEC; + goto esyntax; + } + p = q; + goto oper; + } else if (isidc0(*p)) { + if (last == 'n') + goto end; + q = p; + while (isidc(*p)) + p++; + sym = lookup(q, p, 0, 0); + if (sym == NULL) { + n = 0; + if (!allowfr) { + err = 1; + eprint(_("undefined label")); + epchars(q, p); + enl(); + newerr(); + } + } else { + n = sym->val; + } + goto oper; + } else if (last == 'V') { + goto esyntax; + } else if (last != 'n') { + ec = EXPR_E_SYNTAX; + goto esyntax; + } else { +end: if (v != NULL) + *v = r; + return p; + } + goto loop; +uoper: + if (last == 'n') + goto end; + if (usi >= ESTKSZ) { + eprint(_("expression too complex\n")); + exit(EXIT_FAILURE); + } + uopstk[usi++] = *p++; + goto loop; +oper: + while (usi > 0) { + usi--; + switch (uopstk[usi]) { + case '~': n = ~n; break; + case '-': n = -n; break; + case '!': n = !n; break; + } + } + switch (last) { + case 'V': r = n; break; + case 'v': r = n; break; + case '+': r += n; break; + case '-': r -= n; break; + case '*': r *= n; break; + case '&': r &= n; break; + case '|': r |= n; break; + case '^': r ^= n; break; + case '=': r = r == n; break; + case '<': r = r < n; break; + case '>': r = r > n ; break; + case 'G': r = r >= n; break; + case 'S': r = r <= n; break; + case 'N': r = r != n; break; + /* This would be logical right shift: + * case 'R': r = (unsigned int) r >> n; break; + */ + case 'R': r = ashr(r, n); break; + case 'L': r = shl(r, n); break; + case '~': r = ~n; break; + case '%': + if (n != 0) { + r %= n; + } else if (!err && !allowfr) { + err = 1; + eprint(_("modulo by zero\n")); + exit(EXIT_FAILURE); + } + break; + case '/': + if (n != 0) { + r /= n; + } else if (!err && !allowfr) { + err = 1; + eprint(_("division by zero\n")); + exit(EXIT_FAILURE); + } + break; + } + last = 'n'; + goto loop; +esyntax: + if (ecode != NULL) + *ecode = ec; + if (ep != NULL) + *ep = p; + return NULL; +} diff --git a/Tools/unix/uz80as/expr.h b/Tools/unix/uz80as/expr.h new file mode 100644 index 00000000..e1e55fc2 --- /dev/null +++ b/Tools/unix/uz80as/expr.h @@ -0,0 +1,26 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Expression parsing. + * =========================================================================== + */ + +#ifndef EXPR_H +#define EXPR_H + +enum expr_ecode { + EXPR_E_NO_EXPR, /* There was no expression parsed. */ + EXPR_E_SYNTAX, /* Syntax error. */ + EXPR_E_CPAR, + EXPR_E_OPER, + EXPR_E_CHAR, + EXPR_E_HEX, + EXPR_E_OCTAL, + EXPR_E_BIN, + EXPR_E_DEC, +}; + +const char *expr(const char *p, int *v, int linepc, int allowfr, + enum expr_ecode *ecode, const char **ep); + +#endif diff --git a/Tools/unix/uz80as/exprint.c b/Tools/unix/uz80as/exprint.c new file mode 100644 index 00000000..67699636 --- /dev/null +++ b/Tools/unix/uz80as/exprint.c @@ -0,0 +1,32 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Expression error reporting. + * =========================================================================== + */ + +#include "config.h" +#include "exprint.h" +#include "err.h" + +static const char *expr_get_error_str(enum expr_ecode ecode) +{ + switch (ecode) { + case EXPR_E_NO_EXPR: return _("expression expected\n"); + case EXPR_E_SYNTAX: return _("syntax error in expression\n"); + case EXPR_E_CPAR: return _("unexpected ')'\n"); + case EXPR_E_OPER: return _("misplaced operator\n"); + case EXPR_E_CHAR: return _("invalid character code\n"); + case EXPR_E_HEX: return _("invalid hexadecimal constant\n"); + case EXPR_E_OCTAL: return _("invalid octal constant\n"); + case EXPR_E_BIN: return _("invalid binary constant\n"); + case EXPR_E_DEC: return _("invalid decimal constant\n"); + default: return "\n"; + } +} + +void exprint(enum expr_ecode ecode, const char *pline, const char *ep) +{ + eprint(expr_get_error_str(ecode)); + eprcol(pline, ep); +} diff --git a/Tools/unix/uz80as/exprint.h b/Tools/unix/uz80as/exprint.h new file mode 100644 index 00000000..00b43c2f --- /dev/null +++ b/Tools/unix/uz80as/exprint.h @@ -0,0 +1,17 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Expression error reporting. + * =========================================================================== + */ + +#ifndef EXPRINT_H +#define EXPRINT_H + +#ifndef EXPR_H +#include "expr.h" +#endif + +void exprint(enum expr_ecode ecode, const char *pline, const char *ep); + +#endif diff --git a/Tools/unix/uz80as/gbcpu.c b/Tools/unix/uz80as/gbcpu.c new file mode 100644 index 00000000..d6b347f3 --- /dev/null +++ b/Tools/unix/uz80as/gbcpu.c @@ -0,0 +1,301 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Sharp LR35902 (Nintendo Gameboy CPU). + * =========================================================================== + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +#if 0 +Opcode Z80 GMB + --------------------------------------- + 08 EX AF,AF LD (nn),SP + 10 DJNZ PC+dd STOP + 22 LD (nn),HL LDI (HL),A + 2A LD HL,(nn) LDI A,(HL) + 32 LD (nn),A LDD (HL),A + 3A LD A,(nn) LDD A,(HL) + D3 OUT (n),A - + D9 EXX RETI + DB IN A,(n) - + DD - + E0 RET PO LD (FF00+n),A + E2 JP PO,nn LD (FF00+C),A + E3 EX (SP),HL - + E4 CALL PO,nn - + E8 RET PE ADD SP,dd + EA JP PE,nn LD (nn),A + EB EX DE,HL - + EC CALL PE,nn - + ED - + F0 RET P LD A,(FF00+n) + F2 JP P,nn LD A,(FF00+C) + F4 CALL P,nn - + F8 RET M LD HL,SP+dd + FA JP M,nn LD A,(nn) + FC CALL M,nn - + FD - + CB3X SLL r/(HL) SWAP r/(HL) +#endif + +/* pat: + * a: expr + * b: B,C,D,E,H,L,A + * c: * + * d: BC,DE,HL,SP + * e: * + * f: BC,DE,HL,AF + * g: ADD,ADC,SUB,SBC,AND,XOR,OR,CP + * h: INC,DEC + * i: * + * j: * + * k: * + * l: BIT,RES,SET + * m: * + * n: NZ,Z,NC,C + * o: RLC,RRC,RL,RR,SLA,SRA,SWAP,SRL + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: (op << 4) | lastbyte + * g: (op << 6) | lastbyte + * h: if op >= FF00 output last byte and then op as 8 bit value; + * else output (lastbyte | 0x0A) and output op as word + * (no '.' should follow) + * i: relative jump to op + * j: possible value to RST + * k: possible value to IM + * l: * + * m: check arithmetic used with A register + * n: check arithmetic used without A register + */ + +const struct matchtab s_matchtab_gbcpu[] = { + { "LD b,b", "40b0c1.", 1, 0 }, + { "LD b,(HL)", "46b0.", 1, 0 }, + { "LD A,(C)", "F2.", 1, 0 }, // * LD A,(FF00+C) + { "LD A,(BC)", "0A.", 1, 0 }, + { "LD A,(DE)", "1A.", 1, 0 }, + { "LD A,(HLI)", "2A.", 1, 0 }, // * + { "LD A,(HLD)", "3A.", 1, 0 }, // * + { "LD A,(a)", "F0h0", 1, 0 }, // * LD A,(nn) & LD A,(FF00+n) + { "LD b,a", "06b0.d1.", 1, 0, "e8" }, + { "LD SP,HL", "F9.", 1, 0 }, + { "LDHL SP,a", "F8.d0.", 1, 0, "e8" }, // * LD HL,SP+n + { "LD d,a", "01f0.e1", 1, 0 }, + { "LD (C),A", "E2.", 1, 0 }, // * LD (FF00+C),A + { "LD (HL),b", "70c0.", 1, 0 }, + { "LD (HL),a", "36.d0.", 1, 0, "e8" }, + { "LD (HLI),A", "22.", 1, 0 }, // * + { "LD (HLD),A", "32.", 1, 0 }, // * + { "LD (BC),A", "02.", 1, 0 }, + { "LD (DE),A", "12.", 1, 0 }, + { "LD (a),A", "E0h0", 1, 0 }, // * LD (nn),A & LD (FF00+n),A + { "LD (a),SP", "08.e0", 1, 0 }, // * + { "LDH A,(a)", "F0.d0.", 1, 0, "e8" }, // * LD A,(FF00+n) + { "LDH (a),A", "E0.d0.", 1, 0, "e8" }, // * LD (FF00+n),A + { "PUSH f", "C5f0.", 1, 0 }, + { "POP f", "C1f0.", 1, 0 }, + { "ADD HL,d", "09f0.", 1, 0 }, + { "ADD SP,a", "E8.d0.", 1, 0, "e8" }, // * + { "g A,b", "m080b0c1.", 1, 0 }, + { "g A,(HL)", "m086b0.", 1, 0 }, + { "g A,a", "m0C6b0.d1.", 1, 0, "e8" }, + { "g b", "n080b0c1.", 1, 0 }, + { "g (HL)", "n086b0.", 1, 0 }, + { "g a", "n0C6b0.d1.", 1, 0, "e8" }, + { "h b", "04b1c0.", 1, 0 }, + { "h (HL)", "34c0.", 1, 0 }, + { "INC d", "03f0.", 1, 0 }, + { "DEC d", "0Bf0.", 1, 0 }, + { "DAA", "27.", 1, 0 }, + { "CPL", "2F.", 1, 0 }, + { "CCF", "3F.", 1, 0 }, + { "SCF", "37.", 1, 0 }, + { "NOP", "00.", 1, 0 }, + { "HALT", "76.", 1, 0 }, + { "DI", "F3.", 1, 0 }, + { "EI", "FB.", 1, 0 }, + { "RLCA", "07.", 1, 0 }, + { "RLA", "17.", 1, 0 }, + { "RRCA", "0F.", 1, 0 }, + { "RRA", "1F.", 1, 0 }, + { "o b", "CB.00b0c1.", 1, 0 }, + { "o (HL)", "CB.06b0.", 1, 0 }, + { "l a,b", "CB.00g0b1c2.", 1, 0, "b3" }, + { "l a,(HL)", "CB.06g0b1.", 1, 0, "b3" }, + { "JP (HL)", "E9.", 1, 0 }, + { "JP n,a", "C2b0.e1", 1, 0 }, // * + { "JP a", "C3.e0", 1, 0 }, + { "JR n,a", "20b0.i1.", 1, 0, "r8" }, + { "JR a", "18.i0.", 1, 0, "r8" }, + { "STOP", "10.00.", 1, 0 }, // * + { "CALL n,a", "C4b0.e1", 1, 0 }, // * + { "CALL a", "CD.e0", 1, 0 }, + { "RETI", "D9.", 1, 0 }, // * + { "RET n", "C0b0.", 1, 0 }, + { "RET", "C9.", 1, 0 }, + { "RST a", "C7j0.", 1, 0, "ss" }, + { NULL, NULL }, +}; + +static const char *const bval[] = { "B", "C", "D", "E", + "H", "L", "", "A", NULL }; +static const char *const dval[] = { "BC", "DE", "HL", "SP", NULL }; +static const char *const fval[] = { "BC", "DE", "HL", "AF", NULL }; +static const char *const gval[] = { "ADD", "ADC", "SUB", "SBC", + "AND", "XOR", "OR", "CP", NULL }; +static const char *const hval[] = { "INC", "DEC", NULL }; +static const char *const lval[] = { "", "BIT", "RES", "SET", NULL }; +static const char *const nval[] = { "NZ", "Z", "NC", "C", NULL }; +static const char *const oval[] = { "RLC", "RRC", "RL", "RR", + "SLA", "SRA", "SWAP", "SRL", NULL }; +static const char *const nullv[] = { NULL }; + +static const char *const *const valtab[] = { + bval, nullv, dval, nullv, fval, + gval, hval, nullv, nullv, nullv, + lval, nullv, nval, oval +}; + +static int match_gbcpu(char c, const char *p, const char **q) +{ + int v; + + switch (c) { + case 'b': + case 'd': + case 'f': + case 'g': + case 'h': + case 'l': + case 'n': + case 'o': + v = mreg(p, valtab[(int) (c - 'b')], q); + break; + default: + v = -1; + } + + return v; +} + +static int gen_gbcpu(int *eb, char p, const int *vs, int i, int savepc) +{ + int w, b; + + b = *eb; + switch (p) { + case 'f': b |= (vs[i] << 4); break; + case 'g': b |= (vs[i] << 6); break; + case 'h': w = vs[i] & 0xffff; + if (w >= 0xff00) { + genb(b, s_pline_ep); + b = 0; + genb(w & 0xff, s_pline_ep); + } else { + b |= 0x0A; + genb(b, s_pline_ep); + b = 0; + genb(w & 0xff, s_pline_ep); + genb(w >> 8, s_pline_ep); + } + break; + case 'i': b = (vs[i] - savepc - 2); break; + case 'j': if (s_pass > 0 && (vs[i] & ~56) != 0) { + eprint(_("invalid RST argument (%d)\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b |= vs[i]; + break; + case 'k': if (s_pass > 0 && (vs[i] < 0 || vs[i] > 2)) { + eprint(_("invalid IM argument (%d)\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b = 0x46; + if (vs[i] == 1) + b = 0x56; + else if (vs[i] == 2) + b = 0x5E; + break; + case 'm': if (s_pass == 0 && !s_extended_op) { + if (vs[i] != 0 && vs[i] != 1 && vs[i] != 3) { + eprint(_("unofficial syntax\n")); + eprcol(s_pline, s_pline_ep); + newerr(); + } + } + break; + case 'n': if (s_pass == 0 && !s_extended_op) { + if (vs[i] == 0 || vs[i] == 1 || vs[i] == 3) { + eprint(_("unofficial syntax\n")); + eprcol(s_pline, s_pline_ep); + newerr(); + } + } + break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_gbcpu(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_gbcpu(void) +{ + const char *s; + + switch (s_pat_char) { + case 'b': + case 'd': + case 'f': + case 'g': + case 'h': + case 'l': + case 'n': + case 'o': + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + break; + default: + s = NULL; + } + + return s; +}; + +const struct target s_target_gbcpu = { + .id = "gbcpu", + .descr = "Sharp LR35902 (Nintendo Gameboy CPU)", + .matcht = s_matchtab_gbcpu, + .matchf = match_gbcpu, + .genf = gen_gbcpu, + .pat_char_rewind = pat_char_rewind_gbcpu, + .pat_next_str = pat_next_str_gbcpu, + .mask = 1 +}; diff --git a/Tools/unix/uz80as/i4004.c b/Tools/unix/uz80as/i4004.c new file mode 100644 index 00000000..98649abd --- /dev/null +++ b/Tools/unix/uz80as/i4004.c @@ -0,0 +1,189 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Intel 4004. + * Intel 4040. + * =========================================================================== + */ + +/* Intel 4004. Max. memory 4K (12 bit addresses). + * Intel 4040. Max. memory 8K (13 bit addresses). + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: ADD,SUB,LD,XCH,BBL,LDM + * c: WRM,WMP,WRR,WPM,WR0,WR1,WR2,WR3 + * SBM,RDM,RDR,ADM,RD0,RD1,RD2,RD3 + * d: CLB,CLC,IAC,CMC,CMA,RAL,RAR,TCC, + * DAC,TCS,STC,DAA,KBP,DCL, + * e: HLT,BBS,LCR,OR4,OR5,AN6,AN7 + * DB0,DB1,SB0,SB1,EIN,DIN,RPM + * f: 0P,1P,2P,3P,4P,5P,6P,7P + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: op | lastbyte, op in [0-15] + * g: op | lastbyte, op in [0,2,4,6,8,10,12,14] + * h: output (op & 0xff0000 >> 8) | lastbyte; + * then ouput op as 8 bit value + * i: (op << 4) | lastbyte + * j: (op << 1) | lastbyte + */ + +static const struct matchtab s_matchtab_i4004[] = { + { "NOP", "00.", 1, 0 }, + { "JCN a,a", "10f0.d1.", 1, 0, "b4e8" }, + { "FIM f,a", "20j0.d1.", 1, 0, "e8" }, + { "FIM a,a", "20g0.d1.", 1, 0, "ppe8" }, + { "SRC f", "21j0.", 1, 0 }, + { "SRC a", "21g0.", 1, 0, "pp" }, + { "FIN f", "30j0.", 1, 0 }, + { "FIN a", "30g0.", 1, 0, "pp" }, + { "JIN f", "31j0.", 1, 0 }, + { "JIN a", "31g0.", 1, 0, "pp" }, + { "JUN a", "40h0", 1, 0 }, + { "JMS a", "50h0", 1, 0 }, + { "INC a", "60f0.", 1, 0, "b4" }, + { "ISZ a,a", "70f0.d1.", 1, 0, "b4e8" }, + { "b a", "80i0f1.", 1, 0, "b4" }, + { "c", "E0c0.", 1, 0 }, + { "d", "F0c0.", 1, 0 }, + { "e", "00c0.", 2, 0 }, + { NULL, NULL }, +}; + +static const char *const bval[] = { +"ADD", "SUB", "LD", "XCH", "BBL", "LDM", +NULL }; + +static const char *const cval[] = { +"WRM", "WMP", "WRR", "WPM", "WR0", "WR1", "WR2", "WR3", +"SBM", "RDM", "RDR", "ADM", "RD0", "RD1", "RD2", "RD3", +NULL }; + +static const char *const dval[] = { +"CLB", "CLC", "IAC", "CMC", "CMA", "RAL", "RAR", "TCC", +"DAC", "TCS", "STC", "DAA", "KBP", "DCL", +NULL }; + +static const char *const eval[] = { +"", "HLT", "BBS", "LCR", "OR4", "OR5", "AN6", "AN7", +"DB0", "DB1", "SB0", "SB1", "EIN", "DIN", "RPM", +NULL }; + +static const char *const fval[] = { +"0P", "1P", "2P", "3P", "4P", "5P", "6P", "7P", +NULL }; + +static const char *const *const valtab[] = { + bval, cval, dval, eval, fval +}; + +static int match_i4004(char c, const char *p, const char **q) +{ + int v; + + if (c <= 'f') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_i4004(int *eb, char p, const int *vs, int i, int savepc) +{ + int b; + + b = *eb; + switch (p) { + case 'f': if (s_pass > 0 && (vs[i] < 0 || vs[i] > 15)) { + eprint(_("argument (%d) must be in range [0-15]\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b |= vs[i]; + break; + case 'g': if (s_pass > 0 && (vs[i] < 0 || vs[i] > 14 || (vs[i] & 1))) { + eprint( + _("argument (%d) must be an even number in range [0-14]\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b |= vs[i]; + break; + case 'h': b |= ((vs[i] >> 8) & 0x0f); + genb(b, s_pline_ep); + genb(vs[i], s_pline_ep); + break; + case 'i': b |= (vs[i] << 4); break; + case 'j': b |= (vs[i] << 1); break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_i4004(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_i4004(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'f') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_i4004 = { + .id = "i4004", + .descr = "Intel 4004", + .matcht = s_matchtab_i4004, + .matchf = match_i4004, + .genf = gen_i4004, + .pat_char_rewind = pat_char_rewind_i4004, + .pat_next_str = pat_next_str_i4004, + .mask = 1 +}; + +const struct target s_target_i4040 = { + .id = "i4040", + .descr = "Intel 4040", + .matcht = s_matchtab_i4004, + .matchf = match_i4004, + .genf = gen_i4004, + .pat_char_rewind = pat_char_rewind_i4004, + .pat_next_str = pat_next_str_i4004, + .mask = 3 +}; + diff --git a/Tools/unix/uz80as/i8008.c b/Tools/unix/uz80as/i8008.c new file mode 100644 index 00000000..a7fd9f58 --- /dev/null +++ b/Tools/unix/uz80as/i8008.c @@ -0,0 +1,220 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Intel 8008. + * =========================================================================== + */ + +/* Max. memory 16K (14 bits addresses). */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: ADA,ADB,ADC,ADD,ADH,ADL,ADM, + * ACA,ACB,ACC,ACD,ACH,ACL,ACM, + * SUA,SUB,SUC,SUD,SUH,SUL,SUM, + * SBA,SBB,SBC,SBD,SBH,SBL,SBM, + * NDA,NDB,NDC,NDD,NDH,NDL,NDM, + * XRA,XRB,XRC,XRD,XRH,XRL,XRM, + * ORA,ORB,ORC,ORD,ORH,ORL,ORM, + * CPA,CPB,CPC,CPD,CPH,CPL,CPM + * c: NOP,LAB,LAC,LAD,LAE,LAH,LAL,LAM, + * LBA,LBB,LBC,LBD,LBE,LBH,LBL,LBM, + * LCA,LCB,LCC,LCD,LCE,LCH,LCL,LCM, + * LDA,LDB,LDC,LDD,LDE,LDH,LDL,LDM, + * LEA,LEB,LEC,LED,LEE,LEH,LEL,LEM, + * LHA,LHB,LHC,LHD,LHE,LHH,LHL,LHM, + * LLA,LLB,LLC,LLD,LLE,LLH,LLL,LLM, + * LMA,LMB,LMC,LMD,LME,LMH,LML,HLT + * d: JFC,CFC,JMP,CAL,JFZ,CFZ, + * JFS,CFS,JFP,CFP, + * JTC,CTC,JTZ,CTZ, + * JTS,CTS,JTP,CTP + * e: INB,INC,IND,INE,INH,INL + * f: DCB,DCC,DCD,DCE,DCH,DCL + * g: ADI,ACI,SUI,SBI,NDI,XRI,ORI,CPI + * h: LAI,LBI,LCI,LDI,LEI,LHI,LLI,LMI + * i: RFC,RFS,RTC,RTS,RFZ,RFP,RTZ,RTP + * j: RLC,RRC,RAL,RAR + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: (op << 1) | lastbyte, op in [0-7] + * g: (op << 1) | lastbyte, op in [8-31] + * h: (op << 4) | lastbyte + * i: (op << 1) | lastbyte + * j: (op << 3) | lastbyte, op in [0-7] + */ + +static const struct matchtab s_matchtab_i8008[] = { + { "RET", "07.", 1, 0 }, + { "j", "02b0.", 1, 0 }, + { "i", "03b0.", 1, 0 }, + { "h a", "06b0.d1.", 1, 0, "e8" }, + { "g a", "04b0.d1.", 1, 0, "e8" }, + { "e", "00b0.", 1, 0 }, + { "f", "01b0.", 1, 0 }, + { "RST a", "05j0.", 1, 0, "b3" }, + { "d a", "40i0.e1", 1, 0 }, + { "INP a", "41f0.", 1, 0, "b3" }, + { "OUT a", "41g0.", 1, 0, "kk" }, + { "b", "80c0.", 1, 0 }, + { "c", "C0c0.", 1, 0 }, + { NULL, NULL }, +}; + +static const char *const bval[] = { +"ADA", "ADB", "ADC", "ADD", "ADE", "ADH", "ADL", "ADM", +"ACA", "ACB", "ACC", "ACD", "ACE", "ACH", "ACL", "ACM", +"SUA", "SUB", "SUC", "SUD", "SUE", "SUH", "SUL", "SUM", +"SBA", "SBB", "SBC", "SBD", "SBE", "SBH", "SBL", "SBM", +"NDA", "NDB", "NDC", "NDD", "NDE", "NDH", "NDL", "NDM", +"XRA", "XRB", "XRC", "XRD", "XRE", "XRH", "XRL", "XRM", +"ORA", "ORB", "ORC", "ORD", "ORE", "ORH", "ORL", "ORM", +"CPA", "CPB", "CPC", "CPD", "CPE", "CPH", "CPL", "CPM", +NULL }; + +static const char *const cval[] = { +"NOP", "LAB", "LAC", "LAD", "LAE", "LAH", "LAL", "LAM", +"LBA", "LBB", "LBC", "LBD", "LBE", "LBH", "LBL", "LBM", +"LCA", "LCB", "LCC", "LCD", "LCE", "LCH", "LCL", "LCM", +"LDA", "LDB", "LDC", "LDD", "LDE", "LDH", "LDL", "LDM", +"LEA", "LEB", "LEC", "LED", "LEE", "LEH", "LEL", "LEM", +"LHA", "LHB", "LHC", "LHD", "LHE", "LHH", "LHL", "LHM", +"LLA", "LLB", "LLC", "LLD", "LLE", "LLH", "LLL", "LLM", +"LMA", "LMB", "LMC", "LMD", "LME", "LMH", "LML", "HLT", +NULL }; + +static const char *const dval[] = { +"JFC", "CFC", "JMP", "CAL", "JFZ", "CFZ", "", "", +"JFS", "CFS", "", "", "JFP", "CFP", "", "", +"JTC", "CTC", "", "", "JTZ", "CTZ", "", "", +"JTS", "CTS", "", "", "JTP", "CTP", +NULL }; + +static const char *const eval[] = { "", "INB", "INC", "IND", + "INE", "INH", "INL", + NULL }; + +static const char *const fval[] = { "", "DCB", "DCC", "DCD", + "DCE", "DCH", "DCL", + NULL }; + +static const char *const gval[] = { "ADI", "ACI", "SUI", "SBI", + "NDI", "XRI", "ORI", "CPI", + NULL }; + +static const char *const hval[] = { "LAI", "LBI", "LCI", "LDI", + "LEI", "LHI", "LLI", "LMI", + NULL }; + +static const char *const ival[] = { "RFC", "RFZ", "RFS", "RFP", + "RTC", "RTZ", "RTS", "RTP", + NULL }; + +static const char *const jval[] = { "RLC", "RRC", "RAL", "RAR", + NULL }; + +static const char *const *const valtab[] = { + bval, cval, dval, eval, fval, + gval, hval, ival, jval +}; + +static int match_i8008(char c, const char *p, const char **q) +{ + int v; + + if (c <= 'j') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_i8008(int *eb, char p, const int *vs, int i, int savepc) +{ + int b; + + b = *eb; + switch (p) { + case 'f': if (s_pass > 0 && (vs[i] < 0 || vs[i] > 7)) { + eprint(_("argument (%d) must be in range [0-7]\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b |= (vs[i] << 1); + break; + case 'g': if (s_pass > 0 && (vs[i] < 8 || vs[i] > 31)) { + eprint(_("argument (%d) must be in range [8-31]\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b |= (vs[i] << 1); + break; + case 'h': b |= (vs[i] << 4); break; + case 'i': b |= (vs[i] << 1); break; + case 'j': if (s_pass > 0 && (vs[i] < 0 || vs[i] > 7)) { + eprint(_("argument (%d) must be in range [0-7]\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b |= (vs[i] << 3); + break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_i8008(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_i8008(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'j') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_i8008 = { + .id = "i8008", + .descr = "Intel 8008", + .matcht = s_matchtab_i8008, + .matchf = match_i8008, + .genf = gen_i8008, + .pat_char_rewind = pat_char_rewind_i8008, + .pat_next_str = pat_next_str_i8008, + .mask = 1 +}; + diff --git a/Tools/unix/uz80as/i8048.c b/Tools/unix/uz80as/i8048.c new file mode 100644 index 00000000..1526d252 --- /dev/null +++ b/Tools/unix/uz80as/i8048.c @@ -0,0 +1,276 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Intel 8021. + * Intel 8022. + * Intel 8041. + * Intel 8048. + * =========================================================================== + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: R0,R1,R2,R3,R4,R5,R6,R7 + * c: R0,R1 + * d: P1,P2 + * e: P4,P5,P6,P7 + * f: JB0,JB1,JB2,JB3,JB4,JB5,JB6,JB7 + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: output lastbyte | ((op & 0x700) >> 3) + * output op as 8 bit value + * (no '.' should follow) + * g: (op << 5) | lastbyte + */ + +static const struct matchtab s_matchtab_i8048[] = { + { "NOP", "00.", 1, 0 }, + { "ADD A,b", "68c0.", 1, 0 }, + { "ADD A,@c", "60c0.", 1, 0 }, + { "ADD A,#a", "03.d0.", 1, 0, "e8" }, + { "ADDC A,b", "78c0.", 1, 0 }, + { "ADDC A,@c", "70c0.", 1, 0 }, + { "ADDC A,#a", "13.d0.", 1, 0, "e8" }, + { "ANL A,b", "58c0.", 1, 0 }, + { "ANL A,@c", "50c0.", 1, 0 }, + { "ANL A,#a", "53.d0.", 1, 0, "e8" }, + { "ANL BUS,#a", "98.d0.", 32, 0, "e8" }, + { "ANL d,#a", "98c0.d1.", 4, 0, "e8" }, + { "ANLD e,A", "9Cc0.", 1, 0 }, + { "CALL a", "14f0", 1, 0 }, + { "CLR A", "27.", 1, 0 }, + { "CLR C", "97.", 1, 0 }, + { "CLR F1", "A5.", 4, 0 }, + { "CLR F0", "85.", 4, 0 }, + { "CPL A", "37.", 1, 0 }, + { "CPL C", "A7.", 1, 0 }, + { "CPL F0", "95.", 4, 0 }, + { "CPL F1", "B5.", 4, 0 }, + { "DA A", "57.", 1, 0 }, + { "DEC A", "07.", 1, 0 }, + { "DEC b", "C8c0.", 4, 0 }, + { "DIS I", "15.", 2, 0 }, + { "DIS TCNTI", "35.", 2, 0 }, + { "DJNZ b,a", "E8c0.d1.", 1, 0, "e8" }, + { "EN DMA", "E5.", 64, 0 }, + { "EN FLAGS", "F5.", 64, 0 }, + { "EN I", "05.", 2, 0 }, + { "EN TCNTI", "25.", 2, 0 }, + { "ENT0 CLK", "75.", 32, 0 }, + { "IN A,DBB", "22.", 64, 0 }, + { "IN A,P0", "08.", 8, 0 }, + { "IN A,d", "08c0.", 1, 0 }, + { "INC A", "17.", 1, 0 }, + { "INC b", "18c0.", 1, 0 }, + { "INC @c", "10c0.", 1, 0 }, + { "INS A,BUS", "08.", 32, 0 }, + { "f a", "12g0.d1.", 4, 0, "e8" }, + { "JC a", "F6.d0.", 1, 0, "e8" }, + { "JF0 a", "B6.d0.", 4, 0, "e8" }, + { "JF1 a", "76.d0.", 4, 0, "e8" }, + { "JMP a", "04f0", 1, 0, "e11" }, + { "JMPP @A", "B3.", 1, 0 }, + { "JNC a", "E6.d0.", 1, 0, "e8" }, + { "JNI a", "86.d0.", 32, 0, "e8" }, + { "JNIBF a", "D6.d0.", 64, 0, "e8" }, + { "JNT0 a", "26.d0.", 2, 0, "e8" }, + { "JNT1 a", "46.d0.", 1, 0, "e8" }, + { "JNZ a", "96.d0.", 1, 0, "e8" }, + { "JOBF a", "86.d0.", 64, 0, "e8" }, + { "JTF a", "16.d0.", 1, 0, "e8" }, + { "JT0 a", "36.d0.", 2, 0, "e8" }, + { "JT1 a", "56.d0.", 1, 0, "e8" }, + { "JZ a", "C6.d0.", 1, 0, "e8" }, + { "MOV A,#a", "23.d0.", 1, 0, "e8" }, + { "MOV A,PSW", "C7.", 4, 0 }, + { "MOV A,b", "F8c0.", 1, 0 }, + { "MOV A,@c", "F0c0.", 1, 0 }, + { "MOV A,T", "42.", 1, 0 }, + { "MOV PSW,A", "D7.", 4, 0 }, + { "MOV b,A", "A8c0.", 1, 0 }, + { "MOV b,#a", "B8c0.d1.", 1, 0, "e8" }, + { "MOV @c,A", "A0c0.", 1, 0 }, + { "MOV @c,#a", "B0c0.d1.", 1, 0, "e8" }, + { "MOV STS,A", "90.", 64, 0 }, + { "MOV T,A", "62.", 1, 0 }, + { "MOVD A,e", "0Cc0.", 1, 0 }, + { "MOVD e,A", "3Cc0.", 1, 0 }, + { "MOVP A,@A", "A3.", 1, 0 }, + { "MOVP3 A,@A", "E3.", 4, 0 }, + { "MOVX A,@c", "80c0.", 32, 0 }, + { "MOVX @c,A", "90c0.", 32, 0 }, + { "NOP", "00.", 1, 0 }, + { "ORL A,b", "48c0.", 1, 0 }, + { "ORL A,@c", "40c0.", 1, 0 }, + { "ORL A,#a", "43.d0.", 1, 0, "e8" }, + { "ORL BUS,#a", "88.d0.", 32, 0, "e8" }, + { "ORL d,#a", "88c0.d1.", 4, 0, "e8" }, + { "ORLD e,A", "8Cc0.", 1, 0 }, + { "OUT DBB,A", "02.", 64, 0 }, + { "OUTL BUS,A", "02.", 32, 0 }, + { "OUTL P0,A", "90.", 8, 0 }, + { "OUTL d,A", "38c0.", 1, 0 }, + { "RAD", "80.", 16, 0 }, + { "RET", "83.", 1, 0 }, + { "RETR", "93.", 4, 0 }, + { "RETI", "93.", 16, 0 }, + { "RL A", "E7.", 1, 0 }, + { "RLC A", "F7.", 1, 0 }, + { "RR A", "77.", 1, 0 }, + { "RRC A", "67.", 1, 0 }, + { "SEL AN0", "85.", 16, 0 }, + { "SEL AN1", "95.", 16, 0 }, + { "SEL MB0", "E5.", 32, 0 }, + { "SEL MB1", "F5.", 32, 0 }, + { "SEL RB0", "C5.", 4, 0 }, + { "SEL RB1", "D5.", 4, 0 }, + { "STOP TCNT", "65.", 1, 0 }, + { "STRT CNT", "45.", 1, 0 }, + { "STRT T", "55.", 1, 0 }, + { "SWAP A", "47.", 1, 0 }, + { "XCH A,b", "28c0.", 1, 0 }, + { "XCH A,@c", "20c0.", 1, 0 }, + { "XCHD A,@c", "30c0.", 1, 0 }, + { "XRL A,b", "D8c0.", 1, 0 }, + { "XRL A,@c", "D0c0.", 1, 0 }, + { "XRL A,#a", "D3.d0.", 1, 0, "e8" }, + { NULL, NULL }, +}; + +static const char *const bval[] = { +"R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", +NULL }; + +static const char *const cval[] = { +"R0", "R1", +NULL }; + +static const char *const dval[] = { +"", "P1", "P2", +NULL }; + +static const char *const eval[] = { +"P4", "P5", "P6", "P7", +NULL }; + +static const char *const fval[] = { +"JB0", "JB1", "JB2", "JB3", "JB4", "JB5", "JB6", "JB7", +NULL }; + +static const char *const *const valtab[] = { + bval, cval, dval, eval, fval +}; + +static int match_i8048(char c, const char *p, const char **q) +{ + int v; + + if (c <= 'f') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_i8048(int *eb, char p, const int *vs, int i, int savepc) +{ + int b; + + b = *eb; + switch (p) { + case 'f': b |= ((vs[i] & 0x700) >> 3); + genb(b, s_pline_ep); + genb(vs[i], s_pline_ep); + break; + case 'g': b |= (vs[i] << 5); + break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_i8048(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_i8048(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'f') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_i8041 = { + .id = "i8041", + .descr = "Intel 8041", + .matcht = s_matchtab_i8048, + .matchf = match_i8048, + .genf = gen_i8048, + .pat_char_rewind = pat_char_rewind_i8048, + .pat_next_str = pat_next_str_i8048, + .mask = 71 +}; + +const struct target s_target_i8048 = { + .id = "i8048", + .descr = "Intel 8048", + .matcht = s_matchtab_i8048, + .matchf = match_i8048, + .genf = gen_i8048, + .pat_char_rewind = pat_char_rewind_i8048, + .pat_next_str = pat_next_str_i8048, + .mask = 39 +}; + +const struct target s_target_i8021 = { + .id = "i8021", + .descr = "Intel 8021", + .matcht = s_matchtab_i8048, + .matchf = match_i8048, + .genf = gen_i8048, + .pat_char_rewind = pat_char_rewind_i8048, + .pat_next_str = pat_next_str_i8048, + .mask = 9 +}; + +const struct target s_target_i8022 = { + .id = "i8022", + .descr = "Intel 8022", + .matcht = s_matchtab_i8048, + .matchf = match_i8048, + .genf = gen_i8048, + .pat_char_rewind = pat_char_rewind_i8048, + .pat_next_str = pat_next_str_i8048, + .mask = 27 +}; + diff --git a/Tools/unix/uz80as/i8051.c b/Tools/unix/uz80as/i8051.c new file mode 100644 index 00000000..034e1292 --- /dev/null +++ b/Tools/unix/uz80as/i8051.c @@ -0,0 +1,244 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Intel 8051. + * =========================================================================== + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: R0,R1,R2,R3,R4,R5,R6,R7 + * c: R0,R1 + * d: ADD,ADDC,ORL,ANL,XRL,SUBB,XCH,MOV + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: output lastbyte | ((op & 0x700) >> 3) + * output op as 8 bit value + * (no '.' should follow) + * g: relative jump -2 + * h: relative jump -3 + * i: ouput op as big endian word + * j: b + (op << 4) + */ + +static const struct matchtab s_matchtab_i8051[] = { + { "ACALL a", "11f0", 1, 0, "e11" }, + { "d A,b", "08j0c1.", 1, 0 }, + { "d A,@c", "06j0c1.", 1, 0 }, + { "ADD A,#a", "24.d0.", 1, 0, "e8" }, + { "ADDC A,#a", "34.d0.", 1, 0, "e8" }, + { "ORL A,#a", "44.d0.", 1, 0, "e8" }, + { "ANL A,#a", "54.d0.", 1, 0, "e8" }, + { "XRL A,#a", "64.d0.", 1, 0, "e8" }, + { "SUBB A,#a", "94.d0.", 1, 0, "e8" }, + { "MOV A,#a", "74.d0.", 1, 0, "e8" }, + { "d A,a", "05j0.d1.", 1, 0, "e8" }, + // { "ADD A,b", "28c0.", 1, 0 }, + // { "ADD A,@c", "26c0.", 1, 0 }, + // { "ADD A,a", "25.d0.", 1, 0, "e8" }, + // { "ADDC A,b", "38c0.", 1, 0 }, + // { "ADDC A,@c", "36c0.", 1, 0 }, + // { "ADDC A,a", "35.d0.", 1, 0, "e8" }, + { "AJMP a", "01f0", 1, 0, "e11" }, + // { "ANL A,b", "58c0.", 1, 0 }, + // { "ANL A,@c", "56c0.", 1, 0 }, + // { "ANL A,a", "55.d0.", 1, 0, "e8" }, + { "ANL C,/a", "B0.d0.", 1, 0, "e8" }, + { "ANL C,a", "82.d0.", 1, 0, "e8" }, + { "ANL a,A", "52.d0.", 1, 0 }, + { "ANL a,#a", "53.d0.d1.", 1, 0, "e8e8" }, + { "CJNE A,#a,a", "B4.d0.h1.", 1, 0, "e8r8" }, + { "CJNE b,#a,a", "B8c0.d1.h2.", 1, 0, "e8r8" }, + { "CJNE @c,#a,a", "B6c0.d1.h2.", 1, 0, "e8r8" }, + { "CJNE A,a,a", "B5.d0.h1.", 1, 0, "e8r8" }, + { "CLR A", "E4.", 1, 0 }, + { "CLR C", "C3.", 1, 0 }, + { "CLR a", "C2.d0.", 1, 0, "e8" }, + { "CPL A", "F4.", 1, 0 }, + { "CPL C", "B3.", 1, 0 }, + { "CPL a", "B2.d0.", 1, 0, "e8" }, + { "DA A", "D4.", 1, 0 }, + { "DEC A", "14.", 1, 0 }, + { "DEC b", "18c0.", 1, 0 }, + { "DEC @c", "16c0.", 1, 0 }, + { "DEC a", "15.d0.", 1, 0, "e8" }, + { "DIV AB", "84.", 1, 0 }, + { "DJNZ b,a", "D8c0.g1.", 1, 0, "r8" }, + { "DJNZ a,a", "D5.d0.h1.", 1, 0, "e8r8" }, + { "INC DPTR", "A3.", 1, 0 }, + { "INC A", "04.", 1, 0 }, + { "INC b", "08c0.", 1, 0 }, + { "INC @c", "06c0.", 1, 0 }, + { "INC a", "05.d0.", 1, 0, "e8" }, + { "JB a,a", "20.d0.h1.", 1, 0, "e8r8" }, + { "JBC a,a", "10.d0.h1.", 1, 0, "e8r8" }, + { "JC a", "40.g0.", 1, 0, "r8" }, + { "JMP @A+DPTR", "73.", 1, 0 }, + { "JNB a,a", "30.d0.h1.", 1, 0, "e8r8" }, + { "JNC a", "50.g0.", 1, 0, "r8" }, + { "JNZ a", "70.g0.", 1, 0, "r8" }, + { "JZ a", "60.g0.", 1, 0, "r8" }, + { "LCALL a", "12.i0", 1, 0 }, + { "LJMP a", "02.i0", 1, 0 }, + // { "MOV A,b", "E8c0.", 1, 0 }, + // { "MOV A,@c", "E6c0.", 1, 0 }, + // { "MOV A,a", "E5.d0.", 1, 0, "e8" }, // MOV A,ACC not valid? + { "MOV b,A", "F8c0.", 1, 0 }, + { "MOV b,#a", "78c0.d1.", 1, 0, "e8" }, + { "MOV b,a", "A8c0.d1.", 1, 0, "e8" }, + { "MOV @c,A", "F6c0.", 1, 0 }, + { "MOV @c,#a", "76c0.d1.", 1, 0, "e8" }, + { "MOV @c,a", "A6c0.d1.", 1, 0, "e8" }, + { "MOV C,a", "A2.d0.", 1, 0, "e8" }, + { "MOV DPTR,#a", "90.i0", 1, 0, "e8" }, + { "MOV a,A", "F5.d0.", 1, 0, "e8" }, + { "MOV a,C", "92.d0.", 1, 0, "e8" }, + { "MOV a,b", "88c1.d0.", 1, 0, "e8" }, + { "MOV a,@c", "86c1.d0.", 1, 0, "e8" }, + { "MOV a,#a", "75.d0.d1.", 1, 0, "e8e8" }, + { "MOV a,a", "85.d1.d0.", 1, 0, "e8e8" }, + { "MOVC A,@A+DPTR", "93.", 1, 0 }, + { "MOVC A,@A+PC", "83.", 1, 0 }, + { "MOVX A,@c", "E2c0.", 1, 0 }, + { "MOVX A,@DPTR", "E0.", 1, 0 }, + { "MOVX @c,A", "F2c0.", 1, 0 }, + { "MOVX @DPTR,A", "F0.", 1, 0 }, + { "MUL AB", "A4.", 1, 0 }, + { "NOP", "00.", 1, 0 }, + // { "ORL A,b", "48c0.", 1, 0 }, + // { "ORL A,@c", "46c0.", 1, 0 }, + // { "ORL A,a", "45.d0.", 1, 0, "e8" }, + { "ORL C,/a", "A0.d0.", 1, 0, "e8" }, + { "ORL C,a", "72.d0.", 1, 0, "e8" }, + { "ORL a,A", "42.d0.", 1, 0, "e8" }, + { "ORL a,#a", "43.d0.d1.", 1, 0, "e8e8" }, + { "POP a", "D0.d0.", 1, 0, "e8" }, + { "PUSH a", "C0.d0.", 1, 0, "e8" }, + { "RET", "22.", 1, 0 }, + { "RETI", "32.", 1, 0 }, + { "RL A", "23.", 1, 0 }, + { "RLC A", "33.", 1, 0 }, + { "RR A", "03.", 1, 0 }, + { "RRC A", "13.", 1, 0 }, + { "SETB C", "D3.", 1, 0 }, + { "SETB a", "D2.d0.", 1, 0, "e8" }, + { "SJMP a", "80.g0.", 1, 0, "r8" }, + // { "SUBB A,b", "98c0.", 1, 0 }, + // { "SUBB A,@c", "96c0.", 1, 0 }, + // { "SUBB A,a", "95.d0.", 1, 0, "e8" }, + { "SWAP A", "C4.", 1, 0 }, + // { "XCH A,b", "C8c0.", 1, 0 }, + // { "XCH A,@c", "C6c0.", 1, 0 }, + // { "XCH A,a", "C5.d0.", 1, 0, "e8" }, + { "XCHD A,@c", "D6c0.", 1, 0 }, + // { "XRL A,b", "68c0.", 1, 0 }, + // { "XRL A,@c", "66c0.", 1, 0 }, + // { "XRL A,a", "65.d0.", 1, 0, "e8" }, + { "XRL a,A", "62.d0.", 1, 0, "e8" }, + { "XRL a,#a", "63.d0.d1.", 1, 0, "e8e8" }, + { NULL, NULL }, +}; + +static const char *const bval[] = { +"R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", +NULL }; + +static const char *const cval[] = { +"R0", "R1", +NULL }; + +static const char *const dval[] = { +"", "", "ADD", "ADDC", "ORL", "ANL", "XRL", "", +"", "SUBB", "", "", "XCH", "", "MOV", +NULL }; + +static const char *const *const valtab[] = { + bval, cval, dval +}; + +static int match_i8051(char c, const char *p, const char **q) +{ + int v; + + if (c <= 'd') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_i8051(int *eb, char p, const int *vs, int i, int savepc) +{ + int b; + + b = *eb; + switch (p) { + case 'f': b |= ((vs[i] & 0x700) >> 3); + genb(b, s_pline_ep); + genb(vs[i], s_pline_ep); + break; + case 'g': b = (vs[i] - savepc - 2); break; + break; + case 'h': b = (vs[i] - savepc - 3); break; + break; + case 'i': genb(vs[i] >> 8, s_pline_ep); + genb(vs[i], s_pline_ep); + break; + case 'j': b += (vs[i] << 4); break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_i8051(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_i8051(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'd') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_i8051 = { + .id = "i8051", + .descr = "Intel 8051", + .matcht = s_matchtab_i8051, + .matchf = match_i8051, + .genf = gen_i8051, + .pat_char_rewind = pat_char_rewind_i8051, + .pat_next_str = pat_next_str_i8051, + .mask = 1 +}; + diff --git a/Tools/unix/uz80as/i8080.c b/Tools/unix/uz80as/i8080.c new file mode 100644 index 00000000..e0f7f51b --- /dev/null +++ b/Tools/unix/uz80as/i8080.c @@ -0,0 +1,214 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Intel 8080. + * =========================================================================== + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: B,C,D,E,H,L,M,A + * c: B,D,H,SP + * d: B,D + * e: B,D,H,PSW + * f: JNZ,JZ,JNC,JC,JPO,JPE,JP,JM + * g: CNZ,CZ,CNC,CC,CPO,CPE,CP,CM + * h: RNZ,RZ,RNC,RC,RPO,RPE,RP,RM + * i: B,C,D,E,H,L,A + * j: ADD,ADC,SUB,SBB,ANA,XRA,ORA,CMP + * k: RLC,RRC,RAL,RAR + * l: ADI,ACI,SUI,SBI,ANI,XRI,ORI,CPI + * m: SHLD,LHLD,STA,LDA + * n: DI,EI + * o: OUT,IN + * p: STC,CMC + * q: POP,PUSH + * r: STAX,LDAX + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: (op << 4) | lastbyte + * g: possible value to RST + * h: (op << 2) | lastbyte + */ + +static const struct matchtab s_matchtab_i8080[] = { + { "MOV M,i", "70c0.", 3, 0 }, + { "MOV i,M", "46b0.", 3, 0 }, + { "MOV i,i", "40b0c1.", 3, 0 }, + { "MVI b,a", "06b0.d1.", 3, 0, "e8" }, + { "LXI c,a", "01f0.e1", 3, 0 }, + { "m a", "22b0.e1", 3, 0 }, + { "r d", "02b0f1.", 3, 0 }, + { "XCHG", "EB.", 3, 0 }, + { "j b", "80b0c1.", 3, 0 }, + { "l a", "C6b0.d1.", 3, 0, "e8" }, + { "INR b", "04b0.", 3, 0 }, + { "DCR b", "05b0.", 3, 0 }, + { "INX c", "03f0.", 3, 0 }, + { "DCX c", "0Bf0.", 3, 0 }, + { "DAD c", "09f0.", 3, 0 }, + { "DAA", "27.", 3, 0 }, + { "k", "07b0.", 3, 0 }, + { "CMA", "2F.", 3, 0 }, + { "p", "37b0.", 3, 0 }, + { "JMP a", "C3.e0", 3, 0 }, + { "f a", "C2b0.e1", 3, 0 }, + { "CALL a", "CD.e0", 3, 0 }, + { "g a", "C4b0.e1", 3, 0 }, + { "RET", "C9.", 3, 0 }, + { "h", "C0b0.", 3, 0 }, + { "RST a", "C7g0.", 3, 0, "b3" }, + { "PCHL", "E9.", 3, 0 }, + { "q e", "C1h0f1.", 3, 0 }, + { "XTHL", "E3.", 3, 0 }, + { "SPHL", "F9.", 3, 0 }, + { "o a", "D3b0.d1.", 3, 0, "e8" }, + { "n", "F3b0.", 3, 0 }, + { "HLT", "76.", 3, 0 }, + { "NOP", "00.", 3, 0 }, + /* 8085 added instructions */ + { "RIM", "20.", 2, 0 }, + { "SIM", "30.", 2, 0 }, + { "ARHL", "10.", 2, 2 }, + { "DSUB", "08.", 2, 2 }, + { "RDEL", "18.", 2, 2 }, + { "LDHI a", "28.d0.", 2, 2, "e8" }, + { "LDSI a", "38.d0.", 2, 2, "e8" }, + { "RSTV", "CB.", 2, 2 }, + { "SHLX", "D9.", 2, 2 }, + { "LHLX", "ED.", 2, 2 }, + { "JNK a", "DD.e0", 2, 2 }, + { "JNX5 a", "DD.e0", 2, 2 }, + { "JNUI a", "DD.e0", 2, 2 }, + { "JK a", "FD.e0", 2, 2 }, + { "JX5 a", "FD.e0", 2, 2 }, + { "JUI a", "FD.e0", 2, 2 }, + { NULL, NULL }, +}; + +static const char *const bval[] = { "B", "C", "D", "E", + "H", "L", "M", "A", NULL }; +static const char *const cval[] = { "B", "D", "H", "SP", NULL }; +static const char *const dval[] = { "B", "D", NULL }; +static const char *const eval[] = { "B", "D", "H", "PSW", NULL }; +static const char *const fval[] = { "JNZ", "JZ", "JNC", "JC", + "JPO", "JPE", "JP", "JM", NULL }; +static const char *const gval[] = { "CNZ", "CZ", "CNC", "CC", + "CPO", "CPE", "CP", "CM", NULL }; +static const char *const hval[] = { "RNZ", "RZ", "RNC", "RC", + "RPO", "RPE", "RP", "RM", NULL }; +static const char *const ival[] = { "B", "C", "D", "E", + "H", "L", "", "A", NULL }; +static const char *const jval[] = { "ADD", "ADC", "SUB", "SBB", + "ANA", "XRA", "ORA", "CMP", NULL }; +static const char *const kval[] = { "RLC", "RRC", "RAL", "RAR", NULL }; +static const char *const lval[] = { "ADI", "ACI", "SUI", "SBI", + "ANI", "XRI", "ORI", "CPI", NULL }; +static const char *const mval[] = { "SHLD", "LHLD", "STA", "LDA", NULL }; +static const char *const nval[] = { "DI", "EI", NULL }; +static const char *const oval[] = { "OUT", "IN", NULL }; +static const char *const pval[] = { "STC", "CMC", NULL }; +static const char *const qval[] = { "POP", "PUSH", NULL }; +static const char *const rval[] = { "STAX", "LDAX", NULL }; + +static const char *const *const valtab[] = { + bval, cval, dval, eval, fval, + gval, hval, ival, jval, kval, + lval, mval, nval, oval, pval, + qval, rval +}; + +static int match_i8080(char c, const char *p, const char **q) +{ + int v; + + if (c <= 'r') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_i8080(int *eb, char p, const int *vs, int i, int savepc) +{ + int b; + + b = *eb; + switch (p) { + case 'f': b |= (vs[i] << 4); break; + case 'g': if (s_pass > 0 && (vs[i] & ~7) != 0) { + eprint(_("invalid RST argument (%d)\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b |= (vs[i] << 3); + break; + case 'h': b |= (vs[i] << 2); break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_i8080(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_i8080(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'r') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_i8080 = { + .id = "i8080", + .descr = "Intel 8080", + .matcht = s_matchtab_i8080, + .matchf = match_i8080, + .genf = gen_i8080, + .pat_char_rewind = pat_char_rewind_i8080, + .pat_next_str = pat_next_str_i8080, + .mask = 1 +}; + +const struct target s_target_i8085 = { + .id = "i8085", + .descr = "Intel 8085", + .matcht = s_matchtab_i8080, + .matchf = match_i8080, + .genf = gen_i8080, + .pat_char_rewind = pat_char_rewind_i8080, + .pat_next_str = pat_next_str_i8080, + .mask = 2 +}; diff --git a/Tools/unix/uz80as/incl.c b/Tools/unix/uz80as/incl.c new file mode 100644 index 00000000..e11d4675 --- /dev/null +++ b/Tools/unix/uz80as/incl.c @@ -0,0 +1,81 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Include file stack. + * =========================================================================== + */ + +#include "config.h" +#include "incl.h" +#include "utils.h" +#include "err.h" + +#ifndef ASSERT_H +#include +#endif + +#ifndef STDIO_H +#include +#endif + +#ifndef STDLIB_H +#include +#endif + +/* Max number of nested included files. */ +#define NFILES 128 + +/* Number of nested files. */ +static int s_nfiles; + +/* Current file. */ +static struct incfile *s_curfile; + +/* Get the current file. Never returns NULL. */ +struct incfile *curfile(void) +{ + assert(s_curfile != NULL); + return s_curfile; +} + +/* The number of nested files. 0 means no file loaded. */ +int nfiles(void) +{ + return s_nfiles; +} + +/* Leave the current included file. */ +void popfile(void) +{ + struct incfile *ifile; + + assert(s_curfile != NULL); + fclose(s_curfile->fin); + ifile = s_curfile; + s_curfile = ifile->prev; + free(ifile); + s_nfiles--; +} + +/* Include a file whose name is [p, q[. */ +void pushfile(const char *p, const char *q) +{ + struct incfile *ifile; + + if (s_nfiles == NFILES) { + eprint(_("maximum number of nested includes exceeded (%d)\n"), + NFILES); + exit(EXIT_FAILURE); + } + + // printf("pushfile: %s\n", p); + ifile = emalloc((sizeof *ifile) + (q - p) + 1); + ifile->name = (char *) ((unsigned char *) ifile + sizeof *ifile); + copychars(ifile->name, p, q); + + ifile->fin = efopen(ifile->name, "r"); + ifile->linenum = 0; + ifile->prev = s_curfile; + s_curfile = ifile; + s_nfiles++; +} diff --git a/Tools/unix/uz80as/incl.h b/Tools/unix/uz80as/incl.h new file mode 100644 index 00000000..1da62f61 --- /dev/null +++ b/Tools/unix/uz80as/incl.h @@ -0,0 +1,28 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Include file stack. + * =========================================================================== + */ + +#ifndef INCL_H +#define INCL_H + +#ifndef STDIO_H +#define STDIO_H +#include +#endif + +struct incfile { + struct incfile *prev; + FILE *fin; + int linenum; + char *name; +}; + +void pushfile(const char *p, const char *q); +void popfile(void); +struct incfile *curfile(void); +int nfiles(void); + +#endif diff --git a/Tools/unix/uz80as/list.c b/Tools/unix/uz80as/list.c new file mode 100644 index 00000000..f340e30b --- /dev/null +++ b/Tools/unix/uz80as/list.c @@ -0,0 +1,164 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Assembly listing generation. + * =========================================================================== + */ + +#include "config.h" +#include "list.h" +#include "err.h" + +#ifndef STDIO_H +#include +#endif + +#ifndef STLIB_H +#include +#endif + +#ifndef STRING_H +#include +#endif + +static FILE *s_list_file; + +/* N characters in current line. */ +static int s_nchars; + +/* Generated data bytes in this line. */ +static int s_nbytes; + +/* Line text. */ +static const char *s_line; + +/* Line number. */ +static int s_linenum; + +/* Program counter. */ +static int s_pc; + +/* Number of current nested files. */ +static int s_nfiles; + +/* If listing line number, etc are generated or just the line. */ +int s_codes = 1; + +/* If listing is enabled or not. */ +int s_list_on = 1; + +/* If we are skipping lines. */ +static int s_skip_on = 0; + +void list_open(const char *fname) +{ + s_list_file = fopen(fname, "w"); + if (s_list_file == NULL) { + eprint(_("cannot open file %s\n"), fname); + } +} + +void list_close(void) +{ + if (s_list_file != NULL) + fclose(s_list_file); +} + +static void prhead(void) +{ + int i, j, n; + + s_nchars = fprintf(s_list_file, "%-.4d", s_linenum); + + n = 7 - s_nchars; + if (n <= 0) + n = 1; + j = 0; + if (s_nfiles > 0) + j = s_nfiles - 1; + if (j > n) + j = n; + for (i = 0; i < j; i++) + fputc('+', s_list_file); + j = n - j; + while (j--) + fputc(' ', s_list_file); + s_nchars += n; + + s_nchars += fprintf(s_list_file, "%.4X", s_pc); + if (s_skip_on) + fputc('~', s_list_file); + else + fputc(' ', s_list_file); + s_nchars += 1; +} + +static void prline(void) +{ + if (s_line == NULL) { + fputs("\n", s_list_file); + } else { + if (s_codes) { + while (s_nchars < 24) { + s_nchars++; + fputc(' ', s_list_file); + } + } + fprintf(s_list_file, "%s\n", s_line); + s_line = NULL; + } + s_nchars = 0; + s_nbytes = 0; +} + +void list_startln(const char *line, int linenum, int pc, int nested_files) +{ + if (s_list_file == NULL) + return; + s_linenum = linenum; + s_pc = pc; + s_line = line; + s_nchars = 0; + s_nbytes = 0; + s_nfiles = nested_files; +} + +void list_setpc(int pc) +{ + s_pc = pc; +} + +void list_skip(int on) +{ + s_skip_on = on; +} + +void list_eject(void) +{ + if (s_list_file == NULL || !s_list_on) + return; +} + +void list_genb(int b) +{ + if (s_list_file == NULL || !s_codes || !s_list_on) + return; + if (s_nchars == 0) + prhead(); + if (s_nbytes >= 4) { + prline(); + prhead(); + } + s_nchars += fprintf(s_list_file, "%2.2X ", (b & 0xff)); + s_nbytes++; + s_pc++; +} + +void list_endln(void) +{ + if (s_list_file == NULL || !s_list_on) + return; + if (s_codes && s_nchars == 0) + prhead(); + prline(); +} diff --git a/Tools/unix/uz80as/list.h b/Tools/unix/uz80as/list.h new file mode 100644 index 00000000..7868cd29 --- /dev/null +++ b/Tools/unix/uz80as/list.h @@ -0,0 +1,23 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Assembly listing generation. + * =========================================================================== + */ + +#ifndef LIST_H +#define LIST_H + +extern int s_codes; +extern int s_list_on; + +void list_open(const char *fname); +void list_close(void); +void list_startln(const char *line, int linenum, int pc, int nested_files); +void list_setpc(int pc); +void list_skip(int on); +void list_eject(void); +void list_genb(int b); +void list_endln(void); + +#endif diff --git a/Tools/unix/uz80as/main.c b/Tools/unix/uz80as/main.c new file mode 100644 index 00000000..e3e3ff1e --- /dev/null +++ b/Tools/unix/uz80as/main.c @@ -0,0 +1,303 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * main(), handling of command line options. + * =========================================================================== + */ + +#include "config.h" +#include "ngetopt.h" +#include "options.h" +#include "utils.h" +#include "err.h" +#include "uz80as.h" +#include "prtable.h" +#include "targets.h" + +#ifndef STDIO_H +#include +#endif + +#ifndef STDLIB_H +#include +#endif + +#ifndef STRING_H +#include +#endif + +#ifndef CTYPE_H +#include +#endif + +void print_copyright(FILE *f) +{ + static const char *copyright = +"Copyright (C) " COPYRIGHT_YEARS " Jorge Giner Cordero.\n"; + + fputs(copyright, f); +} + +static void print_license(FILE *f) +{ + static const char *license[] = { +"Permission is hereby granted, free of charge, to any person obtaining", +"a copy of this software and associated documentation files (the", +"\"Software\"), to deal in the Software without restriction, including", +"without limitation the rights to use, copy, modify, merge, publish,", +"distribute, sublicense, and/or sell copies of the Software, and to", +"permit persons to whom the Software is furnished to do so, subject to", +"the following conditions:", +"", +"The above copyright notice and this permission notice shall be included", +"in all copies or substantial portions of the Software.", +"", +"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,", +"EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", +"MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.", +"IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", +"CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", +"TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE", +"SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + }; + + int i; + + for (i = 0; i < NELEMS(license); i++) { + fprintf(f, "%s\n", license[i]); + } +} + +static void print_version(FILE *f) +{ + const struct target *p; + + fputs(PACKAGE_STRING, f); + fputs("\n", f); + fputs("Targets:", f); + for (p = first_target(); p != NULL; p = next_target()) { + fprintf(f, " %s", p->id); + } + fputs("\n", f); +} + +static void print_help(const char *argv0) +{ + static const char *help = +"Usage: %s [OPTION]... ASM_FILE [OBJ_FILE [LST_FILE]]\n" +"\n" +"Assemble ASM_FILE into OBJ_FILE and generate the listing LST_FILE.\n" +"If not specified, OBJ_FILE is ASM_FILE with the extension changed to .obj.\n" +"If not specified, LST_FILE is ASM_FILE with the extension changed to .lst.\n" +"\n" +"Options:\n" +" -h, --help Display this help and exit.\n" +" -V, --verbose be chatty.\n" +" -v, --version Output version information and exit.\n" +" -l, --license Display the license text and exit.\n" +" -d, --define=MACRO Define a macro.\n" +" -f, --fill=n Fill memory with value n.\n" +" -q, --quiet Do not generate the listing file.\n" +" -x, --extended Enable extended instruction syntax.\n" +" -u, --undocumented Enable undocumented instructions.\n" +" -t, --target=NAME Select the target micro. z80 is the default.\n" +" -e, --list-targets List the targets supported.\n" +"\n" +"Examples:\n" +" " PACKAGE " p.asm Assemble p.asm into p.obj\n" +" " PACKAGE " p.asm p.bin Assemble p.asm into p.bin\n" +" " PACKAGE " -d\"MUL(a,b) (a*b)\" p.asm Define the macro MUL and assemble p.asm\n" +"\n" +"Report bugs to: <" PACKAGE_BUGREPORT ">.\n" +"Home page: <" PACKAGE_URL ">.\n"; + + printf(help, argv0); +} + +/* + * Get the filename part of fname (that is, for ../../fname.abc, get + * fname.abc). + * Then substitute the extension .abd by .ext or append .ext. + */ +static char *mkfname(const char *fname, const char *ext) +{ + size_t alen, elen; + const char *p, *q; + char *s; + + alen = strlen(fname); + elen = strlen(ext); + + /* Find start of filename in path string */ + p = fname + alen; + while (p > fname && *p != '/' && *p != '\\') + p--; + + if (*p == '/' || *p == '\\') + p++; + + /* Find the extension */ + q = fname + alen; + while (q > p && *q != '.') + q--; + + if (*q != '.') + q = fname + alen; + + s = emalloc((q - p) + 1 + elen + 1); + if (q > p) + memmove(s, p, (q - p)); + s[q - p] = '\0'; + strcat(s, "."); + strcat(s, ext); + return s; +} + +static void parse_fill_byte(const char *optarg) +{ + int hi, lo; + + if (strlen(optarg) != 2) + goto error; + + if ((hi = hexval(optarg[0])) < 0) + goto error; + if ((lo = hexval(optarg[1])) < 0) + goto error; + + s_mem_fillval = hi * 16 + lo; + return; + +error: eprogname(); + fprintf(stderr, _("invalid command line fill value (%s)\n"), optarg); + eprogname(); + fprintf(stderr, " "); + fprintf(stderr, _("Please, use two hexadecimal digits.\n")); + exit(EXIT_FAILURE); +} + +static void parse_target_id(const char *optarg) +{ + const struct target *p; + + p = find_target(optarg); + if (p == NULL) { + eprogname(); + fprintf(stderr, _("invalid target '%s'\n"), optarg); + exit(EXIT_FAILURE); + } else { + s_target_id = p->id; + } +} + +static void list_targets(FILE *f) +{ + const struct target *p; + + for (p = first_target(); p != NULL; p = next_target()) { + fprintf(f, "%-14s%s\n", p->id, p->descr); + } +} + +int main(int argc, char *argv[]) +{ + int c; + struct ngetopt ngo; + + static struct ngetopt_opt ops[] = { + { "define", 1, 'd' }, + { "extended", 0, 'x' }, + { "list-targets", 0, 'e' }, + { "fill", 1, 'f' }, + { "help", 0, 'h' }, + { "license", 0, 'l' }, + { "quiet", 0, 'q' }, + { "target", 1, 't' }, + { "undocumented", 0, 'u' }, + { "version", 0, 'v' }, + { "print-table", 1, 0 }, + { "print-delta", 1, 0 }, + { "verbose", 0, 'V' }, + { NULL, 0, 0 }, + }; + + ngetopt_init(&ngo, argc, argv, ops); + do { + c = ngetopt_next(&ngo); + switch (c) { + case 'V': + verbose++; + break; + case 'v': + print_version(stdout); + exit(EXIT_SUCCESS); + case 'h': + print_help(argv[0]); + exit(EXIT_SUCCESS); + case 'l': + print_copyright(stdout); + fputs("\n", stdout); + print_license(stdout); + exit(EXIT_SUCCESS); + case 't': + parse_target_id(ngo.optarg); + break; + case 'e': + list_targets(stdout); + exit(EXIT_SUCCESS); + break; + case 'd': + predefine(ngo.optarg); + break; + case 'f': + parse_fill_byte(ngo.optarg); + break; + case 'q': + s_listing = 0; + break; + case 'x': + s_extended_op = 1; + break; + case 'u': + s_undocumented_op = 1; + break; + case '?': + eprint(_("unrecognized option %s\n"), + ngo.optarg); + exit(EXIT_FAILURE); + case ':': + eprint(_("%s needs an argument\n"), + ngo.optarg); + exit(EXIT_FAILURE); + case ';': + eprint(_("%s does not allow for arguments\n"), + ngo.optarg); + exit(EXIT_FAILURE); + case 0: + if (strcmp(ngo.optstr, "print-table") == 0) { + print_table(stdout, ngo.optarg); + exit(EXIT_SUCCESS); + } + } + } while (c != -1); + + if (argc == ngo.optind) { + eprint(_("wrong number of arguments\n")); + exit(EXIT_FAILURE); + } + + s_asmfname = argv[ngo.optind]; + + if (argc - ngo.optind > 1) + s_objfname = argv[ngo.optind + 1]; + else + s_objfname = mkfname(s_asmfname, "obj"); + + if (argc - ngo.optind > 2) + s_lstfname = argv[ngo.optind + 2]; + else + s_lstfname = mkfname(s_asmfname, "lst"); + + uz80as(); + return 0; +} diff --git a/Tools/unix/uz80as/mc6800.c b/Tools/unix/uz80as/mc6800.c new file mode 100644 index 00000000..4ff80be5 --- /dev/null +++ b/Tools/unix/uz80as/mc6800.c @@ -0,0 +1,338 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Motorola 6800, 6801. + * =========================================================================== + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: NEGA,COMA,LSRA,RORA,ASRA, + * ROLA,DECA,INCA,TSTA,CLRA + * c: NEGB,COMB,LSRB,RORB,ASRB, + * ROLB,DECB,INCB,TSTB,CLRB + * d: NEG,COM,LSR,ROR,ASR, + * ROL,DEC,INC,TST,JMP,CLR + * e: SUBA,CMPA,SBCA,ANDA,BITA,LDAA, + * EORA,ADCA,ORAA,ADDA + * f: SUBB,CMPB,SBCB,ANDB,BITB,LDAB, + * EORB,ADCB,ORAB,ADDB + * g: INX,DEX,CLV,SEV,CLC,SEC,CLI,SEI + * h: BRA,BHI,BLS,BCC,BCS,BNE,BEQ, + * BVC,BVS,BPL,BMI,BGE,BLT,BGT,BLE + * i: TSX,INS,PULA,PULB,DES,TXS,PSHA, + * PSHB,RTS,RTI,WAI,SWI + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: ouput op as big endian word (no '.' should follow) + * g: if op<=$ff output lastbyte and output op as byte + * else output (lastbyte | 0x20) and output op as big endian word + * (no '.' should follow) + * h: relative - 2 + * i: relative - 4 + * i: relative - 5 + */ + +static const struct matchtab s_matchtab_mc6800[] = { + { "NOP", "01.", 1, 0 }, + { "TAP", "06.", 1, 0 }, + { "TPA", "07.", 1, 0 }, + { "g", "08c0.", 1, 0 }, + { "SBA", "10.", 1, 0 }, + { "CBA", "11.", 1, 0 }, + { "TAB", "16.", 1, 0 }, + { "TBA", "17.", 1, 0 }, + { "DAA", "19.", 1, 0 }, + { "ABA", "1B.", 1, 0 }, + { "i", "30c0.", 1, 0 }, + { "h a", "20c0.h1.", 1, 0, "r8" }, + { "b", "40c0.", 1, 0 }, + { "c", "50c0.", 1, 0 }, + { "d a,X", "60c0.d1.", 1, 0, "e8" }, + { "d a,Y", "18.60c0.d1.", 8, 0, "e8" }, + { "d a", "70c0.f1", 1, 0, "e16" }, + { "e #a", "80c0.d1.", 1, 0, "e8" }, + { "f #a", "C0c0.d1.", 1, 0, "e8" }, + { "e >a", "B0c0.f1", 1, 0, "e16" }, + { "f >a", "F0c0.f1", 1, 0, "e16" }, + { "e a,X", "A0c0.d1.", 1, 0, "e8" }, + { "f a,X", "E0c0.d1.", 1, 0, "e8" }, + { "e a,Y", "18.A0c0.d1.", 8, 0, "e8" }, + { "f a,Y", "18.E0c0.d1.", 8, 0, "e8" }, + { "e a", "90c0g1", 1, 0 }, + { "f a", "D0c0g1", 1, 0 }, + { "STAA >a", "B7.f0", 1, 0, "e16" }, + { "STAA a,X", "A7.d0.", 1, 0, "e8" }, + { "STAA a,Y", "18.A7.d0.", 8, 0, "e8" }, + { "STAA a", "97g0", 1, 0 }, + { "STAB >a", "F7.f0", 1, 0, "e16" }, + { "STAB a,X", "E7.d0.", 1, 0, "e8" }, + { "STAB a,Y", "18.E7.d0.", 8, 0, "e8" }, + { "STAB a", "D7g0", 1, 0 }, + { "CPX #a", "8C.f0", 1, 0, "e16" }, + { "CPX >a", "BC.f0", 1, 0, "e16" }, + { "CPX a,X", "AC.d0.", 1, 0, "e8" }, + { "CPX a,Y", "CD.AC.d0.", 8, 0, "e8" }, + { "CPX a", "9Cg0", 1, 0 }, + { "LDS #a", "8E.f0", 1, 0, "e16" }, + { "LDS >a", "BE.f0", 1, 0, "e16" }, + { "LDS a,X", "AE.d0.", 1, 0, "e8" }, + { "LDS a,Y", "18.AE.d0.", 8, 0, "e8" }, + { "LDS a", "9Eg0", 1, 0 }, + { "STS >a", "BF.f0", 1, 0, "e16" }, + { "STS a,X", "AF.d0.", 1, 0, "e8" }, + { "STS a,Y", "18.AF.d0.", 8, 0, "e8" }, + { "STS a", "9Fg0", 1, 0 }, + { "LDX #a", "CE.f0", 1, 0, "e16" }, + { "LDX >a", "FE.f0", 1, 0, "e16" }, + { "LDX a,X", "EE.d0.", 1, 0, "e8" }, + { "LDX a,Y", "CD.EE.d0.", 8, 0, "e8" }, + { "LDX a", "DEg0", 1, 0 }, + { "STX >a", "FF.f0", 1, 0, "e16" }, + { "STX a,X", "EF.d0.", 1, 0, "e8" }, + { "STX a,Y", "CD.EF.d0.", 8, 0, "e8" }, + { "STX a", "DFg0", 1, 0 }, + { "BSR a", "8D.h0.", 1, 0, "r8" }, + { "JSR >a", "BD.f0", 4, 0, "e16" }, + { "JSR a,X", "AD.d0.", 1, 0, "e8" }, + { "JSR a,Y", "18.AD.d0.", 8, 0, "e8" }, + { "JSR a", "BD.f0", 2, 0, "e16" }, + { "JSR a", "9Dg0", 4, 0 }, + { "ABX", "3A.", 4, 0 }, + { "ADDD #a", "C3.f0", 4, 0, "e16" }, + { "ADDD >a", "F3.f0", 4, 0, "e16" }, + { "ADDD a,X", "E3.d0.", 4, 0, "e8" }, + { "ADDD a,Y", "18.E3.d0.", 8, 0, "e8" }, + { "ADDD a", "D3g0", 4, 0 }, + { "ASLD", "05.", 4, 0 }, + { "LSLD", "05.", 4, 0 }, + { "BHS a", "24.h0.", 4, 0, "r8" }, + { "BLO a", "25.h0.", 4, 0, "r8" }, + { "BRN a", "21.h0.", 4, 0, "r8" }, + { "LDD #a", "CC.f0", 4, 0, "e16" }, + { "LDD >a", "FC.f0", 4, 0, "e16" }, + { "LDD a,X", "EC.d0.", 4, 0, "e8" }, + { "LDD a,Y", "18.EC.d0.", 8, 0, "e8" }, + { "LDD a", "DCg0", 4, 0 }, + { "LSL a,X", "68.d0.", 4, 0, "e8" }, + { "LSL a,Y", "18.68.d0.", 8, 0, "e8" }, + { "LSL a", "78.f0", 4, 0, "e16" }, + { "LSRD", "04.", 4, 0 }, + { "MUL", "3D.", 4, 0 }, + { "PSHX", "3C.", 4, 0 }, + { "PSHY", "18.3C.", 8, 0 }, + { "PULX", "38.", 4, 0 }, + { "PULY", "18.38.", 8, 0 }, + { "STD >a", "FD.f0", 4, 0, "e16" }, + { "STD a,X", "ED.d0.", 4, 0, "e8" }, + { "STD a,Y", "18.ED.d0.", 8, 0, "e8" }, + { "STD a", "DDg0", 4, 0 }, + { "SUBD #a", "83.f0", 4, 0, "e16" }, + { "SUBD >a", "B3.f0", 4, 0, "e16" }, + { "SUBD a,X", "A3.d0.", 4, 0, "e8" }, + { "SUBD a,Y", "18.A3.d0.", 8, 0, "e8" }, + { "SUBD a", "93g0", 4, 0 }, + { "TEST", "00.", 8, 0 }, + { "IDIV", "02.", 8, 0 }, + { "FDIV", "03.", 8, 0 }, + { "BRSET a,X,a,a", "1E.d0.d1.i2.", 8, 0, "e8e8r8" }, + { "BRSET a,Y,a,a", "18.1E.d0.d1.j2.", 8, 0, "e8e8r8" }, + { "BRSET a,a,a", "12.d0.d1.i2.", 8, 0, "e8e8r8" }, + { "BRCLR a,X,a,a", "1F.d0.d1.i2.", 8, 0, "e8e8r8" }, + { "BRCLR a,Y,a,a", "18.1F.d0.d1.j2.", 8, 0, "e8e8r8" }, + { "BRCLR a,a,a", "13.d0.d1.i2.", 8, 0, "e8e8r8" }, + { "BSET a,X,a", "1C.d0.d1.", 8, 0, "e8e8" }, + { "BSET a,Y,a", "18.1C.d0.d1.", 8, 0, "e8e8" }, + { "BSET a,a", "14.d0.d1.", 8, 0, "e8e8" }, + { "BCLR a,X,a", "1D.d0.d1.", 8, 0, "e8e8" }, + { "BCLR a,Y,a", "18.1D.d0.d1.", 8, 0, "e8e8" }, + { "BCLR a,a", "15.d0.d1.", 8, 0, "e8e8" }, + { "LSLA", "48.", 8, 0 }, + { "LSLB", "58.", 8, 0 }, + { "XGDX", "8F.", 8, 0 }, + { "STOP", "CF.", 8, 0 }, + { "ABY", "18.3A.", 8, 0 }, + { "CPY #a", "18.8C.f0", 8, 0, "e16" }, + { "CPY >a", "18.BC.f0", 8, 0, "e16" }, + { "CPY a,X", "1A.AC.d0.", 8, 0, "e8" }, + { "CPY a,Y", "18.AC.d0.", 8, 0, "e8" }, + { "CPY a", "18.9Cg0", 8, 0 }, + { "DEY", "18.09.", 8, 0 }, + { "INY", "18.08.", 8, 0 }, + { "LDY #a", "18.CE.f0", 8, 0, "e16" }, + { "LDY >a", "18.FE.f0", 8, 0, "e16" }, + { "LDY a,X", "1A.EE.d0.", 8, 0, "e8" }, + { "LDY a,Y", "18.EE.d0.", 8, 0, "e8" }, + { "LDY a", "18.DEg0", 8, 0 }, + { "STY >a", "18.FF.f0", 8, 0, "e16" }, + { "STY a,X", "1A.EF.d0.", 8, 0, "e8" }, + { "STY a,Y", "18.EF.d0.", 8, 0, "e8" }, + { "STY a", "18.DFg0", 8, 0 }, + { "TSY", "18.30.", 8, 0 }, + { "TYS", "18.35.", 8, 0 }, + { "XGDY", "18.8F.", 8, 0 }, + { "CPD #a", "1A.83.f0", 8, 0, "e16" }, + { "CPD >a", "1A.B3.f0", 8, 0, "e16" }, + { "CPD a,X", "1A.A3.d0.", 8, 0, "e8" }, + { "CPD a,Y", "CD.A3.d0.", 8, 0, "e8" }, + { "CPD a", "1A.93g0", 8, 0 }, + { NULL, NULL }, +}; + +static const char *const bval[] = { +"NEGA", "", "", "COMA", "LSRA", "", "RORA", "ASRA", +"ASLA", "ROLA", "DECA", "", "INCA", "TSTA", "", "CLRA", +NULL }; + +static const char *const cval[] = { +"NEGB", "", "", "COMB", "LSRB", "", "RORB", "ASRB", +"ASLB", "ROLB", "DECB", "", "INCB", "TSTB", "", "CLRB", +NULL }; + +static const char *const dval[] = { +"NEG", "", "", "COM", "LSR", "", "ROR", "ASR", +"ASL", "ROL", "DEC", "", "INC", "TST", "JMP", "CLR", +NULL }; + +static const char *const eval[] = { +"SUBA", "CMPA", "SBCA", "", "ANDA", "BITA", "LDAA", "", +"EORA", "ADCA", "ORAA", "ADDA", +NULL }; + +static const char *const fval[] = { +"SUBB", "CMPB", "SBCB", "", "ANDB", "BITB", "LDAB", "", +"EORB", "ADCB", "ORAB", "ADDB", +NULL }; + +static const char *const gval[] = { +"INX", "DEX", "CLV", "SEV", "CLC", "SEC", "CLI", "SEI", +NULL }; + +static const char *const hval[] = { +"BRA", "", "BHI", "BLS", "BCC", "BCS", "BNE", "BEQ", +"BVC", "BVS", "BPL", "BMI", "BGE", "BLT", "BGT", "BLE", +NULL }; + +static const char *const ival[] = { +"TSX", "INS", "PULA", "PULB", "DES", "TXS", "PSHA", +"PSHB", "", "RTS", "", "RTI", "", "", "WAI", "SWI", +NULL }; + +static const char *const *const valtab[] = { + bval, cval, dval, eval, fval, + gval, hval, ival +}; + +static int match_mc6800(char c, const char *p, const char **q) +{ + int v; + + if (c <= 'i') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_mc6800(int *eb, char p, const int *vs, int i, int savepc) +{ + int b; + + b = *eb; + switch (p) { + case 'f': genb(vs[i] >> 8, s_pline_ep); + genb(vs[i], s_pline_ep); + break; + case 'g': if (vs[i] <= 255) { + genb(b, s_pline_ep); + genb(vs[i], s_pline_ep); + } else { + genb(b | 0x20, s_pline_ep); + genb(vs[i] >> 8, s_pline_ep); + genb(vs[i], s_pline_ep); + } + break; + case 'h': b = (vs[i] - savepc - 2); + break; + case 'i': b = (vs[i] - savepc - 4); + break; + case 'j': b = (vs[i] - savepc - 5); + break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_mc6800(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_mc6800(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'i') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_mc6800 = { + .id = "mc6800", + .descr = "Motorola 6800", + .matcht = s_matchtab_mc6800, + .matchf = match_mc6800, + .genf = gen_mc6800, + .pat_char_rewind = pat_char_rewind_mc6800, + .pat_next_str = pat_next_str_mc6800, + .mask = 3 +}; + +const struct target s_target_mc6801 = { + .id = "mc6801", + .descr = "Motorola 6801", + .matcht = s_matchtab_mc6800, + .matchf = match_mc6800, + .genf = gen_mc6800, + .pat_char_rewind = pat_char_rewind_mc6800, + .pat_next_str = pat_next_str_mc6800, + .mask = 5 +}; + +const struct target s_target_m68hc11 = { + .id = "m68hc11", + .descr = "Motorola 68HC11", + .matcht = s_matchtab_mc6800, + .matchf = match_mc6800, + .genf = gen_mc6800, + .pat_char_rewind = pat_char_rewind_mc6800, + .pat_next_str = pat_next_str_mc6800, + .mask = 13 +}; diff --git a/Tools/unix/uz80as/mos6502.c b/Tools/unix/uz80as/mos6502.c new file mode 100644 index 00000000..f1041b24 --- /dev/null +++ b/Tools/unix/uz80as/mos6502.c @@ -0,0 +1,385 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * MOS Technology 6502. + * Rockwell R6501. + * California Micro Devices G65SC02. + * Rockwell R65C02. + * Rockwell R65C29. + * Western Design Center W65C02S. + * =========================================================================== + */ + +/* mos6502, the original + * + * g65sc02 California Micro Devices, adds to mos6502: + * - zp ADC,AND,CMP,EOR,LDA,ORA,SBC,STA + * - DEC A, INC A + * - JMP (abs,X) + * - BRA + * - PHX,PHY,PLX,PLY + * - STZ + * - TRB + * - TSB + * - More addressing modes for BIT, etc + * + * r6501 Rockwell, adds to mos6502: + * - BBR, BBS + * - RMB, SMB + * + * r65c02 Rockwell, adds the instructions of the g65sc02 and r6501 + * + * r65c29 Rockwell, adds to r65c02: + * - MUL + * + * w65c02s Western Design Center, adds to r65c02: + * - STP,WAI + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: ORA,AND,EOR,ADC,STA,LDA,CMP,SBC + * c: ORA,AND,EOR,ADC,LDA,CMP,SBC + * d: PHP,CLC,PLP,SEC,PHA,CLI,PLA,SEI, + * DEY,TYA,TAY,CLV,INY,CLD,INX,SED + * e: ASL,ROL,LSR,ROR + * f: DEC, INC + * g: BPL,BMI,BVC,BVS,BCC,BCS,BNE,BEQ + * h: TXA,TXS,TAX,TSX,DEX,NOP + * i: CPY,CPX + * j: TSB,TRB + * k: BBR0,BBR1,BBR2,BBR3,BBR4,BBR5,BBR6,BBR6, + * BBS0,BBS1,BBS2,BBS3,BBS4,BBS5,BBS6,BBS7 + * l: RMB0,RMB1,RMB2,RMB3,RMB4,RMB5,EMB6,RMB7, + * SMB0,SMB1,SMB2,SMB3,SMB4,SMB5,SMB6,SMB7 + * m: PHY,PLY + * n: PHX,PLX + * o: INC, DEC + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: (op << 5) | lastbyte + * g: if op <= $FF output last byte and then op as 8 bit value; + * else output (lastbyte | 0x08) and output op as word + * (no '.' should follow) + * h: (op << 4) | lastbyte + * i: relative jump to op (-2) + * j: if op <= $FF output $64 and op as 8 bit + * else output $9C and op as word + * (no '.' should follow) + * k: if op <= $FF ouput $74 and op as 8 bit + * else output $9E and op as word + * (no '.' should follow) + * l: relative jump to op (-3) + */ + +static const struct matchtab s_matchtab_mos6502[] = { + { "BRK", "00.", 1, 0 }, + { "JSR a", "20.e0", 1, 0 }, + { "RTI", "40.", 1, 0 }, + { "RTS", "60.", 1, 0 }, + { "h", "8Ah0.", 1, 0 }, + { "d", "08h0.", 1, 0 }, + { "c #a", "09f0.d1.", 1, 0, "e8" }, + { "b (a,X)", "01f0.d1.", 1, 0, "e8" }, + { "b (a),Y", "11f0.d1.", 1, 0, "e8" }, + { "b (a)", "12f0.d1.", 2, 0, "e8" }, + { "b a", "05f0g1", 1, 0 }, + { "b a,X", "15f0g1", 1, 0 }, + { "b a,Y", "19f0.e1", 1, 0 }, + { "e A", "0Af0.", 1, 0 }, + { "e a", "06f0g1", 1, 0 }, + { "e a,X", "16f0g1", 1, 0 }, + { "STX a", "86g0", 1, 0 }, + { "STX a,Y", "96.d0.", 1, 0, "e8" }, + { "LDX #a", "A2.d0.", 1, 0, "e8" }, + { "LDX a", "A6g0", 1, 0 }, + { "LDX a,Y", "B6g0", 1, 0 }, + { "o A", "1Af0.", 2, 0 }, + { "f a", "C6f0g1", 1, 0 }, + { "f a,X", "D6f0g1", 1, 0 }, + { "g a", "10f0.i1.", 1, 0, "r8" }, + { "BIT #a", "89.d0.", 2, 0, "e8" }, + { "BIT a", "24g0", 1, 0 }, + { "BIT a,X", "34g0", 2, 0 }, + { "JMP (a)", "6C.e0", 1, 0 }, + { "JMP (a,X)", "7C.e0", 2, 0 }, + { "JMP a", "4C.e0", 1, 0 }, + { "STY a", "84g0", 1, 0 }, + { "STY a,X", "94.d0.", 1, 0, "e8" }, + { "LDY #a", "A0.d0.", 1, 0, "e8" }, + { "LDY a", "A4g0", 1, 0 }, + { "LDY a,X", "B4g0", 1, 0 }, + { "i #a", "C0f0.d1.", 1, 0, "e8" }, + { "i a", "C4f0g1", 1, 0 }, + { "j a", "04h0g1", 2, 0 }, + { "k a,a", "0Fh0.d1.l2.", 4, 0, "e8r8" }, + { "l a", "07h0.d1.", 4, 0, "e8" }, + { "m", "5Af0.", 2, 0 }, + { "n", "DAf0.", 2, 0 }, + { "BRA a", "80.i0.", 2, 0, "r8" }, + { "STZ a,X", "k1", 2, 0 }, + { "STZ a", "j1", 2, 0 }, + { "MUL", "02.", 8, 0 }, + { "WAI", "CB.", 16, 0 }, + { "STP", "DB.", 16, 0 }, + { NULL, NULL }, +}; + +static const char *const bval[] = { + "ORA", "AND", "EOR", "ADC", + "STA", "LDA", "CMP", "SBC", + NULL +}; + +static const char *const cval[] = { + "ORA", "AND", "EOR", "ADC", + "", "LDA", "CMP", "SBC", NULL +}; + +static const char *const dval[] = { + "PHP", "CLC", "PLP", "SEC", + "PHA", "CLI", "PLA", "SEI", + "DEY", "TYA", "TAY", "CLV", + "INY", "CLD", "INX", "SED", + NULL +}; + + +static const char *const eval[] = { + "ASL", "ROL", "LSR", "ROR", + NULL +}; + +static const char *const fval[] = { + "DEC", "INC", + NULL +}; + +static const char *const gval[] = { + "BPL", "BMI", "BVC", "BVS", + "BCC", "BCS", "BNE", "BEQ", + NULL +}; + +static const char *const hval[] = { + "TXA", "TXS", "TAX", "TSX", + "DEX", "", "NOP", + NULL +}; + +static const char *const ival[] = { + "CPY", "CPX", + NULL +}; + +static const char *const jval[] = { + "TSB", "TRB", + NULL +}; + +static const char *const kval[] = { + "BBR0", "BBR1", "BBR2", "BBR3", + "BBR4", "BBR5", "BBR6", "BBR7", + "BBS0", "BBS1", "BBS2", "BBS3", + "BBS4", "BBS5", "BBS6", "BBS7", + NULL +}; + +static const char *const lval[] = { + "RMB0", "RMB1", "RMB2", "RMB3", + "RMB4", "RMB5", "RMB6", "RMB7", + "SMB0", "SMB1", "SMB2", "SMB3", + "SMB4", "SMB5", "SMB6", "SMB7", + NULL +}; + +static const char *const mval[] = { + "PHY", "PLY", + NULL +}; + +static const char *const nval[] = { + "PHX", "PLX", + NULL +}; + +static const char *const oval[] = { + "INC", "DEC", + NULL +}; + +static const char *const *const valtab[] = { + bval, cval, dval, eval, fval, + gval, hval, ival, jval, kval, + lval, mval, nval, oval +}; + +static int match_mos6502(char c, const char *p, const char **q) +{ + int v; + + if (c <= 'o') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_mos6502(int *eb, char p, const int *vs, int i, int savepc) +{ + int b, w; + + b = *eb; + switch (p) { + case 'f': b |= (vs[i] << 5); break; + case 'g': w = vs[i] & 0xffff; + if (w <= 0xff) { + genb(b, s_pline_ep); + b = 0; + genb(w, s_pline_ep); + } else { + b |= 0x08; + genb(b, s_pline_ep); + b = 0; + genb(w, s_pline_ep); + genb(w >> 8, s_pline_ep); + } + break; + case 'h': b |= (vs[i] << 4); break; + case 'i': b = (vs[i] - savepc - 2); break; + case 'j': w = vs[i] & 0xffff; + if (w <= 0xff) { + genb(0x64, s_pline_ep); + b = 0; + genb(w, s_pline_ep); + } else { + genb(0x9C, s_pline_ep); + b = 0; + genb(w, s_pline_ep); + genb(w >> 8, s_pline_ep); + } + break; + case 'k': w = vs[i] & 0xffff; + if (w <= 0xff) { + genb(0x74, s_pline_ep); + b = 0; + genb(w, s_pline_ep); + } else { + genb(0x9E, s_pline_ep); + b = 0; + genb(w, s_pline_ep); + genb(w >> 8, s_pline_ep); + } + break; + case 'l': b = (vs[i] - savepc - 3); break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_mos6502(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_mos6502(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'o') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_mos6502 = { + .id = "mos6502", + .descr = "MOS Technology 6502", + .matcht = s_matchtab_mos6502, + .matchf = match_mos6502, + .genf = gen_mos6502, + .pat_char_rewind = pat_char_rewind_mos6502, + .pat_next_str = pat_next_str_mos6502, + .mask = 1 +}; + +const struct target s_target_r6501 = { + .id = "r6501", + .descr = "Rockwell R6501", + .matcht = s_matchtab_mos6502, + .matchf = match_mos6502, + .genf = gen_mos6502, + .pat_char_rewind = pat_char_rewind_mos6502, + .pat_next_str = pat_next_str_mos6502, + .mask = 5 +}; + +const struct target s_target_g65sc02 = { + .id = "g65sc02", + .descr = "California Micro Devices G65SC02", + .matcht = s_matchtab_mos6502, + .matchf = match_mos6502, + .genf = gen_mos6502, + .pat_char_rewind = pat_char_rewind_mos6502, + .pat_next_str = pat_next_str_mos6502, + .mask = 3 +}; + +const struct target s_target_r65c02 = { + .id = "r65c02", + .descr = "Rockwell R65C02", + .matcht = s_matchtab_mos6502, + .matchf = match_mos6502, + .genf = gen_mos6502, + .pat_char_rewind = pat_char_rewind_mos6502, + .pat_next_str = pat_next_str_mos6502, + .mask = 7 +}; + +const struct target s_target_r65c29 = { + .id = "r65c29", + .descr = "Rockwell R65C29, R65C00/21", + .matcht = s_matchtab_mos6502, + .matchf = match_mos6502, + .genf = gen_mos6502, + .pat_char_rewind = pat_char_rewind_mos6502, + .pat_next_str = pat_next_str_mos6502, + .mask = 15 +}; + +const struct target s_target_w65c02s = { + .id = "w65c02s", + .descr = "Western Design Center W65C02S", + .matcht = s_matchtab_mos6502, + .matchf = match_mos6502, + .genf = gen_mos6502, + .pat_char_rewind = pat_char_rewind_mos6502, + .pat_next_str = pat_next_str_mos6502, + .mask = 027 +}; diff --git a/Tools/unix/uz80as/ngetopt.c b/Tools/unix/uz80as/ngetopt.c new file mode 100644 index 00000000..c0404012 --- /dev/null +++ b/Tools/unix/uz80as/ngetopt.c @@ -0,0 +1,237 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Handling of command line options, similar to getopt. + * =========================================================================== + */ + +/* + * Changes: + * + * - Jul 22 2018: long options without short option character recognized. + * + */ + +#include "ngetopt.h" + +#ifndef STRING_H +#include +#endif + +static int find_short_opt(int val, struct ngetopt_opt *ops) +{ + int i; + + i = 0; + while (ops[i].name != NULL) { + if (ops[i].val > 0 && ops[i].val == val) + return i; + i++; + } + + return -1; +} + +static int find_long_opt(char *str, struct ngetopt_opt *ops) +{ + int i; + const char *p, *q; + + i = 0; + while (ops[i].name != NULL) { + p = ops[i].name; + q = str; + while (*p != '\0' && *p == *q) { + p++; + q++; + } + if (*p == '\0' && (*q == '\0' || *q == '=')) { + return i; + } + i++; + } + + return -1; +} + +void ngetopt_init(struct ngetopt *p, int argc, char *const *argv, + struct ngetopt_opt *ops) +{ + p->argc = argc; + p->argv = argv; + p->ops = ops; + p->optind = 1; + p->subind = 0; + strcpy(p->str, "-X"); +} + +static int get_short_opt(struct ngetopt *p) +{ + int i; + char *opt; + + opt = p->argv[p->optind]; + i = find_short_opt(opt[p->subind], p->ops); + if (i < 0) { + /* unrecognized option */ + p->str[1] = (char) opt[p->subind]; + p->optarg = p->str; + p->subind++; + return '?'; + } + + if (!p->ops[i].has_arg) { + /* it's ok */ + p->subind++; + return p->ops[i].val; + } + + /* needs an argument */ + if (opt[p->subind + 1] != '\0') { + /* the argument is the suffix */ + p->optarg = &opt[p->subind + 1]; + p->subind = 0; + p->optind++; + return p->ops[i].val; + } + + /* the argument is the next token */ + p->optind++; + p->subind = 0; + if (p->optind < p->argc) { + p->optarg = p->argv[p->optind]; + p->optind++; + return p->ops[i].val; + } + + /* ups, argument missing */ + p->str[1] = (char) p->ops[i].val; + p->optarg = p->str; + return ':'; +} + +static int get_opt(struct ngetopt *p) +{ + int i; + char *opt, *optnext; + + /* all arguments consumed */ + if (p->optind >= p->argc) + return -1; + + opt = p->argv[p->optind]; + if (opt[0] != '-') { + /* non option */ + return -1; + } + + /* - */ + if (opt[1] == '\0') { + /* stdin */ + return -1; + } + + if (opt[1] != '-') { + /* -xxxxx */ + p->subind = 1; + return get_short_opt(p); + } + + /* -- */ + if (opt[2] == '\0') { + /* found "--" */ + p->optind++; + return -1; + } + + /* long option */ + i = find_long_opt(&opt[2], p->ops); + if (i < 0) { + /* not found */ + p->optind++; + p->optarg = opt; + while (*opt != '\0' && *opt != '=') { + opt++; + } + *opt = '\0'; + return '?'; + } + + /* found, go to end of option */ + optnext = opt + 2 + strlen(p->ops[i].name); + + if (*optnext == '\0' && !p->ops[i].has_arg) { + /* doesn't need arguments */ + p->optind++; + p->optstr = opt + 2; + return p->ops[i].val; + } + + if (*optnext == '=' && !p->ops[i].has_arg) { + /* does not need arguments but argument supplied */ + *optnext = '\0'; + p->optarg = opt; + return ';'; + } + + /* the argument is the next token */ + if (*optnext == '\0') { + p->optind++; + if (p->optind < p->argc) { + p->optstr = opt + 2; + p->optarg = p->argv[p->optind]; + p->optind++; + return p->ops[i].val; + } + + /* ups, argument missing */ + p->optarg = opt; + p->optind++; + return ':'; + } + + /* *optnext == '=' */ + *optnext = '\0'; + p->optstr = opt + 2; + p->optarg = optnext + 1; + p->optind++; + return p->ops[i].val; +} + +/* + * If ok: + * + * - For a long option with a zero value single character option, 0 is + * returned, optstr is the string of the long option (without '-' or '--') + * and optarg is the option argument or NULL. + * + * - For anything else the single option character is returned and optarg + * is the option argument or NULL. + * + * If the option is not recognized, '?' is returned, and optarg is the + * literal string of the option not recognized (already with '-' or '--' + * prefixed). + * + * If the option is recognized but the argument is missing, ':' is + * returned and optarg is the option as supplied (with '-' or '--' prefixed). + * + * If the option is recognized and it is a long option followed by '=', but the + * option does not take arguments, ';' is returned and optarg is the option + * (with '-' or '--' prefixed). + * + * -1 is returned if no more options. + */ +int ngetopt_next(struct ngetopt *p) +{ + if (p->subind == 0) + return get_opt(p); + + /* p->subind > 0 */ + if (p->argv[p->optind][p->subind] != '\0') + return get_short_opt(p); + + /* no more options in this list of short options */ + p->subind = 0; + p->optind++; + return get_opt(p); +} diff --git a/Tools/unix/uz80as/ngetopt.h b/Tools/unix/uz80as/ngetopt.h new file mode 100644 index 00000000..31ff8a60 --- /dev/null +++ b/Tools/unix/uz80as/ngetopt.h @@ -0,0 +1,40 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Handling of command line options, similar to getopt. + * =========================================================================== + */ + +#ifndef NGETOPT_H +#define NGETOPT_H + +/* + * Changelog: + * + * - Jul 21 2018: long options without short option character recognized. + * + */ + +struct ngetopt_opt { + const char *name; + int has_arg; + int val; +}; + +struct ngetopt { + char *optstr; + char *optarg; + /* private */ + int optind; + int argc; + char *const *argv; + struct ngetopt_opt *ops; + int subind; + char str[3]; +}; + +void ngetopt_init(struct ngetopt *p, int argc, char *const *argv, + struct ngetopt_opt *ops); +int ngetopt_next(struct ngetopt *p); + +#endif diff --git a/Tools/unix/uz80as/options.c b/Tools/unix/uz80as/options.c new file mode 100644 index 00000000..c3c24cd2 --- /dev/null +++ b/Tools/unix/uz80as/options.c @@ -0,0 +1,33 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Global options, normally coming from the command line. + * =========================================================================== + */ + +#include "config.h" +#include "options.h" +#include "err.h" + +const char *s_asmfname; /* Name of source file. */ +const char *s_objfname; /* Name of generated binary file. */ +const char *s_lstfname; /* Name of listing file. */ +const char *s_target_id = "z80"; /* ID of target */ +int s_listing = 1; /* If we generate the listing file or not. */ +int s_extended_op = 0; /* Allow extended instruction syntax. */ +int s_undocumented_op = 0; /* Allow undocumented instructions. */ +int s_mem_fillval = 0; /* Default value to fill the 64K memory. */ + +/* Command line macro definitions. */ +struct predef *s_predefs; + +/* Predefine a macro in the command line that must persist between passes. */ +void predefine(const char *text) +{ + struct predef *pdef; + + pdef = emalloc(sizeof(*pdef)); + pdef->name = text; + pdef->next = s_predefs; + s_predefs = pdef; +} diff --git a/Tools/unix/uz80as/options.h b/Tools/unix/uz80as/options.h new file mode 100644 index 00000000..c23ed913 --- /dev/null +++ b/Tools/unix/uz80as/options.h @@ -0,0 +1,29 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Global options, normally coming from the command line. + * =========================================================================== + */ + +#ifndef OPTIONS_H +#define OPTIONS_H + +/* Predefined macro at the command line. */ +struct predef { + struct predef *next; + const char *name; +}; + +extern const char *s_asmfname; +extern const char *s_objfname; +extern const char *s_lstfname; +extern const char *s_target_id; +extern int s_listing; +extern int s_extended_op; +extern int s_undocumented_op; +extern int s_mem_fillval; +extern struct predef *s_predefs; + +void predefine(const char *name); + +#endif diff --git a/Tools/unix/uz80as/pp.c b/Tools/unix/uz80as/pp.c new file mode 100644 index 00000000..b2d6a067 --- /dev/null +++ b/Tools/unix/uz80as/pp.c @@ -0,0 +1,741 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Preprocessor. + * =========================================================================== + */ + +#include "config.h" +#include "pp.h" +#include "utils.h" +#include "err.h" +#include "incl.h" +#include "expr.h" +#include "exprint.h" + +#ifndef CTYPE_H +#include +#endif + +#ifndef STDIO_H +#include +#endif + +#ifndef STDLIB_H +#include +#endif + +#ifndef STRING_H +#include +#endif + +/* Max number of macros. */ +#define NMACROS 1000 + +/* Closest prime to NMACROS / 4. */ +#define MACTABSZ 241 + +/* Max number of macro arguments. */ +#define NPARAMS 20 + +#define DEFINESTR "DEFINE" +#define DEFCONTSTR "DEFCONT" +#define INCLUDESTR "INCLUDE" +#define IFSTR "IF" +#define IFDEFSTR "IFDEF" +#define IFNDEFSTR "IFNDEF" +#define ENDIFSTR "ENDIF" +#define ELSESTR "ELSE" + +/* + * Macro. + * + * For example, the macro: + * + * #define SUM(a,b) (a+b) + * + * is: + * + * name = SUM + * pars = a\0b\0 + * ppars[0] points to &pars[0], that is to "a" + * ppars[1] points to &pars[2], that is to "b" + * npars = 2 + * text is "(a+b)" + */ +struct macro { + struct macro *next; /* Next in hash chain. */ + char *name; /* Identifier. */ + char *pars; /* String with params separated by '\0'. */ + char *text; /* Text to expand. */ + char *ppars[NPARAMS]; /* Pointers to the beginning of each param. */ + int npars; /* Valid number of params in ppars. */ +}; + +/* Hash table of preprocessor symbols. */ +static struct macro *s_mactab[MACTABSZ]; + +/* Preprocessing line buffers. */ +static char s_ppbuf[2][LINESZ]; + +/* If we are discarding lines; if not 0, level of if. */ +int s_skipon; + +/* Number of nested #if or #ifdef or #ifndef. */ +static int s_nifs; + +/* Last defined macro. */ +static struct macro *s_lastmac; + +/* Number of macros in table. */ +static int s_nmacs; + +/* The preprocessed line, points to one of s_ppbuf. */ +char *s_pline; + +/* Current program counter. */ +int s_pc; + +/* Current pass. */ +int s_pass; + + +/* Only valid while in the call to pp_line(). */ +static const char *s_line; /* original line */ +static const char *s_line_ep; /* pointer inside s_line for error reporting */ + +/* + * Copy [p, q[ to [dp, dq[. + */ +static char *copypp(char *dp, char *dq, const char *p, const char *q) +{ + while (dp < dq && p < q) + *dp++ = *p++; + return dp; +} + +/* + * Find the 'argnum' argument in 'args' and return a pointer to it. + * + * 'args' is a list of arguments "([id [,id]*). + * 'argnum' is the argument number to find. + * + * Return not found. + */ +static const char *findarg(const char *args, int argnum) +{ + if (*args == '(') { + do { + args++; + if (argnum == 0) + return args; + argnum--; + while (*args != '\0' && *args != ',' + && *args != ')') + { + args++; + } + } while (*args == ','); + } + return NULL; +} + +/* + * Find the 'argnum' argument in 'args' and copy it to [dp, dq[. + * + * 'args' points to a list of arguments "([id [,id]*). + * 'argnum' is the argument number to copy. + * + * Return the new 'dp' after copying. + */ +static char *copyarg(char *dp, char *dq, const char *args, int argnum) +{ + const char *p; + + p = findarg(args, argnum); + if (p == NULL) + return dp; + + while (dp < dq && *p != '\0' && *p != ',' && *p != ')') + *dp++ = *p++; + return dp; +} + +/* + * Sees if [idp, idq[ is a parameter of the macro 'pps'. + * If it is, return the number of parameter. + * Else return -1. + */ +static int findparam(const char *idp, const char *idq, struct macro *pps) +{ + int i; + const char *p, *r; + + for (i = 0; i < pps->npars; i++) { + p = pps->ppars[i]; + r = idp; + while (*p != '\0' && r < idq && *p == *r) { + p++; + r++; + } + if (*p == '\0' && r == idq) + return i; + } + return -1; +} + +/* + * Lookup the string in [p, q[ in 's_mactab'. + * Return the symbol or NULL if it is not in the table. + */ +static struct macro *pplookup(const char *p, const char *q) +{ + int h; + struct macro *nod; + + h = hash(p, q, MACTABSZ); + for (nod = s_mactab[h]; nod != NULL; nod = nod->next) + if (scmp(p, q, nod->name) == 0) + return nod; + + return nod; +} + +/* + * Expand macro in [dp, dq[. + * + * 'pps' is the macro to expand. + * 'args' points to the start of the arguments to substitute, if any. + * + * Return new dp. + */ +static char *expandid(char *dp, char *dq, struct macro *pps, const char *args) +{ + const char *p, *q; + int validid, argnum; + + validid = 1; + p = pps->text; + while (*p != '\0' && dp < dq) { + if (isidc0(*p)) { + for (q = p; isidc(*q); q++) + ; + if (validid) { + argnum = findparam(p, q, pps); + if (argnum >= 0) + dp = copyarg(dp, dq, args, argnum); + else + dp = copypp(dp, dq, p, q); + } else { + dp = copypp(dp, dq, p, q); + } + p = q; + validid = 1; + } else { + validid = !isidc(*p); + *dp++ = *p++; + } + } + return dp; +} + +/* + * If 'p' points the the start of an argument list, that is, '(', + * point to one character past the first ')' after 'p'. + * Else return 'p'. + */ +static const char *skipargs(const char *p) +{ + if (*p == '(') { + while (*p != '\0' && *p != ')') + p++; + if (*p == ')') + p++; + } + return p; +} + +/* + * Expand macros found in 'p' (null terminated) into [dp, dq[. + * dq must be writable to put a final '\0'. + */ +static int expand_line(char *dp, char *dq, const char *p) +{ + char *op; + int expanded, validid; + const char *s; + struct macro *nod; + + validid = 1; + expanded = 0; + while (dp < dq && *p != '\0' && *p != ';') { + if (*p == '\'' && *(p + 1) != '\0' && *(p + 2) == '\'') { + /* characters */ + dp = copypp(dp, dq, p, p + 3); + p += 3; + validid = 1; + } else if (*p == '\"') { + /* strings */ + s = p; + p++; + while (*p != '\0' && *p != '\"') + p++; + if (*p == '\"') + p++; + dp = copypp(dp, dq, s, p); + validid = 1; + } else if (isidc0(*p)) { + s = p; + while (isidc(*p)) + p++; + if (validid) { + nod = pplookup(s, p); + if (nod != NULL) { + op = dp; + dp = expandid(dp, dq, nod, p); + expanded = dp != op; + p = skipargs(p); + } else { + dp = copypp(dp, dq, s, p); + } + } else { + dp = copypp(dp, dq, s, p); + } + validid = 1; + } else { + validid = *p != '.' && !isalnum(*p); + *dp++ = *p++; + } + } + *dp = '\0'; + return expanded; +} + +/* + * Expand macros found in 'p' (null terminated). + * Return a pointer to an internal preprocessed line (null terminated). + */ +static char *expand_line0(const char *p) +{ + int iter, expanded; + char *np, *nq, *op; + + iter = 0; + np = &s_ppbuf[iter & 1][0]; + nq = &s_ppbuf[iter & 1][LINESZ - 1]; + expanded = expand_line(np, nq, p); + /* TODO: recursive macro expansion limit */ + while (expanded && iter < 5) { + op = np; + iter++; + np = &s_ppbuf[iter & 1][0]; + nq = &s_ppbuf[iter & 1][LINESZ - 1]; + expanded = expand_line(np, nq, op); + } + return np; +} + +/* + * Check if 'p' starts with the preprocessor directive 'ucq', that must be in + * upper case. + * 'p' can have any case. + * After the preprocessor directive must be a space or '\0'. + * Return 1 if all the above is true. 0 otherwise. + */ +static int isppid(const char *p, const char *ucq) +{ + while (*p != '\0' && *ucq != '\0' && toupper(*p) == *ucq) { + p++; + ucq++; + } + return (*ucq == '\0') && (*p == '\0' || isspace(*p)); +} + +/* + * Define a macro. + * + * [idp, idq[ is the macro id. + * [ap, aq[ is the macro argument list. If ap == aq there are no arguments. + * [tp, tq[ is the macro text. + */ +static void define(const char *idp, const char *idq, + const char *tp, const char *tq, + const char *ap, const char *aq) +{ + int h; + char *p; + struct macro *nod; + + h = hash(idp, idq, MACTABSZ); + for (nod = s_mactab[h]; nod != NULL; nod = nod->next) { + if (scmp(idp, idq, nod->name) == 0) { + /* Already defined. */ + return; + } + } + + s_nmacs++; + if (s_nmacs >= NMACROS) { + eprint(_("maximum number of macros exceeded (%d)\n"), NMACROS); + exit(EXIT_FAILURE); + } + + nod = emalloc((sizeof *nod) + (idq - idp) + (aq - ap) + 2); + nod->text = emalloc(tq - tp + 1); + nod->name = (char *) ((unsigned char *) nod + (sizeof *nod)); + nod->pars = nod->name + (idq - idp + 1); + + copychars(nod->name, idp, idq); + copychars(nod->text, tp, tq); + copychars(nod->pars, ap, aq); + + // printf("DEF %s(%s) %s\n", nod->name, nod->pars, nod->text); + + /* We don't check whether the arguments are different. */ + + /* + * Make ppars point to each argument and null terminate each one. + * Count the number of arguments. + */ + nod->npars = 0; + p = nod->pars; + while (*p != '\0') { + nod->ppars[nod->npars++] = p; + while (*p != '\0' && *p != ',') + p++; + if (*p == ',') + *p++ = '\0'; + } + + nod->next = s_mactab[h]; + s_mactab[h] = nod; + s_lastmac = nod; +} + +/* Add the text [p, q[ to the last macro text. */ +static void defcont(const char *p, const char *q) +{ + char *nt; + size_t len; + + len = strlen(s_lastmac->text); + nt = erealloc(s_lastmac->text, (q - p) + len + 1); + copychars(nt + len, p, q); + s_lastmac->text = nt; +} + +/* + * If 'p' points to a valid identifier start, go to the end of the identifier. + * Else return 'p'. + */ +static const char *getid(const char *p) +{ + if (isidc0(*p)) { + while (isidc(*p)) + p++; + } + return p; +} + +/* Issues error in a macro definition. */ +static void macdeferr(int cmdline, const char *estr, const char *ep) +{ + if (cmdline) { + eprint(_("error in command line macro definition\n")); + } + eprint(estr); + eprcol(s_line, ep); + if (cmdline) { + exit(EXIT_FAILURE); + } else { + newerr(); + } +} + +/* Parse macro definition. */ +static void pmacdef(const char *p, int cmdline) +{ + const char *q, *ap, *aq, *idp, *idq; + + idp = p; + idq = getid(idp); + if (idq == idp) { + macdeferr(cmdline, _("identifier excepted\n"), p); + return; + } + p = idq; + ap = aq = p; + if (*p == '(') { + p++; + ap = p; + while (isidc0(*p)) { + p = getid(p); + if (*p != ',') + break; + p++; + } + if (*p != ')') { + macdeferr(cmdline, _("')' expected\n"), p); + return; + } + aq = p; + p++; + } + if (*p != '\0' && !isspace(*p)) { + macdeferr(cmdline, _("space expected\n"), p); + return; + } + p = skipws(p); + /* go to the end */ + for (q = p; *q != '\0'; q++) + ; + /* go to the first non white from the end */ + while (q > p && isspace(*(q - 1))) + q--; + define(idp, idq, p, q, ap, aq); +} + +/* Parse #define. */ +static void pdefine(const char *p) +{ + p = skipws(p + sizeof(DEFINESTR) - 1); + pmacdef(p, 0); +} + +/* Parse #defcont. */ +static void pdefcont(const char *p) +{ + const char *q; + + p = skipws(p + sizeof(DEFCONTSTR) - 1); + + /* go to the end */ + for (q = p; *q != '\0'; q++) + ; + + /* go to the first non white from the end */ + while (q > p && isspace(*(q - 1))) + q--; + + if (p == q) { + /* nothing to add */ + return; + } + + if (s_lastmac == NULL) { + eprint(_("#DEFCONT without a previous #DEFINE\n")); + eprcol(s_line, s_line_ep); + newerr(); + return; + } + + defcont(p, q); +} + +/* Parse #include. */ +static void pinclude(const char *p) +{ + const char *q; + + p = skipws(p + sizeof(INCLUDESTR) - 1); + if (*p != '\"') { + eprint(_("#INCLUDE expects a filename between quotes\n")); + eprcol(s_line, p); + newerr(); + return; + } + q = ++p; + while (*q != '\0' && *q != '\"') + q++; + if (*q != '\"') { + wprint(_("no terminating quote\n")); + eprcol(s_line, q); + } + pushfile(p, q); +} + +/* + * Parse #ifdef or #ifndef. + * 'idsz' is the length of the string 'ifdef' or 'ifndef', plus '\0'. + * 'ifdef' must be 1 if we are #ifdef, 0 if #ifndef. + */ +static void pifdef(const char *p, size_t idsz, int ifdef) +{ + const char *q; + struct macro *nod; + + s_nifs++; + if (s_skipon) + return; + + p = skipws(p + idsz - 1); + if (!isidc0(*p)) { + s_skipon = s_nifs; + eprint(_("identifier expected\n")); + eprcol(s_line, p); + newerr(); + return; + } + q = p; + while (isidc(*q)) + q++; + nod = pplookup(p, q); + if (ifdef == (nod != NULL)) + s_skipon = 0; + else + s_skipon = s_nifs; +} + +/* Parse #else. */ +static void pelse(const char *p) +{ + if (s_nifs == 0) { + eprint(_("unbalanced #ELSE\n")); + eprcol(s_line, s_line_ep); + newerr(); + return; + } + + if (s_skipon && s_nifs == s_skipon) + s_skipon = 0; + else if (!s_skipon) + s_skipon = s_nifs; +} + +/* Parse #endif. */ +static void pendif(const char *p) +{ + if (s_nifs == 0) { + eprint(_("unbalanced #ENDIF\n")); + eprcol(s_line, s_line_ep); + newerr(); + return; + } + + if (s_skipon && s_nifs == s_skipon) + s_skipon = 0; + s_nifs--; +} + +/* + * Parse #if. + */ +static void pif(const char *p) +{ + int v; + enum expr_ecode ex_ec; + const char *ep; + + s_nifs++; + if (s_skipon) + return; + + p = skipws(p + sizeof(IFSTR) - 1); + if (!expr(p, &v, s_pc, 0, &ex_ec, &ep)) { + s_skipon = 1; + exprint(ex_ec, s_line, ep); + newerr(); + return; + } + + if (v == 0) + s_skipon = s_nifs; + else + s_skipon = 0; +} + +/* + * Parse a preprocessor line. + * 'p' points to the next character after the '#'. + */ +static int +parse_line(const char *p) +{ + if (isppid(p, IFDEFSTR)) { + pifdef(p, sizeof IFDEFSTR, 1); + } else if (isppid(p, IFNDEFSTR)) { + pifdef(p, sizeof IFNDEFSTR, 0); + } else if (isppid(p, IFSTR)) { + pif(p); + } else if (isppid(p, ELSESTR)) { + pelse(p); + } else if (isppid(p, ENDIFSTR)) { + pendif(p); + } else if (s_skipon) { + ; + } else if (isppid(p, INCLUDESTR)) { + pinclude(p); + } else if (isppid(p, DEFINESTR)) { + pdefine(p); + } else if (isppid(p, DEFCONTSTR)) { + pdefcont(p); + } else { + return 0; +/* + eprint(_("unknown preprocessor directive\n")); + eprcol(s_line, s_line_ep); + newerr(); +*/ + } + return 1; +} + +/* + * Preprocess 'line' in 's_pline'. + * In this module, while we are preprocessing: + * s_line is the original line. + * s_line_ep is a pointer inside line that we keep for error reporting. + */ +void pp_line(const char *line) +{ + const char *p; + + s_line = line; + s_line_ep = line; + + p = skipws(line); + if ((*p == '#') || (*p == '.')) { + s_line_ep = p; + if (parse_line(p + 1)) { + s_ppbuf[0][0] = '\0'; + s_pline = &s_ppbuf[0][0]; + return; + } + } + if (s_skipon) { + s_ppbuf[0][0] = '\0'; + s_pline = &s_ppbuf[0][0]; + return; + } + s_pline = expand_line0(line); +} + +/* Reset the module for other passes. */ +void pp_reset(void) +{ + int i; + struct macro *nod, *cur; + + s_nmacs = 0; + s_nifs = 0; + s_skipon = 0; + s_lastmac = NULL; + for (i = 0; i < MACTABSZ; i++) { + nod = s_mactab[i]; + while (nod != NULL) { + cur = nod; + nod = nod->next; + free(cur->text); + free(cur); + } + } + memset(s_mactab, 0, MACTABSZ * sizeof(s_mactab[0])); +} + +void pp_define(const char *mactext) +{ + s_line = mactext; + s_line_ep = mactext; + pmacdef(mactext, 1); + s_lastmac = NULL; +} diff --git a/Tools/unix/uz80as/pp.h b/Tools/unix/uz80as/pp.h new file mode 100644 index 00000000..74a6d6f2 --- /dev/null +++ b/Tools/unix/uz80as/pp.h @@ -0,0 +1,23 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Preprocessor. + * =========================================================================== + */ + +#ifndef PP_H +#define PP_H + +/* Max line length after macro expansion + '\0'. */ +#define LINESZ 512 + +extern char *s_pline; +extern int s_pc; +extern int s_pass; +extern int s_skipon; + +void pp_line(const char *line); +void pp_reset(void); +void pp_define(const char *name); + +#endif diff --git a/Tools/unix/uz80as/prtable.c b/Tools/unix/uz80as/prtable.c new file mode 100644 index 00000000..1c3be97f --- /dev/null +++ b/Tools/unix/uz80as/prtable.c @@ -0,0 +1,343 @@ +#include "prtable.h" +#include "err.h" +#include "targets.h" +#include "uz80as.h" + +#ifndef STDLIB_H +#include +#endif + +#ifndef CTYPE_H +#include +#endif + +#ifndef STRING_H +#include +#endif + +enum { STRSZ = 32 }; + +struct itext { + struct itext *next; + int undoc; + char str[STRSZ]; +}; + +struct ilist { + struct itext *head; + int nelems; +}; + +struct itable { + struct itext **table; + int nelems; +}; + +static char s_buf[STRSZ]; + +static void nomem(const char *str) +{ + eprogname(); + fprintf(stderr, _("not enough memory (%s)\n"), str); + exit(EXIT_FAILURE); +} + +static int compare(const void *pa, const void *pb) +{ + const struct itext * const *ia; + const struct itext * const *ib; + + ia = (const struct itext * const *) pa; + ib = (const struct itext * const *) pb; + return strcmp((*ia)->str, (*ib)->str); +} + +/* + * Returns a new allocated itable of pointers that point to each element in the + * list ilist, alphabetically sorted. + */ +static struct itable *sort_list(struct ilist *ilist) +{ + int n; + struct itable *itable; + struct itext *p; + + if ((itable = calloc(1, sizeof(*itable))) == NULL) { + return NULL; + } + itable->nelems = 0; + + if (ilist->nelems == 0) { + return itable; + } + + itable->table = malloc(ilist->nelems * sizeof(*itable->table)); + if (itable->table == NULL) { + free(itable); + return NULL; + } + + for (n = 0, p = ilist->head; + p != NULL && n < ilist->nelems; + p = p->next, n++) + { + itable->table[n] = p; + } + itable->nelems = n; + + qsort(itable->table, itable->nelems, sizeof(*itable->table), compare); + return itable; +} + +static void print_itable(struct itable *itable, FILE *f) +{ + int i, col; + struct itext *p; + + if (itable == NULL) { + return; + } + + fputs("@multitable @columnfractions .25 .25 .25 .25\n", f); + col = 0; + for (i = 0; i < itable->nelems; i++) { + p = itable->table[i]; + if (col == 0) { + fputs("@item ", f); + } else { + fputs("@tab ", f); + } + if (p->undoc) { + fputs("* ", f); + } + fprintf(f, "%s\n", p->str); + col++; + if (col >= 4) { + col = 0; + } + } + fputs("@end multitable\n", f); +} + +#if 0 +static void print_ilist(struct ilist *ilist, FILE *f) +{ + int col; + struct itext *p; + + if (ilist == NULL) { + return; + } + + fputs("@multitable @columnfractions .25 .25 .25 .25\n", f); + col = 0; + for (p = ilist->head; p != NULL; p = p->next) { + if (col == 0) { + fputs("@item ", f); + } else { + fputs("@tab ", f); + } + if (p->undoc) { + fputs("* ", f); + } + fprintf(f, "%s\n", p->str); + col++; + if (col >= 4) { + col = 0; + } + } + fputs("@end multitable\n", f); +} +#endif + +static void bufset(int i, char c) +{ + if (i >= STRSZ) { + eprogname(); + fputs(_("prtable: please, increase s_buf size\n"), stderr); + exit(EXIT_FAILURE); + } else { + s_buf[i] = c; + } +} + +static void gen_inst2(struct ilist *ilist, char *instr, int undoc) +{ + struct itext *p; + + if ((p = malloc(sizeof(*p))) == NULL) { + nomem("gen_inst2"); + } + + snprintf(p->str, STRSZ, "%s", instr); + p->undoc = undoc; + p->next = ilist->head; + ilist->head = p; + ilist->nelems++; +} + +static void gen_inst(struct ilist *ilist, const struct target *t, + unsigned char undoc, const char *p, size_t bufi, + const char *pr) +{ + size_t bufk; + const char *s; + + while (*p) { + if (!islower(*p)) { + if (*p == '@') { + bufset(bufi++, '@'); + } + bufset(bufi++, *p); + p++; + } else if (*p == 'a') { + if (pr == NULL) { + bufset(bufi++, 'e'); + } else if (pr[0] && pr[1]) { + if (pr[0] == pr[1]) { + bufset(bufi++, pr[0]); + pr += 2; + } else if (isdigit(pr[1])) { + bufset(bufi++, *pr); + pr++; + while (isdigit(*pr)) { + bufset(bufi++, *pr); + pr++; + } + } else { + bufset(bufi++, pr[0]); + bufset(bufi++, pr[1]); + pr += 2; + } + } else { + bufset(bufi++, 'e'); + } + p++; + } else { + break; + } + } + + if (*p == '\0') { + bufset(bufi, '\0'); + gen_inst2(ilist, s_buf, t->mask & undoc); + } else { + t->pat_char_rewind(*p); + while ((s = t->pat_next_str()) != NULL) { + if (s[0] != '\0') { + bufset(bufi, '\0'); + bufk = bufi; + while (*s != '\0') { + bufset(bufk++, *s); + s++; + } + bufset(bufk, '\0'); + gen_inst(ilist, t, undoc, p + 1, bufk, pr); + } + } + } +} + +/* Generate a list of instructions. */ +static struct ilist *gen_list(const struct target *t, unsigned char mask2, + int delta) +{ + int i, pr; + const struct matchtab *mt; + struct ilist *ilist; + + if ((ilist = calloc(1, sizeof(*ilist))) == NULL) { + return NULL; + } + + i = 0; + mt = t->matcht; + while (mt[i].pat != NULL) { + pr = 0; + if (t->mask == 1 && (mt[i].mask & 1)) { + pr = 1; + } else if (delta) { + if ((mt[i].mask & t->mask) && + !(mt[i].mask & mask2)) + { + pr = 1; + } + } else if (t->mask & mt[i].mask) { + pr = 1; + } + if (pr) { + gen_inst(ilist, t, mt[i].undoc, mt[i].pat, + 0, mt[i].pr); + } + i++; + } + + return ilist; +} + +/* + * Prints the instruction set of a target or if target_id is "target2,target1" + * prints the instructions in target2 not in target1. + */ +void print_table(FILE *f, const char *target_id) +{ + struct ilist *ilist; + struct itable *itable; + const struct target *t, *t2; + char target1[STRSZ]; + const char *target2; + unsigned char mask2; + int delta; + + /* check if we have "target" or "target,target" as arguments */ + if ((target2 = strchr(target_id, ',')) != NULL) { + delta = 1; + snprintf(target1, sizeof(target1), "%s", target_id); + target1[target2 - target_id] = '\0'; + target2++; + } else { + delta = 0; + snprintf(target1, sizeof(target1), "%s", target_id); + target2 = NULL; + } + + t = find_target(target1); + if (t == NULL) { + eprogname(); + fprintf(stderr, _("invalid target '%s'\n"), target1); + exit(EXIT_FAILURE); + } + + if (target2) { + t2 = find_target(target2); + if (t2 == NULL) { + eprogname(); + fprintf(stderr, _("invalid target '%s'\n"), target2); + exit(EXIT_FAILURE); + } + if (t->matcht != t2->matcht) { + eprogname(); + fprintf(stderr, _("unrelated targets %s,%s\n"), + target1, target2); + exit(EXIT_FAILURE); + } + mask2 = t2->mask; + } else { + mask2 = 1; + } + + if ((ilist = gen_list(t, mask2, delta)) == NULL) { + nomem("gen_list"); + } + + if ((itable = sort_list(ilist)) == NULL) { + nomem("sort_list"); + } + + print_itable(itable, f); + + /* We don't free ilist nor itable for now, since this is called + * from main and then the program terminated. + */ +} + diff --git a/Tools/unix/uz80as/prtable.h b/Tools/unix/uz80as/prtable.h new file mode 100644 index 00000000..41eb646a --- /dev/null +++ b/Tools/unix/uz80as/prtable.h @@ -0,0 +1,11 @@ +#ifndef PRTABLE_H +#define PRTABLE_H + +#ifndef STDIO_H +#define STDIO_H +#include +#endif + +void print_table(FILE *f, const char *target_id); + +#endif diff --git a/Tools/unix/uz80as/sym.c b/Tools/unix/uz80as/sym.c new file mode 100644 index 00000000..53fc2625 --- /dev/null +++ b/Tools/unix/uz80as/sym.c @@ -0,0 +1,103 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Symbol table for labels. + * =========================================================================== + */ + +#include "config.h" +#include "sym.h" +#include "utils.h" +#include "err.h" + +#ifndef STDIO_H +#include +#endif + +#ifndef STDLIB_H +#include +#endif + +/* + * Maximum number of symbols (labels) allowed. + * Must not be more than 64K. + */ +#define NSYMS 15000 + +/* Closest prime to NSYMS / 4. */ +#define SYMTABSZ 3739 + +/* + * Nodes for the s_symtab hash table. + * The symbol at index 0 is never used. + */ +static struct sym s_symlist[NSYMS]; + +/* + * Hash table of indexes into s_symlist. + * 0 means that the bucket is empty. + */ +static unsigned short s_symtab[SYMTABSZ]; + +/* Next free symbol in s_symlist. Note: 0 not used. */ +static int s_nsyms = 1; + +/* + * Lookups the string in [p, q[ in s_symtab. + * If !insert, returns the symbol or NULL if it is not in the table. + * If insert, inserts the symbol in the table if it is not there, and + * sets its .val to 'pc'. + */ +struct sym *lookup(const char *p, const char *q, int insert, int pc) +{ + int h, k; + struct sym *nod; + + if (q - p > SYMLEN - 1) { + /* Label too long, don't add. */ + eprint(_("label too long")); + epchars(p, q); + enl(); + newerr(); + /* + * This would truncate: + * q = p + (SYMLEN - 1); + */ + return NULL; + } + + h = hash(p, q, SYMTABSZ); + for (k = s_symtab[h]; k != 0; k = s_symlist[k].next) { + if (scmp(p, q, s_symlist[k].name) == 0) { + if (insert) { + if (!s_symlist[k].isequ) { + wprint("duplicate label (%s)\n", + s_symlist[k].name); + } + } + return &s_symlist[k]; + } + } + + if (insert) { + if (s_nsyms == NSYMS) { + eprint(_("maximum number of labels exceeded (%d)\n"), + NSYMS); + exit(EXIT_FAILURE); + } + + nod = &s_symlist[s_nsyms]; + nod->next = s_symtab[h]; + s_symtab[h] = (unsigned short) s_nsyms; + s_nsyms++; + + k = 0; + while (p != q && k < SYMLEN - 1) + nod->name[k++] = *p++; + nod->name[k] = '\0'; + nod->val = pc; + return nod; + } + + return NULL; +} diff --git a/Tools/unix/uz80as/sym.h b/Tools/unix/uz80as/sym.h new file mode 100644 index 00000000..43108c68 --- /dev/null +++ b/Tools/unix/uz80as/sym.h @@ -0,0 +1,23 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Symbol table for labels. + * =========================================================================== + */ + +#ifndef SYM_H +#define SYM_H + +/* Max symbol length + '\0'. */ +#define SYMLEN 32 + +struct sym { + char name[SYMLEN]; /* null terminated string */ + int val; /* value of symbol */ + unsigned short next; /* index into symlist; 0 is no next */ + unsigned char isequ; /* if val comes from EQU */ +}; + +struct sym *lookup(const char *p, const char *q, int insert, int pc); + +#endif diff --git a/Tools/unix/uz80as/targets.c b/Tools/unix/uz80as/targets.c new file mode 100644 index 00000000..742ef674 --- /dev/null +++ b/Tools/unix/uz80as/targets.c @@ -0,0 +1,96 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Target list. + * =========================================================================== + */ + +#include "targets.h" +#include "uz80as.h" + +#ifndef STRING_H +#include +#endif + +extern const struct target s_target_z80; +extern const struct target s_target_hd64180; +extern const struct target s_target_gbcpu; +extern const struct target s_target_dp2200; +extern const struct target s_target_dp2200ii; +extern const struct target s_target_i4004; +extern const struct target s_target_i4040; +extern const struct target s_target_i8008; +extern const struct target s_target_i8021; +extern const struct target s_target_i8022; +extern const struct target s_target_i8041; +extern const struct target s_target_i8048; +extern const struct target s_target_i8051; +extern const struct target s_target_i8080; +extern const struct target s_target_i8085; +extern const struct target s_target_mos6502; +extern const struct target s_target_r6501; +extern const struct target s_target_g65sc02; +extern const struct target s_target_r65c02; +extern const struct target s_target_r65c29; +extern const struct target s_target_w65c02s; +extern const struct target s_target_mc6800; +extern const struct target s_target_mc6801; +extern const struct target s_target_m68hc11; + +static const struct target *s_targets[] = { + &s_target_z80, + &s_target_hd64180, + &s_target_gbcpu, + &s_target_dp2200, + &s_target_dp2200ii, + &s_target_i4004, + &s_target_i4040, + &s_target_i8008, + &s_target_i8021, + &s_target_i8022, + &s_target_i8041, + &s_target_i8048, + &s_target_i8051, + &s_target_i8080, + &s_target_i8085, + &s_target_mos6502, + &s_target_r6501, + &s_target_g65sc02, + &s_target_r65c02, + &s_target_r65c29, + &s_target_w65c02s, + &s_target_mc6800, + &s_target_mc6801, + &s_target_m68hc11, + NULL, +}; + +static int s_index; + +const struct target *find_target(const char *id) +{ + const struct target **p; + + for (p = s_targets; *p != NULL; p++) { + if (strcmp(id, (*p)->id) == 0) { + return *p; + } + } + + return NULL; +} + +const struct target *first_target(void) +{ + s_index = 0; + return next_target(); +} + +const struct target *next_target(void) +{ + if (s_targets[s_index] != NULL) { + return s_targets[s_index++]; + } else { + return NULL; + } +} diff --git a/Tools/unix/uz80as/targets.h b/Tools/unix/uz80as/targets.h new file mode 100644 index 00000000..12b6f64c --- /dev/null +++ b/Tools/unix/uz80as/targets.h @@ -0,0 +1,18 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Target list. + * =========================================================================== + */ + +#ifndef TARGETS_H +#define TARGETS_H + +struct target; + +const struct target *find_target(const char *id); + +const struct target *first_target(void); +const struct target *next_target(void); + +#endif diff --git a/Tools/unix/uz80as/test.asm b/Tools/unix/uz80as/test.asm new file mode 100644 index 00000000..cfc0d169 --- /dev/null +++ b/Tools/unix/uz80as/test.asm @@ -0,0 +1,22 @@ +#DEFINE MENU_L(M1,M2,M3,M4,M5,M6,M7,M8,M9,M10) \ +#DEFCONT \ .DB M1 +#DEFCONT \ .DB M2 +#DEFCONT \ .DB M3 +#DEFCONT \ .DW M4 +#DEFCONT \ .DW M5 +#DEFCONT \ .DW M6 +#DEFCONT \ .DW M7 +#DEFCONT \ .DB M8 +#DEFCONT \ .DB M9 +#DEFCONT \ .DB M10 + +KY_CL .equ 1 +MON_LOC .equ 1 +MON_SIZ .equ 1 +BID_USR .equ 1 +MON_SERIAL .equ 1 +BID_CUR .equ 1 + +MENU_S: MENU_L("~Monitor$ ", "M", KY_CL, MON_SERIAL, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "Monitor$ ") + + .end diff --git a/Tools/unix/uz80as/test.lst b/Tools/unix/uz80as/test.lst new file mode 100644 index 00000000..94a84b15 --- /dev/null +++ b/Tools/unix/uz80as/test.lst @@ -0,0 +1,38 @@ +0001 0000 #DEFINE MENU_L(M1,M2,M3,M4,M5,M6,M7,M8,M9,M10) \ +0002 0000 #DEFCONT \ .DB M1 +0003 0000 #DEFCONT \ .DB M2 +0004 0000 #DEFCONT \ .DB M3 +0005 0000 #DEFCONT \ .DW M4 +0006 0000 #DEFCONT \ .DW M5 +0007 0000 #DEFCONT \ .DW M6 +0008 0000 #DEFCONT \ .DW M7 +0009 0000 #DEFCONT \ .DB M8 +0010 0000 #DEFCONT \ .DB M9 +0011 0000 #DEFCONT \ .DB M10 +0012 0000 +0013 0000 KY_CL .equ 1 +0014 0000 MON_LOC .equ 1 +0015 0000 MON_SIZ .equ 1 +0016 0000 BID_USR .equ 1 +0017 0000 MON_SERIAL .equ 1 +0018 0000 BID_CUR .equ 1 +0019 0000 +0020 0000 MENU_S: MENU_L("~Monitor$ ", "M", KY_CL, MON_SERIAL, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "Monitor$ ") +0020 0000 +0020 0000 7E 4D 6F 6E +0020 0004 69 74 6F 72 +0020 0008 24 20 +0020 000A 4D +0020 000B 01 +0020 000C 01 00 +0020 000E 00 10 +0020 0010 01 00 +0020 0012 01 00 +0020 0014 01 +0020 0015 01 +0020 0016 4D 6F 6E 69 +0020 001A 74 6F 72 24 +0020 001E 20 20 20 20 +0020 0022 20 +0021 0023 +0022 0023 .end diff --git a/Tools/unix/uz80as/test.obj b/Tools/unix/uz80as/test.obj new file mode 100644 index 0000000000000000000000000000000000000000..3660484d6bc6a8e63394e03ede99224c500f61dc GIT binary patch literal 35 gcmb>P&Ckm$$uCk-@MUCVU=Uzr076E%paKv80GgBsx&QzG literal 0 HcmV?d00001 diff --git a/Tools/unix/uz80as/utils.c b/Tools/unix/uz80as/utils.c new file mode 100644 index 00000000..a361f2fc --- /dev/null +++ b/Tools/unix/uz80as/utils.c @@ -0,0 +1,137 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Generic functions. + * =========================================================================== + */ + +#include "config.h" +#include "utils.h" + +#ifndef CTYPE_H +#include +#endif + +#ifndef LIMITS_H +#include +#endif + +/* + * Copy [p, q[ to dst and null terminate dst. + */ +void copychars(char *dst, const char *p, const char *q) +{ +// int i = 0; +// printf("copychars %x->%x to %x \'", p, q, dst); + while (p != q) { +// printf("%c", *p); + *dst++ = *p++; +// i++; + } + *dst = '\0'; +// printf("\' %d %x %d\n", *dst, dst, i); +} + +/* Skip space. */ +const char *skipws(const char *p) +{ + while (isspace(*p)) + p++; + return p; +} + +/* Return 1 if *p is a valid start character for an identifier. */ +int isidc0(char c) +{ + return (c == '_') || isalpha(c); +} + +/* + * Return 1 if *p is a valid character for an identifier. + * Don't use for the first character. + */ +int isidc(char c) +{ + return (c == '_') || (c == '.') || isalnum(c); +} + +/* Hash the string in [p, q[ to give a bucket in symtab. */ +int hash(const char *p, const char *q, unsigned int tabsz) +{ + unsigned int h; + + h = 0; + while (p != q) { + h = 31 * h + (unsigned char) *p; + p++; + } + + return h % tabsz; +} + +/* + * Compare the string in [p, q[ with the null-terminated string s. + * Return 0 if equal. + */ +int scmp(const char *p, const char *q, const char *s) +{ + while (p < q) { + if (*p == *s) { + p++; + s++; + } else if (*s == '\0') { + return 1; + } else if (*p < *s) { + return -1; + } else { + return 1; + } + } + + if (*s == '\0') + return 0; + else + return -1; +} +/* + * Given a hexadecimal character (in upper case), returns its integer value. + * Returns -1 if c is not a hexadecimal character. + */ +int hexvalu(char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'A' && c <= 'F') + return (c - 'A') + 10; + else + return -1; +} + +/* + * Given a hexadecimal character, returns its integer value. + * Returns -1 if c is not a hexadecimal character. + */ +int hexval(char c) +{ + if (c >= 'a' && c <= 'f') + return (c - 'a') + 10; + else + return hexvalu(c); +} + +int int_precission(void) +{ + static int bits = 0; + unsigned int i; + + if (bits > 0) + return bits; + + i = INT_MAX; + bits = 0; + while (i) { + bits++; + i >>= 1; + } + return bits; +} diff --git a/Tools/unix/uz80as/utils.h b/Tools/unix/uz80as/utils.h new file mode 100644 index 00000000..2d22db6a --- /dev/null +++ b/Tools/unix/uz80as/utils.h @@ -0,0 +1,26 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Generic functions. + * =========================================================================== + */ + +#ifndef UTILS_H +#define UTILS_H + +#define NELEMS(a) (sizeof(a)/sizeof(a[0])) + +#define XSTR(n) STR(n) +#define STR(n) #n + +void copychars(char *dst, const char *p, const char *q); +int hash(const char *p, const char *q, unsigned int tabsz); +int isidc0(char c); +int isidc(char c); +int scmp(const char *p, const char *q, const char *s); +const char *skipws(const char *p); +int hexvalu(char c); +int hexval(char c); +int int_precission(void); + +#endif diff --git a/Tools/unix/uz80as/uz80as.c b/Tools/unix/uz80as/uz80as.c new file mode 100644 index 00000000..c284e2c0 --- /dev/null +++ b/Tools/unix/uz80as/uz80as.c @@ -0,0 +1,1120 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Assembler. + * =========================================================================== + */ + +#include "config.h" +#include "uz80as.h" +#include "options.h" +#include "utils.h" +#include "err.h" +#include "incl.h" +#include "sym.h" +#include "expr.h" +#include "exprint.h" +#include "pp.h" +#include "list.h" +#include "targets.h" + +#ifndef ASSERT_H +#include +#endif + +#ifndef CTYPE_H +#include +#endif + +#ifndef STDIO_H +#include +#endif + +#ifndef STDLIB_H +#include +#endif + +#ifndef STRING_H +#include +#endif + +static const char *d_null(const char *); +static const char *d_block(const char *); +static const char *d_byte(const char *); +static const char *d_chk(const char *); +static const char *d_codes(const char *); +static const char *d_echo(const char *); +static const char *d_eject(const char *); +static const char *d_export(const char *); +static const char *d_end(const char *); +static const char *d_equ(const char *); +static const char *d_fill(const char *); +static const char *d_list(const char *); +static const char *d_lsfirst(const char *); +static const char *d_module(const char *); +static const char *d_msfirst(const char *); +static const char *d_nocodes(const char *); +static const char *d_nolist(const char *); +static const char *d_org(const char *); +static const char *d_set(const char *); +static const char *d_text(const char *); +static const char *d_title(const char *); +static const char *d_word(const char *); + +/* + * Directives. + * This table must be sorted, to allow for binary search. + */ +static struct direc { + const char *name; + const char *(*fun)(const char *); +} s_directab[] = { + { "BLOCK", d_block }, + { "BYTE", d_byte }, + { "CHK", d_chk }, + { "CODES", d_codes }, + { "DB", d_byte }, + { "DS", d_fill }, + { "DW", d_word }, + { "ECHO", d_echo }, + { "EJECT", d_eject }, + { "END", d_end }, + { "EQU", d_equ }, + { "EXPORT", d_export }, + { "FILL", d_fill }, + { "LIST", d_list }, + { "LSFIRST", d_lsfirst }, + { "MODULE", d_module }, + { "MSFIRST", d_msfirst }, + { "NOCODES", d_nocodes }, + { "NOLIST", d_nolist }, + { "NOPAGE", d_null }, + { "ORG", d_org }, + { "PAGE", d_null }, + { "SET", d_set }, + { "TEXT", d_text }, + { "TITLE", d_title }, + { "WORD", d_word }, +}; + +/* The target. */ +const struct target *s_target; + +/* The z80 addressable memory. The object code. */ +static unsigned char s_mem[64 * 1024]; + +/* Program counter min and max ([s_minpc, s_maxpc[). */ +static int s_minpc, s_maxpc; + +/* Original input line. */ +static char s_line[LINESZ]; + +/* Label defined on this line. */ +static struct sym *s_lastsym; + +/* Output words the most significant byte first */ +static int s_msbword; + +/* If we have seen the .END directive. */ +static int s_end_seen; + +/* We have issued the error of generating things after an .END. */ +static int s_gen_after_end; + +/* The empty line, to pass to listing, for compatibility with TASM. */ +static const char *s_empty_line = ""; + +/* Pointer in s_pline for error reporting. */ +const char *s_pline_ep; + +/* We skip characters until endline or backslash or comment. */ +static const char *sync(const char *p) +{ + while (*p != '\0' && *p != '\\' && *p != ';') + p++; + return p; +} + +static FILE *fout; + +/* + * Generates a byte to the output and updates s_pc, s_minpc and s_maxpc. + * Will issue a fatal error if we write beyong 64k. + */ +void genb(int b, const char *ep) +{ + if (s_pass == 0 && s_end_seen && !s_gen_after_end) { + s_gen_after_end = 1; + eprint(_("generating code after .END\n")); + eprcol(s_pline, ep); + newerr(); + } + if (s_minpc < 0) + s_minpc = s_pc; + if (s_pc >= 65536) { + eprint(_("generating code beyond address 65535\n")); + eprcol(s_pline, ep); + exit(EXIT_FAILURE); + } + s_mem[s_pc] = (unsigned char) b; + if (s_pass == 1) + list_genb(b); + if (s_pc < s_minpc) + s_minpc = s_pc; + s_pc++; + if (s_pc > s_maxpc) + s_maxpc = s_pc; + + if (s_pass == 1) { + fwrite(&b, 1, 1, fout); + } +} + +/* + * Generate 'n' as a 16 bit word, little endian or big endian depending on + * s_msbword. + */ +static void genw(int n, const char *ep) +{ + if (s_msbword) + genb(n >> 8, ep); + genb(n, ep); + if (!s_msbword) + genb(n >> 8, ep); +} + +/* + * We have matched an instruction in the table. + * Generate the machine code for the instruction using the generation + * pattern 'p. 'vs are the arguments generated during the matching process. + */ +static void gen(const char *p, const int *vs) +{ + // int w, b, i, savepc; + int b, i, savepc; + const char *p_orig; + + savepc = s_pc; + p_orig = p; + b = 0; +loop: + i = hexvalu(*p); + if (i >= 0) { + p++; + b = (i << 4) | hexval(*p); + } else if (*p == '.') { + genb(b, s_pline_ep); + b = 0; + } else if (*p == '\0') { + return; + } else { + i = *(p + 1) - '0'; + switch (*p) { + case 'b': b |= (vs[i] << 3); break; + case 'c': b |= vs[i]; break; + case 'd': b = vs[i]; break; + case 'e': genb(vs[i] & 0xff, s_pline_ep); + genb(vs[i] >> 8, s_pline_ep); + break; + default: + if (s_target->genf(&b, *p, vs, i, savepc) == -1) { + eprogname(); + fprintf(stderr, + _("fatal: bad pattern %s ('%c')"), + p_orig, *p); + enl(); + exit(EXIT_FAILURE); + } + } + p++; + } + p++; + goto loop; +} + +/* + * Tries to match *p with any of the strings in list. + * If matched, returns the index in list and r points to the position + * in p past the matched string. + */ +int mreg(const char *p, const char *const list[], const char **r) +{ + const char *s; + const char *q; + int i; + + i = 0; + while ((s = list[i++]) != NULL) { + if (*s == '\0') + continue; + q = p; + while (toupper(*q++) == *s++) { + if (*s == '\0') { + if (!isalnum(*q)) { + *r = q; + return i - 1; + } else { + break; + } + } + } + } + return -1; +} + +static int isoctal(int c) +{ + return c >= '0' && c <= '7'; +} + +/* + * Read an octal of 3 digits, being the maximum value 377 (255 decimal); + * Return -1 if there is an error in the syntax. + */ +static int readoctal(const char *p) +{ + int n; + const char *q; + + if (*p >= '0' && *p <= '3' && isoctal(*(p + 1)) && isoctal(*(p + 2))) { + n = 0; + q = p + 3; + while (p < q) { + n *= 8; + n += (*p - '0'); + p++; + } + return n; + } + + return -1; +} + +enum strmode { + STRMODE_ECHO, + STRMODE_NULL, + STRMODE_BYTE, + STRMODE_WORD +}; + +/* + * Generate the string bytes until double quote or null char. + * Return a pointer to the ending double quote character or '\0'. + * 'p must point to the starting double quote. + * If mode: + * STRMODE_ECHO only echo to stderr the characters. + * STRMODE_NULL only parses the string. + * STRMODE_BYTE generate the characters in the binary file as bytes. + * STRMODE_WORD generate the characters in the binary file as words. + */ +static const char *genstr(const char *p, enum strmode mode) +{ + int c; + + for (p = p + 1; *p != '\0' && *p != '\"'; p++) { + c = *p; + if (c == '\\') { + p++; + switch (*p) { + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 'b': c = '\b'; break; + case 't': c = '\t'; break; + case 'f': c = '\f'; break; + case '\\': c = '\\'; break; + case '\"': c = '\"'; break; + default: + c = readoctal(p); + if (c < 0) { + eprint(_("bad character escape " + "sequence\n")); + eprcol(s_pline, p - 1); + newerr(); + p--; + } else { + p += 2; + } + } + } + switch (mode) { + case STRMODE_ECHO: fputc(c, stderr); break; + case STRMODE_NULL: break; + case STRMODE_BYTE: genb(c, p); break; + case STRMODE_WORD: genw(c, p); break; + } + } + + return p; +} + +/* Match an instruction. + * If no match returns NULL; else returns one past end of match. + * p should point to no whitespace. + */ +static const char *match(const char *p) +{ + const struct matchtab *mtab; + const char *s, *pp, *q; + int v, n, vi, linepc; + int vs[4]; + + assert(!isspace(*p)); + + mtab = s_target->matcht; + linepc = s_pc; + pp = p; + n = -1; +next: + n++; + s = mtab[n].pat; + if (s == NULL) { + return NULL; + } else if ((s_target->mask & mtab[n].mask) == 0) { + goto next; + } else if (!s_undocumented_op && (s_target->mask & mtab[n].undoc)) { + goto next; + } + p = pp; + vi = 0; +loop: + if (*s == '\0') { + p = skipws(p); + if (*p != ';' && *p != '\0' && *p != '\\') + goto next; + else + goto found; + } else if (*s == ' ') { + if (!isspace(*p)) + goto next; + p = skipws(p); + } else if ((*s == ',' || *s == '(' || *s == ')') && isspace(*p)) { + p = skipws(p); + if (*s != *p) + goto next; + p = skipws(p + 1); + } else if (*s == 'a') { + p = expr(p, &v, linepc, s_pass == 0, NULL, NULL); + if (p == NULL) + return NULL; + vs[vi++] = v; + } else if (*s >= 'b' && *s <= 'z') { + v = s_target->matchf(*s, p, &q); + goto reg; + } else if (*p == *s && *p == ',') { + p = skipws(p + 1); + } else if (toupper(*p) == *s) { + p++; + } else { + goto next; + } +freg: + s++; + goto loop; +reg: + if (v < 0) { + goto next; + } else { + assert(vi < sizeof(vs)); + vs[vi++] = v; + p = q; + } + goto freg; +found: + // printf("%s\n", s_matchtab[n].pat); + gen(mtab[n].gen, vs); + return p; +} + +static const char * +d_null(const char *p) +{ + while (*p != '\0' && *p != '\\') { + if (!isspace(*p)) { + wprint(_("invalid characters after directive\n")); + eprcol(s_pline, p); + return sync(p); + } else { + p++; + } + } + return p; +} + +static const char *d_end(const char *p) +{ + enum expr_ecode ecode; + const char *q; + const char *ep; + + if (s_pass == 0) { + if (s_end_seen) { + eprint(_("duplicate .END\n")); + eprcol(s_pline, s_pline_ep); + newerr(); + } else { + s_end_seen = 1; + } + } + + q = expr(p, NULL, s_pc, s_pass == 0, &ecode, &ep); + if (q == NULL && ecode == EXPR_E_NO_EXPR) { + return p; + } else if (q == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + return NULL; + } else { + return q; + } +} + +static const char *d_codes(const char *p) +{ + s_codes = 1; + return p; +} + +static const char *d_module(const char *p) +{ + while (*p != '\0' && *p != '\\') { + if (!isspace(*p)) { + wprint(_("invalid characters after directive\n")); + eprcol(s_pline, p); + return sync(p); + } else { + p++; + } + } + return p; +} + +static const char *d_nocodes(const char *p) +{ + s_codes = 0; + return p; +} + +static const char *d_list(const char *p) +{ + s_list_on = 1; + return p; +} + +static const char *d_nolist(const char *p) +{ + s_list_on = 0; + return p; +} + +static const char *d_eject(const char *p) +{ + list_eject(); + return p; +} + +static const char *d_echo(const char *p) +{ + int n; + int mode; + enum expr_ecode ecode; + const char *ep; + + mode = (s_pass == 0) ? STRMODE_NULL : STRMODE_ECHO; + if (*p == '\"') { + p = genstr(p, mode); + if (*p == '\"') { + p++; + } else if (s_pass == 0) { + wprint(_("no terminating quote\n")); + eprcol(s_pline, p); + } + } else if (*p != '\0') { + p = expr(p, &n, s_pc, s_pass == 0, &ecode, &ep); + if (p == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + return NULL; + } + if (mode == STRMODE_ECHO) { + fprintf(stderr, "%d", n); + } + } + return p; +} + +static const char *d_equ(const char *p) +{ + int n; + enum expr_ecode ecode; + const char *ep; + + p = expr(p, &n, s_pc, 0, &ecode, &ep); + if (p == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + return NULL; + } + + if (s_lastsym == NULL) { + eprint(_(".EQU without label\n")); + eprcol(s_pline, s_pline_ep); + newerr(); + } else { + /* TODO: check label misalign? */ + s_lastsym->val = n; + s_lastsym->isequ = 1; + } + return p; +} + +static const char *d_set(const char *p) +{ + int n; + enum expr_ecode ecode; + const char *ep; + + p = expr(p, &n, s_pc, 0, &ecode, &ep); + if (p == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + return NULL; + } + + if (s_lastsym == NULL) { + eprint(_(".EQU without label\n")); + eprcol(s_pline, s_pline_ep); + newerr(); + } else { + /* TODO: check label misalign? */ + s_lastsym->val = n; + s_lastsym->isequ = 1; + } + return p; +} + +static const char *d_export(const char *p) +{ + /* TODO */ + return NULL; +} + +static const char *d_fill(const char *p) +{ + int n, v, er; + const char *q; + enum expr_ecode ecode; + const char *ep, *eps; + + eps = p; + er = 0; + p = expr(p, &n, s_pc, 0, &ecode, &ep); + if (p == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + return NULL; + } + + if (n < 0) { + eprint(_("number of positions to fill is negative (%d)\n"), n); + eprcol(s_pline, eps); + exit(EXIT_FAILURE); + } + + v = 255; + p = skipws(p); + if (*p == ',') { + p = skipws(p + 1); + q = expr(p, &v, s_pc, s_pass == 0, &ecode, &ep); + if (q == NULL) { + er = 1; + exprint(ecode, s_pline, ep); + newerr(); + } else { + p = q; + } + } + + while (n--) + genb(v, eps); + + if (er) + return NULL; + else + return p; +} + +static const char *d_lsfirst(const char *p) +{ + s_msbword = 0; + return p; +} + +static const char *d_msfirst(const char *p) +{ + s_msbword = 1; + return p; +} + +static const char *d_org(const char *p) +{ + int n; + enum expr_ecode ecode; + const char *ep, *eps; + + eps = p; + p = expr(p, &n, s_pc, 0, &ecode, &ep); + if (p == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + return NULL; + } + + if (n < 0 || n > 65536) { + eprint(_(".ORG address (%d) is not in range [0, 65536]\n"), n); + eprcol(s_pline, eps); + exit(EXIT_FAILURE); + } + + s_pc = n; + + /* Change the listing PC so in orgs we print the changed PC. */ + if (s_pass > 0) + list_setpc(s_pc); + + if (s_lastsym != NULL) { + /* TODO: check label misalign? */ + s_lastsym->val = s_pc; + s_lastsym->isequ = 1; + } + + return p; +} + +static const char *d_lst(const char *p, int w) +{ + enum strmode mode; + int n, linepc; + enum expr_ecode ecode; + const char *ep, *eps; + + if (w) + mode = STRMODE_WORD; + else + mode = STRMODE_BYTE; + + linepc = s_pc; +dnlst: + if (*p == '\"') { + p = genstr(p, mode); + if (*p == '\"') { + p++; + } else { + wprint(_("no terminating quote\n")); + eprcol(s_pline, p); + } + } else { + eps = p; + p = expr(p, &n, linepc, s_pass == 0, &ecode, &ep); + if (p == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + return NULL; + } + if (w) + genw(n, eps); + else + genb(n, eps); + } + p = skipws(p); + if (*p == ',') { + p++; + p = skipws(p); + goto dnlst; + } + return p; +} + +static const char *d_byte(const char *p) +{ + return d_lst(p, 0); +} + +static const char *d_word(const char *p) +{ + return d_lst(p, 1); +} + +static const char *d_text(const char *p) +{ + if (*p == '\"') { + p = genstr(p, STRMODE_BYTE); + if (*p == '\"') { + p++; + } else { + wprint(_("no terminating quote\n")); + eprcol(s_pline, p); + } + return p; + } else { + eprint(_(".TEXT directive needs a quoted string argument\n")); + eprcol(s_pline, p); + newerr(); + return NULL; + } +} + +static const char *d_title(const char *p) +{ + return NULL; +} + +static const char *d_block(const char *p) +{ + int n; + enum expr_ecode ecode; + const char *ep, *eps; + + eps = p; + p = expr(p, &n, s_pc, 0, &ecode, &ep); + if (p == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + return NULL; + } + + s_pc += n; + if (s_pc < 0 || s_pc > 65536) { + eprint(_("address (%d) set by .BLOCK is not in range " + "[0, 65536]\n"), s_pc); + eprcol(s_pline, eps); + exit(EXIT_FAILURE); + } + + return p; +} + +/* a must be < b. */ +static int checksum(int a, int b) +{ + int n; + + assert(a < b); + + n = 0; + while (a < b) + n += s_mem[a++]; + + return n; +} + +static const char *d_chk(const char *p) +{ + int n; + enum expr_ecode ecode; + const char *ep, *eps; + + eps = p; + p = expr(p, &n, s_pc, s_pass == 0, &ecode, &ep); + if (p == NULL) { + exprint(ecode, s_pline, ep); + newerr(); + genb(0, eps); + return NULL; + } + + if (s_pass == 0) { + genb(0, s_pline_ep); + } else if (n < 0 || n >= s_pc) { + eprint(_(".CHK address (%d) is not in range [0, %d[\n"), n, + s_pc); + eprcol(s_pline, eps); + newerr(); + genb(0, eps); + } else { + genb(checksum(n, s_pc), eps); + } + + return p; +} + +/* Parses an internal directive (those that start with '.'). + * Returns NULL on error; + * If no error returns position past the parsed directive and arguments. */ +static const char *parse_direc(const char *cp) +{ + const char *cq, *p; + int a, b, m = 0; + + a = 0; + b = NELEMS(s_directab) - 1; + while (a <= b) { + m = (a + b) / 2; + cq = cp; + p = s_directab[m].name; + while (*p != '\0' && toupper(*cq) == *p) { + p++; + cq++; + } + if (*p == '\0' && (*cq == '\0' || isspace(*cq))) + break; + else if (toupper(*cq) < *p) + b = m - 1; + else + a = m + 1; + } + + if (a <= b) { + cq = skipws(cq); + return s_directab[m].fun(cq); + } else { + eprint(_("unrecognized directive\n")); + eprcol(s_pline, s_pline_ep); + newerr(); + return NULL; + } +} + +static void parselin(const char *cp) +{ + int col0, alloweq; + const char *q; + + s_pline_ep = cp; +start: s_lastsym = NULL; + alloweq = 0; + col0 = 1; +loop: + if (*cp == '\0' || *cp == ';') { + return; + } else if (*cp == '\\') { + if (s_pass == 1) { + list_endln(); + list_startln(s_empty_line, curfile()->linenum, s_pc, + nfiles()); + } + cp++; + goto start; + } else if (*cp == '.') { + s_pline_ep = cp; + cp++; + q = parse_direc(cp); + if (q == NULL) { + cp = sync(cp); + } else { + cp = d_null(q); + } + } else if ((*cp == '$' || *cp == '*') && cp[1] == '=') { + /* Alternative form of .ORG: *= or $= */ + cp += 2; + q = d_org(cp); + if (q == NULL) { + cp = sync(cp); + } else { + cp = d_null(q); + } + } else if (*cp == '=' && alloweq) { + /* equ */ + s_pline_ep = cp; + cp++; + q = d_equ(cp); + if (q == NULL) { + cp = sync(cp); + } else { + cp = d_null(q); + } + } else if (isidc0(*cp)) { + if (col0 && *cp != '.') { + /* take label */ + s_pline_ep = cp; + q = cp; + col0 = 0; + while (isidc(*cp)) + cp++; + s_lastsym = lookup(q, cp, s_pass == 0, s_pc); + if (*cp == ':' || isspace(*cp)) { + alloweq = 1; + cp++; + } else if (*cp == '=') { + alloweq = 1; + } + if (s_pass == 1 && !s_lastsym->isequ && + s_lastsym->val != s_pc) + { + eprint(_("misaligned label %s\n"), + s_lastsym->name); + fprintf(stderr, _(" Previous value was %XH, " + "new value %XH."), s_lastsym->val, + s_pc); + eprcol(s_pline, s_pline_ep); + newerr(); + } + } else { + cp = skipws(cp); + s_pline_ep = cp; + q = match(cp); + if (q == NULL) { + eprint(_("syntax error\n")); + newerr(); + cp = sync(cp); + } else { + cp = d_null(q); + } + } + } else if (isspace(*cp)) { + col0 = 0; + while (isspace(*cp)) + cp++; + } else { + eprint(_("unexpected character (%c)\n"), *cp); + eprcol(s_pline, cp); + newerr(); + cp = sync(cp + 1); + } + goto loop; +} + +/* + * Gets a new line into 's_line from 'fin. + * Terminates the line with '\0'. + * Does not read more than LINESZ - 1 characters. + * Does not add a '\n' character, thus a line of length 0 it's possible. + * Always advances to the next line. + * Returns -1 for EOF or the line length. + */ +static int getlin(FILE *fin) +{ + int i, c; + + c = EOF; + i = 0; + while (i < LINESZ - 1) { + c = getc(fin); + if (c == EOF || c == '\n') + break; + s_line[i++] = (char) c; + } + if (c != EOF && c != '\n') { + wprint(_("line too long, truncated to %d characters\n"), + LINESZ); + } + while (c != EOF && c != '\n') + c = getc(fin); + if (i == 0 && c == EOF) + return -1; + s_line[i] = '\0'; + return i; +} + +/* Preinstall the macros defined in the command line. */ +static void install_predefs(void) +{ + struct predef *pdef; + + for (pdef = s_predefs; pdef != NULL; pdef = pdef->next) + pp_define(pdef->name); +} + +static void open_output() +{ + fout = efopen(s_objfname, "wb"); +} + +static void close_output() +{ + if (fclose(fout) == EOF) { + eprint(_("cannot close file %s\n"), s_objfname); + } +} + +/* Do a pass through the source. */ +static void dopass(const char *fname) +{ + fprintf(stderr, "start pass %d\n", s_pass); + + /* Fill memory with default value. */ + if ((s_pass == 0 && s_mem_fillval != 0) || s_pass > 0) { + memset(s_mem, s_mem_fillval, sizeof(s_mem)); + } + + if (s_pass > 0) { + pp_reset(); + list_open(s_lstfname); + s_codes = 1; + s_list_on = 1; + open_output(); + } + + install_predefs(); + s_minpc = -1; + s_maxpc = -1; + s_pc = 0; + s_lastsym = NULL; + s_msbword = 0; + + pushfile(fname, fname + strlen(fname)); + while (nfiles() > 0) { + curfile()->linenum++; + if (getlin(curfile()->fin) >= 0) { + if (s_pass == 1) { + list_startln(s_line, curfile()->linenum, s_pc, + nfiles()); + } + pp_line(s_line); + if (s_pass == 1) + list_skip(s_skipon); + parselin(s_pline); + if (s_pass == 1) + list_endln(); + } else { + popfile(); + } + } + + if (s_pass > 0) { + list_close(); + close_output(); + } +} + +/* Write the object file. */ +static void output () +{ + open_output(); + if (s_minpc < 0) + s_minpc = 0; + if (s_maxpc < 0) + s_maxpc = 0; + + fwrite(s_mem + s_minpc, 1, s_maxpc - s_minpc, fout); + if (ferror(fout)) { + eprint(_("cannot write to file %s\n"), s_objfname); + clearerr(fout); + } + close_output(); +} + +/* Start the assembly using the config in options.c. */ +void uz80as(void) +{ + s_target = find_target(s_target_id); + if (s_target == NULL) { + eprint(_("target '%s' not supported\n"), s_target_id); + exit(EXIT_FAILURE); + } + + for (s_pass = 0; s_nerrors == 0 && s_pass < 2; s_pass++) { + dopass(s_asmfname); + if (s_pass == 0 && !s_end_seen) { + wprint(_("no .END statement in the source\n")); + } + if (s_nerrors == 0) { + if (verbose) printf("Pass %d completed.\n", s_pass + 1); + } + } + + if (s_nerrors > 0) { + exit(EXIT_FAILURE); + } + + // output(); +} diff --git a/Tools/unix/uz80as/uz80as.h b/Tools/unix/uz80as/uz80as.h new file mode 100644 index 00000000..511da085 --- /dev/null +++ b/Tools/unix/uz80as/uz80as.h @@ -0,0 +1,63 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Assembler. + * =========================================================================== + */ + +#ifndef UZ80AS_H +#define UZ80AS_H + +int verbose; + +/* matchtab.flags */ +enum { + MATCH_F_UNDOC = 1, + MATCH_F_EXTEN = 2, +}; + +/* pat: + * a: expr + * b - z: used by target + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f - z: used by target + * + * pr: + * 8: e8 + * f: e16 + * r: relative jump + */ + +struct matchtab { + const char *pat; + const char *gen; + unsigned char mask; + unsigned char undoc; + const char *pr; +}; + +struct target { + const char *id; + const char *descr; + const struct matchtab *matcht; + int (*matchf)(char c, const char *p, const char **q); + int (*genf)(int *eb, char p, const int *vs, int i, int savepc); + void (*pat_char_rewind)(int c); + const char * (*pat_next_str)(void); + unsigned char mask; +}; + +extern const char *s_pline_ep; + +void genb(int b, const char *ep); +int mreg(const char *p, const char *const list[], const char **r); + +void uz80as(void); + +#endif diff --git a/Tools/unix/uz80as/z80.c b/Tools/unix/uz80as/z80.c new file mode 100644 index 00000000..4e2db514 --- /dev/null +++ b/Tools/unix/uz80as/z80.c @@ -0,0 +1,362 @@ +/* =========================================================================== + * uz80as, an assembler for the Zilog Z80 and several other microprocessors. + * + * Zilog Z80 CPU. + * =========================================================================== + */ + +#include "pp.h" +#include "err.h" +#include "options.h" +#include "uz80as.h" +#include + +/* pat: + * a: expr + * b: B,C,D,E,H,L,A + * c: IX,IY (must be followed by + or -) + * d: BC,DE,HL,SP + * e: IX,IY + * f: BC,DE,HL,AF + * g: ADD,ADC,SUB,SBC,AND,XOR,OR,CP + * h: INC,DEC + * i: BC,DE,IX,SP + * j: BC,DE,IY,SP + * k: RLC,RRC,RL,RR,SLA,SRA,SRL + * l: BIT,RES,SET + * m: NZ,Z,NC,C,PO,PE,P,M + * n: NZ,Z,NC,C + * o: * + * p: B,C,D,E,IXH,IXL,A + * q: B,C,D,E,IYH,IYL,A + * + * gen: + * .: output lastbyte + * b: (op << 3) | lastbyte + * c: op | lastbyte + * d: lastbyte = op as 8 bit value + * e: output op as word (no '.' should follow) + * f: (op << 4) | lastbyte + * g: (op << 6) | lastbyte + * h: * + * i: relative jump to op + * j: possible value to RST + * k: possible value to IM + * m: check arithmetic used with A register + * n: check arithmetic used without A register + */ + +static const struct matchtab s_matchtab_z80[] = { + { "LD b,b", "40b0c1.", 3, 0 }, + { "LD p,p", "DD.40b0c1.", 1, 1 }, + { "LD q,q", "FD.40b0c1.", 1, 1 }, + { "LD b,(HL)", "46b0.", 3, 0 }, + { "LD b,(e)", "d1.46b0.00.", 3, 0, "ii" }, + { "LD b,(ca)", "d1.46b0.d2.", 3, 0, "ii" }, + { "LD A,I", "ED.57.", 3, 0 }, + { "LD A,R", "ED.5F.", 3, 0 }, + { "LD A,(BC)", "0A.", 3, 0 }, + { "LD A,(DE)", "1A.", 3, 0 }, + { "LD A,(a)", "3A.e0", 3, 0 }, + { "LD b,a", "06b0.d1.", 3, 0, "e8" }, + { "LD p,a", "DD.06b0.d1.", 1, 1, "e8" }, + { "LD q,a", "FD.06b0.d1.", 1, 1, "e8" }, + { "LD I,A", "ED.47.", 3, 0 }, + { "LD R,A", "ED.4F.", 3, 0 }, + { "LD SP,HL", "F9.", 3, 0 }, + { "LD SP,e", "d0.F9.", 3, 0 }, + { "LD HL,(a)", "2A.e0", 3, 0 }, + { "LD d,(a)", "ED.4Bf0.e1", 3, 0 }, + { "LD d,a", "01f0.e1", 3, 0 }, + { "LD e,(a)", "d0.2A.e1", 3, 0 }, + { "LD e,a", "d0.21.e1", 3, 0 }, + { "LD (HL),b", "70c0.", 3, 0 }, + { "LD (HL),a", "36.d0.", 3, 0, "e8" }, + { "LD (BC),A", "02.", 3, 0 }, + { "LD (DE),A", "12.", 3, 0 }, + { "LD (e),b", "d0.70c1.00.", 3, 0, "ii" }, + { "LD (ca),b", "d0.70c2.d1.", 3, 0, "ii" }, + { "LD (e),a", "d0.36.00.d1.", 3, 0, "iie8" }, + { "LD (ca),a", "d0.36.d1.d2.", 3, 0, "iie8" }, + { "LD (a),A", "32.e0", 3, 0 }, + { "LD (a),HL", "22.e0", 3, 0 }, + { "LD (a),d", "ED.43f1.e0", 3, 0 }, + { "LD (a),e", "d1.22.e0", 3, 0 }, + { "PUSH f", "C5f0.", 3, 0 }, + { "PUSH e", "d0.E5.", 3, 0 }, + { "POP f", "C1f0.", 3, 0 }, + { "POP e", "d0.E1.", 3, 0 }, + { "EX DE,HL", "EB.", 3, 0 }, + { "EX AF,AF'", "08.", 3, 0 }, + { "EX (SP),HL", "E3.", 3, 0 }, + { "EX (SP),e", "d0.E3.", 3, 0 }, + { "EXX", "D9.", 3, 0 }, + { "LDI", "ED.A0.", 3, 0 }, + { "LDIR", "ED.B0.", 3, 0 }, + { "LDD", "ED.A8.", 3, 0 }, + { "LDDR", "ED.B8.", 3, 0 }, + { "CPI", "ED.A1.", 3, 0 }, + { "CPIR", "ED.B1.", 3, 0 }, + { "CPD", "ED.A9.", 3, 0 }, + { "CPDR", "ED.B9.", 3, 0 }, + { "ADD HL,d", "09f0.", 3, 0 }, + { "ADD IX,i", "DD.09f0.", 3, 0 }, + { "ADD IY,j", "FD.09f0.", 3, 0 }, + { "ADC HL,d", "ED.4Af0.", 3, 0 }, + { "SBC HL,d", "ED.42f0.", 3, 0 }, + { "g A,b", "m080b0c1.", 3, 0 }, + { "g A,p", "DD.m080b0c1.", 1, 1 }, + { "g A,q", "FD.m080b0c1.", 1, 1 }, + { "g A,(HL)", "m086b0.", 3, 0 }, + { "g A,(ca)", "m0d1.86b0.d2.", 3, 0, "ii" }, + { "g A,a", "m0C6b0.d1.", 3, 0, "e8" }, + { "g b", "n080b0c1.", 3, 0 }, + { "g p", "DD.n080b0c1.", 1, 1 }, + { "g q", "FD.n080b0c1.", 1, 1 }, + { "g (HL)", "n086b0.", 3, 0 }, + { "g (ca)", "n0d1.86b0.d2.", 3, 0, "ii" }, + { "g a", "n0C6b0.d1.", 3, 0, "e8" }, + { "h b", "04b1c0.", 3, 0 }, + { "h p", "DD.04b1c0.", 1, 1 }, + { "h q", "FD.04b1c0.", 1, 1 }, + { "h (HL)", "34c0.", 3, 0 }, + { "h (ca)", "d1.34c0.d2.", 3, 0, "ii" }, + { "h (e)", "d1.34c0.00.", 3, 0, "ii" }, + { "INC d", "03f0.", 3, 0 }, + { "INC e", "d0.23.", 3, 0 }, + { "DEC d", "0Bf0.", 3, 0 }, + { "DEC e", "d0.2B.", 3, 0 }, + { "DAA", "27.", 3, 0 }, + { "CPL", "2F.", 3, 0 }, + { "NEG", "ED.44.", 3, 0 }, + { "CCF", "3F.", 3, 0 }, + { "SCF", "37.", 3, 0 }, + { "NOP", "00.", 3, 0 }, + { "HALT", "76.", 3, 0 }, + { "DI", "F3.", 3, 0 }, + { "EI", "FB.", 3, 0 }, + { "IM a", "ED.k0.", 3, 0, "tt" }, + { "RLCA", "07.", 3, 0 }, + { "RLA", "17.", 3, 0 }, + { "RRCA", "0F.", 3, 0 }, + { "RRA", "1F.", 3, 0 }, + { "SLL b", "CB.30c0.", 1, 1 }, + { "SLL (HL)", "CB.36.", 1, 1 }, + { "SLL (ca)", "d0.CB.d1.36.", 1, 1, "ii" }, + { "SLL (ca),b", "d0.CB.d1.30c2.", 1, 1, "ii" }, + { "k b", "CB.00b0c1.", 3, 0 }, + { "k (HL)", "CB.06b0.", 3, 0 }, + { "k (ca)", "d1.CB.d2.06b0.", 3, 0, "ii" }, + { "k (ca),b", "d1.CB.d2.00b0c3.", 1, 1, "ii" }, + { "RLD", "ED.6F.", 3, 0 }, + { "RRD", "ED.67.", 3, 0 }, + { "l a,b", "CB.00g0b1c2.", 3, 0, "b3" }, + { "l a,(HL)", "CB.06g0b1.", 3, 0, "b3" }, + { "l a,(ca)", "d2.CB.d3.06g0b1.", 3, 0, "b3ii" }, + { "RES a,(ca),b", "d1.CB.d2.80b0c3.", 1, 1, "b3ii" }, + { "SET a,(ca),b", "d1.CB.d2.C0b0c3.", 1, 1, "b3ii" }, + { "JP (HL)", "E9.", 3, 0 }, + { "JP (e)", "d0.E9.", 3, 0 }, + { "JP m,a", "C2b0.e1", 3, 0 }, + { "JP a", "C3.e0", 3, 0 }, + { "JR n,a", "20b0.i1.", 3, 0, "r8" }, + { "JR a", "18.i0.", 3, 0, "r8" }, + { "DJNZ a", "10.i0.", 3, 0, "r8" }, + { "CALL m,a", "C4b0.e1", 3, 0 }, + { "CALL a", "CD.e0", 3, 0 }, + { "RETI", "ED.4D.", 3, 0 }, + { "RETN", "ED.45.", 3, 0 }, + { "RET m", "C0b0.", 3, 0 }, + { "RET", "C9.", 3, 0 }, + { "RST a", "C7j0.", 3, 0, "ss" }, + { "IN b,(C)", "ED.40b0.", 3, 0 }, + { "IN A,(a)", "DB.d0.", 3, 0, "e8" }, + { "IN F,(a)", "ED.70.", 3, 0 }, + { "IN (C)", "ED.70.", 1, 1 }, + { "INI", "ED.A2.", 3, 0 }, + { "INIR", "ED.B2.", 3, 0 }, + { "IND", "ED.AA.", 3, 0 }, + { "INDR", "ED.BA.", 3, 0 }, + { "OUT (C),0", "ED.71.", 1, 1 }, + { "OUT (C),b", "ED.41b0.", 3, 0 }, + { "OUT (a),A", "D3.d0.", 3, 0, "e8" }, + { "OUTI", "ED.A3.", 3, 0 }, + { "OTIR", "ED.B3.", 3, 0 }, + { "OUTD", "ED.AB.", 3, 0 }, + { "OTDR", "ED.BB.", 3, 0 }, + /* hd64180 added instructions */ + { "IN0 b,(a)", "ED.00b0.d1.", 2, 0, "e8" }, + { "OUT0 (a),b", "ED.01b1.d0.", 2, 0, "e8" }, + { "OTDM", "ED.8B.", 2, 0 }, + { "OTDMR", "ED.9B.", 2, 0 }, + { "OTIM", "ED.83.", 2, 0 }, + { "OTIMR", "ED.93.", 2, 0 }, + { "MLT d", "ED.4Cf0.", 2, 0 }, + { "SLP", "ED.76.", 2, 0 }, + { "TST b", "ED.04b0.", 2, 0 }, + { "TST (HL)", "ED.34.", 2, 0 }, + { "TST a", "ED.64.d0.", 2, 0, "e8" }, + { "TSTIO a", "ED.74.d0.", 2, 0, "e8" }, + { NULL, NULL }, +}; + +static const char *const bval[] = { "B", "C", "D", "E", + "H", "L", "", "A", NULL }; +static const char *const cval[] = { "IX", "IY", NULL }; +static const char *const dval[] = { "BC", "DE", "HL", "SP", NULL }; +static const char *const fval[] = { "BC", "DE", "HL", "AF", NULL }; +static const char *const gval[] = { "ADD", "ADC", "SUB", "SBC", + "AND", "XOR", "OR", "CP", NULL }; +static const char *const hval[] = { "INC", "DEC", NULL }; +static const char *const ival[] = { "BC", "DE", "IX", "SP", NULL }; +static const char *const jval[] = { "BC", "DE", "IY", "SP", NULL }; +static const char *const kval[] = { "RLC", "RRC", "RL", "RR", + "SLA", "SRA", "", "SRL", NULL }; +static const char *const lval[] = { "", "BIT", "RES", "SET", NULL }; +static const char *const mval[] = { "NZ", "Z", "NC", "C", + "PO", "PE", "P", "M", NULL }; +static const char *const nval[] = { "NZ", "Z", "NC", "C", NULL }; +static const char *const pval[] = { "B", "C", "D", "E", + "IXH", "IXL", "", "A", NULL }; +static const char *const qval[] = { "B", "C", "D", "E", + "IYH", "IYL", "", "A", NULL }; +static const char *const nullv[] = { NULL }; + +static const char *const *const valtab[] = { + bval, cval, dval, dval, fval, + gval, hval, ival, jval, kval, + lval, mval, nval, nullv, pval, + qval +}; + +static int indval(const char *p, int disp, const char **q) +{ + int v; + const char *r; + + v = mreg(p, cval, &r); + if (v >= 0) { + v = (v == 0) ? 0xDD : 0xFD; + while (*r == ' ') r++; + if (!disp || *r == '+' || *r == '-') { + *q = r; + return v; + } + } + return -1; +} + +static int match_z80(char c, const char *p, const char **q) +{ + int v; + + if (c == 'c' || c == 'e') { + v = indval(p, c == 'c', q); + } else if (c <= 'q') { + v = mreg(p, valtab[(int) (c - 'b')], q); + } else { + v = -1; + } + + return v; +} + +static int gen_z80(int *eb, char p, const int *vs, int i, int savepc) +{ + int b; + + b = *eb; + switch (p) { + case 'f': b |= (vs[i] << 4); break; + case 'g': b |= (vs[i] << 6); break; + case 'i': b = (vs[i] - savepc - 2); break; + case 'j': if (s_pass > 0 && (vs[i] & ~56) != 0) { + eprint(_("invalid RST argument (%d)\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b |= vs[i]; + break; + case 'k': if (s_pass > 0 && (vs[i] < 0 || vs[i] > 2)) { + eprint(_("invalid IM argument (%d)\n"), + vs[i]); + eprcol(s_pline, s_pline_ep); + newerr(); + } + b = 0x46; + if (vs[i] == 1) + b = 0x56; + else if (vs[i] == 2) + b = 0x5E; + break; + case 'm': if (s_pass == 0 && !s_extended_op) { + if (vs[i] != 0 && vs[i] != 1 && vs[i] != 3) { + eprint(_("unofficial syntax\n")); + eprcol(s_pline, s_pline_ep); + newerr(); + } + } + break; + case 'n': if (s_pass == 0 && !s_extended_op) { + if (vs[i] == 0 || vs[i] == 1 || vs[i] == 3) { + eprint(_("unofficial syntax\n")); + eprcol(s_pline, s_pline_ep); + newerr(); + } + } + break; + default: + return -1; + } + + *eb = b; + return 0; +} + +static int s_pat_char = 'b'; +static int s_pat_index; + +static void pat_char_rewind_z80(int c) +{ + s_pat_char = c; + s_pat_index = 0; +}; + +static const char *pat_next_str_z80(void) +{ + const char *s; + + if (s_pat_char >= 'b' && s_pat_char <= 'q') { + s = valtab[(int) (s_pat_char - 'b')][s_pat_index]; + if (s != NULL) { + s_pat_index++; + } + } else { + s = NULL; + } + + return s; +}; + +const struct target s_target_z80 = { + .id = "z80", + .descr = "Zilog Z80", + .matcht = s_matchtab_z80, + .matchf = match_z80, + .genf = gen_z80, + .pat_char_rewind = pat_char_rewind_z80, + .pat_next_str = pat_next_str_z80, + .mask = 1 +}; + +const struct target s_target_hd64180 = { + .id = "hd64180", + .descr = "Hitachi HD64180", + .matcht = s_matchtab_z80, + .matchf = match_z80, + .genf = gen_z80, + .pat_char_rewind = pat_char_rewind_z80, + .pat_next_str = pat_next_str_z80, + .mask = 2 +}; diff --git a/Tools/unix/zx/Makefile b/Tools/unix/zx/Makefile new file mode 100644 index 00000000..bbffe497 --- /dev/null +++ b/Tools/unix/zx/Makefile @@ -0,0 +1,39 @@ +# +# hacked up brute force makefile for linux and osx +# +UNAME := $(shell uname) +ifeq ($(UNAME), Linux) + SUFFIX=linux +endif +ifeq ($(UNAME), Darwin) + SUFFIX=darwin +endif + +DEST = ../../$(UNAME) +CFLAGS = -g # -DDEBUG + +OBJECTS = zx.o cpmdrv.o cpmglob.o cpmparse.o cpmredir.o \ + drdos.o util.o xlt.o zxbdos.o zxcbdos.o zxdbdos.o z80.o +UNUSED = dirent.o + +all: zx + +$(DEST): + mkdir -p $(DEST) + +clean: + -rm -f $(OBJECTS) config.h + +clobber: clean + -rm -f $(DEST)/zx $(DEST)/bios.bin zx + +install: zx $(DEST) + cp bios.bin zx $(DEST) + +$(OBJECTS): config.h + +zx: $(OBJECTS) + $(CC) -o zx $(OBJECTS) + +config.h: config.h.$(SUFFIX) + cp config.h.$(SUFFIX) config.h diff --git a/Tools/unix/zx/bios.bin b/Tools/unix/zx/bios.bin new file mode 100644 index 0000000000000000000000000000000000000000..b20e62d901a87453f143ee811a912600c740df47 GIT binary patch literal 384 zcma!waCSB@In4Rb?!eoBCmFB+AOE{b#{cd>7),rflags(x,x&1)) +#define rrc(x) do{var_t=x&1;x=(x>>1)|(t<<7);rflags(x,t);}while(0) +#define rl(x) do{var_t=x>>7;x=(x<<1)|(f&1);rflags(x,t);}while(0) +#define rr(x) do{var_t=x&1;x=(x>>1)|(f<<7);rflags(x,t);}while(0) +#define sla(x) do{var_t=x>>7;x<<=1;rflags(x,t);}while(0) +#define sra(x) do{var_t=x&1;x=((signed char)x)>>1;rflags(x,t);}while(0) +#define sll(x) do{var_t=x>>7;x=(x<<1)|1;rflags(x,t);}while(0) +#define srl(x) do{var_t=x&1;x>>=1;rflags(x,t);}while(0) + +#define rflags(x,c) (f=(c)|(x&0xa8)|((!x)<<6)|parity(x)) + +#define bit(n,x) (f=(f&1)|((x&(1<>3)&7; + switch(op&0xc7){ + case 0x40: bit(n,b); break; + case 0x41: bit(n,c); break; + case 0x42: bit(n,d); break; + case 0x43: bit(n,e); break; + case 0x44: bit(n,h); break; + case 0x45: bit(n,l); break; + case 0x46: tstates+=4;val=fetch(addr);bit(n,val);store(addr,val);break; + case 0x47: bit(n,a); break; + case 0x80: res(n,b); break; + case 0x81: res(n,c); break; + case 0x82: res(n,d); break; + case 0x83: res(n,e); break; + case 0x84: res(n,h); break; + case 0x85: res(n,l); break; + case 0x86: tstates+=4;val=fetch(addr);res(n,val);store(addr,val);break; + case 0x87: res(n,a); break; + case 0xc0: set(n,b); break; + case 0xc1: set(n,c); break; + case 0xc2: set(n,d); break; + case 0xc3: set(n,e); break; + case 0xc4: set(n,h); break; + case 0xc5: set(n,l); break; + case 0xc6: tstates+=4;val=fetch(addr);set(n,val);store(addr,val);break; + case 0xc7: set(n,a); break; + } + } + if(ixoriy)switch(reg){ + case 0:b=val; break; + case 1:c=val; break; + case 2:d=val; break; + case 3:e=val; break; + case 4:h=val; break; + case 5:l=val; break; + case 7:a=val; break; + } +} + +#undef var_t +#undef rlc +#undef rrc +#undef rl +#undef rr +#undef sla +#undef sra +#undef sll +#undef srl +#undef rflags +#undef bit +#undef set +#undef res diff --git a/Tools/unix/zx/config.h.darwin b/Tools/unix/zx/config.h.darwin new file mode 100644 index 00000000..d3a4bdb0 --- /dev/null +++ b/Tools/unix/zx/config.h.darwin @@ -0,0 +1,15 @@ +//#define HAVE_WINDOWS_H +#define HAVE_DIRENT_H +#define HAVE_UTIME_H +#define HAVE_FCNTL_H +#define BINDIR80 getenv("ZXBINDIR") +#define LIBDIR80 getenv("ZXLIBDIR") +#define INCDIR80 getenv("ZXINCDIR") +#define LINUX +#include +#include +#define _S_IFDIR S_IFDIR +#define strcmpi(a,b) strcasecmp(a,b) +//#define WIN32 +//#define WINVER 0x0501 // target Windows XP +//#define _WIN32_WINNNT 0x0501 // target Windows XP diff --git a/Tools/unix/zx/config.h.linux b/Tools/unix/zx/config.h.linux new file mode 100644 index 00000000..bca1a709 --- /dev/null +++ b/Tools/unix/zx/config.h.linux @@ -0,0 +1,16 @@ +//#define HAVE_WINDOWS_H +#define HAVE_DIRENT_H +#define HAVE_UTIME_H +#define HAVE_FCNTL_H +#define HAVE_SYS_VFS_H +#define BINDIR80 getenv("ZXBINDIR") +#define LIBDIR80 getenv("ZXLIBDIR") +#define INCDIR80 getenv("ZXINCDIR") +#define LINUX +#include +#include +#define _S_IFDIR S_IFDIR +#define strcmpi(a,b) strcasecmp(a,b) +//#define WIN32 +//#define WINVER 0x0501 // target Windows XP +//#define _WIN32_WINNNT 0x0501 // target Windows XP diff --git a/Tools/unix/zx/config.h.windows b/Tools/unix/zx/config.h.windows new file mode 100644 index 00000000..8186c485 --- /dev/null +++ b/Tools/unix/zx/config.h.windows @@ -0,0 +1,9 @@ +#define HAVE_WINDOWS_H +//#define HAVE_DIRENT_H +#define HAVE_FCNTL_H +#define BINDIR80 getenv("ZXBINDIR") +#define LIBDIR80 getenv("ZXLIBDIR") +#define INCDIR80 getenv("ZXINCDIR") +#define WIN32 +#define WINVER 0x0501 // target Windows XP +#define _WIN32_WINNNT 0x0501 // target Windows XP diff --git a/Tools/unix/zx/cpm/bios.bin b/Tools/unix/zx/cpm/bios.bin new file mode 100644 index 0000000000000000000000000000000000000000..b20e62d901a87453f143ee811a912600c740df47 GIT binary patch literal 384 zcma!waCSB@In4Rb?!eoBCmFB+AOE{b#{cd + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This file deals with drive-based functions. +*/ + +#include "cpmint.h" + +#ifdef WIN32 + +static char *drive_to_hostdrive(int cpm_drive) +{ + static char prefix[CPM_MAXPATH]; + char *lpfp; + DWORD dw; + + if (!redir_drive_prefix[cpm_drive]) return NULL; + dw = GetFullPathName(redir_drive_prefix[cpm_drive], sizeof(prefix), + prefix, &lpfp); + + if (!dw) return NULL; + if (prefix[1] == ':') /* If path starts with a drive, limit it */ + { /* to just that drive */ + prefix[2] = '/'; + prefix[3] = 0; + } + return prefix; +} +#endif + + +cpm_byte fcb_reset(void) +{ +#ifdef __MSDOS__ + bdos(0x0D, 0, 0); +#endif + + redir_l_drives = 0; + redir_cpmdrive = 0; /* A reset forces current drive to A: */ +/* redir_ro_drives = 0; Software write protect not revoked by func 0Dh. + * + * This does not follow true CP/M, but does match many 3rd-party replacements. + */ + return 0; +} + + +cpm_word fcb_drive (cpm_byte drv) +{ + if (redir_drive_prefix[drv][0]) + { + redir_cpmdrive = drv; + redir_log_drv(drv); + return 0; + } + else return 0x04FF; /* Drive doesn't exist */ +} + +cpm_byte fcb_getdrv(void) +{ + return redir_cpmdrive; +} + + +cpm_byte fcb_user (cpm_byte usr) +{ + if (usr != 0xFF) redir_cpmuser = usr % 16; + + redir_Msg("User: parameter %d returns %d\r\n", usr, redir_cpmuser); + + return redir_cpmuser; +} + + + +cpm_word fcb_logvec(void) +{ + return redir_l_drives; +} + + +cpm_word fcb_rovec(void) +{ + return redir_ro_drives; +} + + +cpm_word fcb_rodisk(void) +{ + cpm_word mask = 1; + + if (redir_cpmdrive) mask = mask << redir_cpmdrive; + + redir_ro_drives |= mask; + return 0; +} + + +cpm_word fcb_resro(cpm_word bitmap) +{ + redir_ro_drives &= ~bitmap; + + return 0; +} + + +cpm_word fcb_sync(cpm_byte flag) +{ +#ifdef WIN32 + return 0; +#else + sync(); return 0; /* Apparently some sync()s are void not int */ +#endif +} + + +cpm_word fcb_purge() +{ +#ifdef WIN32 + return 0; +#else + sync(); return 0; /* Apparently some sync()s are void not int */ +#endif +} + + +static cpm_byte exdpb[0x11] = { + 0x80, 0, /* 128 records/track */ + 0x04, 0x0F, /* 2k blocks */ + 0x00, /* 16k / extent */ + 0xFF, 0x0F, /* 4095 blocks */ + 0xFF, 0x03, /* 1024 dir entries */ + 0xFF, 0xFF, /* 16 directory blocks */ + 0x00, 0x80, /* Non-removable media */ + 0x00, 0x00, /* No system tracks */ + 0x02, 0x03 /* 512-byte sectors */ +}; + +cpm_word fcb_getdpb(cpm_byte *dpb) +{ +#ifdef WIN32 + DWORD spc, bps, fc, tc; + unsigned bsh, blm, psh, phm; + char *hostd = drive_to_hostdrive(redir_cpmdrive); + + if (!hostd) return 0x01FF; /* Can't select */ + + if (!GetDiskFreeSpace(hostd, &spc, &bps, &fc, &tc)) + return 0x01FF; /* Can't select */ + + /* Store total clusters */ + //if (tc > 0x10000L) tc = 0x10000L; + if (tc > 0xFFFFL) tc = 0xFFFFL; + + psh = 0; phm = 0; + + while (bps > 128) /* Get sector size */ + { + bps /= 2; + psh++; + phm = (phm << 1) | 1; + } + bsh = psh; blm = phm; + while (spc > 1) /* Get cluster size */ + { + spc /= 2; + bsh++; + blm = (blm << 1) | 1; + } + + + exdpb[2] = bsh; + exdpb[3] = blm; + exdpb[5] = tc & 0xFF; + exdpb[6] = tc >> 8; + + exdpb[15] = psh; + exdpb[16] = phm; +#else + struct statfs buf; + cpm_word nfiles; + + /* Get DPB for redir_cpmdrive. Currently just returns a dummy. */ + if (!statfs(redir_drive_prefix[redir_cpmdrive], &buf)) + { + /* Store correct directory entry count */ + + if (buf.f_files >= 0x10000L) nfiles = 0xFFFF; + else nfiles = buf.f_files; + + exdpb[7] = nfiles & 0xFF; + exdpb[8] = nfiles >> 8; + } +#endif + + memcpy(dpb, &exdpb, 0x11); + return 0x11; +} + + +/* Create an entirely bogus ALV + * TODO: Make it a bit better */ + +cpm_word fcb_getalv(cpm_byte *alv, cpm_word max) +{ + if (max > 1024) max = 1024; + + memset(alv, 0xFF, max / 2); + memset(alv + (max / 2), 0, max / 2); + + return max; +} + +/* Get disk free space */ + +cpm_word fcb_dfree (cpm_byte drive, cpm_byte *dma) +{ +#ifdef WIN32 + DWORD spc, bps, fc, tc; + DWORD freerec; + char *hostd = drive_to_hostdrive(drive); + + if (!hostd) return 0x01FF; + if (!hostd) return 0x01FF; /* Can't select */ + + if (!GetDiskFreeSpace(hostd, &spc, &bps, &fc, &tc)) + return 0x01FF; /* Can't select */ + + freerec = fc; /* Free clusters */ + freerec *= spc; /* Free sectors */ + freerec *= (bps / 128); /* Free CP/M records */ + + /* Limit to maximum CP/M drive size */ + if (freerec > 4194303L) freerec = 4194303L; + redir_wr24(dma, freerec); + +#else + struct statfs buf; + long dfree; + + if (!redir_drive_prefix[drive]) return 0x01FF; /* Can't select */ + + if (statfs(redir_drive_prefix[drive], &buf)) return 0x01FF; + + dfree = (buf.f_bavail * (buf.f_bsize / 128)); + + if (dfree < buf.f_bavail || /* Calculation has wrapped round */ + dfree > 4194303L) /* Bigger than max CP/M drive size */ + { + dfree = 4194303L; + } + + redir_wr24(dma, dfree); +#endif + return 0; +} + + + diff --git a/Tools/unix/zx/cpmglob.c b/Tools/unix/zx/cpmglob.c new file mode 100644 index 00000000..20306e09 --- /dev/null +++ b/Tools/unix/zx/cpmglob.c @@ -0,0 +1,579 @@ +/* + + CPMREDIR: CP/M filesystem redirector + Copyright (C) 1998, John Elliott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This file implements those BDOS functions that use wildcard expansion. +*/ + +#include "cpmint.h" + +static cpm_byte *find_fcb; +static int find_n; +static int find_ext = 0; +static int find_xfcb = 0; +static int entryno; +static cpm_byte lastdma[0x80]; +static long lastsize; +static char target_name[CPM_MAXPATH]; + +static char upper(char c) +{ + if (islower(c)) return toupper(c); + return c; +} + +/* + * we need to handle case sensitive filesystems correctly. + * underlying files need to just work, irrespective if the files + * in the native filesystem are mixed, upper or lower. + * the naive code in the distributed zx will not work everywhere. + */ + +/* Does the string "s" match the CP/M FCB? */ +/* pattern[0-10] will become a CP/M name parsed from "s" if it matches. */ +/* If 1st byte of FCB is '?' then anything matches. */ + +static int cpm_match(char *s, cpm_byte *fcb, cpm_byte *pattern) +{ + int n, m; + char *dotpos; + + m = strlen(s); + + /* + * let's cook the filename into something that we can match against + * the fcb. we reject any that can't be valid cp/m filenames, + * normalizing case as we go. all this goes into 'pattern' + */ + for (n = 0; n < 11; n++) pattern[n] = ' '; + + /* The name must have 1 or 0 dots */ + dotpos = strchr(s, '.'); + if (!dotpos) { /* No dot. The name must be at most 8 characters */ + if (m > 8) return 0; + for (n = 0; n < m; n++) { + pattern[n] = upper(s[n]) & 0x7F; + } + } else { /* at least one dot */ + if (strchr(dotpos + 1, '.')) { /* More than 1 dot */ + return 0; + } + if (dotpos == s) { /* Dot right at the beginning */ + return 0; + } + if ((dotpos - s) > 8) { /* "name" > 8 characters */ + return 0; + } + if (strlen(dotpos + 1) > 3) { /* "type" > 3 characters */ + return 0; + } + for (n = 0; n < (dotpos - s); n++) { /* copy filename portion */ + pattern[n] = upper(s[n]) & 0x7F; + } + m = strlen(dotpos + 1); + for (n = 0; n < m; n++) { /* copy extention portion */ + pattern[n + 8] = upper(dotpos[n + 1]) & 0x7F; + } + } + + /* + * handle special case where fcb[0] == '?' or fcb[0] & 0x80 + * this is used to return a full directory list on bdos's + */ + if (((fcb[0] & 0x7F) == '?') || (fcb[0] & 0x80)) { + return 1; + } + + for (n = 0; n < 11; n++) { + if (fcb[n+1] == '?') continue; + if ((pattern[n] & 0x7F) != (fcb[n+1] & 0x7F)) { + return 0; + } + } + return 1; /* Success! */ +} + + +/* Get the next entry from the host's directory matching "fcb" */ + +static struct dirent * next_entry(DIR *dir, cpm_byte *fcb, cpm_byte *pattern, + struct stat *st) +{ + struct dirent *en; + int unsatisfied; + int drv = fcb[0] & 0x7F; + + if (drv == '?') drv = 0; + if (!drv) drv = redir_cpmdrive; + else drv--; + + for (unsatisfied = 1; unsatisfied; ) + { + /* 1. Get the next entry */ + + en = readdir(dir); + if (!en) return NULL; /* No next entry */ + ++entryno; /* 0 for 1st, 1 for 2nd, etc. */ + + /* 2. See if it matches. We do this first (in preference to + seeing if it's a subdirectory first) because it doesn't + require disc access */ + if (!cpm_match(en->d_name, fcb, pattern)) + { + continue; + } + /* 3. Stat it, & reject it if it's a directory */ + + strcpy(target_name, redir_drive_prefix[drv]); + strcat(target_name, en->d_name); + + if (stat(target_name, st)) + { + redir_Msg("Can't stat %s so omitting it.\n", target_name); + continue; /* Can't stat */ + } + //if (S_ISDIR(st->st_mode)) + if ((st->st_mode) & _S_IFDIR) + { + /* Searching for files only */ + if (fcb[0] != '?' && fcb[0] < 0x80) + { + continue; + } + } + unsatisfied = 0; + } + return en; +} + + + +void volume_label(int drv, cpm_byte *dma) +{ + struct stat st; + + memset(dma, 0x20, 12); /* Volume label */ + + /* Get label name */ + redir_get_label(drv, (char *)(dma + 1)); + /* [0x0c] = label byte + * [0x0d] = password byte (=0) + * [0x10-0x17] = password + * [0x18] = label create date + * [0x1c] = label update date + */ +#ifdef __MSDOS__ + dma[0x0c] = 0x21; /* Under DOS, only "update" */ + if (redir_drdos) dma[0x0c] |= 0x80; /* Under DRDOS, passwords allowed */ +#else + dma[0x0c] = 0x61; /* Label exists and time stamps allowed */ +#endif /* (update & access) */ + dma[0x0d] = 0; /* Label not passworded */ + dma[0x0f] = 0x80; /* Non-CP/M media */ + + if (stat(redir_drive_prefix[drv], &st)) + { + redir_Msg("stat() fails on '%s'\n", redir_drive_prefix[drv]); + return; + } + + redir_wr32(dma + 0x18, redir_cpmtime(st.st_atime)); + redir_wr32(dma + 0x1C, redir_cpmtime(st.st_mtime)); +} + + + +cpm_word redir_find(int n, cpm_byte *fcb, cpm_byte *dma) +{ + DIR *hostdir; + int drv, attrib; + long recs; + struct stat st; + struct dirent *de; + cpm_word rights; + + drv = (fcb[0] & 0x7F); + if (!drv || drv == '?') drv = redir_cpmdrive; + else drv--; + + if (find_xfcb) /* Return another extent */ + { + memcpy(dma, lastdma, 0x80); + dma[0] |= 0x10; /* XFCB */ + dma[0x0c] = dma[0x69]; /* Password mode */ + dma[0x0d] = 0x0A; /* Password decode byte */ + memset(dma + 0x10, '*', 7); + dma[0x17] = ' '; /* Encoded password */ + memcpy(lastdma, dma, 0x80); + + find_xfcb = 0; + return 0; + } + + if (find_ext) /* Return another extent */ + { + memcpy(dma, lastdma, 0x80); + dma[0x0c]++; + if (dma[0x0c] == 0x20) + { + dma[0x0c] = 0; + dma[0x0e]++; + } + lastsize -= 0x4000; + recs = (lastsize + 127) / 128; + dma[0x0f] = (recs > 127) ? 0x80 : (recs & 0x7F); + + if (lastsize <= 0x4000) find_ext = 0; + memcpy(lastdma, dma, 0x80); + + return 0; + } + + + memset(dma, 0, 128); /* Zap the buffer */ + + /* + If returning all entries, return a volume label. + */ + if ((fcb[0] & 0x7F) == '?') + { + if (!n) + { + volume_label(drv, dma); + return 0; + } + else --n; + } + + /* Note: This implies that opendir() works on a filename with a + trailing slash. It does under Linux, but that's the only assurance + I can give. + */ + + entryno = -1; + hostdir = opendir(redir_drive_prefix[drv]); + + if (!hostdir) + { + redir_Msg("opendir() fails on '%s'\n", redir_drive_prefix[drv]); + return 0xFF; + } + /* We have a handle to the directory. */ + while (n >= 0) + { + de = next_entry(hostdir, fcb, dma + 1, &st); + if (!de) return 0xFF; + --n; + } + /* Valid entry found & statted. dma+1 holds filename. */ + + dma[0] = redir_cpmuser; /* Uid always matches */ + dma[0x0c] = 0; /* Extent counter, low */ + dma[0x0d] = st.st_size & 0x7F; /* Last record byte count */ + dma[0x0e] = 0; /* Extent counter, high */ + +#ifdef __MSDOS__ + _dos_getfileattr(target_name, (unsigned int *)&attrib); + rights = redir_drdos_get_rights(target_name); + if (rights && ((fcb[0] & 0x7F) == '?')) find_xfcb = 1; +#else + attrib = 0; + rights = 0; +#endif + if (attrib & 1) dma[9] |= 0x80; + if (attrib & 4) dma[10] |= 0x80; + if (!(attrib & 0x20)) dma[11] |= 0x80; + + + +/* TODO: Under Unix, work out correct RO setting */ + + recs = (st.st_size + 127) / 128; + dma[0x0f] = (recs > 127) ? 0x80 : (recs & 0x7F); + dma[0x10] = 0x80; + //if (S_ISDIR(st.st_mode)) dma[0x10] |= 0x40; + if ((st.st_mode) & _S_IFDIR) {dma[0x10] |= 0x40;} + if (attrib & 2) dma[0x10] |= 0x20; + dma[0x10] |= ((entryno & 0x1FFF) >> 8); + dma[0x11] = dma[0x10]; + dma[0x12] = entryno & 0xFF; + + redir_wr32(dma + 0x16, st.st_mtime); /* Modification time. */ + /* TODO: It should be in DOS */ + /* format */ + /* TODO: At 0x1A, 1st cluster */ + redir_wr32(dma + 0x1C, st.st_size); /* True size */ + + if (rights) /* Store password mode. Don't return an XFCB. */ + { + dma[0x69] = redir_cpm_pwmode(rights); + memcpy(lastdma, dma, 0x80); + } + + dma[0x60] = 0x21; /* XFCB */ + redir_wr32(dma + 0x61, redir_cpmtime(st.st_atime)); + redir_wr32(dma + 0x65, redir_cpmtime(st.st_mtime)); + + closedir(hostdir); + + if (st.st_size > 0x4000 && (fcb[0x0C] == '?')) /* All extents? */ + { + lastsize = st.st_size; + find_ext = 1; + memcpy(lastdma, dma, 0x80); + } + return 0; +} + + +#ifdef DEBUG +#define SHOWNAME(func) \ + { \ + char fname[CPM_MAXPATH]; \ + redir_fcb2unix(fcb, fname); \ + redir_Msg(func "(\"%s\")\n", fname); \ + } + +#else + #define SHOWNAME(func) +#endif + +cpm_word fcb_find1 (cpm_byte *fcb, cpm_byte *dma) /* 0x11 */ +{ +#ifdef DEBUG + int rv; +#endif + SHOWNAME("fcb_find1") + + redir_log_fcb(fcb); + + find_n = 0; + find_fcb = fcb; + find_ext = 0; + find_xfcb = 0; +#ifdef DEBUG + rv = redir_find(find_n, fcb, dma); + + if (rv < 4) + { + redir_Msg("Ret: %-11.11s\n", dma + 1); + } + else redir_Msg("Ret: Fail\n"); + return rv; +#else + return redir_find(find_n, find_fcb, dma); +#endif +} + +/* We don't bother with the FCB parameter - it's undocmented, and + * programs that do know about it will just pass in the same parameter + * that they did to function 0x11 */ + +cpm_word fcb_find2 (cpm_byte *fcb, cpm_byte *dma) /* 0x12 */ +{ +#ifdef DEBUG + int rv; + + char fname[CPM_MAXPATH]; + redir_fcb2unix(find_fcb, fname); + redir_Msg("fcb_find2(\"%s\") no. %d\n", fname, find_n); +#endif + ++find_n; +#ifdef DEBUG + rv = redir_find(find_n, find_fcb, dma); + + if (rv < 4) + { + redir_Msg("Ret: %-11.11s\n", dma + 1); + } + else redir_Msg("Ret: Fail\n"); + return rv; +#else + return redir_find(find_n, find_fcb, dma); +#endif +} + +/* Under CP/M, unlinking works with wildcards */ + +cpm_word fcb_unlink(cpm_byte *fcb, cpm_byte *dma) +{ + DIR *hostdir; + int drv; + struct dirent *de; + struct stat st; + int handle = 0; + int unpasswd = 0; + char fname[CPM_MAXPATH]; + + SHOWNAME("fcb_unlink") + + if (fcb[5] & 0x80) unpasswd = 1; /* Remove password rather than file */ + + redir_log_fcb(fcb); + + drv = (fcb[0] & 0x7F); + if (!drv || drv == '?') drv = redir_cpmdrive; + else drv--; + + if (redir_ro_drv(drv)) return 0x02FF; /* Error: R/O drive */ + +#ifdef DEBUG + redir_fcb2unix(fcb, fname); + redir_Msg("fcb_unlink(\"%s\")\n", fname); +#endif + + /* Note: This implies that opendir() works on a filename with a + trailing slash. It does under Linux, but that's the only assurance + I can give. + */ + + hostdir = opendir(redir_drive_prefix[drv]); + + if (!hostdir) + { + redir_Msg("opendir() fails on '%s'\n", redir_drive_prefix[drv]); + return 0xFF; + } + /* We have a handle to the directory. */ + do + { + de = next_entry(hostdir, fcb, (cpm_byte *)fname, &st); + if (de) + { + strcpy(target_name, redir_drive_prefix[drv]); + strcat(target_name, de->d_name); + redir_Msg("Deleting %s\n", de->d_name); + if (unpasswd) + { +#ifdef __MSDOS__ + if (redir_drdos) + { + handle = redir_drdos_put_rights (target_name, dma, 0); + } + else handle = 0; +#endif + } + else if (fcb[0] & 0x80) + { + handle = rmdir(target_name); + if (handle && redir_password_error()) + { + redir_password_append(target_name, dma); + handle = rmdir(target_name); + } + } + else + { + handle = unlink(target_name); + if (handle && redir_password_error()) + { + redir_password_append(target_name, dma); + handle = unlink(target_name); + } + } + + if (handle) de = NULL; /* Delete failed */ + } + } + while (de != NULL); + if (handle) + { + redir_Msg("Ret: -1\n"); + closedir(hostdir); + return 0xFF; + } + redir_Msg("Ret: 0\n"); + closedir(hostdir); + return 0; +} + + + + + +#ifdef __MSDOS__ +cpm_word redir_get_label(cpm_byte drv, char *pattern) +{ + char strs[10]; + struct ffblk fblk; + int done; + char *s; + int n; + + /* We need the drive prefix to be of the form "C:\etc..." */ + + memset(pattern, ' ', 11); + if (!redir_drive_prefix[drv][0] || redir_drive_prefix[drv][1] != ':') + return 0; + + sprintf(strs,"%c:/*.*", redir_drive_prefix[drv][0]); + + done = findfirst(strs, &fblk, FA_LABEL); + while (!done) + { + if ((fblk.ff_attrib & FA_LABEL) && + !(fblk.ff_attrib & (FA_SYSTEM | FA_HIDDEN))) + { + s = strchr(fblk.ff_name, '/'); + if (!s) s = strchr(fblk.ff_name, '\\'); + if (!s) s = strchr(fblk.ff_name, ':'); + if (!s) s = fblk.ff_name; + for (n = 0; n < 11; n++) + { + if (!(*s)) break; + if (*s == '.') + { + n = 7; + ++s; + continue; + } + pattern[n] = upper(*s); + ++s; + } + return 1; + } + done = findnext(&fblk); + } + return 0; +} +#else +cpm_word redir_get_label(cpm_byte drv, char *pattern) +{ + char *dname; + int l, n; + + memset(pattern, ' ', 11); + + dname = strrchr(redir_drive_prefix[drv], '/'); + if (dname) + { + ++dname; + l = strlen(dname); + if (l > 11) l = 11; + for (n = 0; n < l; n++) pattern[n] = upper(dname[l]); + } + else + { + pattern[0] = '.'; + } + return 0; +} + + + +#endif diff --git a/Tools/unix/zx/cpmint.h b/Tools/unix/zx/cpmint.h new file mode 100644 index 00000000..f0ec4237 --- /dev/null +++ b/Tools/unix/zx/cpmint.h @@ -0,0 +1,223 @@ +/* + + CPMREDIR: CP/M filesystem redirector + Copyright (C) 1998, John Elliott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This file holds internal declarations for the library. +*/ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_DIRENT_H +# include +#else +#ifdef __WATCOMC__ +# include +# include +#else +# include "dirent.h" +#endif +#endif +#ifdef HAVE_NDIR_H +# include +#endif +#ifdef HAVE_SYS_DIR_H +# include +#endif +#ifdef HAVE_SYS_NDIR_H +# include +#endif +#ifdef HAVE_WINDOWS_H +# include +#endif +#ifdef HAVE_WINNT_H +# include +#endif +#ifdef HAVE_SYS_VFS_H +# include +#endif +#ifdef HAVE_UTIME_H +# include +#endif +#ifdef HAVE_FCNTL_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif + + +#ifdef __MSDOS__ + #include + #include + #include + #ifdef __GO32__ + #include + #include + #include + #endif +#endif + +#define CASE_SENSITIVE_FILESYSTEM 0 + + +#include "cpmredir.h" + +typedef unsigned long dword; /* Must be at least 32 bits, and + >= sizeof(int) */ +#ifdef CPMDEF + #define EXT + #define INIT(x) =x +#else + #define EXT extern + #define INIT(x) +#endif + +/* The 16 directories to which the 16 CP/M drives are mapped */ + +EXT char redir_drive_prefix[16][CPM_MAXPATH]; + +/* Current drive and user */ + +EXT int redir_cpmdrive; +EXT int redir_cpmuser; + +/* Length of 1 read/write operation, bytes */ + +EXT int redir_rec_len INIT(128); + +/* Same, but in 128-byte records */ +EXT int redir_rec_multi INIT(1); + +/* Using a DRDOS system? */ +EXT int redir_drdos INIT(0); + +/* Default password */ +#ifdef __MSDOS__ +EXT char redir_passwd[8] INIT(""); +#endif + +EXT cpm_word redir_l_drives INIT(0); +EXT cpm_word redir_ro_drives INIT(0); + +#undef EXT +#undef INIT + + + +/* Convert FCB to a Unix filename, returning 1 if it's ambiguous */ +int redir_fcb2unix(cpm_byte *fcb, char *fname); + +/* Open FCB, set file attributes */ +int redir_ofile(cpm_byte * fcb, char *s); + +/* Check that the FCB we have is valid */ +int redir_verify_fcb(cpm_byte *fcb); + +#ifndef O_BINARY /* Necessary in DOS, not present in Linux */ +#define O_BINARY 0 +#endif + +/* Facilities for debug tracing */ + + +long zxlseek(int fd, long offset, int wh); + +#ifdef DEBUG + void redir_Msg(char *s, ...); + void redir_showfcb(cpm_byte *fcb); +#else + /* Warning: This is a GCC extension */ + #define redir_Msg(x, ...) + #define redir_showfcb(x) +#endif + + + +/* Get the "sequential access" file pointer out of an FCB */ + +long redir_get_fcb_pos(cpm_byte *fcb); + +/* Write "sequential access" pointer to FCB */ + +void redir_put_fcb_pos(cpm_byte *fcb, long npos); + +/* Convert time_t to CP/M day count/hours/minutes */ +dword redir_cpmtime(time_t t); +/* And back */ +time_t redir_unixtime(cpm_byte *c); + + +/* Functions to access 24-bit & 32-bit words in memory. These are always + little-endian. */ + +void redir_wr24(cpm_byte *addr, dword v); +void redir_wr32(cpm_byte *addr, dword v); +dword redir_rd24(cpm_byte *addr); +dword redir_rd32(cpm_byte *addr); + +/* If you have 64-bit file handles, you'll need to write separate wrhandle() + and rdhandle() routines */ +#define redir_wrhandle redir_wr32 +#define redir_rdhandle redir_rd32 + +/* Mark a drive as logged in */ + +void redir_log_drv(cpm_byte drv); +void redir_log_fcb(cpm_byte *fcb); + +/* Check if a drive is software read-only */ + +int redir_ro_drv(cpm_byte drv); +int redir_ro_fcb(cpm_byte *fcb); + +/* Translate errno to a CP/M error */ + +cpm_word redir_xlt_err(void); + +/* Get disc label */ +cpm_word redir_get_label(cpm_byte drv, char *pattern); + + +/* DRDOS set/get access rights - no-ops under MSDOS and Unix: + * + * CP/M password mode -> DRDOS password mode */ +cpm_word redir_drdos_pwmode(cpm_byte b); + +/* DRDOS password mode to CP/M password mode */ +cpm_byte redir_cpm_pwmode(cpm_word w); + +/* Get DRDOS access rights for a file */ +cpm_word redir_drdos_get_rights(char *path); + +/* Set DRDOS access rights and/or password */ +cpm_word redir_drdos_put_rights(char *path, cpm_byte *dma, cpm_word rights); + +/* Was the last error caused by invalid password? */ +cpm_word redir_password_error(void); + +/* Append password to filename (FILE.TYP -> FILE.TYP;PASSWORD) */ +void redir_password_append(char *s, cpm_byte *dma); + diff --git a/Tools/unix/zx/cpmparse.c b/Tools/unix/zx/cpmparse.c new file mode 100644 index 00000000..4c709ec1 --- /dev/null +++ b/Tools/unix/zx/cpmparse.c @@ -0,0 +1,126 @@ +/* + + CPMREDIR: CP/M filesystem redirector + Copyright (C) 1998, John Elliott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This file parses filenames to FCBs. +*/ + +#include "cpmint.h" + +#define is_num(c) ((c >= '0') && (c <= '9')) + +static int parse_drive_user(char *txt, cpm_byte *fcb) +{ + char uid[4], drvid[4]; + int up, dp; + + for (up = dp = 0; *txt != ':'; ++txt) + { + if (is_num (*txt)) uid [up++] = *txt; + if (isalpha(*txt)) drvid[dp++] = *txt; + if (!is_num(*txt) && !isalpha(*txt)) return -1; + } + uid[up] = 0; drvid[dp] = 0; + + if (dp > 1) return -1; /* Invalid driveletter */ + if (up > 2) return -1; /* Invalid uid */ + + fcb[0x0d] = atoi(uid) + 1; if (fcb[0x0d] > 16) return -1; + + if (islower(drvid[0])) drvid[0] = toupper(drvid[0]); + + if (drvid[0] < 'A' || drvid[0] > 'P') return -1; + + fcb[0] = drvid[0] - '@'; + return 0; +} + + + +cpm_word fcb_parse(char *txt, cpm_byte *fcb) +{ + int nl = 0, tl = 0, pl = 0, phase = 0; + char *ntxt, ch; + + memset(fcb, 0, 0x24); + + if (txt[1] == ':' || txt[2] == ':' || txt[3] == ':') + { + if (parse_drive_user(txt, fcb)) return 0xFFFF; + /* Move past the colon */ + ntxt = strchr(txt, ':') + 1; + } + else ntxt = txt; + while (phase < 3) + { + ch = *ntxt; + if (islower(ch)) ch = toupper(ch); + + switch(ch) + { + case 0: + case '\r': /* EOL */ + phase = 4; + break; + + case '.': /* file.typ */ + if (!phase) ++phase; + else phase = 3; + break; + + case ';': /* Password */ + if (phase < 2) phase = 2; + else phase = 3; + break; + + case '[': case ']': case '=': case 9: case ' ': + case '>': case '<': case ':': case ',': case '/': + case '|': /* Terminator */ + phase = 3; + + default: + switch(phase) + { + case 0: + if (nl >= 8) return 0xFFFF; + fcb[++nl] = ch; + break; + + case 1: + if (tl >= 3) return 0xFFFF; + fcb[tl + 9] = ch; + ++tl; + break; + + case 2: + if (pl >= 8) return 0xFFFF; + fcb[pl + 0x10] = ch; + ++pl; + break; + } + break; + } + } + if (!nl) return 0xFFFF; + + fcb[0x1A] = pl; + + if (phase == 4) return 0; + + return ntxt - txt; +} diff --git a/Tools/unix/zx/cpmredir.c b/Tools/unix/zx/cpmredir.c new file mode 100644 index 00000000..4fd5f9ca --- /dev/null +++ b/Tools/unix/zx/cpmredir.c @@ -0,0 +1,931 @@ +/* + + CPMREDIR: CP/M filesystem redirector + Copyright (C) 1998, John Elliott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* This file handles actual reading and writing */ + +#define CPMDEF +#include "cpmint.h" + +#ifdef DEBUG +#define SHOWNAME(func) \ + { \ + char fname[CPM_MAXPATH]; \ + redir_fcb2unix(fcb, fname); \ + redir_Msg(func "(\"%s\")\n", fname); \ + } + +#else + #define SHOWNAME(func) +#endif + + +/* DISK BDOS FUNCTIONS */ + +/* General treatment: + * + * We use the "disk block number" fields in the FCB to store our file handle; + * this is a similar trick to that used by DOSPLUS, which stores its cluster + * number in there. It works if: + * + * a) sizeof(int) <= 8 bytes (64 bits). If it's more, this needs rewriting + * to use a hash table; + * b) the program never touches these bytes. Practically no CP/M program does. + * + * We store a "magic number" (0x00FD) in the first two bytes of this field, and + * if the number has been changed then we abort. + * + * nb: Since I wrote ZXCC, I have found that DOSPLUS uses 0x8080 as a magic + * number [well, actually this is an oversimplification, but a hypothetical + * program written against DOSPLUS would work with 0x8080]. Perhaps 0x8080 + * should be used instead. + * + * Format of the field: + * + * [--2 bytes--] magic number + * [--8 bytes--] file handle. 8 bytes reserved but only 4 currently used. + * [--2 bytes--] reserved. + * [--4 bytes--] file length. + */ +#define MAGIC_OFFSET 0x10 +#define HANDLE_OFFSET 0x12 +#define LENGTH_OFFSET 0x1C + +cpm_word fcb_open(cpm_byte *fcb, cpm_byte *dma) +{ + char fname[CPM_MAXPATH]; + int handle; + int drv, l; + char *s; + DIR *dir; + + /* Don't support ambiguous filenames */ + if (redir_fcb2unix(fcb, fname)) return 0x09FF; + + redir_log_fcb(fcb); + + drv = fcb[0] & 0x7F; + if (!drv) drv = redir_cpmdrive; else --drv; + + if (fcb[0] & 0x80) /* Open directory */ + { + if (fcb[0x0C]) return 0x0BFF; /* Can't assign "floating" dir */ + + if (!memcmp(fcb + 1, ". ", 11)) + { + return 0; /* Opening "." */ + } + if (!memcmp(fcb + 1, ".. ", 11)) + { + l = strlen(redir_drive_prefix[drv]) - 1; + s = redir_drive_prefix[drv]; + --l; + while (l > 0) + { + if (s[l] == '/') break; +#ifdef __MSDOS__ + if (s[l] == '\\') break; + if (s[l] == ':') break; +#endif + --l; + } +#ifdef __MSDOS__ + if (l < 2) return 0; /* "C:" */ +#else + if (l <= 0) return 0; /* "/" */ +#endif + ++l; + s[l] = 0; + return 0; + } +/* Opening some other directory */ + + dir = opendir(fname); + if (!dir) return 0xFF; /* Not a directory */ + closedir(dir); + strcpy(redir_drive_prefix[drv], fname); + strcat(redir_drive_prefix[drv], "/"); + return 0; + } + + /* Note: Some programs (MAC is an example) don't close a file + * if they opened it just to do reading. MAC then reopens the + * file (which rewinds it); this causes FCB leaks under some + * DOS-based emulators */ + + handle = redir_ofile(fcb, fname); + redir_Msg("fcb_open(\"%s\")\r\n", fname); + if (handle < 0 && redir_password_error()) + { + redir_Msg("1st chance open failed on %s\r\n", fname); + redir_password_append(fname, dma); + redir_Msg("Trying with %s\r\n", fname); + handle = redir_ofile(fcb, fname); + } + + + if (handle == -1) + { + redir_Msg("Ret: -1\n"); + if (redir_password_error()) return 0x7FF; + return 0xFF; + } + fcb[MAGIC_OFFSET ] = 0xFD; /* "Magic number" */ + fcb[MAGIC_OFFSET + 1] = 0x00; + +/* TODO: Should the magic number perhaps be 0x8080, as in DOSPLUS? */ + + redir_wrhandle(fcb + HANDLE_OFFSET, handle); + + redir_put_fcb_pos(fcb, fcb[0x0C] * 16384); + /* (v1.01) "seek" to beginning of extent, not file. + * This is necessary for the awful I/O code + * in LINK-80 to work + */ + + /* Get the file length */ + redir_wr32(fcb + 0x1C, zxlseek(handle, 0, SEEK_END)); + zxlseek(handle, 0, SEEK_SET); + + /* Set the last record byte count */ + if (fcb[0x20] == 0xFF) fcb[0x20] = fcb[0x1C] & 0x7F; + + redir_Msg("Ret: 0\n"); + + return 0; +} + + +cpm_word fcb_close(cpm_byte *fcb) +{ + int handle, drv; + + SHOWNAME("fcb_close") + + if ((handle = redir_verify_fcb(fcb)) < 0) return -1; + redir_Msg(" (at %lx)\n", zxlseek(handle, 0, SEEK_CUR)); + + if (fcb[0] & 0x80) /* Close directory */ + { + drv = fcb[0] & 0x7F; + if (!drv) drv = redir_cpmdrive; else drv--; +#ifdef __MSDOS__ + strcpy(redir_drive_prefix[drv] + 1, ":/"); +#else + strcpy(redir_drive_prefix[drv], "/"); +#endif + return 0; + } + + if (fcb[5] & 0x80) /* CP/M 3: Flush rather than close */ + { +#ifndef WIN32 + sync(); +#endif + return 0; + } + +#ifdef WIN32 + { + BOOL b; + redir_Msg(">CloseHandle() Handle=%lu\n", handle); + b = CloseHandle((HANDLE)handle); + redir_Msg("80h, let it be 80h + +*/ + + +cpm_word fcb_read(cpm_byte *fcb, cpm_byte *dma) +{ + int handle; + int rv, n, rd_len; + long npos; + + SHOWNAME("fcb_read") + + if ((handle = redir_verify_fcb(fcb)) < 0) return 9; /* Invalid FCB */ + + /* The program may have mucked about with the counters, so + * do an lseek() to where it should be. */ + + npos = redir_get_fcb_pos(fcb); + zxlseek(handle, npos, SEEK_SET); + redir_Msg(" (from %lx)\n", zxlseek(handle, 0, SEEK_CUR)); + + /* Read in the required amount */ + +#ifdef WIN32 + { + BOOL b; + redir_Msg(">ReadFile() Handle=%lu, DMA=%lu, Len=%lu\n", handle, dma, redir_rec_len); + b = ReadFile((HANDLE)handle, dma, redir_rec_len, (unsigned long *)(&rv), NULL); + redir_Msg("WriteFile() Handle=%lu, DMA=%lu, Len=%lu\n", handle, dma, redir_rec_len); + b = WriteFile((HANDLE)handle, dma, redir_rec_len, (unsigned long *)(&rv), NULL); + redir_Msg("CreateFile([CREATE_ALWAYS]) Name='%s'\n", fname); + handle = (int)CreateFile(fname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + redir_Msg("ReadFile() Handle=%lu, DMA=%lu, Len=%lu\n", handle, dma, redir_rec_len); + b = ReadFile((HANDLE)handle, dma, redir_rec_len, (unsigned long *)(&rv), NULL); + redir_Msg("WriteFile() Handle=%lu, DMA=%lu, Len=%lu\n", handle, dma, redir_rec_len); + b = WriteFile((HANDLE)handle, dma, redir_rec_len, (unsigned long *)(&rv), NULL); + redir_Msg("WriteFile() Handle=%lu, DMA=%lu, Len=%lu\n", handle, zerorec, rl); + b = WriteFile((HANDLE)handle, zerorec, rl, (unsigned long *)(&rv), NULL); + redir_Msg("= 0) len += rv; + + if (rv < rl) + { + redir_wr32(fcb + LENGTH_OFFSET, len); + return redir_xlt_err(); + } + } + redir_wr32(fcb + LENGTH_OFFSET, offs); + + return fcb_randwr(fcb, dma); +} + +cpm_word fcb_tell(cpm_byte *fcb) +{ + int handle; + off_t rv; + + SHOWNAME("fcb_tell") + + if ((handle = redir_verify_fcb(fcb)) < 0) return 9; /* Invalid FCB */ + + rv = zxlseek(handle, 0, SEEK_CUR); + + if (rv < 0) return 0xFF; + + rv = rv >> 7; + fcb[0x21] = rv & 0xFF; + fcb[0x22] = (rv >> 8) & 0xFF; + fcb[0x23] = (rv >> 16) & 0xFF; + return 0; +} + + +cpm_word fcb_stat(cpm_byte *fcb) +{ + char fname[CPM_MAXPATH]; + struct stat st; + int rv; + + /* Don't support ambiguous filenames */ + if (redir_fcb2unix(fcb, fname)) return 0x09FF; + + rv = stat(fname, &st); + + redir_Msg("fcb_stat(\"%s\") fcb=%x\n", fname, (int)fcb); + if (rv < 0) + { + redir_Msg("ret: -1\n"); + return 0xFF; + } + + redir_wr24(fcb + 0x21, (st.st_size + 127) / 128); + + redir_Msg("ret: 0"); + return 0; +} + + +cpm_word fcb_multirec(cpm_byte rc) +{ + if (rc < 1 || rc > 128) return 0xFF; + + redir_rec_multi = rc; + redir_rec_len = 128 * rc; + redir_Msg("Set read/write to %d bytes\n", redir_rec_len); + return 0; +} + + +cpm_word fcb_date(cpm_byte *fcb) +{ + char fname[CPM_MAXPATH]; + struct stat st; + int rv; + + /* Don't support ambiguous filenames */ + if (redir_fcb2unix(fcb, fname)) return 0x09FF; + + rv = stat(fname, &st); + + redir_Msg("fcb_stat(\"%s\")\n", fname); + if (rv < 0) return 0xFF; + + redir_wr32(fcb + 0x18, redir_cpmtime(st.st_atime)); + redir_wr32(fcb + 0x1C, redir_cpmtime(st.st_ctime)); + + fcb[0x0C] = redir_cpm_pwmode(redir_drdos_get_rights(fname)); + return 0; +} + + + +cpm_word fcb_trunc(cpm_byte *fcb, cpm_byte *dma) +{ + char fname[CPM_MAXPATH]; + dword offs = redir_rd24(fcb + 0x21) * 128; + + /* Don't support ambiguous filenames */ + if (redir_fcb2unix(fcb, fname)) return 0x09FF; + + /* Software write-protection */ + if (redir_ro_fcb(fcb)) return 0x02FF; + + redir_log_fcb(fcb); +#ifdef WIN32 + (void)offs; + return 0x06FF; /* Simply not implemented */ +#else + if (truncate(fname, offs)) + { + if (redir_password_error()) + { + redir_password_append(fname, dma); + if (!truncate(fname, offs)) return 0; + } + return redir_xlt_err(); + } + return 0; +#endif +} + + +cpm_word fcb_sdate(cpm_byte *fcb, cpm_byte *dma) +{ + char fname[CPM_MAXPATH]; +#ifdef WIN32 + /* TODO: Use SetFileTime() here */ + + /* Don't support ambiguous filenames */ + if (redir_fcb2unix(fcb, fname)) return 0x09FF; + + /* Software write-protection */ + if (redir_ro_fcb(fcb)) return 0x02FF; + + redir_log_fcb(fcb); +#else + struct utimbuf buf; + + buf.actime = redir_unixtime(dma); + buf.modtime = redir_unixtime(dma + 4); + + /* Don't support ambiguous filenames */ + if (redir_fcb2unix(fcb, fname)) return 0x09FF; + + /* Software write-protection */ + if (redir_ro_fcb(fcb)) return 0x02FF; + + redir_log_fcb(fcb); + + if (utime(fname, &buf)) + { + if (redir_password_error()) + { + redir_password_append(fname, dma); + if (!utime(fname, &buf)) return 0; + } + return redir_xlt_err(); + } +#endif + return 0; +} + + + +cpm_word fcb_chmod(cpm_byte *fcb, cpm_byte *dma) +{ + char fname[CPM_MAXPATH]; + struct stat st; + int handle, wlen, omode; + long offs, newoffs; + cpm_byte zero[128]; + + /* Don't support ambiguous filenames */ + if (redir_fcb2unix(fcb, fname)) return 0x09FF; + + /* Software write-protection */ + if (redir_ro_fcb(fcb)) return 0x02FF; + + redir_log_fcb(fcb); + + if (stat(fname, &st)) return redir_xlt_err(); + +#ifdef __MSDOS__ + omode = 0; + if (fcb[9] & 0x80) omode |= 1; + if (fcb[10] & 0x80) omode |= 4; + if (!(fcb[11] & 0x80)) omode |= 0x20; + + if (_chmod(fname, 1, omode) < 0) + { + if (redir_password_error()) + { + redir_password_append(fname, dma); + if (_chmod(fname, 1, omode) >= 0) return 0; + } + return redir_xlt_err(); + } +#elif defined (WIN32) + omode = 0; + + if (fcb[9] & 0x80) omode |= FILE_ATTRIBUTE_READONLY; + if (fcb[10] & 0x80) omode |= FILE_ATTRIBUTE_SYSTEM; + if (!(fcb[11] & 0x80)) omode |= FILE_ATTRIBUTE_ARCHIVE; + + if (!omode) omode = FILE_ATTRIBUTE_NORMAL; + + SetFileAttributes(fname, omode); +#else + omode = st.st_mode; + if (fcb[9] & 0x80) /* Read-only */ + { + st.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); + } + else st.st_mode |= S_IWUSR; + + if (omode != st.st_mode) + { + if (chmod(fname, st.st_mode)) return redir_xlt_err(); + } + +#endif + + if (fcb[6] & 0x80) /* Set exact size */ + { + if (stat(fname, &st)) return redir_xlt_err(); + + handle = open(fname, O_RDWR | O_BINARY); + if (handle < 0) return redir_xlt_err(); + + newoffs = offs = ((st.st_size + 127) / 128) * 128; + if (fcb[0x20] & 0x7F) + { + newoffs -= (0x80 - (fcb[0x20] & 0x7F)); + } + if (newoffs == st.st_size) + { + ; /* Nothing to do! */ + } + else if (newoffs < st.st_size) + { +#ifndef WIN32 /* XXX Do this somehow in Win32 */ + if (ftruncate(handle, newoffs)) + { + close(handle); + return redir_xlt_err(); + } +#endif + } + else while (newoffs > st.st_size) + { + wlen = newoffs - st.st_size; + if (wlen > 0x80) wlen = 0x80; + memset(zero, 0x1A, sizeof(zero)); + if (write(handle, zero, wlen) < wlen) + { + close(handle); + return redir_xlt_err(); + } + st.st_size += wlen; + } + close(handle); + } + return 0; +} + + + + +cpm_word fcb_setpwd(cpm_byte *fcb, cpm_byte *dma) +{ +#ifdef __MSDOS__ + char fname[CPM_MAXPATH]; + cpm_word rv; + + /* Don't support ambiguous filenames */ + if (redir_fcb2unix(fcb, fname)) return 0x09FF; + + /* Software write-protection */ + if (redir_ro_fcb(fcb)) return 0x02FF; + + redir_log_fcb(fcb); + + rv = redir_drdos_put_rights(fname, dma, redir_drdos_pwmode(fcb[0x0c])); + if (rv || !(fcb[0x0c] & 1)) return rv; + return redir_drdos_put_rights(fname, dma, redir_drdos_pwmode(fcb[0x0c]) | 0x8000); +#else + return 0xFF; /* Unix doesn't do this */ +#endif +} + + +cpm_word fcb_getlbl(cpm_byte drv) +{ + redir_Msg("fcb_getlbl()\r\n"); +#ifdef __MSDOS__ + if (redir_drdos) return 0xA1; /* Supports passwords & Update stamps */ + return 0x21; /* Update stamps only */ +#else + return 0x61; /* Update & Access stamps */ +#endif +} + +cpm_word fcb_setlbl(cpm_byte *fcb, cpm_byte *dma) +{ +/* I am not letting CP/M fiddle with the host's FS settings - even if they + * could be altered, which they mostly can't. */ + + return 0x03FF; +} + + + +cpm_word fcb_defpwd(cpm_byte *pwd) +{ +#ifdef __MSDOS__ + union REGS r; + struct SREGS s; + + if (pwd[0] == 0 || pwd[0] == ' ') + { + redir_passwd[0] = 0; + } + else memcpy(redir_passwd, pwd, 8); + if (redir_drdos) + { + dosmemput(pwd, 8, __tb); + r.w.ax = 0x4454; + r.w.dx = __tb & 0x0F; + s.ds = __tb >> 4; + intdosx(&r, &r, &s); + } + +#endif + return 0; +} + + diff --git a/Tools/unix/zx/cpmredir.h b/Tools/unix/zx/cpmredir.h new file mode 100644 index 00000000..2584e239 --- /dev/null +++ b/Tools/unix/zx/cpmredir.h @@ -0,0 +1,151 @@ +/* + CPMREDIR: CP/M filesystem redirector + Copyright (C) 1998, John Elliott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This file holds the public interface to CPMREDIR. +*/ + +#ifndef CPMREDIR_H_INCLUDED + +#define CPMREDIR_H_INCLUDED 16-11-1998 + +/* The "cpm_byte" must be exactly 8 bits. + The "cpm_word" must be exactly 16 bits. */ + +typedef unsigned char cpm_byte; +typedef unsigned short cpm_word; + +/* Maximum length of a directory path */ +#ifdef _POSIX_PATH_MAX + #define CPM_MAXPATH _POSIX_PATH_MAX +#else + #ifdef _MAX_PATH + #define CPM_MAXPATH _MAX_PATH + #else + #define CPM_MAXPATH 260 + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Initialise this library. Call this function first. + * + * Returns 0 if failed to initialise. + */ +int fcb_init(void); + +/* Deinitialise the library. */ + +void fcb_deinit(void); + +/* Translate a name from the host FS to a CP/M name. This will (if necessary) + * create a mapping between a CP/M drive and a host directory path. + * + * CP/M drives A: to O: can be mapped in this way. P: is always the current + * drive. + * + */ + +void xlt_name(char *localname, char *cpmname); + +/* It is sometimes convenient to set some fixed mappings. This will create + * a mapping for a given directory. + * Pass drive = -1 for "first available", or 0-15 for A: to P: + * Returns 1 if OK, 0 if requested drive not available. + * + * NB: It is important that the localname should have a trailing + * directory separator! + */ + +int xlt_map(int drive, char *localdir); + +/* + * This revokes a mapping. No check is made whether CP/M has files open + * on the drive or not. + */ + +int xlt_umap(int drive); + +/* Find out if a drive is mapped, and if so to what directory */ + +char *xlt_getcwd(int drive); + + +/* BDOS functions. Eventually this should handle all disc-related BDOS + * functions. + * + * I am assuming that your emulator has the CP/M RAM in its normal address + * space, accessible as a range 0-64k. If this is not the case + * (eg: you are emulating banked memory, or using a segmented architecture) + * you will have to use "copy in and copy out" techniques. The "fcb" area + * must be 36 bytes long; the "dma" area should be 128 * the value set + * in fcb_multirec() [default is 1, so 128 bytes]. + * + */ + +cpm_byte fcb_reset (void); /* 0x0D */ +cpm_word fcb_drive (cpm_byte drv); /* 0x0E */ +cpm_word fcb_open (cpm_byte *fcb, cpm_byte *dma); /* 0x0F */ +cpm_word fcb_close (cpm_byte *fcb); /* 0x10 */ +cpm_word fcb_find1 (cpm_byte *fcb, cpm_byte *dma); /* 0x11 */ +cpm_word fcb_find2 (cpm_byte *fcb, cpm_byte *dma); /* 0x12 */ +cpm_word fcb_unlink(cpm_byte *fcb, cpm_byte *dma); /* 0x13 */ +cpm_word fcb_read (cpm_byte *fcb, cpm_byte *dma); /* 0x14 */ +cpm_word fcb_write (cpm_byte *fcb, cpm_byte *dma); /* 0x15 */ +cpm_word fcb_creat (cpm_byte *fcb, cpm_byte *dma); /* 0x16 */ +cpm_word fcb_rename(cpm_byte *fcb, cpm_byte *dma); /* 0x17 */ +cpm_word fcb_logvec(void); /* 0x18 */ +cpm_byte fcb_getdrv(void); /* 0x19 */ +/* DMA is a parameter to routines, not a separate call */ +cpm_word fcb_getalv(cpm_byte *alv, cpm_word max); /* 0x1B */ +/* Get alloc vector: caller must provide space and say how big it is. */ +cpm_word fcb_rodisk(void); /* 0x1C */ +cpm_word fcb_rovec (void); /* 0x1D */ +cpm_word fcb_chmod (cpm_byte *fcb, cpm_byte *dma); /* 0x1E */ +cpm_word fcb_getdpb(cpm_byte *dpb); /* 0x1F */ +cpm_byte fcb_user (cpm_byte usr); /* 0x20 */ +cpm_word fcb_randrd(cpm_byte *fcb, cpm_byte *dma); /* 0x21 */ +cpm_word fcb_randwr(cpm_byte *fcb, cpm_byte *dma); /* 0x22 */ +cpm_word fcb_stat (cpm_byte *fcb); /* 0x23 */ +cpm_word fcb_tell (cpm_byte *fcb); /* 0x24 */ +cpm_word fcb_resro (cpm_word bitmap); /* 0x25 */ +/* Access Drives and Free Drives are not supported. */ +cpm_word fcb_randwz(cpm_byte *fcb, cpm_byte *dma); /* 0x28 */ +/* Record locking calls not supported (though they could be) */ +cpm_word fcb_multirec(cpm_byte rc); /* 0x2C */ +/* Set hardware error action must be done by caller */ +cpm_word fcb_dfree (cpm_byte drive, cpm_byte *dma);/* 0x2E */ +cpm_word fcb_sync (cpm_byte flag); /* 0x30 */ +cpm_word fcb_purge (void); /* 0x62 */ +cpm_word fcb_trunc (cpm_byte *fcb, cpm_byte *dma); /* 0x63 */ +cpm_word fcb_setlbl(cpm_byte *fcb, cpm_byte *dma); /* 0x64 */ +cpm_word fcb_getlbl(cpm_byte drive); /* 0x65 */ +cpm_word fcb_date (cpm_byte *fcb); /* 0x66 */ +cpm_word fcb_setpwd(cpm_byte *fcb, cpm_byte *dma); /* 0x67 */ +cpm_word fcb_defpwd(cpm_byte *pwd); /* 0x6A */ +cpm_word fcb_sdate (cpm_byte *fcb, cpm_byte *dma); /* 0x74 */ +cpm_word fcb_parse (char *txt, cpm_byte *fcb); /* 0x98 */ + +/* fcb_parse returns length of filename parsed, 0 if EOL, 0xFFFF if error */ +#ifdef __cplusplus +} +#endif + + +#endif /* def CPMREDIR_H_INCLUDED */ diff --git a/Tools/unix/zx/dirent.c b/Tools/unix/zx/dirent.c new file mode 100644 index 00000000..87cf85a9 --- /dev/null +++ b/Tools/unix/zx/dirent.c @@ -0,0 +1,149 @@ +/* + + Implementation of POSIX directory browsing functions and types for Win32. + + Author: Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com) + History: Created March 1997. Updated June 2003 and July 2012. + Rights: See end of file. + +*/ + +#include "dirent.h" +#include +#include /* _findfirst and _findnext set errno iff they return -1 */ +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +//typedef ptrdiff_t handle_type; /* C99's intptr_t not sufficiently portable */ +typedef long handle_type; /* C99's intptr_t not sufficiently portable */ + +struct DIR +{ + handle_type handle; /* -1 for failed rewind */ + struct _finddata_t info; + struct dirent result; /* d_name null iff first time */ + char *name; /* null-terminated char string */ +}; + +DIR *opendir(const char *name) +{ + DIR *dir = 0; + + if(name && name[0]) + { + size_t base_length = strlen(name); + const char *all = /* search pattern must end with suitable wildcard */ + strchr("/\\", name[base_length - 1]) ? "*" : "/*"; + + if((dir = (DIR *) malloc(sizeof *dir)) != 0 && + (dir->name = (char *) malloc(base_length + strlen(all) + 1)) != 0) + { + strcat(strcpy(dir->name, name), all); + + if((dir->handle = + (handle_type) _findfirst(dir->name, &dir->info)) != -1) + { + dir->result.d_name = 0; + } + else /* rollback */ + { + free(dir->name); + free(dir); + dir = 0; + } + } + else /* rollback */ + { + free(dir); + dir = 0; + errno = ENOMEM; + } + } + else + { + errno = EINVAL; + } + + return dir; +} + +int closedir(DIR *dir) +{ + int result = -1; + + if(dir) + { + if(dir->handle != -1) + { + result = _findclose(dir->handle); + } + + free(dir->name); + free(dir); + } + + if(result == -1) /* map all errors to EBADF */ + { + errno = EBADF; + } + + return result; +} + +struct dirent *readdir(DIR *dir) +{ + struct dirent *result = 0; + + if(dir && dir->handle != -1) + { + if(!dir->result.d_name || _findnext(dir->handle, &dir->info) != -1) + { + result = &dir->result; + result->d_name = dir->info.name; + } + } + else + { + errno = EBADF; + } + + return result; +} + +void rewinddir(DIR *dir) +{ + if(dir && dir->handle != -1) + { + _findclose(dir->handle); + dir->handle = (handle_type) _findfirst(dir->name, &dir->info); + dir->result.d_name = 0; + } + else + { + errno = EBADF; + } +} + +#ifdef __cplusplus +} +#endif + +/* + + Copyright Kevlin Henney, 1997, 2003, 2012. All rights reserved. + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose is hereby granted without fee, provided + that this copyright and permissions notice appear in all copies and + derivatives. + + This software is supplied "as is" without express or implied warranty. + + But that said, if there are any problems please get in touch. + +*/ diff --git a/Tools/unix/zx/dirent.h b/Tools/unix/zx/dirent.h new file mode 100644 index 00000000..bbbfce52 --- /dev/null +++ b/Tools/unix/zx/dirent.h @@ -0,0 +1,50 @@ +#ifndef DIRENT_INCLUDED +#define DIRENT_INCLUDED + +/* + + Declaration of POSIX directory browsing functions and types for Win32. + + Author: Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com) + History: Created March 1997. Updated June 2003. + Rights: See end of file. + +*/ + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef struct DIR DIR; + +struct dirent +{ + char *d_name; +}; + +DIR *opendir(const char *); +int closedir(DIR *); +struct dirent *readdir(DIR *); +void rewinddir(DIR *); + +/* + + Copyright Kevlin Henney, 1997, 2003. All rights reserved. + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose is hereby granted without fee, provided + that this copyright and permissions notice appear in all copies and + derivatives. + + This software is supplied "as is" without express or implied warranty. + + But that said, if there are any problems please get in touch. + +*/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Tools/unix/zx/drdos.c b/Tools/unix/zx/drdos.c new file mode 100644 index 00000000..97bd583c --- /dev/null +++ b/Tools/unix/zx/drdos.c @@ -0,0 +1,236 @@ +/* + + CPMREDIR: CP/M filesystem redirector + Copyright (C) 1998, John Elliott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This file holds DRDOS-specific password code. +*/ + +#include "cpmint.h" + +cpm_word redir_drdos_pwmode(cpm_byte b) +{ + cpm_word mode = 0; + + if (b & 0x80) mode |= 0xddd; + if (b & 0x40) mode |= 0x555; + if (b & 0x20) mode |= 0x111; + + return mode; +} + +cpm_byte redir_cpm_pwmode(cpm_word w) +{ + cpm_byte mode = 0; + + if (w & 0x8) mode |= 0x80; + if (w & 0x4) mode |= 0x40; + if (w & 0x1) mode |= 0x20; + + return mode; +} + +#ifdef __MSDOS__ +#ifdef __GO32__ /* The GO32 extender doesn't understand DRDOS password + * functions, so these are done with __dpmi_int() rather + * than intdos() */ + +cpm_word redir_drdos_get_rights(char *path) +{ + __dpmi_regs r; + + if (!redir_drdos) return 0; + + redir_Msg("Rights for file %s: \n\r", path); + + dosmemput(path, strlen(path) + 1, __tb); + r.x.ax = 0x4302; + r.x.dx = __tb & 0x0F; + r.x.ds = (__tb) >> 4; + + __dpmi_int(0x21, &r); + + redir_Msg(" %04x \n\r", r.x.cx); + + if (r.x.flags & 1) return 0; + return r.x.cx; +} + + +cpm_word redir_drdos_put_rights(char *path, cpm_byte *dma, cpm_word rights) +{ + __dpmi_regs r; + + if (!redir_drdos) return 0; + + redir_Msg("Put rights for file %s: %04x %-8.8s %-8.8s\n\r", path, rights, dma, dma + 8); + + dosmemput(dma+8, 8, __tb); /* Point DTA at password */ + r.x.ax = 0x1A00; + r.x.dx = (__tb & 0x0F); + r.x.ds = (__tb) >> 4; + __dpmi_int(0x21, &r); + + dosmemput(path, strlen(path) + 1, __tb + 0x10); + r.x.ax = 0x4303; /* Set rights */ + r.x.cx = rights; + r.x.dx = (__tb & 0x0F) + 0x10; + r.x.ds = (__tb) >> 4; + + __dpmi_int(0x21, &r); + + if (r.x.flags & 1) + { + redir_Msg(" Try 1 failed. Error %04x\n\r", r.x.ax); + if (redir_password_error()) + { + redir_password_append(path, dma); + + dosmemput(path, strlen(path) + 1, __tb + 0x10); + r.x.ax = 0x4303; /* Set rights */ + r.x.cx = rights; + r.x.dx = (__tb & 0x0F) + 0x10; + r.x.ds = (__tb) >> 4; + + __dpmi_int(0x21, &r); + if (!r.x.flags & 1) return 0; + if (redir_password_error()) return 0x7FF; + } + return 0xFF; + } + return 0; +} + +#else /* __GO32__ */ + +cpm_word redir_drdos_get_rights(char *path) +{ + union REGS r; + struct SREGS s; + + if (!redir_drdos) return 0; + + redir_Msg("Rights for file %s: \n\r", path); + + dosmemput(path, strlen(path) + 1, __tb); + r.w.ax = 0x4302; + r.w.dx = __tb & 0x0F; + s.ds = (__tb) >> 4; + + intdosx(&r, &r, &s); + + redir_Msg(" %04x \n\r", r.w.cx); + + if (r.w.cflag) return 0; + return r.w.cx; +} + + +cpm_word redir_drdos_put_rights(char *path, cpm_byte *dma, cpm_word rights) +{ + union REGS r; + struct SREGS s; + + if (!redir_drdos) return 0; + + redir_Msg("Put rights for file %s: %04x\n\r", path, rights); + + dosmemput(dma, 8, __tb); /* Point DTA at password */ + r.w.ax = 0x1A00; + r.w.dx = (__tb & 0x0F); + s.ds = (__tb) >> 4; + intdosx(&r, &r, &s); + + dosmemput(path, strlen(path) + 1, __tb + 0x10); + r.w.ax = 0x4303; /* Set rights */ + r.w.cx = rights; + r.w.dx = (__tb & 0x0F) + 0x10; + s.ds = (__tb) >> 4; + + intdosx(&r, &r, &s); + + if (r.w.cflag) + { + redir_Msg(" Try 1 failed. Error %04x \n\r", r.w.ax); + if (redir_password_error()) + { + redir_password_append(path, dma); + + dosmemput(path, strlen(path) + 1, __tb + 0x10); + r.w.ax = 0x4303; /* Set rights */ + r.w.cx = rights; + r.w.dx = (__tb & 0x0F) + 0x10; + s.ds = (__tb) >> 4; + + intdosx(&r, &r, &s); + if (!r.w.cflag) return 0; + } + return 0xFF; + } + return 0; +} + +#endif /* __GO32__ */ + + +cpm_word redir_password_error(void) +{ + union REGS r; + + if (!redir_drdos) return 0; + + r.w.ax = 0x5900; + r.w.bx = 0x0000; + + intdos(&r, &r); + + redir_Msg("Last error was: %04x\r\n", r.w.ax); + + if (r.w.ax == 0x56) return 1; /* Bad password */ + return 0; +} + + +void redir_password_append(char *s, cpm_byte *dma) +{ + int n, m; + + if (!redir_drdos) return; + + if (dma[0] == 0 || dma[0] == 0x20) return; + + strcat(s, ";"); + m = strlen(s); + + for (n = 0; n < 8; n++) + { + if (dma[n] == ' ') s[m] = 0; + else s[m] = dma[n]; + ++m; + } + s[m] = 0; + +} +#else /* __MSDOS__ */ +void redir_password_append(char *s, cpm_byte *dma) {} +cpm_word redir_password_error(void) { return 0; } +cpm_word redir_drdos_put_rights(char *path, cpm_byte *dma, cpm_word rights) +{ return 0; } +cpm_word redir_drdos_get_rights(char *path) { return 0; } +#endif /* __MSDOS__ */ + + diff --git a/Tools/unix/zx/edops.h b/Tools/unix/zx/edops.h new file mode 100644 index 00000000..6b04c96a --- /dev/null +++ b/Tools/unix/zx/edops.h @@ -0,0 +1,567 @@ +/* Emulations of the ED operations of the Z80 instruction set. + * Copyright (C) 1994 Ian Collier. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define input(var) { unsigned short u;\ + var=u=in(tstates,b,c);\ + tstates+=u>>8;\ + f=(f&1)|(var&0xa8)|((!var)<<6)|parity(var);\ + } +#define sbchl(x) { unsigned short z=(x);\ + unsigned long t=(hl-z-cy)&0x1ffff;\ + f=((t>>8)&0xa8)|(t>>16)|2|\ + (((hl&0xfff)<(z&0xfff)+cy)<<4)|\ + (((hl^z)&(hl^t)&0x8000)>>13)|\ + ((!(t&0xffff))<<6)|2;\ + l=t;\ + h=t>>8;\ + } + +#define adchl(x) { unsigned short z=(x);\ + unsigned long t=hl+z+cy;\ + f=((t>>8)&0xa8)|(t>>16)|\ + (((hl&0xfff)+(z&0xfff)+cy>0xfff)<<4)|\ + (((~hl^z)&(hl^t)&0x8000)>>13)|\ + ((!(t&0xffff))<<6)/*|2*/;\ + l=t;\ + h=t>>8;\ + } +/* [JCE] The "|2" should not be there, at least according to my tests on + * a PCW16. The PCW16's ADC always resets that bit. */ + + +#define neg (a=-a,\ + f=(a&0xa8)|((!a)<<6)|(((a&15)>0)<<4)|((a==128)<<2)|2|(a>0)) + +{ + unsigned char op=fetch(pc); + pc++; + radjust++; + switch(op){ +instr(0x40,8); + input(b); +endinstr; + +instr(0x41,8); + tstates+=out(tstates,b,c,b); +endinstr; + +instr(0x42,11); + sbchl(bc); +endinstr; + +instr(0x43,16); + {unsigned short addr=fetch2(pc); + pc+=2; + store2b(addr,b,c); + } +endinstr; + +instr(0x44,4); + neg; +endinstr; + +instr(0x45,4); + iff1=iff2; + ret; +endinstr; + +instr(0x46,4); + im=0; +endinstr; + +instr(0x47,5); + i=a; +endinstr; + +instr(0x48,8); + input(c); +endinstr; + +instr(0x49,8); + tstates+=out(tstates,b,c,c); +endinstr; + +instr(0x4a,11); + adchl(bc); +endinstr; + +instr(0x4b,16); + {unsigned short addr=fetch2(pc); + pc+=2; + c=fetch(addr); + b=fetch(addr+1); + } +endinstr; + +instr(0x4c,4); + neg; +endinstr; + +instr(0x4d,4); + ret; +endinstr; + +instr(0x4e,4); + im=1; +endinstr; + +instr(0x4f,5); + r=a; + radjust=r; +endinstr; + +instr(0x50,8); + input(d); +endinstr; + +instr(0x51,8); + tstates+=out(tstates,b,c,d); +endinstr; + +instr(0x52,11); + sbchl(de); +endinstr; + +instr(0x53,16); + {unsigned short addr=fetch2(pc); + pc+=2; + store2b(addr,d,e); + } +endinstr; + +instr(0x54,4); + neg; +endinstr; + +instr(0x55,4); + ret; +endinstr; + +instr(0x56,4); + im=2; +endinstr; + +instr(0x57,5); + a=i; + f=(f&1)|(a&0xa8)|((!a)<<6)|(iff2<<2); +endinstr; + +instr(0x58,8); + input(e); +endinstr; + +instr(0x59,8); + tstates+=out(tstates,b,c,e); +endinstr; + +instr(0x5a,11); + adchl(de); +endinstr; + +instr(0x5b,16); + {unsigned short addr=fetch2(pc); + pc+=2; + e=fetch(addr); + d=fetch(addr+1); + } +endinstr; + +instr(0x5c,4); + neg; +endinstr; + +instr(0x5d,4); + ret; +endinstr; + +instr(0x5e,4); + im=3; +endinstr; + +instr(0x5f,5); + r=(r&0x80)|(radjust&0x7f); + a=r; + f=(f&1)|(a&0xa8)|((!a)<<6)|(iff2<<2); +endinstr; + +instr(0x60,8); + input(h); +endinstr; + +instr(0x61,8); + tstates+=out(tstates,b,c,h); +endinstr; + +instr(0x62,11); + sbchl(hl); +endinstr; + +instr(0x63,16); + {unsigned short addr=fetch2(pc); + pc+=2; + store2b(addr,h,l); + } +endinstr; + +instr(0x64,4); + neg; +endinstr; + +instr(0x65,4); + ret; +endinstr; + +instr(0x66,4); + im=0; +endinstr; + +instr(0x67,14); + {unsigned char t=fetch(hl); + unsigned char u=(a<<4)|(t>>4); + a=(a&0xf0)|(t&0x0f); + store(hl,u); + f=(f&1)|(a&0xa8)|((!a)<<6)|parity(a); + } +endinstr; + +instr(0x68,8); + input(l); +endinstr; + +instr(0x69,8); + tstates+=out(tstates,b,c,l); +endinstr; + +instr(0x6a,11); + adchl(hl); +endinstr; + +instr(0x6b,16); + {unsigned short addr=fetch2(pc); + pc+=2; + l=fetch(addr); + h=fetch(addr+1); + } +endinstr; + +instr(0x6c,4); + neg; +endinstr; + +instr(0x6d,4); + ret; +endinstr; + +instr(0x6e,4); + im=1; +endinstr; + +instr(0x6f,5); + {unsigned char t=fetch(hl); + unsigned char u=(a&0x0f)|(t<<4); + a=(a&0xf0)|(t>>4); + store(hl,u); + f=(f&1)|(a&0xa8)|((!a)<<6)|parity(a); + } +endinstr; + +instr(0x70,8); + {unsigned char x;input(x);} +endinstr; + +instr(0x71,8); + tstates+=out(tstates,b,c,0); +endinstr; + +instr(0x72,11); + sbchl(sp); +endinstr; + +instr(0x73,16); + {unsigned short addr=fetch2(pc); + pc+=2; + store2(addr,sp); + } +endinstr; + +instr(0x74,4); + neg; +endinstr; + +instr(0x75,4); + ret; +endinstr; + +instr(0x76,4); + im=2; +endinstr; + +instr(0x78,8); + input(a); +endinstr; + +instr(0x79,8); + tstates+=out(tstates,b,c,a); +endinstr; + +instr(0x7a,11); + adchl(sp); +endinstr; + +instr(0x7b,16); + {unsigned short addr=fetch2(pc); + pc+=2; + sp=fetch2(addr); + } +endinstr; + +instr(0x7c,4); + neg; +endinstr; + +instr(0x7d,4); + ret; +endinstr; + +instr(0x7e,4); + im=3; +endinstr; + +instr(0xa0,12); + {unsigned char x=fetch(hl); + store(de,x); + if(!++l)h++; + if(!++e)d++; + if(!c--)b--; + f=(f&0xc1)|(x&0x28)|(((b|c)>0)<<2); + } +endinstr; + +instr(0xa1,12); + {unsigned char carry=cy; + cpa(fetch(hl)); + if(!++l)h++; + if(!c--)b--; + f=(f&0xfa)|carry|(((b|c)>0)<<2); + } +endinstr; + +instr(0xa2,12); + {unsigned short t=in(tstates,b,c); + store(hl,t); + tstates+=t>>8; + if(!++l)h++; + b--; + f=(b&0xa8)|((b==0)<<6)|2|((parity(b)^c)&4); + } +endinstr; + +instr(0xa3,12); /* I can't determine the correct flags outcome for the + block OUT instructions. Spec says that the carry + flag is left unchanged and N is set to 1, but that + doesn't seem to be the case... */ + {unsigned char x=fetch(hl); + tstates+=out(tstates,b,c,x); + if(!++l)h++; + b--; + f=(f&1)|0x12|(b&0xa8)|((b==0)<<6); + } +endinstr; + +instr(0xa8,12); + {unsigned char x=fetch(hl); + store(de,x); + if(!l--)h--; + if(!e--)d--; + if(!c--)b--; + f=(f&0xc1)|(x&0x28)|(((b|c)>0)<<2); + } +endinstr; + +instr(0xa9,12); + {unsigned char carry=cy; + cpa(fetch(hl)); + if(!l--)h--; + if(!c--)b--; + f=(f&0xfa)|carry|(((b|c)>0)<<2); + } +endinstr; + +instr(0xaa,12); + {unsigned short t=in(tstates,b,c); + store(hl,t); + tstates+=t>>8; + if(!l--)h--; + b--; + f=(b&0xa8)|((b==0)<<6)|2|((parity(b)^c^4)&4); + } +endinstr; + +instr(0xab,12); + {unsigned char x=fetch(hl); + tstates+=out(tstates,b,c,x); + if(!l--)h--; + b--; + f=(f&1)|0x12|(b&0xa8)|((b==0)<<6); + } +endinstr; + +/* Note: the Z80 implements "*R" as "*" followed by JR -2. No reason + to change this... */ + +instr(0xb0,12); + {unsigned char x=fetch(hl); + store(de,x); + if(!++l)h++; + if(!++e)d++; + if(!c--)b--; + f=(f&0xc1)|(x&0x28)|(((b|c)>0)<<2); + if(b|c)pc-=2,tstates+=5; + } +endinstr; + +instr(0xb1,12); + {unsigned char carry=cy; + cpa(fetch(hl)); + if(!++l)h++; + if(!c--)b--; + f=(f&0xfa)|carry|(((b|c)>0)<<2); + if((f&0x44)==4)pc-=2,tstates+=5; + } +endinstr; + +instr(0xb2,12); + {unsigned short t=in(tstates,b,c); + store(hl,t); + tstates+=t>>8; + if(!++l)h++; + b--; + f=(b&0xa8)|((b==0)<<6)|2|((parity(b)^c)&4); + if(b)pc-=2,tstates+=5; + } +endinstr; + +instr(0xb3,12); + {unsigned char x=fetch(hl); + tstates+=out(tstates,b,c,x); + if(!++l)h++; + b--; + f=(f&1)|0x12|(b&0xa8)|((b==0)<<6); + if(b)pc-=2,tstates+=5; + } +endinstr; + +instr(0xb8,12); + {unsigned char x=fetch(hl); + store(de,x); + if(!l--)h--; + if(!e--)d--; + if(!c--)b--; + f=(f&0xc1)|(x&0x28)|(((b|c)>0)<<2); + if(b|c)pc-=2,tstates+=5; + } +endinstr; + +instr(0xb9,12); + {unsigned char carry=cy; + cpa(fetch(hl)); + if(!l--)h--; + if(!c--)b--; + f=(f&0xfa)|carry|(((b|c)>0)<<2); + if((f&0x44)==4)pc-=2,tstates+=5; + } +endinstr; + +instr(0xba,12); + {unsigned short t=in(tstates,b,c); + store(hl,t); + tstates+=t>>8; + if(!l--)h--; + b--; + f=(b&0xa8)|((b==0)<<6)|2|((parity(b)^c^4)&4); + if(b)pc-=2,tstates+=5; + } +endinstr; + +instr(0xbb,12); + {unsigned char x=fetch(hl); + tstates+=out(tstates,b,c,x); + if(!l--)h--; + b--; + f=(f&1)|0x12|(b&0xa8)|((b==0)<<6); + if(b)pc-=2,tstates+=5; + } +endinstr; + +/* XZ80 Pseudo-ops +instr(0xfb,4); + multiloader(hl,a); +endinstr; + +instr(0xfc,4); + { int ans; + stopwatch(); + ans=loader(pc,ix,de,a,cy); + if(ans>=0){ + if(ans==1)pc=0x0806; + else if(ans==2)f&=254; + else f|=1; + ix+=de; + d=e=0; + if(ans!=1)ret; + } + startwatch(1); + } +endinstr; + +instr(0xfd,4); + { int ans; + stopwatch(); + ans=saver(pc,ix,de,a); + if(ans>0)pc=0x0806; + else if(ans==0){ + ix+=de; + d=e=0; + ret; + } + startwatch(1); + } +endinstr; +*/ + +/* ZXCC pseudo-op */ +instr(0xfe, 4); +{ + /* Create copies of the registers here so we can take their addresses + * and not lose register optimisation in the rest of the CPU code */ + byte xa,xb,xc,xd,xe,xf,xxh,xxl; + word xp,xx,xy; + + xa = a; xb = b; xc = c; xd = d; xe = e; xf = f; xxh = h; xxl = l; + xp = pc; xx = ix; xy = iy; + + ed_fe(&xa,&xb,&xc,&xd,&xe,&xf,&xxh,&xxl,&xp,&xx,&xy); + + a = xa; b = xb; c = xc; d = xd; e = xe; f = xf; h = xxh; l = xxl; + pc = xp; ix = xx; iy = xy; +} +endinstr; + +default: tstates+=4; + +}} diff --git a/Tools/unix/zx/readme.txt b/Tools/unix/zx/readme.txt new file mode 100644 index 00000000..31c3e320 --- /dev/null +++ b/Tools/unix/zx/readme.txt @@ -0,0 +1,47 @@ +ZX Command + +An adaptation of zxcc-0.5.6 by Wayne Warthen + +This directory contains the source files used to build the "zx" tool. This tool +is essentially just John Elliott's zxcc package version zxcc-0.5.6 modified to +build for Windows and simplified down to just a single command (zx) +which is essentially just the zxcc command. + +Please see http://www.seasip.info/Unix/Zxcc/ for more information on zxcc. + +To build under Open Watcom or Microsoft Visual C++, use the following command: + + cl /Fe"zx.exe" zx.c cpmdrv.c cpmglob.c cpmparse.c cpmredir.c drdos.c util.c xlt.c zxbdos.c zxcbdos.c zxdbdos.c z80.c dirent.c + +To build a debug version, use the following command: + + cl /DDEBUG /Fe"zxdbg.exe" zx.c cpmdrv.c cpmglob.c cpmparse.c cpmredir.c drdos.c util.c xlt.c zxbdos.c zxcbdos.c zxdbdos.c z80.c dirent.c + +WARNING: There seems to be a rare scenario that breaks zx under the Open Watcom build. CP/M allows a file to be accessed +under multiple FCB's without an error. Open Watcom will see this as an error. At present, the only tool I know of that does +this is M80. + +December 5, 2014 + +After struggling to get the entire zxcc package to build nicely using autoconf, +I finally gave up and took a much more direct approach. I have extracted just +the source files needed and created a simple batch file to build the tool. I +realize this could be done much better, but I cheated in the interest of time. + +The one "real" change I made in the source code was that I modified the tool +to look for bios.bin in the same directory as the executable is in. This +just makes it much easier to set up (for me, anyway). + +The GPL status of everything remains in place and carries forward. + +Wayne Warthen +wwarthen@gmail.com + +March 15, 2017 + +- Updated to compile under Open Watcom. +- Implemented BDOS console status function. +- Set stdin and stdout to binary mode at startup. + +Wayne Warthen +wwarthen@gmail.com \ No newline at end of file diff --git a/Tools/unix/zx/util.c b/Tools/unix/zx/util.c new file mode 100644 index 00000000..21d29728 --- /dev/null +++ b/Tools/unix/zx/util.c @@ -0,0 +1,378 @@ +/* + + CPMREDIR: CP/M filesystem redirector + Copyright (C) 1998, John Elliott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This file holds miscellaneous utility functions. +*/ + +#include "cpmint.h" +#include + +/* In debug mode, lseek()s can be traced. */ + +#ifdef DEBUG + +long zxlseek(int fd, long offset, int wh) +{ +#ifdef WIN32 + long v; + redir_Msg(">SetFilePointer() Handle=%lu, Offset=%lu, Method=%lu\n", fd, offset, wh); + v = SetFilePointer((HANDLE)fd, offset, NULL, wh); + redir_Msg("= 0) return v; + + redir_Msg("lseek fails with errno = %d\n", errno); + if (errno == EBADF) redir_Msg(" (bad file descriptor %d)\n", fd); + if (errno == ESPIPE) redir_Msg(" (file %d is a pipe)\n", fd); + if (errno == EINVAL) redir_Msg(" (bad parameter %d)\n", wh); + + return -1; +#endif +} + +void redir_showfcb(cpm_byte *fd) +{ + int n; + + for (n = 0; n < 32; n++) + { + if (!n || n>= 12) printf("%02x ", fd[n]); + else printf("%c", fd[n] & 0x7F); + } + printf("\r\n"); +} + +#else + +long zxlseek(int fd, long offset, int wh) +{ +#ifdef WIN32 + return SetFilePointer((HANDLE)fd, offset, NULL, wh); +#else + return lseek(fd, offset, wh); +#endif +} + + +#endif + +/* Get the "sequential access" file pointer out of an FCB */ + +long redir_get_fcb_pos(cpm_byte *fcb) +{ + long npos; + + npos = 524288L * fcb[0x0E]; /* S2 */ + npos += 16384L * fcb[0x0C]; /* Extent */ + npos += 128L * fcb[0x20]; /* Record */ + + return npos; +} + +void redir_put_fcb_pos(cpm_byte *fcb, long npos) +{ + fcb[0x20] = (npos / 128) % 128; + fcb[0x0C] = (npos / 16384) % 32; + fcb[0x0E] = (npos / 524288L) % 64; +} + + +/* + * find a filename that works. + * note that this is where we handle the case sensitivity/non-case sensitivity + * horror. + * the name that is passed in should be in lower case. + * we'll modify it to the first one that matches + */ +void +swizzle(char *fullpath) +{ + struct stat ss; + char *slash; + DIR *dirp; + struct dirent *dentry; + + /* short circuit if ok */ + if (stat(fullpath, &ss) == 0) { + return; + } + + slash = rindex(fullpath, '/'); + if (!slash) { + return; + } + *slash = '\0'; + dirp = opendir(fullpath); + *slash = '/'; + while ((dentry = readdir(dirp)) != NULL) { + if (strcasecmp(dentry->d_name, slash + 1) == 0) { + strcpy(slash + 1, dentry->d_name); + break; + } + } + closedir(dirp); +} + +/* + * Passed a CP/M FCB, convert it to a unix filename. Turn its drive back into + * a path. + */ + +int redir_fcb2unix(cpm_byte *fcb, char *fname) +{ + int n, q, drv, ddrv; + char s[2]; + + s[1] = 0; + q = 0; + drv = fcb[0] & 0x7F; + if (drv == '?') drv = 0; + + ddrv = fcb[0] & 0x7F; + if (ddrv < 0x1F) ddrv += '@'; + + redir_Msg("%c:%-8.8s.%-3.3s\n", + ddrv, + fcb + 1, + fcb + 9); + + if (!drv) strcpy(fname, redir_drive_prefix[redir_cpmdrive]); + else strcpy(fname, redir_drive_prefix[drv - 1]); + + for (n = 1; n < 12; n++) + { + s[0] = (fcb[n] & 0x7F); + if (s[0] == '?') q = 1; + if (isupper(s[0])) s[0] = tolower(s[0]); + if (s[0] != ' ') + { + if (n == 9) strcat(fname, "."); + strcat(fname, s); + } + } + return q; +} + +#ifndef EROFS /* Open fails because of read-only FS */ +#define EROFS EACCES +#endif + +int redir_ofile(cpm_byte *fcb, char *s) +{ + int h, rv; + + /* Software write-protection */ +#ifdef WIN32 + redir_Msg(">CreateFile([OPEN_EXISTING]) Name='%s'\n", s); + h = (int)CreateFile(s, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + redir_Msg("= 0 || (errno != EACCES && errno != EROFS)) return h; + } + redir_Msg("**2**"); + h = open(s, O_RDONLY | O_BINARY); + if (h < 0) return -1; + fcb[9] |= 0x80; + #endif +#endif + + return h; +} + + +/* Extract a file handle from where it was stored in an FCB by fcb_open() + or fcb_creat(). Aborts if the FCB has been tampered with. + + Note: Some programs (like GENCOM) close FCBs they never opened. This causes + the Corrupt FCB message, but no harm seems to ensue. */ + +int redir_verify_fcb(cpm_byte *fcb) +{ + if (fcb[16] != 0xFD || fcb[17] != 0x00) + { + fprintf(stderr,"cpmredir: Corrupt FCB\n"); + return -1; + } + return (int)(redir_rd32(fcb + 18)); + +} + +/* Print a trace message */ + +#ifdef DEBUG + +void redir_Msg(char *s, ...) +{ + va_list ap; + + va_start(ap, s); + printf("cpmredir trace: "); + vprintf(s, ap); + va_end(ap); + fflush(stdout); +} + +#endif + +#define BCD(x) (((x % 10)+16*(x/10)) & 0xFF) + +/* Convert time_t to CP/M day count/hours/minutes */ +dword redir_cpmtime(time_t t) +{ + long d = (t / 86400) - 2921; /* CP/M day 0 is unix day 2921 */ + long h = (t % 86400) / 3600; /* Hour, 0-23 */ + long m = (t % 3600) / 60; /* Minute, 0-59 */ + + return (d | (BCD(h) << 16) | (BCD(m) << 24)); +} + +#undef BCD + +#define UNBCD(x) (((x % 16) + 10 * (x / 16)) & 0xFF) + +time_t redir_unixtime(cpm_byte *c) +{ + time_t t; + cpm_word days; + + days = (c[0] + 256 * c[1]) + 2921; + + t = 60L * UNBCD(c[3]); + t += 3600L * UNBCD(c[2]); + t += 86400L * days; + + return t; +} + +#undef UNBCD + + +/* Functions to access 24-bit & 32-bit words in memory. These are always + little-endian. */ + +void redir_wr24(cpm_byte *addr, dword v) +{ + addr[0] = v & 0xFF; + addr[1] = (v >> 8) & 0xFF; + addr[2] = (v >> 16) & 0xFF; +} + +void redir_wr32(cpm_byte *addr, dword v) +{ + addr[0] = v & 0xFF; + addr[1] = (v >> 8) & 0xFF; + addr[2] = (v >> 16) & 0xFF; + addr[3] = (v >> 24) & 0xFF; +} + +dword redir_rd24(cpm_byte *addr) +{ + register dword rv = addr[2]; + + rv = (rv << 8) | addr[1]; + rv = (rv << 8) | addr[0]; + return rv; +} + + +dword redir_rd32(cpm_byte *addr) +{ + register dword rv = addr[3]; + + rv = (rv << 8) | addr[2]; + rv = (rv << 8) | addr[1]; + rv = (rv << 8) | addr[0]; + return rv; +} + + +void redir_log_drv(cpm_byte drv) +{ + if (!drv) redir_l_drives |= 1; + else redir_l_drives |= (1L << drv); +} + +void redir_log_fcb(cpm_byte *fcb) +{ + int drv = fcb[0] & 0x7F; + + if (drv && drv != '?') redir_log_drv(drv - 1); + else redir_log_drv(redir_cpmdrive); +} + + +int redir_ro_drv(cpm_byte drv) +{ + if (!drv) return redir_ro_drives & 1; + else return redir_ro_drives & (1L << drv); +} + +int redir_ro_fcb(cpm_byte *fcb) +{ + int drv = fcb[0] & 0x7F; + + if (drv && drv != '?') return redir_ro_drv(drv - 1); + else return redir_ro_drv(redir_cpmdrive); +} + + + +cpm_word redir_xlt_err(void) +{ + if (redir_password_error()) return 0x7FF; /* DRDOS pwd error */ + switch(errno) + { + case EISDIR: + case EBADF: return 9; /* Bad FCB */ + case EINVAL: return 0x03FF; /* Readonly file */ + case EPIPE: return 0x01FF; /* Broken pipe */ + case ENOSPC: return 1; /* No space */ + default: return 0xFF; /* Software error */ + } +} + diff --git a/Tools/unix/zx/xlt.c b/Tools/unix/zx/xlt.c new file mode 100644 index 00000000..f0ba1da5 --- /dev/null +++ b/Tools/unix/zx/xlt.c @@ -0,0 +1,191 @@ +/* + + CPMREDIR: CP/M filesystem redirector + Copyright (C) 1998, John Elliott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + This file holds functions dealing with name translation; also the + initialisation code. +*/ + +#include "cpmint.h" + +/* Detect DRDOS */ + +#ifdef __MSDOS__ +static void drdos_init(void) +{ + +/* The DJGPP DOS extender won't detect DRDOS using intdos(), so we have + to use __dpmi_int() instead. */ + +#ifdef __GO32__ + __dpmi_regs ir; + + ir.x.ax = 0x4452; /* "DR" */ + + __dpmi_int(0x21, &ir); + if (ir.x.flags & 1) return; /* Not DRDOS */ + + redir_Msg("DRDOS detected.\r\n"); + + redir_drdos = 1; + +#else /* __GO32__ */ + + union REGS ir, or; + + ir.w.ax = 0x4452; /* "DR" */ + + intdos(&ir, &or); + if (or.w.cflag) return; /* Not DRDOS */ + + redir_Msg("DRDOS detected.\r\n"); + + redir_drdos = 1; +#endif /* __GO32__ */ +} +#endif /* __MSDOS__ */ + + + +int fcb_init(void) +{ + int n; + + /* A: to O: free */ + for (n = 0; n < 15; n++) redir_drive_prefix[n][0] = 0; + + strcpy(redir_drive_prefix[15], "./"); /* P: is current directory */ + + /* Log on to P:. It is the only drive at this point which we + * know works. */ + redir_cpmdrive = 15; +#ifdef __MSDOS__ + drdos_init(); +#endif + + return 1; +} + +/* Deinitialise the library. */ + +void fcb_deinit(void) +{ + /* Nothing */ +} + +/* Translate a name from the host FS to a CP/M name. This will (if necessary) + * create a mapping between a CP/M drive and a host directory path. + * + * CP/M drives A: to O: can be mapped in this way. P: is always the current + * drive. + * + */ + +void xlt_name(char *localname, char *cpmname) +{ + char ibuf[CPM_MAXPATH + 1]; + char nbuf[CPM_MAXPATH + 1]; + char *pname; + int n; + + sprintf(ibuf, "%-.*s", CPM_MAXPATH, localname); + pname = strrchr(ibuf, '/'); +#ifdef __MSDOS__ + if (!pname) pname = strrchr(ibuf,'\\'); + if (!pname) pname = strrchr(ibuf,':'); +#endif + if (!pname) /* No path separators in the name. It is therefore a + local filename, so map it to drive P: */ + { + strcpy(cpmname, "p:"); + strcat(cpmname, ibuf); + return; + } + ++pname; + strcpy(nbuf, pname); /* nbuf holds filename component */ + *pname = 0; /* ibuf holds path component */ + + /* See if the path is one of those already mapped to drives */ + + for (n = 0; n < 15; n++) + { + if (redir_drive_prefix[n][0] && !strcmp(ibuf, redir_drive_prefix[n])) + { + sprintf(cpmname,"%c:%s", n + 'a', nbuf); + return; + } + } + + /* It is not, see if another drive can be allocated */ + + for (n = 0; n < 15; n++) if (!redir_drive_prefix[n][0]) + { + strcpy(redir_drive_prefix[n], ibuf); + sprintf(cpmname,"%c:%s", n + 'a', nbuf); + return; + } + + /* No other drive can be allocated */ + + strcpy(cpmname,"p:"); + strcat(cpmname, nbuf); +} + +/* It is sometimes convenient to set some fixed mappings. This will create + * a mapping for a given directory. + * Pass drive = -1 for "first available", or 0-15 for A: to P: + */ + +int xlt_map(int drive, char *localdir) +{ + int n; + + if (drive == -1) + { + for (n = 0; n < 15; n++) if (!redir_drive_prefix[n][0]) + { + drive = n; + break; + } + if (drive == -1) return 0; /* No space for mappings */ + } + if (redir_drive_prefix[drive][0]) return 0; /* Drive taken */ + + sprintf(redir_drive_prefix[drive], "%-.*s", CPM_MAXPATH, localdir); + return 1; +} + + +/* Unmap a drive + */ + +int xlt_umap(int drive) +{ + if (!redir_drive_prefix[drive][0]) return 0; /* Drive not taken */ + redir_drive_prefix[drive][0] = 0; + return 1; +} + + +char *xlt_getcwd(int drive) +{ + if (drive < 0 || drive > 16) return ""; + + return redir_drive_prefix[drive]; +} + diff --git a/Tools/unix/zx/z80.c b/Tools/unix/zx/z80.c new file mode 100644 index 00000000..d1d99cd5 --- /dev/null +++ b/Tools/unix/zx/z80.c @@ -0,0 +1,270 @@ +/* Emulation of the Z80 CPU with hooks into the other parts of xz80. + * Copyright (C) 1994 Ian Collier. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include "zx.h" + +#define parity(a) (partable[a]) + +unsigned char partable[256]={ + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4 + }; + +#ifdef DEBUG +static unsigned short breakpoint=0; +static unsigned int breaks=0; + +//static void inline log(fp,name,val) +static void log(fp,name,val) +FILE *fp; +char *name; +unsigned short val; +{ + int i; + fprintf(fp,"%s=%04X ",name,val); + for(i=0;i<8;i++,val++)fprintf(fp," %02X",fetch(val)); + putc('\n',fp); +} +#endif + +void mainloop(word spc, word ssp){ + register unsigned char a, f, b, c, d, e, h, l; + unsigned char r, a1, f1, b1, c1, d1, e1, h1, l1, i, iff1, iff2, im; + register unsigned short pc; + unsigned short ix, iy, sp; + register unsigned long tstates; + register unsigned int radjust; + register unsigned char ixoriy, new_ixoriy; + unsigned char intsample; + register unsigned char op; +#ifdef DEBUG + char flags[9]; + int bit; + FILE *fp=0; + register unsigned short af2=0,bc2=0,de2=0,hl2=0,ix2=0,iy2=0,sp2=0; + register unsigned char i2=0; + //unsigned char *memory=memptr[0]; + struct _next {unsigned char bytes[8];} *next; + unsigned short BC, DE, HL, AF; + + fputs("Press F11 to log\n",stderr); +#endif + a=f=b=c=d=e=h=l=a1=f1=b1=c1=d1=e1=h1=l1=i=r=iff1=iff2=im=0; + ixoriy=new_ixoriy=0; + ix=iy=0; + pc=spc; + sp=ssp; + tstates=radjust=0; + while(1){ + ixoriy=new_ixoriy; + new_ixoriy=0; +#ifdef DEBUG + next=(struct _next *)&fetch(pc); + BC=bc;DE=de;HL=hl;AF=(a<<8)|f; + if(fp && !ixoriy){ + log(fp,"pc",pc); + if(sp!=sp2)log(fp,"sp",sp2=sp); + if(iy!=iy2)log(fp,"iy",iy2=iy); + if(ix!=ix2)log(fp,"ix",ix2=ix); + if(hl!=hl2)log(fp,"hl",hl2=hl); + if(de!=de2)log(fp,"de",de2=de); + if(bc!=bc2)log(fp,"bc",bc2=bc); + if(((a<<8)|f)!=af2){ + af2=(a<<8)|f; + strcpy(flags,"SZ H VNC"); + for(bit=0;bit<8;bit++)if(!(f&(1<<(7-bit))))flags[bit]=' '; + fprintf(fp,"af=%04X %s\n",af2,flags); + } + if(i!=i2)fprintf(fp,"ir=%02X%02X\n",i2=i,r); + putc('\n',fp); + } + if(pc==breakpoint && pc) + breaks++; /* some code at which to set a breakpoint */ + a=AF>>8; f=AF; h=HL>>8; l=HL; d=DE>>8; e=DE; b=BC>>8; c=BC; +#endif +/* +{ + static int tr = 0; + static int id = 0; +// static byte b = 0; +// + if (pc == 0x1177) tr = 1; + if (pc == 0x1185) tr = 0; + if (tr >= 1) ++id; + if (tr >= 1) printf("%d: PC=%04x %02x AF=%02x:%02x BC=%04x DE=%04x HL=%04x IX=%04x IY=%04x\r\n", + id, pc, fetch(pc), a,f, bc, de, hl, ix, iy); +} +*/ + intsample=1; + op=fetch(pc); + pc++; + radjust++; + switch(op){ +#include "z80ops.h" + } +/*** + * ZXCC doesn't do interrupts at all, so all this is commented out + if(tstates>=int_cycles && intsample){ + tstates-=int_cycles; + frames++; + // Carry out X-related tasks (including waiting for timer + // signal if necessary) + switch(interrupt()){ + case Z80_quit: +#ifdef DEBUG + if(fp)fclose(fp); +#endif + return; + case Z80_NMI: + if(fetch(pc)==0x76)pc++; + iff2=iff1; + iff1=0; + // The Z80 performs a machine fetch cycle for 5 Tstates + // but ignores the result. It takes a further 10 Tstates + // to jump to the NMI routine at 0x66. + tstates+=15; + push2(pc); + pc=0x66; + break; + case Z80_reset: + a=f=b=c=d=e=h=l=a1=f1=b1=c1=d1=e1= + h1=l1=i=r=iff1=iff2=im=0; + ix=iy=sp=pc=0; + radjust=0; + break; +#ifdef DEBUG + case Z80_log: + if(fp){ + fclose(fp); + fp=0; + fputs("Logging turned off\n",stderr); + } else { + fp=fopen(config.log,"a"); + if(fp)fprintf(stderr,"Logging to file %s\n",config.log); + else perror(config.log); + } + break; +#endif + + case Z80_load: + stopwatch(); + if(snapload()){ + a=snapa; + f=snapf; + b=snapb; + c=snapc; + d=snapd; + e=snape; + h=snaph; + l=snapl; + a1=snapa1; + f1=snapf1; + b1=snapb1; + c1=snapc1; + d1=snapd1; + e1=snape1; + h1=snaph1; + l1=snapl1; + iff1=snapiff1; + iff2=snapiff2; + i=snapi; + r=snapr; + radjust=r; + im=snapim; + ix=snapix; + iy=snapiy; + sp=snapsp; + pc=snappc; + } + startwatch(1); + break; + case Z80_save: + r=(r&0x80)|(radjust&0x7f); + snapa=a; + snapf=f; + snapb=b; + snapc=c; + snapd=d; + snape=e; + snaph=h; + snapl=l; + snapa1=a1; + snapf1=f1; + snapb1=b1; + snapc1=c1; + snapd1=d1; + snape1=e1; + snaph1=h1; + snapl1=l1; + snapiff1=iff1; + snapiff2=iff2; + snapi=i; + snapr=r; + snapim=im; + snapix=ix; + snapiy=iy; + snapsp=sp; + snappc=pc; + snapsave(); + startwatch(1); + break; + + } + if(iff1){ +#ifdef DEBUG + if(fp)fprintf(fp,"Interrupt (im=%d)\n\n",im); +#endif + if(fetch(pc)==0x76)pc++; + iff1=iff2=0; + tstates+=5; // accompanied by an input from the data bus // + switch(im){ + case 0: // IM 0 // + case 1: // undocumented // + case 2: // IM 1 // + // there is little to distinguish between these cases // + tstates+=8; + push2(pc); + pc=0x38; + break; + case 3: // IM 2 // + tstates+=14; + { + int addr=fetch2((i<<8)|0xff); + push2(pc); + pc=addr; + } + } + } + }*/ + } +} diff --git a/Tools/unix/zx/z80.h b/Tools/unix/zx/z80.h new file mode 100644 index 00000000..89e12a84 --- /dev/null +++ b/Tools/unix/zx/z80.h @@ -0,0 +1,86 @@ +/* Miscellaneous definitions for xz80, copyright (C) 1994 Ian Collier. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* [John Elliott, 15 July 2001] + * Copied this file into ZXCC, a CP/M emulator. + * Since ZXCC's memory is a flat 64k space and will never be bank-switched, + * the bank-switching code is removed. + * Since ZXCC has no memory-mapped screen, all the screen management code + * goes as well. + * Since ZXCC doesn't need its speed regulated, all the speed regulation + * code goes as well. + * Since ZXCC doesn't save or load snapshots... OK, you get the idea. + */ + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#define Z80_quit 1 +#define Z80_NMI 2 +#define Z80_reset 3 +#define Z80_load 4 +#define Z80_save 5 +#define Z80_log 6 + +unsigned int in(); +unsigned int out(); +//int interrupt(); +int snapload(); +void snapsave(); +void mainloop(word xpc, word xsp); +void eachframe(); +void itimeron(); +void itimeroff(); +void startwatch(); +unsigned long stopwatch(); +void requester(); +int loader(); +int saver(); +void multiloader(); +void usage(); +void version(); +void drawborder(); + +#define fetch(x) (RAM[x]) +#define fetch2(x) ((fetch((x)+1)<<8)|fetch(x)) + +#define store(x,y) do { RAM[(x)] = (y); } while(0) + +#define store2b(x,hi,lo) do {\ + RAM[(x)]=(lo); \ + RAM[((x+1) & 0xFFFF)]=(hi); } while(0) + +#define store2(x,y) store2b(x,(y)>>8,y) + +#ifdef __GNUC__ +static void inline storefunc(unsigned short ad,unsigned char b){ + store(ad,b); +} +#undef store +#define store(x,y) storefunc(x,y) + +static void inline store2func(unsigned short ad,unsigned char b1,unsigned char b2){ + store2b(ad,b1,b2); +} +#undef store2b +#define store2b(x,hi,lo) store2func(x,hi,lo) +#endif + +#define bc ((b<<8)|c) +#define de ((d<<8)|e) +#define hl ((h<<8)|l) diff --git a/Tools/unix/zx/z80ops.h b/Tools/unix/zx/z80ops.h new file mode 100644 index 00000000..a9687741 --- /dev/null +++ b/Tools/unix/zx/z80ops.h @@ -0,0 +1,1304 @@ +/* Emulations of the Z80 CPU instruction set - part of xz80. + * Copyright (C) 1994 Ian Collier. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define instr(opcode,cycles) case opcode: {tstates+=cycles +#define HLinstr(opcode,cycles,morecycles) \ + case opcode: {unsigned short addr; \ + tstates+=cycles; \ + if(ixoriy==0)addr=hl; \ + else tstates+=morecycles, \ + addr=(ixoriy==1?ix:iy)+ \ + (signed char)fetch(pc),\ + pc++ +#define endinstr }; break + +#define cy (f&1) + +#define xh (ixoriy==0?h:ixoriy==1?(ix>>8):(iy>>8)) +#define xl (ixoriy==0?l:ixoriy==1?(ix&0xff):(iy&0xff)) + +#define setxh(x) (ixoriy==0?(h=(x)):ixoriy==1?(ix=(ix&0xff)|((x)<<8)):\ + (iy=(iy&0xff)|((x)<<8))) +#define setxl(x) (ixoriy==0?(l=(x)):ixoriy==1?(ix=(ix&0xff00)|(x)):\ + (iy=(iy&0xff00)|(x))) + +#define inc(var) /* 8-bit increment */ ( var++,\ + f=(f&1)|(var&0xa8)|\ + ((!(var&15))<<4)|((!var)<<6)|\ + ((var==128)<<2)\ + ) +#define dec(var) /* 8-bit decrement */ ( f=(f&1)|((!(var&15))<<4)|2,\ + --var,\ + f|=(var&0xa8)|((var==127)<<2)|\ + ((!var)<<6)\ + ) +#define swap(x,y) {unsigned char t=x; x=y; y=t;} +#define addhl(hi,lo) /* 16-bit add */ if(!ixoriy){\ + unsigned short t;\ + l=t=l+(lo);\ + f=(f&0xc4)|(((t>>=8)+(h&0x0f)+((hi)&0x0f)>15)<<4);\ + h=t+=h+(hi);\ + f|=(h&0x28)|(t>>8);\ + }\ + else do{unsigned long t=(ixoriy==1?ix:iy);\ + f=(f&0xc4)|(((t&0xfff)+((hi<<8)|lo)>0xfff)<<4);\ + t+=(hi<<8)|lo;\ + if(ixoriy==1)ix=t; else iy=t;\ + f|=((t>>8)&0x28)|(t>>16);\ + } while(0) +#define adda(x,c) /* 8-bit add */ do{unsigned short y;\ + unsigned char z=(x);\ + y=a+z+(c);\ + f=(y&0xa8)|(y>>8)|(((a&0x0f)+(z&0x0f)+(c)>15)<<4)|\ + (((~a^z)&0x80&(y^a))>>5);\ + f|=(!(a=y))<<6;\ + } while(0) +#define suba(x,c) /* 8-bit subtract */ do{unsigned short y;\ + unsigned char z=(x);\ + y=(a-z-(c))&0x1ff;\ + f=(y&0xa8)|(y>>8)|(((a&0x0f)<(z&0x0f)+(c))<<4)|\ + (((a^z)&0x80&(y^a))>>5)|2;\ + f|=(!(a=y))<<6;\ + } while(0) +#define cpa(x) /* 8-bit compare */ do{unsigned short y;\ + unsigned char z=(x);\ + y=(a-z)&0x1ff;\ + f=(y&0xa8)|(y>>8)|(((a&0x0f)<(z&0x0f))<<4)|\ + (((a^z)&0x80&(y^a))>>5)|2|((!y)<<6);\ + } while(0) +#define anda(x) /* logical and */ do{\ + a&=(x);\ + f=(a&0xa8)|((!a)<<6)|0x10|parity(a);\ + } while(0) +#define xora(x) /* logical xor */ do{\ + a^=(x);\ + f=(a&0xa8)|((!a)<<6)|parity(a);\ + } while(0) +#define ora(x) /* logical or */ do{\ + a|=(x);\ + f=(a&0xa8)|((!a)<<6)|parity(a);\ + } while(0) + +#define jr /* execute relative jump */ do{int j=(signed char)fetch(pc);\ + pc+=j+1;\ + tstates+=5;\ + } while(0) +#define jp /* execute jump */ (pc=fetch2(pc)) +#define call /* execute call */ do{\ + tstates+=7;\ + push2(pc+2);\ + jp;\ + } while(0) +#define ret /* execute return */ do{\ + tstates+=6;\ + pop2(pc);\ + } while(0) +#define pop2(var) /* pop 16-bit register */ (var=fetch2(sp),sp+=2) +#define pop1(v1,v2) /* pop register pair */ (v2=fetch(sp),\ + v1=fetch(sp+1),sp+=2) +#define push2(val) /* push 16-bit register */ do{sp-=2;store2(sp,(val));}\ + while(0) +#define push1(v1,v2) /* push register pair */ do{sp-=2;\ + store2b(sp,v1,v2);\ + }while(0) + +instr(0,4); + /* nop */ +endinstr; + +instr(1,10); + c=fetch(pc),pc++; + b=fetch(pc),pc++; +endinstr; + +instr(2,7); + store(bc,a); +endinstr; + +instr(3,6); + if(!++c)b++; +endinstr; + +instr(4,4); + inc(b); +endinstr; + +instr(5,4); + dec(b); +endinstr; + +instr(6,7); + b=fetch(pc),pc++; +endinstr; + +instr(7,4); + a=(a<<1)|(a>>7); + f=(f&0xc4)|(a&0x29); +endinstr; + +instr(8,4); + swap(a,a1); + swap(f,f1); +endinstr; + +instr(9,11); + addhl(b,c); +endinstr; + +instr(10,7); + a=fetch(bc); +endinstr; + +instr(11,6); + if(!c--)b--; +endinstr; + +instr(12,4); + inc(c); +endinstr; + +instr(13,4); + dec(c); +endinstr; + +instr(14,7); + c=fetch(pc),pc++; +endinstr; + +instr(15,4); + f=(f&0xc4)|(a&1); + a=(a>>1)|(a<<7); + f|=a&0x28; +endinstr; + +instr(16,8); + if(!--b)pc++; + else jr; +endinstr; + +instr(17,10); + e=fetch(pc),pc++; + d=fetch(pc),pc++; +endinstr; + +instr(18,7); + store(de,a); +endinstr; + +instr(19,6); + if(!++e)d++; +endinstr; + +instr(20,4); + inc(d); +endinstr; + +instr(21,4); + dec(d); +endinstr; + +instr(22,7); + d=fetch(pc),pc++; +endinstr; + +instr(23,4); + {int t=a>>7; + a=(a<<1)|(f&1); + f=(f&0xc4)|(a&0x28)|t; + } +endinstr; + +instr(24,7); + jr; +endinstr; + +instr(25,11); + addhl(d,e); +endinstr; + +instr(26,7); + a=fetch(de); +endinstr; + +instr(27,6); + if(!e--)d--; +endinstr; + +instr(28,4); + inc(e); +endinstr; + +instr(29,4); + dec(e); +endinstr; + +instr(30,7); + e=fetch(pc),pc++; +endinstr; + +instr(31,4); + {int t=a&1; + a=(a>>1)|(f<<7); + f=(f&0xc4)|(a&0x28)|t; + } +endinstr; + +instr(32,7); + if(f&0x40)pc++; + else jr; +endinstr; + +instr(33,10); + if(!ixoriy){ + l=fetch(pc),pc++; + h=fetch(pc),pc++; + } + else { + if(ixoriy==1)ix=fetch2(pc); + else iy=fetch2(pc); + pc+=2; + } +endinstr; + +instr(34,16); + {unsigned short addr=fetch2(pc); + pc+=2; + if(!ixoriy)store2b(addr,h,l); + else if(ixoriy==1)store2(addr,ix); + else store2(addr,iy); + } +endinstr; + +instr(35,6); + if(!ixoriy){if(!++l)h++;} + else if(ixoriy==1)ix++; + else iy++; +endinstr; + +instr(36,4); + if(ixoriy==0)inc(h); + else{unsigned char t; + t=(ixoriy==1?ix:iy)>>8; + inc(t); + if(ixoriy==1)ix=(ix&0xff)|(t<<8); + else iy=(iy&0xff)|(t<<8); + } +endinstr; + +instr(37,4); + if(ixoriy==0)dec(h); + else{unsigned char t; + t=(ixoriy==1?ix:iy)>>8; + dec(t); + if(ixoriy==1)ix=(ix&0xff)|(t<<8); + else iy=(iy&0xff)|(t<<8); + } +endinstr; + +instr(38,7); + setxh(fetch(pc)); + pc++; +endinstr; + +instr(39,4); + { + unsigned char incr=0, carry=cy; + if((f&0x10) || (a&0x0f)>9) incr=6; + if((f&1) || (a>>4)>9) incr|=0x60; + if(f&2)suba(incr,0); + else { + if(a>0x90 && (a&15)>9)incr|=0x60; + adda(incr,0); + } + f=((f|carry)&0xfb)|parity(a); + } +endinstr; + +instr(40,7); + if(f&0x40)jr; + else pc++; +endinstr; + +instr(41,11); + if(!ixoriy)addhl(h,l); + else if(ixoriy==1)addhl((ix>>8),(ix&0xff)); + else addhl((iy>>8),(iy&0xff)); +endinstr; + +instr(42,16); + {unsigned short addr=fetch2(pc); + pc+=2; + if(!ixoriy){ + l=fetch(addr); + h=fetch(addr+1); + } + else if(ixoriy==1)ix=fetch2(addr); + else iy=fetch2(addr); + } +endinstr; + +instr(43,6); + if(!ixoriy){if(!l--)h--;} + else if(ixoriy==1)ix--; + else iy--; +endinstr; + +instr(44,4); + if(!ixoriy)inc(l); + else {unsigned char t; + t=(ixoriy==1?ix:iy); + inc(t); + if(ixoriy==1)ix=(ix&0xff00)|t; + else iy=(iy&0xff00)|t; + } +endinstr; + +instr(45,4); + if(!ixoriy)dec(l); + else {unsigned char t; + t=(ixoriy==1?ix:iy); + dec(t); + if(ixoriy==1)ix=(ix&0xff00)|t; + else iy=(iy&0xff00)|t; + } +endinstr; + +instr(46,7); + setxl(fetch(pc)); + pc++; +endinstr; + +instr(47,4); + a=~a; + f=(f&0xc5)|(a&0x28)|0x12; +endinstr; + +instr(48,7); + if(f&1)pc++; + else jr; +endinstr; + +instr(49,10); + sp=fetch2(pc); + pc+=2; +endinstr; + +instr(50,13); + {unsigned short addr=fetch2(pc); + pc+=2; + store(addr,a); + } +endinstr; + +instr(51,6); + sp++; +endinstr; + +HLinstr(52,11,8); + {unsigned char t=fetch(addr); + inc(t); + store(addr,t); + } +endinstr; + +HLinstr(53,11,8); + {unsigned char t=fetch(addr); + dec(t); + store(addr,t); + } +endinstr; + +HLinstr(54,10,5); + store(addr,fetch(pc)); + pc++; +endinstr; + +instr(55,4); + f=(f&0xc4)|1|(a&0x28); +endinstr; + +instr(56,7); + if(f&1)jr; + else pc++; +endinstr; + +instr(57,11); + addhl((sp>>8),(sp&0xff)); +endinstr; + +instr(58,13); + {unsigned short addr=fetch2(pc); + pc+=2; + a=fetch(addr); + } +endinstr; + +instr(59,6); + sp--; +endinstr; + +instr(60,4); + inc(a); +endinstr; + +instr(61,4); + dec(a); +endinstr; + +instr(62,7); + a=fetch(pc),pc++; +endinstr; + +instr(63,4); + f=(f&0xc4)|(cy^1)|(cy<<4)|(a&0x28); +endinstr; + +instr(0x40,4); + /* ld b,b */ +endinstr; + +instr(0x41,4); + b=c; +endinstr; + +instr(0x42,4); + b=d; +endinstr; + +instr(0x43,4); + b=e; +endinstr; + +instr(0x44,4); + b=xh; +endinstr; + +instr(0x45,4); + b=xl; +endinstr; + +HLinstr(0x46,7,8); + b=fetch(addr); +endinstr; + +instr(0x47,4); + b=a; +endinstr; + +instr(0x48,4); + c=b; +endinstr; + +instr(0x49,4); + /* ld c,c */ +endinstr; + +instr(0x4a,4); + c=d; +endinstr; + +instr(0x4b,4); + c=e; +endinstr; + +instr(0x4c,4); + c=xh; +endinstr; + +instr(0x4d,4); + c=xl; +endinstr; + +HLinstr(0x4e,7,8); + c=fetch(addr); +endinstr; + +instr(0x4f,4); + c=a; +endinstr; + +instr(0x50,4); + d=b; +endinstr; + +instr(0x51,4); + d=c; +endinstr; + +instr(0x52,4); + /* ld d,d */ +endinstr; + +instr(0x53,4); + d=e; +endinstr; + +instr(0x54,4); + d=xh; +endinstr; + +instr(0x55,4); + d=xl; +endinstr; + +HLinstr(0x56,7,8); + d=fetch(addr); +endinstr; + +instr(0x57,4); + d=a; +endinstr; + +instr(0x58,4); + e=b; +endinstr; + +instr(0x59,4); + e=c; +endinstr; + +instr(0x5a,4); + e=d; +endinstr; + +instr(0x5b,4); + /* ld e,e */ +endinstr; + +instr(0x5c,4); + e=xh; +endinstr; + +instr(0x5d,4); + e=xl; +endinstr; + +HLinstr(0x5e,7,8); + e=fetch(addr); +endinstr; + +instr(0x5f,4); + e=a; +endinstr; + +instr(0x60,4); + setxh(b); +endinstr; + +instr(0x61,4); + setxh(c); +endinstr; + +instr(0x62,4); + setxh(d); +endinstr; + +instr(0x63,4); + setxh(e); +endinstr; + +instr(0x64,4); + /* ld h,h */ +endinstr; + +instr(0x65,4); + setxh(xl); +endinstr; + +HLinstr(0x66,7,8); + h=fetch(addr); +endinstr; + +instr(0x67,4); + setxh(a); +endinstr; + +instr(0x68,4); + setxl(b); +endinstr; + +instr(0x69,4); + setxl(c); +endinstr; + +instr(0x6a,4); + setxl(d); +endinstr; + +instr(0x6b,4); + setxl(e); +endinstr; + +instr(0x6c,4); + setxl(xh); +endinstr; + +instr(0x6d,4); + /* ld l,l */ +endinstr; + +HLinstr(0x6e,7,8); + l=fetch(addr); +endinstr; + +instr(0x6f,4); + setxl(a); +endinstr; + +HLinstr(0x70,7,8); + store(addr,b); +endinstr; + +HLinstr(0x71,7,8); + store(addr,c); +endinstr; + +HLinstr(0x72,7,8); + store(addr,d); +endinstr; + +HLinstr(0x73,7,8); + store(addr,e); +endinstr; + +HLinstr(0x74,7,8); + store(addr,h); +endinstr; + +HLinstr(0x75,7,8); + store(addr,l); +endinstr; + +instr(0x76,4); + /* Was HALT - ZXCC ignores HALT */ +endinstr; + +HLinstr(0x77,7,8); + store(addr,a); +endinstr; + +instr(0x78,4); + a=b; +endinstr; + +instr(0x79,4); + a=c; +endinstr; + +instr(0x7a,4); + a=d; +endinstr; + +instr(0x7b,4); + a=e; +endinstr; + +instr(0x7c,4); + a=xh; +endinstr; + +instr(0x7d,4); + a=xl; +endinstr; + +HLinstr(0x7e,7,8); + a=fetch(addr); +endinstr; + +instr(0x7f,4); + /* ld a,a */ +endinstr; + +instr(0x80,4); + adda(b,0); +endinstr; + +instr(0x81,4); + adda(c,0); +endinstr; + +instr(0x82,4); + adda(d,0); +endinstr; + +instr(0x83,4); + adda(e,0); +endinstr; + +instr(0x84,4); + adda(xh,0); +endinstr; + +instr(0x85,4); + adda(xl,0); +endinstr; + +HLinstr(0x86,7,8); + adda(fetch(addr),0); +endinstr; + +instr(0x87,4); + adda(a,0); +endinstr; + +instr(0x88,4); + adda(b,cy); +endinstr; + +instr(0x89,4); + adda(c,cy); +endinstr; + +instr(0x8a,4); + adda(d,cy); +endinstr; + +instr(0x8b,4); + adda(e,cy); +endinstr; + +instr(0x8c,4); + adda(xh,cy); +endinstr; + +instr(0x8d,4); + adda(xl,cy); +endinstr; + +HLinstr(0x8e,7,8); + adda(fetch(addr),cy); +endinstr; + +instr(0x8f,4); + adda(a,cy); +endinstr; + +instr(0x90,4); + suba(b,0); +endinstr; + +instr(0x91,4); + suba(c,0); +endinstr; + +instr(0x92,4); + suba(d,0); +endinstr; + +instr(0x93,4); + suba(e,0); +endinstr; + +instr(0x94,4); + suba(xh,0); +endinstr; + +instr(0x95,4); + suba(xl,0); +endinstr; + +HLinstr(0x96,7,8); + suba(fetch(addr),0); +endinstr; + +instr(0x97,4); + suba(a,0); +endinstr; + +instr(0x98,4); + suba(b,cy); +endinstr; + +instr(0x99,4); + suba(c,cy); +endinstr; + +instr(0x9a,4); + suba(d,cy); +endinstr; + +instr(0x9b,4); + suba(e,cy); +endinstr; + +instr(0x9c,4); + suba(xh,cy); +endinstr; + +instr(0x9d,4); + suba(xl,cy); +endinstr; + +HLinstr(0x9e,7,8); + suba(fetch(addr),cy); +endinstr; + +instr(0x9f,4); + suba(a,cy); +endinstr; + +instr(0xa0,4); + anda(b); +endinstr; + +instr(0xa1,4); + anda(c); +endinstr; + +instr(0xa2,4); + anda(d); +endinstr; + +instr(0xa3,4); + anda(e); +endinstr; + +instr(0xa4,4); + anda(xh); +endinstr; + +instr(0xa5,4); + anda(xl); +endinstr; + +HLinstr(0xa6,7,8); + anda(fetch(addr)); +endinstr; + +instr(0xa7,4); + anda(a); +endinstr; + +instr(0xa8,4); + xora(b); +endinstr; + +instr(0xa9,4); + xora(c); +endinstr; + +instr(0xaa,4); + xora(d); +endinstr; + +instr(0xab,4); + xora(e); +endinstr; + +instr(0xac,4); + xora(xh); +endinstr; + +instr(0xad,4); + xora(xl); +endinstr; + +HLinstr(0xae,7,8); + xora(fetch(addr)); +endinstr; + +instr(0xaf,4); + xora(a); +endinstr; + +instr(0xb0,4); + ora(b); +endinstr; + +instr(0xb1,4); + ora(c); +endinstr; + +instr(0xb2,4); + ora(d); +endinstr; + +instr(0xb3,4); + ora(e); +endinstr; + +instr(0xb4,4); + ora(xh); +endinstr; + +instr(0xb5,4); + ora(xl); +endinstr; + +HLinstr(0xb6,7,8); + ora(fetch(addr)); +endinstr; + +instr(0xb7,4); + ora(a); +endinstr; + +instr(0xb8,4); + cpa(b); +endinstr; + +instr(0xb9,4); + cpa(c); +endinstr; + +instr(0xba,4); + cpa(d); +endinstr; + +instr(0xbb,4); + cpa(e); +endinstr; + +instr(0xbc,4); + cpa(xh); +endinstr; + +instr(0xbd,4); + cpa(xl); +endinstr; + +HLinstr(0xbe,7,8); + cpa(fetch(addr)); +endinstr; + +instr(0xbf,4); + cpa(a); +endinstr; + +instr(0xc0,5); + if(!(f&0x40))ret; +endinstr; + +instr(0xc1,10); + pop1(b,c); +endinstr; + +instr(0xc2,10); + if(!(f&0x40))jp; + else pc+=2; +endinstr; + +instr(0xc3,10); + jp; +endinstr; + +instr(0xc4,10); + if(!(f&0x40))call; + else pc+=2; +endinstr; + +instr(0xc5,11); + push1(b,c); +endinstr; + +instr(0xc6,7); + adda(fetch(pc),0); + pc++; +endinstr; + +instr(0xc7,11); + push2(pc); + pc=0; +endinstr; + +instr(0xc8,5); + if(f&0x40)ret; +endinstr; + +instr(0xc9,4); + ret; +endinstr; + +instr(0xca,10); + if(f&0x40)jp; + else pc+=2; +endinstr; + +instr(0xcb,4); +#include "cbops.h" +endinstr; + +instr(0xcc,10); + if(f&0x40)call; + else pc+=2; +endinstr; + +instr(0xcd,10); + call; +endinstr; + +instr(0xce,7); + adda(fetch(pc),cy); + pc++; +endinstr; + +instr(0xcf,11); + push2(pc); + pc=8; +endinstr; + +instr(0xd0,5); + if(!cy)ret; +endinstr; + +instr(0xd1,10); + pop1(d,e); +endinstr; + +instr(0xd2,10); + if(!cy)jp; + else pc+=2; +endinstr; + +instr(0xd3,11); + tstates+=out(tstates,a,fetch(pc),a); + pc++; +endinstr; + +instr(0xd4,10); + if(!cy)call; + else pc+=2; +endinstr; + +instr(0xd5,11); + push1(d,e); +endinstr; + +instr(0xd6,7); + suba(fetch(pc),0); + pc++; +endinstr; + +instr(0xd7,11); + push2(pc); + pc=16; +endinstr; + +instr(0xd8,5); + if(cy)ret; +endinstr; + +instr(0xd9,4); + swap(b,b1); + swap(c,c1); + swap(d,d1); + swap(e,e1); + swap(h,h1); + swap(l,l1); +endinstr; + +instr(0xda,10); + if(cy)jp; + else pc+=2; +endinstr; + +instr(0xdb,11); + {unsigned short t; + a=t=in(tstates,a,fetch(pc)); + tstates+=t>>8; + pc++; + } +endinstr; + +instr(0xdc,10); + if(cy)call; + else pc+=2; +endinstr; + +instr(0xdd,4); + new_ixoriy=1; + intsample=0; +endinstr; + +instr(0xde,7); + suba(fetch(pc),cy); + pc++; +endinstr; + +instr(0xdf,11); + push2(pc); + pc=24; +endinstr; + +instr(0xe0,5); + if(!(f&4))ret; +endinstr; + +instr(0xe1,10); + if(!ixoriy)pop1(h,l); + else if(ixoriy==1)pop2(ix); + else pop2(iy); +endinstr; + +instr(0xe2,10); + if(!(f&4))jp; + else pc+=2; +endinstr; + +instr(0xe3,19); + if(!ixoriy){ + unsigned short t=fetch2(sp); + store2b(sp,h,l); + l=t; + h=t>>8; + } + else if(ixoriy==1){ + unsigned short t=fetch2(sp); + store2(sp,ix); + ix=t; + } + else{ + unsigned short t=fetch2(sp); + store2(sp,iy); + iy=t; + } +endinstr; + +instr(0xe4,10); + if(!(f&4))call; + else pc+=2; +endinstr; + +instr(0xe5,11); + if(!ixoriy)push1(h,l); + else if(ixoriy==1)push2(ix); + else push2(iy); +endinstr; + +instr(0xe6,7); + anda(fetch(pc)); + pc++; +endinstr; + +instr(0xe7,11); + push2(pc); + pc=32; +endinstr; + +instr(0xe8,5); + if(f&4)ret; +endinstr; + +instr(0xe9,4); + pc=!ixoriy?hl:ixoriy==1?ix:iy; +endinstr; + +instr(0xea,10); + if(f&4)jp; + else pc+=2; +endinstr; + +instr(0xeb,4); + swap(h,d); + swap(e,l); +endinstr; + +instr(0xec,10); + if(f&4)call; + else pc+=2; +endinstr; + +instr(0xed,4); +#include"edops.h" +endinstr; + +instr(0xee,7); + xora(fetch(pc)); + pc++; +endinstr; + +instr(0xef,11); + push2(pc); + pc=40; +endinstr; + +instr(0xf0,5); + if(!(f&0x80))ret; +endinstr; + +instr(0xf1,10); + pop1(a,f); +endinstr; + +instr(0xf2,10); + if(!(f&0x80))jp; + else pc+=2; +endinstr; + +instr(0xf3,4); + iff1=iff2=0; + intsample=0; +endinstr; + +instr(0xf4,10); + if(!(f&0x80))call; + else pc+=2; +endinstr; + +instr(0xf5,11); + push1(a,f); +endinstr; + +instr(0xf6,7); + ora(fetch(pc)); + pc++; +endinstr; + +instr(0xf7,11); + push2(pc); + pc=48; +endinstr; + +instr(0xf8,5); + if(f&0x80)ret; +endinstr; + +instr(0xf9,6); + sp=!ixoriy?hl:ixoriy==1?ix:iy; +endinstr; + +instr(0xfa,10); + if(f&0x80)jp; + else pc+=2; +endinstr; + +instr(0xfb,4); + iff1=iff2=1; + intsample=0; +endinstr; + +instr(0xfc,10); + if(f&0x80)call; + else pc+=2; +endinstr; + +instr(0xfd,4); + new_ixoriy=2; + intsample=0; +endinstr; + +instr(0xfe,7); + cpa(fetch(pc)); + pc++; +endinstr; + +instr(0xff,11); + push2(pc); + pc=56; +endinstr; + diff --git a/Tools/unix/zx/zx.c b/Tools/unix/zx/zx.c new file mode 100644 index 00000000..0ea315d0 --- /dev/null +++ b/Tools/unix/zx/zx.c @@ -0,0 +1,437 @@ +#include "zx.h" + +#ifdef WIN32 +#include "windows.h" +#endif + +/* Global variables */ + +char *progname; +char **argv; +int argc; + +byte cpm_drive; +char *mypath; + +byte cpm_user; +extern byte cpm_error; + +byte RAM[65536]; /* The Z80's address space */ + +void load_comfile(void); /* Forward declaration */ + +static int deinit_term, deinit_gsx; + +void dump_regs(FILE *fp, byte a, byte b, byte c, byte d, byte e, byte f, + byte h, byte l, word pc, word ix, word iy) +{ + fprintf(fp, "\tAF=%02x%02x BC=%02x%02x DE=%02x%02x HL=%02x%02x\n" + "\tIX=%04x IY=%04x PC=%04x\n", + a,f,b,c,d,e,h,l,pc,ix,iy); +} + + + +char *parse_to_fcb(char *s, int afcb) +{ + byte *fcb = &RAM[afcb+1]; + + RAM[afcb] = 0; + memset(fcb, ' ', 11); + + while (1) + { + if (s[0] == 0) break; + if (s[0] == ' ') {++s; continue; } + if (s[1] == ':') + { + RAM[afcb] = s[0] - '@'; + if (RAM[afcb] > 16) RAM[afcb] -= 0x20; + s+=2; + continue; + } + if (s[0] == '.') + { + ++s; + fcb = &RAM[afcb+9]; + continue; + } + *fcb = *s; if (islower(*fcb)) *fcb = toupper(*fcb); + ++s; + ++fcb; + if (fcb >= &RAM[afcb+12]) break; + } + return s; +} + + +void Msg(char *s, ...) +{ +#ifdef DEBUG + va_list ap; + + va_start(ap, s); + printf("%s trace: ", progname); + vprintf(s, ap); + fflush(stdout); + if (s[strlen(s) - 1] == '\n') putchar('\r'); + va_end(ap); +#endif +} + + +void ed_fe(byte *a, byte *b, byte *c, byte *d, byte *e, byte *f, + byte *h, byte *l, word *pc, word *ix, word *iy) +{ + switch(*a) + { + case 0xC0: + cpmbdos(a,b,c,d,e,f,h,l,pc,ix,iy); + break; + + case 0xC1: + load_comfile(); + break; + + case 0xC2: + fprintf(stderr,"%s: Incompatible BIOS.BIN\n", progname); + zx_term(); + zx_exit(1); + + case 0xC3: + cpmbios(a,b,c,d,e,f,h,l,pc,ix,iy); + break; + + default: + fprintf(stderr, "%s: Z80 encountered invalid trap\n", progname); + dump_regs(stderr,*a,*b,*c,*d,*e,*f,*h,*l,*pc,*ix,*iy); + zx_term(); + zx_exit(1); + + } +} + + +/* + * load_bios() loads the minimal CP/M BIOS and BDOS. + * + */ + +void load_bios(void) +{ + int bios_len; + + FILE * fp = NULL; + char biospath[CPM_MAXPATH + 1] = ""; + +#ifdef WIN32 + if (!fp) + { + GetModuleFileName(NULL, biospath, sizeof(biospath)); + strcpy(strrchr(biospath, '\\'), "\\bios.bin"); + fp = fopen(biospath, "rb"); + } +#else + if (!fp) { + strcpy(biospath, mypath); + strcpy(strrchr(biospath, '/'), "/bios.bin"); + fp = fopen(biospath, "rb"); + } +#endif + + if (!fp && BINDIR80) + { + strcpy(biospath, BINDIR80); + strcat(biospath, "bios.bin"); + fp = fopen(biospath, "rb"); + } + + if (!fp) fp = fopen("bios.bin", "rb"); + + if (!fp) + { + fprintf(stderr,"%s: Cannot locate bios.bin\n", progname); + zx_term(); + zx_exit(1); + } + bios_len = fread(RAM + 0xFE00, 1, 512, fp); + if (bios_len < 1 || ferror(fp)) + { + fclose(fp); + fprintf(stderr,"%s: Cannot load bios.bin\n", progname); + zx_term(); + zx_exit(1); + } + fclose(fp); + + Msg("Loaded %d bytes of BIOS\n", bios_len); +} + +/* + * try_com() attempts to open file, file.com, file.COM, file.cpm and file.CPM + * + */ + +FILE *try_com(char *s) +{ + char fname[CPM_MAXPATH + 1]; + FILE *fp; + + strcpy(fname, s); + fp = fopen(s, "rb"); if (fp) return fp; + sprintf(s,"%s.com", fname); fp = fopen(s, "rb"); if (fp) return fp; + sprintf(s,"%s.COM", fname); fp = fopen(s, "rb"); if (fp) return fp; + sprintf(s,"%s.cpm", fname); fp = fopen(s, "rb"); if (fp) return fp; + sprintf(s,"%s.CPM", fname); fp = fopen(s, "rb"); if (fp) return fp; + + strcpy(s, fname); + return NULL; +} + +/* + * load_comfile() loads the COM file whose name was passed as a parameter. + * + */ + + +void load_comfile(void) +{ + int com_len; + char fname[CPM_MAXPATH + 1] = ""; + FILE *fp; + + if (BINDIR80) strcpy(fname, BINDIR80); + strcat(fname, argv[1]); + fp = try_com(fname); + if (!fp) + { + strcpy(fname, argv[1]); + fp = try_com(fname); + } + if (!fp) + { + fprintf(stderr,"%s: Cannot locate %s, %s.com, %s.COM, %s.cpm _or_ %s.CPM\r\n", + progname, argv[1], argv[1], argv[1], argv[1], argv[1]); + zx_term(); + zx_exit(1); + } + com_len = fread(RAM + 0x0100, 1, 0xFD00, fp); + if (com_len < 1 || ferror(fp)) + { + fclose(fp); + fprintf(stderr,"%s: Cannot load %s\n", progname, fname); + zx_term(); + zx_exit(1); + } + fclose(fp); + + Msg("Loaded %d bytes from %s\n", com_len, fname); +} + +unsigned int in() { return 0; } +unsigned int out() { return 0; } + + + +/* + * xltname: Convert a unix filepath into a CP/M compatible drive:name form. + * The unix filename must be 8.3 or the CP/M code will reject it. + * + * This uses the library xlt_name to do the work, and then just strcat()s + * the result to the command line. + */ + +void zx_xltname(char *name, char *pcmd) +{ + char nbuf[CPM_MAXPATH + 1]; + + xlt_name(pcmd, nbuf); + + strcat(name, nbuf); +} + +/* main() parses the arguments to CP/M form. argv[1] is the name of the CP/M + program to load; the remaining arguments are arguments for the CP/M program. + + main() also loads the vestigial CP/M BIOS and does some sanity checks + on the endianness of the host CPU and the sizes of data types. + */ + +int main(int ac, char **av) +{ + int n; + char *pCmd, *str; + + argc = ac; + argv = av; +#ifdef __PACIFIC__ /* Pacific C doesn't support argv[0] */ + progname="ZX"; +#endif + progname = argv[0]; + mypath = strdup(argv[0]); + + /* DJGPP includes the whole path in the program name, which looks + * untidy... + */ + str = strrchr(progname, '/'); + if (!str) str = strrchr(progname, '\\'); + if (str) progname = str + 1; + + if (_isatty(_fileno(stdin))) + Msg("Using interactive console mode\n"); + else + Msg("Using standard input/ouput mode\n"); + + if (sizeof(int) > 8 || sizeof(byte) != 1 || sizeof(word) != 2) + { + fprintf(stderr,"%s: type lengths incorrect; edit typedefs " + "and recompile.\n", progname); + zx_exit(1); + } + + if (argc < 2) + { + fprintf(stderr,"%s: No CP/M program name provided.\n",progname); + zx_exit(1); + } + + + setmode(_fileno(stdin), O_BINARY ); + setmode(_fileno(stdout), O_BINARY ); + + /* Parse arguments. An argument can be either: + + * preceded by a '-', in which case it is copied in as-is, less the + dash; + * preceded by a '+', in which case it is parsed as a filename and + then concatenated to the previous argument; + * preceded by a '+-', in which case it is concatenated without + parsing; + * not preceded by either, in which case it is parsed as a filename. + + So, the argument string "--a -b c +-=q --x +/dev/null" would be rendered + into CP/M form as "-a b p:c=q -xd:null" */ + + if (!fcb_init()) + { + fprintf(stderr, "Could not initialise CPMREDIR library\n"); + zx_exit(1); + } + + xlt_map(0, BINDIR80); /* Establish the 3 fixed mappings */ + xlt_map(1, LIBDIR80); + xlt_map(2, INCDIR80); + pCmd = (char *)RAM + 0x81; + + for (n = 2; n < argc; n++) + { + if (argv[n][0] == '+' && argv[n][1] == '-') + { + /* Append, no parsing */ + strcat(pCmd, argv[n] + 2); + } + else if (!argv[n][0] || argv[n][0] == '-') + { + /* Append with space; no parsing. */ + strcat(pCmd, " "); + strcat(pCmd, argv[n] + 1); + } + else if (argv[n][0] == '+') + { + zx_xltname(pCmd, argv[n]+1); + } + else /* Translate a filename */ + { + strcat(pCmd, " "); + zx_xltname(pCmd, argv[n]); + } + + } + pCmd[0x7F] = 0; /* Truncate to fit the buffer */ + RAM[0x80] = strlen(pCmd); + + str = parse_to_fcb(pCmd, 0x5C); + parse_to_fcb(str, 0x6C); + +/* This statement is very useful when creating a client like zxc or zxas + + printf("Command tail is %s\n", pCmd); +*/ + load_bios(); + + memset(RAM + 0xFE9C, 0, 0x64); /* Zap the SCB */ + RAM[0xFE98] = 0x06; + RAM[0xFE99] = 0xFE; /* FE06, BDOS entry */ + RAM[0xFEA1] = 0x31; /* BDOS 3.1 */ + RAM[0xFEA8] = 0x01; /* UK date format */ + RAM[0xFEAF] = 0x0F; /* CCP drive */ + +#ifdef USE_CPMIO + RAM[0xFEB6] = cpm_term_direct(CPM_TERM_WIDTH, -1); + RAM[0xFEB8] = cpm_term_direct(CPM_TERM_HEIGHT, -1); +#else + RAM[0xFEB6] = 79; + RAM[0xFEB8] = 23; +#endif + RAM[0xFED1] = 0x80; /* Buffer area */ + RAM[0xFED2] = 0xFF; + RAM[0xFED3] = '$'; + RAM[0xFED6] = 0x9C; + RAM[0xFED7] = 0xFE; /* SCB address */ + RAM[0xFED8] = 0x80; /* DMA address */ + RAM[0xFED9] = 0x00; + RAM[0xFEDA] = 0x0F; /* P: */ + RAM[0xFEE6] = 0x01; /* Multi sector count */ + RAM[0xFEFE] = 0x06; + RAM[0xFEFF] = 0xFE; /* BDOS */ + + cpm_drive = 0x0F; /* Start logged into P: */ + cpm_user = 0; /* and user 0 */ + +#ifdef USE_CPMIO + cpm_scr_init(); deinit_term = 1; +#endif +#ifdef USE_CPMGSX + gsx_init(); deinit_gsx = 1; +#endif + + /* Start the Z80 at 0xFF00, with stack at 0xFE00 */ + mainloop(0xFF00, 0xFE00); + + return zx_term(); +} + +void zx_exit(int code) +{ +#ifdef USE_CPMIO + if (deinit_term) cpm_scr_unit(); +#endif +#ifdef USE_CPMGSX + if (deinit_gsx) gsx_deinit(); +#endif + exit(code); +} + +int zx_term(void) +{ + word n; + + + n = RAM[0x81]; /* Get the return code. This is Hi-Tech C */ + n = (n << 8) | RAM[0x80]; /* specific and fails with other COM files */ + + putchar('\n'); + + if (cpm_error != 0) /* The CP/M "set return code" call was used */ + { /* (my modified Hi-Tech C library uses this */ + n = cpm_error; /* call) */ + } + if (n < 256 || n == 0xFFFF) + { + Msg("Return code %d\n", n); + return n; + } + else return 0; +} + + diff --git a/Tools/unix/zx/zx.h b/Tools/unix/zx/zx.h new file mode 100644 index 00000000..c2fd0930 --- /dev/null +++ b/Tools/unix/zx/zx.h @@ -0,0 +1,95 @@ +/* + * Change the directories in these #defines if necessary. Note trailing slash. + */ + +#include "config.h" + +#ifdef __MSDOS__ + #define BINDIR80 "d:/tools/cpm/bin80/" + #define LIBDIR80 "d:/tools/cpm/lib80/" + #define INCDIR80 "d:/tools/cpm/include/" +#else +/* Unless overridden, these are defined by autoconf. Note trailing slash. + #undef BINDIR80 + #undef LIBDIR80 + #undef INCDIR80 + #define BINDIR80 "/usr/local/lib/cpm/bin80/" + #define LIBDIR80 "/usr/local/lib/cpm/lib80/" + #define INCDIR80 "/usr/local/lib/cpm/include80/" +*/ +#endif + +#define SERIAL "ZXCC05" + +/* System include files */ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef LINUX +#include +#define _isatty(a) isatty(a) +#define _fileno(a) fileno(a) +#define setmode(a,b) +#define O_BINARY 0 +#endif +#ifdef WIN32 +#include +#endif +#include +#include +#ifdef __MSDOS +#include +#endif + +/* Library includes */ + +#ifdef USE_CPMIO +#include "cpmio.h" +#endif + +#ifdef USE_CPMGSX +#include "cpmgsx.h" +#endif + +#include "cpmredir.h" /* BDOS disc simulation */ + +typedef unsigned char byte; /* Must be exactly 8 bits */ +typedef unsigned short word; /* Must be exactly 16 bits */ + +/* Prototypes */ + +void ed_fe (byte *a, byte *b, byte *c, byte *d, byte *e, byte *f, + byte *h, byte *l, word *pc, word *ix, word *iy); +void cpmbdos(byte *a, byte *b, byte *c, byte *d, byte *e, byte *f, + byte *h, byte *l, word *pc, word *ix, word *iy); +void cpmbios(byte *a, byte *b, byte *c, byte *d, byte *e, byte *f, + byte *h, byte *l, word *pc, word *ix, word *iy); +void dump_regs(FILE *fp, byte a, byte b, byte c, byte d, byte e, byte f, + byte h, byte l, word pc, word ix, word iy); +void Msg(char *s, ...); +int zx_term(void); +void zx_exit(int code); + +byte cin(void); +void cout(byte); +int cstat(void); + +/* Global variables */ + +extern char *progname; +extern char **argv; +extern int argc; +extern byte RAM[65536]; /* The Z80's address space */ + +extern usestdio; + +/* Z80 CPU emulation */ + +#include "z80.h" + diff --git a/Tools/unix/zx/zx.html b/Tools/unix/zx/zx.html new file mode 100644 index 00000000..b425ee1e --- /dev/null +++ b/Tools/unix/zx/zx.html @@ -0,0 +1,131 @@ +zx CP/M Command Line Emulator + +

    zx CP/M Command Line Emulator

    + +

    zx allows execution of CP/M 2.2 and 3.X application from a +Windows command line. It is compatible with Windows XP and greater (both +32 and 64 bit).

    + +

    zx is basically a port of a subset of the zxcc package by John Elliott. +The GPLv2 licensing carries forward. Please refer to the + +zxcc web page for more information.

    + +

    While the original zxcc package was generally intended to allow +execution of the Hi-Tech C CP/M compiler under Unix, zx is slightly +more general and intended to allow running most CP/M tools. Specific +changes were incorporated to improve interactice console operation of +CP/M applications.

    + +

    Setup

    + +

    The zx application (zx.exe) may be copied to any directory for execution. +The bios.bin file must be copied to the same directory. For ease of use, +you will probably want the directory to part of your PATH environment +variable so that you can run the tool from any location.

    + +

    You will also need the CP/M applications that you want to run. +zx will load files fromthe current directory or one of the following +directories based on file type. Any of the following environment +variables may be defined to determine where zx searches for the +respective file types:

    + +
      +
    • ZXBINDIR may contain a single path which will +be searched for executable files (usually *.com)
    • +
    • ZXLIBDIR may contain a single path which will +be search for library files (usually *.lib)
    • +
    • ZXINCDIR may contain a single path which will +be searched for include files (usually *.inc)
    • +
    + +

    Usage

    + +

    In general CP/M applications are executed by prefixing the CP/M command +line with "zx". So for example, you could assemble a test.asm using +rmac with a command line like:

    + +
    zx rmac hello
    + +

    In this case, rmac.com would need to be in the directory specified by +environment variable ZXBINDIR or in the current directory. Also, +hello.asm would need to be in the current directory.

    + +

    Filenames

    + +

    Where you would normally enter a CP/M filename you instead enter +a Windows filename. Note that you will need to use a forward slash +instead of the traditional backslash as a directory separator. The +filename itself (as opposed to any directories in +its path) must obey CP/M 8.3 naming conventions.

    + +

    Where the documentation requires a CP/M drive letter/user number +you should enter a path complete with trailing slash, for example:

    +
    -I/usr/src/linux-80/include/
    + +

    Technical

    + +

    zx emulates a subset of CP/M 3; hopefully enough to run the +most CP/M tools. It can be used as a limited general-purpose CP/M 3 +emulator provided the emulated program only uses a common subset of +system calls.

    + +

    Syntax for zx is:

    + +
    +zx comfile.com arg1 arg2 ... +
    + +

    The comfile is the program to run; zx searches the current +directory and ZXBINDIR for it.

    + +

    The arguments are parsed in this way:

    + +
      +
    • Any argument starting with a - sign is passed to the CP/M program as-is, +minus the leading - sign. +
    • Any argument starting with a + sign is parsed as a filename (see below) +and then concatenated to the previous argument. +
    • Any argument starting "+-" is concatenated without being parsed. +
    • All other arguments are parsed as filenames. The path is +converted to a CP/M driveletter. +
    + +

    For example: +

    +zx foo.com --Q -A /src/main --I +/src/sub +-, +/foo/bar +
    + +

    would pass these arguments to foo.com:

    + +
    +-Q A d:main -Id:sub,e:bar +
    + +

    The other programs are merely wrappers that convert their command lines +into the form required by zx.

    + +

    Errors

    + +

    Any errors raised by the zx runtime system will be prefixed +with zx:. Some errors you may encounter are:

    + +
    +
    Unsupported BDOS call
    +
    Part of CP/M 3 that the program uses has not been emulated. Add the +required functionality to zxbdos.c and recompile.
    +
    Z80 encountered invalid trap
    +
    The CP/M program being run attempted to call the zx runtime +system with an unknown call number.
    +
    + +

    Acknowledgements

    + +
      +
    • zxcc was written by John Elliott
    • +
    • Hi-Tech C was written by Hi-Tech Software.
    • +
    • The Z80 emulation engine was written by Ian Collier.
    • +
    • Thanks to Jacob Nevins, Andy Parkins and others for bug fix suggestions.
    • +
    + + diff --git a/Tools/unix/zx/zxbdos.c b/Tools/unix/zx/zxbdos.c new file mode 100644 index 00000000..06b951ad --- /dev/null +++ b/Tools/unix/zx/zxbdos.c @@ -0,0 +1,561 @@ +#include "zx.h" + +#define BDOS_DEF +#include "zxbdos.h" +#include "zxcbdos.h" +#include "zxdbdos.h" + +#ifdef __MSDOS__ +#include +#endif + +#define BCD(x) (((x % 10)+16*(x/10)) & 0xFF) + +/* Convert time_t to CP/M day count/hours/minutes */ +dword cpmtime(time_t t) +{ + long d = (t / 86400) - 2921; /* CP/M day 0 is unix day 2921 */ + long h = (t % 86400) / 3600; /* Hour, 0-23 */ + long m = (t % 3600) / 60; /* Minute, 0-59 */ + + return (d | (BCD(h) << 16) | (BCD(m) << 24)); +} + + +byte get_time(cpm_word b) +{ + time_t t; + + time(&t); + wr32(b, cpmtime(t)); + + return (BCD(t % 60)); +} + + +/* Functions to access 24-bit & 32-bit words in memory. These are always + little-endian. */ + +void wr24(word addr, dword v) +{ + RAM[addr ] = v & 0xFF; + RAM[addr + 1] = (v >> 8) & 0xFF; + RAM[addr + 2] = (v >> 16) & 0xFF; +} + +void wr32(word addr, dword v) +{ + RAM[addr ] = v & 0xFF; + RAM[addr + 1] = (v >> 8) & 0xFF; + RAM[addr + 2] = (v >> 16) & 0xFF; + RAM[addr + 3] = (v >> 24) & 0xFF; +} + +dword rd24(word addr) +{ + register dword rv = RAM[addr + 2]; + + rv = (rv << 8) | RAM[addr + 1]; + rv = (rv << 8) | RAM[addr]; + return rv; +} + + +dword rd32(word addr) +{ + register dword rv = RAM[addr + 3]; + + rv = (rv << 8) | RAM[addr + 2]; + rv = (rv << 8) | RAM[addr + 1]; + rv = (rv << 8) | RAM[addr]; + return rv; +} + +#define peekw(addr) ( (((word)(RAM[addr + 1])) << 8) | RAM[addr]) + + +/* Get / set the program return code. We store this in 'C' form: 0 for + success, 1-255 for failure. Translate to/from the CP/M form of: + + 0x0000-0xFEFF for success + 0xFF00-0xFFFE for failure + + We also store the actual value so it can be returned + + */ + +word cpm_errcde(word DE) +{ + static word real_err = 0; + + if (DE == 0xFFFF) return real_err; + real_err = DE; + + if (DE == 0xFF00) cpm_error = 1; + else if (DE > 0xFF00) cpm_error = (DE & 0xFF); + else cpm_error = 0; + return 0; +} + + +#ifdef USE_CPMGSX +gsx_byte gsxrd(gsx_word addr) +{ + return RdZ80(addr); +} + +void gsxwr(gsx_word addr, gsx_byte value) +{ + WrZ80(addr, value); +} + +#endif + +#undef bc +#undef de +#undef hl + +void setw(byte *l, byte *h, word w) +{ + *l = (w & 0xFF); + *h = (w >> 8) & 0xFF; +} + +void cpmbdos(byte *a, byte *b, byte *c, byte *d, byte *e, byte *f, + byte *h, byte *l, word *pc, word *ix, word *iy) +{ + word de = ((*d) << 8) | *e; + word hl = ((*h) << 8) | *l; + byte *pde = &RAM[de]; + byte *pdma = &RAM[cpm_dma]; + word temp; + int retv; + + Msg("BDOS service invoked: C=%02x DE=%04x\n", *c, de); + + switch(*c) + { + case 0: + *pc = 0; + break; + + case 1: /* Get a character */ +#ifdef USE_CPMIO + retv = cpm_bdos_1(); +#else + retv = cin(); +#endif + if (retv < 0) *pc = 0; + setw(l, h, retv); + break; + + case 2: /* Print a character */ +#ifdef USE_CPMIO + if (cpm_bdos_2(*e)) *pc = 0; +#else + cout(*e); +#endif + break; + + case 3: /* No auxin */ + setw(l, h, 0x1A); + break; + + case 4: /* No auxout */ + break; + + case 5: /* No printer */ + break; + + case 6: /* Direct console I/O */ + retv = cpm_bdos_6(*e); + if (retv < 0) *pc = 0; + setw(l, h, retv); + break; + + case 7: /* No auxist */ + case 8: /* No auxost */ + break; + + case 9: /* Print a $-terminated string */ +#ifdef USE_CPMIO + if (cpm_bdos_9((char *)pde)) *pc = 0; +# else + for (temp = 0; RAM[de + temp] != '$'; ++temp) + { + cout(RAM[de + temp]); + } +#endif + break; + + case 0x0A: + bdos_rdline(de, &(*pc)); + break; + + case 0x0B: /* Console status */ + //*l = *h = 0; /* No keys pressed */ + *l = cstat(); + *h = 0; + break; + + case 0x0C: /* Get CP/M version */ + +/* For GENCOM's benefit, claim to be v3.1 */ + + *l = 0x31; /* v3.1 */ + //*l = 0x22; /* v2.2 */ + *h = 0; /* CP/M, no network */ + break; + + case 0x0D: /* Re-log discs */ + fcb_reset(); + break; + + case 0x0E: /* Set default drive */ + setw(l, h, fcb_drive(*e)); + break; + + case 0x0F: /* Open using FCB */ + setw(l, h, x_fcb_open(pde, pdma)); + break; + + case 0x10: /* Close using FCB */ + setw(l, h, fcb_close(pde)); + break; + + case 0x11: /* Find first */ + setw(l, h, fcb_find1(pde, pdma)); + break; + + case 0x12: + setw(l, h, fcb_find2(pde, pdma)); + break; + + case 0x13: /* Delete using FCB */ + setw(l, h, fcb_unlink(pde, pdma)); + break; + + case 0x14: /* Sequential read using FCB */ + setw(l, h, fcb_read(pde, pdma)); + + //Msg("fcb_read L=%02x H=%02x\n", *l, *h); + + break; + + case 0x15: /* Sequential write using FCB */ + setw(l, h, fcb_write(pde, pdma)); + break; + + case 0x16: /* Create using FCB */ + setw(l, h, fcb_creat(pde, pdma)); + break; + + case 0x17: /* Rename using FCB */ + setw(l, h, fcb_rename(pde, pdma)); + break; + + case 0x18: /* Get login vector */ + setw(l, h, fcb_logvec()); + break; + + case 0x19: /* Get default drive */ + setw(l, h, cpm_drive); + break; + + case 0x1A: /* Set DMA */ + Msg("Set DMA to %04x\n", de); + cpm_dma = de; + break; + + case 0x1B: /* Get alloc vector */ + fcb_getalv(RAM + 0xFF80, 0x40); + setw(l, h, 0xFF80); + break; + + case 0x1C: /* Make disc R/O */ + setw(l, h, fcb_rodisk()); + break; + + case 0x1D: /* Get R/O vector */ + setw(l, h, fcb_rovec()); + break; + + case 0x1E: /* Set attributes */ + setw(l, h, fcb_chmod(pde, pdma)); + break; + + case 0x1F: /* Get DPB */ + fcb_getdpb(RAM + 0xFFC0); + setw(l, h, 0xFFC0); + break; /* Whoops. Missed that 'break'. */ + + case 0x20: /* Get/set uid */ + setw(l, h, fcb_user(*e)); + break; + + case 0x21: /* Read a record */ + setw(l, h, fcb_randrd(pde, pdma)); + break; + + case 0x22: /* Write a record */ + setw(l, h, fcb_randwr(pde, pdma)); + break; + + case 0x23: /* Get file size */ + setw(l, h, x_fcb_stat(pde)); + break; + + case 0x24: /* Get file pointer */ + setw(l, h, fcb_tell(pde)); + break; + + case 0x25: + setw(l, h, fcb_resro(de)); + break; + + /* MP/M drive access functions, not implemented */ + + case 0x28: /* Write with 0 fill */ + setw(l, h, fcb_randwz(pde, pdma)); + break; + + /* MP/M record locking functions, not implemented */ + + case 0x2C: /* Set no. of records to read/write */ + setw(l, h, fcb_multirec(*e)); + break; + + case 0x2D: /* Set error mode */ + err_mode = *e; + break; + + case 0x2E: + setw(l, h, fcb_dfree(*e, pdma)); + break; /* Whoops. Missed that 'break'. */ + + /* 0x2F: Chain */ + + case 0x30: + setw(l, h, fcb_sync(*e)); + break; + + case 0x31: + if (pde[1] == 0xFE) + { + RAM[0xFE9C + *pde] = pde[2]; + RAM[0xFE9D + *pde] = pde[3]; + } + else if (RAM[hl + 1] == 0xFF) + { + RAM[0xFE9C + *pde] = pde[2]; + } + else + { + *l = RAM[0xFE9C + *pde]; + *h = RAM[0xFE9D + *pde]; + } + break; + + case 0x32: + temp = *ix; + *ix = 3 * (pde[0] + 1); + *a = pde[1]; + *c = pde[2]; + *b = pde[3]; + *e = pde[4]; + *d = pde[5]; + *l = pde[6]; + *h = pde[7]; + cpmbios(a,b,c,d,e,f,h,l,pc,ix,iy); + *ix = temp; + break; + + case 0x3C: /* Communicate with RSX */ + *h = *l = 0; + break; + + case 0x62: /* Purge */ + setw(l, h, fcb_purge()); + break; + + case 0x63: /* Truncate file */ + setw(l, h, fcb_trunc(pde, pdma)); + break; + + case 0x64: /* Set label */ + setw(l, h, fcb_setlbl(pde, pdma)); + break; + + case 0x65: /* Get label byte */ + setw(l, h, fcb_getlbl(*e)); + break; + + case 0x66: /* Get file date */ + setw(l, h, fcb_date(pde)); + break; + + case 0x67: /* Set password */ + setw(l, h, fcb_setpwd(pde, pdma)); + break; + + case 0x68: /* Set time of day */ + /* Not advisable to let an emulator play with the clock */ + break; + + case 0x69: /* Get time of day */ + setw(l, h, get_time(de)); + break; + + case 0x6A: /* Set default password */ + setw(l, h, fcb_defpwd(pde)); + break; + + case 0x6B: /* Get serial number */ + memcpy(pde, SERIAL, 6); + break; + + case 0x6C: /* 0.03 set error code */ + setw(l, h, cpm_errcde(de)); + break; + +#ifdef USE_CPMIO + case 0x6D: /* Set/get console mode */ + setw(l, h, cpm_bdos_109(de)); + break; + + case 0x6E: /* Set/get string delimiter */ + setw(l, h, cpm_bdos_110(*e)); + break; + + case 0x6F: /* Send fixed length string to screen */ + if (cpm_bdos_111((char *)RAM + peekw(de), + peekw(de + 2))) + *pc = 0; + break; + + case 0x70: /* Send fixed length string to printer */ + break; + + /* 0x71: Strange PCP/M function */ +#else + case 0x6D: /* Set/get console mode */ + setw(l, h, 0); + break; + +#endif + +#ifdef USE_CPMGSX + case 0x73: /* GSX */ + setw(l, h, gsx80(gsxrd, gsxwr, de)); + break; +#endif + + case 0x74: /* Set date stamp */ + setw(l, h, fcb_sdate(pde, pdma)); + break; + + case 0x98: /* Parse filename */ + setw(l, h, fcb_parse((char *)RAM + peekw(de), + (byte *)RAM + peekw(de + 2))); + break; + + default: +#ifdef USE_CPMIO + cpm_scr_unit(); +#endif +#ifdef USE_CPMGSX + gsx_deinit(); +#endif + + fprintf(stderr,"%s: Unsupported BDOS call %d\n", progname, + (int)(*c)); + dump_regs(stderr,*a,*b,*c,*d,*e,*f,*h,*l,*pc,*ix,*iy); + zx_exit(1); + break; + } + + *a = *l; + *b = *h; + + Msg("BDOS service completion.\n"); +} + + + +void cpmbios(byte *a, byte *b, byte *c, byte *d, byte *e, byte *f, + byte *h, byte *l, word *pc, word *ix, word *iy) +{ + int func = (((*ix) & 0xFF) / 3) - 1; + + Msg("BIOS service invoked: func=%02x\n", func); + + switch(func) /* BIOS function */ + { + case 1: + zx_exit(zx_term()); /* Program termination */ + break; + + case 2: /* CONST */ +#ifdef USE_CPMIO + *a = cpm_const(); +#else + *a = cpm_bdos_6(0xFE); +#endif + break; + + case 3: /* CONIN */ +#ifdef USE_CPMIO + *a = cpm_conin(); +#else + *a = cpm_bdos_6(0xFD); +#endif + break; + + case 4: /* CONOUT */ +#ifdef USE_CPMIO + cpm_conout(*c); +#else + cpm_bdos_6(*c); +#endif + break; + + case 20: /* DEVTBL */ + setw(l, h, 0xFFFF); + break; + + case 22: /* DRVTBL */ + setw(l, h, 0xFFFF); + break; + + case 26: /* TIME */ + RAM[0xFEF8] = get_time(0xFEF4); + break; + + case 30: /* USERF!!! */ +#ifdef USE_CPMIO + cpm_bdos_110('$'); + cpm_bdos_9("This program has attempted to call USERF, " + "which is not implemented\r\n$"); +#else + printf("This program has attempted to call USERF, which " + "is not implemented.\n"); +#endif + zx_term(); + zx_exit(1); + break; + + default: +#ifdef USE_CPMIO + cpm_scr_unit(); +#endif +#ifdef USE_CPMGSX + gsx_deinit(); +#endif + + fprintf(stderr,"%s: Unsupported BIOS call %d\n", progname, func); + dump_regs(stderr,*a,*b,*c,*d,*e,*f,*h,*l,*pc,*ix,*iy); + zx_exit(1); + } + + Msg("BIOS service completion.\n"); +} diff --git a/Tools/unix/zx/zxbdos.h b/Tools/unix/zx/zxbdos.h new file mode 100644 index 00000000..4111c78e --- /dev/null +++ b/Tools/unix/zx/zxbdos.h @@ -0,0 +1,50 @@ +extern char *progname; +extern char **argv; +extern int argc; + +extern byte cpm_drive; +extern byte cpm_user; + +extern byte RAM[65536]; /* The Z80's address space */ + +extern void Msg(char *s, ...); + +#ifdef BDOS_DEF + +word cpm_dma = 0x80; /* DMA address */ +byte err_mode = 0xFF; +byte rec_multi = 1; +word rec_len = 128; +word ffirst_fcb = 0xFFFF; +byte cpm_error = 0; /* Error code returned by CP/M */ + +#else /* BDOS_DEF */ + +extern word cpm_dma, rec_len, ffirst_fcb; +extern byte err_mode, rec_multi, cpm_error; + +#endif /* BDOS_DEF */ + +#ifndef O_BINARY /* Necessary in DOS, not present in Linux */ +#define O_BINARY 0 +#endif + +typedef unsigned long dword; + +/* Functions in zxbdos.c */ + +void wr24(word addr, dword v); +void wr32(word addr, dword v); +dword rd24(word addr); +dword rd32(word addr); +dword cpmtime(time_t t); +word cpm_errcde(word DE); + +#ifdef USE_CPMGSX +gsx_byte gsxrd(gsx_word addr); +void gsxwr(gsx_word addr, gsx_byte value); +#endif + +void cpmbdos(); +void cpmbios(); + diff --git a/Tools/unix/zx/zxcbdos.c b/Tools/unix/zx/zxcbdos.c new file mode 100644 index 00000000..b441fa7f --- /dev/null +++ b/Tools/unix/zx/zxcbdos.c @@ -0,0 +1,114 @@ +#include "zx.h" +#include "zxbdos.h" +#include "zxcbdos.h" +#include +#ifdef WIN32 +#include +#endif + +/* Line input */ +#ifdef USE_CPMIO + + +void bdos_rdline(word line, word *PC) +{ + char *buf; + + if (!line) line = cpm_dma; + else RAM[line + 1] = 0; + + buf = (char *)&RAM[line]; + + if (cpm_bdos_10(buf)) *PC = 0; +} + +#else /* def USE_CPMIO */ + +void bdos_rdline(word line, word *PC) +{ + int maxlen; + + if (!line) line = cpm_dma; + maxlen = RAM[line]; + + fgets((char *)(RAM + line + 2), maxlen, stdin); + RAM[line + 1] = strlen((char *)(RAM + line + 2)) - 1; + + Msg("Input: [%d] %-*.*s\n", RAM[line + 1], RAM[line + 1], RAM[line +1], (char *)(RAM+line+2)); +} +#endif /* ndef USE_CPMIO */ + +#ifndef USE_CPMIO + + +int cpm_bdos_6(byte e) +{ + int c; + + switch(e) { + case 0xFF: + if (cstat()) return cin(); + return 0; + + case 0xFE: + return cstat(); + + case 0xFD: + return cin(); + + default: + cout(e); + break; + } + return 0; +} +#endif + +#if defined(__MINGW32__) || defined(_MSC_BUILD) || defined(__WATCOMC__) + +byte cin() +{ + if (_isatty(_fileno(stdin))) + return getch(); + else + return getchar(); +} + +void cout(byte c) +{ + if (_isatty(_fileno(stdout))) + putch(c); + else + putchar(c); +} + +int cstat() +{ + if (_isatty(_fileno(stdin))) + return _kbhit() ? 0xFF : 0; + else + return 0xFF; +} + +#else /* defined(__MINGW32__) || defined(_MSC_BUILD) */ + +byte cin() +{ + return getchar(); +} + +void cout(byte c) +{ + putchar(c); +} + +int cstat() +{ + int i; + + ioctl(_fileno(stdin), FIONREAD, &i); + if (i > 0) return 0xff; + return 0; +} + +#endif diff --git a/Tools/unix/zx/zxcbdos.h b/Tools/unix/zx/zxcbdos.h new file mode 100644 index 00000000..7f724441 --- /dev/null +++ b/Tools/unix/zx/zxcbdos.h @@ -0,0 +1,4 @@ +void bdos_rdline(word line, word *PC); +int cpm_bdos_6(byte e); + + diff --git a/Tools/unix/zx/zxdbdos.c b/Tools/unix/zx/zxdbdos.c new file mode 100644 index 00000000..f5f21f3b --- /dev/null +++ b/Tools/unix/zx/zxdbdos.c @@ -0,0 +1,88 @@ +#include "zx.h" +#include "zxbdos.h" +#include "zxdbdos.h" + +/* This file used to deal with all disc-based BDOS calls. + Now the calls have been moved into libcpmredir, it's a bit empty round + here. + + ZXCC does a few odd things when searching, to make Hi-Tech C behave + properly. +*/ + + +/* If a file could not be found on the default drive, try again on a "search" + drive (A: for .COM files, B: for .LIB and .OBJ files) */ + +int fcbforce(byte *fcb, byte *odrv) +{ + byte drive; + char typ[4]; + int n; + + for (n = 0; n < 3; n++) typ[n] = fcb[n+9] & 0x7F; + typ[3] = 0; + + Msg("fcbforce: typ=%s, fcb=%hhx\r\n", typ, *fcb); + + drive = 0; + if (*fcb) return 0; /* not using default drive */ + //if ((*fcb) != 16) return 0; /* not using default drive */ + if (!strcmpi(typ, "COM")) drive = 1; + if (!strcmpi(typ, "LIB")) drive = 2; + if (!strcmpi(typ, "OBJ")) drive = 2; + if (!strcmpi(typ, "H ")) drive = 3; + + Msg("fcbforce: drive=%i\r\n", drive); + + if (!drive) return 0; + + *odrv = *fcb; + *fcb = drive; + return 1; +} + +/* zxcc has a trick with some filenames: If it can't find them where they + should be, and a drive wasn't specified, it searches BINDIR80, + LIBDIR80 or INCDIR80 (depending on the type of the file). + */ + +word x_fcb_open(byte *fcb, byte *dma) +{ + word rv = fcb_open(fcb, dma); + byte odrv; + + Msg("x_fcb_open: rv=%X\r\n", rv); + + if (rv == 0xFF) + { + if (fcbforce(fcb, &odrv)) + { + rv = fcb_open(fcb, dma); + Msg("x_fcb_open: rv=%X\r\n", rv); + *fcb = odrv; + } + } + return rv; +} + + + +word x_fcb_stat(byte *fcb) +{ + word rv = fcb_stat(fcb); + byte odrv; + + if (rv == 0xFF) + { + if (fcbforce(fcb, &odrv)) + { + rv = fcb_stat(fcb); + *fcb = odrv; + } + } + return rv; +} + + + diff --git a/Tools/unix/zx/zxdbdos.h b/Tools/unix/zx/zxdbdos.h new file mode 100644 index 00000000..7a47b801 --- /dev/null +++ b/Tools/unix/zx/zxdbdos.h @@ -0,0 +1,8 @@ + + + +int fcbforce(byte *fcb, byte *odrv); + +word x_fcb_open(byte *fcb, byte *dma); +word x_fcb_stat(byte *fcb); +