From 1ee2167c2ae88bb749e30cb1f0a9f70899ce1d61 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 19 Oct 2019 09:09:59 +0800 Subject: [PATCH] camel Forth build changes and fixes ; 19-Oct 19 v1.02 Convert to zsm assembler which ; identified and fixed incorrect ; case conversion when lowercase ; keywords are being passed in a ; macro. Remove Z80MR assembler --- Source/Forth/Build.cmd | 6 ++-- Source/Forth/Clean.cmd | 2 ++ Source/Forth/camel80.azm | 69 +++++++++++++++++++++----------------- Source/Forth/camel80d.azm | 18 +++++----- Source/Forth/camel80h.azm | 48 +++++++++++++------------- Tools/cpm/bin/Z80MR.COM | Bin 14336 -> 0 bytes Tools/cpm/bin/ZSM.COM | Bin 0 -> 22144 bytes 7 files changed, 78 insertions(+), 65 deletions(-) delete mode 100644 Tools/cpm/bin/Z80MR.COM create mode 100644 Tools/cpm/bin/ZSM.COM diff --git a/Source/Forth/Build.cmd b/Source/Forth/Build.cmd index d7ce3630..08fb735b 100644 --- a/Source/Forth/Build.cmd +++ b/Source/Forth/Build.cmd @@ -11,5 +11,7 @@ set ZXBINDIR=%TOOLS%/cpm/bin/ set ZXLIBDIR=%TOOLS%/cpm/lib/ set ZXINCDIR=%TOOLS%/cpm/include/ -zx z80mr camel80 -zx MLOAD25 -camel80.bin=camel80.hex +zx zsm =camel80.azm +zx link -CAMEL80.BIN=CAMEL80 + + diff --git a/Source/Forth/Clean.cmd b/Source/Forth/Clean.cmd index e2e6145a..ad58c78d 100644 --- a/Source/Forth/Clean.cmd +++ b/Source/Forth/Clean.cmd @@ -5,3 +5,5 @@ if exist *.bin del *.bin if exist *.lst del *.lst if exist *.prn del *.prn if exist *.hex del *.hex +if exist *.rel del *.rel +if exist *.sym del *.sym diff --git a/Source/Forth/camel80.azm b/Source/Forth/camel80.azm index b97396a4..a2ce8acf 100644 --- a/Source/Forth/camel80.azm +++ b/Source/Forth/camel80.azm @@ -60,6 +60,12 @@ FTH_LOC EQU 0200h ; 05 Nov 18 v1.02 Initial ROMWBW HBIOS version. ; 10-Nov 18 v1.02 New org address. ; b1ackmai1er difficultylevelhigh@gmail.com +; 19-Oct 19 v1.02 Convert to zsm assembler which +; identified and fixed incorrect +; case conversion when lowercase +; keywords are being passed in a +; macro. +; b1ackmai1er difficultylevelhigh@gmail.com ; =============================================== ; Macros to define Forth headers ; HEAD label,length,name,action @@ -75,25 +81,25 @@ FTH_LOC EQU 0200h DOCODE EQU 0 ; flag to indicate CODE words link DEFL 0 ; link to previous Forth word -head MACRO #label,#length,#name,#action +head MACRO label,length,name,action DW link DB 0 link DEFL $ - DB #length,'#name' -#label: - IF .NOT.(#action=DOCODE) - call #action + DB length,"&name" +label: + IFF (action EQ DOCODE) + call action ENDIF ENDM -immed MACRO #label,#length,#name,#action +immed MACRO label,length,name,action DW link DB 1 link DEFL $ - DB #length,'#name' -#label: - IF .NOT.(#action=DOCODE) - call #action + DB length,"&name" +label: + IFF (action EQ DOCODE) + call action ENDIF ENDM @@ -123,8 +129,10 @@ nexthl MACRO ; ...are not used in the CP/M implementation ; Instead, we have the... -; CP/M ENTRY POINT - org FTH_LOC ; Execute address +; RELOCATED ENTRY POINT + + .PHASE 0200H + reset: ld hl,0FDFFh ; HBIOS address, rounded down ld l,0 ; = end of avail.mem (EM) dec h ; EM-100h @@ -384,7 +392,7 @@ poptos: pop bc DW SWOP,OVER,EXIT ;C >R x -- R: -- x push to return stack - head TOR,2,>R,docode + head TOR,2,!>R,docode dec ix ; push TOS onto rtn stk ld (ix+0),b dec ix @@ -393,7 +401,7 @@ poptos: pop bc next ;C R> -- x R: x -- pop from return stack - head RFROM,2,R>,docode + head RFROM,2,R!>,docode push bc ; push old TOS ld c,(ix+0) ; pop top rtn stk item inc ix ; to TOS @@ -418,7 +426,7 @@ poptos: pop bc next ;Z SP! a-addr -- set data stack pointer - head SPSTORE,3,SP!,docode + head SPSTORE,3,SP!!,docode ld h,b ld l,c ld sp,hl @@ -433,7 +441,7 @@ poptos: pop bc next ;Z RP! a-addr -- set return stack pointer - head RPSTORE,3,RP!,docode + head RPSTORE,3,RP!!,docode push bc pop ix pop bc @@ -442,7 +450,7 @@ poptos: pop bc ; MEMORY AND I/O OPERATIONS ===================== ;C ! x a-addr -- store cell in memory - head STORE,1,!,docode + head STORE,1,!!,docode ld h,b ; address in hl ld l,c pop bc ; data in bc @@ -453,7 +461,7 @@ poptos: pop bc next ;C C! char c-addr -- store char in memory - head CSTORE,2,C!,docode + head CSTORE,2,C!!,docode ld h,b ; address in hl ld l,c pop bc ; data in bc @@ -478,7 +486,7 @@ poptos: pop bc next ;Z PC! char c-addr -- output char to port - head PCSTORE,3,PC!,docode + head PCSTORE,3,PC!!,docode pop hl ; char in L out (c),l ; to port (BC) pop bc ; pop new TOS @@ -588,7 +596,7 @@ mplus1: pop de ; restore saved IP next ;Z >< x1 -- x2 swap bytes (not ANSI) - head swapbytes,2,><,docode + head swapbytes,2,!>!<,docode ld a,b ld b,c ld c,a @@ -632,7 +640,7 @@ rsh2: djnz rsh1 next ;C +! n/u a-addr -- add cell to memory - head PLUSSTORE,2,+!,docode + head PLUSSTORE,2,+!!,docode pop hl ld a,(bc) ; low byte add a,l @@ -657,7 +665,7 @@ rsh2: djnz rsh1 next ;C 0< n -- flag true if TOS negative - head ZEROLESS,2,0<,docode + head ZEROLESS,2,0!<,docode sla b ; sign bit -> cy flag sbc a,a ; propagate cy through A ld b,a ; put 0000 or FFFF in TOS @@ -674,11 +682,11 @@ tosfalse: ld bc,0 next ;X <> x1 x2 -- flag test not eq (not ANSI) - head NOTEQUAL,2,<>,docolon + head NOTEQUAL,2,!,docolon DW EQUAL,ZEROEQUAL,EXIT ;C < n1 n2 -- flag test n1 n1 n2 -- flag test n1>n2, signed - head GREATER,1,>,docolon + head GREATER,1,!>,docolon DW SWOP,LESS,EXIT ;C U< u1 u2 -- flag test u1 u1 u2 -- flag u1>u2 unsgd (not ANSI) - head UGREATER,2,U>,docolon + head UGREATER,2,U!>,docolon DW SWOP,ULESS,EXIT ; LOOP AND BRANCH OPERATIONS ==================== @@ -949,7 +957,7 @@ cmovedone: exx ;X CMOVE> c-addr1 c-addr2 u -- move from top ; as defined in the ANSI optional String word set - head CMOVEUP,6,CMOVE>,docode + head CMOVEUP,6,CMOVE!>,docode push bc exx pop bc ; count @@ -1048,8 +1056,8 @@ sdiff: ; mismatch! undo last 'cpi' increment ld c,a snext: next -*INCLUDE camel80d.azm ; CPU Dependencies -*INCLUDE camel80h.azm ; High Level words +INCLUDE camel80d.azm ; CPU Dependencies +INCLUDE camel80h.azm ; High Level words lastword EQU link ; nfa of last word in dict. enddict EQU $ ; user's code starts here @@ -1057,6 +1065,7 @@ enddict EQU $ ; user's code starts here ds (FTH_SIZ-(enddict-reset)-1) nop + .DEPHASE END diff --git a/Source/Forth/camel80d.azm b/Source/Forth/camel80d.azm index 0dd13e3e..b2d15fda 100644 --- a/Source/Forth/camel80d.azm +++ b/Source/Forth/camel80d.azm @@ -74,7 +74,7 @@ noop: next ;C >BODY xt -- a-addr adrs of param field ; 3 + ; Z80 (3 byte CALL) - head TOBODY,5,>BODY,docolon + head TOBODY,5,!>BODY,docolon DW LIT,3,PLUS,EXIT ;X COMPILE, xt -- append execution token @@ -82,7 +82,7 @@ noop: next ; it is defined in the ANSI standard as COMPILE,. ; On a DTC Forth this simply appends xt (like , ) ; but on an STC Forth this must append 'CALL xt'. - head COMMAXT,8,'COMPILE,',docode + head COMMAXT,8,COMPILE!,,docode jp COMMA ;Z !CF adrs cfa -- set code action of a word @@ -90,13 +90,13 @@ noop: next ; 1+ ! ; Z80 VERSION ; Depending on the implementation this could ; append CALL adrs or JUMP adrs. - head STORECF,3,!CF,docolon + head STORECF,3,!!CF,docolon DW LIT,0CDH,OVER,CSTORE DW ONEPLUS,STORE,EXIT ;Z ,CF adrs -- append a code field ; HERE !CF 3 ALLOT ; Z80 VERSION (3 bytes) - head COMMACF,3,',CF',docolon + head COMMACF,3,!,CF,docolon DW HERE,STORECF,LIT,3,ALLOT,EXIT ;Z !COLON -- change code field to docolon @@ -104,7 +104,7 @@ noop: next ; This should be used immediately after CREATE. ; This is made a distinct word, because on an STC ; Forth, colon definitions have no code field. - head STORCOLON,6,'!COLON',docolon + head STORCOLON,6,!!COLON,docolon DW LIT,-3,ALLOT DW LIT,docolon,COMMACF,EXIT @@ -112,7 +112,7 @@ noop: next ; ['] EXIT ,XT ; ; This is made a distinct word, because on an STC ; Forth, it appends a RET instruction, not an xt. - head CEXIT,5,',EXIT',docolon + head CEXIT,5,!,EXIT,docolon DW LIT,EXIT,COMMAXT,EXIT ; CONTROL STRUCTURES ============================ @@ -123,21 +123,21 @@ noop: next ; xt is the branch operator to use, e.g. qbranch ; or (loop). It does NOT append the destination ; address. On the Z80 this is equivalent to ,XT. - head COMMABRANCH,7,',BRANCH',docode + head COMMABRANCH,7,!,BRANCH,docode jp COMMA ;Z ,DEST dest -- append a branch address ; This appends the given destination address to ; the branch instruction. On the Z80 this is ',' ; ...other CPUs may use relative addressing. - head COMMADEST,5,',DEST',docode + head COMMADEST,5,!,DEST,docode jp COMMA ;Z !DEST dest adrs -- change a branch dest'n ; Changes the destination address found at 'adrs' ; to the given 'dest'. On the Z80 this is '!' ; ...other CPUs may need relative addressing. - head STOREDEST,5,'!DEST',docode + head STOREDEST,5,!!DEST,docode jp STORE ; HEADER STRUCTURE ============================== diff --git a/Source/Forth/camel80h.azm b/Source/Forth/camel80h.azm index 10646031..d7a7c481 100644 --- a/Source/Forth/camel80h.azm +++ b/Source/Forth/camel80h.azm @@ -56,7 +56,7 @@ ;C >IN -- a-addr holds offset into TIB ; 2 USER >IN - head TOIN,3,>IN,douser + head TOIN,3,!>IN,douser dw 2 ;C BASE -- a-addr holds conversion radix @@ -132,7 +132,7 @@ TICKSOURCE: call douser ; in name! ;C S>D n -- d single -> double prec. ; DUP 0< ; - head STOD,3,S>D,docolon + head STOD,3,S!>D,docolon dw DUP,ZEROLESS,EXIT ;Z ?NEGATE n1 n2 -- n3 negate n1 if n2 negative @@ -254,7 +254,7 @@ MIN1: dw DROP,EXIT ;C 2! x1 x2 a-addr -- store 2 cells ; SWAP OVER ! CELL+ ! ; ; the top of stack is stored at the lower adrs - head TWOSTORE,2,2!,docolon + head TWOSTORE,2,2!!,docolon dw SWOP,OVER,STORE,CELLPLUS,STORE,EXIT ;C 2DROP x1 x2 -- drop 2 cells @@ -348,25 +348,25 @@ TYP5: DW EXIT ;Z (S") -- c-addr u run-time code for S" ; R> COUNT 2DUP + ALIGNED >R ; - head XSQUOTE,4,(S"),docolon + head XSQUOTE,4,(S""!),docolon DW RFROM,COUNT,TWODUP,PLUS,ALIGNED,TOR DW EXIT ;C S" -- compile in-line string ; COMPILE (S") [ HEX ] ; 22 WORD C@ 1+ ALIGNED ALLOT ; IMMEDIATE - immed SQUOTE,2,S",docolon + immed SQUOTE,2,S"",docolon DW LIT,XSQUOTE,COMMAXT DW LIT,22H,WORD,CFETCH,ONEPLUS DW ALIGNED,ALLOT,EXIT ;C ." -- compile string to print ; POSTPONE S" POSTPONE TYPE ; IMMEDIATE - immed DOTQUOTE,2,.",docolon + immed DOTQUOTE,2,."",docolon DW SQUOTE DW LIT,TYPE,COMMAXT DW EXIT - + ; NUMERIC OUTPUT ================================ ; Numeric conversion is done l.s.digit first, so ; the output buffer is built backwards in memory. @@ -394,12 +394,12 @@ TYP5: DW EXIT ;C <# -- begin numeric conversion ; PAD HP ! ; (initialize Hold Pointer) - head LESSNUM,2,<#,docolon + head LESSNUM,2,!<#,docolon DW PAD,HP,STORE,EXIT ;Z >digit n -- c convert to 0..9A..Z ; [ HEX ] DUP 9 > 7 AND + 30 + ; - head TODIGIT,6,>DIGIT,docolon + head TODIGIT,6,!>DIGIT,docolon DW DUP,LIT,9,GREATER,LIT,7,AND,PLUS DW LIT,30H,PLUS,EXIT @@ -417,7 +417,7 @@ NUMS1: DW NUM,TWODUP,OR,ZEROEQUAL,qbranch,NUMS1 ;C #> ud1 -- c-addr u end conv., get string ; 2DROP HP @ PAD OVER - ; - head NUMGREATER,2,#>,docolon + head NUMGREATER,2,#!>,docolon DW TWODROP,HP,FETCH,PAD,OVER,MINUS,EXIT ;C SIGN n -- add minus sign if n<0 @@ -434,7 +434,7 @@ SIGN1: DW EXIT ;C . n -- display n signed ; <# DUP ABS 0 #S ROT SIGN #> TYPE SPACE ; - head DOT,1,'.',docolon + head DOT,1,.,docolon DW LESSNUM,DUP,ABS,LIT,0,NUMS DW ROT,SIGN,NUMGREATER,TYPE,SPACE,EXIT @@ -465,12 +465,12 @@ SIGN1: DW EXIT ;C , x -- append cell to dict ; HERE ! 1 CELLS ALLOT ; - head COMMA,1,',',docolon + head COMMA,1,!,,docolon dw HERE,STORE,lit,1,CELLS,ALLOT,EXIT ;C C, char -- append char to dict ; HERE C! 1 CHARS ALLOT ; - head CCOMMA,2,'C,',docolon + head CCOMMA,2,C!,,docolon dw HERE,CSTORE,lit,1,CHARS,ALLOT,EXIT ; INTERPRETER =================================== @@ -491,7 +491,7 @@ SIGN1: DW EXIT ;Z >counted src n dst -- copy to counted str ; 2DUP C! CHAR+ SWAP CMOVE ; - head TOCOUNTED,8,>COUNTED,docolon + head TOCOUNTED,8,!>COUNTED,docolon DW TWODUP,CSTORE,CHARPLUS,SWOP,CMOVE,EXIT ;C WORD char -- c-addr n word delim'd by char @@ -516,12 +516,12 @@ WORD1: DW RFROM,RFROM,ROT,MINUS,TOIN,PLUSSTORE ;Z NFA>LFA nfa -- lfa name adr -> link field ; 3 - ; - head NFATOLFA,7,NFA>LFA,docolon + head NFATOLFA,7,NFA!>LFA,docolon DW LIT,3,MINUS,EXIT ;Z NFA>CFA nfa -- cfa name adr -> code field ; COUNT 7F AND + ; mask off 'smudge' bit - head NFATOCFA,7,NFA>CFA,docolon + head NFATOCFA,7,NFA!>CFA,docolon DW COUNT,LIT,07FH,AND,PLUS,EXIT ;Z IMMED? nfa -- f fetch immediate flag @@ -599,7 +599,7 @@ QSIGN1: DW EXIT ; R> M+ 2SWAP ; 1 /STRING ; REPEAT ; - head TONUMBER,7,>NUMBER,docolon + head TONUMBER,7,!>NUMBER,docolon TONUM1: DW DUP,qbranch,TONUM3 DW OVER,CFETCH,DIGITQ DW ZEROEQUAL,qbranch,TONUM2,DROP,EXIT @@ -701,7 +701,7 @@ QABO1: DW TWODROP,EXIT ;C ABORT" i*x 0 -- i*x R: j*x -- j*x x1=0 ;C i*x x1 -- R: j*x -- x1<>0 ; POSTPONE S" POSTPONE ?ABORT ; IMMEDIATE - immed ABORTQUOTE,6,ABORT",docolon + immed ABORTQUOTE,6,ABORT"",docolon DW SQUOTE DW LIT,QABORT,COMMAXT DW EXIT @@ -753,14 +753,14 @@ TICK: call docolon ; R> adrs of headless DOES> def'n ; LATEST @ NFA>CFA code field to fix up ; !CF ; - head XDOES,7,(DOES>),docolon + head XDOES,7,(DOES!>),docolon DW RFROM,LATEST,FETCH,NFATOCFA,STORECF DW EXIT ;C DOES> -- change action of latest def'n ; COMPILE (DOES>) ; dodoes ,CF ; IMMEDIATE - immed DOES,5,DOES>,docolon + immed DOES,5,DOES!>,docolon DW LIT,XDOES,COMMAXT DW LIT,dodoes,COMMACF,EXIT @@ -807,7 +807,7 @@ TICK: call docolon ;C ; ; REVEAL ,EXIT ; POSTPONE [ ; IMMEDIATE - immed SEMICOLON,1,';',docolon + immed SEMICOLON,1,!;,docolon DW REVEAL,CEXIT DW LEFTBRACKET,EXIT @@ -911,12 +911,12 @@ POST2: DW EXIT ;Z >L x -- L: -- x move to leave stack ; CELL LP +! LP @ ! ; (L stack grows up) - head TOL,2,>L,docolon + head TOL,2,!>L,docolon DW CELL,LP,PLUSSTORE,LP,FETCH,STORE,EXIT ;Z L> -- x L: x -- move from leave stack ; LP @ @ CELL NEGATE LP +! ; - head LFROM,2,L>,docolon + head LFROM,2,L!>,docolon DW LP,FETCH,FETCH DW CELL,NEGATE,LP,PLUSSTORE,EXIT @@ -1020,7 +1020,7 @@ DOTS2: DW EXIT DW UINIT,U0,NINIT,CMOVE ; DW LIT,80h,COUNT,INTERPRET DW XSQUOTE - DB 55,'Z80 CamelForth v1.02 25 Jan 1995, ROMWBW 10 Nov 2018' + DB 55,'Z80 CamelForth v1.02 25 Jan 1995, ROMWBW 19 Oct 2019' DB 0dh,0ah DW TYPE,ABORT ; ABORT never returns ; DON'T FORGET TO UPDATE THE BYTE COUNT IF YOU CHANCGE THE SIZE OF THE BOOT MSG diff --git a/Tools/cpm/bin/Z80MR.COM b/Tools/cpm/bin/Z80MR.COM deleted file mode 100644 index 0bdda14d84493edbdc214f536a50275b23098c5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14336 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