From b75b4763502847f802b63ac0119ba27c07f9ec94 Mon Sep 17 00:00:00 2001 From: Aleteoryx Date: Mon, 24 Mar 2025 23:03:20 -0400 Subject: [PATCH] gif work, brainfuck compiler --- .gitignore | 2 + bfc.tal | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++ gif.tal | 68 ++++++++++++++++++++++++++++ mkfile | 4 +- 4 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 bfc.tal create mode 100644 gif.tal diff --git a/.gitignore b/.gitignore index 549ce76c80511a4252c4f95517d8d27a6fc0f004..f26fbd9a6047445f87337502024b1cf113340ebd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.rom *.sym +games/ +*~ diff --git a/bfc.tal b/bfc.tal new file mode 100644 index 0000000000000000000000000000000000000000..31f73e682f4df5fcf9fdc2f4eaf28fce933cbc26 --- /dev/null +++ b/bfc.tal @@ -0,0 +1,129 @@ +|0 @System &pad $e &debug $1 &state $1 +|10 @Console &vector $2 &read $1 &pad $4 &type $1 &write $1 &error $1 + +( program structure: + 0x00 .. 0xff = brainfuck tape + 0x0100..0xffff = program rom + + stack contents between instructions: ( addr val ) + return stack always stores 0x01 + + [ +++ ] => @l0000 DUP #00 EQU ?{ INC INC INC !l0000 } +) + +%dbg { LIT2 01 -System/debug DEO } + +|100 +@on-reset ( -> ) + ;on-console .Console/vector DEO2 + ;Code/intro Code/emit-line + ;Code/intro2 Code/emit-line + BRK + +@on-console ( -> ) + .Console/type DEI #04 NEQ ?{ + Loops/not-empty? ?{ ;errs/mismatch errs/die } + } + .Console/read DEI + DUP [ LIT "[ ] NEQ ?{ Loops/open } + DUP [ LIT "] ] NEQ ?{ Loops/close } + Code/emit + BRK + + +@putn2 ( n* -- ) + SWP putn + ( >> ) +@putn ( n -- ) + #10 DIVk DUP putbcd + MUL SUB putbcd + JMP2r +@putbcd ( n -- ) + DUP #0a LTH ?{ #27 ADD } + #30 ADD .Console/write DEO + JMP2r + + +@Code/tab + "+ =/add + "- =/sub + "> =/next + "< =/prev + ". =/out + ", =/in + "[ =/open + "] =/close + $1 + +&add "INC 0a +&sub "STHrk 20 "SUB 0a +&next "OVR 20 "STZ 20 "INC 20 "LDZk 0a +&prev "OVR 20 "STZ 20 "STHrk 20 "SUB 20 "LDZk 0a +&out "DUP 20 "#18 20 "DEO 0a +&in "POP 20 ";{ 20 "#10 20 "DEO2 20 "BRK 20 "} 20 "#12 20 "DEI 0a +&open 20 "DUP 20 "#00 20 "EQU 20 "?{ 0a +&close 20 "} 0a + +&intro "|100 20 "( 20 "generated 20 "by 20 "bfc.rom 20 ") 0a +&intro2 "LITr 20 "01 0a + +&trailer "#800f 20 "DEO 20 "BRK 0a + +&emit ( c -- ) + LIT2r =/tab + ( >> ) + +&search ( c `addr* -- ) + DUP LDArk STHr DUP + #00 NEQ ?{ POP2r POP2 POP JMP2r } + EQU ?{ INC2r INC2r INC2r !/search } + POP STH2r INC2 LDA2 + ( >> ) + +&emit-line ( addr* -- ) + LDAk .Console/write DEO + LDAk #0a EQU ?{ INC2 !/emit-line } + POP2 JMP2r + + +@Loops/open ( -- ) + [ LIT2 &ctr $2 ] INC2k ,/ctr STR2 ( get next loop idx ) + DUP2 /print-label ( "@lXXXX" ) + [ LIT2 &ptr =/stack ] INC2k INC2 ,/ptr STR2 ( increment stack pointer ) + STA2 ( store idx ) + JMP2r + +&close ( -- ) + ,/ptr LDR2 #0002 SUB2 + LDA2k INC2k ORA ?{ ;errs/underflow errs/die } + /print-jmi + ,/ptr STR2 + JMP2r + +¬-empty? ( -- empty ) + ,/ptr LDR2 ;/stack EQU2 + JMP2r + +&print-label ( n* -- ) + [ LIT2 "@ -Console/write ] DEO + !/print-name +&print-jmi ( n* -- ) + [ LIT2 "! -Console/write ] DEO + ( >> ) +&print-name ( n* -- ) + [ LIT2 "l -Console/write ] DEO + putn2 + JMP2r + + +@errs/die ( addr* -- ) + LDAk DUP ?{ #ff .System/state DEO BRK } + .Console/error DEO + INC2 !/die + +&underflow "fatal: 20 "too 20 "many 20 "closing 20 "braces. 0a $1 +&mismatch "fatal: 20 "not 20 "enough 20 "closing 20 "braces. 0a $1 + + +@Loops/guard [ ffff ] +&stack ( goes to end of ram ) diff --git a/gif.tal b/gif.tal new file mode 100644 index 0000000000000000000000000000000000000000..15addaaf44b4cfadbe7f290906b0af0d3eeb2e7b --- /dev/null +++ b/gif.tal @@ -0,0 +1,68 @@ +|00 @System/vector $2 &expansion $2 &wst $1 &rst $1 &metadata $2 &r $2 &g $2 &b $2 &debug $1 &state $1 +|10 @Console &vector $2 &read $1 &pad $4 &type $1 &write $1 &error $1 +|a0 @File1/vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 + +|00 + @input/path $2f &end $1 + +%dbg! ( -- ) { #00 ?{ LIT2 01 -System/debug DEO } } +|100 +@on-reset ( -> ) + ;meta .System/metadata DEO2 + .Console/type DEI ?{ ;errs/usage die } + ;on-input .Console/vector DEO2 + BRK + +@on-input ( -> ) + #0403 .Console/type DEI + NEQk ?{ ;errs/usage die } NIP + NEQk ?{ !readloop } POP2 + + [ LIT2 -input/end &ptr -input/path ] + NEQk ?{ ;errs/pathlimit die } + .Console/read DEI SWP STZk INC ,&ptr STR + POP2 BRK + +@readloop ( -- ) + ;input/path .File1/name DEO2 + .File1/success DEI + BRK + +@die ( str* -- ) + perr [ LIT2 81 -System/state ] DEO + BRK +@pout ( str* -- ) + .Console/write ;puts/target STA + !puts +@perr ( str* -- ) + .Console/error ;puts/target STA + ( >> ) + +@puts ( str* -- ) + LDAk DUP ?{ POP POP2 JMP2r } + [ LIT &target -Console/write ] DEO + INC2 !puts + + +@gif/chunk &magic $ff + &screen &wid $2 &hei $2 &pack $1 &bg $1 &aspect $1 + &colortab $300 + +@gif/init ( -- ) + #06 /read + /magic-ok? ?{ ;errs/corrupt die } +@gif/read ( len* -- ) + #00 SWP .File1/length DEO2 + ;/chunk .File1/read + JMP2r + + +@errs/usage "usage: 20 "gif.rom 20 "image.gif 0a $1 + &pathlimit "GIF 20 "path 20 "limit 20 "exceeded. 0a $1 + &filename ": 20 "file 20 "unreadable 0a $1 + +@meta $1 + ( name ) "GIF 0a + ( desc ) ".gif 20 "file 20 "renderer 0a + ( auth ) "By 20 "Aleteoryx 0a + ( date ) "20250319 $2 diff --git a/mkfile b/mkfile index 384ba715c6b10b8832991e71bfe94ad20c8fb941..e6f8e85c58f82eaad8ba80c7ae83e67fa53da9a6 100644 --- a/mkfile +++ b/mkfile @@ -1,6 +1,8 @@ roms=\ arvelie.rom\ - nanpa.rom + nanpa.rom\ + bfc.rom\ + gif.rom all:VQ: $roms