uxn-utils/cli/arvelie/arvelie.tal

150 lines
3.0 KiB
Tal

( usage: arvelie.rom )
|10 @Console &vector $2 &read $1 &pad $4 &type $1 &write $1 &error $1
|c0 @DateTime &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1
|0000
@buf
|0100
@on-reset ( -> )
.Console/type DEI ?on-params
( today ) .DateTime/doty DEI2 .DateTime/year DEI2 <emit-arv>
#0a18 DEO
#800f DEO
BRK
(
@|vectors )
@on-params ( -> )
;on-console .Console/vector DEO2
BRK
@on-console ( -> )
.Console/read DEI DUP #21 LTH ?&validate
.buf zcap STZ
BRK
&validate ( c -> )
POP .buf parse BRK
(
@|core )
@parse ( ztr -- )
DUP zlen #05 EQU ?&on-arvgre
DUP zlen #0a EQU ?&on-grearv
( | print-error )
;&err
&w ( -- )
LDAk #19 DEO
INC2 LDAk ?&w
POP2
( err ) #010f DEO
JMP2r
&on-arvgre ( ztr -- )
( m ) INCk INC LDZk [ LIT "A ] SUB #00 SWP #000e MUL2 STH2
( d ) INC bytedec STH2r ADD2 INC2
( y ) ROT bytedec #07d6 ADD2 <emit-gre>
#0a18 DEO
( end ) #800f DEO
JMP2r
&on-grearv ( ztr -- )
( y ) STHk shortdec LIT2r 0005 ADD2r DUP2
( m ) STHkr bytedec INCr INCr INCr
( d ) STHr bytedec #0001 SUB2 doty SWP2 <emit-arv>
#0a18 DEO
( end ) #800f DEO
JMP2r
&err "usage: 20 "arvelie.rom 20 "YYYY-MM-DD 0a $1
@<emit-gre> ( doty* year* -- )
DUP2 <emit-dec2>
[ LIT2 "- 18 ] DEO
,&y STR2
STH2 #0c00
&l ( -- )
DUP [ LIT2 &y $2 ] ROT diam #00 SWP DUP2 STH2kr GTH2 ?&>skip
STH2k SUB2r !&>continue
&>skip
POP2 !&end
&>continue
POP2 INC GTHk ?&l
&end ( -- )
NIP INC <emit-dec>
[ LIT2 "- 18 ] DEO
STHr POPr INC !<emit-dec>
@<emit-arv> ( doty* year* -- )
#07d6 SUB2 NIP
( year ) <emit-dec>
( month ) DUP2 #000e DIV2 NIP #11 ADD DUP #2a GTH #30 MUL SUB <emit-num>
( digit3 ) #000e DIV2k MUL2 SUB2 NIP !<emit-dec>
@<emit-dec2> ( short* -- )
#0064 DIV2k DUP <emit-dec>
MUL2 SUB2 NIP
@<emit-dec> ( byte -- )
DUP #0a DIV <emit-num>
#0a DIVk MUL SUB
@<emit-num> ( num -- )
[ LIT "0 ] ADD #18 DEO
JMP2r
(
@|utils )
@doty ( year* month* day* -- doty* )
ROT2 ,&y STR2
LIT2r 0000 SWP2 NIP #01 SUB #00 EQUk ?&skip
&l #00 OVR [ LIT2 &y $2 ] ROT diam STH2 ADD2r INC GTHk ?&l
&skip POP2 STH2r ADD2 JMP2r
@diam ( year* month -- days )
#00 OVR ;diam-lut ADD2 LDA SWP #01 NEQ ?&>no-feb
STH DUP2 is-leap-year STHr ADD &>no-feb
NIP NIP JMP2r
@is-leap-year ( year* -- bool )
( leap year if divisible by 400 ) DUP2 #0190
( mod2 ) DIV2k MUL2 SUB2 #0000 EQU2 ?&leap
( not a leap year if divisible by 100, but not by 400 ) DUP2 #0064
( mod2 ) DIV2k MUL2 SUB2 #0000 EQU2 ?&not-leap
( leap year if not divisible by 100, but by 4 ) #0003 AND2 #0000 EQU2 JMP2r
&not-leap ( -- )
POP2 #00 JMP2r
&leap ( -- )
POP2 #01 JMP2r
@shortdec ( zp -- dec* )
( a ) STHk bytedec #0064 MUL2
( b ) STHr INC INC bytedec ADD2 JMP2r
@bytedec ( zp -- dec* )
LDZ2
( a ) [ LIT "0 ] SUB SWP
( b ) [ LIT "0 ] SUB #0a MUL ADD #00 SWP JMP2r
(
@|stdlib )
@zlen ( ztr -- len )
DUP zcap SWP SUB JMP2r
@zcap ( ztr -- end )
!&a
&w ( -- )
INC &a LDZk ?&w
JMP2r
(
@|memory )
@diam-lut
[ 1f 1c 1f 1e 1f 1e 1f 1f 1e 1f 1e 1f ]