From 80d1b590506b98ac9042dc27a61e0c599c01079b Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 7 Dec 2020 20:08:45 -0500 Subject: [PATCH] Add words |M and |L Splitting a word into MSB/LSB pairs happens often and is worth, I think, native words. Also, I'm going to need it in the upcoming commits. --- arch/8086/pcat/Makefile | 2 +- arch/8086/pcat/blk.fs | 2 +- arch/8086/pcat/mbr.fs | 4 +- arch/8086/pcat/xcomp.fs | 4 +- arch/z80/rc2014/xcomp.fs | 4 +- arch/z80/sms/xcomp.fs | 4 +- arch/z80/sms/xcompkbd.fs | 4 +- arch/z80/sms/xcompsdc.fs | 4 +- arch/z80/sms/xcomptextmode.fs | 4 +- arch/z80/ti84/xcomp.fs | 13 +++--- arch/z80/trs80/xcomp.fs | 4 +- arch/z80/z80mbc2/xcomp.fs | 4 +- blk.fs | 100 ++++++++++++++++++------------------------ cvm/common.fs | 10 +++-- cvm/forth.fs | 4 +- cvm/stage.bin | Bin 5081 -> 5065 bytes cvm/stage.fs | 4 +- cvm/vm.c | 6 +++ doc/dict.txt | 2 + 19 files changed, 86 insertions(+), 93 deletions(-) diff --git a/arch/8086/pcat/Makefile b/arch/8086/pcat/Makefile index 5fbd6c9..edaaa88 100644 --- a/arch/8086/pcat/Makefile +++ b/arch/8086/pcat/Makefile @@ -14,7 +14,7 @@ os.bin: xcomp.fs $(STAGE) blkfs $(BLKPACK): $(MAKE) -C $(BASE)/tools -blkfs: $(BLKPACK) +blkfs: $(BLKPACK) blk.fs cat $(BASE)/blk.fs blk.fs | $(BLKPACK) > $@ $(STAGE): diff --git a/arch/8086/pcat/blk.fs b/arch/8086/pcat/blk.fs index e724513..6fdb4c6 100644 --- a/arch/8086/pcat/blk.fs +++ b/arch/8086/pcat/blk.fs @@ -16,7 +16,7 @@ BX 0 MOVxI, 0x13 INT, ( read sectors 2-15 of boot floppy ) ( TODO: reading 12 sectors like this probably doesn't work on real vintage PC/AT with floppy. Make this more robust. ) 0x800 0 JMPf, -ORG @ 0x1fe + HERE ! 0x55 A, 0xaa A, +ORG @ 0x1fe + HERE ! 0x55 C,* 0xaa C,* ( ----- 604 ) CODE (emit) 1 chkPS, AX POPx, AH 0x0e MOVri, ( print char ) 0x10 INT, diff --git a/arch/8086/pcat/mbr.fs b/arch/8086/pcat/mbr.fs index 6feec20..c3f87ca 100644 --- a/arch/8086/pcat/mbr.fs +++ b/arch/8086/pcat/mbr.fs @@ -1,4 +1,4 @@ 30 LOAD 602 LOAD -ORG @ 256 /MOD 2 PC! 2 PC! -H@ 256 /MOD 2 PC! 2 PC! +ORG @ |M 2 PC! 2 PC! +H@ |M 2 PC! 2 PC! diff --git a/arch/8086/pcat/xcomp.fs b/arch/8086/pcat/xcomp.fs index 541918e..45cd9c8 100644 --- a/arch/8086/pcat/xcomp.fs +++ b/arch/8086/pcat/xcomp.fs @@ -1,3 +1,3 @@ 612 LOAD ( PC/AT xcomp ) -ORG @ 256 /MOD 2 PC! 2 PC! -H@ 256 /MOD 2 PC! 2 PC! +ORG @ |M 2 PC! 2 PC! +H@ |M 2 PC! 2 PC! diff --git a/arch/z80/rc2014/xcomp.fs b/arch/z80/rc2014/xcomp.fs index 026cc27..a09d3e8 100644 --- a/arch/z80/rc2014/xcomp.fs +++ b/arch/z80/rc2014/xcomp.fs @@ -1,3 +1,3 @@ 619 LOAD -ORG @ 256 /MOD 2 PC! 2 PC! -H@ 256 /MOD 2 PC! 2 PC! +ORG @ |M 2 PC! 2 PC! +H@ |M 2 PC! 2 PC! diff --git a/arch/z80/sms/xcomp.fs b/arch/z80/sms/xcomp.fs index d00b24f..2a6e769 100644 --- a/arch/z80/sms/xcomp.fs +++ b/arch/z80/sms/xcomp.fs @@ -37,6 +37,6 @@ CREATE ~FNT CPFNT7x7 ( Update LATEST ) PC ORG @ 8 + ! ," VDP$ GRID$ PAD$ (im1) " EOT, -ORG @ 0x100 - DUP 256 /MOD 2 PC! 2 PC! +ORG @ 0x100 - DUP |M 2 PC! 2 PC! DUP 1 ( 16K ) segasig -0x4000 + 256 /MOD 2 PC! 2 PC! +0x4000 + |M 2 PC! 2 PC! diff --git a/arch/z80/sms/xcompkbd.fs b/arch/z80/sms/xcompkbd.fs index e8ae877..ea0bc08 100644 --- a/arch/z80/sms/xcompkbd.fs +++ b/arch/z80/sms/xcompkbd.fs @@ -38,6 +38,6 @@ CREATE ~FNT CPFNT7x7 ( Update LATEST ) PC ORG @ 8 + ! ," VDP$ GRID$ PS2$ (im1) " EOT, -ORG @ 0x100 - DUP 256 /MOD 2 PC! 2 PC! +ORG @ 0x100 - DUP |M 2 PC! 2 PC! DUP 1 ( 16K ) segasig -0x4000 + 256 /MOD 2 PC! 2 PC! +0x4000 + |M 2 PC! 2 PC! diff --git a/arch/z80/sms/xcompsdc.fs b/arch/z80/sms/xcompsdc.fs index ce9bb3f..f0f69f3 100644 --- a/arch/z80/sms/xcompsdc.fs +++ b/arch/z80/sms/xcompsdc.fs @@ -41,6 +41,6 @@ CREATE ~FNT CPFNT7x7 ( Update LATEST ) PC ORG @ 8 + ! ," VDP$ GRID$ PS2$ BLK$ (im1) " EOT, -ORG @ 0x100 - DUP 256 /MOD 2 PC! 2 PC! +ORG @ 0x100 - DUP |M 2 PC! 2 PC! DUP 1 ( 16K ) segasig -0x4000 + 256 /MOD 2 PC! 2 PC! +0x4000 + |M 2 PC! 2 PC! diff --git a/arch/z80/sms/xcomptextmode.fs b/arch/z80/sms/xcomptextmode.fs index ae8141d..a436312 100644 --- a/arch/z80/sms/xcomptextmode.fs +++ b/arch/z80/sms/xcomptextmode.fs @@ -40,6 +40,6 @@ CREATE ~FNT CPFNT5x7 ( Update LATEST ) PC ORG @ 8 + ! ," TMS$ GRID$ PS2$ BLK$ ' SDC@ BLK@* ! (im1) " EOT, -ORG @ 0x100 - DUP 256 /MOD 2 PC! 2 PC! +ORG @ 0x100 - DUP |M 2 PC! 2 PC! DUP 1 ( 16K ) segasig -0x4000 + 256 /MOD 2 PC! 2 PC! +0x4000 + |M 2 PC! 2 PC! diff --git a/arch/z80/ti84/xcomp.fs b/arch/z80/ti84/xcomp.fs index fe4cb26..1bd2c82 100644 --- a/arch/z80/ti84/xcomp.fs +++ b/arch/z80/ti84/xcomp.fs @@ -7,7 +7,6 @@ SYSVARS 0x72 + CONSTANT GRID_MEM SYSVARS 0x75 + CONSTANT KBD_MEM 0x01 CONSTANT KBD_PORT 5 LOAD ( z80 assembler ) -: ZFILL, ( u ) 0 DO 0 A, LOOP ; 262 LOAD ( xcomp ) 522 LOAD ( font compiler ) 282 LOAD ( boot.z80.decl ) @@ -18,8 +17,8 @@ SYSVARS 0x75 + CONSTANT KBD_MEM offset the binary by 0x100, which is our minimum possible increment and fill the TI stuff with the code below. ) -0x5a JP, 0x15 ZFILL, ( 0x18 ) -0x5a JP, ( reboot ) 0x1d ZFILL, ( 0x38 ) +0x5a JP, 0x15 ALLOT0 ( 0x18 ) +0x5a JP, ( reboot ) 0x1d ALLOT0 ( 0x38 ) ( handleInterrupt ) DI, AF PUSH, @@ -39,7 +38,7 @@ AF POP, EI, RETI, -0x03 ZFILL, ( 0x53 ) +0x03 ALLOT0 ( 0x53 ) 0x5a JP, ( 0x56 ) 0xff A, 0xa5 A, 0xff A, ( 0x5a ) ( boot ) DI, @@ -56,7 +55,7 @@ A 0x02 ( LCD_CMD_DISABLE ) LDri, 0x10 ( LCD_PORT_CMD ) OUTiA, HALT, -0x95 ZFILL, ( 0x100 ) +0x95 ALLOT0 ( 0x100 ) ( All set, carry on! ) CURRENT @ XCURRENT ! @@ -73,5 +72,5 @@ CREATE ~FNT CPFNT3x5 ( Update LATEST ) PC ORG @ 8 + ! ," LCD$ KBD$ GRID$ " EOT, -ORG @ 0x100 - 256 /MOD 2 PC! 2 PC! -H@ 256 /MOD 2 PC! 2 PC! +ORG @ 0x100 - |M 2 PC! 2 PC! +H@ |M 2 PC! 2 PC! diff --git a/arch/z80/trs80/xcomp.fs b/arch/z80/trs80/xcomp.fs index 24d434b..9839c2e 100644 --- a/arch/z80/trs80/xcomp.fs +++ b/arch/z80/trs80/xcomp.fs @@ -16,5 +16,5 @@ RS_ADDR 0x80 - CONSTANT SYSVARS PC ORG @ 8 + ! ( TRS-80 wants CR-only newlines ) ," ' CR ' NL **! BLK$ FD$ " EOT, -ORG @ 256 /MOD 2 PC! 2 PC! -H@ 256 /MOD 2 PC! 2 PC! +ORG @ |M 2 PC! 2 PC! +H@ |M 2 PC! 2 PC! diff --git a/arch/z80/z80mbc2/xcomp.fs b/arch/z80/z80mbc2/xcomp.fs index ec648a3..762dddc 100644 --- a/arch/z80/z80mbc2/xcomp.fs +++ b/arch/z80/z80mbc2/xcomp.fs @@ -39,5 +39,5 @@ CODE (key) ( Update LATEST ) PC ORG @ 8 + ! ," BLK$ FD$ ' FD@ BLK@* ! ' FD! BLK!* ! " EOT, -ORG @ 256 /MOD 2 PC! 2 PC! -H@ 256 /MOD 2 PC! 2 PC! +ORG @ |M 2 PC! 2 PC! +H@ |M 2 PC! 2 PC! diff --git a/blk.fs b/blk.fs index aa199da..fe3ec3e 100644 --- a/blk.fs +++ b/blk.fs @@ -53,14 +53,10 @@ VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4 : CNZ 0 ; : CZ 1 ; : CNC 2 ; : CC 3 ; : CPO 4 ; : CPE 5 ; : CP 6 ; : CM 7 ; ( ----- 007 ) -( Splits word into msb/lsb, lsb being on TOS ) -: SPLITB - 256 /MOD SWAP -; : PC H@ ORG @ - BIN( @ + ; ( C,* spits an assembled byte, A,, spits an assembled word Both increase PC. ) -: A,, SPLITB C,* C,* ; +: A,, |L C,* C,* ; : <<3 3 LSHIFT ; : <<4 4 LSHIFT ; ( As a general rule, IX and IY are equivalent to spitting an extra 0xdd / 0xfd and then spit the equivalent of HL ) @@ -160,7 +156,7 @@ VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4 LDIXYr, ; ( ----- 015 ) -: OP2 CREATE , DOES> @ 256 /MOD C,* C,* ; +: OP2 CREATE , DOES> @ |M C,* C,* ; 0xeda1 OP2 CPI, 0xedb1 OP2 CPIR, 0xeda9 OP2 CPD, 0xedb9 OP2 CPDR, 0xed46 OP2 IM0, 0xed56 OP2 IM1, @@ -229,9 +225,9 @@ VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4 : OP2r CREATE , DOES> - @ SPLITB SWAP ( r lsb msb ) - C,* ( r lsb ) - SWAP <<3 ( lsb r<<3 ) + @ |M ( r lsb msb ) + C,* ( r lsb ) + SWAP <<3 ( lsb r<<3 ) OR C,* ; 0xed41 OP2r OUT(C)r, @@ -354,12 +350,8 @@ VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4 : [SI] 4 ; : [DI] 5 ; : [BP] 6 ; : [BX] 7 ; : <<3 3 LSHIFT ; ( ----- 032 ) -( Splits word into msb/lsb, lsb being on TOS ) -: SPLITB - 256 /MOD SWAP -; : PC H@ ORG @ - BIN( @ + ; -: A,, SPLITB C,* C,* ; +: A,, |L C,* C,* ; ( ----- 033 ) : OP1 CREATE C, DOES> C@ C,* ; 0xc3 OP1 RET, 0xfa OP1 CLI, 0xfb OP1 STI, @@ -440,7 +432,7 @@ VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4 : SUBxi, 0x83 C,* SWAP 0xe8 OR C,* C,* ; : ADDxi, 0x83 C,* SWAP 0xc0 OR C,* C,* ; : JMPr, 0xff C,* 7 AND 0xe0 OR C,* ; -: JMPf, ( seg off ) 0xea C,* SPLITB C,* C,* A,, ; +: JMPf, ( seg off ) 0xea C,* |L C,* C,* A,, ; ( ----- 041 ) ( Place BEGIN, where you want to jump back and AGAIN after a relative jump operator. Just like BSET and BWR. ) @@ -480,14 +472,11 @@ VARIABLE lblchkPS ( ----- 051 ) VARIABLE ORG VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4 -: SPLITB - 256 /MOD SWAP -; ( We divide by 2 because each PC represents a word. ) : PC H@ ORG @ - 1 RSHIFT ; ( C,* spits an assembled byte, A,, spits an assembled word Both increase PC. ) -: A,, SPLITB C,* C,* ; +: A,, |L C,* C,* ; ( ----- 052 ) : _oor ." arg out of range: " .X SPC ." PC: " PC .X NL ABORT ; : _r8c DUP 7 > IF _oor THEN ; @@ -935,24 +924,24 @@ VARIABLE aspprevx : aspfe! ( efuse -- ) 0 0xa4 0xac _cmd ; ( ----- 162 ) : aspfb! ( n a --, write word n to flash buffer addr a ) - SWAP 256 /MOD ( a lo hi ) SWAP ROT ( hi lo a ) + SWAP |L ( a hi lo ) ROT ( hi lo a ) DUP ROT ( hi a a lo ) SWAP ( hi a lo a ) 0 0x40 ( hi a lo a 0 0x40 ) _cmd DROP ( hi a ) 0 0x48 _cmd DROP ; : aspfp! ( page --, write buffer to page ) - 0 SWAP aspfpgsz @ * 256 /MOD ( 0 lsb msb ) + 0 SWAP aspfpgsz @ * |M ( 0 lsb msb ) 0x4c _cmd DROP asprdy ; : aspf@ ( page a -- n, read word from flash ) - SWAP aspfpgsz @ * OR ( addr ) 256 /MOD ( lsb msb ) + SWAP aspfpgsz @ * OR ( addr ) |M ( lsb msb ) 2DUP 0 ROT> ( lsb msb 0 lsb msb ) 0x20 _cmd ( lsb msb low ) ROT> 0 ROT> ( low 0 lsb msb ) 0x28 _cmd 8 LSHIFT OR ; ( ----- 163 ) : aspe@ ( addr -- byte, read from EEPROM ) - 0 SWAP 256 /MOD ( 0 lsb msb ) SWAP + 0 SWAP |L ( 0 msb lsb ) 0xa0 ( 0 msb lsb 0xa0 ) _cmd ; : aspe! ( byte addr --, write to EEPROM ) - 256 /MOD ( b lsb msb ) SWAP + |L ( b msb lsb ) 0xc0 ( b msb lsb 0xc0 ) _cmd DROP asprdy ; ( ----- 165 ) ( Sega ROM signer. See doc/sega.txt ) @@ -1636,32 +1625,28 @@ CODE 2- ;CODE ( ----- 334 ) CODE RSHIFT ( n u -- n ) - DE POP, ( u ) - HL POP, ( n ) - chkPS, + DE POP, ( u ) HL POP, ( n ) chkPS, A E LDrr, A ORr, IFNZ, - BEGIN, - H SRL, L RR, - A DECr, - JRNZ, AGAIN, + BEGIN, H SRL, L RR, A DECr, JRNZ, AGAIN, THEN, - HL PUSH, -;CODE -( ----- 335 ) + HL PUSH, ;CODE CODE LSHIFT ( n u -- n ) - DE POP, ( u ) - HL POP, ( n ) - chkPS, + DE POP, ( u ) HL POP, ( n ) chkPS, A E LDrr, A ORr, IFNZ, - BEGIN, - L SLA, H RL, - A DECr, - JRNZ, AGAIN, + BEGIN, L SLA, H RL, A DECr, JRNZ, AGAIN, THEN, - HL PUSH, -;CODE + HL PUSH, ;CODE +( ----- 335 ) +CODE |L ( n -- msb lsb ) + HL POP, chkPS, + D 0 LDri, E H LDrr, DE PUSH, + E L LDrr, DE PUSH, ;CODE +CODE |M ( n -- lsb msb ) + HL POP, chkPS, + D 0 LDri, E L LDrr, DE PUSH, + E H LDrr, DE PUSH, ;CODE ( ----- 350 ) Core words @@ -1999,24 +1984,17 @@ SYSVARS 0x0c + :** C<* : ? @ . ; : _ DUP 9 > IF 10 - 'a' + - ELSE '0' + THEN -; + ELSE '0' + THEN ; ( For hex display, there are no negatives ) : .x - 256 MOD ( ensure < 0x100 ) - 16 /MOD ( l h ) - _ EMIT ( l ) - _ EMIT -; -: .X - 256 /MOD ( l h ) - .x .x -; + 0xff AND 16 /MOD ( l h ) + _ EMIT _ EMIT ; +: .X |M .x .x ; ( ----- 377 ) : _ ( a -- a+8 ) DUP ( a a ) ':' EMIT DUP .x SPC - 4 0 DO DUP @ 256 /MOD SWAP .x .x SPC 2+ LOOP + 4 0 DO DUP @ |L .x .x SPC 2+ LOOP DROP ( a ) 8 0 DO C@+ DUP 0x20 0x7e =><= NOT IF DROP '.' THEN EMIT @@ -2417,9 +2395,9 @@ EXX, ( unprotect BC ) ;CODE : _cmd _wait DROP ROT ( a1 a2 cmd ) 0 _s+crc ( a1 a2 crc ) - ROT 256 /MOD ROT ( a2 h l crc ) + ROT |M ROT ( a2 h l crc ) _s+crc _s+crc ( a2 crc ) - SWAP 256 /MOD ROT ( h l crc ) + SWAP |M ROT ( h l crc ) _s+crc _s+crc ( crc ) 1 OR ( ensure stop bit ) (spix) DROP ( send CRC ) @@ -2511,7 +2489,7 @@ EXX, ( unprotect BC ) ;CODE (spix) DROP ( a crc ) SWAP ( crc a ) LOOP - DROP ( crc ) 256 /MOD ( lsb msb ) + DROP ( crc ) |M ( lsb msb ) (spix) DROP (spix) DROP _wait DROP 0 (spie) ; ( ----- 435 ) @@ -2775,6 +2753,12 @@ CODE TICKS 1 chkPS, ( n=100us ) AX 0x8600 MOVxI, ( 86h, WAIT ) 0x15 INT, DX SI MOVxx, ( restore IP ) ;CODE +CODE |M ( n -- lsb msb ) 1 chkPS, + CX POPx, AH 0 MOVri, + AL CL MOVrr, AX PUSHx, AL CH MOVrr, AX PUSHx, ;CODE +CODE |L ( n -- msb lsb ) 1 chkPS, + CX POPx, AH 0 MOVri, + AL CH MOVrr, AX PUSHx, AL CL MOVrr, AX PUSHx, ;CODE ( ----- 470 ) ( Z80 driver for TMS9918. Implements grid protocol. Requires TMS_CTLPORT, TMS_DATAPORT and ~FNT from the Font compiler at diff --git a/cvm/common.fs b/cvm/common.fs index 8d46f2d..ee362d6 100644 --- a/cvm/common.fs +++ b/cvm/common.fs @@ -72,16 +72,18 @@ H@ 4 + XCURRENT ! ( make next CODE have 0 prev field ) 0x36 CODE LSHIFT 0x37 CODE TICKS 0x38 CODE ROT> +0x39 CODE |L +0x3a CODE |M 353 LOAD ( xcomp core ) : (key) 0 PC@ ; : EFS@ 1 3 PC! ( read ) - 256 /MOD 3 PC! 3 PC! ( blkid ) - BLK( 256 /MOD 3 PC! 3 PC! ( dest ) + |M 3 PC! 3 PC! ( blkid ) + BLK( |M 3 PC! 3 PC! ( dest ) ; : EFS! 2 3 PC! ( write ) - 256 /MOD 3 PC! 3 PC! ( blkid ) - BLK( 256 /MOD 3 PC! 3 PC! ( dest ) + |M 3 PC! 3 PC! ( blkid ) + BLK( |M 3 PC! 3 PC! ( dest ) ; ( fork between stage and forth begins here ) diff --git a/cvm/forth.fs b/cvm/forth.fs index ef7b325..11b9e70 100644 --- a/cvm/forth.fs +++ b/cvm/forth.fs @@ -10,6 +10,6 @@ SYSVARS 0x70 + CONSTANT GRID_MEM ( Update LATEST ) PC ORG @ 8 + ! ," BLK$ ' EFS@ BLK@* ! ' EFS! BLK!* ! GRID$ " EOT, -ORG @ 256 /MOD 2 PC! 2 PC! -H@ 256 /MOD 2 PC! 2 PC! +ORG @ |M 2 PC! 2 PC! +H@ |M 2 PC! 2 PC! diff --git a/cvm/stage.bin b/cvm/stage.bin index eaa77f46d6bda363cfd8e7f963cdaccb2656ec3a..e5bf9a910986ab86605848ac48675c1621562f7d 100644 GIT binary patch literal 5065 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 } static void LSHIFT() { word u = pop(); push(pop()<>8); push(n&0xff); } +static void SPLITM() { + word n = pop(); push(n&0xff); push(n>>8); } static void native(NativeWord func) { vm.nativew[vm.nativew_count++] = func; @@ -393,6 +397,8 @@ VM* VM_init(char *bin_path, char *blkfs_path) native(LSHIFT); native(TICKS); native(ROTR); + native(SPLITL); + native(SPLITM); vm.IP = gw(0x04) + 1; // BOOT sw(SYSVARS+0x02, gw(0x08)); // CURRENT sw(SYSVARS+0x04, gw(0x08)); // HERE diff --git a/doc/dict.txt b/doc/dict.txt index f4cb348..3ae12dc 100644 --- a/doc/dict.txt +++ b/doc/dict.txt @@ -194,6 +194,8 @@ results. Use it with C!* ialias pointing to a word-based target. -^ a b -- c b - a -> c * a b -- c a * b -> c / a b -- c a / b -> c +|L n -- msb lsb Split n word in 2 bytes, LSB on TOS +|M n -- lsb msb Split n word in 2 bytes, MSB on TOS MOD a b -- c a % b -> c /MOD a b -- r q r:remainder q:quotient AND a b -- c a & b -> c