mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2024-09-27 05:54:24 +00:00
364 lines
11 KiB
ArmAsm
364 lines
11 KiB
ArmAsm
; Support routines for the primary background
|
|
_InitBG0
|
|
lda #DIRTY_BIT_BG0_X+DIRTY_BIT_BG0_Y
|
|
tsb DirtyBits
|
|
rts
|
|
|
|
; Copy a raw data file into the code field
|
|
;
|
|
; A=low word of picture address
|
|
; X=high word of pixture address
|
|
_CopyBinToField
|
|
:srcptr equ tmp0
|
|
:line_cnt equ tmp2
|
|
:dstptr equ tmp3
|
|
:col_cnt equ tmp5
|
|
:mask equ tmp6
|
|
:data equ tmp7
|
|
:mask_color equ tmp8
|
|
|
|
sta :srcptr
|
|
stx :srcptr+2
|
|
|
|
; Check that this is a GTERAW image and save the transparent color
|
|
|
|
ldy #4
|
|
:chkloop
|
|
lda [:srcptr],y
|
|
cmp :headerStr,y
|
|
beq *+3
|
|
rts
|
|
dey
|
|
dey
|
|
bpl :chkloop
|
|
|
|
; We have a valid header, now get the transparency word and load it in
|
|
ldy #6
|
|
lda [:srcptr],y
|
|
sta :mask_color
|
|
|
|
; Advance over the header
|
|
lda :srcptr
|
|
clc
|
|
adc #8
|
|
sta :srcptr
|
|
|
|
stz :line_cnt
|
|
:rloop
|
|
lda :line_cnt ; get the pointer to the code field line
|
|
asl
|
|
tax
|
|
|
|
lda BTableLow,x
|
|
sta :dstptr
|
|
lda BTableHigh,x
|
|
sta :dstptr+2
|
|
|
|
; ldx #162 ; move backwards in the code field
|
|
ldy #0 ; move forward in the image data
|
|
|
|
lda #82 ; keep a running column count
|
|
sta :col_cnt
|
|
|
|
:cloop
|
|
phy
|
|
lda [:srcptr],y ; load the picture data
|
|
cmp :mask_color
|
|
beq :transparent ; a value of $0000 is transparent
|
|
|
|
jsr :toMask ; Infer a mask value for this. If it's $0000, then
|
|
cmp #$0000
|
|
bne :mixed ; the data is solid, otherwise mixed
|
|
|
|
; This is a solid word
|
|
:solid
|
|
lda [:srcptr],y
|
|
pha ; Save the data
|
|
|
|
lda Col2CodeOffset,y ; Get the offset to the code from the line start
|
|
tay
|
|
|
|
lda #$00F4 ; PEA instruction
|
|
sta [:dstptr],y
|
|
iny
|
|
pla
|
|
sta [:dstptr],y ; PEA operand
|
|
bra :next
|
|
:transparent
|
|
lda :mask_color ; Make sure we actually have to mask
|
|
cmp #$A5A5
|
|
beq :solid
|
|
|
|
lda Col2CodeOffset,y ; Get the offset to the code from the line start
|
|
tay
|
|
lda #$B1 ; LDA (dp),y
|
|
sta [:dstptr],y
|
|
iny
|
|
lda 1,s ; load the saved Y-index
|
|
ora #$4800 ; put a PHA after the offset
|
|
sta [:dstptr],y
|
|
bra :next
|
|
|
|
:mixed
|
|
sta :mask ; Save the mask
|
|
lda [:srcptr],y ; Refetch the screen data
|
|
sta :data
|
|
|
|
tyx
|
|
lda Col2CodeOffset,y ; Get the offset into the code field
|
|
tay
|
|
lda #$4C ; JMP exception
|
|
sta [:dstptr],y
|
|
iny
|
|
|
|
lda JTableOffset,x ; Get the address offset and add to the base address
|
|
clc
|
|
adc :dstptr
|
|
sta [:dstptr],y
|
|
|
|
ldy JTableOffset,x ; This points to the code fragment
|
|
lda 1,s ; load the offset
|
|
xba
|
|
ora #$00B1
|
|
sta [:dstptr],y ; write the LDA (--),y instruction
|
|
iny
|
|
iny
|
|
iny ; advance to the AND #imm operand
|
|
lda :mask
|
|
sta [:dstptr],y
|
|
iny
|
|
iny
|
|
iny ; advance to the ORA #imm operand
|
|
lda :mask
|
|
eor #$FFFF ; invert the mask to clear up the data
|
|
and :data
|
|
sta [:dstptr],y
|
|
|
|
:next
|
|
ply
|
|
|
|
iny
|
|
iny
|
|
|
|
dec :col_cnt
|
|
bne :cloop
|
|
|
|
lda :srcptr
|
|
clc
|
|
adc #164
|
|
sta :srcptr
|
|
|
|
inc :line_cnt
|
|
lda :line_cnt
|
|
cmp #200
|
|
bcs :exit
|
|
brl :rloop
|
|
|
|
:exit
|
|
rts
|
|
|
|
:toMask pha ; save original
|
|
|
|
lda 1,s
|
|
eor :mask_color ; only identical bits produce zero
|
|
and #$F000
|
|
beq *+7
|
|
pea #$0000
|
|
bra *+5
|
|
pea #$F000
|
|
|
|
|
|
lda 3,s
|
|
eor :mask_color
|
|
and #$0F00
|
|
beq *+7
|
|
pea #$0000
|
|
bra *+5
|
|
pea #$0F00
|
|
|
|
lda 5,s
|
|
eor :mask_color
|
|
and #$00F0
|
|
beq *+7
|
|
pea #$0000
|
|
bra *+5
|
|
pea #$00F0
|
|
|
|
lda 7,s
|
|
eor :mask_color
|
|
and #$000F
|
|
beq *+7
|
|
lda #$0000
|
|
bra *+5
|
|
lda #$000F
|
|
|
|
ora 1,s
|
|
sta 1,s
|
|
pla
|
|
ora 1,s
|
|
sta 1,s
|
|
pla
|
|
ora 1,s
|
|
sta 1,s
|
|
pla
|
|
|
|
sta 1,s ; pop the saved word
|
|
pla
|
|
rts
|
|
|
|
:headerStr asc 'GTERAW'
|
|
|
|
; Copy a loaded SHR picture into the code field
|
|
;
|
|
; A=low word of picture address
|
|
; X=high workd of pixture address
|
|
;
|
|
; Picture must be within one bank
|
|
_CopyPicToField
|
|
:srcptr equ tmp0
|
|
:line_cnt equ tmp2
|
|
:dstptr equ tmp3
|
|
:col_cnt equ tmp5
|
|
:mask equ tmp6
|
|
:data equ tmp7
|
|
|
|
sta :srcptr
|
|
stx :srcptr+2
|
|
|
|
stz :line_cnt
|
|
:rloop
|
|
lda :line_cnt ; get the pointer to the code field line
|
|
asl
|
|
tax
|
|
|
|
lda BTableLow,x
|
|
sta :dstptr
|
|
lda BTableHigh,x
|
|
sta :dstptr+2
|
|
|
|
; ldx #162 ; move backwards in the code field
|
|
ldy #0 ; move forward in the image data
|
|
|
|
lda #80 ; keep a running column count
|
|
; lda #82 ; keep a running column count
|
|
sta :col_cnt
|
|
|
|
:cloop
|
|
phy
|
|
lda [:srcptr],y ; load the picture data
|
|
beq :transparent ; a value of $0000 is transparent
|
|
|
|
jsr :toMask ; Infer a mask value for this. If it's $0000, then
|
|
bne :mixed ; the data is solid, otherwise mixed
|
|
|
|
; This is a solid word
|
|
lda [:srcptr],y
|
|
pha ; Save the data
|
|
|
|
lda Col2CodeOffset,y ; Get the offset to the code from the line start
|
|
tay
|
|
|
|
lda #$00F4 ; PEA instruction
|
|
sta [:dstptr],y
|
|
iny
|
|
pla
|
|
sta [:dstptr],y ; PEA operand
|
|
bra :next
|
|
:transparent
|
|
lda Col2CodeOffset,y ; Get the offset to the code from the line start
|
|
tay
|
|
|
|
lda #$B1 ; LDA (dp),y
|
|
sta [:dstptr],y
|
|
iny
|
|
lda 1,s ; load the saved Y-index
|
|
ora #$4800 ; put a PHA after the offset
|
|
sta [:dstptr],y
|
|
bra :next
|
|
|
|
:mixed
|
|
sta :mask ; Save the mask
|
|
lda [:srcptr],y ; Refetch the screen data
|
|
sta :data
|
|
|
|
tyx
|
|
lda Col2CodeOffset,y ; Get the offset into the code field
|
|
tay
|
|
|
|
lda #$4C ; JMP exception
|
|
sta [:dstptr],y
|
|
iny
|
|
|
|
lda JTableOffset,x ; Get the address offset and add to the base address
|
|
clc
|
|
adc :dstptr
|
|
sta [:dstptr],y
|
|
|
|
ldy JTableOffset,x ; This points to the code fragment
|
|
lda 1,s ; load the offset
|
|
xba
|
|
ora #$00B1
|
|
sta [:dstptr],y ; write the LDA (--),y instruction
|
|
iny
|
|
iny
|
|
iny ; advance to the AND #imm operand
|
|
lda :mask
|
|
sta [:dstptr],y
|
|
iny
|
|
iny
|
|
iny ; advance to the ORA #imm operand
|
|
lda :data
|
|
sta [:dstptr],y
|
|
|
|
:next
|
|
ply
|
|
|
|
; dex
|
|
; dex
|
|
iny
|
|
iny
|
|
|
|
dec :col_cnt
|
|
bne :cloop
|
|
|
|
lda :srcptr
|
|
clc
|
|
; adc #164
|
|
adc #160
|
|
sta :srcptr
|
|
|
|
inc :line_cnt
|
|
lda :line_cnt
|
|
; cmp #208
|
|
cmp #200
|
|
bcs :exit
|
|
brl :rloop
|
|
|
|
:exit
|
|
rts
|
|
|
|
:toMask bit #$F000
|
|
beq *+7
|
|
and #$0FFF
|
|
bra *+5
|
|
ora #$F000
|
|
|
|
bit #$0F00
|
|
beq *+7
|
|
and #$F0FF
|
|
bra *+5
|
|
ora #$0F00
|
|
|
|
bit #$00F0
|
|
beq *+7
|
|
and #$FF0F
|
|
bra *+5
|
|
ora #$00F0
|
|
|
|
bit #$000F
|
|
beq *+7
|
|
and #$FFF0
|
|
bra *+5
|
|
ora #$000F
|
|
rts
|