From edddc5a690e3bff5ee83dc1f65d0cdd784b44ebe Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Thu, 14 Jan 2021 02:44:50 +0100 Subject: [PATCH] Split out project into serveral projects --- Makefile | 11 +- bin/ASM.COM | Bin 8192 -> 0 bytes bin/DDT.COM | Bin 4864 -> 0 bytes bin/DISKDEF.LIB | 251 -------------- bin/DSKMAINT.COM | Bin 2304 -> 0 bytes bin/DUMP.COM | Bin 512 -> 0 bytes bin/ED.COM | Bin 6656 -> 0 bytes bin/LOAD.COM | Bin 1792 -> 0 bytes bin/MAC.COM | Bin 11776 -> 0 bytes bin/MBASIC.COM | Bin 24320 -> 0 bytes bin/PIP.COM | Bin 7424 -> 0 bytes bin/STAT.COM | Bin 5248 -> 0 bytes bin/SUBMIT.COM | Bin 1280 -> 0 bytes bin/XSUB.COM | Bin 768 -> 0 bytes bin/s.com | Bin 34688 -> 0 bytes {bin => ref}/BIOS.ASM | 0 {bin => ref}/CPM.SYS | Bin {bin => ref}/DEBLOCK.ASM | 0 {bin => ref}/DUMP.ASM | 0 src/MONITOR.z80 | 696 --------------------------------------- src/loader.z80 | 30 -- src/putsys.z80 | 56 ---- src/ram_monitor.z80 | 687 -------------------------------------- src/rom_monitor.z80 | 675 ------------------------------------- 24 files changed, 7 insertions(+), 2399 deletions(-) delete mode 100644 bin/ASM.COM delete mode 100644 bin/DDT.COM delete mode 100644 bin/DISKDEF.LIB delete mode 100644 bin/DSKMAINT.COM delete mode 100644 bin/DUMP.COM delete mode 100644 bin/ED.COM delete mode 100644 bin/LOAD.COM delete mode 100644 bin/MAC.COM delete mode 100644 bin/MBASIC.COM delete mode 100644 bin/PIP.COM delete mode 100644 bin/STAT.COM delete mode 100644 bin/SUBMIT.COM delete mode 100644 bin/XSUB.COM delete mode 100644 bin/s.com rename {bin => ref}/BIOS.ASM (100%) rename {bin => ref}/CPM.SYS (100%) rename {bin => ref}/DEBLOCK.ASM (100%) rename {bin => ref}/DUMP.ASM (100%) delete mode 100644 src/MONITOR.z80 delete mode 100644 src/loader.z80 delete mode 100644 src/putsys.z80 delete mode 100644 src/ram_monitor.z80 delete mode 100644 src/rom_monitor.z80 diff --git a/Makefile b/Makefile index 27a67a7..cf1d128 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,15 @@ BUILDDIR=.build -_BIN= rom_monitor.bin ram_monitor.bin cpm22.bin bios.bin putsys.bin loader.bin MONITOR.COM +_BIN= cpm22.bin bios.bin BIN = $(patsubst %,$(BUILDDIR)/%,$(_BIN)) -$(BUILDDIR)/%.bin: src/%.z80 +.PHONY: all clean + +all: $(BUILDDIR) $(BIN) + +$(BUILDDIR)/%.bin: src/%.z80 | $(BUILDDIR) @zasm -w -i $< -o $@ -$(BUILDDIR)/%.COM: src/%.z80 +$(BUILDDIR)/%.COM: src/%.z80 | $(BUILDDIR) @zasm -w -i $< -o $@ $(BUILDDIR): @@ -13,6 +17,5 @@ $(BUILDDIR): all: $(BUILDDIR) $(BIN) -.PHONY: clean clean: @rm -df $(BUILDDIR)/*.bin $(BUILDDIR)/*.COM $(BUILDDIR)/*.lst .build diff --git a/bin/ASM.COM b/bin/ASM.COM deleted file mode 100644 index a63e5aec663546b7aac7b330a9ebe8be3a46ba33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/bin/DISKDEF.LIB b/bin/DISKDEF.LIB deleted file mode 100644 index 221fa21..0000000 --- a/bin/DISKDEF.LIB +++ /dev/null @@ -1,251 +0,0 @@ -; CP/M 2.0 disk re-definition library -; -; Copyright (c) 1979 -; Digital Research -; Box 579 -; Pacific Grove, CA -; 93950 -; -; CP/M logical disk drives are defined using the -; macros given below, where the sequence of calls -; is: -; -; disks n -; diskdef parameter-list-0 -; diskdef parameter-list-1 -; ... -; diskdef parameter-list-n -; endef -; -; where n is the number of logical disk drives attached -; to the CP/M system, and parameter-list-i defines the -; characteristics of the ith drive (i=0,1,...,n-1) -; -; each parameter-list-i takes the form -; dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0] -; where -; dn is the disk number 0,1,...,n-1 -; fsc is the first sector number (usually 0 or 1) -; lsc is the last sector number on a track -; skf is optional "skew factor" for sector translate -; bls is the data block size (1024,2048,...,16384) -; dks is the disk size in bls increments (word) -; dir is the number of directory elements (word) -; cks is the number of dir elements to checksum -; ofs is the number of tracks to skip (word) -; [0] is an optional 0 which forces 16K/directory entry -; -; for convenience, the form -; dn,dm -; defines disk dn as having the same characteristics as -; a previously defined disk dm. -; -; a standard four drive CP/M system is defined by -; disks 4 -; diskdef 0,1,26,6,1024,243,64,64,2 -; dsk set 0 -; rept 3 -; dsk set dsk+1 -; diskdef %dsk,0 -; endm -; endef -; -; the value of "begdat" at the end of assembly defines the -; beginning of the uninitialize ram area above the bios, -; while the value of "enddat" defines the next location -; following the end of the data area. the size of this -; area is given by the value of "datsiz" at the end of the -; assembly. note that the allocation vector will be quite -; large if a large disk size is defined with a small block -; size. -; -dskhdr macro dn -;; define a single disk header list -dpe&dn: dw xlt&dn,0000h ;translate table - dw 0000h,0000h ;scratch area - dw dirbuf,dpb&dn ;dir buff,parm block - dw csv&dn,alv&dn ;check, alloc vectors - endm -; -disks macro nd -;; define nd disks -ndisks set nd ;;for later reference -dpbase equ $ ;base of disk parameter blocks -;; generate the nd elements -dsknxt set 0 - rept nd - dskhdr %dsknxt -dsknxt set dsknxt+1 - endm - endm -; -dpbhdr macro dn -dpb&dn equ $ ;disk parm block - endm -; -ddb macro data,comment -;; define a db statement - db data comment - endm -; -ddw macro data,comment -;; define a dw statement - dw data comment - endm -; -gcd macro m,n -;; greatest common divisor of m,n -;; produces value gcdn as result -;; (used in sector translate table generation) -gcdm set m ;;variable for m -gcdn set n ;;variable for n -gcdr set 0 ;;variable for r - rept 65535 -gcdx set gcdm/gcdn -gcdr set gcdm - gcdx*gcdn - if gcdr = 0 - exitm - endif -gcdm set gcdn -gcdn set gcdr - endm - endm -; -diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 -;; generate the set statements for later tables - if nul lsc -;; current disk dn same as previous fsc -dpb&dn equ dpb&fsc ;equivalent parameters -als&dn equ als&fsc ;same allocation vector size -css&dn equ css&fsc ;same checksum vector size -xlt&dn equ xlt&fsc ;same translate table - else -secmax set lsc-(fsc) ;;sectors 0...secmax -sectors set secmax+1;;number of sectors -als&dn set (dks)/8 ;;size of allocation vector - if ((dks) mod 8) ne 0 -als&dn set als&dn+1 - endif -css&dn set (cks)/4 ;;number of checksum elements -;; generate the block shift value -blkval set bls/128 ;;number of sectors/block -blkshf set 0 ;;counts right 0's in blkval -blkmsk set 0 ;;fills with 1's from right - rept 16 ;;once for each bit position - if blkval=1 - exitm - endif -;; otherwise, high order 1 not found yet -blkshf set blkshf+1 -blkmsk set (blkmsk shl 1) or 1 -blkval set blkval/2 - endm -;; generate the extent mask byte -blkval set bls/1024 ;;number of kilobytes/block -extmsk set 0 ;;fill from right with 1's - rept 16 - if blkval=1 - exitm - endif -;; otherwise more to shift -extmsk set (extmsk shl 1) or 1 -blkval set blkval/2 - endm -;; may be double byte allocation - if (dks) > 256 -extmsk set (extmsk shr 1) - endif -;; may be optional [0] in last position - if not nul k16 -extmsk set k16 - endif -;; now generate directory reservation bit vector -dirrem set dir ;;# remaining to process -dirbks set bls/32 ;;number of entries per block -dirblk set 0 ;;fill with 1's on each loop - rept 16 - if dirrem=0 - exitm - endif -;; not complete, iterate once again -;; shift right and add 1 high order bit -dirblk set (dirblk shr 1) or 8000h - if dirrem > dirbks -dirrem set dirrem-dirbks - else -dirrem set 0 - endif - endm - dpbhdr dn ;;generate equ $ - ddw %sectors,<;sec per track> - ddb %blkshf,<;block shift> - ddb %blkmsk,<;block mask> - ddb %extmsk,<;extnt mask> - ddw %(dks)-1,<;disk size-1> - ddw %(dir)-1,<;directory max> - ddb %dirblk shr 8,<;alloc0> - ddb %dirblk and 0ffh,<;alloc1> - ddw %(cks)/4,<;check size> - ddw %ofs,<;offset> -;; generate the translate table, if requested - if nul skf -xlt&dn equ 0 ;no xlate table - else - if skf = 0 -xlt&dn equ 0 ;no xlate table - else -;; generate the translate table -nxtsec set 0 ;;next sector to fill -nxtbas set 0 ;;moves by one on overflow - gcd %sectors,skf -;; gcdn = gcd(sectors,skew) -neltst set sectors/gcdn -;; neltst is number of elements to generate -;; before we overlap previous elements -nelts set neltst ;;counter -xlt&dn equ $ ;translate table - rept sectors ;;once for each sector - if sectors < 256 - ddb %nxtsec+(fsc) - else - ddw %nxtsec+(fsc) - endif -nxtsec set nxtsec+(skf) - if nxtsec >= sectors -nxtsec set nxtsec-sectors - endif -nelts set nelts-1 - if nelts = 0 -nxtbas set nxtbas+1 -nxtsec set nxtbas -nelts set neltst - endif - endm - endif ;;end of nul fac test - endif ;;end of nul bls test - endm -; -defds macro lab,space -lab: ds space - endm -; -lds macro lb,dn,val - defds lb&dn,%val&dn - endm -; -endef macro -;; generate the necessary ram data areas -begdat equ $ -dirbuf: ds 128 ;directory access buffer -dsknxt set 0 - rept ndisks ;;once for each disk - lds alv,%dsknxt,als - lds csv,%dsknxt,css -dsknxt set dsknxt+1 - endm -enddat equ $ -datsiz equ $-begdat -;; db 0 at this point forces hex record - endm -; - \ No newline at end of file diff --git a/bin/DSKMAINT.COM b/bin/DSKMAINT.COM deleted file mode 100644 index 9d33a89b5f985972dfff52be2e3dec5bf3956b42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmb7E&u<%55RS9Yj^jFMH-}=WLYh)bxKd@gmXN}dE?V20)FQEicr>!XU;l1&Aeth%2 zZ+u!~@=%sD(PC~x5Wk|+eN*smrbKUZdvn;^fO_A9-eUD5{_%k{a6tH?m5Y`Odd&NGtx5qd@9Aflao>Ll_+KS@GZwo60nK;weZ1x6z<&*@z`=LL7q6OU^lef_XT;(4evcf2vc4ZhUE~h!0wGL zsm;#G6Br~%G08u$(iFbe)`_cLW^%-nGQxwyTRS`AU3wNo@Z9sq3%Y#~<}}@KxS<(! z4vUW7(wz=0am&_C15T$ifS>bfrFya6lgM%}?e>0{GSG<1iG<;`}7?&tcbS9B*Cf3lI*Zd+#C(lrO0TKZ*< zjR2IOcFw=@!IwfZey*w4o8VYl{h|#G6FTNPZ0I(+OwbXXuC?^{`0K}}7dp1X*D$Z3 zIT~I{tA#dS(G4CH`>)f7Iu=urRLdu0nXl@Gp&P3~Ye?w^5>(gMwARTq01_C)a-%U2 zq_u29bs#cM9Qr6VVimz7Fm4g~#CmTs8mp;Y=3w&{uRHh*80wQly^1!*>NadNH78&| zGaO=|VdCTfHEz>%B{TVWHw1%ZuUg!;$70ESD335FR!j0B<}@B^{{&e%EvS16^5w0eWYsJzGRLd}3uFNS_w8}82lxjhZ1*F+mv#*(D+*Y%#(}r5+8YmJC zo0AabS#tx{)^SZ9+Yb!yJlc$4FK{iA@hYu5tx3PIug6~Dr>e4z+FzmG`?AbQ|5KNw zO8@`kpcZ`}sX)Vh2(|#nr9g7p!8SkP_fa44A}N7f8pJHhVelV<80c$&Ufy361T@18>AyNbnIV6HP70IEO(YK`!-p4oZ`##yTvE#b4CQAW{9MI{t&zjaD7R5=qCS|aj0YqPpO3+r-)ccYO2i- zP=3S1@Brt<)-_m+Zq|nB{X_9(ZVwVq!FD1qEsglqi&YP*k1DLZ{g!E*Zm6$S8kJg;kzB4ema~5{lcWA{)7GRhH8}2`3dI5y57ezdS%G>R zF6zRzWD0DPK*;!IWraCiW+7YxJC^Z`B6BU?1Y0Nmiu6d@1~+o~&tSnb6caxR$~@_v zsi_m6vP(c(0ssLh6W>=X{0edhUOvA`MGu}HUwW-#{3G07-qmA5z5|}qMMj6BU-apZ xW(*MNbb53*!t|&h#yQUz?{@faaNl%-d_HgSUtkF%)=zlG^$yq2P3n9C{{b^Cz8e4l diff --git a/bin/ED.COM b/bin/ED.COM deleted file mode 100644 index a0f0f5410f0542e3e6d05bfcd0fb361d84c73f26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 diff --git a/bin/LOAD.COM b/bin/LOAD.COM deleted file mode 100644 index b9601e002cc09df45e29331795412a0f0be8e217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1792 zcmbtUUu+ab7@xV@Kkaq)%2KFuYT3OzE8PR3=jAMGuXKC6&A<>jV zVhvbnVw6ba!3WR>A@RXzeA7rmeZaJv5~j&SX(A+j!3QZZ_h4c|l&G!W%w1D`c5^p7 zzu)ise)HYTHx~{@jG}*FG$`#Gt{K~kJx1^D=lixBZfRes=9G=Vt9njQ95%cl@B`aO zZ#T-m;~I|Zf>brqZmGH-q8v9}svPoyn&Aj_(T3gR9JAl^Vx|sn_I`E2q;8qP@N6o7kX)s1b zr&952hJOHvs(&yjdg-D+Qt^!uKk#5#NUHh4s8K!OaH$bpEc;c@*jp-lY3qUdh?)rP zPCii0DDK8|?oQN+HF@^Mv+Yq4KPupWWfkVe?gBI-)hg+_1>SJ+Px_Ckc38kw*((v9lz z2zynfagF^DiN|1|W}Hk6w8D5}QHk1da?`mJ^FavP1=_{u)NCgcb~{=AV=Fv9t4BC! z=M!q`T+Cbj&*@h^*r}&$i9fICS>hV^-qPdx4D974F+z~be5nDKedoT;4*5eHl z_hOK&PL48BQTda?=Lzs>XD8Hbf>5(dP)`B1VU02bwG}A6N$Cj1H?GM^A)6p~h+@(L zrvPt)5NdV{{50Ur0&f%e8Ni)u7M7rTfO?Ef%P=Dt3EQ~+eJ4qqC6V7kph-78R zeQO7qjZMNVmCO(TspJk4_Da-hgJ~PlSEKB*x^zkcjAJdWZ}X06@Marf*VUyZDf~#% zrx65f0b%h?DO{3x=iG~Ccaaq|_pOAd(R?%C9qF2eJ_+wiHi&rPmV_PNL`^xLFju4C z5}ubD>)5dtv0|Pi`$*CzQ`vrvH)@U~3z`{g$tT#Tv|=x4au|`#EXgBQP_w;!T|*8( zmF-@l+k~A`>zUK3Q=mPB@3GloR#v%3CmBF`p0F>~Yjaf@jxz}W44xy9Sl~XZ3vbB4 z`0Q^krywI7mGwS?I|;j@F22v%4AjP+Rblz}R?xy#8GpfBg-t6^6Zgy!oFjTc;|X(e z9R17da~aQwzREW`3EvW^uZivoWH-^WK>gYX^er?fHTP%}xS;8cQaTj8pKqnUimZaR zrEUU!U0pn>n1fm#4V;75jinYAA@N1caJ8j1= zl#h--AkQpztN5}gU|JF6%@}2WDd*vN2=Ce9uPB^Zc1YvLHfaxO)O5Ae@CQ+ZJ&Cul zi>mEv?3_wNghH8rn2ac;^<$l=o_Ke>Bk{o)h56ZQ<7d7Zqc5fo)qAwLi>lx*ji32s mjGlO@lG>a25JEp5qvPEuaS5it^Q_Cq&ZMp$uG7T-d;S66tN&L3 diff --git a/bin/MAC.COM b/bin/MAC.COM deleted file mode 100644 index cb0ac808be8b112556e456671f154b0aee04597c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 HyzjpOb%2Cv diff --git a/bin/MBASIC.COM b/bin/MBASIC.COM deleted file mode 100644 index c9ec3cd39f6cf66c899bd0eca759de3275045991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24320 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 OZ_b|!NSK7;-~R&C%=L`` diff --git a/bin/PIP.COM b/bin/PIP.COM deleted file mode 100644 index 4b2ce4b689b9be798eec94cd4275aee957c8bd07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7424 zcmds6eRNdSwZAu$kD1AQWHR}jWbT=pq#zdrGKQ#kkby z76jrKwAK$0M6Eyw1Q4nyC{R!bxEIiyaM3H*0OTclH+6zz_yU7gJ>;c@@p@jxKZ678HF zYnwhJ9=M`qT%i8itFN69XlIUxM56IPbD(8LbF8@~9*zaN+9EUSXg0y|XlG|zWV+K{_rJ)Z-LaN%UGojmSUlWX zcLSt#f<;FdJnGsaH#WDowFbJoz$DV$aRd5d;g)EuH4u+R1MShs^oumyRdwM=Yalu; zFs-dUJR#5$Z@==E>*`u&gj;5Ib$4VG#dPq9r?Clv`0UOwtc-WZB7tZuJ?A3RY0+3m zbG&Xw_-1$+x?@3TZZtMKz~hp-NLF1-w4<&o-W-bu$iQjQ?nrChtnRkU(U#^2jkUB# zyTXCia96x7(j0G#M$!x}?`Z1^#3n_t`r&rCA#la)Ns)2a)hP;1PxrMd3Mqu&C2BzzN`2!jIA&Tx!No>P9Gp{E|Ak-d6;4RK;wj0ju&bw}Az?`D3vQRpcI$8`U_R#jH^n&;R5dQlnVgD9B&> z8-?1&5p}!7lGF2Cidk(n7u(EAyRwfXZZ z{b(Ms0ld$re_Q|#Lpdi$`{Z-}11vd2Gt8~k|HLR)%gZ-^S#6%I#>5knOd=}m=ASQd z7|GG<@=Z^%`jRx_9IVQRW;B5d;Kp54d?+U)sU=_R$u(cK$$2o1%*fGh%O}ZqRmd+% zjidUqd~h4`_Dwn$%0thFzDdVs>}APi`QjRyhry}AZPJKadpzHKzx1NnLn4ehM^l>s z@F{!p#Z6q)PSz-@I~hwR3eu~To+am|RT#>_YM+C@AgP}vKj$_iGU|A_r!2%gWKZh@ z#Wp}fKNsRH5MSeZ-NwN0Ko8e%KteO()g~7}MSXbzVI|u21umZ%cBS#5ygs;K2TOJp z$TyLGu*t41Es*CDau-8PEG&@kVvSaH9w8W+hY|B$pIKb_FRY%BHQ&k2Pb>FYf%sO& zX+zW>+{yIU^GTFjdoQgG6eL{GJ}z(xW_=~1GjW;J9*B>M)tjP>!Wr`6Qos0uyCU|1QVh0baxLL5>^1>p1>xbgUVnIOxOYOGln{6Lk&a5=#B}8aWvMKkm z)(&Jbmr5%Vz(?(1!TXsSVepAXiByS$S~TV{eec2jMN-+ zy;a>Kjf@U@?1a5;#fs{#JVWkb4~&PX@gE$+_an6j*{O$tE@D?6V5gOzvSaohK(#dw zFd(%xKV|w@yCDlg%_d2)z&l8QSKH*DBZ;ct`Ozj)3A?gM8dgN95~{DVQRwT|;4iQz z24AtOXvM+j?Be!kW^!F9ea*AUOG%vv8QMguzEJ6x#6f1OSul+RXC+f+NVPRHBzYN0UdD!c z`{b1j$zp4vvW%9cSFoYm(=VMi8~mirG5ZEOvQ{!oY0wuIUeZ8a$yn-8p}3zE%KIKnUI?Q+N8Q*|c55QU&tLHiOCdcJ}qDGpaU+HBX=9vOOvPEd@)t5Lj z;L%H9rWd4?4)PG@8JZ$}OO`xv37nh;Gvv9K$OZlVEV+0Iw4}idIVCG_w>u^}>KzS^ zs~xJN$uZ5*>6qjAv15s2rQ>nOvyLr}J&r?;O(AOK_Yn=zI&LB*amBy%EPee z4~6<7XF7v7T;B7gKllhkMpqv}7|n8~p$+KMRj2$2!;B3*a6Cqni>PA?HYj+_b`p1| zw#>;d5{CRJP?fDQREkUhrEe8cdInh!b&aT8$3 ztLTWC%Z5Y>nR}VKn5`NcT+Gx(>^)&@a1m1%a$q4-7Q&uwPGwQLSj!Tn?dF^W|q&27kpoy`yHUzh*U~m{`pyLQgBdV#ByUpczBEz>pt@hTYf~vt8=r zY{a3>b{Xmp+>v&r@jCbC$Y+TEmV-zdq<3E3y`OimHpo76pscr)Zz4ajfJsMYyZL5Arst(W^X-wF?C`NKES8 z;51AVxb^CMpy!LYu)iT%<^Z*MI9lp9KxH84&Lc%$;Ze`~n}X;42-6>ULUscjG4u_F zrg_jz86QF7#Cf_RxR%NP@HZIdR5w7ZcifYvy%Vv!+@stHyI%3I4|-57ocA~8gq()DmKmVq%@rO)eg<**tsl**o@iEu zbtLys9_5+LArIo7kZ8zjnYxZ8w9h>9xBdqGzo=;xLV|%C!qgyc38$n)%2Es=N+dHg zV!|!v7oH&QxB-n7>z-mm-ar=)lon8G7q;Q}#(=z=w&QNlB)f{KEz~-S>BcXZ3rh5B zim8f-uwVyMUc%9PO$kfhS8N_DrRh*>J(>3$KA}o9iPW>j%5x;YliBz{gSNC-{+h&n zgAa->s=G*HmRl;tg<4aIVuNnuiuPWy%WAGJ(LX4L0%`sA-Mo@fwIf~>R!BR;Acm@< zHo=R)?JpT>o*G=wq9Na*WWLvc%31cwabDs&M`K=dZwX4DDWrI=q3`t)1IyqP?Bjmc zI10T&CGu97@S0cNLhHH(j@<&DmbJ(mz(BT&mMNZtl(_{f++Xquo$WkBtnlhHy&yvI z*Y70}7HAH!8?s{6tqcocsQv7uCD_j(sX=SY%gA(-uLUlb;o`rd0KtPK{ zGW6|;i{G#%@{6>Lb~K69{1W9wTE?~n7Y1HuPM!h+mjh!XmYR*5^aZ)ca_S0$oBeWBQNlg)RU!3AM7!s{?p0}0FK#) zLHdAxSE;g@T!@{Z_OTvyGaJd*4wi-(Mia@srD7RRYJCik6S|f$gvY}??Y&a+UXvkj zqa_)OCXqT@iZU?l0^FeevDA=v@fzbLc3QHCld1kk4ae>u&#(E)%WTC+-Qd+_075Hw zD7)D?G{MP6jAC<}bVTt)>dGHOYncpcR z9sqrVhs#V5>?%`VMgBfcvqCwBdAz*lAS3bvOnn1aDwN2Ok9+pt%j7rM6dHM*=^vJv zFPDS!DrAJ5a`9G+SzHcooRzyAhJuy6m;A)LCX|y6g7R9r)-u#R5IMD6-b1RNwG>SyJmLNd`yhYHzrhz(7qfJr@5 zt`cm}x0$XL$$@fQ7Koa9PTCD~dHHJmaLFh~02&!ndJGtcjdlCo$b$3zr-6N9-sm^X zIc34ah&b_3Dp;W&PTvvbo8gmGb%p#U-9$D@XcIuyH(3*9DkvPGka-g!bDwY-@V8sgIwutuf=^K9l}_kC$FPeS~i zKokxzdZe3-7lzh-%ry8s4>OowKF=3G7)uV zrsAZMa*-AFpn3;G3NDfgc&`0xg}et3QoPXB&R2-P<9x<|kLRdGbW0|b%9WJw{kUe) zNl&M@TqzzWvdkGhxl;Tiw?=*oXYgBC_i&}^m4XeD{=-VSfzBs>V@6=zL3l&@f#`>o zc;lg)^Q9{Ep^QBbSBjq!NAkjFrSer^LFO*X)Z=F>;g|xJ{IpX2G0MJ=Dn*gMT6(Qf z9MdDS2a}azE$^9V6|c&@=rRNAlXWTa%jY#McjXDGNW7XhzSx+h|Jq8G^Qa${b7<6T z_KzQyzwX>@&-J>dg$#W_Y<==QC5~`hd?= z%UEi_#}8z@v90r|M7!6A9f!wRgC1z3biKekqlve@1R|Nv;!61lVtHJZawL;PS70q_ zs?;NFD4*wU0IqcIK1ZFN%iz+>;IcH#QZ-e?TL9Yz&G4xSC^4@J3Y+&-vDEA;+|mh3 zc2p^S5|zhYRqzV{EVq7D71Y%4timIolEBGdUulS=qm&}o`S&9?@rRP5tmZhoEO_~2 z0=@FCw^Dp-3;{bd3Tp8v^JwfGrB@!$$Ey?#nOI}yPOHADisGH#aJ17^A;ANdFZ%au zpHzw0(t{zw!Qj+KiQO3sWsueL$^^Mrs635;K!{Y><*|sqYzR`A@b_Wt$bw1o9ke## zYUMa29%muZTng^jRf{b=_}cgz@k3PBDK0&IZ5j^OUH4)&e+RcndVe)8A3+N)Kwsna`{io9YG-JU zq-kbK`Uy@m69wo|Nj)Yd20y4a@Y=4I$1*my#D z7nxm>;Q>628)P+qo9E?p`URQ?LqAJh>8FQyTx+Au7>4_XeUB~n`kq)|0A99z@zQ|> z2EC$;J3VgPF&ppPzj)~znNFuR-_M61JjfO-XN#TMB0r~jcJb1U3k+o5Wos8NeSU#) m_wA9|X}-1K3}o>b!S^gcP~+)B!Zr6!zNaja+^1o5!0;$9coEFt*!Hbvk*kzUhR1 zzUS^Hsh#)t+ktz&-|zXJ@ArGYKTphCT#BM}WOnV#riZrYm1P5(vU2smtX{5kriaq` z@9Qx(^sL1HL>XUiY*-I`y@M0~+V$XHyVB@s?q)sBn^^DWUe>v$ z2XMCnTmh~CS9D!z-GUIrLu}q!R|~Cr*a0v{S>BjW{II=dor6G z$fvUDTs}RJV=bTl^eruh!d513Rc_yxPvN!$ne3p_k=&IWNay#l&!>ko+i1f%KfiHH zLUB%Xrn9Mmd?ve3xnm@sO{a3KV|!{~2ke3iKfdLN&owJ|d^w*Q$+J29_TkLH4%RCr zVY?4j?!YeYvlo&inqx{jr?9@%&Ry_CH>Brw7|Nj0O0Mcn<&`xfgXw`JOd;yMxco?R zXKF=$-!A2P;>Tx`ay|L)dU7ZoS9q|5yy1H4Qg&cVeylj)K4$dJ-Kq9CqpxzY=7 zr@&AVLXn%l4nwT_G8v^SIkHcYL8XvOo^_eLa%X1G$RJaC)Ay$kXLuC%aWs*amG*%F zC(KOA!AbcH>FkDd$6o1%1x9bmW?)&z`sOZWV=9|VXGWA|J*nM$5XzjASaGw)RK`}v z5<=}0AK8C$%__xi7Z17YqRaf2OWh(`xY5rpvWxuijIo7XQ~;d6>&MYz)@9!k01I|! z+0;Roy(j|Ae#F-tEn*!H=n3(WrN+c=Jtmg2QgD&IHev+>_IF%CA3j!4p|5(q*wwUK zkBc!#dB+7{9mrVXvA8hLf?+8!*w4818$@T9eadBp7z_IC?uZ0x2~d|o%QC4YNLo}~ z3e`j@Scm<@jlxowOHva^p)!f&G%SD{rKlB>?Mmy7pT>)T*osoFeHjmwrGNZlsBf4F&O?Ba5nD5n4!bC5m< zt(b$_=Ahf=pjHQp7XNczX$v>sbIj_Ki=__0JxQ_}H!=pqD2!cYsY4>$lxre4Y)9_4 zvCzH3{zK&SRMw*pijofOKtxT89AWkYk=USEzghJ$P)o6UMH{pKEpmGD>S3Hd7M~e= zLRx}!PkQW=E;HjHsmw@=$(y^8r)Is!Qg>D~>cb+`hj`o_DP79Nvp`Fnx$OUnOrP=0 zBc&$VyHBi(-&xhPJHE?&6f#D{Zq#8cBVxP7{=^=US;}HL!QBk0;Vto;u-}bL2WyNG z5iNe`(Q{M^zjcGr*dwCTye70;@Qko?o)Bl)ZN%Z?TOK_lEdDY_EnEC`TI_GSyQ^6U z*X17m??h4eQnEy`OiX{FM&C>R92MRcwl&?fs?buy-`4DQH`lq{=r(Q?vsb5{sKI)r z>Jj=unEJNn9ZT#LvzMnHt1gEvMOatG9`LOy9ICPS zd(zTd-IML);-G;Kf1jiB7nVuv$%=Q#kNT4c<};DlQ{@06YU-0>#{R2}rR-NXc==Tl zY~JM6pCb32^K#E3NDVUktjEC>!nsE}ox~E)YDx1;+Lz)ROPc2J_DQ-+(#LK?yqv;y zHZ!ydqa5sj#FkLRN#f)3WT2vjNKX?9JJhOD3DWK}jv^)Z`;22~ zSjP~-n|#z)ehN|c>gpvmd^Ix1mv~Ohvchqn@l$b;p}L4+l>wr=aE;%nVu=$%J&q$y z(tzh+fbe76NwC%23qPi7`Sau@_K;Wv-?{CcABGpX;p{6Y?Y_*YroxCgBDyS)D&#L{jS%+TH!e=G{}ZK zjm=`Vb?VQ4{u#0sM?lk$%ixe3mbl>RRd)j9JBhh%OnswPKk3Zv zlbG8lg_)_9No%P;mjkK(#@H#LzCg}pp;J!Y{;gJj9{m{Dfyh@9zYv5`KYo5eKR&gf zoL>-Un$VAtJm>E^6)k>LOY*q!i%KVcrZ%_(oq~$U{(?KE2)oij_U!$VB}?Lb?8coSs8ajGY0p(Rnt#9KhPzjjFXU;_VXw^*R`!UeH>u+QZ>! z@pl2^f`-bO4p;zM6Bjh|g8-gk2+aopduhO;q45$XMn6-xvzE`Q_u<3)*<7>ksGo1v zlLu+4jBDzf8g$^`gl4>{HS?E5XhNI8fN>snhl2K&usW$>c>1wSOg|pfCpCIQjBDrx z4)}`Jc-}WLwJ%7Fe)FNAF{xejqwOZ%)BxU=nA8egL487tLyOrQgraEi1QD8uu(eKq zNdSn$cxVf;MJj;5Mh=JSnGV?{wVF})KHMyW{ih&5N)dC6#yiP525Ed;Xx_^JZE{1&D+LC<1I{L*J<84SX}_$umHvhnhxOq4Ic+`9#dQ%1{1Gi zm*FVy*gJMA!fPFbyRc%Ak6k)8Hz>|av-vpA(0TQBIJ`XX+pgL(kz%oqXp87h^%&3; ziPn1a!#d-24amcz#s8=?TkGd9IhJ@s!`|$o!lxW6=gcdEX1t-Dq0KjtN>fI?G!=Iv zxAAdYxO5&52lKr;n%BM{N))j``WL=f&&SE_W`CH{@M__S20ZYv3F`(!6ozwJ8&l6| zWdc&_oJKKvO+$E_no8||}|{VF^uz#QzM$5k`6Eicuacgzzlu4!-@+PVhW z(7-m=MV)t;ugr>cf)5&k%c$j^3nR6n#RnUL8ql&^%?CqhP)Hq02)JR+EB#^ncdlsh zg$BE!#sagG5AX}*=od7+2h~r8y)q?!UpB4n;2E-T)QpBJlmo}+D2`1FdCHV|p0^t= zHTNZIsHO!BN<-NEMq72;n6VO zJ1bnF&4Q0GC!7bu7?~G)(G6#eyT$yU%+H0Xz4NwNYl(}WknbYd-Cqs!$0?UEYgOAx ze;d`#Bf2g7E*fInfn$lcv{_~9f5L{X&3X$Tgo7){*>7oGSU|fiVQYoogy~68c_|c{ zBLMkKl|Ac@7MDgaU+e+5xje!@lBs(aQ7TWg*_y%~5xgBuP{#w7$(ZS;f3}-hmX+R$ zq+0wyCcOCTLssdYPq5PBuK{_qf*b{MWXS65LbTiJXSC9jTIsRxX1;o8C|o=g@m~93 zYvJKYWm_w0rQ-7uZ)@Rb#2WJi3NJ=1`LqrcUUi_ao{bLek7fde*CQ5`edT+Z`+qo8 hHsZTbb!f;!BVGJGfS?n{_wTts{-aGLYw`c@@9!f(#y9`~ diff --git a/bin/SUBMIT.COM b/bin/SUBMIT.COM deleted file mode 100644 index 2e788827b2a45aea667092573f2263b67f9243f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1280 zcmbVMOK2Nc6n#%KPeBGx|AC4&ej`ttbd*wOk|=nPRj|^KLR^KUpG_Mxk;ayYJmZYV z`uHQu-INBhDqXa+gl2a29xys?v)EWAUQ*uqpOO&iVF=1E*Iy^l#W`aV+ zbjHed^&kF4+os2CYg{>QIL3tOLQc2vd8=ZSO9h&>E!VNjG+Ts(Jj9`gW9D7ksna9V z<+74BEX#Ijwro$Cd+7<&C_Iz1%JpXz8KJ?%Z6d!V-3>mA1m}dHBL;5}U;c(nCeNy0 zlMN{roCEwV$2S1q7n~>B8c^SJ>N}wB-===#)DJ*C#H-dhz6tnYNb%*LIsOUoBOL$A z@h^aPZcA*EsU);ce!c?VFZ4|^q-~PU*6PKGxbx`(Tot|jEZ80ZgONFMt4nPP@jE&=2%MFpANPIv5gYPA2KyQGuiOr8c|71<5`B4A zI;&Qsez>^@wsr*XkZ?`J1vUz>xDt)&vr<*BNolPHH!!~({w3l$e&_5Jo{q?05!e!N zU%R&%j}v^E#e*55H6(Z>ljsdeYa+G)iwJf~ZLq0d2Up1;xglK%M+sziX;_gea0k6% z64V3_)Id9aPrFX=b>16hOTxr#zJ~81F2M6D4sMuW6^oJmsllHu|`jC9jEbE6uwq?cZL z2z=-{=%I+BkU|FA#fN+0K1^AGK_H?ad+MRr*>|<)&cpe>^EWg|hr`^;SmQvJ9SI37E$JA6N z?XaaxR+^p8=~-q}kFc|QHe;7%{=PB@kp=OJhH|(riuHkN33wm z)TxRl(m_>vMB^N1$^gn(n0*c<>?w~u?3MdO@_84cTHYyhY%JVhpF+WF3H!Mh*F(19 zi7>GV)_X2S6|FT6U%BiLULq>vC)}t&^N~K$Sm*pDpo<_mkX{L-lIFTn8XeI(0X(wb Y+cM%=k)A5D2B>txs!Q>=Q276^zh*|>DF6Tf diff --git a/bin/s.com b/bin/s.com deleted file mode 100644 index c1c8170809604c4507130e854bb8cbfa54bcb12a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34688 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

FW=EWs1ygwT`HA-f>h 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

oaMT2@`@F@ud;da@{PWYzR3-h0Je_i zPhO$d)#9gb$&Ga@R@bf$ueeM1`DTQC7wXGbEsLxSW2XAl;Q4r|-ne-~Sf3i2syEi@ z%j+VIt0PU}8NN!-;=IZVotDAW27PsdzD$pVn`J))jJx#u@Uj)YYnDYKb&dQPsLk-z zs~Oa|Om7TtYLsaLC%k?`<7VGYO^t;7`tbU?`ptS>gyGR%>U}re6RvNrU)>l65pJX3 z`i5oojjNZf(`%Y)Ys2-7byIzPI3jQ{tl7bV=P?qK8;XDiXeFplZt(dUd?jBQ^);Vw zVN=7ZFep>Ee*Llt2*0d8448HLy1K~984jfS@CqW18bV#PGRR60LEidh%NxV>*saeu zocQXJWZ8-pVV5SGmqpeJsV>zUR@F7F1Ispq>z6gI#+GZsw7`aS;l?mAT#+#|Wkv=l zH3F);$ciw}$}|YWSNMDjun*#zz8VWKy@2BUGl<)n+G#^IOJxyrTBW{RI4ljigGJVm z)$2FZ)7FHMk*4)E_zZs5EL|CHY#<+9-g_@ek9|8qY~Tml8T!NulYV8M~rG@ z(h)acxf;WyKpU1dG%7ra9xnHxaW?eX&qL;$<)z*g_R>45PQWA(6gZ4zm2o_1KlB4X9AQ%*| zZ;(*T@R^aOb?c`2R_^xUzd~V{&z~b7{JE;(Z~waHrUjLY<}RvSc or = hl (buffer address) - jp c,decimal_continue ;borrow means bc > hl - jp z,decimal_continue ;z means bc = hl - ld hl,(current_value) ;return if de < buffer address (no borrow) - scf ;get value back from RAM variable - ccf - ret ;return with carry clear, value in hl -decimal_continue: ld a,(bc) ;next char in string (right to left) - sub 030h ;ASCII value of zero char - jp m,decimal_error ;error if char value less than 030h - cp 00ah ;error if byte value > or = 10 decimal - jp p,decimal_error ;a reg now has value of decimal numeral - ld hl,(value_pointer) ;get value to add an put in de - ld e,(hl) ;little-endian (low byte in low memory) - inc hl - ld d,(hl) - inc hl ;hl now points to next value - ld (value_pointer),hl - ld hl,(current_value) ;get back current value -decimal_add: dec a ;add loop to increase total value - jp m,decimal_add_done ;end of multiplication - add hl,de - jp decimal_add -decimal_add_done: ld (current_value),hl - jp decimal_next_char -decimal_error: scf - ret - jp decimal_add -decimal_place_value: defw 1,10,100,1000,10000 -; -;Memory dump -;Displays a 256-byte block of memory in 16-byte rows. -;Called with address of start of block in HL -memory_dump: ld (current_location),hl ;store address of block to be displayed - ld a,000h - ld (byte_count),a ;initialize byte count - ld (line_count),a ;initialize line count - jp dump_new_line -dump_next_byte: ld hl,(current_location) ;get byte address from storage, - ld a,(hl) ;get byte to be converted to string - inc hl ;increment address and - ld (current_location),hl ;store back - ld hl,buffer ;location to store string - call byte_to_hex_string ;convert - ld hl,buffer ;display string - call write_string - ld a,(byte_count) ;next byte - inc a - jp z,dump_done ;stop when 256 bytes displayed - ld (byte_count),a ;not finished yet, store - ld a,(line_count) ;end of line (16 characters)? - cp 00fh ;yes, start new line - jp z,dump_new_line - inc a ;no, increment line count - ld (line_count),a - ld a,020h ;print space - call write_char - jp dump_next_byte ;continue -dump_new_line: ld a,000h ;reset line count to zero - ld (line_count),a - call write_newline - ld hl,(current_location) ;location of start of line - ld a,h ;high byte of address - ld hl, buffer - call byte_to_hex_string ;convert - ld hl,buffer - call write_string ;write high byte - ld hl,(current_location) - ld a,l ;low byte of address - ld hl, buffer - call byte_to_hex_string ;convert - ld hl,buffer - call write_string ;write low byte - ld a,020h ;space - call write_char - jp dump_next_byte ;now write 16 bytes -dump_done: ld a,000h - ld hl,buffer - ld (hl),a ;clear buffer of last string - call write_newline - ret -; -;Memory load -;Loads RAM memory with bytes entered as hex characters -;Called with address to start loading in HL -;Displays entered data in 16-byte rows. -memory_load: ld (current_location),hl - ld hl,data_entry_msg - call write_string - jp load_new_line -load_next_char: call get_char - cp 00dh ;return? - jp z,load_done ;yes, quit - ld (buffer),a - call get_char - cp 00dh ;return? - jp z,load_done ;yes, quit - ld (buffer+1),a - ld hl,buffer - call hex_to_byte - jp c,load_data_entry_error ;non-hex character - ld hl,(current_location) ;get byte address from storage, - ld (hl),a ;store byte - inc hl ;increment address and - ld (current_location),hl ;store back - ld a,(buffer) - call write_char - ld a,(buffer+1) - call write_char - ld a,(line_count) ;end of line (16 characters)? - cp 00fh ;yes, start new line - jp z,load_new_line - inc a ;no, increment line count - ld (line_count),a - ld a,020h ;print space - call write_char - jp load_next_char ;continue -load_new_line: ld a,000h ;reset line count to zero - ld (line_count),a - call write_newline - jp load_next_char ;continue -load_data_entry_error: call write_newline - ld hl,data_error_msg - call write_string - ret -load_done: call write_newline - ret -; -;Get one ASCII character from the serial port. -;Returns with char in A reg. No error checking. -get_char: in a,(0x1F) ;get status - and 001h ;check RxRDY bit - jp z,get_char ;not ready, loop - in a,(0x1E) ;get char - ret -; -;Subroutine to start a new line -write_newline: ld a,00dh ;ASCII carriage return character - call write_char - ld a,00ah ;new line (line feed) character - call write_char - ret -; -;Subroutine to read one disk sector (128 bytes) -;Address to place data passed in HL -;LBA bits 0 to 7 passed in C, bits 8 to 15 passed in B -;LBA bits 16 to 23 passed in E -disk_read: -rd_status_loop_1: in a,(0fh) ;check status - and 80h ;check BSY bit - jp nz,rd_status_loop_1 ;loop until not busy -rd_status_loop_2: in a,(0fh) ;check status - and 40h ;check DRDY bit - jp z,rd_status_loop_2 ;loop until ready - ld a,01h ;number of sectors = 1 - out (0ah),a ;sector count register - ld a,c - out (0bh),a ;lba bits 0 - 7 - ld a,b - out (0ch),a ;lba bits 8 - 15 - ld a,e - out (0dh),a ;lba bits 16 - 23 - ld a,11100000b ;LBA mode, select drive 0 - out (0eh),a ;drive/head register - ld a,20h ;Read sector command - out (0fh),a -rd_wait_for_DRQ_set: in a,(0fh) ;read status - and 08h ;DRQ bit - jp z,rd_wait_for_DRQ_set ;loop until bit set -rd_wait_for_BSY_clear: in a,(0fh) - and 80h - jp nz,rd_wait_for_BSY_clear - in a,(0fh) ;clear INTRQ -read_loop: in a,(08h) ;get data - ld (hl),a - inc hl - in a,(0fh) ;check status - and 08h ;DRQ bit - jp nz,read_loop ;loop until cleared - ret -; -;Subroutine to write one disk sector (128 bytes) -;Address of data to write to disk passed in HL -;LBA bits 0 to 7 passed in C, bits 8 to 15 passed in B -;LBA bits 16 to 23 passed in E -disk_write: -wr_status_loop_1: in a,(0fh) ;check status - and 80h ;check BSY bit - jp nz,wr_status_loop_1 ;loop until not busy -wr_status_loop_2: in a,(0fh) ;check status - and 40h ;check DRDY bit - jp z,wr_status_loop_2 ;loop until ready - ld a,01h ;number of sectors = 1 - out (0ah),a ;sector count register - ld a,c - out (0bh),a ;lba bits 0 - 7 - ld a,b - out (0ch),a ;lba bits 8 - 15 - ld a,e - out (0dh),a ;lba bits 16 - 23 - ld a,11100000b ;LBA mode, select drive 0 - out (0eh),a ;drive/head register - ld a,30h ;Write sector command - out (0fh),a -wr_wait_for_DRQ_set: in a,(0fh) ;read status - and 08h ;DRQ bit - jp z,wr_wait_for_DRQ_set ;loop until bit set -write_loop: ld a,(hl) - out (08h),a ;write data - inc hl - in a,(0fh) ;read status - and 08h ;check DRQ bit - jp nz,write_loop ;write until bit cleared -wr_wait_for_BSY_clear: in a,(0fh) - and 80h - jp nz,wr_wait_for_BSY_clear - in a,(0fh) ;clear INTRQ - ret -; -;Strings used in subroutines -length_entry_string: defm "Enter length of file to load (decimal): ",0 -dump_entry_string: defm "Enter no. of bytes to dump (decimal): ",0 -LBA_entry_string: defm "Enter LBA (decimal, 0 to 65535): ",0 -erase_char_string: defm 008h,01bh,"[K",000h ;ANSI sequence for backspace, erase to end of line. -address_entry_msg: defm "Enter 4-digit hex address (use upper-case A through F): ",0 -address_error_msg: defm 13,10,"Error: invalid hex character, try again: ",0 -data_entry_msg: defm "Enter hex bytes, hit return when finished.",13,10,0 -data_error_msg: defm "Error: invalid hex byte.",13,10,0 -decimal_error_msg: defm 13,10,"Error: invalid decimal number, try again: ",0 -; -;Simple monitor program for CPUville Z80 computer with serial interface. - -monitor_start: call write_newline ;routine program return here to avoid re-initialization of port - ld a,03eh ;cursor symbol - call write_char - ld hl,buffer - call get_line ;get monitor input string (command) - call write_newline - call parse ;interprets command, returns with address to jump to in HL - jp (hl) -; -;Parses an input line stored in buffer for available commands as described in parse table. -;Returns with address of jump to action for the command in HL -parse: ld bc,parse_table ;bc is pointer to parse_table -parse_start: ld a,(bc) ;get pointer to match string from parse table - ld e,a - inc bc - ld a,(bc) - ld d,a ;de will is pointer to strings for matching - ld a,(de) ;get first char from match string - or 000h ;zero? - jp z,parser_exit ;yes, exit no_match - ld hl,buffer ;no, parse input string -match_loop: cp (hl) ;compare buffer char with match string char - jp nz,no_match ;no match, go to next match string - or 000h ;end of strings (zero)? - jp z,parser_exit ;yes, matching string found - inc de ;match so far, point to next char in match string - ld a,(de) ;get next character from match string - inc hl ;and point to next char in input string - jp match_loop ;check for match -no_match: inc bc ;skip over jump target to - inc bc - inc bc ;get address of next matching string - jp parse_start -parser_exit: inc bc ;skip to address of jump for match - ld a,(bc) - ld l,a - inc bc - ld a,(bc) - ld h,a ;returns with jump address in hl - ret -; -;Actions to be taken on match -; -;Memory dump program -;Input 4-digit hexadecimal address -;Calls memory_dump subroutine -dump_jump: ld hl,dump_message ;Display greeting - call write_string - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry ;returns with address in HL - call write_newline - call memory_dump - jp monitor_start -; -;Hex loader, displays formatted input -load_jump: ld hl,load_message ;Display greeting - call write_string ;get address to load - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry - call write_newline - call memory_load - jp monitor_start -; -;Jump and run do the same thing: get an address and jump to it. -run_jump: ld hl,run_message ;Display greeting - call write_string - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry - jp (hl) -; -;Help and ? do the same thing, display the available commands -help_jump: ld hl,help_message - call write_string - ld bc,parse_table ;table with pointers to command strings -help_loop: ld a,(bc) ;displays the strings for matching commands, - ld l,a ;getting the string addresses from the - inc bc ;parse table - ld a,(bc) ;pass address of string to hl through a reg - ld h,a - ld a,(hl) ;hl now points to start of match string - or 000h ;exit if no_match string - jp z,help_done - push bc ;write_char uses b register - ld a,020h ;space char - call write_char - pop bc - call write_string ;writes match string - inc bc ;pass over jump address in table - inc bc - inc bc - jp help_loop -help_done: jp monitor_start -; -;Binary file load. Need both address to load and length of file -bload_jump: ld hl,bload_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,length_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld hl,bload_ready_message - call write_string - pop hl - call bload - jp monitor_start -; -;Binary memory dump. Need address of start of dump and no. bytes -bdump_jump: ld hl,bdump_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,dump_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld hl,bdump_ready_message - call write_string - call get_char - pop hl - call bdump - jp monitor_start -;Disk read. Need memory address to place data, LBA of sector to read -diskrd_jump: ld hl,diskrd_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,LBA_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld e,00h - pop hl - call disk_read - jp monitor_start -diskwr_jump: ld hl,diskwr_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,LBA_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld e,00h - pop hl - call disk_write - jp monitor_start -exit_jump: jp 0000h ; Exit CP/M -;Prints message for no match to entered command -no_match_jump: ld hl,no_match_message - call write_string - ld hl, buffer - call write_string - jp monitor_start -; -;Monitor data structures: -; -monitor_message: defm 13,10,"ROM ver. 8",13,10,0 -no_match_message: defm "? ",0 -help_message: defm "Commands implemented:",13,10,0 -dump_message: defm "Displays a 256-byte block of memory.",13,10,0 -load_message: defm "Enter hex bytes starting at memory location.",13,10,0 -run_message: defm "Will jump to (execute) program at address entered.",13,10,0 -bload_message: defm "Loads a binary file into memory.",13,10,0 -bload_ready_message: defm 13,10,"Ready to receive, start transfer.",0 -bdump_message: defm "Dumps binary data from memory to serial port.",13,10,0 -bdump_ready_message: defm 13,10,"Ready to send, hit any key to start.",0 -diskrd_message: defm "Reads one sector from disk to memory.",13,10,0 -diskwr_message: defm "Writes one sector from memory to disk.",13,10,0 -;Strings for matching: -dump_string: defm "dump",0 -load_string: defm "load",0 -jump_string: defm "jump",0 -run_string: defm "run",0 -question_string: defm "?",0 -help_string: defm "help",0 -bload_string: defm "bload",0 -bdump_string: defm "bdump",0 -diskrd_string: defm "diskrd",0 -diskwr_string: defm "diskwr",0 -exit_string: defm "exit",0 -no_match_string: defm 0,0 -;Table for matching strings to jumps -parse_table: defw dump_string,dump_jump,load_string,load_jump - defw jump_string,run_jump,run_string,run_jump - defw question_string,help_jump,help_string,help_jump - defw bload_string,bload_jump,bdump_string,bdump_jump - defw diskrd_string,diskrd_jump,diskwr_string,diskwr_jump - defw exit_string,exit_jump - defw no_match_string,no_match_jump -code_end: - end - - diff --git a/src/loader.z80 b/src/loader.z80 deleted file mode 100644 index acbb2ed..0000000 --- a/src/loader.z80 +++ /dev/null @@ -1,30 +0,0 @@ -;Retrieves CP/M from disk and loads it in memory starting at E400h -;Uses calls to ROM subroutine for disk read. -;Reads track 0, sectors 2 to 26, then track 1, sectors 1 to 25 -;This program is loaded into LBA sector 0 of disk, read to loc. 0800h by ROM disk_read subroutine, and executed. - -#target bin -#code _HOME, 0x1100 - -hstbuf equ 0x1200 ;will put 256-byte raw sector here -disk_read equ 0x0296 ;subroutine in 2K ROM -cpm equ 0xFA00 ;CP/M cold start entry in BIOS - -main: - ld c,1 ;LBA bits 0 to 7 - ld b,0 ;LBA bits 8 to 15 - ld e,0 ;LBA bits 16 to 23 - ld hl,0xE400 ; Memory address -- start of CCP - -loop: - call disk_read ;subroutine in ROM - ld a,c - cp 50 - jp z,done - inc a - ld c,a - jp loop - -done: - out (1),a ;switch memory config to all-RAM - jp cpm ;to BIOS cold start entry diff --git a/src/putsys.z80 b/src/putsys.z80 deleted file mode 100644 index de68318..0000000 --- a/src/putsys.z80 +++ /dev/null @@ -1,56 +0,0 @@ -;Copies the memory image of CP/M loaded at E400h onto tracks 0 and 1 of the first CP/M disk -;Load and run from ROM monitor -;Uses calls to BIOS, in memory at FA00h -;Writes track 0, sectors 2 to 26, then track 1, sectors 1 to 25 - -#target bin -#code _HOME, 0x1400 - -_bios equ (0x4A00+0xB000) -seldsk equ _bios+0x1b -settrk equ _bios+0x1e -setsec equ _bios+0x21 -setdma equ _bios+0x24 -write equ _bios+0x2a - -monitor_warm_start equ 0x0433 ;Return to ROM monitor - -main: - ld c,00h ;CP/M disk a - call seldsk - -;Write track 0, sectors 2 to 51 - ld a,1 ;starting sector - ld (sector),a - ld hl, 0x6400 ;start of CCP - ld (address),hl - ld c,0 ;CP/M track - call settrk - -wr_trk_0_loop: - ld a,(sector) - ld c,a ;CP/M sector - call setsec - ld bc,(address) ;memory location - call setdma - call write - ld a,(sector) - cp 50 ;done: - jp z,done ;yes - inc a ;no, next sector - ld (sector),a - ld hl,(address) - ld de,128 - add hl,de - ld (address),hl - jp wr_trk_0_loop - -done: - jp 0x0000 - -sector: - db 00h - -address: - dw 0000h - end diff --git a/src/ram_monitor.z80 b/src/ram_monitor.z80 deleted file mode 100644 index c07a671..0000000 --- a/src/ram_monitor.z80 +++ /dev/null @@ -1,687 +0,0 @@ -;RAM monitor for a system with serial interface and IDE disk and memory expansion board. -;This program to be loaded at DC00h by ROM monitor, and run from there. -;Assumes serial port has been initialized by ROM monitor. -;Assumes the UART data port address is 02h and control/status address is 03h -; -;The subroutines use these variables in RAM, same area as ROM monitor: -current_location: equ 0x1300 ;word variable in RAM -line_count: equ 0x1302 ;byte variable in RAM -byte_count: equ 0x1303 ;byte variable in RAM -value_pointer: equ 0x1304 ;word variable in RAM -current_value: equ 0x1306 ;word variable in RAM -buffer: equ 0x1308 ;buffer in RAM -- up to stack area -;Can use same stack as ROM monitor. Stack not re-initialized, listed here for information -;ROM_monitor_stack: equ 0x13ff ;upper TPA in RAM, below RAM monitor -; -; - org 01400h - out (1),a ;change memory configuration to all-RAM - jp monitor_start -; -;Puts a single char (byte value) on serial output -;Call with char to send in A register. Uses B register -write_char: ld b,a ;store char -write_char_loop: in a,(3) ;check if OK to send - and 001h ;check TxRDY bit - jp z,write_char_loop ;loop if not set - ld a,b ;get char back - out (2),a ;send to output - ret ;returns with char in a -; -;Subroutine to write a zero-terminated string to serial output -;Pass address of string in HL register -;No error checking -write_string: in a,(3) ;read status - and 001h ;check TxRDY bit - jp z,write_string ;loop if not set - ld a,(hl) ;get char from string - and a ;check if 0 - ret z ;yes, finished - out (2),a ;no, write char to output - inc hl ;next char in string - jp write_string ;start over -; -;Binary loader. Receive a binary file, place in memory. -;Address of load passed in HL, length of load (= file length) in BC -bload: in a,(0x1F) ;get status - and 001h ;check RxRDY bit - jp z,bload ;not ready, loop - in a,(0x1E) - ld (hl),a - inc hl - dec bc ;byte counter - ld a,b ;need to test BC this way because - or c ;dec rp instruction does not change flags - jp nz,bload - ret -; -;Binary dump to port. Send a stream of binary data from memory to serial output -;Address of dump passed in HL, length of dump in BC -bdump: in a,(3) ;get status - and 001h ;check TxRDY bit - jp z,bdump ;not ready, loop - ld a,(hl) - out (2),a - inc hl - dec bc - ld a,b ;need to test this way because - or c ;dec rp instruction does not change flags - jp nz,bdump - ret -; -;Subroutine to get a string from serial input, place in buffer. -;Buffer address passed in HL reg. -;Uses A,BC,DE,HL registers (including calls to other subroutines). -;Line entry ends by hitting return key. Return char not included in string (replaced by zero). -;Backspace editing OK. No error checking. -; -get_line: ld c,000h ;line position - ld a,h ;put original buffer address in de - ld d,a ;after this don't need to preserve hl - ld a,l ;subroutines called don't use de - ld e,a -get_line_next_char: in a,(0x1F) ;get status - and 001h ;check RxRDY bit - jp z,get_line_next_char ;not ready, loop - in a,(0x1E) ;get char - cp 00dh ;check if return - ret z ;yes, normal exit - cp 07fh ;check if backspace (VT102 keys) - jp z,get_line_backspace ;yes, jump to backspace routine - cp 008h ;check if backspace (ANSI keys) - jp z,get_line_backspace ;yes, jump to backspace - call write_char ;put char on screen - ld (de),a ;store char in buffer - inc de ;point to next space in buffer - inc c ;inc counter - ld a,000h - ld (de),a ;leaves a zero-terminated string in buffer - jp get_line_next_char -get_line_backspace: ld a,c ;check current position in line - cp 000h ;at beginning of line? - jp z,get_line_next_char ;yes, ignore backspace, get next char - dec de ;no, erase char from buffer - dec c ;back up one - ld a,000h ;put a zero in buffer where the last char was - ld (de),a - ld hl,erase_char_string ;ANSI sequence to delete one char from line - call write_string ;transmits sequence to backspace and erase char - jp get_line_next_char -; -;Creates a two-char hex string from the byte value passed in register A -;Location to place string passed in HL -;String is zero-terminated, stored in 3 locations starting at HL -;Also uses registers b,d, and e -byte_to_hex_string: ld b,a ;store original byte - srl a ;shift right 4 times, putting - srl a ;high nybble in low-nybble spot - srl a ;and zeros in high-nybble spot - srl a - ld d,000h ;prepare for 16-bit addition - ld e,a ;de contains offset - push hl ;temporarily store string target address - ld hl,hex_char_table ;use char table to get high-nybble character - add hl,de ;add offset to start of table - ld a,(hl) ;get char - pop hl ;get string target address - ld (hl),a ;store first char of string - inc hl ;point to next string target address - ld a,b ;get original byte back from reg b - and 00fh ;mask off high-nybble - ld e,a ;d still has 000h, now de has offset - push hl ;temp store string target address - ld hl,hex_char_table ;start of table - add hl,de ;add offset - ld a,(hl) ;get char - pop hl ;get string target address - ld (hl),a ;store second char of string - inc hl ;point to third location - ld a,000h ;zero to terminate string - ld (hl),a ;store the zero - ret ;done -; -;Converts a single ASCII hex char to a nybble value -;Pass char in reg A. Letter numerals must be upper case. -;Return nybble value in low-order reg A with zeros in high-order nybble if no error. -;Return 0ffh in reg A if error (char not a valid hex numeral). -;Also uses b, c, and hl registers. -hex_char_to_nybble: ld hl,hex_char_table - ld b,00fh ;no. of valid characters in table - 1. - ld c,000h ;will be nybble value -hex_to_nybble_loop: cp (hl) ;character match here? - jp z,hex_to_nybble_ok ;match found, exit - dec b ;no match, check if at end of table - jp m,hex_to_nybble_err ;table limit exceded, exit with error - inc c ;still inside table, continue search - inc hl - jp hex_to_nybble_loop -hex_to_nybble_ok: ld a,c ;put nybble value in a - ret -hex_to_nybble_err: ld a,0ffh ;error value - ret -; -;Converts a hex character pair to a byte value -;Called with location of high-order char in HL -;If no error carry flag clear, returns with byte value in register A, and -;HL pointing to next mem location after char pair. -;If error (non-hex char) carry flag set, HL pointing to invalid char -hex_to_byte: ld a,(hl) ;location of character pair - push hl ;store hl (hex_char_to_nybble uses it) - call hex_char_to_nybble - pop hl ;returns with nybble value in a reg, or 0ffh if error - cp 0ffh ;non-hex character? - jp z,hex_to_byte_err ;yes, exit with error - sla a ;no, move low order nybble to high side - sla a - sla a - sla a - ld d,a ;store high-nybble - inc hl ;get next character of the pair - ld a,(hl) - push hl ;store hl - call hex_char_to_nybble - pop hl - cp 0ffh ;non-hex character? - jp z,hex_to_byte_err ;yes, exit with error - or d ;no, combine with high-nybble - inc hl ;point to next memory location after char pair - scf - ccf ;no-error exit (carry = 0) - ret -hex_to_byte_err: scf ;error, carry flag set - ret -hex_char_table: defm "0123456789ABCDEF" ;ASCII hex table -; -;Subroutine to get a two-byte address from serial input. -;Returns with address value in HL -;Uses locations in RAM for buffer and variables -address_entry: ld hl,buffer ;location for entered string - call get_line ;returns with address string in buffer - ld hl,buffer ;location of stored address entry string - call hex_to_byte ;will get high-order byte first - jp c, address_entry_error ;if error, jump - ld (current_location+1),a ;store high-order byte, little-endian - ld hl,buffer+2 ;point to low-order hex char pair - call hex_to_byte ;get low-order byte - jp c, address_entry_error ;jump if error - ld (current_location),a ;store low-order byte in lower memory - ld hl,(current_location) ;put memory address in hl - ret -address_entry_error: ld hl,address_error_msg - call write_string - jp address_entry -; -;Subroutine to get a decimal string, return a word value -;Calls decimal_string_to_word subroutine -decimal_entry: ld hl,buffer - call get_line ;returns with DE pointing to terminating zero - ld hl,buffer - call decimal_string_to_word - ret nc ;no error, return with word in hl - ld hl,decimal_error_msg ;error, try again - call write_string - jp decimal_entry -; -;Subroutine to convert a decimal string to a word value -;Call with address of string in HL, pointer to end of string in DE -;Carry flag set if error (non-decimal char) -;Carry flag clear, word value in HL if no error. -decimal_string_to_word: ld b,d - ld c,e ;use BC as string pointer - ld (current_location),hl ;store addr. of start of buffer in RAM word variable - ld hl,000h ;starting value zero - ld (current_value),hl - ld hl,decimal_place_value ;pointer to values - ld (value_pointer),hl -decimal_next_char: dec bc ;next char in string (moving right to left) - ld hl,(current_location) ;check if at end of decimal string - scf ;get ready to subtract de from buffer addr. - ccf ;set carry to zero (clear) - sbc hl,bc ;keep going if bc > or = hl (buffer address) - jp c,decimal_continue ;borrow means bc > hl - jp z,decimal_continue ;z means bc = hl - ld hl,(current_value) ;return if de < buffer address (no borrow) - scf ;get value back from RAM variable - ccf - ret ;return with carry clear, value in hl -decimal_continue: ld a,(bc) ;next char in string (right to left) - sub 030h ;ASCII value of zero char - jp m,decimal_error ;error if char value less than 030h - cp 00ah ;error if byte value > or = 10 decimal - jp p,decimal_error ;a reg now has value of decimal numeral - ld hl,(value_pointer) ;get value to add an put in de - ld e,(hl) ;little-endian (low byte in low memory) - inc hl - ld d,(hl) - inc hl ;hl now points to next value - ld (value_pointer),hl - ld hl,(current_value) ;get back current value -decimal_add: dec a ;add loop to increase total value - jp m,decimal_add_done ;end of multiplication - add hl,de - jp decimal_add -decimal_add_done: ld (current_value),hl - jp decimal_next_char -decimal_error: scf - ret - jp decimal_add -decimal_place_value: defw 1,10,100,1000,10000 -; -;Memory dump -;Displays a 256-byte block of memory in 16-byte rows. -;Called with address of start of block in HL -memory_dump: ld (current_location),hl ;store address of block to be displayed - ld a,000h - ld (byte_count),a ;initialize byte count - ld (line_count),a ;initialize line count - jp dump_new_line -dump_next_byte: ld hl,(current_location) ;get byte address from storage, - ld a,(hl) ;get byte to be converted to string - inc hl ;increment address and - ld (current_location),hl ;store back - ld hl,buffer ;location to store string - call byte_to_hex_string ;convert - ld hl,buffer ;display string - call write_string - ld a,(byte_count) ;next byte - inc a - jp z,dump_done ;stop when 256 bytes displayed - ld (byte_count),a ;not finished yet, store - ld a,(line_count) ;end of line (16 characters)? - cp 00fh ;yes, start new line - jp z,dump_new_line - inc a ;no, increment line count - ld (line_count),a - ld a,020h ;print space - call write_char - jp dump_next_byte ;continue -dump_new_line: ld a,000h ;reset line count to zero - ld (line_count),a - call write_newline - ld hl,(current_location) ;location of start of line - ld a,h ;high byte of address - ld hl, buffer - call byte_to_hex_string ;convert - ld hl,buffer - call write_string ;write high byte - ld hl,(current_location) - ld a,l ;low byte of address - ld hl, buffer - call byte_to_hex_string ;convert - ld hl,buffer - call write_string ;write low byte - ld a,020h ;space - call write_char - jp dump_next_byte ;now write 16 bytes -dump_done: ld a,000h - ld hl,buffer - ld (hl),a ;clear buffer of last string - call write_newline - ret -; -;Memory load -;Loads RAM memory with bytes entered as hex characters -;Called with address to start loading in HL -;Displays entered data in 16-byte rows. -memory_load: ld (current_location),hl - ld hl,data_entry_msg - call write_string - jp load_new_line -load_next_char: call get_char - cp 00dh ;return? - jp z,load_done ;yes, quit - ld (buffer),a - call get_char - cp 00dh ;return? - jp z,load_done ;yes, quit - ld (buffer+1),a - ld hl,buffer - call hex_to_byte - jp c,load_data_entry_error ;non-hex character - ld hl,(current_location) ;get byte address from storage, - ld (hl),a ;store byte - inc hl ;increment address and - ld (current_location),hl ;store back - ld a,(buffer) - call write_char - ld a,(buffer+1) - call write_char - ld a,(line_count) ;end of line (16 characters)? - cp 00fh ;yes, start new line - jp z,load_new_line - inc a ;no, increment line count - ld (line_count),a - ld a,020h ;print space - call write_char - jp load_next_char ;continue -load_new_line: ld a,000h ;reset line count to zero - ld (line_count),a - call write_newline - jp load_next_char ;continue -load_data_entry_error: call write_newline - ld hl,data_error_msg - call write_string - ret -load_done: call write_newline - ret -; -;Get one ASCII character from the serial port. -;Returns with char in A reg. No error checking. -get_char: in a,(0x1F) ;get status - and 001h ;check RxRDY bit - jp z,get_char ;not ready, loop - in a,(0x1E) ;get char - ret -; -;Subroutine to start a new line -write_newline: ld a,00dh ;ASCII carriage return character - call write_char - ld a,00ah ;new line (line feed) character - call write_char - ret -; -;Subroutine to read one disk sector (128 bytes) -;Address to place data passed in HL -;LBA bits 0 to 7 passed in C, bits 8 to 15 passed in B -;LBA bits 16 to 23 passed in E -disk_read: -rd_status_loop_1: in a,(0fh) ;check status - and 80h ;check BSY bit - jp nz,rd_status_loop_1 ;loop until not busy -rd_status_loop_2: in a,(0fh) ;check status - and 40h ;check DRDY bit - jp z,rd_status_loop_2 ;loop until ready - ld a,01h ;number of sectors = 1 - out (0ah),a ;sector count register - ld a,c - out (0bh),a ;lba bits 0 - 7 - ld a,b - out (0ch),a ;lba bits 8 - 15 - ld a,e - out (0dh),a ;lba bits 16 - 23 - ld a,11100000b ;LBA mode, select drive 0 - out (0eh),a ;drive/head register - ld a,20h ;Read sector command - out (0fh),a -rd_wait_for_DRQ_set: in a,(0fh) ;read status - and 08h ;DRQ bit - jp z,rd_wait_for_DRQ_set ;loop until bit set -rd_wait_for_BSY_clear: in a,(0fh) - and 80h - jp nz,rd_wait_for_BSY_clear - in a,(0fh) ;clear INTRQ -read_loop: in a,(08h) ;get data - ld (hl),a - inc hl - in a,(0fh) ;check status - and 08h ;DRQ bit - jp nz,read_loop ;loop until cleared - ret -; -;Subroutine to write one disk sector (128 bytes) -;Address of data to write to disk passed in HL -;LBA bits 0 to 7 passed in C, bits 8 to 15 passed in B -;LBA bits 16 to 23 passed in E -disk_write: -wr_status_loop_1: in a,(0fh) ;check status - and 80h ;check BSY bit - jp nz,wr_status_loop_1 ;loop until not busy -wr_status_loop_2: in a,(0fh) ;check status - and 40h ;check DRDY bit - jp z,wr_status_loop_2 ;loop until ready - ld a,01h ;number of sectors = 1 - out (0ah),a ;sector count register - ld a,c - out (0bh),a ;lba bits 0 - 7 - ld a,b - out (0ch),a ;lba bits 8 - 15 - ld a,e - out (0dh),a ;lba bits 16 - 23 - ld a,11100000b ;LBA mode, select drive 0 - out (0eh),a ;drive/head register - ld a,30h ;Write sector command - out (0fh),a -wr_wait_for_DRQ_set: in a,(0fh) ;read status - and 08h ;DRQ bit - jp z,wr_wait_for_DRQ_set ;loop until bit set -write_loop: ld a,(hl) - out (08h),a ;write data - inc hl - in a,(0fh) ;read status - and 08h ;check DRQ bit - jp nz,write_loop ;write until bit cleared -wr_wait_for_BSY_clear: in a,(0fh) - and 80h - jp nz,wr_wait_for_BSY_clear - in a,(0fh) ;clear INTRQ - ret -; -;Strings used in subroutines -length_entry_string: defm "Enter length of file to load (decimal): ",0 -dump_entry_string: defm "Enter no. of bytes to dump (decimal): ",0 -LBA_entry_string: defm "Enter LBA (decimal, 0 to 65535): ",0 -erase_char_string: defm 008h,01bh,"[K",000h ;ANSI sequence for backspace, erase to end of line. -address_entry_msg: defm "Enter 4-digit hex address (use upper-case A through F): ",0 -address_error_msg: defm 13,10,"Error: invalid hex character, try again: ",0 -data_entry_msg: defm "Enter hex bytes, hit return when finished.",13,10,0 -data_error_msg: defm "Error: invalid hex byte.",13,10,0 -decimal_error_msg: defm 13,10,"Error: invalid decimal number, try again: ",0 -; -;Simple monitor program for CPUville Z80 computer with serial interface. - -monitor_start: call write_newline ;routine program return here to avoid re-initialization of port - ld a,03eh ;cursor symbol - call write_char - ld hl,buffer - call get_line ;get monitor input string (command) - call write_newline - call parse ;interprets command, returns with address to jump to in HL - jp (hl) -; -;Parses an input line stored in buffer for available commands as described in parse table. -;Returns with address of jump to action for the command in HL -parse: ld bc,parse_table ;bc is pointer to parse_table -parse_start: ld a,(bc) ;get pointer to match string from parse table - ld e,a - inc bc - ld a,(bc) - ld d,a ;de will is pointer to strings for matching - ld a,(de) ;get first char from match string - or 000h ;zero? - jp z,parser_exit ;yes, exit no_match - ld hl,buffer ;no, parse input string -match_loop: cp (hl) ;compare buffer char with match string char - jp nz,no_match ;no match, go to next match string - or 000h ;end of strings (zero)? - jp z,parser_exit ;yes, matching string found - inc de ;match so far, point to next char in match string - ld a,(de) ;get next character from match string - inc hl ;and point to next char in input string - jp match_loop ;check for match -no_match: inc bc ;skip over jump target to - inc bc - inc bc ;get address of next matching string - jp parse_start -parser_exit: inc bc ;skip to address of jump for match - ld a,(bc) - ld l,a - inc bc - ld a,(bc) - ld h,a ;returns with jump address in hl - ret -; -;Actions to be taken on match -; -;Memory dump program -;Input 4-digit hexadecimal address -;Calls memory_dump subroutine -dump_jump: ld hl,dump_message ;Display greeting - call write_string - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry ;returns with address in HL - call write_newline - call memory_dump - jp monitor_start -; -;Hex loader, displays formatted input -load_jump: ld hl,load_message ;Display greeting - call write_string ;get address to load - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry - call write_newline - call memory_load - jp monitor_start -; -;Jump and run do the same thing: get an address and jump to it. -run_jump: ld hl,run_message ;Display greeting - call write_string - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry - jp (hl) -; -;Help and ? do the same thing, display the available commands -help_jump: ld hl,help_message - call write_string - ld bc,parse_table ;table with pointers to command strings -help_loop: ld a,(bc) ;displays the strings for matching commands, - ld l,a ;getting the string addresses from the - inc bc ;parse table - ld a,(bc) ;pass address of string to hl through a reg - ld h,a - ld a,(hl) ;hl now points to start of match string - or 000h ;exit if no_match string - jp z,help_done - push bc ;write_char uses b register - ld a,020h ;space char - call write_char - pop bc - call write_string ;writes match string - inc bc ;pass over jump address in table - inc bc - inc bc - jp help_loop -help_done: jp monitor_start -; -;Binary file load. Need both address to load and length of file -bload_jump: ld hl,bload_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,length_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld hl,bload_ready_message - call write_string - pop hl - call bload - jp monitor_start -; -;Binary memory dump. Need address of start of dump and no. bytes -bdump_jump: ld hl,bdump_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,dump_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld hl,bdump_ready_message - call write_string - call get_char - pop hl - call bdump - jp monitor_start -;Disk read. Need memory address to place data, LBA of sector to read -diskrd_jump: ld hl,diskrd_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,LBA_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld e,00h - pop hl - call disk_read - jp monitor_start -diskwr_jump: ld hl,diskwr_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,LBA_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld e,00h - pop hl - call disk_write - jp monitor_start -boot_jump: ld hl,1100h - ld bc,0000h - ld e,00h - call disk_read - out (0),a ;CP/M loader uses ROM routine to read disk - jp 1100h -;Prints message for no match to entered command -no_match_jump: ld hl,no_match_message - call write_string - ld hl, buffer - call write_string - jp monitor_start -; -;Monitor data structures: -; -monitor_message: defm 13,10,"ROM ver. 8",13,10,0 -no_match_message: defm "? ",0 -help_message: defm "Commands implemented:",13,10,0 -dump_message: defm "Displays a 256-byte block of memory.",13,10,0 -load_message: defm "Enter hex bytes starting at memory location.",13,10,0 -run_message: defm "Will jump to (execute) program at address entered.",13,10,0 -bload_message: defm "Loads a binary file into memory.",13,10,0 -bload_ready_message: defm 13,10,"Ready to receive, start transfer.",0 -bdump_message: defm "Dumps binary data from memory to serial port.",13,10,0 -bdump_ready_message: defm 13,10,"Ready to send, hit any key to start.",0 -diskrd_message: defm "Reads one sector from disk to memory.",13,10,0 -diskwr_message: defm "Writes one sector from memory to disk.",13,10,0 -;Strings for matching: -dump_string: defm "dump",0 -load_string: defm "load",0 -jump_string: defm "jump",0 -run_string: defm "run",0 -question_string: defm "?",0 -help_string: defm "help",0 -bload_string: defm "bload",0 -bdump_string: defm "bdump",0 -diskrd_string: defm "diskrd",0 -diskwr_string: defm "diskwr",0 -boot_string: defm "boot",0 -no_match_string: defm 0,0 -;Table for matching strings to jumps -parse_table: defw dump_string,dump_jump,load_string,load_jump - defw jump_string,run_jump,run_string,run_jump - defw question_string,help_jump,help_string,help_jump - defw bload_string,bload_jump,bdump_string,bdump_jump - defw diskrd_string,diskrd_jump,diskwr_string,diskwr_jump - defw boot_string,boot_jump - defw no_match_string,no_match_jump - diff --git a/src/rom_monitor.z80 b/src/rom_monitor.z80 deleted file mode 100644 index 3f8ac2b..0000000 --- a/src/rom_monitor.z80 +++ /dev/null @@ -1,675 +0,0 @@ -;ROM monitor for a system with serial interface and IDE disk and memory expansion board. -;The disk extension board has 64K RAM -- computer board memory decoder disabled (J2 off). -;The disk extension board uses ports 2 and 3 for the serial interface, and 8 to 15 for the disk -;Therefore the computer board I/O decoder is also disabled (J1 off) -;Output to port 0 will cause memory configuration flip-flop to activate 2K ROM 0000-07FF with 62K RAM 0800-FFFF -;Output to port 1 will cause memory configuration flip-flop to activate all RAM 0000-FFFF -; - org 00000h - jp monitor_cold_start -; -;The following code is for a system with a serial port. -;Assumes the UART data port address is 02h and control/status address is 03h -; -;The subroutines for the serial port use these variables in RAM: -current_location: equ 0x1000 ;word variable in RAM -line_count: equ 0x1002 ;byte variable in RAM -byte_count: equ 0x1003 ;byte variable in RAM -value_pointer: equ 0x1004 ;word variable in RAM -current_value: equ 0x1006 ;word variable in RAM -buffer: equ 0x1008 ;buffer in RAM -- up to stack area -;Need to have stack in upper RAM, but not in area of CP/M or RAM monitor. -ROM_monitor_stack: equ 0x10ff ;upper TPA in RAM, below RAM monitor -; -;Subroutine to initialize serial port UART -;Needs to be called only once after computer comes out of reset. -;If called while port is active will cause port to fail. -;16x = 9600 baud -initialize_port: ld a,04eh ;1 stop bit, no parity, 8-bit char, 16x baud - out (3),a ;write to control port - ld a,037h ;enable receive and transmit - out (3),a ;write to control port - out (3),a ;write to control port - ret -; -;Puts a single char (byte value) on serial output -;Call with char to send in A register. Uses B register -write_char: ld b,a ;store char -write_char_loop: in a,(3) ;check if OK to send - and 001h ;check TxRDY bit - jp z,write_char_loop ;loop if not set - ld a,b ;get char back - out (2),a ;send to output - ret ;returns with char in a -; -;Subroutine to write a zero-terminated string to serial output -;Pass address of string in HL register -;No error checking -write_string: in a,(3) ;read status - and 001h ;check TxRDY bit - jp z,write_string ;loop if not set - ld a,(hl) ;get char from string - and a ;check if 0 - ret z ;yes, finished - out (2),a ;no, write char to output - inc hl ;next char in string - jp write_string ;start over -; -;Binary loader. Receive a binary file, place in memory. -;Address of load passed in HL, length of load (= file length) in BC -bload: in a,(0x1F) ;get status - and 001h ;check RxRDY bit - jp z,bload ;not ready, loop - in a,(0x1E) - ld (hl),a - inc hl - dec bc ;byte counter - ld a,b ;need to test BC this way because - or c ;dec rp instruction does not change flags - jp nz,bload - ret -; -;Binary dump to port. Send a stream of binary data from memory to serial output -;Address of dump passed in HL, length of dump in BC -bdump: in a,(3) ;get status - and 001h ;check TxRDY bit - jp z,bdump ;not ready, loop - ld a,(hl) - out (2),a - inc hl - dec bc - ld a,b ;need to test this way because - or c ;dec rp instruction does not change flags - jp nz,bdump - ret -; -;Subroutine to get a string from serial input, place in buffer. -;Buffer address passed in HL reg. -;Uses A,BC,DE,HL registers (including calls to other subroutines). -;Line entry ends by hitting return key. Return char not included in string (replaced by zero). -;Backspace editing OK. No error checking. -; -get_line: ld c,000h ;line position - ld a,h ;put original buffer address in de - ld d,a ;after this don't need to preserve hl - ld a,l ;subroutines called don't use de - ld e,a -get_line_next_char: in a,(0x1F) ;get status - and 001h ;check RxRDY bit - jp z,get_line_next_char ;not ready, loop - in a,(0x1E) ;get char - cp 00dh ;check if return - ret z ;yes, normal exit - cp 07fh ;check if backspace (VT102 keys) - jp z,get_line_backspace ;yes, jump to backspace routine - cp 008h ;check if backspace (ANSI keys) - jp z,get_line_backspace ;yes, jump to backspace - call write_char ;put char on screen - ld (de),a ;store char in buffer - inc de ;point to next space in buffer - inc c ;inc counter - ld a,000h - ld (de),a ;leaves a zero-terminated string in buffer - jp get_line_next_char -get_line_backspace: ld a,c ;check current position in line - cp 000h ;at beginning of line? - jp z,get_line_next_char ;yes, ignore backspace, get next char - dec de ;no, erase char from buffer - dec c ;back up one - ld a,000h ;put a zero in buffer where the last char was - ld (de),a - ld hl,erase_char_string ;ANSI sequence to delete one char from line - call write_string ;transmits sequence to backspace and erase char - jp get_line_next_char -; -;Creates a two-char hex string from the byte value passed in register A -;Location to place string passed in HL -;String is zero-terminated, stored in 3 locations starting at HL -;Also uses registers b,d, and e -byte_to_hex_string: ld b,a ;store original byte - srl a ;shift right 4 times, putting - srl a ;high nybble in low-nybble spot - srl a ;and zeros in high-nybble spot - srl a - ld d,000h ;prepare for 16-bit addition - ld e,a ;de contains offset - push hl ;temporarily store string target address - ld hl,hex_char_table ;use char table to get high-nybble character - add hl,de ;add offset to start of table - ld a,(hl) ;get char - pop hl ;get string target address - ld (hl),a ;store first char of string - inc hl ;point to next string target address - ld a,b ;get original byte back from reg b - and 00fh ;mask off high-nybble - ld e,a ;d still has 000h, now de has offset - push hl ;temp store string target address - ld hl,hex_char_table ;start of table - add hl,de ;add offset - ld a,(hl) ;get char - pop hl ;get string target address - ld (hl),a ;store second char of string - inc hl ;point to third location - ld a,000h ;zero to terminate string - ld (hl),a ;store the zero - ret ;done -; -;Converts a single ASCII hex char to a nybble value -;Pass char in reg A. Letter numerals must be upper case. -;Return nybble value in low-order reg A with zeros in high-order nybble if no error. -;Return 0ffh in reg A if error (char not a valid hex numeral). -;Also uses b, c, and hl registers. -hex_char_to_nybble: ld hl,hex_char_table - ld b,00fh ;no. of valid characters in table - 1. - ld c,000h ;will be nybble value -hex_to_nybble_loop: cp (hl) ;character match here? - jp z,hex_to_nybble_ok ;match found, exit - dec b ;no match, check if at end of table - jp m,hex_to_nybble_err ;table limit exceded, exit with error - inc c ;still inside table, continue search - inc hl - jp hex_to_nybble_loop -hex_to_nybble_ok: ld a,c ;put nybble value in a - ret -hex_to_nybble_err: ld a,0ffh ;error value - ret -; -;Converts a hex character pair to a byte value -;Called with location of high-order char in HL -;If no error carry flag clear, returns with byte value in register A, and -;HL pointing to next mem location after char pair. -;If error (non-hex char) carry flag set, HL pointing to invalid char -hex_to_byte: ld a,(hl) ;location of character pair - push hl ;store hl (hex_char_to_nybble uses it) - call hex_char_to_nybble - pop hl ;returns with nybble value in a reg, or 0ffh if error - cp 0ffh ;non-hex character? - jp z,hex_to_byte_err ;yes, exit with error - sla a ;no, move low order nybble to high side - sla a - sla a - sla a - ld d,a ;store high-nybble - inc hl ;get next character of the pair - ld a,(hl) - push hl ;store hl - call hex_char_to_nybble - pop hl - cp 0ffh ;non-hex character? - jp z,hex_to_byte_err ;yes, exit with error - or d ;no, combine with high-nybble - inc hl ;point to next memory location after char pair - scf - ccf ;no-error exit (carry = 0) - ret -hex_to_byte_err: scf ;error, carry flag set - ret -hex_char_table: defm "0123456789ABCDEF" ;ASCII hex table -; -;Subroutine to get a two-byte address from serial input. -;Returns with address value in HL -;Uses locations in RAM for buffer and variables -address_entry: ld hl,buffer ;location for entered string - call get_line ;returns with address string in buffer - ld hl,buffer ;location of stored address entry string - call hex_to_byte ;will get high-order byte first - jp c, address_entry_error ;if error, jump - ld (current_location+1),a ;store high-order byte, little-endian - ld hl,buffer+2 ;point to low-order hex char pair - call hex_to_byte ;get low-order byte - jp c, address_entry_error ;jump if error - ld (current_location),a ;store low-order byte in lower memory - ld hl,(current_location) ;put memory address in hl - ret -address_entry_error: ld hl,address_error_msg - call write_string - jp address_entry -; -;Subroutine to get a decimal string, return a word value -;Calls decimal_string_to_word subroutine -decimal_entry: ld hl,buffer - call get_line ;returns with DE pointing to terminating zero - ld hl,buffer - call decimal_string_to_word - ret nc ;no error, return with word in hl - ld hl,decimal_error_msg ;error, try again - call write_string - jp decimal_entry -; -;Subroutine to convert a decimal string to a word value -;Call with address of string in HL, pointer to end of string in DE -;Carry flag set if error (non-decimal char) -;Carry flag clear, word value in HL if no error. -decimal_string_to_word: ld b,d - ld c,e ;use BC as string pointer - ld (current_location),hl ;store addr. of start of buffer in RAM word variable - ld hl,000h ;starting value zero - ld (current_value),hl - ld hl,decimal_place_value ;pointer to values - ld (value_pointer),hl -decimal_next_char: dec bc ;next char in string (moving right to left) - ld hl,(current_location) ;check if at end of decimal string - scf ;get ready to subtract de from buffer addr. - ccf ;set carry to zero (clear) - sbc hl,bc ;keep going if bc > or = hl (buffer address) - jp c,decimal_continue ;borrow means bc > hl - jp z,decimal_continue ;z means bc = hl - ld hl,(current_value) ;return if de < buffer address (no borrow) - scf ;get value back from RAM variable - ccf - ret ;return with carry clear, value in hl -decimal_continue: ld a,(bc) ;next char in string (right to left) - sub 030h ;ASCII value of zero char - jp m,decimal_error ;error if char value less than 030h - cp 00ah ;error if byte value > or = 10 decimal - jp p,decimal_error ;a reg now has value of decimal numeral - ld hl,(value_pointer) ;get value to add an put in de - ld e,(hl) ;little-endian (low byte in low memory) - inc hl - ld d,(hl) - inc hl ;hl now points to next value - ld (value_pointer),hl - ld hl,(current_value) ;get back current value -decimal_add: dec a ;add loop to increase total value - jp m,decimal_add_done ;end of multiplication - add hl,de - jp decimal_add -decimal_add_done: ld (current_value),hl - jp decimal_next_char -decimal_error: scf - ret - jp decimal_add -decimal_place_value: defw 1,10,100,1000,10000 -; -;Memory dump -;Displays a 256-byte block of memory in 16-byte rows. -;Called with address of start of block in HL -memory_dump: ld (current_location),hl ;store address of block to be displayed - ld a,000h - ld (byte_count),a ;initialize byte count - ld (line_count),a ;initialize line count - jp dump_new_line -dump_next_byte: ld hl,(current_location) ;get byte address from storage, - ld a,(hl) ;get byte to be converted to string - inc hl ;increment address and - ld (current_location),hl ;store back - ld hl,buffer ;location to store string - call byte_to_hex_string ;convert - ld hl,buffer ;display string - call write_string - ld a,(byte_count) ;next byte - inc a - jp z,dump_done ;stop when 256 bytes displayed - ld (byte_count),a ;not finished yet, store - ld a,(line_count) ;end of line (16 characters)? - cp 00fh ;yes, start new line - jp z,dump_new_line - inc a ;no, increment line count - ld (line_count),a - ld a,020h ;print space - call write_char - jp dump_next_byte ;continue -dump_new_line: ld a,000h ;reset line count to zero - ld (line_count),a - call write_newline - ld hl,(current_location) ;location of start of line - ld a,h ;high byte of address - ld hl, buffer - call byte_to_hex_string ;convert - ld hl,buffer - call write_string ;write high byte - ld hl,(current_location) - ld a,l ;low byte of address - ld hl, buffer - call byte_to_hex_string ;convert - ld hl,buffer - call write_string ;write low byte - ld a,020h ;space - call write_char - jp dump_next_byte ;now write 16 bytes -dump_done: ld a,000h - ld hl,buffer - ld (hl),a ;clear buffer of last string - call write_newline - ret -; -;Memory load -;Loads RAM memory with bytes entered as hex characters -;Called with address to start loading in HL -;Displays entered data in 16-byte rows. -memory_load: ld (current_location),hl - ld hl,data_entry_msg - call write_string - jp load_new_line -load_next_char: call get_char - cp 00dh ;return? - jp z,load_done ;yes, quit - ld (buffer),a - call get_char - cp 00dh ;return? - jp z,load_done ;yes, quit - ld (buffer+1),a - ld hl,buffer - call hex_to_byte - jp c,load_data_entry_error ;non-hex character - ld hl,(current_location) ;get byte address from storage, - ld (hl),a ;store byte - inc hl ;increment address and - ld (current_location),hl ;store back - ld a,(buffer) - call write_char - ld a,(buffer+1) - call write_char - ld a,(line_count) ;end of line (16 characters)? - cp 00fh ;yes, start new line - jp z,load_new_line - inc a ;no, increment line count - ld (line_count),a - ld a,020h ;print space - call write_char - jp load_next_char ;continue -load_new_line: ld a,000h ;reset line count to zero - ld (line_count),a - call write_newline - jp load_next_char ;continue -load_data_entry_error: call write_newline - ld hl,data_error_msg - call write_string - ret -load_done: call write_newline - ret -; -;Get one ASCII character from the serial port. -;Returns with char in A reg. No error checking. -get_char: in a,(0x1F) ;get status - and 001h ;check RxRDY bit - jp z,get_char ;not ready, loop - in a,(0x1E) ;get char - ret -; -;Subroutine to start a new line -write_newline: ld a,00dh ;ASCII carriage return character - call write_char - ld a,00ah ;new line (line feed) character - call write_char - ret -; -;Subroutine to read one disk sector (128 bytes) -;Address to place data passed in HL -;LBA bits 0 to 7 passed in C, bits 8 to 15 passed in B -;LBA bits 16 to 23 passed in E -disk_read: - ld a,c - out (0bh),a ;lba bits 0 - 7 - ld a,b - out (0ch),a ;lba bits 8 - 15 - ld a,e - out (0dh),a ;lba bits 16 - 23 - ld a,20h ;Read sector command - out (0fh),a -rd_wait_for_DRQ_set: in a,(0fh) ;read status - and 08h ;DRQ bit - jp z,rd_wait_for_DRQ_set ;loop until bit set -read_loop: in a,(08h) ;get data - ld (hl),a - inc hl - in a,(0fh) ;check status - and 08h ;DRQ bit - jp nz,read_loop ;loop until cleared - ret -; -;Subroutine to write one disk sector (128 bytes) -;Address of data to write to disk passed in HL -;LBA bits 0 to 7 passed in C, bits 8 to 15 passed in B -;LBA bits 16 to 23 passed in E -disk_write: - ld a,c - out (0bh),a ;lba bits 0 - 7 - ld a,b - out (0ch),a ;lba bits 8 - 15 - ld a,e - out (0dh),a ;lba bits 16 - 23 - ld a,30h ;Write sector command - out (0fh),a -wr_wait_for_DRQ_set: in a,(0fh) ;read status - and 08h ;DRQ bit - jp z,wr_wait_for_DRQ_set ;loop until bit set -write_loop: ld a,(hl) - out (08h),a ;write data - inc hl - in a,(0fh) ;read status - and 08h ;check DRQ bit - jp nz,write_loop ;write until bit cleared - ret -; -;Strings used in subroutines -length_entry_string: defm "Enter length of file to load (decimal): ",0 -dump_entry_string: defm "Enter no. of bytes to dump (decimal): ",0 -LBA_entry_string: defm "Enter LBA (decimal, 0 to 65535): ",0 -erase_char_string: defm 008h,01bh,"[K",000h ;ANSI sequence for backspace, erase to end of line. -address_entry_msg: defm "Enter 4-digit hex address (use upper-case A through F): ",0 -address_error_msg: defm 13,10,"Error: invalid hex character, try again: ",0 -data_entry_msg: defm "Enter hex bytes, hit return when finished.",13,10,0 -data_error_msg: defm "Error: invalid hex byte.",13,10,0 -decimal_error_msg: defm 13,10,"Error: invalid decimal number, try again: ",0 -; -;Simple monitor program for CPUville Z80 computer with serial interface. -monitor_cold_start: ld sp,ROM_monitor_stack - call initialize_port - ld hl,monitor_message - call write_string -monitor_warm_start: call write_newline ;routine program return here to avoid re-initialization of port - ld a,03eh ;cursor symbol - call write_char - ld hl,buffer - call get_line ;get monitor input string (command) - call write_newline - call parse ;interprets command, returns with address to jump to in HL - jp (hl) -; -;Parses an input line stored in buffer for available commands as described in parse table. -;Returns with address of jump to action for the command in HL -parse: ld bc,parse_table ;bc is pointer to parse_table -parse_start: ld a,(bc) ;get pointer to match string from parse table - ld e,a - inc bc - ld a,(bc) - ld d,a ;de will is pointer to strings for matching - ld a,(de) ;get first char from match string - or 000h ;zero? - jp z,parser_exit ;yes, exit no_match - ld hl,buffer ;no, parse input string -match_loop: cp (hl) ;compare buffer char with match string char - jp nz,no_match ;no match, go to next match string - or 000h ;end of strings (zero)? - jp z,parser_exit ;yes, matching string found - inc de ;match so far, point to next char in match string - ld a,(de) ;get next character from match string - inc hl ;and point to next char in input string - jp match_loop ;check for match -no_match: inc bc ;skip over jump target to - inc bc - inc bc ;get address of next matching string - jp parse_start -parser_exit: inc bc ;skip to address of jump for match - ld a,(bc) - ld l,a - inc bc - ld a,(bc) - ld h,a ;returns with jump address in hl - ret -; -;Actions to be taken on match -; -;Memory dump program -;Input 4-digit hexadecimal address -;Calls memory_dump subroutine -dump_jump: ld hl,dump_message ;Display greeting - call write_string - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry ;returns with address in HL - call write_newline - call memory_dump - jp monitor_warm_start -; -;Hex loader, displays formatted input -load_jump: ld hl,load_message ;Display greeting - call write_string ;get address to load - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry - call write_newline - call memory_load - jp monitor_warm_start -; -;Jump and run do the same thing: get an address and jump to it. -run_jump: ld hl,run_message ;Display greeting - call write_string - ld hl,address_entry_msg ;get ready to get address - call write_string - call address_entry - jp (hl) -; -;Help and ? do the same thing, display the available commands -help_jump: ld hl,help_message - call write_string - ld bc,parse_table ;table with pointers to command strings -help_loop: ld a,(bc) ;displays the strings for matching commands, - ld l,a ;getting the string addresses from the - inc bc ;parse table - ld a,(bc) ;pass address of string to hl through a reg - ld h,a - ld a,(hl) ;hl now points to start of match string - or 000h ;exit if no_match string - jp z,help_done - push bc ;write_char uses b register - ld a,020h ;space char - call write_char - pop bc - call write_string ;writes match string - inc bc ;pass over jump address in table - inc bc - inc bc - jp help_loop -help_done: jp monitor_warm_start -; -;Binary file load. Need both address to load and length of file -bload_jump: ld hl,bload_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,length_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld hl,bload_ready_message - call write_string - pop hl - call bload - jp monitor_warm_start -; -;Binary memory dump. Need address of start of dump and no. bytes -bdump_jump: ld hl,bdump_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,dump_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld hl,bdump_ready_message - call write_string - call get_char - pop hl - call bdump - jp monitor_warm_start -;Disk read. Need memory address to place data, LBA of sector to read -diskrd_jump: ld hl,diskrd_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,LBA_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld e,00h - pop hl - call disk_read - jp monitor_warm_start -diskwr_jump: ld hl,diskwr_message - call write_string - ld hl,address_entry_msg - call write_string - call address_entry - call write_newline - push hl - ld hl,LBA_entry_string - call write_string - call decimal_entry - ld b,h - ld c,l - ld e,00h - pop hl - call disk_write - jp monitor_warm_start -boot_jump: ld hl,1100h - ld bc,0000h - ld e,00h - call disk_read - jp 1100h -;Prints message for no match to entered command -no_match_jump: ld hl,no_match_message - call write_string - ld hl, buffer - call write_string - jp monitor_warm_start -; -;Monitor data structures: -; -monitor_message: defm 27,91,50,74,27,91,72,13,10,"ROM Ver. 9",13,10,0 -no_match_message: defm "? ",0 -help_message: defm "Commands implemented:",13,10,0 -dump_message: defm "Displays a 256-byte block of memory.",13,10,0 -load_message: defm "Enter hex bytes starting at memory location.",13,10,0 -run_message: defm "Will jump to (execute) program at address entered.",13,10,0 -bload_message: defm "Loads a binary file into memory.",13,10,0 -bload_ready_message: defm 13,10,"Ready to receive, start transfer.",0 -bdump_message: defm "Dumps binary data from memory to serial port.",13,10,0 -bdump_ready_message: defm 13,10,"Ready to send, hit any key to start.",0 -diskrd_message: defm "Reads one sector from disk to memory.",13,10,0 -diskwr_message: defm "Writes one sector from memory to disk.",13,10,0 -;Strings for matching: -dump_string: defm "dump",0 -load_string: defm "load",0 -jump_string: defm "jump",0 -run_string: defm "run",0 -question_string: defm "?",0 -help_string: defm "help",0 -bload_string: defm "bload",0 -bdump_string: defm "bdump",0 -diskrd_string: defm "diskrd",0 -diskwr_string: defm "diskwr",0 -boot_string: defm "boot",0 -no_match_string: defm 0,0 -;Table for matching strings to jumps -parse_table: defw dump_string,dump_jump,load_string,load_jump - defw jump_string,run_jump,run_string,run_jump - defw question_string,help_jump,help_string,help_jump - defw bload_string,bload_jump,bdump_string,bdump_jump - defw diskrd_string,diskrd_jump,diskwr_string,diskwr_jump - defw boot_string,boot_jump - defw no_match_string,no_match_jump -