;BEER SONG IN 6502 ASSEMBLY LANGUAGE ; BY BARRYM 2010-05-30 ;THANKS TO: ; SBPROJECTS.COM FOR LOTS OF VALUABLE ; INFO AND A VERY NICE ASSEMBLER! ;SEE THE END OF THIS LISTING FOR ; IMPORTANT INFORMATION ABOUT THE ; TARGET MACHINE! ; ;CONFIGURE. ; .CR 6502 .TF AP1BEER.O,BIN .OR $0C00 ; ;DEFINE. ; ;X REG. HOLDS NUMBER OF BOTTLES, (AND ; TENS DIGIT IN THE BINARY-TO-ASCII ; CONVERSION ROUTINE). ;Y REG. IS THE STRING INDEX POINTER. ;A REG. TAKES CARE OF EVERYTHING ELSE ; (WITH A LITTLE HELP FROM THE STACK) ;ZERO PAGE IS NOT DIRECTLY DISTURBED. ; ;PRINT COMPLETE, CORRECT SONG (ADJUSTED ; FOR UPPER-CASE, 40-COLUMN DISPLAY). ; LDX #MAXBEER ;INIT. BEER COUNT BNE PRSONG ;SING THE SONG ; ;EMIT ENTIRE SONG EXCEPT LAST SENTENCE. ; BEERME: LDY #TAKE1-TXT ;? "TAKE ... AROUND," JSR PRBOB ;? X;" BOT ... WALL." PRSONG: LDY #CR-TXT ;BLANK LINE JSR PRBOB ;? X;" BOT ... WALL"; LDY #COMCR-TXT ;? "," JSR PRBOB ;? X;" BOT ... BEER." DEX ;X=X-1 BPL BEERME ;IF X>-1 THEN BEERME ; ;EMIT LAST SENTENCE AND FALL THROUGH. ; LDX #MAXBEER ;RESET BEER COUNT LDY #GSTOR-TXT ;? "GO TO ... MORE," ; PRBOB: TYA ;SAVE PRE-STRING PTR PHA ; FOR LATER USE. JSR PUTS ;EMIT THE PRE-STRING. TXA BEQ PRNONE ;IF X>0 THEN PHA ; CONVERT X TO LDX #-1 ; ASCII AND EMIT. SEC ; ( TENS: INX SBC #10 BCS TENS PHA TXA BEQ ONEDIG ORA #"0" ; IF X>10 THEN JSR PUTCH ; ? INT(X/10); ONEDIG: PLA CLC ADC #10 ORA #"0" JSR PUTCH ; ? X MOD 10; PLA TAX LDY #BOTTL-TXT BNE PRBOTT ; ) PRNONE: LDY #NOMOR-TXT JSR PUTS ;ELSE ? "NO MORE"; PRBOTT: JSR PUTS ;? " BOTTLE"; INY DEX BEQ SINGLE DEY ;IF X<>1 THEN ? "S"; SINGLE: INX JSR PUTS ;? " OF BEER"; PLA ;RETRIEVE PRE-PTR CMP #COMCR-TXT BNE PRWALL LDY #DOTCR-TXT BPL PUTS PRWALL: PHA ;IF APPROPRIATE THEN JSR PUTS ; ? " ON THE WALL"; PLA CMP #CR-TXT ;IF APPROPRIATE THEN BEQ KPUT ; ? "." ; ;EMIT A HI-BIT-SET TERMINATED STRING ; @ Y AND LEAVE Y @ BEGINNING OF NEXT ; STRING. ; PUTS: INY LDA TXT-1,Y PUTCH: PHP ORA #ORMASK AND #ANDMSK ;FORMAT CHAR FOR ECHO JSR ECHO PLP BPL PUTS KPUT: RTS ; TXT: TAKE1: .AS /TAKE ONE DOWN AND PASS / .AS /IT AROUND,/ .AS #13 .AT / / GSTOR: .AS /GO TO THE STORE AND BUY/ .AS / SOME MORE/ COMCR: .AS /,/ .AS #13 .AT / / NOMOR: .AT /NO MORE/ BOTTL: .AT / BOTTLE/ .AT /S OF BEER/ .AT / ON THE WALL/ DOTCR: .AS /./ CR: .AT #13 ; ;THE TARGET MACHINE FOR THIS ASSEMBLY ; IS THE APPLE 1, BUT IT IS VERY EASY ; TO MAKE IT RUN ON DIFFERENT 65XX ; MACHINES BY CHANGING THE NEXT TWO ; EQUATES. TWO MACHINE-TESTED ; EXAMPLES: ; APPLE II: $FDED, $80 ; COMMODORE 64: $FFD2, $00 ; ECHO .EQ $FFEF ;EMIT ASCII CHAR ORMASK .EQ $80 ;($00 FOR + ASCII) ; ANDMSK .EQ ORMASK^127 MAXBEER .EQ 99 ;STARTING BEER COUNT .EN