.export _main .include "atari.inc" sptr = FR0 scount = FR0+2 .ifndef start_addr start_addr = $4000 .endif .ifndef RAW .org start_addr - 6 .word $ffff .word start_addr .word end_addr - 1 .endif .org start_addr print_addr: jsr pa pa: ; pull return address, print it (don't put it back on the stack) pla sec sbc #2 ; pa-1 was pushed, we want to print print_addr sta sptr ; lo byte pla sbc #0 sta sptr+1 jsr printhex lda sptr jmp printhex rts _main: ldx #1 stx CRSINH lda #str1 jsr printstr lda #' ' jsr printa lda #str2 jsr printstr lda #'.' jsr printa lda #EOL jsr printa lda #addr_str jsr printstr jsr print_addr lda #EOL jsr printa lda #end_str jsr printstr lda #>(end_addr-1) jsr printhex lda #<(end_addr-1) jsr printhex lda #memlo_str jsr printstr lda MEMLO+1 jsr printhex lda MEMLO jsr printhex lda #relax_str jsr printstr jsr junksub cycle: lda RTCLOK+2 and #$f0 ora #$06 sta COLOR2 jmp cycle printstr: sta sptr stx sptr+1 lda #0 sta scount strloop: ldy scount lda (sptr),y bne printchr rts printchr: jsr printa inc scount bne strloop rts ; Subroutine: Print A register in hex. printhex: pha ; stash argument lsr ; shift right 4 times, lsr ; to get the first hex digit lsr ; (aka nybble) into the bottom lsr ; 4 bit positions. jsr printxdig ; print the top nybble. pla ; restore original value... and #$0f ; mask off high nybble ; fall through to print the 2nd digit. ; Subroutine: Print a nybble (A=0 to $0f) in hex. printxdig: ora #$30 ; 0-9 now ASCII... cmp #$3a ; do we have A-F? bcc xok ; if not, don't adjust it adc #$26 ; A-F now ASCII: $3a + $26 + 1 (carry always set) = $61 (a) xok: ; fall through to print the digit. ; Subroutine: Print ATASCII character in A. ; Assumes IOCB #0 is opened on the E: device, which is how the ; Atari boots up. Uses "call-by-RTS" (weird looking but standard). printa: tax lda ICPTH ; the print-one-byte vector for IOCB 0. pha lda ICPTL ; low byte of vector pha txa rts junksub: .repeat 512 nop .endrep lda #'O' jsr printa lda #'K' jmp printa str1: .byte "Hello",0 str2: .byte "World",0 addr_str: .byte EOL, "I am currently located at $",0 end_str: .byte "My code ends at $",0 memlo_str: .byte EOL, "MEMLO is currently set to $",0 relax_str: .byte EOL, EOL, "Watchen das blinkenlights...",EOL,0 .ifndef RAW end_addr: .word INITAD .word INITAD+1 .word _main .endif