@@ 1,369 0,0 @@
-( Usage: uxncli drifloon.rom src/source.tal )
-
-|10 @Console &vector $2 &read $1 &pad $5 &write $1 &err $1
-|a0 @File &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2
-
-|0000
-
- @src $40
- @token $30
- @scope $30
- @buf $30
- @sym &ptr $2
- @ref &ptr $2
- @p &ptr $2 &len $2
-
-|0100
-
- ;on-console .Console/vector DEO2
-
-BRK
-
-@on-console ( -> )
-
- ;src STH2
- ( filepath )
- .Console/read DEI
- DUP #20 LTH OVR #7f GTH ORA ,&end JCN
- STH2kr ;slen JSR2 #003f GTH2 ,&end JCN
- STH2r ;sput JSR2 BRK
- &end
- POP
- ( assemble )
- STH2kr .File/name DEO2
- #0001 .File/length DEO2
- &stream
- ;&c .File/read DEO2 [ LIT &c $1 ] ,walk JSR
- .File/success DEI2 ORA ,&stream JCN
- ;resolve JSR2
- STH2r ;build JSR2
- ( halt )
- #010f DEO
-
-BRK
-
-@walk ( char -- )
-
- #20 GTHk NIP ,&append JCN
- ;token
- DUP2 ,walk-token JSR
- #0030 ;mclr JSR2
- POP
-
-JMP2r
- &append ;token ;sput JMP2
-
-@walk-token ( token* -- )
-
- LDAk LIT '( EQU ,&on-parens JCN
- LDAk LIT ') EQU ,&on-parens JCN
- [ LIT &sleep $1 ] ,&on-sleep JCN
- ;slen JSR2 ORA #01 JCN JMP2r
-
- ;runes/end ;runes
- &loop
- LDAk ;token LDA EQU ,&on-runic JCN
- INC2 INC2 INC2 GTH2k ,&loop JCN
- POP2 POP2
- ;token
- DUP2 ;is-opcode JSR2 ,&on-opcode JCN
- DUP2 ;slen JSR2 #0004 EQU2 ,&on-short JCN
- DUP2 ;slen JSR2 #0002 EQU2 ,&on-byte JCN
-
-;str/key ;print-err JMP2
-
- &on-runic NIP2 ;token INC2 SWP2 [ INC2 LDA2 JMP2 ]
- &on-opcode ;find-opcode JSR2 ;write-byte JMP2
- &on-short ;shex JSR2 ;write-short JMP2
- &on-byte ;shex JSR2 NIP ;write-byte JMP2
- &on-parens LDA #29 SUB ,&sleep STR JMP2r
- &on-sleep POP2 JMP2r
-
-@resolve ( -- )
-
- ( skip empty ) .ref/ptr LDZ2 ORA #01 JCN JMP2r
- ;refs
- &while
- DUP2 ,resolve-ref JSR
- ( eol ) INC2 INC2 ;scap JSR2 INC2 INC2k INC2 LDA ,&while JCN
- POP2
-
-JMP2r
-
-@resolve-ref ( ref* -- )
-
- STH2k
- INC2 INC2 INC2k ,find-label JSR DUP2 #ffff EQU2 ,&no-found JCN
- LDA2 STH2
- ( rune )
- LDAk LIT '. EQU ,&on-litzer JCN
- LDAk LIT ', EQU ,&on-litrel JCN
- LDAk LIT '; EQU ,&on-litabs JCN
- LDAk LIT ': EQU ,&on-rawabs JCN
- &no-found
- POP2 STH2r INC2 INC2 POP2r
-
-;str/ref ;print-err JMP2
-
- &on-litzer STH2r NIP STH2r ,&set-byte JMP
- &on-litrel STH2r STH2kr LDA2 SUB2 #0002 SUB2
- DUP2 #0080 ADD2 POP #00 EQU ,&in-range JCN
- OVR2 INC2 ;str/far ;print-err JSR2
- &in-range
- NIP STH2r
- &set-byte LDA2 ;dst ADD2 STA POP2 JMP2r
- &on-litabs STH2r STH2r ,&set-short JMP
- &on-rawabs STH2r STH2r
- &set-short LDA2 ;dst ADD2 STA2 POP2 JMP2r
-
-@find-label ( name* -- addr/ffff* )
-
- STH2
- ;syms
- &while
- INC2k INC2 STH2kr ;scmp JSR2 ,&on-found JCN
- ( go eol ) INC2 INC2 ;scap JSR2 INC2 INC2k INC2 LDA ,&while JCN
- POP2
- POP2r
- #ffff
-
-JMP2r
- &on-found POP2r JMP2r
-
-@build ( name* -- )
-
- ( write file )
- ;str/rom OVR2 ;scap JSR2 #0003 SUB2 ;scpy JSR2
- DUP2 .File/name DEO2
- .p/len LDZ2 #0100 SUB2 .File/length DEO2
- ;dst/clip .File/write DEO2
- ( write stats )
- ;str/assembled ;print-str JSR2
- ;print-str JSR2
- #2818 DEO
- .p/len LDZ2 ;print JSR2
- LIT '/ #18 DEO
- #0000 ;dst SUB2 ;print JSR2
- #2918 DEO #0a18 DEO
-
-JMP2r
-
-( runic )
-
-@do-lithex ( t* -- )
-
- DUP2 ;slen JSR2 #0004 EQU2 ,&on-short JCN
- DUP2 ;slen JSR2 #0002 EQU2 ,&on-byte JCN
-
-;str/lit ;print-err JMP2
-
- &on-short ;shex JSR2 ;write-litshort JMP2
- &on-byte ;shex JSR2 NIP ;write-litbyte JMP2
-
-@create-label ( name* -- )
-
- ( check duplicate )
- DUP2 ;find-label JSR2 #ffff EQU2 ,&unique JCN
- DUP2 ;str/dup ;print-err JSR2
- &unique
- ( write ref )
- .p/ptr LDZ2 ;syms .sym/ptr LDZ2 STH2k ADD2 STA2
- INC2r INC2r
- ( write string )
- DUP2 ;syms STH2kr ADD2 ;scpy JSR2
- ;slen JSR2 STH2 ADD2r INC2r STH2r .sym/ptr STZ2
-
-JMP2r
-
-@set-scope ( token* -- name* )
-
- ;scope STH2k #0030 ;mclr JSR2 DUP2 STH2r
-
-;scpy JMP2
-
-@do-padabs ( t* -- ) ;shex JSR2 .p/ptr STZ2 JMP2r
-@do-padrel ( t* -- ) ;shex JSR2 .p/ptr LDZ2 ADD2 .p/ptr STZ2 JMP2r
-@do-plabel ( t* -- ) ,set-scope JSR ,create-label JMP
-@do-slabel ( t* -- ) ,make-sublabel JSR ,create-label JMP
-@do-litbyt ( t* -- ) .p/ptr LDZ2 INC2 ,create-ref JSR #ff ;write-litbyte JMP2
-@do-litabs ( t* -- ) .p/ptr LDZ2 INC2 ,create-ref JSR #ffff ;write-litshort JMP2
-@do-rawabs ( t* -- ) .p/ptr LDZ2 ,create-ref JSR #ffff ;write-short JMP2
-@do-rawchr ( t* -- ) LDA ;write-byte JMP2
-@do-rawstr ( t* -- ) &w LDAk ;write-byte JSR2 INC2 LDAk ,&w JCN POP2 JMP2r
-@do-ignore ( t* -- ) POP2 JMP2r
-
-@make-sublabel ( name* -- sublabel* )
-
- ;buf STH2k #0030 ;mclr JSR2
- ;scope STH2kr ;scpy JSR2
- LIT '/ STH2kr ;sput JSR2
- STH2kr ;scat JSR2 STH2r
-
-JMP2r
-
-@create-ref ( name* addr* -- )
-
- ( addr ) ;refs .ref/ptr LDZ2 ADD2 STH2k STA2 INC2r INC2r
- ( rune ) DUP2 #0001 SUB2 LDA STH2kr STA INC2r
- ( child ) LDAk LIT '& NEQ ,&parent JCN INC2 ,make-sublabel JSR &parent
- ( name ) DUP2 STH2kr ;scpy JSR2
- ( move ) ;slen JSR2 STH2r ADD2 ;refs SUB2 INC2 .ref/ptr STZ2
-
-JMP2r
-
-@write-litbyte ( byte -- )
-
- ( LITk ) #80 SWP ,write-short JMP
-
-@write-litshort ( short* -- )
-
- ( LIT2k ) #a0 ,write-byte JSR
-
-@write-short ( short -- )
-
- SWP ,write-byte JSR
-
-@write-byte ( byte -- )
-
- ;dst .p/ptr LDZ2 STH2k ADD2 STA
- INC2r STH2kr .p/ptr STZ2
- STH2r .p/len STZ2
-
-JMP2r
-
-@is-opcode ( string* -- flag )
-
- DUP2 ;opcodes/brk ,scmp3 JSR ,find-opcode/on-brk JCN
-
-@find-opcode ( name* -- byte )
-
- STH2
- #2000
- &loop
- #00 OVR #03 MUL ;opcodes ADD2 STH2kr ,scmp3 JSR ,&on-found JCN
- INC GTHk ,&loop JCN
- POP2 POP2r #00
-
-JMP2r
- &on-found
- NIP ( LITk ) DUP #00 EQU #70 SFT ADD
- STH2r INC2 INC2 INC2 ,find-mode JSR ADD JMP2r
- &on-brk POP2 #01 JMP2r
-
-@find-mode ( mode* -- byte )
-
- LITr 00
- &while
- LDAk LIT '2 EQU #50 SFT STH ADDr
- LDAk LIT 'r EQU #60 SFT STH ADDr
- LDAk LIT 'k EQU #70 SFT STH ADDr
- INC2 LDAk ,&while JCN
- POP2 STHr
-
-JMP2r
-
-@scmp3 ( a[3]* b[3]* -- flag )
-
- LDA2k STH2 INC2 INC2 SWP2
- LDA2k STH2 INC2 INC2 EQU2r
- LDA STH LDA STH EQUr
- ANDr STHr
-
-JMP2r
-
-@shex ( str* -- short* )
-
- DUP2 ,sihx JSR ,&valid JCN
- ;str/hex ;print-err JSR2 #0000 JMP2r
- &valid
- LIT2r 0000
- &while
- LITr 40 SFT2r
- LITr 00
- LDAk ,chex JSR STH ADD2r
- INC2 LDAk ,&while JCN
- POP2 STH2r
-
-JMP2r
-
-@sihx ( str* -- flag )
-
- &while
- LDAk ,chex JSR #ff NEQ ,&valid JCN
- POP2 #00 JMP2r &valid
- INC2 LDAk ,&while JCN
- POP2
- #01
-
-JMP2r
-
-@chex ( char -- value/ff )
-
- DUP #2f GTH OVR #3a LTH AND ,&number JCN
- DUP #60 GTH OVR #67 LTH AND ,&lc JCN
- POP #ff
-
-JMP2r
- &number #30 SUB JMP2r
- &lc #57 SUB JMP2r
-
-@scap ( str* -- end* ) LDAk #00 NEQ JMP JMP2r &w INC2 LDAk ,&w JCN JMP2r
-@sput ( chr str* -- ) ,scap JSR STA JMP2r
-@slen ( str* -- len* ) DUP2 ,scap JSR SWP2 SUB2 JMP2r
-@scat ( src* dst* -- ) DUP2 ,slen JSR ADD2
-@scpy ( src* dst* -- ) STH2 &w LDAk STH2kr STA INC2r INC2 LDAk ,&w JCN POP2 #00 STH2r STA JMP2r
-@scmp ( a* b* -- f ) STH2 &l LDAk LDAkr STHr ANDk #00 EQU ,&e JCN NEQk ,&e JCN POP2 INC2 INC2r ,&l JMP &e NIP2 POP2r EQU JMP2r
-@mclr ( src* len* -- ) OVR2 ADD2 SWP2 &l STH2k #00 STH2r STA INC2 GTH2k ,&l JCN POP2 POP2 JMP2r
-
-@print ( short* -- )
-
- SWP ,&byte JSR
- &byte ( byte -- ) DUP #04 SFT ,&char JSR
- &char ( char -- ) #0f AND DUP #09 GTH #27 MUL ADD #30 ADD #18 DEO
-
-JMP2r
-
-@print-err ( token* err* -- )
-
- ;&error-txt ,print-str JSR
- ,print-str JSR #2018 DEO
- ,print-str JSR #0a18 DEO
-
-JMP2r
- &error-txt "-- 20 $1
-
-@print-str ( str* -- )
-
- &while
- LDAk .Console/write DEO
- INC2 LDAk ,&while JCN
- POP2
-
-JMP2r
-
-@opcodes
- "LIT "INC "POP "NIP "SWP "ROT "DUP "OVR
- "EQU "NEQ "GTH "LTH "JMP "JCN "JSR "STH
- "LDZ "STZ "LDR "STR "LDA "STA "DEI "DEO
- "ADD "SUB "MUL "DIV "AND "ORA "EOR "SFT
- &brk "BRK
-
-@str
- &hex "hex $1 &lit "lit $1 &dup "dup $1
- &far "far $1 &ref "ref $1 &key "key $1
- &rom "rom $1
- &assembled "Assembled 20 $1
-
-@runes
- '| :do-padabs '$ :do-padrel '@ :do-plabel '& :do-slabel
- '. :do-litbyt ', :do-litbyt '; :do-litabs ': :do-rawabs
- '' :do-rawchr '" :do-rawstr '[ :do-ignore '] :do-ignore
- '# :do-lithex &end
-
-( buffers )
-
-@syms $3000 ( addr* name* )
-@refs $3000 ( addr* name* )
-
-@dst $0100 ( zero-page )
- &clip ( program )
@@ 1,173 0,0 @@
-( Usage: uxncli procblim.rom src/source.tal )
-
-|10 @Console &vector $2 &read $1 &pad $5 &write $1 &err $1
-|a0 @File1 &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2
-|b0 @File2 &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2
-
-|0000
-
- @src $40 @dst $40 @token $30 @subtoken $30 @next $2
-
-|0100
-
- ;on-console .Console/vector DEO2
- ;macros .next STZ2
-
-BRK
-
-@on-console ( -> )
-
- ;src STH2
- ( filepath )
- .Console/read DEI
- DUP #20 LTH OVR #7f GTH ORA ,&end JCN
- STH2kr ;slen JSR2 #003f GTH2 ,&end JCN
- STH2r ;sput JSR2 BRK
- &end
- POP
-
- ( output )
- STH2kr
- ;dst ;scpy JSR2
- ;&ext-txt ;dst ;scap JSR2 #0004 SUB2 ;scpy JSR2
- ;dst .File2/name DEO2
-
- STH2r ,parse JSR
-
- ( halt )
- #010e DEO
- #010f DEO
-
-BRK
- &ext-txt ".pro.tal $1
-
-@parse ( name* -- )
-
- .File1/name DEO2
- #0001 .File1/length DEO2
-
- &stream
- ;&c .File1/read DEO2
- .File1/success DEI2 ORA #01 JCN JMP2r
- [ LIT &c $1 ] ,walk JSR
- ,&stream JMP
-
-JMP2r
-
-@walk ( char -- )
-
- LIT '( EQUk NIP ,&toggle JCN
- LIT ') EQUk NIP ,&toggle JCN
- [ LIT &sleep $1 ] ,&skip JCN
- #20 GTHk NIP ,&append JCN
- ;token
- DUP2 ,walk-token JSR
- #0030 ;mclr JSR2
- &skip
- POP
-
-JMP2r
- &toggle #29 SUB ,&sleep STR JMP2r
- &append ;token ;sput JMP2
-
-@walk-token ( token* -- )
-
- ( skip empty ) ;slen JSR2 ORA #01 JCN JMP2r
-
- ( macro )
- ;token
- LDAk LIT '% EQU ;create-macro JCN2
-
- ( replace )
- DUP2 ;find-macro JSR2
- ORAk ,replace-token JCN
- POP2
-
- ,write-word JSR
-
-JMP2r
-
-@replace-token ( macro* -- )
-
- NIP2
- ;scap JSR2 INC2 INC2
-
- &w
- ;subtoken #0030 ;mclr JSR2
- DUP2 ;subtoken OVR2 ;word-length JSR2 ;mcpy JSR2
- ;subtoken ;write-word JSR2
- ,word-skip JSR
- INC2 LDAk ,&w JCN
- POP2
-
-JMP2r
-
-@write-word ( str* -- )
-
- DUP2 ;slen JSR2 .File2/length DEO2
- .File2/write DEO2
- #0001 .File2/length DEO2
- ;&ws .File2/write DEO2
-
-JMP2r
- &ws 20
-
-@word-length ( str* -- length* )
-
- DUP2 ,word-skip JSR SWP2 SUB2
-
-JMP2r
-
-@word-skip ( str* -- word* )
-
- &eow INC2 LDAk #20 GTH ,&eow JCN
-
-JMP2r
-
-( macro )
-
-@create-macro ( token* -- )
-
- INC2
- ( push name )
- DUP2 .next LDZ2 ;scpy JSR2
- ;slen JSR2 .next LDZ2 ADD2 INC2 .next STZ2
- &stream
- ;&c .File1/read DEO2
- ,&c LDR LIT '{ EQU ,&stream JCN
- ,&c LDR LIT '} EQU ,&end JCN
- .File1/success DEI2 #0000 EQU2 ,&end JCN
- [ LIT &c $1 ] .next LDZ2 ;sput JSR2
- ,&stream JMP
- &end
- .next LDZ2
- DUP2 ;slen JSR2 ADD2 INC2 .next STZ2
-
-JMP2r
-
-@find-macro ( token* -- macro* )
-
- STH2
- ;macros
- &while
- DUP2 STH2kr ;scmp JSR2 ,&found JCN
- ,scap JSR INC2 ,scap JSR INC2
- LDAk ,&while JCN
- POP2
- POP2r
- #0000
-
-JMP2r
- &found POP2r JMP2r
-
-( stdlib )
-
-@slen ( str* -- len* ) DUP2 ,scap JSR SWP2 SUB2 JMP2r
-@scap ( str* -- end* ) LDAk #00 NEQ JMP JMP2r &w INC2 LDAk ,&w JCN JMP2r
-@sput ( char str* -- ) ,scap JSR STA JMP2r
-@scpy ( src* dst* -- ) STH2 &w LDAk STH2kr STA INC2r INC2 LDAk ,&w JCN POP2 #00 STH2r STA JMP2r
-@scmp ( a* b* -- f ) STH2 &l LDAk LDAkr STHr ANDk #00 EQU ,&e JCN NEQk ,&e JCN POP2 INC2 INC2r ,&l JMP &e NIP2 POP2r EQU JMP2r
-@mclr ( src* len* -- ) OVR2 ADD2 SWP2 &l STH2k #00 STH2r STA INC2 GTH2k ,&l JCN POP2 POP2 JMP2r
-@mcpy ( src* dst* len* -- ) SWP2 STH2 OVR2 ADD2 SWP2 &loop LDAk STH2kr STA INC2r INC2 GTH2k ,&loop JCN POP2 POP2 POP2r JMP2r
-
-@macros ( name | body | name | body .. )