From 289a4e6a1304eba2542734a3062c011eab82d6b2 Mon Sep 17 00:00:00 2001 From: Steve Kemp Date: Sat, 20 Apr 2024 06:36:15 +0300 Subject: [PATCH 1/4] Add CCP - and more! This pull-request got out of hand, but it closes #30 by adding a CCP to the CP/M emulator: * When launched with no arguments the CCP is launched. * Otherwise we run as we did in the past. * There is support for using subdirectories as drives now too. * I've added some more documentation to samples/ * I've added dist/ with games * Some TODOS are added, and tests. --- README.md | 164 ++++-- ccp/Makefile | 2 + ccp/README.md | 10 + ccp/ccp.asm | 1281 +++++++++++++++++++++++++++++++++++++++++ ccp/ccp.bin | Bin 0 -> 2052 bytes ccp/ccp.go | 10 + ccp/ccp_test.go | 18 + cpm/cpm.go | 241 +++++--- cpm/cpm_syscalls.go | 189 +++++- main.go | 129 ++++- memory/memory.go | 59 +- memory/memory_test.go | 63 ++ samples/Makefile | 2 +- samples/README.md | 6 + samples/version.com | Bin 0 -> 58 bytes samples/version.z80 | 59 ++ 16 files changed, 2044 insertions(+), 189 deletions(-) create mode 100644 ccp/Makefile create mode 100644 ccp/README.md create mode 100644 ccp/ccp.asm create mode 100644 ccp/ccp.bin create mode 100644 ccp/ccp.go create mode 100644 ccp/ccp_test.go create mode 100644 memory/memory_test.go create mode 100644 samples/README.md create mode 100644 samples/version.com create mode 100644 samples/version.z80 diff --git a/README.md b/README.md index 0f3231c..45c4938 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,13 @@ # cpmulator - A CP/M emulator written in golang -A couple of years ago I wrote [a text-based adventure game](https://github.com/skx/lighthouse-of-doom/) to amuse my child, in Z80 assembly for CP/M. Later my game was ported to the ZX Spectrum. As only a handful of CP/M BIOS functions were used I reasoned it should be possible to emulate those BIOS calls and combine them with a Z80 emulator to allow playing my game on a modern computer. +This repository contains a CP/M emulator, with integrated CCP, which is primarily designed to launch simple CP/M binaries: -This repository is the result: A minimal cross-platform CP/M emulator that supports _just enough_ functionality to run my game, and the Z-machine games from Infocom (i.e. ZORK 1, 2, 3, and the Hitchhiker's guide to the galaxy). +* The project was created to run [a text-based adventure game](https://github.com/skx/lighthouse-of-doom/) I wrote a few years ago, to amuse my child. + * This was written in Z80 assembly language and initially targeted at CP/M, although it was later ported to the ZX Spectrum. +* Over time it has become more functional: + * It can now run ZORK 1, 2, & 3, as well as The Hitchhiker's guide to the galaxy and other similar games. - - - -# Credits - -90% of the functionality of this repository comes from the [excellent Z80 emulator library](https://github.com/koron-go/z80) written by @koron-go. - - - - -# Limitations - -This CP/M emulator is pretty basic, I initially implemented just those primitives required to play my game, and later I added onlye enough of the missing BIOS functions that were required to run the Z-machine from Infocom: - -* This means you can play Zork 1! -* This means you can play Zork 2! -* This means you can play Zork 3! -* This means you can play The Hitchhikers guide to the galaxy! - -**NOTE**: Now I've reached the point where I can successfully run Zork updates will slow down in this repository, but pull-requests to add functionality will always be welcome! - - - -## Notes On Filesystem Functions - -Traditionally CP/M would upper-case the command-line arguments it received, which means that you will ALWAYS need to work with filenames in upper-case. - -I don't handle different drive-letters, or user-areas. If you were to run the file-creation code each of these functions would create "./FOO.TXT": - -* `cpmulater samples/create.com foo.txt` -* `cpmulater samples/create.com B:foo.txt` -* `cpmulater samples/create.com C:foo.txt` -* `cpmulater samples/create.com D:foo.txt` +I've implemented enough of the BIOS functions to run simple well-behaved utilities, but I've not implemented any notion of disk access - only file-based I/O. @@ -49,7 +20,7 @@ This emulator is written using golang, so if you have a working golang toolchain go install github.com/skx/cpmulator@latest ``` -If you were to clone this repository you could build and install by running: +If you were to clone this repository to your local system you could then build and install by running: ``` go install . @@ -62,21 +33,51 @@ If neither of these options sufficed you may download the latest binary from [ou # Usage -To run the emulator you only need to specify the path to a CP/M binary (Z80) which you wish to execute, along with any optional arguments (arguments to the binary you're launching, not the emulator itself): +If you launch `cpmulator` with no arguments then the integrated CCP ("console command processor") will be launched, dropping you into a familiar shell - note here the filenames are presented in the old-school way, as per the later note on filesystems and filenames: +```sh +$ cpmulator +A> +A>DIR * +A: .GIT | .GIT | .GIT | LICENSE +A: README .MD | CCP . | CPM . | CPMULATO. +A: FCB . | GO .MOD | GO .SUM | MAIN .GO +A: MEMORY . | SAMPLES . + +A>TYPE LICENSE +The MIT License (MIT) +.. +A> ``` -$ cpmulator /path/to/binary [optional-args] -``` -Note that the Infocom games are distributed as two files; an executable and a data-file. For example if you wish to play ZORK1 you'll need to have these two files, in the same directory: +You can terminate the CCP by pressing Ctrl-C, otherwise interact with it as usual via the built-in commands. + +
+Show the CCP built-in commands: +* `DIR` + * List files, by default this uses "`*.*`", so files without suffixes will be hidden. + * Prefer "`DIR *`" if you want to see _everything_. +* `CLS` + * Clear the screen. +* `ERA` + * Erase the named files. +* `TYPE` + * View the contents of the named file - wildcards are not permitted. +* `REN` + * Rename files, so "`REN NEW = OLD`" - again wildcards are not permitted, nor is cross-drive renaming. This will fail until I've implemented F_RENAME. +
+ -* ZORK1.COM - * The filename of this doesn't matter. -* ZORK1.DAT - * This **must** be named ZORK1.DAT, in upper-case, and be in the current directory. - * Because ZORK1.COM will try to load it by upper-cased name. +You can also launch a binary directly, by specifying it's path upon the command-line, followed by any optional arguments: ``` +$ cpmulator /path/to/binary [optional-args] +``` + +I've placed some games within the `dist/` directory, so you can launch them easily like so: + +```sh +$ cd dist/ $ cpmulator ZORK1.COM ZORK I: The Great Underground Empire Copyright (c) 1981, 1982, 1983 Infocom, Inc. All rights @@ -88,26 +89,66 @@ West of House You are standing in an open field west of a white house, with a boarded front door. There is a small mailbox here. -.. + +> +``` + +Note that the Infocom games are distributed as two files; an executable and a data-file. When you launch the game you'll need to be in the same directory as both the game and the data-file. + + + +## Drives vs. Directories + +By default when you launch `cpmulator` with no arguments you'll be presented with the CCP interface, with A: as the current drive and A:, B:, C:, and all other drives, will refer to the current-working directory where you launched the emulator from. This is perhaps the most practical way to get started, but it means that files are unique across drives: + +* i.e. "`A:FOO`" is the same as "`B:FOO`" + * In short "`FOO`" will exist on drives `A:` all the way through to `P:`. + +If you prefer you can configure drives to have their contents from sub-directories upon the host system (i.e. the machine you're running on). This means you need to create subdirectories, and the contents of those directories will only be visible on the appropriate drives: + +```sh +$ mkdir A/ ; touch A/LS.COM ; touch A/FOO.COM +$ mkdir B/ ; touch B/DU.COM ; touch B/BAR.COM +$ mkdir G/ ; touch G/ME.COM ; touch G/BAZ.COM +``` + +Now if you launch the emulator you'll see only the files which _should_ be visible on the appropriate drive: + + +```sh +$ cpmulator -drives +A>DIR A: +A: FOO .COM | LS .COM + +A>DIR B: +B: BAR .COM | DU .COM + +A>DIR G: +G: BAZ .COM | ME .COM + +A>DIR E: +No file ``` +It isn't currently possibly to point different drives to arbitrary paths on your computer, but that might be considered if you have a use-case for it. + ## Debugging Failures -When the emulator is asked to execute an unimplemented BIOS call it will abort with a fatal error, for example: +When an unimplemented BIOS call is attempted the program it will abort with a fatal error, for example: ``` $ ./cpmulator FOO.COM {"time":"2024-04-14T15:39:34.560609302+03:00", "level":"ERROR", "msg":"Unimplemented syscall", - "syscall":33, - "syscallHex":"0x21"} + "syscall":255, + "syscallHex":"0xFF"} Error running FOO.COM: UNIMPLEMENTED ``` -You can see a lot of the functions it did successfully emulate and handle by setting the environmental variable DEBUG to a non-empty value, this will generate a log to STDERR where you can save it: +You can see a log of the functions it did successfully emulate and handle by setting the environmental variable DEBUG to a non-empty value, this will generate a log to STDERR where you can save it: ``` $ DEBUG=1 ./cpmulator ZORK1.COM 2>log.log @@ -136,7 +177,17 @@ $ cat log.log You'll see some Z80 assembly programs beneath [samples](samples/) which are used to check my understanding. If you have the `pasmo` compiler enabled you can build them all by running "make". -In case you don't I've added the compiled versions. +In case you don't I've added ensured I also commit the generated binaries to the git repository. + + + + +# Credits + +* Much of the functionality of this repository comes from the [excellent Z80 emulator library](https://github.com/koron-go/z80) it is using, written by @koron-go. +* The CCP comes from [my fork](https://github.com/skx/z80-playground-cpm-fat/) of the origianl [cpm-fat](https://github.com/z80playground/cpm-fat/) + * However this is largely unchanged from the [original CCP](http://www.cpm.z80.de/source.html) from Digital Research. + * I've not looked at the differences in-depth, but I don't think there are any significant changes. @@ -144,5 +195,16 @@ In case you don't I've added the compiled versions. Let me know by filing an issue. If your program is "real" then it is highly likely it will try to invoke an unimplemented BIOS function. +Outstanding issues I'm aware of: + +* No real support for drives-as-subdirectories. +* Inconsistent handling of Drives in FCB entries. + * There seems to be no suffering here, but .. +* I don't implement some of the basic BIOS calls that might be useful + * Get free RAM, etc, etc. + * These will be added over time as their absence causes program-failures. +* PIP.COM doesn't work for file copying; `PIP A:NEW.COM=B:ORIG.COM`. + * This should copy "ORIG.COM" to "NEW.COM", but aborts due to lack of `F_RANDREC` (and probably more syscalls). + * You can [read about PIP](https://www.shaels.net/index.php/cpm80-22-documents/using-cpm/6-pip-utility) if you're interested. It is a useful tool! Steve diff --git a/ccp/Makefile b/ccp/Makefile new file mode 100644 index 0000000..6b0076c --- /dev/null +++ b/ccp/Makefile @@ -0,0 +1,2 @@ +ccp.bin: ccp.asm + pasmo ccp.asm ccp.bin diff --git a/ccp/README.md b/ccp/README.md new file mode 100644 index 0000000..1811552 --- /dev/null +++ b/ccp/README.md @@ -0,0 +1,10 @@ +# CCP + +This directory contains the CCP we bundle within our emulator: + +* [ccp.asm](ccp.asm) + * The source-code, to be compiled by [pasmo]() with the included `Makefile`. +* [ccp.bin](ccp.bin) + * The compiled binary, which is embedded in `cpmulator`, via [ccp.go](ccp.go). + +CCP stands for "console command processor" and is basically the "shell". diff --git a/ccp/ccp.asm b/ccp/ccp.asm new file mode 100644 index 0000000..ba50f4c --- /dev/null +++ b/ccp/ccp.asm @@ -0,0 +1,1281 @@ +;************************************************************** +;* +;* C P / M version 2.2 +;* +;* Reconstructed from memory image on February 27, 1981 +;* +;* by Clark A. Calkins +;* +;* This file contains just the CCP and has slight +;* modifications by John Squires. +;* It assembles to less than 3k in size. +;* It is designed to be used on the Z80 Playground. +;* See 8bitStack.co.uk for more details. +;* +;************************************************************** +; +; Set memory limit here. This is the amount of contiguous +; ram starting from 0000. CP/M will reside at the end of this space. +; + + ; Set origin for CP/M + + ORG $DE00 + +IOBYTE EQU 3 ;i/o definition byte. +TDRIVE EQU 4 ;current drive name and user number. +ENTRY EQU 5 ;entry point for the cp/m bdos. +TFCB EQU 5CH ;default file control block. +TBUFF EQU 80H ;i/o buffer and command line storage. +TBASE EQU 100H ;transient program storage area. +; +; Set control character equates. +; +CNTRLC EQU 3 ;control-c +CNTRLE EQU 05H ;control-e +BS EQU 08H ;backspace +TAB EQU 09H ;tab +LF EQU 0AH ;line feed +FF EQU 0CH ;form feed +CR EQU 0DH ;carriage return +CNTRLP EQU 10H ;control-p +CNTRLR EQU 12H ;control-r +CNTRLS EQU 13H ;control-s +CNTRLU EQU 15H ;control-u +CNTRLX EQU 18H ;control-x +CNTRLZ EQU 1AH ;control-z (end-of-file mark) +DEL EQU 7FH ;rubout +; + +;************************************************************** +; +; THIS IS THE START OF THE CCP +; +;************************************************************** +; +CBASE: + JP COMMAND ;execute command processor (ccp). + JP CLEARBUF ;entry to empty input buffer before starting ccp. + +; +; Standard cp/m ccp input buffer. Format is (max length), +; (actual length), (char #1), (char #2), (char #3), etc. +; +INBUFF: DEFB 127 ;length of input buffer. + DEFB 0 ;current length of contents. + DEFB 'Copyright' + DEFB ' 1979 (c) by Digital Research ' + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +INPOINT:DEFW INBUFF+2 ;input line pointer +NAMEPNT:DEFW 0 ;input line pointer used for error message. Points to +; ;start of name in error. +; +; Routine to print (A) on the console. All registers used. +; +PRINT: LD E,A ;setup bdos call. + LD C,2 + JP ENTRY +; +; Routine to print (A) on the console and to save (BC). +; +PRINTB: PUSH BC + CALL PRINT + POP BC + RET +; +; Routine to send a carriage return, line feed combination +; to the console. +; +CRLF: LD A,CR + CALL PRINTB + LD A,LF + JP PRINTB +; +; Routine to send one space to the console and save (BC). +; +SPACE: LD A,' ' + JP PRINTB +; +; Routine to print character string pointed to be (BC) on the +; console. It must terminate with a null byte. +; +PLINE: PUSH BC + CALL CRLF + POP HL +PLINE2: LD A,(HL) + OR A + RET Z + INC HL + PUSH HL + CALL PRINT + POP HL + JP PLINE2 +; +; Routine to reset the disk system. +; +RESDSK: LD C,13 + JP ENTRY +; +; Routine to select disk (A). +; +DSKSEL: LD E,A + LD C,14 + JP ENTRY +; +; Routine to call bdos and save the return code. The zero +; flag is set on a return of 0ffh. +; +ENTRY1: CALL ENTRY + LD (RTNCODE),A ;save return code. + INC A ;set zero if 0ffh returned. + RET +; +; Routine to open a file. (DE) must point to the FCB. +; +OPEN: LD C,15 + JP ENTRY1 +; +; Routine to open file at (FCB). +; +; This is used either for loading-files, or for finding files for TYPE +; +OPENFCB:XOR A ;clear the record number byte at fcb+32 + LD (FCB+32),A + LD DE,FCB + LD C,15 + CALL ENTRY + LD (RTNCODE),A ;save return code. + INC A ;set zero if 0ffh returned. + RET + + +; +; Routine to close a file. (DE) points to FCB. +; +CLOSE: LD C,16 + JP ENTRY1 +; +; Routine to search for the first file with ambigueous name +; (DE). +; +SRCHFST:LD C,17 + JP ENTRY1 +; +; Search for the next ambigeous file name. +; +SRCHNXT:LD C,18 + JP ENTRY1 +; +; Search for file at (FCB). +; +SRCHFCB:LD DE,FCB + JP SRCHFST +; +; Routine to delete a file pointed to by (DE). +; +DELETE: LD C,19 + JP ENTRY +; +; Routine to call the bdos and set the zero flag if a zero +; status is returned. +; +ENTRY2: CALL ENTRY + OR A ;set zero flag if appropriate. + RET +; +; Routine to read the next record from a sequential file. +; (DE) points to the FCB. +; +RDREC: LD C,20 + JP ENTRY2 +; +; Routine to read file at (FCB). +; +READFCB:LD DE,FCB + JP RDREC +; +; Routine to write the next record of a sequential file. +; (DE) points to the FCB. +; +WRTREC: LD C,21 + JP ENTRY2 +; +; Routine to create the file pointed to by (DE). +; +CREATE: LD C,22 + JP ENTRY1 +; +; Routine to rename the file pointed to by (DE). Note that +; the new name starts at (DE+16). +; +RENAM: LD C,23 + JP ENTRY +; +; Get the current user code. +; +GETUSR: LD E,0FFH +; +; Routne to get or set the current user code. +; If (E) is FF then this is a GET, else it is a SET. +; +GETSETUC: + LD C,32 + JP ENTRY +; +; Routine to set the current drive byte at (TDRIVE). +; +SETCDRV:CALL GETUSR ;get user number + ADD A,A ;and shift into the upper 4 bits. + ADD A,A + ADD A,A + ADD A,A + LD HL,CDRIVE ;now add in the current drive number. + OR (HL) + LD (TDRIVE),A ;and save. + RET +; +; Move currently active drive down to (TDRIVE). +; +MOVECD: LD A,(CDRIVE) + LD (TDRIVE),A + RET +; +; Routine to convert (A) into upper case ascii. Only letters +; are affected. +; +UPPER: CP 'a' ;check for letters in the range of 'a' to 'z'. + RET C + CP '{' + RET NC + AND 5FH ;convert it if found. + RET +; +; Routine to get a line of input. We must check to see if the +; user is in (BATCH) mode. If so, then read the input from file +; ($$$.SUB). At the end, reset to console input. +; +GETINP: + LD A,(BATCH) ;if =0, then use console input. + OR A + JP Z,GETINP1 +; +; Use the submit file ($$$.sub) which is prepared by a +; SUBMIT run. It must be on drive (A) and it will be deleted +; if and error occures (like eof). +; + LD A,(CDRIVE) ;select drive 0 if need be. + OR A + LD A,0 ;always use drive A for submit. + CALL NZ,DSKSEL ;select it if required. + LD DE,BATCHFCB + CALL OPEN ;look for it. + JP Z,GETINP1 ;if not there, use normal input. + LD A,(BATCHFCB+15) ;get last record number+1. + DEC A + LD (BATCHFCB+32),A + LD DE,BATCHFCB + CALL RDREC ;read last record. + JP NZ,GETINP1 ;quit on end of file. +; +; Move this record into input buffer. +; + LD DE,INBUFF+1 + LD HL,TBUFF ;data was read into buffer here. + LD B,128 ;all 128 characters may be used. + CALL HL2DE ;(HL) to (DE), (B) bytes. + LD HL,BATCHFCB+14 + LD (HL),0 ;zero out the 's2' byte. + INC HL ;and decrement the record count. + DEC (HL) + LD DE,BATCHFCB ;close the batch file now. + CALL CLOSE + JP Z,GETINP1 ;quit on an error. + LD A,(CDRIVE) ;re-select previous drive if need be. + OR A + CALL NZ,DSKSEL ;don't do needless selects. +; +; Print line just read on console. +; + LD HL,INBUFF+2 + CALL PLINE2 + CALL CHKCON ;check console, quit on a key. + JP Z,GETINP2 ;jump if no key is pressed. +; +; Terminate the submit job on any keyboard input. Delete this +; file such that it is not re-started and jump to normal keyboard +; input section. +; + CALL DELBATCH ;delete the batch file. + JP CMMND1 ;and restart command input. +; +; Get here for normal keyboard input. Delete the submit file +; incase there was one. +; +GETINP1:CALL DELBATCH ;delete file ($$$.sub). + CALL SETCDRV ;reset active disk. + LD C,10 ;get line from console device. + LD DE,INBUFF + CALL ENTRY + CALL MOVECD ;reset current drive (again). +; +; Convert input line to upper case. +; +GETINP2:LD HL,INBUFF+1 + LD B,(HL) ;(B)=character counter. +GETINP3:INC HL + LD A,B ;end of the line? + OR A + JP Z,GETINP4 + LD A,(HL) ;convert to upper case. + CALL UPPER + LD (HL),A + DEC B ;adjust character count. + JP GETINP3 +GETINP4:LD (HL),A ;add trailing null. + LD HL,INBUFF+2 + LD (INPOINT),HL ;reset input line pointer. + RET +; +; Routine to check the console for a key pressed. The zero +; flag is set is none, else the character is returned in (A). +; +CHKCON: LD A, FF + OR A ;clear zero flag and return. + RET +; +; Routine to get the currently active drive number. +; +GETDSK: LD C,25 + JP ENTRY +; +; Set the stabdard dma address. +; +STDDMA: LD DE,TBUFF +; +; Routine to set the dma address to (DE). +; +DMASET: LD C,26 + JP ENTRY +; +; Delete the batch file created by SUBMIT. +; +DELBATCH: LD HL,BATCH ;is batch active? + LD A,(HL) + OR A + RET Z + LD (HL),0 ;yes, de-activate it. + XOR A + CALL DSKSEL ;select drive 0 for sure. + LD DE,BATCHFCB ;and delete this file. + CALL DELETE + LD A,(CDRIVE) ;reset current drive. + JP DSKSEL + +; +; Print back file name with a '?' to indicate a syntax error. +; +SYNERR: CALL CRLF ;end current line. + LD HL,(NAMEPNT) ;this points to name in error. +SYNERR1:LD A,(HL) ;print it until a space or null is found. + CP ' ' + JP Z,SYNERR2 + OR A + JP Z,SYNERR2 + PUSH HL + CALL PRINT + POP HL + INC HL + JP SYNERR1 +SYNERR2:LD A,'?' ;add trailing '?'. + CALL PRINT + CALL CRLF + CALL DELBATCH ;delete any batch file. + JP CMMND1 ;and restart from console input. +; +; Check character at (DE) for legal command input. Note that the +; zero flag is set if the character is a delimiter. +; +CHECK: LD A,(DE) + OR A + RET Z + CP ' ' ;control characters are not legal here. + JP C,SYNERR + RET Z ;check for valid delimiter. + CP '=' + RET Z + CP '_' + RET Z + CP '.' + RET Z + CP ':' + RET Z + CP ';' + RET Z + CP '<' + RET Z + CP '>' + RET Z + RET +; +; Get the next non-blank character from (DE). +; +NONBLANK: LD A,(DE) + OR A ;string ends with a null. + RET Z + CP ' ' + RET NZ + INC DE + JP NONBLANK +; +; Add (HL)=(HL)+(A) +; +ADDHL: ADD A,L + LD L,A + RET NC ;take care of any carry. + INC H + RET +; +; Convert the first name in (FCB). +; +CONVFST:LD A,0 +; +; Format a file name (convert * to '?', etc.). On return, +; (A)=0 is an unambigeous name was specified. Enter with (A) equal to +; the position within the fcb for the name (either 0 or 16). +; +CONVERT:LD HL,FCB + CALL ADDHL + PUSH HL + PUSH HL + XOR A + LD (CHGDRV),A ;initialize drive change flag. + LD HL,(INPOINT) ;set (HL) as pointer into input line. + EX DE,HL + CALL NONBLANK ;get next non-blank character. + EX DE,HL + LD (NAMEPNT),HL ;save pointer here for any error message. + EX DE,HL + POP HL + LD A,(DE) ;get first character. + OR A + JP Z,CONVRT1 + SBC A,'A'-1 ;might be a drive name, convert to binary. + LD B,A ;and save. + INC DE ;check next character for a ':'. + LD A,(DE) + CP ':' + JP Z,CONVRT2 + DEC DE ;nope, move pointer back to the start of the line. +CONVRT1:LD A,(CDRIVE) + LD (HL),A + JP CONVRT3 +CONVRT2:LD A,B + LD (CHGDRV),A ;set change in drives flag. + LD (HL),B + INC DE +; +; Convert the basic file name. +; +CONVRT3:LD B,08H +CONVRT4:CALL CHECK + JP Z,CONVRT8 + INC HL + CP '*' ;note that an '*' will fill the remaining + JP NZ,CONVRT5 ;field with '?'. + LD (HL),'?' + JP CONVRT6 +CONVRT5:LD (HL),A + INC DE +CONVRT6:DEC B + JP NZ,CONVRT4 +CONVRT7:CALL CHECK ;get next delimiter. + JP Z,GETEXT + INC DE + JP CONVRT7 +CONVRT8:INC HL ;blank fill the file name. + LD (HL),' ' + DEC B + JP NZ,CONVRT8 +; +; Get the extension and convert it. +; +GETEXT: LD B,03H + CP '.' + JP NZ,GETEXT5 + INC DE +GETEXT1:CALL CHECK + JP Z,GETEXT5 + INC HL + CP '*' + JP NZ,GETEXT2 + LD (HL),'?' + JP GETEXT3 +GETEXT2:LD (HL),A + INC DE +GETEXT3:DEC B + JP NZ,GETEXT1 +GETEXT4:CALL CHECK + JP Z,GETEXT6 + INC DE + JP GETEXT4 +GETEXT5:INC HL + LD (HL),' ' + DEC B + JP NZ,GETEXT5 +GETEXT6:LD B,3 +GETEXT7:INC HL + LD (HL),0 + DEC B + JP NZ,GETEXT7 + EX DE,HL + LD (INPOINT),HL ;save input line pointer. + POP HL +; +; Check to see if this is an ambigeous file name specification. +; Set the (A) register to non zero if it is. +; + LD BC,11 ;set name length. +GETEXT8:INC HL + LD A,(HL) + CP '?' ;any question marks? + JP NZ,GETEXT9 + INC B ;count them. +GETEXT9:DEC C + JP NZ,GETEXT8 + LD A,B + OR A + RET +; +; CP/M command table. Note commands can be either 3 or 4 characters long. +; +NUMCMDS EQU ( CMDEND - CMDTBL ) / 4 ;number of commands +CMDTBL: DEFB 'DIR ' + DEFB 'ERA ' + DEFB 'TYPE' + DEFB 'SAVE' + DEFB 'REN ' + DEFB 'USER' + DEFB 'CLS ' ; Steve's CLS command +CMDEND: +; +; +; Search the command table for a match with what has just +; been entered. If a match is found, then we jump to the +; proper section. Else jump to (UNKNOWN). +; On return, the (C) register is set to the command number +; that matched (or NUMCMDS+1 if no match). +; +SEARCH: LD HL,CMDTBL + LD C,0 +SEARCH1:LD A,C + CP NUMCMDS ;this commands exists. + RET NC + LD DE,FCB+1 ;check this one. + LD B,4 ;max command length. +SEARCH2:LD A,(DE) + CP (HL) + JP NZ,SEARCH3 ;not a match. + INC DE + INC HL + DEC B + JP NZ,SEARCH2 + LD A,(DE) ;allow a 3 character command to match. + CP ' ' + JP NZ,SEARCH4 + LD A,C ;set return register for this command. + RET +SEARCH3:INC HL + DEC B + JP NZ,SEARCH3 +SEARCH4:INC C + JP SEARCH1 +; +; Set the input buffer to empty and then start the command +; processor (ccp). +; +CLEARBUF: + XOR A + LD (INBUFF+1),A ;second byte is actual length. +; +;************************************************************** +;* +;* +;* C C P - C o n s o l e C o m m a n d P r o c e s s o r +;* +;************************************************************** +;* +COMMAND: + LD SP,CCPSTACK ;setup stack area. + PUSH BC ;note that (C) should be equal to: + LD A,C ;(uuuudddd) where 'uuuu' is the user number + RRA ;and 'dddd' is the drive number. + RRA + RRA + RRA + AND 0FH ;isolate the user number. + LD E,A + CALL GETSETUC ;and set it. + CALL RESDSK ;reset the disk system. + LD (BATCH),A ;set/clear batch mode flag. + POP BC + LD A,C + AND 0FH ;isolate the drive number. + LD (CDRIVE),A ;and save. + CALL DSKSEL ;...and select. + LD A,(INBUFF+1) + OR A ;anything in input buffer already? + JP NZ,CMMND2 ;yes, we just process it. +; +; Entry point to get a command line from the console. +; +CMMND1: LD SP,CCPSTACK ;set stack straight. + CALL CRLF ;start a new line on the screen. + CALL GETDSK ;get current drive. + ADD A,'A' + CALL PRINT ;print current drive. + LD A,'>' + CALL PRINT ;and add prompt. + CALL GETINP ;get line from user. +; +; Process command line here. +; +CMMND2: LD DE,TBUFF + CALL DMASET ;set standard dma address. + CALL GETDSK + LD (CDRIVE),A ;set current drive. + CALL CONVFST ;convert name typed in. + CALL NZ,SYNERR ;wild cards are not allowed. + LD A,(CHGDRV) ;if a change in drives was indicated, + OR A ;then treat this as an unknown command + JP NZ,UNKNOWN ;which gets executed. + CALL SEARCH ;else search command table for a match. +; +; Note that an unknown command returns +; with (A) pointing to the last address +; in our table which is (UNKNOWN). +; + LD HL,CMDADR ;now, look thru our address table for command (A). + LD E,A ;set (DE) to command number. + LD D,0 + ADD HL,DE + ADD HL,DE ;(HL)=(CMDADR)+2*(command number). + LD A,(HL) ;now pick out this address. + INC HL + LD H,(HL) + LD L,A + JP (HL) ;now execute it. +; +; CP/M command address table. +; +CMDADR: DEFW DIRECT,ERASE,TYPE,SAVE + DEFW RENAME,USER,CLS_COMMAND,UNKNOWN +; +; Halt the system. Reason for this is unknown at present. +; +HALTX: LD HL,76F3H ;'DI HLT' instructions. + LD (CBASE),HL + LD HL,CBASE + JP (HL) +; +; Read error while TYPEing a file. +; +RDERROR:LD BC,RDERR + JP PLINE +RDERR: DEFB 'Read error',0 +; +; Required file was not located. +; +NONE: LD BC,NOFILE + JP PLINE +NOFILE: DEFB 'No file',0 +; +; Decode a command of the form 'A>filename number{ filename}. +; Note that a drive specifier is not allowed on the first file +; name. On return, the number is in register (A). Any error +; causes 'filename?' to be printed and the command is aborted. +; +DECODE: CALL CONVFST ;convert filename. + LD A,(CHGDRV) ;do not allow a drive to be specified. + OR A + JP NZ,SYNERR + LD HL,FCB+1 ;convert number now. + LD BC,11 ;(B)=sum register, (C)=max digit count. +DECODE1:LD A,(HL) + CP ' ' ;a space terminates the numeral. + JP Z,DECODE3 + INC HL + SUB '0' ;make binary from ascii. + CP 10 ;legal digit? + JP NC,SYNERR + LD D,A ;yes, save it in (D). + LD A,B ;compute (B)=(B)*10 and check for overflow. + AND 0E0H + JP NZ,SYNERR + LD A,B + RLCA + RLCA + RLCA ;(A)=(B)*8 + ADD A,B ;.......*9 + JP C,SYNERR + ADD A,B ;.......*10 + JP C,SYNERR + ADD A,D ;add in new digit now. +DECODE2:JP C,SYNERR + LD B,A ;and save result. + DEC C ;only look at 11 digits. + JP NZ,DECODE1 + RET +DECODE3:LD A,(HL) ;spaces must follow (why?). + CP ' ' + JP NZ,SYNERR + INC HL +DECODE4:DEC C + JP NZ,DECODE3 + LD A,B ;set (A)=the numeric value entered. + RET +; +; Move 3 bytes from (HL) to (DE). Note that there is only +; one reference to this at (A2D5h). +; +MOVE3: LD B,3 +; +; Move (B) bytes from (HL) to (DE). +; +HL2DE: LD A,(HL) + LD (DE),A + INC HL + INC DE + DEC B + JP NZ,HL2DE + RET +; +; Compute (HL)=(TBUFF)+(A)+(C) and get the byte that's here. +; +EXTRACT:LD HL,TBUFF + ADD A,C + CALL ADDHL + LD A,(HL) + RET +; +; Check drive specified. If it means a change, then the new +; drive will be selected. In any case, the drive byte of the +; fcb will be set to null (means use current drive). +; +DSELECT:XOR A ;null out first byte of fcb. + LD (FCB),A + LD A,(CHGDRV) ;a drive change indicated? + OR A + RET Z + DEC A ;yes, is it the same as the current drive? + LD HL,CDRIVE + CP (HL) + RET Z + JP DSKSEL ;no. Select it then. +; +; Check the drive selection and reset it to the previous +; drive if it was changed for the preceeding command. +; +RESETDR:LD A,(CHGDRV) ;drive change indicated? + OR A + RET Z + DEC A ;yes, was it a different drive? + LD HL,CDRIVE + CP (HL) + RET Z + LD A,(CDRIVE) ;yes, re-select our old drive. + JP DSKSEL +; +;************************************************************** +;* +;* D I R E C T O R Y C O M M A N D +;* +;************************************************************** +; +DIRECT: + CALL CONVFST ;convert file name. + CALL DSELECT ;select indicated drive. + LD HL,FCB+1 ;was any file indicated? + LD A,(HL) + CP ' ' + JP NZ,DIRECT2 + LD B,11 ;no. Fill field with '?' - same as *.*. +DIRECT1:LD (HL),'?' + INC HL + DEC B + JP NZ,DIRECT1 +DIRECT2:LD E,0 ;set initial cursor position. + PUSH DE + CALL SRCHFCB ;get first file name. + CALL Z,NONE ;none found at all? +DIRECT3: + JP Z,DIRECT9 ;terminate if no more names. + LD A,(RTNCODE) ;get file's position in segment (0-3). + RRCA + RRCA + RRCA + AND 60H ;(A)=position*32 + LD C,A + LD A,10 + CALL EXTRACT ;extract the tenth entry in fcb. + RLA ;check system file status bit. + JP C,DIRECT8 ;we don't list them. + POP DE + LD A,E ;bump name count. + INC E + PUSH DE + AND 03H ;at end of line? + PUSH AF + JP NZ,DIRECT4 + CALL CRLF ;yes, end this line and start another. + PUSH BC + CALL GETDSK ;start line with ('A:'). + POP BC + ADD A,'A' + CALL PRINTB + LD A,':' + CALL PRINTB + JP DIRECT5 +DIRECT4: + CALL SPACE ;add seperator between file names. + LD A,'|' ; [JSS: Changed this from colon to pipe] + CALL PRINTB +DIRECT5:CALL SPACE + LD B,1 ;'extract' each file name character at a time. +DIRECT6:LD A,B + CALL EXTRACT + AND 7FH ;strip bit 7 (status bit). + CP ' ' ;are we at the end of the name? + JP NZ,DRECT65 + POP AF ;yes, don't print spaces at the end of a line. + PUSH AF + CP 3 + JP NZ,DRECT63 + LD A,9 ;first check for no extension. + CALL EXTRACT + AND 7FH + CP ' ' + JP Z,DIRECT7 ;don't print spaces. +DRECT63: + LD A,' ' ;else print them. +DRECT65: + CALL PRINTB + INC B ;bump to next character position. + LD A,B + CP 12 ;end of the name? + JP NC,DIRECT7 + CP 9 ;nope, starting extension? + JP NZ,DIRECT6 + LD A,'.' ; [JSS: Changed this from space to dot] + CALL PRINTB + JP DIRECT6 +DIRECT7: + POP AF ;get the next file name. +DIRECT8: + ;CALL CHKCON ;first check console, quit on anything. + ;JP NZ,DIRECT9 + CALL SRCHNXT ;get next name. + JP DIRECT3 ;and continue with our list. +DIRECT9: + POP DE ;restore the stack and return to command level. + JP GETBACK +; +;************************************************************** +;* +;* E R A S E C O M M A N D +;* +;************************************************************** +; +ERASE: CALL CONVFST ;convert file name. + CP 11 ;was '*.*' entered? + JP NZ,ERASE1 + LD BC,YESNO ;yes, ask for confirmation. + CALL PLINE + CALL GETINP + LD HL,INBUFF+1 + DEC (HL) ;must be exactly 'y'. + JP NZ,CMMND1 + INC HL + LD A,(HL) + CP 'Y' + JP NZ,CMMND1 + INC HL + LD (INPOINT),HL ;save input line pointer. +ERASE1: CALL DSELECT ;select desired disk. + LD DE,FCB + CALL DELETE ;delete the file. + INC A + CALL Z,NONE ;not there? + JP GETBACK ;return to command level now. +YESNO: DEFB 'All (y/n)?',0 +; +;************************************************************** +;* +;* T Y P E C O M M A N D +;* +;************************************************************** +; +TYPE: CALL CONVFST ;convert file name. + JP NZ,SYNERR ;wild cards not allowed. + CALL DSELECT ;select indicated drive. + CALL OPENFCB ;open the file. + JP Z,TYPE5 ;not there? + CALL CRLF ;ok, start a new line on the screen. + LD HL,NBYTES ;initialize byte counter. + LD (HL),0FFH ;set to read first sector. +TYPE1: LD HL,NBYTES +TYPE2: LD A,(HL) ;have we written the entire sector? + CP 128 + JP C,TYPE3 + PUSH HL ;yes, read in the next one. + CALL READFCB + POP HL + JP NZ,TYPE4 ;end or error? + XOR A ;ok, clear byte counter. + LD (HL),A +TYPE3: INC (HL) ;count this byte. + LD HL,TBUFF ;and get the (A)th one from the buffer (TBUFF). + CALL ADDHL + LD A,(HL) + CP CNTRLZ ;end of file mark? + JP Z,GETBACK + CALL PRINT ;no, print it. + JP TYPE1 +; +; Get here on an end of file or read error. +; +TYPE4: DEC A ;read error? + JP Z,GETBACK + CALL RDERROR ;yes, print message. +TYPE5: CALL RESETDR ;and reset proper drive + JP SYNERR ;now print file name with problem. +; +;************************************************************** +;* +;* S A V E C O M M A N D +;* +;************************************************************** +; +SAVE: CALL DECODE ;get numeric number that follows SAVE. + PUSH AF ;save number of pages to write. + CALL CONVFST ;convert file name. + JP NZ,SYNERR ;wild cards not allowed. + CALL DSELECT ;select specified drive. + LD DE,FCB ;now delete this file. + PUSH DE + CALL DELETE + POP DE + CALL CREATE ;and create it again. + JP Z,SAVE3 ;can't create? + XOR A ;clear record number byte. + LD (FCB+32),A + POP AF ;convert pages to sectors. + LD L,A + LD H,0 + ADD HL,HL ;(HL)=number of sectors to write. + LD DE,TBASE ;and we start from here. +SAVE1: LD A,H ;done yet? + OR L + JP Z,SAVE2 + DEC HL ;nope, count this and compute the start + PUSH HL ;of the next 128 byte sector. + LD HL,128 + ADD HL,DE + PUSH HL ;save it and set the transfer address. + CALL DMASET + LD DE,FCB ;write out this sector now. + CALL WRTREC + POP DE ;reset (DE) to the start of the last sector. + POP HL ;restore sector count. + JP NZ,SAVE3 ;write error? + JP SAVE1 +; +; Get here after writing all of the file. +; +SAVE2: LD DE,FCB ;now close the file. + CALL CLOSE + INC A ;did it close ok? + JP NZ,SAVE4 +; +; Print out error message (no space). +; +SAVE3: LD BC,NOSPACE + CALL PLINE +SAVE4: CALL STDDMA ;reset the standard dma address. + JP GETBACK +NOSPACE:DEFB 'No space',0 +; +;************************************************************** +;* +;* R E N A M E C O M M A N D +;* +;************************************************************** +; +RENAME: + CALL CONVFST ;convert first file name. + JP NZ,SYNERR ;wild cards not allowed. + LD A,(CHGDRV) ;remember any change in drives specified. + PUSH AF + CALL DSELECT ;and select this drive. + CALL SRCHFCB ;is this file present? + JP NZ,RENAME6 ;yes, print error message. + LD HL,FCB ;yes, move this name into second slot. + LD DE,FCB+16 + LD B,16 + CALL HL2DE + LD HL,(INPOINT) ;get input pointer. + EX DE,HL + CALL NONBLANK ;get next non blank character. + CP '=' ;only allow an '=' or '<' seperator. + JP Z,RENAME1 + CP '<' + JP NZ,RENAME5 +RENAME1: + EX DE,HL + INC HL ;ok, skip seperator. + LD (INPOINT),HL ;save input line pointer. + CALL CONVFST ;convert this second file name now. + JP NZ,RENAME5 ;again, no wild cards. + POP AF ;if a drive was specified, then it + LD B,A ;must be the same as before. + LD HL,CHGDRV + LD A,(HL) + OR A + JP Z,RENAME2 + CP B + LD (HL),B + JP NZ,RENAME5 ;they were different, error. +RENAME2: + LD (HL),B ; reset as per the first file specification. + XOR A + LD (FCB),A ;clear the drive byte of the fcb. +RENAME3: + CALL SRCHFCB ;and go look for second file. + JP Z,RENAME4 ;doesn't exist? + LD DE,FCB + CALL RENAM ;ok, rename the file. + JP GETBACK +; +; Process rename errors here. +; +RENAME4: + CALL NONE ;file not there. + JP GETBACK +RENAME5: + CALL RESETDR ;bad command format. + JP SYNERR +RENAME6: + LD BC,EXISTS ;destination file already exists. + CALL PLINE + JP GETBACK +EXISTS: + DEFB 'File exists',0 +; +;************************************************************** +;* +;* U S E R C O M M A N D +;* +;************************************************************** +; +USER: + CALL DECODE ;get numeric value following command. + CP 16 ;legal user number? + JP NC,SYNERR + LD E,A ;yes but is there anything else? + LD A,(FCB+1) + CP ' ' + JP Z,SYNERR ;yes, that is not allowed. + CALL GETSETUC ;ok, set user code. + JP GETBACK1 + + +;************************************************************** +; +; Clear screen (CLS) command +; +;************************************************************** + +CLS_COMMAND: + LD BC, CLEAR_SCREEN_ANSI + CALL PLINE + JP GETBACK + +CLEAR_SCREEN_ANSI: + db 27, "[2J" ; "clear" + db 27, "[H" ; "home" + db 0 + +; +;************************************************************** +;* +;* T R A N S I E N T P R O G R A M C O M M A N D +;* +;************************************************************** +; +UNKNOWN: + LD A,(FCB+1) ;anything to execute? + CP ' ' + JP NZ,UNKWN1 + LD A,(CHGDRV) ;nope, only a drive change? + OR A + JP Z,GETBACK1 ;neither??? + DEC A + LD (CDRIVE),A ;ok, store new drive. + CALL MOVECD ;set (TDRIVE) also. + CALL DSKSEL ;and select this drive. + JP GETBACK1 ;then return. +; +; Here a file name was typed. Prepare to execute it. +; +UNKWN1: + LD DE,FCB+9 ;an extension specified? + LD A,(DE) + CP ' ' + JP NZ,SYNERR ;yes, not allowed. +UNKWN2: + PUSH DE + CALL DSELECT ;select specified drive. + POP DE + LD HL,COMFILE ;set the extension to 'COM'. + CALL MOVE3 + CALL OPENFCB ;and open this file. + JP Z,UNKWN9 ;not present? +; +; Load in the program. +; + LD HL,TBASE ;store the program starting here. +UNKWN3: + PUSH HL + EX DE,HL + CALL DMASET ;set transfer address. + LD DE,FCB ;and read the next record. + CALL RDREC + JP NZ,UNKWN4 ;end of file or read error? + POP HL ;nope, bump pointer for next sector. + LD DE,128 + ADD HL,DE + LD DE,CBASE ;enough room for the whole file? + LD A,L + SUB E + LD A,H + SBC A,D + JP NC,UNKWN0 ;no, it can't fit. + JP UNKWN3 +; +; Get here after finished reading. +; +UNKWN4: + POP HL + DEC A ;normal end of file? + JP NZ,UNKWN99 + CALL RESETDR ;yes, reset previous drive. + CALL CONVFST ;convert the first file name that follows + LD HL,CHGDRV ;command name. + PUSH HL + LD A,(HL) ;set drive code in default fcb. + LD (FCB),A + LD A,16 ;put second name 16 bytes later. + CALL CONVERT ;convert second file name. + POP HL + LD A,(HL) ;and set the drive for this second file. + LD (FCB+16),A + XOR A ;clear record byte in fcb. + LD (FCB+32),A + LD DE,TFCB ;move it into place at(005Ch). + LD HL,FCB + LD B,33 + CALL HL2DE + LD HL,INBUFF+2 ;now move the remainder of the input +UNKWN5: + LD A,(HL) ;line down to (0080h). Look for a non blank. + OR A ;or a null. + JP Z,UNKWN6 + CP ' ' + JP Z,UNKWN6 + INC HL + JP UNKWN5 +; +; Do the line move now. It ends in a null byte. +; +UNKWN6: + LD B,0 ;keep a character count. + LD DE,TBUFF+1 ;data gets put here. +UNKWN7: + LD A,(HL) ;move it now. + LD (DE),A + OR A + JP Z,UNKWN8 + INC B + INC HL + INC DE + JP UNKWN7 +UNKWN8: + LD A,B ;now store the character count. + LD (TBUFF),A + CALL CRLF ;clean up the screen. + CALL STDDMA ;set standard transfer address. + CALL SETCDRV ;reset current drive. + CALL TBASE ;and execute the program. +; +; Transiant programs return here (or reboot). +; + LD SP,BATCH ;set stack first off. + CALL MOVECD ;move current drive into place (TDRIVE). + CALL DSKSEL ;and reselect it. + JP CMMND1 ;back to comand mode. +; +; Get here if some error occured. +; +UNKWN9: + CALL RESETDR ;inproper format. + JP SYNERR +UNKWN0: + LD BC,BADLOAD ;read error or won't fit. + CALL PLINE + JP GETBACK +UNKWN99: + LD BC,BADLOAD99 ;read error or won't fit. + CALL PLINE + JP GETBACK +BADLOAD: + DEFB 'Bad load 0',0 +BADLOAD99: + DEFB 'Bad load 99',0 +COMFILE: + DEFB 'COM' ;command file extension. +; +; Get here to return to command level. We will reset the +; previous active drive and then either return to command +; level directly or print error message and then return. +; +GETBACK:CALL RESETDR ;reset previous drive. +GETBACK1: CALL CONVFST ;convert first name in (FCB). + LD A,(FCB+1) ;if this was just a drive change request, + SUB ' ' ;make sure it was valid. + LD HL,CHGDRV + OR (HL) + JP NZ,SYNERR + JP CMMND1 ;ok, return to command level. + +; +; ccp stack area. +; + DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +CCPSTACK: + defb 0,0 ; I changed the syntax here in case my assembler was unable to understand what "$" means. +; +; Batch (or SUBMIT) processing information storage. +; +BATCH: DEFB 0 ;batch mode flag (0=not active). +BATCHFCB: DEFB 0,'$$$ SUB',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +; +; File control block setup by the CCP. +; +FCB: DEFB 0,' ',0,0,0,0,0,' ',0,0,0,0,0 +RTNCODE:DEFB 0 ;status returned from bdos call. +CDRIVE: DEFB 0 ;currently active drive. +CHGDRV: DEFB 0 ;change in drives flag (0=no change). +NBYTES: DEFW 0 ;byte counter used by TYPE. +SEARCH_DRIVE: DEFB 1 ;search drive: default to A: diff --git a/ccp/ccp.bin b/ccp/ccp.bin new file mode 100644 index 0000000000000000000000000000000000000000..64b7c1618cbc54b63a75527da126845ab6ffd55d GIT binary patch literal 2052 zcmcIlZ)_Ar6rZ!bYia4V#|flI#a*^hN)s#>IOx${X-laX1alRIU@R32G^w_>#NGwG zwnl{z_=1uU6Ta{TO^6K|I824uS!(VU$Fyfkq{{5Sn@g}kX-$b}-1=s(5@U?t++^R* zy!V@#_kQoqTe(q}>-2uq*wr2F={Rukkg%qDeYLQ1Uxn~WRM^~cpyNFCnN?|UA{owMF4GeyFn5s z@>{GX=`NOKI^_R@d2Taz@k4D1Xx$zz7J&epoS|-Sc3nK_epLS5RwC8C7>4d89Jv(C z%jetzNBPvF@Q8ElvOgCkgL903thVp0!(*A&WN?_pm9r|S;~{kYD)oH9$PLOhH(0Iz z2gc_}#b;Gd9u)_WYk*W5qQU}5TE|Vg4TZ(9RLrO30wqaR`9vj?s@$Q2B%(Eij?eyp6!b#EMam+O<1)Ft2JS*PFTT&wJ~AUB&<*( zX`8?F${VzIyT;0sAtc^rq(NhB$d59sj?pQyL7Q4}oKES!xYDE1P0e1P6;z_yGVr2L z?$;uK>-M_xNvWos(Y`;mCtBWKyc!7nk&azjZ>PJ8&WnN zbNqE1f6>O@0(>HiPXS&EASeDFyf{X6Mp=nPUGO1MY))G>-dqKyhw~`c*y9913x+H>r>;GNFQ& zW1F?>GinfJ;`nr$EY`)3^wuS)v@|B|@4B~U8MD&g$ zq08rKxV`OFp}nW4s|Pu5amDs7VSh(wJAz&9EoW4bGN6GczRZwrR#^q98TG|TM#D2| zBrh*-0Fuq$x8ZFr!qa*ZpkR}VaG4QFx^iNRBuGuAk%T%Pgj~mxL;l;0Z=R@y>v1gs z#r3z@e6=-eq}G6=`DPKrRT!uP^4>6(qX}}4e*LYkATwyO;^N}W-W{O=vesBS`I|9* zxNIVmGm9@7z}YC!GXktZD+q#+uNveW4IP0Yd|i$RtjYAl?uIcvYvo|g2rZabDG!X0 z0Jz+UwJ`O-uohr!gjVxCurW=hs61$l%f~tKRv~`UbgVbYd7c%xX6tZ=4i&STf1rRM z2Iw5*KCJwr?4{m)aw;>oM2!H0A!3R@0sAR=*R@-K*X$p$xf3Ir>f(AbEt1E z5XX75dKi)o~q9n(}8RpXsy)Yo;S(N0U;)T_}d$?zVk)HGs2_rCILqJ&Jdw;o^Gk zGFJ&Srulno)hf%=Rt*lPr|j4vz;JrHSwxvwT-lJm(hbvYo_p9p*_P%b*kybC&n(;XG_uY3VwzWz zauWI|T#hOg?h=4K8OCqnj5+}kjEhGZsj!*f#YE&_Q}cvC%l#>>!|f{dAo|w(M?Orw z%;ay A: @@ -93,18 +118,17 @@ type CPM struct { findFirstResults []string findOffset int - // Reader is where we get our STDIN from + // Reader is where we get our STDIN from. + // + // TODO: We should have something similar for STDOUT. Reader *bufio.Reader - // Filename holds the binary we're executing - Filename string - - // Logger holds a logger, if null then no logs will be kept + // Logger holds a logger which we use for debugging and diagnostics. Logger *slog.Logger } // New returns a new emulation object -func New(filename string, logger *slog.Logger) *CPM { +func New(logger *slog.Logger) *CPM { // // Create and populate our syscall table @@ -138,6 +162,10 @@ func New(filename string, logger *slog.Logger) *CPM { Desc: "SETDMA", Handler: SysCallSetDMA, } + sys[12] = CPMHandler{ + Desc: "S_BDOSVER", + Handler: SysCallBDOSVersion, + } sys[13] = CPMHandler{ Desc: "DRV_ALLRESET", Handler: SysCallDriveAllReset, @@ -209,38 +237,32 @@ func New(filename string, logger *slog.Logger) *CPM { // Create the object tmp := &CPM{ - Filename: filename, Logger: logger, Reader: bufio.NewReader(os.Stdin), Syscalls: sys, dma: 0x0080, + start: 0x0100, files: make(map[uint16]FileCache), } return tmp } -// Execute executes our named binary, with the specified arguments. -// -// The function will not return until the process being executed terminates, -// and any error will be returned. -func (cpm *CPM) Execute(args []string) error { +// LoadBinary loads the given CP/M binary at the default address of 0x0100, +// where it can then be launched by Execute. +func (cpm *CPM) LoadBinary(filename string) error { // Create 64K of memory, full of NOPs cpm.Memory = new(memory.Memory) - // Load our binary into it - err := cpm.Memory.LoadFile(cpm.Filename) + // Load our binary into the memory + err := cpm.Memory.LoadFile(cpm.start, filename) if err != nil { - return (fmt.Errorf("failed to load %s: %s", cpm.Filename, err)) + return (fmt.Errorf("failed to load %s: %s", filename, err)) } - // Convert our array of CLI arguments to a string. - cli := strings.Join(args, " ") - cli = strings.TrimSpace(strings.ToUpper(cli)) - // - // By default any command-line arguments need to be copied - // to 0x0080 - as a pascal-prefixed string. + // Any command-line arguments need to be copied to the DMA area, + // which defaults to 0x0080, as a pascal-prefixed string. // // If there are arguments the default FCBs need to be updated // appropriately too. @@ -259,16 +281,78 @@ func (cpm *CPM) Execute(args []string) error { cpm.Memory.Set(0x006C, 0x00) cpm.Memory.FillRange(0x006C+1, 11, ' ') - // Now setup FCB1 if we have a first argument + return nil +} + +// LoadCCP loads the CCP into RAM, to be executed instead of an external binary. +// +// This function modifies the "start" attribute, to ensure the CCP is loaded +// and executed at a higher address than the default of 0x0100. +func (cpm *CPM) LoadCCP() { + + // Create 64K of memory, full of NOPs + cpm.Memory = new(memory.Memory) + + // Get our embedded CCP + data := ccp.CCPBinary + + // The location in RAM of the binary + var ccpEntrypoint uint16 = 0xDE00 + + // Load it into memory + cpm.Memory.SetRange(ccpEntrypoint, data[:]...) + + // DMA area / CLI Args are going to be unset. + cpm.Memory.Set(0x0080, 0x00) + cpm.Memory.FillRange(0x0081, 31, 0x00) + + // FCB1: Default drive, spaces for filenames. + cpm.Memory.Set(0x005C, 0x00) + cpm.Memory.FillRange(0x005C+1, 11, ' ') + + // FCB2: Default drive, spaces for filenames. + cpm.Memory.Set(0x006C, 0x00) + cpm.Memory.FillRange(0x006C+1, 11, ' ') + + // Ensure our starting point is what we expect + cpm.start = ccpEntrypoint +} + +// Execute executes our named binary, with the specified arguments. +// +// The function will not return until the process being executed terminates, +// and any error will be returned. +func (cpm *CPM) Execute(args []string) error { + + // Create the CPU, pointing to our memory + // starting point for PC will be the binary entry-point + cpm.CPU = z80.CPU{ + States: z80.States{ + SPR: z80.SPR{ + PC: cpm.start, + }, + }, + Memory: cpm.Memory, + } + + // Setup a breakpoint on 0x0005 - the BIOS entrypoint. + cpm.CPU.BreakPoints = map[uint16]struct{}{} + cpm.CPU.BreakPoints[0x05] = struct{}{} + + // Convert our array of CLI arguments to a string. + cli := strings.Join(args, " ") + cli = strings.TrimSpace(strings.ToUpper(cli)) + + // Setup FCB1 if we have a first argument if len(args) > 0 { x := fcb.FromString(args[0]) - cpm.Memory.PutRange(0x005C, x.AsBytes()[:]...) + cpm.Memory.SetRange(0x005C, x.AsBytes()[:]...) } - // Now setup FCB2 if we have a second argument + // Setup FCB2 if we have a second argument if len(args) > 1 { x := fcb.FromString(args[1]) - cpm.Memory.PutRange(0x006C, x.AsBytes()[:]...) + cpm.Memory.SetRange(0x006C, x.AsBytes()[:]...) } // Poke in the CLI argument as a Pascal string. @@ -279,22 +363,10 @@ func (cpm *CPM) Execute(args []string) error { // (i.e. first byte is the length, then the data follows). cpm.Memory.Set(0x0080, uint8(len(cli))) for i, c := range cli { - cpm.Memory.PutRange(0x0081+uint16(i), uint8(c)) + cpm.Memory.SetRange(0x0081+uint16(i), uint8(c)) } } - // Create the CPU, pointing to our memory - // starting point for PC will be the binary entry-point - cpm.CPU = z80.CPU{ - States: z80.States{SPR: z80.SPR{PC: 0x100}}, - Memory: cpm.Memory, - } - - // Setup a breakpoint on 0x0005 - // That's the BIOS entrypoint - cpm.CPU.BreakPoints = map[uint16]struct{}{} - cpm.CPU.BreakPoints[0x05] = struct{}{} - // Run forever :) for { @@ -313,8 +385,8 @@ func (cpm *CPM) Execute(args []string) error { // OK we have a breakpoint error to handle. // - // That means we have a CP/M BIOS function to emulate, the syscall - // identifier is stored in the C-register. Get it. + // That means we have a CP/M BIOS function to emulate, + // the syscall identifier is stored in the C-register. syscall := cpm.CPU.States.BC.Lo // @@ -322,34 +394,67 @@ func (cpm *CPM) Execute(args []string) error { // handler, exists := cpm.Syscalls[syscall] - if exists { - cpm.Logger.Info("Calling BIOS emulation", - slog.String("name", handler.Desc), + // + // Nope: That will stop execution with a fatal log + // + if !exists { + + cpm.Logger.Error("Unimplemented SysCall", slog.Int("syscall", int(syscall)), - slog.String("syscallHex", fmt.Sprintf("0x%02X", syscall)), + slog.String("syscallHex", + fmt.Sprintf("0x%02X", syscall)), ) + return ErrUnimplemented + } - err := handler.Handler(cpm) - if err == ErrExit { - return nil - } - if err != nil { - return err - } - - // Return from call - cpm.CPU.PC = cpm.Memory.GetU16(cpm.CPU.SP) - // pop stack back. Fun - cpm.CPU.SP += 2 + // Log the call we're going to make + cpm.Logger.Info("SysCall", + slog.String("name", handler.Desc), + slog.Int("syscall", int(syscall)), + slog.String("syscallHex", + fmt.Sprintf("0x%02X", syscall)), + ) - } else { + // Invoke the handler + err = handler.Handler(cpm) - // Unknown opcode - cpm.Logger.Error("Unimplemented syscall", - slog.Int("syscall", int(syscall)), - slog.String("syscallHex", fmt.Sprintf("0x%02X", syscall)), - ) - return ErrUnimplemented + // Are we being asked to terminate CP/M? If so return + if err == ErrExit { + return nil } + // Any other error is fatal. + if err != nil { + return err + } + + // Return from call by getting the return address + // from the stack, and updating the instruction pointer + // to continue executing from there. + cpm.CPU.PC = cpm.Memory.GetU16(cpm.CPU.SP) + + // We need to remove the entry from the stack to cleanup + cpm.CPU.SP += 2 } } + +// SetDrives enables/disables the use of subdirectories upon the host system +// to represent CP/M drives +func (cpm *CPM) SetDrives(enabled bool) { + cpm.Drives = true +} + +// GetCurrentDrive retrieves the value of the current user-drive. +// +// We use this to maintain state when re-launching our CCP, after any child-process +// has terminated. +func (cpm *CPM) GetCurrentDrive() uint8 { + return cpm.currentDrive +} + +// SetCurrentDrive changes the default user-drive to the given value. +// +// We use this to maintain state when re-launching our CCP, after any child-process +// has terminated. +func (cpm *CPM) SetCurrentDrive(d uint8) { + cpm.currentDrive = d +} diff --git a/cpm/cpm_syscalls.go b/cpm/cpm_syscalls.go index b8434ed..95211bc 100644 --- a/cpm/cpm_syscalls.go +++ b/cpm/cpm_syscalls.go @@ -8,6 +8,7 @@ package cpm import ( "fmt" "io" + "log/slog" "os" "path/filepath" "strings" @@ -121,6 +122,16 @@ func SysCallSetDMA(cpm *CPM) error { return nil } +// SysCallBDOSVersion returns version details +func SysCallBDOSVersion(cpm *CPM) error { + cpm.CPU.States.AF.Hi = 0x20 + cpm.CPU.States.HL.Hi = 0x00 + cpm.CPU.States.HL.Lo = 0x20 + cpm.CPU.States.BC.Hi = 0x00 + + return nil +} + // SysCallDriveAllReset resets the drives func SysCallDriveAllReset(cpm *CPM) error { cpm.currentDrive = 1 @@ -163,9 +174,57 @@ func SysCallFileOpen(cpm *CPM) error { fileName += ext } + // Should we remap drives? + path := "." + if cpm.Drives { + path = string(cpm.currentDrive + 'A') + } + + // + // Ok we have a filename, but we probably have an upper-case + // filename. + // + // Run a glob, and if there's an existing file with the same + // name then replace with the mixed/lower cased version. + // + files, err2 := os.ReadDir(path) + if err2 == nil { + for _, n := range files { + if strings.ToUpper(n.Name()) == fileName { + fileName = n.Name() + } + } + } + + // Should we remap drives? + if cpm.Drives { + fileName = string(cpm.currentDrive+'A') + "/" + fileName + } + + // child logger with more details. + l := cpm.Logger.With( + slog.String("function", "SysCallFileOpen"), + slog.String("name", name), + slog.String("ext", ext), + slog.String("drive", string(cpm.currentDrive+'A')), + slog.String("result", fileName)) + // Now we open.. - file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0644) + file, err := os.OpenFile(fileName, os.O_RDWR, 0644) if err != nil { + + // We might fail to open a file because it doesn't + // exist. + if os.IsNotExist(err) { + + l.Debug("failed to open, file does not exist") + + cpm.CPU.States.AF.Hi = 0xff + return nil + } + + // Ok a different error + l.Debug("failed to open", slog.String("error", err.Error())) return err } @@ -191,8 +250,14 @@ func SysCallFileOpen(cpm *CPM) error { fcbPtr.RC = fLen } + l.Debug("result:OK", + slog.Int("fcb", int(ptr)), + slog.Int("handle", int(file.Fd())), + slog.Int("record_count", int(fcbPtr.RC)), + slog.Int64("file_size", fileSize)) + // Update the FCB in memory. - cpm.Memory.PutRange(ptr, fcbPtr.AsBytes()...) + cpm.Memory.SetRange(ptr, fcbPtr.AsBytes()...) // Return success cpm.CPU.States.AF.Hi = 0x00 @@ -209,7 +274,7 @@ func SysCallFileClose(cpm *CPM) error { // Get the file handle from our cache. obj, ok := cpm.files[ptr] if !ok { - return fmt.Errorf("SysCallFileClose: Tried to close a file that wasn't open") + return fmt.Errorf("tried to close a file that wasn't open") } err := obj.handle.Close() @@ -266,6 +331,11 @@ func SysCallFindFirst(cpm *CPM) error { pattern += string(c) } + // Should we remap drives? + if cpm.Drives { + pattern = string(cpm.currentDrive+'A') + "/" + pattern + } + // Run the glob. matches, err := filepath.Glob(pattern) if err != nil { @@ -282,15 +352,21 @@ func SysCallFindFirst(cpm *CPM) error { return nil } + // We need to strip the directory-name. + tmp := []string{} + for _, match := range matches { + tmp = append(tmp, filepath.Base(match)) + } + // Here we save the results in our cache, // dropping the first - cpm.findFirstResults = matches[1:] + cpm.findFirstResults = tmp[1:] cpm.findOffset = 0 // Create a new FCB and store it in the DMA entry - x := fcb.FromString(matches[0]) + x := fcb.FromString(tmp[0]) data := x.AsBytes() - cpm.Memory.PutRange(cpm.dma, data...) + cpm.Memory.SetRange(cpm.dma, data...) // Return 0x00 to point to the first entry in the DMA area. cpm.CPU.States.AF.Hi = 0x00 @@ -315,7 +391,7 @@ func SysCallFindNext(cpm *CPM) error { // Create a new FCB and store it in the DMA entry x := fcb.FromString(res) data := x.AsBytes() - cpm.Memory.PutRange(0x80, data...) + cpm.Memory.SetRange(0x80, data...) // Return 0x00 to point to the first entry in the DMA area. cpm.CPU.States.AF.Hi = 0x00 @@ -324,6 +400,8 @@ func SysCallFindNext(cpm *CPM) error { } // SysCallDeleteFile deletes the filename specified by the FCB in DE. +// +// TODO This should support globs .. func SysCallDeleteFile(cpm *CPM) error { // The pointer to the FCB @@ -344,6 +422,33 @@ func SysCallDeleteFile(cpm *CPM) error { fileName += ext } + // Should we remap drives? + path := "." + if cpm.Drives { + path = string(cpm.currentDrive + 'A') + } + + // + // Ok we have a filename, but we probably have an upper-case + // filename. + // + // Run a glob, and if there's an existing file with the same + // name then replace with the mixed/lower cased version. + // + files, err2 := os.ReadDir(path) + if err2 == nil { + for _, n := range files { + if strings.ToUpper(n.Name()) == fileName { + fileName = n.Name() + } + } + } + + // Should we remap drives? + if cpm.Drives { + fileName = string(cpm.currentDrive+'A') + "/" + fileName + } + // Delete the named file err := os.Remove(fileName) if os.IsNotExist(err) { @@ -395,13 +500,13 @@ func SysCallRead(cpm *CPM) error { } // Copy the data to the DMA area - cpm.Memory.PutRange(cpm.dma, data[:]...) + cpm.Memory.SetRange(cpm.dma, data[:]...) // Update the next read position fcbPtr.IncreaseSequentialOffset() // Update the FCB in memory - cpm.Memory.PutRange(ptr, fcbPtr.AsBytes()...) + cpm.Memory.SetRange(ptr, fcbPtr.AsBytes()...) // All done if err == io.EOF { @@ -409,6 +514,7 @@ func SysCallRead(cpm *CPM) error { } else { cpm.CPU.States.AF.Hi = 0x00 } + return nil } @@ -454,7 +560,7 @@ func SysCallWrite(cpm *CPM) error { fcbPtr.IncreaseSequentialOffset() // Update the FCB in memory - cpm.Memory.PutRange(ptr, fcbPtr.AsBytes()...) + cpm.Memory.SetRange(ptr, fcbPtr.AsBytes()...) // All done cpm.CPU.States.AF.Hi = 0x00 @@ -483,9 +589,46 @@ func SysCallMakeFile(cpm *CPM) error { fileName += ext } + // Should we remap drives? + path := "." + if cpm.Drives { + path = string(cpm.currentDrive + 'A') + } + + // + // Ok we have a filename, but we probably have an upper-case + // filename. + // + // Run a glob, and if there's an existing file with the same + // name then replace with the mixed/lower cased version. + // + files, err2 := os.ReadDir(path) + if err2 == nil { + for _, n := range files { + if strings.ToUpper(n.Name()) == fileName { + fileName = n.Name() + } + } + } + + // Should we remap drives? + if cpm.Drives { + fileName = string(cpm.currentDrive+'A') + "/" + fileName + } + + // child logger with more details. + l := cpm.Logger.With( + slog.String("function", "SysCallMakeFile"), + slog.String("name", name), + slog.String("ext", ext), + slog.String("drive", string(cpm.currentDrive+'A')), + slog.String("result", fileName)) + // Create the file - file, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0644) + file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0644) if err != nil { + + l.Debug("failed to open", slog.String("error", err.Error())) return err } @@ -511,8 +654,14 @@ func SysCallMakeFile(cpm *CPM) error { // Save the file-handle cpm.files[ptr] = FileCache{name: fileName, handle: file} + l.Debug("result:OK", + slog.Int("fcb", int(ptr)), + slog.Int("handle", int(file.Fd())), + slog.Int("record_count", int(fcbPtr.RC)), + slog.Int64("file_size", fileSize)) + // Update the FCB in memory - cpm.Memory.PutRange(ptr, fcbPtr.AsBytes()...) + cpm.Memory.SetRange(ptr, fcbPtr.AsBytes()...) cpm.CPU.States.AF.Hi = 0x00 return nil @@ -599,7 +748,7 @@ func SysCallReadRand(cpm *CPM) error { } } - cpm.Memory.PutRange(cpm.dma, data[:]...) + cpm.Memory.SetRange(cpm.dma, data[:]...) return 0 } @@ -630,7 +779,7 @@ func SysCallReadRand(cpm *CPM) error { res := sysRead(obj.handle, fpos) // Update the FCB in memory - cpm.Memory.PutRange(ptr, fcbPtr.AsBytes()...) + cpm.Memory.SetRange(ptr, fcbPtr.AsBytes()...) cpm.CPU.States.AF.Hi = uint8(res) return nil } @@ -667,36 +816,36 @@ func SysCallWriteRand(cpm *CPM) error { // Get file size, in bytes fi, err := obj.handle.Stat() if err != nil { - return fmt.Errorf("WriteRand:failed to get file size of: %s", err) + return fmt.Errorf("failed to get file size of: %s", err) } fileSize := fi.Size() // If the offset we're writing to is bigger than the file size then - // pad it up + // we need to add an appropriate amount of padding. padding := fileSize - fpos for padding > 0 { _, er := obj.handle.Write([]byte{0x00}) if er != nil { - return fmt.Errorf("WriteRand: error adding padding: %s", er) + return fmt.Errorf("error adding padding: %s", er) } padding-- } _, err = obj.handle.Seek(fpos, io.SeekStart) if err != nil { - return fmt.Errorf("SysCallWriteRandcannot seek to position %d: %s\n", fpos, err) + return fmt.Errorf("cannot seek to position %d: %s", fpos, err) } _, err = obj.handle.Write(data) if err != nil { - return fmt.Errorf("SysCalLWriteRand: failed to write to offset %d: %s\n", fpos, err) + return fmt.Errorf("failed to write to offset %d: %s", fpos, err) } fcbPtr.IncreaseSequentialOffset() // Update the FCB in memory - cpm.Memory.PutRange(ptr, fcbPtr.AsBytes()...) + cpm.Memory.SetRange(ptr, fcbPtr.AsBytes()...) cpm.CPU.States.AF.Hi = 0x00 return nil } diff --git a/main.go b/main.go index 60ac9c3..4782675 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,9 @@ -// entry point +// cpmulator entry-point / driver package main import ( + "flag" "fmt" "log/slog" "os" @@ -12,38 +13,124 @@ import ( func main() { - // Ensure we've been given the name of a file - if len(os.Args) < 2 { - fmt.Printf("Usage: cpmulator path/to/file.com [args]\n") - return + // + // Parse the command-line flags for this driver-application + // + useDirectories := flag.Bool("directories", false, "Use subdirectories on the host computer for CP/M drives.") + createDirectories := flag.Bool("create", false, "Create subdirectories on the host computer for each CP/M drive.") + flag.Parse() + + // Default arguments + args := []string{} + + // If we got a binary and more then we have args + if len(flag.Args()) > 2 { + args = flag.Args()[2:] } - // Setup our logging level - default to warnings or higher + // Setup our logging level - default to warnings or higher. lvl := new(slog.LevelVar) lvl.Set(slog.LevelWarn) - // But show "everything" if $DEBUG is non.empty + // But show everything if $DEBUG is non-empty. if os.Getenv("DEBUG") != "" { lvl.Set(slog.LevelDebug) } - // // Create our logging handler, using the level we've just setup - // - log := slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ - Level: lvl, - })) + log := slog.New( + slog.NewJSONHandler( + os.Stderr, + &slog.HandlerOptions{ + Level: lvl, + })) - // // Create a new emulator. - // - cpm := cpm.New(os.Args[1], log) + cpm := cpm.New(log) - // - // Run the binary we've been given. - // - err := cpm.Execute(os.Args[2:]) - if err != nil { - fmt.Printf("Error running %s: %s\n", os.Args[1], err) + // Should we create child-directories? If so, do so. + if *createDirectories { + for _, d := range []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P"} { + if _, err := os.Stat(d); os.IsNotExist(err) { + _ = os.Mkdir(d, 0755) + } + } + } + + // Are we using drives? + if *useDirectories { + + // Enable drives + cpm.SetDrives(true) + + // Count how many drives exist - if zero show a warning + found := 0 + for _, d := range []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P"} { + if _, err := os.Stat(d); err == nil { + found++ + } + } + if found == 0 { + fmt.Printf("WARNING: You've chosen to directories as drives.\n") + fmt.Printf(" i.e. A/ would be used for the contents of A:\n") + fmt.Printf(" i.e. B/ would be used for the contents of B:\n") + fmt.Printf("\n") + fmt.Printf("No drive-directories are present, you could fix this:\n") + fmt.Printf(" mkdir A\n") + fmt.Printf(" mkdir B\n") + fmt.Printf(" mkdir C\n") + fmt.Printf(" etc\n") + fmt.Printf("\n") + fmt.Printf("Run this program with '-create' to automatically create these directories.\n") + } + } + + // Load the binary, if we were given one. + if len(flag.Args()) > 1 { + + err := cpm.LoadBinary(flag.Args()[1]) + if err != nil { + fmt.Printf("%s\n", err) + return + } + + err = cpm.Execute(args) + if err != nil { + fmt.Printf("Error running %s: %s\n", flag.Args()[1], err) + } + } else { + // The drive will default to A:, or 0. + var drive uint8 + + // We load and re-run eternally - because many binaries the CCP + // would launch would end with "exit" which would otherwise cause + // our emulation to terminate + // + // + for { + // Load the CCP binary - reseting RAM + cpm.LoadCCP() + + // Set the current drive. + cpm.SetCurrentDrive(drive) + + // Run the CCP, which will often load a child-binary. + // The child-binary will call "P_TERMCPM" which will cause + // the CCP to terminate. + err := cpm.Execute(args) + if err != nil { + fmt.Printf("\nError running CCP: %s\n", err) + return + } + + // Get the drive, so that if the user changed it and we + // secretly restart the execution afresh after the child has + // terminated their drive persists. + // + // NOTE: UserNumber will reset to zero, but we don't use that.. + drive = cpm.GetCurrentDrive() + + } } + } diff --git a/memory/memory.go b/memory/memory.go index 3381c14..9701133 100644 --- a/memory/memory.go +++ b/memory/memory.go @@ -6,34 +6,12 @@ import ( "os" ) -// Memory provides 64K bytes array memory. +// Memory is our structure for representing the 64k of RAM +// that we run our programs within. type Memory struct { buf [65536]uint8 } -// Set sets a byte at addr of memory. -func (m *Memory) Set(addr uint16, value uint8) { - m.buf[addr] = value -} - -// Get returns a byte at addr of memory. -func (m *Memory) Get(addr uint16) uint8 { - return m.buf[addr] -} - -// GetU16 returns a word from the given address of memory. -func (m *Memory) GetU16(addr uint16) uint16 { - l := m.Get(addr) - h := m.Get(addr + 1) - return (uint16(h) << 8) | uint16(l) -} - -// PutRange copies bytes from the given data to the specified -// starting address in RAM. -func (m *Memory) PutRange(addr uint16, data ...uint8) { - copy(m.buf[int(addr):int(addr)+len(data)], data) -} - // FillRange fills an area of memory with the given byte func (m *Memory) FillRange(addr uint16, size int, char uint8) { for size > 0 { @@ -43,6 +21,11 @@ func (m *Memory) FillRange(addr uint16, size int, char uint8) { } } +// Get returns a byte at addr of memory. +func (m *Memory) Get(addr uint16) uint8 { + return m.buf[addr] +} + // GetRange returns the contents of a given range func (m *Memory) GetRange(addr uint16, size int) []uint8 { var ret []uint8 @@ -54,8 +37,17 @@ func (m *Memory) GetRange(addr uint16, size int) []uint8 { return ret } -// LoadFile loads a file from "Start" (0x0100) as program. -func (m *Memory) LoadFile(name string) error { +// GetU16 returns a word from the given address of memory. +func (m *Memory) GetU16(addr uint16) uint16 { + l := m.Get(addr) + h := m.Get(addr + 1) + return (uint16(h) << 8) | uint16(l) +} + +// LoadFile loads a file into the RAM, at the specified offset. +// +// Before loading the file all memory is filled with 0x00 (NOP). +func (m *Memory) LoadFile(offset uint16, name string) error { // Fill the 64k with NOP instructions for i := range m.buf { @@ -68,8 +60,19 @@ func (m *Memory) LoadFile(name string) error { return err } - // Put it into the starting location, 0x0100 - m.PutRange(0x0100, prog...) + // Put it into the starting locatioe. + m.SetRange(offset, prog...) return nil } + +// Set sets a byte at addr of memory. +func (m *Memory) Set(addr uint16, value uint8) { + m.buf[addr] = value +} + +// SetRange copies bytes from the given data to the specified +// starting address in RAM. +func (m *Memory) SetRange(addr uint16, data ...uint8) { + copy(m.buf[int(addr):int(addr)+len(data)], data) +} diff --git a/memory/memory_test.go b/memory/memory_test.go new file mode 100644 index 0000000..cb795a6 --- /dev/null +++ b/memory/memory_test.go @@ -0,0 +1,63 @@ +package memory + +import "testing" + +// TestMemoryTrivial just does basic get/set tests +func TestMemoryTrivial(t *testing.T) { + + mem := new(Memory) + + // Set + mem.Set(0x00, 0x01) + mem.Set(0x01, 0x02) + + // Get + if mem.Get(0x00) != 0x01 { + t.Fatalf("failed to get expected result") + } + if mem.Get(0x01) != 0x02 { + t.Fatalf("failed to get expected result") + } + // GetU16 + if mem.GetU16(0x00) != 0x0201 { + t.Fatalf("failed to get expected result") + } + + // Fill with 0xCD + mem.FillRange(0x00, 0xffff, 0xcd) + + if mem.Get(0xFFFE) != 0xcd { + t.Fatalf("failed to get expected result") + } + // GetU16 + if mem.GetU16(0x0100) != 0xcdcd { + t.Fatalf("failed to get expected result") + } + + // Get a random range + out := mem.GetRange(0x300, 0x00ff) + for _, d := range out { + if d != 0xcd { + t.Fatalf("wrong result in GetRange") + } + } + + // Put a (small) range + out = []uint8{0x01, 0x02, 0x03} + mem.SetRange(0x0000, out[:]...) + + if mem.Get(0x00) != 0x01 { + t.Fatalf("failed to get expected result") + } + if mem.Get(0x01) != 0x02 { + t.Fatalf("failed to get expected result") + } + // GetU16 + if mem.GetU16(0x00) != 0x0201 { + t.Fatalf("failed to get expected result") + } + if mem.GetU16(0x02) != 0xcd03 { + t.Fatalf("failed to get expected result") + } + +} diff --git a/samples/Makefile b/samples/Makefile index fa732ee..5b04d47 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -2,7 +2,7 @@ # # The files we wish to generate. # -all: cli-args.com create.com delete.com drive.com find.com ret.com user-num.com +all: cli-args.com create.com delete.com drive.com find.com ret.com user-num.com version.com # diff --git a/samples/README.md b/samples/README.md new file mode 100644 index 0000000..e61c6b3 --- /dev/null +++ b/samples/README.md @@ -0,0 +1,6 @@ +# Sample CP/M Binaries + +This directory contains some sample code, written in Z80 assembly, which were useful to my understanding when developing the emulator. + + +The top-level [dist/](../dist) directory contains more useful programs, including the various ZORK games. diff --git a/samples/version.com b/samples/version.com new file mode 100644 index 0000000000000000000000000000000000000000..040263aa09fa72d7ed99469cadccc8ea2c7c7807 GIT binary patch literal 58 zcmd<%Im^Y!$8eUFf$_tQv&xK&5`RGCoc}Mj=Y4PW+)7PU{pT_es0hK Date: Sat, 20 Apr 2024 06:39:24 +0300 Subject: [PATCH 2/4] Added the missing dist/ directory --- dist/LIHOUSE.COM | Bin 0 -> 13146 bytes dist/README.md | 6 ++++++ dist/ZORK1.COM | Bin 0 -> 8704 bytes dist/ZORK1.DAT | Bin 0 -> 84992 bytes dist/ZORK2.COM | Bin 0 -> 8704 bytes dist/ZORK2.DAT | Bin 0 -> 90112 bytes dist/ZORK3.COM | Bin 0 -> 8704 bytes dist/ZORK3.DAT | Bin 0 -> 82944 bytes 8 files changed, 6 insertions(+) create mode 100644 dist/LIHOUSE.COM create mode 100644 dist/README.md create mode 100644 dist/ZORK1.COM create mode 100644 dist/ZORK1.DAT create mode 100644 dist/ZORK2.COM create mode 100644 dist/ZORK2.DAT create mode 100644 dist/ZORK3.COM create mode 100644 dist/ZORK3.DAT diff --git a/dist/LIHOUSE.COM b/dist/LIHOUSE.COM new file mode 100644 index 0000000000000000000000000000000000000000..0470e6939be8be5aea9ddccb2e5667ee60fc06f6 GIT binary patch literal 13146 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 bJXzCF_by)EuW6{?yGzp!;-CAepV0mny7*%m literal 0 HcmV?d00001 diff --git a/dist/README.md b/dist/README.md new file mode 100644 index 0000000..de5759f --- /dev/null +++ b/dist/README.md @@ -0,0 +1,6 @@ +# CP/M Binaries + +This directory contains some games which are used to test the emulator. + +The top-level [samples/](../samples) directory contains much simpler sample code, +along with the corresponding Z80 assembly-language source code. diff --git a/dist/ZORK1.COM b/dist/ZORK1.COM new file mode 100644 index 0000000000000000000000000000000000000000..8a7bec1cc6002e4fa5ec55ac633be1ff25324249 GIT binary patch literal 8704 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 O6`a-o!We(@(EkJ+CiOf3 literal 0 HcmV?d00001 diff --git a/dist/ZORK1.DAT b/dist/ZORK1.DAT new file mode 100644 index 0000000000000000000000000000000000000000..b2eb461fb7112e03f8673c1443ad902ea020c955 GIT binary patch literal 84992 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 LrmXA#>;L|L*_f`( literal 0 HcmV?d00001 diff --git a/dist/ZORK2.COM b/dist/ZORK2.COM new file mode 100644 index 0000000000000000000000000000000000000000..e4eac0e9c2ba01c5f86744f09b9f8c5044d5b90d GIT binary patch literal 8704 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 Ng0uQx7~@YK`ky`>^*sOp literal 0 HcmV?d00001 diff --git a/dist/ZORK2.DAT b/dist/ZORK2.DAT new file mode 100644 index 0000000000000000000000000000000000000000..d14dc8cdee42c00869e4c24718ea97cdc63369a2 GIT binary patch literal 90112 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%0DoGwrA-Dt>i7$fS*hD}^ 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 literal 0 HcmV?d00001 diff --git a/dist/ZORK3.COM b/dist/ZORK3.COM new file mode 100644 index 0000000000000000000000000000000000000000..9b248ed2e4b586174f2d1ad1e2a0bec9b12be7f1 GIT binary patch literal 8704 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 O6`a-o!We(@(EkKr6!ks; literal 0 HcmV?d00001 diff --git a/dist/ZORK3.DAT b/dist/ZORK3.DAT new file mode 100644 index 0000000000000000000000000000000000000000..1aed086913f13549e8437df23e79e715730f4a9e GIT binary patch literal 82944 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 hg%G2 Date: Sat, 20 Apr 2024 06:48:53 +0300 Subject: [PATCH 3/4] Added -cd argument . --- README.md | 4 +++- main.go | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 45c4938..2a653e2 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ You can terminate the CCP by pressing Ctrl-C, otherwise interact with it as usua
Show the CCP built-in commands: + * `DIR` * List files, by default this uses "`*.*`", so files without suffixes will be hidden. * Prefer "`DIR *`" if you want to see _everything_. @@ -65,6 +66,7 @@ You can terminate the CCP by pressing Ctrl-C, otherwise interact with it as usua * View the contents of the named file - wildcards are not permitted. * `REN` * Rename files, so "`REN NEW = OLD`" - again wildcards are not permitted, nor is cross-drive renaming. This will fail until I've implemented F_RENAME. +
@@ -116,7 +118,7 @@ Now if you launch the emulator you'll see only the files which _should_ be visib ```sh -$ cpmulator -drives +$ cpmulator -directories A>DIR A: A: FOO .COM | LS .COM diff --git a/main.go b/main.go index 4782675..0f16900 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ func main() { // // Parse the command-line flags for this driver-application // + cd := flag.String("cd", "", "Change to this directory before launching") useDirectories := flag.Bool("directories", false, "Use subdirectories on the host computer for CP/M drives.") createDirectories := flag.Bool("create", false, "Create subdirectories on the host computer for each CP/M drive.") flag.Parse() @@ -48,6 +49,10 @@ func main() { // Create a new emulator. cpm := cpm.New(log) + // change directory? + if *cd != "" { + os.Chdir(*cd) + } // Should we create child-directories? If so, do so. if *createDirectories { for _, d := range []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P"} { From db97cb86265f17be4af5f8193973c646fb86b1db Mon Sep 17 00:00:00 2001 From: Steve Kemp Date: Sat, 20 Apr 2024 06:50:25 +0300 Subject: [PATCH 4/4] error-checking on os.Chdir --- main.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 0f16900..7302dff 100644 --- a/main.go +++ b/main.go @@ -51,8 +51,13 @@ func main() { // change directory? if *cd != "" { - os.Chdir(*cd) + err := os.Chdir(*cd) + if err != nil { + fmt.Printf("failed to change to %s:%s\n", *cd, err) + return + } } + // Should we create child-directories? If so, do so. if *createDirectories { for _, d := range []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P"} {