This commit is contained in:
Devine Lu Linvega 2024-06-29 20:07:50 -08:00
parent 01199fdc1b
commit 4f4043c705
4 changed files with 62 additions and 75 deletions

View File

@ -11,8 +11,7 @@ lint:
@ ${LIN} src/${ID}.tal @ ${LIN} src/${ID}.tal
run: all run: all
@ ${EMU} ${ROM} > src/core.c @ ${EMU} ${ROM} > src/core.c
@ cat src/a.c src/core.c src/b.c > bin/main.c @ cat src/a.c src/core.c src/b.c > bin/main.c && cc bin/main.c -o bin/main && ./bin/main
@ cc bin/main.c -o bin/main && ./bin/main
@ rm ./bin/* @ rm ./bin/*
clean: clean:
@ rm -f ${ROM} ${ROM}.sym @ rm -f ${ROM} ${ROM}.sym

View File

@ -11,7 +11,7 @@ main(int argc, char **argv)
uxn.ram[0x104] = 0x80; uxn.ram[0x104] = 0x80;
uxn.ram[0x105] = 0x56; uxn.ram[0x105] = 0x56;
uxn.ram[0x106] = 0x01; uxn.ram[0x106] = 0x06;
if(uxn_eval(0x0100) && (uxn.dev[0x10] << 8 | uxn.dev[0x11])) if(uxn_eval(0x0100) && (uxn.dev[0x10] << 8 | uxn.dev[0x11]))
while(!uxn.dev[0x0f]) ; while(!uxn.dev[0x0f]) ;
return uxn.dev[0x0f] & 0x7f; return uxn.dev[0x0f] & 0x7f;

View File

@ -5,11 +5,11 @@ uxn_eval(Uint16 pc) {
case 0x00: /* BRK */ return 1; break; case 0x00: /* BRK */ return 1; break;
case 0x01: /* INC */ uxn.wst.dat[uxn.wst.ptr - 1]++; pc++; break; case 0x01: /* INC */ uxn.wst.dat[uxn.wst.ptr - 1]++; pc++; break;
case 0x02: /* POP */ uxn.wst.ptr--; pc++; break; case 0x02: /* POP */ uxn.wst.ptr--; pc++; break;
case 0x03: /* NIP */ uxn.wst.dat[uxn.wst.ptr--] = uxn.wst.dat[uxn.wst.ptr]; break; case 0x03: /* NIP */ uxn.wst.ptr--; uxn.wst.dat[uxn.wst.ptr - 1] = uxn.wst.dat[uxn.wst.ptr]; pc++; break;
case 0x04: /* SWP */ uxn.wst.dat[uxn.wst.ptr - 1] = uxn.wst.dat[uxn.wst.ptr - 2]; break; case 0x04: /* SWP */ break;
case 0x05: /* ROT */ break; case 0x05: /* ROT */ break;
case 0x06: /* DUP */ uxn.wst.dat[uxn.wst.ptr] = uxn.wst.dat[uxn.wst.ptr]; uxn.wst.ptr++; break; case 0x06: /* DUP */ uxn.wst.dat[uxn.wst.ptr] = uxn.wst.dat[uxn.wst.ptr - 1]; uxn.wst.ptr++; pc++; break;
case 0x07: /* OVR */ break; case 0x07: /* OVR */ break;
case 0x08: /* EQU */ return 1; break; case 0x08: /* EQU */ return 1; break;
case 0x09: /* NEQ */ return 1; break; case 0x09: /* NEQ */ return 1; break;
case 0x0a: /* GTH */ return 1; break; case 0x0a: /* GTH */ return 1; break;
@ -37,11 +37,11 @@ uxn_eval(Uint16 pc) {
case 0x20: /* JCI */ return 1; break; case 0x20: /* JCI */ return 1; break;
case 0x21: /* INC2 */ uxn.wst.dat[uxn.wst.ptr - 1]++; pc++; break; case 0x21: /* INC2 */ uxn.wst.dat[uxn.wst.ptr - 1]++; pc++; break;
case 0x22: /* POP2 */ uxn.wst.ptr--; pc++; break; case 0x22: /* POP2 */ uxn.wst.ptr--; pc++; break;
case 0x23: /* NIP2 */ uxn.wst.dat[uxn.wst.ptr--] = uxn.wst.dat[uxn.wst.ptr]; break; case 0x23: /* NIP2 */ uxn.wst.ptr--; uxn.wst.dat[uxn.wst.ptr - 1] = uxn.wst.dat[uxn.wst.ptr]; pc++; break;
case 0x24: /* SWP2 */ uxn.wst.dat[uxn.wst.ptr - 1] = uxn.wst.dat[uxn.wst.ptr - 2]; break; case 0x24: /* SWP2 */ break;
case 0x25: /* ROT2 */ break; case 0x25: /* ROT2 */ break;
case 0x26: /* DUP2 */ uxn.wst.dat[uxn.wst.ptr] = uxn.wst.dat[uxn.wst.ptr]; uxn.wst.ptr++; break; case 0x26: /* DUP2 */ uxn.wst.dat[uxn.wst.ptr] = uxn.wst.dat[uxn.wst.ptr - 1]; uxn.wst.ptr++; pc++; break;
case 0x27: /* OVR2 */ break; case 0x27: /* OVR2 */ break;
case 0x28: /* EQU2 */ return 1; break; case 0x28: /* EQU2 */ return 1; break;
case 0x29: /* NEQ2 */ return 1; break; case 0x29: /* NEQ2 */ return 1; break;
case 0x2a: /* GTH2 */ return 1; break; case 0x2a: /* GTH2 */ return 1; break;
@ -69,11 +69,11 @@ uxn_eval(Uint16 pc) {
case 0x40: /* JMI */ return 1; break; case 0x40: /* JMI */ return 1; break;
case 0x41: /* INCr */ uxn.rst.dat[uxn.rst.ptr - 1]++; pc++; break; case 0x41: /* INCr */ uxn.rst.dat[uxn.rst.ptr - 1]++; pc++; break;
case 0x42: /* POPr */ uxn.rst.ptr--; pc++; break; case 0x42: /* POPr */ uxn.rst.ptr--; pc++; break;
case 0x43: /* NIPr */ uxn.rst.dat[uxn.rst.ptr--] = uxn.rst.dat[uxn.rst.ptr]; break; case 0x43: /* NIPr */ uxn.rst.ptr--; uxn.rst.dat[uxn.rst.ptr - 1] = uxn.rst.dat[uxn.rst.ptr]; pc++; break;
case 0x44: /* SWPr */ uxn.rst.dat[uxn.rst.ptr - 1] = uxn.rst.dat[uxn.rst.ptr - 2]; break; case 0x44: /* SWPr */ break;
case 0x45: /* ROTr */ break; case 0x45: /* ROTr */ break;
case 0x46: /* DUPr */ uxn.rst.dat[uxn.rst.ptr] = uxn.rst.dat[uxn.rst.ptr]; uxn.rst.ptr++; break; case 0x46: /* DUPr */ uxn.rst.dat[uxn.rst.ptr] = uxn.rst.dat[uxn.rst.ptr - 1]; uxn.rst.ptr++; pc++; break;
case 0x47: /* OVRr */ break; case 0x47: /* OVRr */ break;
case 0x48: /* EQUr */ return 1; break; case 0x48: /* EQUr */ return 1; break;
case 0x49: /* NEQr */ return 1; break; case 0x49: /* NEQr */ return 1; break;
case 0x4a: /* GTHr */ return 1; break; case 0x4a: /* GTHr */ return 1; break;
@ -101,11 +101,11 @@ uxn_eval(Uint16 pc) {
case 0x60: /* JSI */ return 1; break; case 0x60: /* JSI */ return 1; break;
case 0x61: /* INC2r */ uxn.rst.dat[uxn.rst.ptr - 1]++; pc++; break; case 0x61: /* INC2r */ uxn.rst.dat[uxn.rst.ptr - 1]++; pc++; break;
case 0x62: /* POP2r */ uxn.rst.ptr--; pc++; break; case 0x62: /* POP2r */ uxn.rst.ptr--; pc++; break;
case 0x63: /* NIP2r */ uxn.rst.dat[uxn.rst.ptr--] = uxn.rst.dat[uxn.rst.ptr]; break; case 0x63: /* NIP2r */ uxn.rst.ptr--; uxn.rst.dat[uxn.rst.ptr - 1] = uxn.rst.dat[uxn.rst.ptr]; pc++; break;
case 0x64: /* SWP2r */ uxn.rst.dat[uxn.rst.ptr - 1] = uxn.rst.dat[uxn.rst.ptr - 2]; break; case 0x64: /* SWP2r */ break;
case 0x65: /* ROT2r */ break; case 0x65: /* ROT2r */ break;
case 0x66: /* DUP2r */ uxn.rst.dat[uxn.rst.ptr] = uxn.rst.dat[uxn.rst.ptr]; uxn.rst.ptr++; break; case 0x66: /* DUP2r */ uxn.rst.dat[uxn.rst.ptr] = uxn.rst.dat[uxn.rst.ptr - 1]; uxn.rst.ptr++; pc++; break;
case 0x67: /* OVR2r */ break; case 0x67: /* OVR2r */ break;
case 0x68: /* EQU2r */ return 1; break; case 0x68: /* EQU2r */ return 1; break;
case 0x69: /* NEQ2r */ return 1; break; case 0x69: /* NEQ2r */ return 1; break;
case 0x6a: /* GTH2r */ return 1; break; case 0x6a: /* GTH2r */ return 1; break;
@ -133,11 +133,11 @@ uxn_eval(Uint16 pc) {
case 0x80: /* LITk */ uxn.wst.dat[uxn.wst.ptr++] = uxn.ram[++pc]; pc++; break; case 0x80: /* LITk */ uxn.wst.dat[uxn.wst.ptr++] = uxn.ram[++pc]; pc++; break;
case 0x81: /* INCk */ uxn.wst.dat[uxn.wst.ptr - 1]++; pc++; break; case 0x81: /* INCk */ uxn.wst.dat[uxn.wst.ptr - 1]++; pc++; break;
case 0x82: /* POPk */ uxn.wst.ptr--; pc++; break; case 0x82: /* POPk */ uxn.wst.ptr--; pc++; break;
case 0x83: /* NIPk */ uxn.wst.dat[uxn.wst.ptr--] = uxn.wst.dat[uxn.wst.ptr]; break; case 0x83: /* NIPk */ uxn.wst.ptr--; uxn.wst.dat[uxn.wst.ptr - 1] = uxn.wst.dat[uxn.wst.ptr]; pc++; break;
case 0x84: /* SWPk */ uxn.wst.dat[uxn.wst.ptr - 1] = uxn.wst.dat[uxn.wst.ptr - 2]; break; case 0x84: /* SWPk */ break;
case 0x85: /* ROTk */ break; case 0x85: /* ROTk */ break;
case 0x86: /* DUPk */ uxn.wst.dat[uxn.wst.ptr] = uxn.wst.dat[uxn.wst.ptr]; uxn.wst.ptr++; break; case 0x86: /* DUPk */ uxn.wst.dat[uxn.wst.ptr] = uxn.wst.dat[uxn.wst.ptr - 1]; uxn.wst.ptr++; pc++; break;
case 0x87: /* OVRk */ break; case 0x87: /* OVRk */ break;
case 0x88: /* EQUk */ return 1; break; case 0x88: /* EQUk */ return 1; break;
case 0x89: /* NEQk */ return 1; break; case 0x89: /* NEQk */ return 1; break;
case 0x8a: /* GTHk */ return 1; break; case 0x8a: /* GTHk */ return 1; break;
@ -162,14 +162,14 @@ uxn_eval(Uint16 pc) {
case 0x9d: /* ORAk */ return 1; break; case 0x9d: /* ORAk */ return 1; break;
case 0x9e: /* EORk */ return 1; break; case 0x9e: /* EORk */ return 1; break;
case 0x9f: /* SFTk */ return 1; break; case 0x9f: /* SFTk */ return 1; break;
case 0xa0: /* LIT2k */ break; case 0xa0: /* LIT2k */ break;
case 0xa1: /* INC2k */ uxn.wst.dat[uxn.wst.ptr - 1]++; pc++; break; case 0xa1: /* INC2k */ uxn.wst.dat[uxn.wst.ptr - 1]++; pc++; break;
case 0xa2: /* POP2k */ uxn.wst.ptr--; pc++; break; case 0xa2: /* POP2k */ uxn.wst.ptr--; pc++; break;
case 0xa3: /* NIP2k */ uxn.wst.dat[uxn.wst.ptr--] = uxn.wst.dat[uxn.wst.ptr]; break; case 0xa3: /* NIP2k */ uxn.wst.ptr--; uxn.wst.dat[uxn.wst.ptr - 1] = uxn.wst.dat[uxn.wst.ptr]; pc++; break;
case 0xa4: /* SWP2k */ uxn.wst.dat[uxn.wst.ptr - 1] = uxn.wst.dat[uxn.wst.ptr - 2]; break; case 0xa4: /* SWP2k */ break;
case 0xa5: /* ROT2k */ break; case 0xa5: /* ROT2k */ break;
case 0xa6: /* DUP2k */ uxn.wst.dat[uxn.wst.ptr] = uxn.wst.dat[uxn.wst.ptr]; uxn.wst.ptr++; break; case 0xa6: /* DUP2k */ uxn.wst.dat[uxn.wst.ptr] = uxn.wst.dat[uxn.wst.ptr - 1]; uxn.wst.ptr++; pc++; break;
case 0xa7: /* OVR2k */ break; case 0xa7: /* OVR2k */ break;
case 0xa8: /* EQU2k */ return 1; break; case 0xa8: /* EQU2k */ return 1; break;
case 0xa9: /* NEQ2k */ return 1; break; case 0xa9: /* NEQ2k */ return 1; break;
case 0xaa: /* GTH2k */ return 1; break; case 0xaa: /* GTH2k */ return 1; break;
@ -197,11 +197,11 @@ uxn_eval(Uint16 pc) {
case 0xc0: /* LITkr */ uxn.rst.dat[uxn.rst.ptr++] = uxn.ram[++pc]; pc++; break; case 0xc0: /* LITkr */ uxn.rst.dat[uxn.rst.ptr++] = uxn.ram[++pc]; pc++; break;
case 0xc1: /* INCkr */ uxn.rst.dat[uxn.rst.ptr - 1]++; pc++; break; case 0xc1: /* INCkr */ uxn.rst.dat[uxn.rst.ptr - 1]++; pc++; break;
case 0xc2: /* POPkr */ uxn.rst.ptr--; pc++; break; case 0xc2: /* POPkr */ uxn.rst.ptr--; pc++; break;
case 0xc3: /* NIPkr */ uxn.rst.dat[uxn.rst.ptr--] = uxn.rst.dat[uxn.rst.ptr]; break; case 0xc3: /* NIPkr */ uxn.rst.ptr--; uxn.rst.dat[uxn.rst.ptr - 1] = uxn.rst.dat[uxn.rst.ptr]; pc++; break;
case 0xc4: /* SWPkr */ uxn.rst.dat[uxn.rst.ptr - 1] = uxn.rst.dat[uxn.rst.ptr - 2]; break; case 0xc4: /* SWPkr */ break;
case 0xc5: /* ROTkr */ break; case 0xc5: /* ROTkr */ break;
case 0xc6: /* DUPkr */ uxn.rst.dat[uxn.rst.ptr] = uxn.rst.dat[uxn.rst.ptr]; uxn.rst.ptr++; break; case 0xc6: /* DUPkr */ uxn.rst.dat[uxn.rst.ptr] = uxn.rst.dat[uxn.rst.ptr - 1]; uxn.rst.ptr++; pc++; break;
case 0xc7: /* OVRkr */ break; case 0xc7: /* OVRkr */ break;
case 0xc8: /* EQUkr */ return 1; break; case 0xc8: /* EQUkr */ return 1; break;
case 0xc9: /* NEQkr */ return 1; break; case 0xc9: /* NEQkr */ return 1; break;
case 0xca: /* GTHkr */ return 1; break; case 0xca: /* GTHkr */ return 1; break;
@ -229,11 +229,11 @@ uxn_eval(Uint16 pc) {
case 0xe0: /* LIT2kr */ return 1; break; case 0xe0: /* LIT2kr */ return 1; break;
case 0xe1: /* INC2kr */ uxn.rst.dat[uxn.rst.ptr - 1]++; pc++; break; case 0xe1: /* INC2kr */ uxn.rst.dat[uxn.rst.ptr - 1]++; pc++; break;
case 0xe2: /* POP2kr */ uxn.rst.ptr--; pc++; break; case 0xe2: /* POP2kr */ uxn.rst.ptr--; pc++; break;
case 0xe3: /* NIP2kr */ uxn.rst.dat[uxn.rst.ptr--] = uxn.rst.dat[uxn.rst.ptr]; break; case 0xe3: /* NIP2kr */ uxn.rst.ptr--; uxn.rst.dat[uxn.rst.ptr - 1] = uxn.rst.dat[uxn.rst.ptr]; pc++; break;
case 0xe4: /* SWP2kr */ uxn.rst.dat[uxn.rst.ptr - 1] = uxn.rst.dat[uxn.rst.ptr - 2]; break; case 0xe4: /* SWP2kr */ break;
case 0xe5: /* ROT2kr */ break; case 0xe5: /* ROT2kr */ break;
case 0xe6: /* DUP2kr */ uxn.rst.dat[uxn.rst.ptr] = uxn.rst.dat[uxn.rst.ptr]; uxn.rst.ptr++; break; case 0xe6: /* DUP2kr */ uxn.rst.dat[uxn.rst.ptr] = uxn.rst.dat[uxn.rst.ptr - 1]; uxn.rst.ptr++; pc++; break;
case 0xe7: /* OVR2kr */ break; case 0xe7: /* OVR2kr */ break;
case 0xe8: /* EQU2kr */ return 1; break; case 0xe8: /* EQU2kr */ return 1; break;
case 0xe9: /* NEQ2kr */ return 1; break; case 0xe9: /* NEQ2kr */ return 1; break;
case 0xea: /* GTH2kr */ return 1; break; case 0xea: /* GTH2kr */ return 1; break;

View File

@ -28,7 +28,7 @@
[ LIT2 "/ 18 ] DEO [ LIT2 "/ 18 ] DEO
#2018 DEO #2018 DEO
( | body ) ( | body )
#00 OVR #1f AND DUP ADD ;opc-lut ADD2 LDA2 JSR2 #2018 DEO #00 OVR #1f AND DUP ADD ;opc-lut ADD2 LDA2 JSR2
( ) ;dict/break <pstr> ( ) ;dict/break <pstr>
#0a18 DEO #0a18 DEO
JMP2r JMP2r
@ -108,8 +108,7 @@
<inc> <inc>
<pc> <pc>
[ LIT2 "] 18 ] DEO [ LIT2 "] 18 ] DEO
[ LIT2 "; 18 ] DEO <then>
#2018 DEO
<pc-inc> <pc-inc>
POP JMP2r POP JMP2r
@ -123,46 +122,33 @@
#01 <minus> #01 <minus>
[ LIT2 "] 18 ] DEO [ LIT2 "] 18 ] DEO
<inc> <inc>
[ LIT2 "; 18 ] DEO <then>
#2018 DEO
POP !<pc-inc> POP !<pc-inc>
@op-pop ( byte -- ) @op-pop ( byte -- )
<ptr> <ptr>
<dec> <dec>
[ LIT2 "; 18 ] DEO <then>
#2018 DEO
POP !<pc-inc> POP !<pc-inc>
@op-nip ( byte -- ) @op-nip ( byte -- )
<dat>
[ LIT2 "[ 18 ] DEO
<ptr> <ptr>
<dec> <dec>
[ LIT2 "] 18 ] DEO <then>
<equ>
<dat>
[ LIT2 "[ 18 ] DEO
<ptr>
[ LIT2 "] 18 ] DEO
[ LIT2 "; 18 ] DEO
POP JMP2r
@op-swp ( byte -- )
( | a )
<dat> <dat>
[ LIT2 "[ 18 ] DEO [ LIT2 "[ 18 ] DEO
<ptr> <ptr>
#01 <minus> #01 <minus>
[ LIT2 "] 18 ] DEO [ LIT2 "] 18 ] DEO
<equ> <equ>
( | b )
<dat> <dat>
[ LIT2 "[ 18 ] DEO [ LIT2 "[ 18 ] DEO
<ptr> <ptr>
#02 <minus>
[ LIT2 "] 18 ] DEO [ LIT2 "] 18 ] DEO
[ LIT2 "; 18 ] DEO <then>
POP !<pc-inc>
@op-swp ( byte -- )
POP JMP2r POP JMP2r
@op-rot ( byte -- ) @op-rot ( byte -- )
@ -177,13 +163,13 @@
<dat> <dat>
[ LIT2 "[ 18 ] DEO [ LIT2 "[ 18 ] DEO
<ptr> <ptr>
#01 <minus>
[ LIT2 "] 18 ] DEO [ LIT2 "] 18 ] DEO
[ LIT2 "; 18 ] DEO <then>
#2018 DEO
<ptr> <ptr>
<inc> <inc>
[ LIT2 "; 18 ] DEO <then>
POP JMP2r POP !<pc-inc>
@op-ovr ( byte -- ) @op-ovr ( byte -- )
POP JMP2r POP JMP2r
@ -204,9 +190,7 @@
<equ> <equ>
<ptr> <ptr>
#01 <minus> #01 <minus>
[ LIT2 "; 18 ] DEO !<then>
#2018 DEO
JMP2r
@<equ> ( -- ) @<equ> ( -- )
#2018 DEO #2018 DEO
@ -245,7 +229,11 @@
@<pc-inc> ( -- ) @<pc-inc> ( -- )
<pc> <pc>
<inc> <inc>
( >> )
@<then> ( -- )
[ LIT2 "; 18 ] DEO [ LIT2 "; 18 ] DEO
#2018 DEO
JMP2r JMP2r
( (
@ -289,7 +277,7 @@
&end 0909 "} 0a 0909 "system_inspect(); 0a 09 "} 0a "} 0a $1 &end 0909 "} 0a 0909 "system_inspect(); 0a 09 "} 0a "} 0a $1
&case 0909 "case 20 $1 &case 0909 "case 20 $1
&break "break; $1 &break "break; $1
&return "return 20 "1; $1 &return "return 20 "1; 20 $1
&uxn-wst-dat "uxn.wst.dat $1 &uxn-wst-dat "uxn.wst.dat $1
&uxn-wst-ptr "uxn.wst.ptr $1 &uxn-wst-ptr "uxn.wst.ptr $1
&uxn-rst-dat "uxn.rst.dat $1 &uxn-rst-dat "uxn.rst.dat $1