( 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 #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 #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 #0a18 DEO ( end ) #800f DEO JMP2r &err "usage: 20 "arvelie.rom 20 "YYYY-MM-DD 0a $1 @ ( doty* year* -- ) DUP2 [ 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 [ LIT2 "- 18 ] DEO STHr POPr INC ! @ ( doty* year* -- ) #07d6 SUB2 NIP ( year ) ( month ) DUP2 #000e DIV2 NIP #11 ADD DUP #2a GTH #30 MUL SUB ( digit3 ) #000e DIV2k MUL2 SUB2 NIP ! @ ( short* -- ) #0064 DIV2k DUP MUL2 SUB2 NIP @ ( byte -- ) DUP #0a DIV #0a DIVk MUL SUB @ ( 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 ?¬-leap ( leap year if not divisible by 100, but by 4 ) #0003 AND2 #0000 EQU2 JMP2r ¬-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 ]