; Use CIO to set up S: as GR.8 or GR.15 ; Relocatable code. ; Assemble with: ; cl65 -t none -o loader.xex loader.s .include "atari.inc" dataptr = FR0 tmp = FR0+2 start = $0400 ; segment header .org start-6 .word $FFFF .word start .word endmain-1 .org start .byte $c0 ; default RAMTOP .byte $0f ; GR. mode (8 or 15) .byte $04 ; COLOR0 (01 pixels in GR.15) .byte $08 ; COLOR1 (10 pixels in GR.15, 1 pixels in GR.8) .byte $0c ; COLOR2 (11 pixels in GR.15, 0 pixels in GR.8) .byte $00 ; COLOR3 (unused) .byte $00 ; COLOR4 (00 pixels in GR.15, border in GR.8) .byte $22 ; SDMCTL ($21 for narrow, $22 for normal) main: ; find our datablock's start address. this song and dance routine ; allows us to be fully relocatable, and have all the data in a ; single block (easily modified by the shell script that uses this). sei ; disable interrupts so they don't clobber the stack lda #$00 sta NMIEN lda #$60 ; RTS opcode sta dataptr jsr dataptr ret: ; here is where the RTS returns to ; address is now in the stack area, fix it up and save it tsx dex lda $100,x ; lo byte sec sbc #ret-start-1 sta dataptr lda $101,x ; hi byte sbc #0 sta dataptr+1 ; $d4/$d5 is now a pointer to 'start' cli ; re-enable interrupts lda #$40 sta NMIEN ; set RAMTOP ldy #0 lda (dataptr),y sta RAMTOP ; close device #6 ldx #$60 lda #CLOSE sta ICCOM,x jsr CIOV ; open device #6 (GRAPHICS command basically) ldx #$60 lda #$0c ; read/write, no +16 or +32 sta ICAX1,x ldy #$01 lda (dataptr),y sta ICAX2,x ; just the mode (8 or 16) lda #OPEN sta ICCOM,x lda #'S' sta tmp lda #tmp sta ICBAH,x jsr CIOV ; set up color regs ldy #$02 cloop: lda (dataptr),y sta COLOR0-2,y iny cpy #$07 bne cloop ; set up display width lda (dataptr),y sta SDMCTL rts ;;; put some stuff in screen RAM so we can see it ;; lda #$ff ;; sta $a150 ;; lda #$aa ;; sta $a151 ;; lda #$55 ;; sta $a152 ;;hang: jmp hang endmain: ; segment header .word INITAD .word INITAD+1 .word main