git @ Cat's Eye Technologies SMITH / master eg / beer.smt
master

Tree @master (Download .tar.gz)

beer.smt @masterraw · history · blame

;"99 bottles of beer" in SMITH
; (Graciously submitted by Nathan Thern - thanks Nathan!)

; Make space for moving code fragments back
 REP 108 NOP
; R0 is the primary working register
; R1 contains -1 (for incrementing R0)
 MOV R1, 0
 SUB R1, 1
; R2 is a flag to suppress a leading 0 digit
; R2 will be 6 when on
 MOV R2, 0
; R3 is a flag to suppress the "s" in bottles when appropriate
 MOV R3, 0
; Put string values in registers 10 and on
; R10 contains '0' for comparing to R11 & R12
 MOV R0, 10
 MOV R[R0], "099 bottles of beer on the wall, . Take one down and pass it around, no more"
; R44 is newline
 MOV R44, 10
; move code ahead of us to behind us
 MOV R0, 116
 COR -116, +1, R0
;;;;
; Everything from this point on is copied back to code position 0
; Most of the following the code positions will be overwritten as
;  loop routines are pulled forward
;;;;
; Cont0: Print First phrase
 MOV R0, 11
 MOV R4, 43
 MOV R5, 26
; Routine 1: ends at Cont1
; this routine prints characters
; R0 contains the starting location
; R4 contains the length
; R5 contains the continuation code position
 MOV R6, R0
 SUB R6, 11
 NOT R6
 MUL R6, R2
; suppress a leading 0
; R6 will be set only if R0 is 11 and R2 is set
 BLA +1, NOP, R6
 MOV R6, R0
 SUB R6, 20
 NOT R6
 MUL R6, R3
; suppress the "s"
; R6 will be 1 only if R0 is 20 and R3 is set
 BLA +1, NOP, R6
 MOV TTY, R[R0]
; Copy continuation code forward
 MOV R6, R5
 MOV R7, PC
 SUB R6, R7
 MOV R7, 62
 COR +11, R6, R7
; Overwrite continuation code if loop is incomplete
 SUB R0, R1
 MOV R6, R0
 SUB R6, R4
 NOT R6
 NOT R6
 MUL R6, 26
 MOV R7, 1
 MOV R8, PC
 SUB R7, R8
 COR +1, R7, R6
; Cont1: Print second phrase
; Fill R0, R4 & R5 with start, length & continuation
 MOV R0, 11
 MOV R4, 29
 MOV R5, 34
 MOV R6, 26
 MOV R7, 1
 MOV R8, PC
 SUB R7, R8
 COR +1, R7, R6
; Cont2: Print the third phrase:
; Fill R0, R4 & R5 with start, length & continuation
 MOV R0, 43
 MOV R4, 79
 MOV R5, 42
 MOV R6, 26
 MOV R7, 1
 MOV R8, PC
 SUB R7, R8
 COR +1, R7, R6
; Cont3: Compare the ones digit to 0
 MOV R0, R12
 SUB R0, R10
 NOT R0
 NOT R0
 MUL R0, 11
; The lines preceding Dec1: will be overwritten with blanks
;  if ones digit is not 0
 BLA +1, NOP, R0
; Restore ones digit to 9
 MOV R0, 12
 MOV R[R0], "9"
; Decrement tens digit
 SUB R11, 1
; Compare tens digit to 0
 MOV R0, R11
 SUB R0, R10
 NOT R0
 NOT R0
; R2 will become 6 iff tens digit is 0
 BLA +1, NOP, R0
 MOV R2, 6
; Blank out until XX
 MOV R0, 37
 BLA +1, NOP, R0
; Dec1: Decrement the ones digit
 SUB R12, 1
; compare R2 to 6
 MOV R0, R2
 SUB R0, 6
 NOT R0
 NOT R0
 MUL R0, 30
; Blank up to Cont4: if R2 is not 6
 BLA +1, NOP, R0
; Compare the ones digit to 0
 MOV R0, R12
 SUB R0, R10
 NOT R0
 NOT R0
 MUL R0, 20
; Blank out the final operations unless R2=6 & R12="0"
 BLA +1, NOP, R0
; Final 1: Print "no more"
 MOV R0, 79
 MOV R4, 86
 MOV R5, 80
 MOV R6, 26
 MOV R7, 1
 MOV R8, PC
 SUB R7, R8
 COR +1, R7, R6
; Final 2: Print " Zubbles if bobb in our line"
 MOV R3, 0
 MOV R0, 13
 MOV R4, 41
 MOV R5, 89
 MOV R6, 26
 MOV R7, 1
 MOV R8, PC
 SUB R7, R8
 COR +1, R7, R6
; Final 3: Print a "." and newline and STOP
 MOV TTY, R43
 MOV TTY, R44
 STOP
; Compare the ones digit to "1" & set R3
 MOV R3, R12
 SUB R3, R10
 SUB R3, 1
 NOT R3
; Cont4: Print the 4th phrase
 MOV R0, 11
 MOV R4, 41
 MOV R5, 103
 MOV R6, 26
 MOV R7, 1
 MOV R8, PC
 SUB R7, R8
 COR +1, R7, R6
; Print a . and 2 newlines
 MOV TTY, R43
 MOV TTY, R44
 MOV TTY, R44
; Move on to the next verse
 MOV R6, 29
 MOV R7, 0
 SUB R7, 2
 MOV R8, PC
 SUB R7, R8
 COR +1, R7, R6