aboutsummaryrefslogtreecommitdiff
path: root/loader.s
diff options
context:
space:
mode:
authorB. Watson <yalhcru@gmail.com>2019-03-30 03:41:23 -0400
committerB. Watson <yalhcru@gmail.com>2019-03-30 03:41:23 -0400
commit41640fe33b90ec675cb86bf8179a44618ee1cfa5 (patch)
treeb569081fdffdeac4bf47ee79d6fc34a904840af5 /loader.s
downloadimg2atari-master.tar.gz
initial commitHEADmaster
Diffstat (limited to 'loader.s')
-rw-r--r--loader.s114
1 files changed, 114 insertions, 0 deletions
diff --git a/loader.s b/loader.s
new file mode 100644
index 0000000..3b78fbd
--- /dev/null
+++ b/loader.s
@@ -0,0 +1,114 @@
+; 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 ICBAL,x
+ 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
+