From 4967c2add246c9c7ef43b1358bea14f3e085de6c Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 20 Apr 2020 21:27:34 -0400 Subject: [PATCH] Merge z80c.fs and boot.fs into boot.z80 --- emul/Makefile | 3 +- forth/{boot.fs => boot.z80} | 437 +++++++++++++++++++++++++++++++++++++++++++ forth/z80c.fs | 447 -------------------------------------------- recipes/rc2014/Makefile | 3 +- 4 files changed, 439 insertions(+), 451 deletions(-) rename forth/{boot.fs => boot.z80} (60%) delete mode 100644 forth/z80c.fs diff --git a/emul/Makefile b/emul/Makefile index 4e852ef..493d02a 100644 --- a/emul/Makefile +++ b/emul/Makefile @@ -3,8 +3,7 @@ TARGETS = forth/forth BOOTSRCS = ./forth/conf.fs \ ../forth/xcomp.fs \ ./forth/xcomp.fs \ - ../forth/boot.fs \ - ../forth/z80c.fs \ + ../forth/boot.z80 \ ../forth/icore.fs \ ./forth/xstop.fs diff --git a/forth/boot.fs b/forth/boot.z80 similarity index 60% rename from forth/boot.fs rename to forth/boot.z80 index 95e8c85..7b8b6d3 100644 --- a/forth/boot.fs +++ b/forth/boot.z80 @@ -331,3 +331,440 @@ PC ORG @ 0x2c + ! ( doesWord ) HL INCss, D (HL) LDrr, 0x0e JPnn, ( 0e == compiledWord ) + +( Core words ) + KEY and EMIT are not defined here. There're + expected to be defined in platform-specific code. ) + + +CODE EXECUTE + DE POPqq, + chkPS, + 0x33 JPnn, ( 33 == execute ) + +( a b c -- b c a ) +CODE ROT + HL POPqq, ( C ) + DE POPqq, ( B ) + BC POPqq, ( A ) + chkPS, + DE PUSHqq, ( B ) + HL PUSHqq, ( C ) + BC PUSHqq, ( A ) +;CODE + +( a -- a a ) +CODE DUP + HL POPqq, ( A ) + chkPS, + HL PUSHqq, ( A ) + HL PUSHqq, ( A ) +;CODE + +( a -- ) +CODE DROP + HL POPqq, +;CODE + +( a b -- b a ) +CODE SWAP + HL POPqq, ( B ) + DE POPqq, ( A ) + chkPS, + HL PUSHqq, ( B ) + DE PUSHqq, ( A ) +;CODE + +( a b -- a b a ) +CODE OVER + HL POPqq, ( B ) + DE POPqq, ( A ) + chkPS, + DE PUSHqq, ( A ) + HL PUSHqq, ( B ) + DE PUSHqq, ( A ) +;CODE + +CODE PICK + HL POPqq, + chkPS, + ( x2 ) + L SLAr, + H RLr, + SP ADDHLss, + C (HL) LDrr, + HL INCss, + B (HL) LDrr, + ( check PS range before returning ) + EXDEHL, + RAMSTART LDHL(nn), ( RAM+00 == INITIAL_SP ) + DE SUBHLss, + CC L2 @ JPccnn, ( abortUnderflow ) + BC PUSHqq, +;CODE + +( a b -- a b a b ) +CODE 2DUP + HL POPqq, ( B ) + DE POPqq, ( A ) + chkPS, + DE PUSHqq, ( A ) + HL PUSHqq, ( B ) + DE PUSHqq, ( A ) + HL PUSHqq, ( B ) +;CODE + +( a b -- ) +CODE 2DROP + HL POPqq, + HL POPqq, + chkPS, +;CODE + +( a b c d -- a b c d a b ) + +CODE 2OVER + HL POPqq, ( D ) + DE POPqq, ( C ) + BC POPqq, ( B ) + EXX, HL POPqq, EXX, ( A ) + chkPS, + EXX, HL PUSHqq, EXX, ( A ) + BC PUSHqq, ( B ) + DE PUSHqq, ( C ) + HL PUSHqq, ( D ) + EXX, HL PUSHqq, EXX, ( A ) + BC PUSHqq, ( B ) +;CODE + +( a b c d -- c d a b ) + +CODE 2SWAP + HL POPqq, ( D ) + DE POPqq, ( C ) + BC POPqq, ( B ) + EXX, HL POPqq, EXX, ( A ) + chkPS, + DE PUSHqq, ( C ) + HL PUSHqq, ( D ) + EXX, HL PUSHqq, EXX, ( A ) + BC PUSHqq, ( B ) +;CODE + +CODE AND + HL POPqq, + DE POPqq, + chkPS, + A E LDrr, + L ANDr, + L A LDrr, + A D LDrr, + H ANDr, + H A LDrr, + HL PUSHqq, +;CODE + +CODE OR + HL POPqq, + DE POPqq, + chkPS, + A E LDrr, + L ORr, + L A LDrr, + A D LDrr, + H ORr, + H A LDrr, + HL PUSHqq, +;CODE + +CODE XOR + HL POPqq, + DE POPqq, + chkPS, + A E LDrr, + L XORr, + L A LDrr, + A D LDrr, + H XORr, + H A LDrr, + HL PUSHqq, +;CODE + +CODE NOT + HL POPqq, + chkPS, + A L LDrr, + H ORr, + HL 0 LDddnn, + IFZ, + ( false, make 1 ) + HL INCss, + THEN, + HL PUSHqq, +;CODE + +CODE + + HL POPqq, + DE POPqq, + chkPS, + DE ADDHLss, + HL PUSHqq, +;CODE + +CODE - + DE POPqq, + HL POPqq, + chkPS, + DE SUBHLss, + HL PUSHqq, +;CODE + +CODE * + DE POPqq, + BC POPqq, + chkPS, + ( DE * BC -> DE (high) and HL (low) ) + HL 0 LDddnn, + A 0x10 LDrn, +( loop ) + HL ADDHLss, + E RLr, + D RLr, + JRNC, 4 A, ( noinc ) + BC ADDHLss, + JRNC, 1 A, ( noinc ) + DE INCss, +( noinc ) + A DECr, + JRNZ, -14 A, ( loop ) + HL PUSHqq, +;CODE + +( Borrowed from http://wikiti.brandonw.net/ ) +( Divides AC by DE and places the quotient in AC and the + remainder in HL ) +CODE /MOD + DE POPqq, + BC POPqq, + chkPS, + A B LDrr, + B 16 LDrn, + HL 0 LDddnn, + BEGIN, ( loop ) + SCF, + C RLr, + RLA, + HL ADCHLss, + DE SBCHLss, + IFC, + DE ADDHLss, + C DECr, + THEN, + DJNZ, AGAIN, ( loop ) + B A LDrr, + HL PUSHqq, + BC PUSHqq, +;CODE + +CODE ! + HL POPqq, + DE POPqq, + chkPS, + (HL) E LDrr, + HL INCss, + (HL) D LDrr, +;CODE + +CODE @ + HL POPqq, + chkPS, + E (HL) LDrr, + HL INCss, + D (HL) LDrr, + DE PUSHqq, +;CODE + +CODE C! + HL POPqq, + DE POPqq, + chkPS, + (HL) E LDrr, +;CODE + +CODE C@ + HL POPqq, + chkPS, + L (HL) LDrr, + H 0 LDrn, + HL PUSHqq, +;CODE + +CODE PC! + BC POPqq, + HL POPqq, + chkPS, + L OUT(C)r, +;CODE + +CODE PC@ + BC POPqq, + chkPS, + H 0 LDrn, + L INr(C), + HL PUSHqq, +;CODE + +CODE I + L 0 IX+ LDrIXY, + H 1 IX+ LDrIXY, + HL PUSHqq, +;CODE + +CODE I' + L 2 IX- LDrIXY, + H 1 IX- LDrIXY, + HL PUSHqq, +;CODE + +CODE J + L 4 IX- LDrIXY, + H 3 IX- LDrIXY, + HL PUSHqq, +;CODE + +CODE >R + HL POPqq, + chkPS, + ( 17 == pushRS ) + 17 CALLnn, +;CODE + +CODE R> + ( 20 == popRS ) + 20 CALLnn, + HL PUSHqq, +;CODE + +CODE BYE + HALT, +;CODE + +CODE (resSP) + ( INITIAL_SP == RAM+0 ) + SP RAMSTART LDdd(nn), +;CODE + +CODE (resRS) + IX RS_ADDR LDddnn, +;CODE + +CODE S= + DE POPqq, + HL POPqq, + chkPS, + ( pre-push false ) + BC 0 LDddnn, + BC PUSHqq, + BEGIN, ( loop ) + LDA(DE), + (HL) CPr, + JRNZ, L1 FWR ( not equal? break early to "end". + NZ is set. ) + A ORr, ( if our char is null, stop ) + HL INCss, + DE INCss, + JRNZ, AGAIN, ( loop ) + ( success, change false to true ) + HL POPqq, + HL INCss, + HL PUSHqq, +L1 FSET ( end ) +;CODE + +CODE CMP + HL POPqq, + DE POPqq, + chkPS, + DE SUBHLss, + BC 0 LDddnn, + IFNZ, + ( not equal ) + BC INCss, + IFNC, + ( < ) + BC DECss, + BC DECss, + THEN, + THEN, + BC PUSHqq, +;CODE + +( cur w -- a f ) +CODE _find + HL POPqq, ( w ) + DE POPqq, ( cur ) + chkPS, + ( 3 == find ) + 3 CALLnn, + IFNZ, + ( not found ) + HL PUSHqq, + DE 0 LDddnn, + DE PUSHqq, + JPNEXT, + THEN, + ( found ) + DE PUSHqq, + DE 1 LDddnn, + DE PUSHqq, +;CODE + +CODE (im1) + IM1, + EI, +;CODE + +CODE 0 + HL 0 LDddnn, + HL PUSHqq, +;CODE + +CODE 1 + HL 1 LDddnn, + HL PUSHqq, +;CODE + +CODE -1 + HL -1 LDddnn, + HL PUSHqq, +;CODE + +CODE 1+ + HL POPqq, + chkPS, + HL INCss, + HL PUSHqq, +;CODE + +CODE 1- + HL POPqq, + chkPS, + HL DECss, + HL PUSHqq, +;CODE + +CODE 2+ + HL POPqq, + chkPS, + HL INCss, + HL INCss, + HL PUSHqq, +;CODE + +CODE 2- + HL POPqq, + chkPS, + HL DECss, + HL DECss, + HL PUSHqq, +;CODE diff --git a/forth/z80c.fs b/forth/z80c.fs deleted file mode 100644 index e58f4cd..0000000 --- a/forth/z80c.fs +++ /dev/null @@ -1,447 +0,0 @@ -( Core words in z80. This requires a full Forth interpreter - to run, but is also necessary for core.fs. This means that - it needs to be compiled from a prior bootstrapped binary. - - This stage is tricky due to the fact that references in - Forth are all absolute, except for prev word refs. This - means that there are severe limitations to the kind of code - you can put here. Those limitations are the same as those - described in icore.fs. - - Oh, also: KEY and EMIT are not defined here. There're - expected to be defined in platform-specific code. - - This unit expects the same conf as boot.fs. -) - -CODE EXECUTE - DE POPqq, - chkPS, - 0x33 JPnn, ( 33 == execute ) - -( a b c -- b c a ) -CODE ROT - HL POPqq, ( C ) - DE POPqq, ( B ) - BC POPqq, ( A ) - chkPS, - DE PUSHqq, ( B ) - HL PUSHqq, ( C ) - BC PUSHqq, ( A ) -;CODE - -( a -- a a ) -CODE DUP - HL POPqq, ( A ) - chkPS, - HL PUSHqq, ( A ) - HL PUSHqq, ( A ) -;CODE - -( a -- ) -CODE DROP - HL POPqq, -;CODE - -( a b -- b a ) -CODE SWAP - HL POPqq, ( B ) - DE POPqq, ( A ) - chkPS, - HL PUSHqq, ( B ) - DE PUSHqq, ( A ) -;CODE - -( a b -- a b a ) -CODE OVER - HL POPqq, ( B ) - DE POPqq, ( A ) - chkPS, - DE PUSHqq, ( A ) - HL PUSHqq, ( B ) - DE PUSHqq, ( A ) -;CODE - -CODE PICK - HL POPqq, - chkPS, - ( x2 ) - L SLAr, - H RLr, - SP ADDHLss, - C (HL) LDrr, - HL INCss, - B (HL) LDrr, - ( check PS range before returning ) - EXDEHL, - RAMSTART LDHL(nn), ( RAM+00 == INITIAL_SP ) - DE SUBHLss, - CC L2 @ JPccnn, ( abortUnderflow ) - BC PUSHqq, -;CODE - -( a b -- a b a b ) -CODE 2DUP - HL POPqq, ( B ) - DE POPqq, ( A ) - chkPS, - DE PUSHqq, ( A ) - HL PUSHqq, ( B ) - DE PUSHqq, ( A ) - HL PUSHqq, ( B ) -;CODE - -( a b -- ) -CODE 2DROP - HL POPqq, - HL POPqq, - chkPS, -;CODE - -( a b c d -- a b c d a b ) - -CODE 2OVER - HL POPqq, ( D ) - DE POPqq, ( C ) - BC POPqq, ( B ) - EXX, HL POPqq, EXX, ( A ) - chkPS, - EXX, HL PUSHqq, EXX, ( A ) - BC PUSHqq, ( B ) - DE PUSHqq, ( C ) - HL PUSHqq, ( D ) - EXX, HL PUSHqq, EXX, ( A ) - BC PUSHqq, ( B ) -;CODE - -( a b c d -- c d a b ) - -CODE 2SWAP - HL POPqq, ( D ) - DE POPqq, ( C ) - BC POPqq, ( B ) - EXX, HL POPqq, EXX, ( A ) - chkPS, - DE PUSHqq, ( C ) - HL PUSHqq, ( D ) - EXX, HL PUSHqq, EXX, ( A ) - BC PUSHqq, ( B ) -;CODE - -CODE AND - HL POPqq, - DE POPqq, - chkPS, - A E LDrr, - L ANDr, - L A LDrr, - A D LDrr, - H ANDr, - H A LDrr, - HL PUSHqq, -;CODE - -CODE OR - HL POPqq, - DE POPqq, - chkPS, - A E LDrr, - L ORr, - L A LDrr, - A D LDrr, - H ORr, - H A LDrr, - HL PUSHqq, -;CODE - -CODE XOR - HL POPqq, - DE POPqq, - chkPS, - A E LDrr, - L XORr, - L A LDrr, - A D LDrr, - H XORr, - H A LDrr, - HL PUSHqq, -;CODE - -CODE NOT - HL POPqq, - chkPS, - A L LDrr, - H ORr, - HL 0 LDddnn, - IFZ, - ( false, make 1 ) - HL INCss, - THEN, - HL PUSHqq, -;CODE - -CODE + - HL POPqq, - DE POPqq, - chkPS, - DE ADDHLss, - HL PUSHqq, -;CODE - -CODE - - DE POPqq, - HL POPqq, - chkPS, - DE SUBHLss, - HL PUSHqq, -;CODE - -CODE * - DE POPqq, - BC POPqq, - chkPS, - ( DE * BC -> DE (high) and HL (low) ) - HL 0 LDddnn, - A 0x10 LDrn, -( loop ) - HL ADDHLss, - E RLr, - D RLr, - JRNC, 4 A, ( noinc ) - BC ADDHLss, - JRNC, 1 A, ( noinc ) - DE INCss, -( noinc ) - A DECr, - JRNZ, -14 A, ( loop ) - HL PUSHqq, -;CODE - -( Borrowed from http://wikiti.brandonw.net/ ) -( Divides AC by DE and places the quotient in AC and the - remainder in HL ) -CODE /MOD - DE POPqq, - BC POPqq, - chkPS, - A B LDrr, - B 16 LDrn, - HL 0 LDddnn, - BEGIN, ( loop ) - SCF, - C RLr, - RLA, - HL ADCHLss, - DE SBCHLss, - IFC, - DE ADDHLss, - C DECr, - THEN, - DJNZ, AGAIN, ( loop ) - B A LDrr, - HL PUSHqq, - BC PUSHqq, -;CODE - -CODE ! - HL POPqq, - DE POPqq, - chkPS, - (HL) E LDrr, - HL INCss, - (HL) D LDrr, -;CODE - -CODE @ - HL POPqq, - chkPS, - E (HL) LDrr, - HL INCss, - D (HL) LDrr, - DE PUSHqq, -;CODE - -CODE C! - HL POPqq, - DE POPqq, - chkPS, - (HL) E LDrr, -;CODE - -CODE C@ - HL POPqq, - chkPS, - L (HL) LDrr, - H 0 LDrn, - HL PUSHqq, -;CODE - -CODE PC! - BC POPqq, - HL POPqq, - chkPS, - L OUT(C)r, -;CODE - -CODE PC@ - BC POPqq, - chkPS, - H 0 LDrn, - L INr(C), - HL PUSHqq, -;CODE - -CODE I - L 0 IX+ LDrIXY, - H 1 IX+ LDrIXY, - HL PUSHqq, -;CODE - -CODE I' - L 2 IX- LDrIXY, - H 1 IX- LDrIXY, - HL PUSHqq, -;CODE - -CODE J - L 4 IX- LDrIXY, - H 3 IX- LDrIXY, - HL PUSHqq, -;CODE - -CODE >R - HL POPqq, - chkPS, - ( 17 == pushRS ) - 17 CALLnn, -;CODE - -CODE R> - ( 20 == popRS ) - 20 CALLnn, - HL PUSHqq, -;CODE - -CODE BYE - HALT, -;CODE - -CODE (resSP) - ( INITIAL_SP == RAM+0 ) - SP RAMSTART LDdd(nn), -;CODE - -CODE (resRS) - IX RS_ADDR LDddnn, -;CODE - -CODE S= - DE POPqq, - HL POPqq, - chkPS, - ( pre-push false ) - BC 0 LDddnn, - BC PUSHqq, - BEGIN, ( loop ) - LDA(DE), - (HL) CPr, - JRNZ, L1 FWR ( not equal? break early to "end". - NZ is set. ) - A ORr, ( if our char is null, stop ) - HL INCss, - DE INCss, - JRNZ, AGAIN, ( loop ) - ( success, change false to true ) - HL POPqq, - HL INCss, - HL PUSHqq, -L1 FSET ( end ) -;CODE - -CODE CMP - HL POPqq, - DE POPqq, - chkPS, - DE SUBHLss, - BC 0 LDddnn, - IFNZ, - ( not equal ) - BC INCss, - IFNC, - ( < ) - BC DECss, - BC DECss, - THEN, - THEN, - BC PUSHqq, -;CODE - -( cur w -- a f ) -CODE _find - HL POPqq, ( w ) - DE POPqq, ( cur ) - chkPS, - ( 3 == find ) - 3 CALLnn, - IFNZ, - ( not found ) - HL PUSHqq, - DE 0 LDddnn, - DE PUSHqq, - JPNEXT, - THEN, - ( found ) - DE PUSHqq, - DE 1 LDddnn, - DE PUSHqq, -;CODE - -CODE (im1) - IM1, - EI, -;CODE - -CODE 0 - HL 0 LDddnn, - HL PUSHqq, -;CODE - -CODE 1 - HL 1 LDddnn, - HL PUSHqq, -;CODE - -CODE -1 - HL -1 LDddnn, - HL PUSHqq, -;CODE - -CODE 1+ - HL POPqq, - chkPS, - HL INCss, - HL PUSHqq, -;CODE - -CODE 1- - HL POPqq, - chkPS, - HL DECss, - HL PUSHqq, -;CODE - -CODE 2+ - HL POPqq, - chkPS, - HL INCss, - HL INCss, - HL PUSHqq, -;CODE - -CODE 2- - HL POPqq, - chkPS, - HL DECss, - HL DECss, - HL PUSHqq, -;CODE diff --git a/recipes/rc2014/Makefile b/recipes/rc2014/Makefile index 4b1ed00..ccb4a4c 100644 --- a/recipes/rc2014/Makefile +++ b/recipes/rc2014/Makefile @@ -7,8 +7,7 @@ EMUL = $(BASEDIR)/emul/hw/rc2014/classic BOOTSRCS = conf.fs \ $(FDIR)/xcomp.fs \ $(EDIR)/xcomp.fs \ - $(FDIR)/boot.fs \ - $(FDIR)/z80c.fs \ + $(FDIR)/boot.z80 \ $(BASEDIR)/drv/acia.z80 \ $(BASEDIR)/drv/sdc.z80 \ $(FDIR)/icore.fs \