( lib.string ) |000 @ztr/buf $30 &cap |100 @on-reset ( -> ) ;tests/end ;tests &>l LDA2k JSR2 test INC2 INC2 GTH2k ?&>l POP2 POP2 ( lb ) #0a18 DEO ( debugger ) #010e DEO ( exit ) #800f DEO BRK @test ( f -- ) #30 ADD #18 DEO JMP2r ( @|tests ) @tests [ =chr/ =str/ =obj/ =ztr/ ] &end $2 @chr/ ( -- value ) ;&name str/ ( | lc ) LIT "a /lc LIT "a NEQ ?&fail LIT "A /lc LIT "a NEQ ?&fail LIT "Z /lc LIT "z NEQ ?&fail LIT "[ /lc LIT "[ NEQ ?&fail LIT "@ /lc LIT "@ NEQ ?&fail ( | uc ) LIT "A /uc LIT "A NEQ ?&fail LIT "a /uc LIT "A NEQ ?&fail LIT "z /uc LIT "Z NEQ ?&fail LIT "[ /uc LIT "[ NEQ ?&fail LIT "@ /uc LIT "@ NEQ ?&fail ( | hex ) LIT "0 /hex #00 NEQ ?&fail LIT "1 /hex #01 NEQ ?&fail LIT "9 /hex #09 NEQ ?&fail LIT "a /hex #0a NEQ ?&fail LIT "f /hex #0f NEQ ?&fail LIT "g /hex #ff NEQ ?&fail LIT 00 /hex #ff NEQ ?&fail #01 JMP2r &fail #00 JMP2r &name 0a "chr: 20 $1 @str/ ( -- ) ;&name str/ ( | len ) [ { "hello $1 } STH2r ] /len #0005 NEQ2 ?&fail [ { "what $1 } STH2r ] /len #0004 NEQ2 ?&fail [ { $1 } STH2r ] /len #0000 NEQ2 ?&fail ( | cmp ) ( a ) [ { "text 00 } STH2r ] ( b ) [ { "text 00 } STH2r ] /cmp #01 NEQ ?&fail ( a ) [ { "text 00 } STH2r ] ( b ) [ { "te 00 } STH2r ] /cmp #00 NEQ ?&fail ( a ) [ { "textext 00 } STH2r ] ( b ) [ { "text 00 } STH2r ] /cmp #00 NEQ ?&fail ( a ) [ { 00 "ext 00 } STH2r ] ( b ) [ { "text 00 } STH2r ] /cmp #00 NEQ ?&fail ( | hex ) ;dict/0 /hex #0000 NEQ2 ?&fail ;dict/90 /hex #0090 NEQ2 ?&fail ;dict/0a /hex #000a NEQ2 ?&fail ;dict/9a /hex #009a NEQ2 ?&fail ;dict/01af /hex #01af NEQ2 ?&fail ;dict/1af0 /hex #1af0 NEQ2 ?&fail ;dict/1af /hex #01af NEQ2 ?&fail ( | dec ) ;dict/0 /dec #0000 NEQ2 ?&fail ;dict/1 /dec #0001 NEQ2 ?&fail ;dict/10 /dec #000a NEQ2 ?&fail ;dict/90 /dec #005a NEQ2 ?&fail ;dict/09 /dec #0009 NEQ2 ?&fail ;dict/12340 /dec #3034 NEQ2 ?&fail ;dict/65535 /dec #ffff NEQ2 ?&fail ( | signed dec ) ;dict/0 /dec-sign #0000 NEQ2 ?&fail ;dict/1 /dec-sign #0001 NEQ2 ?&fail ;dict/10 /dec-sign #000a NEQ2 ?&fail ;dict/90 /dec-sign #005a NEQ2 ?&fail ;dict/09 /dec-sign #0009 NEQ2 ?&fail ;dict/12340 /dec-sign #3034 NEQ2 ?&fail ;dict/32767 /dec-sign #7fff NEQ2 ?&fail ;dict/sub0 /dec-sign #0000 NEQ2 ?&fail ;dict/sub1 /dec-sign #ffff NEQ2 ?&fail ;dict/sub10 /dec-sign #fff6 NEQ2 ?&fail ;dict/sub127 /dec-sign #ff81 NEQ2 ?&fail ;dict/sub256 /dec-sign #ff00 NEQ2 ?&fail ;dict/sub32768 /dec-sign #8000 NEQ2 ?&fail #01 JMP2r &fail #00 JMP2r &name 0a "str: 20 $1 @ztr/ ( -- ) ;&name str/ ( | len ) [ { "foo $1 } STH2r ] / [ { "foo $1 } STH2r ] ;&buf str/cmp #00 EQU ?&fail ( | push ) LIT "b / [ { "foob $1 } STH2r ] ;&buf str/cmp #00 EQU ?&fail /pop POP /pop POP ( | pop ) [ { "fo $1 } STH2r ] ;&buf str/cmp #00 EQU ?&fail ( | length ) LIT "a / /length #03 NEQ ?&fail #01 JMP2r &fail #00 JMP2r &name 0a "ztr: 20 $1 @obj/ ( -- ) ;&name str/ ( | len ) [ { "foo $1 } STH2r ] / [ { "foo $1 } STH2r ] ;&buf str/cmp #00 EQU ?&fail ( | push ) LIT "b / [ { "foob $1 } STH2r ] ;&buf str/cmp #00 EQU ?&fail /pop POP /pop POP ( | pop ) [ { "fo $1 } STH2r ] ;&buf str/cmp #00 EQU ?&fail ( | length ) LIT "a / /length #0003 NEQ2 ?&fail #01 JMP2r &fail #00 JMP2r &name 0a "obj: 20 $1 ( @|Str ) @str/cap ( str* -- end* ) LDAk ?{ JMP2r } INC2 !/cap @str/len ( str* -- len* ) STH2k /cap STH2r SUB2 JMP2r @str/hex ( str* -- value* ) [ LIT2r 0000 ] &>wh [ LITr 40 ] SFT2r LDAk chr/hex [ LITr 00 ] STH ADD2r INC2 LDAk ?&>wh POP2 STH2r JMP2r @str/dec-sign ( str* -- val* ) LDAk LIT "- NEQ ?{ INC2 /dec #0000 SWP2 SUB2 JMP2r } ( >> ) @str/dec ( str* -- val* ) [ LIT2r 0000 ] &>wd ( val ) LDAk [ LIT "0 ] SUB #09 GTH ?{ ( acc ) [ LIT2r 000a ] MUL2r ( mix ) LDAk [ LIT "0 ] SUB [ LITr 00 ] STH ADD2r INC2 LDAk ?&>wd } POP2 STH2r JMP2r @str/cmp ( a* b* -- f ) STH2 &>wc LDAk ?{ &d LDA LDAr STHr EQU JMP2r } LDAk LDAkr STHr NEQ ?&d INC2 INC2r !&>wc @str/ ( str* -- ) LDAk DUP ?{ POP POP2 JMP2r } #18 DEO INC2 !/ ( @|Chr ) @chr/lc ( c -- lowercase ) DUP LIT "A SUB #19 GTH ?{ #20 ADD } JMP2r @chr/uc ( c -- lowercase ) DUP LIT "a SUB #19 GTH ?{ #20 SUB } JMP2r @chr/hex ( c -- val ) ( dec ) [ LIT "0 ] SUB DUP #09 GTH [ JMP JMP2r ] ( hex ) #27 SUB DUP #0a SUB #05 GTH [ JMP JMP2r ] ( nil ) POP #ff JMP2r ( @|Ztr ) @ztr/ ( str* -- ) &>w LDAk DUP ?{ POP POP2 JMP2r } / INC2 !&>w @ztr/ ( c -- ) [ LIT2 00 &ptr -&buf ] ( | catch overflow ) DUP .&cap NEQ ?{ POP POP2 JMP2r } INCk ,&ptr STR STZ2 JMP2r @ztr/length ( -- length ) ,&ptr LDR .&buf SUB JMP2r @ztr/pop ( -- c ) [ LIT2 ff _&ptr ] LDR ( | TODO: Catch underflow ) ADD STHk ,&ptr STR #00 STHkr STZ STHr LDZ JMP2r @ztr/ ( -- ) .&buf &>wp LDZk DUP ?{ POP2 JMP2r } #18 DEO INC !&>wp ( @|Obj ) @obj/ ( str* -- ) &>w LDAk DUP ?{ POP POP2 JMP2r } / INC2 !&>w @obj/ ( c -- ) #00 [ LIT2 &ptr =&buf ] ( | catch overflow ) DUP2 ;&cap NEQ2 ?{ POP2 POP2 JMP2r } INC2k ,&ptr STR2 STA2 JMP2r @obj/pop ( -- c ) ,&ptr LDR2 #0001 SUB2 ( | TODO: Catch underflow ) STH2k ,&ptr STR2 #00 STH2kr STA STH2r LDA JMP2r @obj/length ( -- length* ) ,&ptr LDR2 ;&buf SUB2 JMP2r @obj/ ( -- ) ;&buf &>wp LDAk DUP ?{ POP POP2 JMP2r } #18 DEO INC2 !&>wp ( @|assets ) @dict/0 "0 $1 &90 "90 $1 &0a "0a $1 &9a "9a $1 &01af "01af $1 &1af0 "1af0 $1 &1af "1af $1 &10 "10 $1 &1 "1 $1 &09 "09 $1 &12340 "12340 $1 &32767 "32767 $1 &65535 "65535 $1 &sub0 "-0 $1 &sub1 "-1 $1 &sub10 "-10 $1 &sub127 "-127 $1 &sub256 "-256 $1 &sub32768 "-32768 $1 @obj/buf $30 &cap