TITLE BEER - 99 Bottles of beer on the wall
;
;       By Mark H. Zellers
;
;       This program emits the song 99-bottles of beer on the wall
;       It is a demonstration of PDP-10  assembly language
;
;       This program can be run on the SIMH emulator using the TOPS-10
;       Operating system.
;
;       For more information, see http://www.aracnet.com/~healyzh/pdp10emu.html
;       Or consult Wikipedia for more information about the PDP-10
;

       SEARCH  UUOSYM

       ; Define some registers
       ; note that registers 0 and 1 are used for scratch
       N==2                    ; Register containing number of bottles
       D==3                    ; Digits to output
       E==4                    ; Ending (either take one down or go to the stor
e)
       B==5                    ; "Bottles" or "Bottle"
       LC==6                   ; Either D or "no "
START:: MOVEI   N,^D99  ; Initialize number of bottles
       MOVEI   E, [ASCIZ /You take one down, pass it around, /]
LOOP:

; Convert the current count to a string
;
       MOVE    0,N
       IDIVI   0,^D10
       JUMPE   0,ONEDIG
       ROT     0,-7            ; Move high digit to first character
       ROT     1,^D-14         ; Move low digit to second character
       IOR     0,1             ; Merge the two characters together
       ADD     0,[BYTE (7)60,60,40,0,0]  ; Convert to ASCII and append a blank
       JRST    OUTPUT
ONEDIG: MOVE    0,1
       ROT     0, -7
       ADD     0,[BYTE (7)60,40,0,0,0]
OUTPUT: MOVE    D,0     ; Move result into digit buffer

; Use the appropriate ending for bottles
       MOVEI   B,[ASCIZ/bottles/]
       CAIN    N,1
       MOVEI   B,[ASCIZ/bottle/]

;
; Now check for whether we want the digits or the word no
       MOVEI   LC,D            ; Assume we want the digits
;
       JUMPN   N,PASSIT
       MOVE    D,[ASCIZ/No /]
       MOVEI   LC,[ASCIZ /no /]
       MOVEI   E,[ASCIZ /You go to the store and buy some more,/]

; Now output the strings
;
PASSIT:
       CAIN    N,^D99  ; Skip repeat on first verse
       JRST    SKIPRP
       OUTSTR  0(LC)
       OUTSTR  0(B)            ; "Bottles" or "bottle"
       OUTSTR  [ASCIZ / of beer on the wall.

/]
SKIPRP: OUTSTR  D               ; Number of bottles
       OUTSTR  0(B)            ; "Bottles" or "Bottle"
       OUTSTR  [ASCIZ/ of beer on the wall, /]
       OUTSTR  0(LC)           ; Number of bottles or "no"
       OUTSTR  0(B)
       OUTSTR  [ASCIZ/ of beer.
/]
       OUTSTR  0(E)    ; Take one down or go to store


       SOJGE   N,LOOP          ; Decrement N and loop if N>=0
       OUTSTR  [ASCIZ/ 99 bottles of beer on the wall./]
       EXIT
       END START