48 lines
870 B
Tal
48 lines
870 B
Tal
|
|
%EMIT { #18 DEO }
|
|
%NL { #0a EMIT }
|
|
|0100
|
|
#63 #ff STZ ( set num to 99 )
|
|
@l
|
|
beer-count print-num ( print num )
|
|
;bottles-of-beer print
|
|
;on-the-wall print
|
|
NL
|
|
beer-count print-num
|
|
;bottles-of-beer print
|
|
NL
|
|
;take-one-down print
|
|
NL
|
|
NL
|
|
beer-count #01 SUB #ff STZ
|
|
beer-count #00 EQU ?{ l }
|
|
;end print
|
|
BRK
|
|
@beer-count #ff LDZ JMP2r
|
|
@bottles-of-beer "bottles_of_beer 00
|
|
@on-the-wall "on_the_wall 00
|
|
@take-one-down "take_one_down,_pass_it_around 00
|
|
@end "no_more_bottles_of_beer 00
|
|
|
|
@print ( str* -: )
|
|
LDAk DUP #5f NEQ
|
|
?{ POP #20 }
|
|
EMIT
|
|
INC2 LDAk ?print
|
|
#20 EMIT
|
|
POP2 JMP2r
|
|
|
|
@print-num ( two digit int -: )
|
|
DUP
|
|
#0a DIV ( 25 02 )
|
|
SWP DUP ( 02 25 25 )
|
|
#0a DIV ( 02 25 02 )
|
|
#0a MUL ( 02 25 20 )
|
|
SUB ( 02 05 )
|
|
#30 ADD SWP #30 ADD
|
|
DUP LIT "0 EQU ?/is_zero
|
|
¬_zero EMIT EMIT !/rest
|
|
&is_zero POP EMIT
|
|
&rest
|
|
#20 EMIT ( print space )
|
|
JMP2r
|