Programming with Ophis
<<< Previous | Example Programs | Next >>>

# `tutor6.oph`

    .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

<<< Previous | Home | Next >>>
`tutor5.oph` | Up | `c64-2.oph`