z80a: add BREAK, instruction

This allows us to remove a lot of labels usage in boot code. This
commit has no effect on forth.bin.
This commit is contained in:
Virgil Dupras 2020-05-16 21:02:50 -04:00
parent fd597d29d2
commit 0f2d14ad8a
9 changed files with 43 additions and 19 deletions

View File

@ -8,3 +8,9 @@ byte that is taken care of. We still need to adjust by another
byte before writing the offset. byte before writing the offset.
(cont.)

16
blk/205 Normal file
View File

@ -0,0 +1,16 @@
Structured flow
z80a also has words that behave similarly to IF..THEN and
BEGIN..UNTIL.
On the IF side, we have IFZ, IFNZ, IFC, IFNC, and THEN,. When
the opposite condition is met, a relative jump is made to
THEN,'s PC. For example, if you have IFZ, a jump is made when
Z is unset.
On the BEGIN,..AGAIN, side, it's a bit different. You start
with your BEGIN, instruction, and then later you issue a
JRxx, instr followed by AGAIN,. Exactly like you would do
with a label.
(cont.)

3
blk/206 Normal file
View File

@ -0,0 +1,3 @@
On top of that, you have the very nice BREAK, instruction,
which must also be preceeded by a JRxx, and will jump to the
PC following the next AGAIN,

View File

@ -1,13 +1,16 @@
( Place BEGIN, where you want to jump back and AGAIN after ( Place BEGIN, where you want to jump back and AGAIN after
a relative jump operator. Just like BSET and BWR. ) a relative jump operator. Just like BSET and BWR. )
: BEGIN, PC ; : BEGIN, PC ;
: AGAIN, PC - 1- A, ;
: BSET PC SWAP ! ; : BSET PC SWAP ! ;
: BWR @ AGAIN, ;
( same as BSET, but we need to write a placeholder ) ( same as BSET, but we need to write a placeholder )
: FJR, PC 0 A, ; : FJR, PC 0 A, ;
: IFZ, JRNZ, FJR, ; : IFZ, JRNZ, FJR, ;
: IFNZ, JRZ, FJR, ; : IFNZ, JRZ, FJR, ;
: IFC, JRNC, FJR, ; : IFC, JRNC, FJR, ;
: IFNC, JRC, FJR, ; : IFNC, JRC, FJR, ;
: THEN,
DUP PC ( l l pc )
-^ 1- ( l off )
( warning: l is a PC offset, not a mem addr! )
SWAP ORG @ + BIN( @ - ( off addr )
C! ;

13
blk/247
View File

@ -1,9 +1,8 @@
: THEN,
DUP PC ( l l pc )
-^ 1- ( l off )
( warning: l is a PC offset, not a mem addr! )
SWAP ORG @ + BIN( @ - ( off addr )
C!
;
: FWR BSET 0 A, ; : FWR BSET 0 A, ;
: FSET @ THEN, ; : FSET @ THEN, ;
: BREAK, FJR, 0x8000 OR ;
: BREAK?, DUP 0x8000 AND IF
0x7fff AND 1 ALLOT THEN, -1 ALLOT
THEN ;
: AGAIN, BREAK?, PC - 1- A, ;
: BWR @ AGAIN, ;

View File

@ -13,4 +13,4 @@ PC ORG @ 4 + ! ( find )
NEG, NEG,
A DECr, A DECr,
( special case. zero len? we never find anything. ) ( special case. zero len? we never find anything. )
JRZ, L1 FWR ( fail-B296 ) ( cont. ) IFNZ, ( fail-B296 ) ( cont. )

View File

@ -9,8 +9,7 @@
HL DECss, HL DECss,
LDA(DE), LDA(DE),
(HL) CPr, (HL) CPr,
JRNZ, L2 FWR ( loopend ) JRNZ, BREAK,
DJNZ, AGAIN, DJNZ, AGAIN,
L2 FSET ( loopend )
THEN, THEN,
( cont. ) ( cont. )

View File

@ -1,4 +1,4 @@
L1 FSET ( fail ) THEN, ( zero length check, B291 )
A XORr, A XORr,
A INCr, A INCr,
L2 FSET ( end ) L2 FSET ( end )

View File

@ -2,15 +2,13 @@ CODE S=
DE POPqq, DE POPqq,
HL POPqq, HL POPqq,
chkPS, chkPS,
BEGIN, ( loop ) BEGIN,
LDA(DE), LDA(DE),
(HL) CPr, (HL) CPr,
JRNZ, L1 FWR ( not equal? break early to "end". JRNZ, BREAK, ( not equal? break early. NZ is set. )
NZ is set. )
A ORr, ( if our char is null, stop ) A ORr, ( if our char is null, stop )
HL INCss, HL INCss,
DE INCss, DE INCss,
JRNZ, AGAIN, ( loop ) JRNZ, AGAIN,
L1 FSET ( end )
PUSHZ, PUSHZ,
;CODE ;CODE