.include "c64-1.oph" .data .org $C000 .space cache 2 .text .macro print lda #<_1 ldx #>_1 jsr printstr .macend .macro greet lda #30 jsr delay `print hello1 `print _1 `print hello2 .macend ; Save the zero page locations that PRINTSTR uses. lda $10 sta cache lda $11 sta cache+1 lda #147 jsr chrout `greet target1 `greet target2 `greet target3 `greet target4 `greet target5 `greet target6 `greet target7 `greet target8 `greet target9 `greet target10 ; Restore the zero page values printstr uses. lda cache sta $10 lda cache+1 sta $11 rts hello1: .byte "HELLO, ",0 hello2: .byte "!", 13, 0 target1: .byte "PROGRAMMER", 0 target2: .byte "ROOM", 0 target3: .byte "BUILDING", 0 target4: .byte "NEIGHBORHOOD", 0 target5: .byte "CITY", 0 target6: .byte "NATION", 0 target7: .byte "WORLD", 0 target8: .byte "SOLAR SYSTEM", 0 target9: .byte "GALAXY", 0 target10: .byte "UNIVERSE", 0 ; DELAY routine. Takes values from the Accumulator and pauses ; for that many jiffies (1/60th of a second). .scope .data .space _tmp 1 .space _target 1 .text delay: sta _tmp ; save argument (rdtim destroys it) jsr rdtim clc adc _tmp ; add current time to get target sta _target * jsr rdtim cmp _target bmi - ; Buzz until target reached rts .scend ; PRINTSTR routine. Accumulator stores the low byte of the address, ; X register stores the high byte. Destroys the values of $10 and ; $11. .scope printstr: sta $10 stx $11 ldy #$00 _lp: lda ($10),y beq _done jsr chrout iny bne _lp _done: rts .scend .checkpc $A000 .data .checkpc $D000