Language 6502 Assembler
(Apple 1 Version)
Date: | 06/03/10 |
Author: | barrym |
URL: | n/a |
Comments: | 0 |
Info: | n/a |
Score: | ![]() |
;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
Download Source | Write Comment
Download Source | Write Comment
Add Comment
Please provide a value for the fields Name,
Comment and Security Code.
This is a gravatar-friendly website.
E-mail addresses will never be shown.
Enter your e-mail address to use your gravatar.
Please don't post large portions of code here! Use the form to submit new examples or updates instead!
Comments