From bc8144b4be5540a78768c95a94a8ed5dcdcd2606 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Tue, 16 Jun 2020 22:10:32 -0400 Subject: [PATCH] pcat: implement (br) and (br?) --- blk/285 | 2 +- blk/754 | 3 ++- blk/813 | 18 ++++++++++-------- blk/814 | 19 +++++-------------- blk/815 | 30 ++++++++++++++---------------- blk/816 | 22 ++++++++++++++++------ blk/817 | 21 ++++++--------------- blk/818 | 15 +++++++++++++++ recipes/pcat/xcomp.fs | 2 +- 9 files changed, 70 insertions(+), 62 deletions(-) create mode 100644 blk/818 diff --git a/blk/285 b/blk/285 index 2d79766..94a215b 100644 --- a/blk/285 +++ b/blk/285 @@ -1,7 +1,7 @@ CODE (?br) ( 0x67 ) HL POPqq, HLZ, - JRZ, L2 BWR ( BR + 2. False, branch ) + JRZ, L2 BWR ( br + 1. False, branch ) L1 BSET ( loop will jump here ) ( True, skip next 2 bytes and don't branch ) IY INCss, IY INCss, diff --git a/blk/754 b/blk/754 index e9ab06f..1f9be57 100644 --- a/blk/754 +++ b/blk/754 @@ -2,4 +2,5 @@ 0x31 OPrr XORxx, 0x30 OPrr XORrr, 0x88 OPrr MOVrr, 0x89 OPrr MOVxx, 0x28 OPrr SUBrr, 0x29 OPrr SUBxx, 0x08 OPrr ORrr, 0x09 OPrr ORxx, -0x3a OPrr CMPrr, 0x3b OPrr CMPxx, +0x3a OPrr CMPrr, 0x3b OPrr CMPxx, 0x00 OPrr ADDrr, +0x01 OPrr ADDxx, diff --git a/blk/813 b/blk/813 index 4426d43..87505d1 100644 --- a/blk/813 +++ b/blk/813 @@ -1,14 +1,16 @@ ( BOOT DICT: There are only 3 words in the boot dict, but these words' offset need to be stable, so they're part of the "stable ABI" ) -'E' A, 'X' A, 'I' A, 'T' A, -0 A,, ( prev ) 4 A, ( len ) -H@ XCURRENT ! ( set current tip of dict, 0x42 ) - 0x17 A, ( nativeWord ) +'E' A, 'X' A, 'I' A, 'T' A, 0 A,, ( prev ) 4 A, ( len ) +H@ XCURRENT ! ( set current tip of dict, 0x42 ) + 0x17 A, ( nativeWord ) DX [BP] 0 MOVx[]+, BP DECx, BP DECx, ( popRS ) -;CODE -PC ORG @ 0x20 + ! ( numberWord ) -PC ORG @ 0x24 + ! ( addrWord ) ( see B287 for comments ) - DI DX MOVxx, DI [DI] MOVx[], DI PUSHx, +;CODE NOP, +CODE (br) ( 0x53 ) L2 BSET ( used in br? ) + DI DX MOVxx, DI [DI] MOVx[], DX DI ADDxx, +;CODE NOP, NOP, +CODE (br?) ( 0x67 ) + AX POPx, AX AX ORxx, JZ, L2 @ RPCs, ( False, branch ) + ( True, skip next 2 bytes and don't branch ) DX INCx, DX INCx, ;CODE diff --git a/blk/814 b/blk/814 index 664da20..34f4374 100644 --- a/blk/814 +++ b/blk/814 @@ -1,14 +1,5 @@ -PC 0x1d - ORG @ 0x1b + ! ( next ) - DI DX MOVxx, ( <-- IP ) DX INCx, DX INCx, - DI [DI] MOVx[], ( wordref ) - ( continue to execute ) -L1 BSET PC 0x36 - ORG @ 0x34 + ! ( execute -- DI -> wordref ) - AH AH XORrr, AL [DI] MOVr[], - DI INCx, ( PFA ) - AX JMPr, - -PC 0x11 - ORG @ 0x0f + ! ( compiledWord -- DI -> PFA ) - BP INCx, BP INCx, [BP] 0 DX MOV[]+x, ( pushRS ) - DX DI MOVxx, DX INCx, DX INCx, ( --> IP ) - DI [DI] MOVx[], - JMPs, L1 @ RPCs, +PC ORG @ 0x20 + ! ( numberWord ) +PC ORG @ 0x24 + ! ( addrWord ) ( see B287 for comments ) + DI DX MOVxx, DI [DI] MOVx[], DI PUSHx, + DX INCx, DX INCx, +;CODE diff --git a/blk/815 b/blk/815 index 1ab1775..664da20 100644 --- a/blk/815 +++ b/blk/815 @@ -1,16 +1,14 @@ -L4 BSET PC 3 - ORG @ 4 + ! ( find ) -( find word the same name as str in SI starting from tip in - DI. Returns wordref in DI. Z if found, NZ if not. ) - CH CH XORrr, CL [SI] MOVr[], ( CX -> strlen ) - SI INCx, ( first char ) AX AX XORxx, ( initial prev ) - BEGIN, ( loop ) - DI AX SUBxx, ( jump to prev wordref ) - AL [DI] -1 MOVr[]+, ( strlen ) - CL AL CMPrr, IFZ, ( same len ) - SI PUSHx, DI PUSHx, CX PUSHx, ( --> lvl 3 ) - 3 ADDALi, ( header ) AH AH XORrr, DI AX SUBxx, - REPZ, CMPSB, - CX POPx, DI POPx, SI POPx, ( <-- lvl 3 ) - IFZ, AL AL XORrr, ( Z ) RETn, THEN, - THEN, - ( cont. ) +PC 0x1d - ORG @ 0x1b + ! ( next ) + DI DX MOVxx, ( <-- IP ) DX INCx, DX INCx, + DI [DI] MOVx[], ( wordref ) + ( continue to execute ) +L1 BSET PC 0x36 - ORG @ 0x34 + ! ( execute -- DI -> wordref ) + AH AH XORrr, AL [DI] MOVr[], + DI INCx, ( PFA ) + AX JMPr, + +PC 0x11 - ORG @ 0x0f + ! ( compiledWord -- DI -> PFA ) + BP INCx, BP INCx, [BP] 0 DX MOV[]+x, ( pushRS ) + DX DI MOVxx, DX INCx, DX INCx, ( --> IP ) + DI [DI] MOVx[], + JMPs, L1 @ RPCs, diff --git a/blk/816 b/blk/816 index 8fa387c..1ab1775 100644 --- a/blk/816 +++ b/blk/816 @@ -1,6 +1,16 @@ -( find cont. ) - DI 3 SUBxi, AX [DI] MOVx[], ( prev ) - AX AX ORxx, - JNZ, AGAIN, ( loop ) - AX INCx, ( NZ ) RETn, - +L4 BSET PC 3 - ORG @ 4 + ! ( find ) +( find word the same name as str in SI starting from tip in + DI. Returns wordref in DI. Z if found, NZ if not. ) + CH CH XORrr, CL [SI] MOVr[], ( CX -> strlen ) + SI INCx, ( first char ) AX AX XORxx, ( initial prev ) + BEGIN, ( loop ) + DI AX SUBxx, ( jump to prev wordref ) + AL [DI] -1 MOVr[]+, ( strlen ) + CL AL CMPrr, IFZ, ( same len ) + SI PUSHx, DI PUSHx, CX PUSHx, ( --> lvl 3 ) + 3 ADDALi, ( header ) AH AH XORrr, DI AX SUBxx, + REPZ, CMPSB, + CX POPx, DI POPx, SI POPx, ( <-- lvl 3 ) + IFZ, AL AL XORrr, ( Z ) RETn, THEN, + THEN, + ( cont. ) diff --git a/blk/817 b/blk/817 index 947bac6..8fa387c 100644 --- a/blk/817 +++ b/blk/817 @@ -1,15 +1,6 @@ -CODE BYE BEGIN, JMPs, AGAIN, ;CODE -CODE EMIT - AX POPx, AH 0x0e MOVri, ( print char ) 0x10 INT, -;CODE -: FOO 'X' EMIT ; : BAR FOO FOO BYE ; -L3 BSET 3 A, 'B' A, 'A' A, 'R' A, -PC 3 - ORG @ 1+ ! ( main ) - SP PS_ADDR MOVxI, - BP RS_ADDR MOVxI, - DI 0x08 MOVxm, ( LATEST ) - SI L3 @ MOVxI, - CALLn, L4 @ RPCn, ( find ) - IFZ, JMPn, L1 @ RPCn, ( execute ) THEN, - AH 0x0e MOVri, ( print char ) AL '!' MOVri, 0x10 INT, - BEGIN, JMPs, AGAIN, +( find cont. ) + DI 3 SUBxi, AX [DI] MOVx[], ( prev ) + AX AX ORxx, + JNZ, AGAIN, ( loop ) + AX INCx, ( NZ ) RETn, + diff --git a/blk/818 b/blk/818 new file mode 100644 index 0000000..6ccf242 --- /dev/null +++ b/blk/818 @@ -0,0 +1,15 @@ +CODE BYE BEGIN, JMPs, AGAIN, ;CODE +CODE EMIT + AX POPx, AH 0x0e MOVri, ( print char ) 0x10 INT, +;CODE CODE 0 AX AX XORxx, AX PUSHx, ;CODE +: FOO 'X' EMIT ; : BAR 0 IF FOO THEN FOO BYE ; +L3 BSET 3 A, 'B' A, 'A' A, 'R' A, +PC 3 - ORG @ 1+ ! ( main ) + SP PS_ADDR MOVxI, + BP RS_ADDR MOVxI, + DI 0x08 MOVxm, ( LATEST ) + SI L3 @ MOVxI, + CALLn, L4 @ RPCn, ( find ) + IFZ, JMPn, L1 @ RPCn, ( execute ) THEN, + AH 0x0e MOVri, ( print char ) AL '!' MOVri, 0x10 INT, + BEGIN, JMPs, AGAIN, diff --git a/recipes/pcat/xcomp.fs b/recipes/pcat/xcomp.fs index 6108eae..ec56ec0 100644 --- a/recipes/pcat/xcomp.fs +++ b/recipes/pcat/xcomp.fs @@ -3,7 +3,7 @@ 750 LOAD ( 8086 asm ) 262 LOAD ( xcomp ) 270 LOAD ( xcomp overrides ) -812 817 LOADR +812 818 LOADR (entry) _ ( Update LATEST ) PC ORG @ 8 + !