Vicious/firmware/sidfile.s

554 lines
9.8 KiB
ArmAsm

;
; File generated by cc65 v 2.13.3
;
.fopt compiler,"cc65 v 2.13.3"
.setcpu "6502"
.smart on
.autoimport on
.case on
.debuginfo off
.importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
.macpack longbranch
.import _initSIDTune
.import _prints
.import _printw
.import _fixSIDTune
.import _memcmp
.export _playSidFile
.export _readSidHeader
.export _moveSIDCodeToPlace
.export __strcpy
.export _MAGIG_ID_PSID
.export __memcpy
.export __readBigEndianW
.segment "RODATA"
_MAGIG_ID_PSID:
.byte $50
.byte $53
.byte $49
.byte $44
L0001:
.byte $0D,$0D,$56,$49,$43,$49,$4F,$55,$53,$20,$53,$49,$44,$20,$50,$4C
.byte $41,$59,$45,$52,$0D,$00,$0D,$54,$49,$54,$4C,$45,$3A,$20,$20,$20
.byte $00,$0D,$41,$55,$54,$48,$4F,$52,$3A,$20,$20,$00,$0D,$52,$45,$4C
.byte $45,$41,$53,$45,$3A,$20,$00,$0D,$53,$4F,$4E,$47,$53,$3A,$20,$24
.byte $00,$20,$44,$45,$46,$41,$55,$4C,$54,$3A,$20,$24,$00,$0D,$55,$53
.byte $49,$4E,$47,$20,$46,$49,$4C,$45,$20,$53,$49,$5A,$45,$3A,$20,$24
.byte $00,$0D,$49,$4E,$49,$54,$20,$41,$44,$44,$52,$45,$53,$53,$3A,$20
.byte $20,$20,$20,$24,$00,$0D,$50,$4C,$41,$59,$20,$41,$44,$44,$52,$45
.byte $53,$53,$3A,$20,$20,$20,$20,$24,$00,$0D,$4C,$4F,$41,$44,$20,$41
.byte $44,$44,$52,$45,$53,$53,$3A,$20,$20,$20,$20,$24,$00,$0D,$00,$53
.byte $54,$41,$52,$54,$20,$50,$4C,$41,$59,$49,$4E,$47,$2E,$2E,$2E,$0D
.byte $00,$0D,$53,$49,$44,$20,$54,$55,$4E,$45,$20,$4E,$4F,$54,$20,$46
.byte $4F,$55,$4E,$44,$20,$49,$4E,$20,$41,$44,$44,$52,$45,$53,$53,$20
.byte $24,$00,$0D,$00
; ---------------------------------------------------------------
; void __near__ playSidFile (unsigned int, unsigned int)
; ---------------------------------------------------------------
.segment "CODE"
.proc _playSidFile: near
.segment "CODE"
ldy #$7A
jsr subysp
lda #<(L0001)
ldx #>(L0001)
jsr pushax
jsr _prints
ldy #$7F
jsr pushwysp
lda #$04
jsr leaa0sp
jsr pushax
jsr _readSidHeader
tax
jeq L007D
lda #<(L0001+22)
ldx #>(L0001+22)
jsr pushax
jsr _prints
lda #$1A
jsr leaa0sp
jsr pushax
jsr _prints
lda #<(L0001+33)
ldx #>(L0001+33)
jsr pushax
jsr _prints
lda #$3A
jsr leaa0sp
jsr pushax
jsr _prints
lda #<(L0001+44)
ldx #>(L0001+44)
jsr pushax
jsr _prints
lda #$5A
jsr leaa0sp
jsr pushax
jsr _prints
lda #<(L0001+55)
ldx #>(L0001+55)
jsr pushax
jsr _prints
ldy #$15
jsr pushwysp
jsr _printw
lda #<(L0001+65)
ldx #>(L0001+65)
jsr pushax
jsr _prints
ldy #$17
jsr pushwysp
jsr _printw
lda #<(L0001+77)
ldx #>(L0001+77)
jsr pushax
jsr _prints
ldy #$7D
jsr pushwysp
jsr _printw
lda #<(L0001+97)
ldx #>(L0001+97)
jsr pushax
jsr _prints
ldy #$11
jsr pushwysp
jsr _printw
lda #<(L0001+117)
ldx #>(L0001+117)
jsr pushax
jsr _prints
ldy #$13
jsr pushwysp
jsr _printw
lda #$02
jsr leaa0sp
jsr pushax
ldy #$7F
jsr pushwysp
jsr _moveSIDCodeToPlace
jsr stax0sp
lda #<(L0001+137)
ldx #>(L0001+137)
jsr pushax
jsr _prints
jsr pushw0sp
jsr _printw
lda #<(L0001+157)
ldx #>(L0001+157)
jsr pushax
jsr _prints
jsr pushw0sp
ldy #$7F
jsr pushwysp
jsr _fixSIDTune
ldy #$11
jsr pushwysp
ldy #$13
jsr ldaxysp
jsr _initSIDTune
ldx #$4E
lda #$20
sta $BF84
stx $BF84+1
lda #$81
sta $BF8D
lda #<(L0001+159)
ldx #>(L0001+159)
jsr pushax
jsr _prints
lda #$11
sta $BF8E
jmp L00C2
L007D: lda #<(L0001+177)
ldx #>(L0001+177)
jsr pushax
jsr _prints
ldy #$7F
jsr pushwysp
jsr _printw
lda #<(L0001+210)
ldx #>(L0001+210)
jsr pushax
jsr _prints
L00C2: ldy #$7E
jmp addysp
.endproc
; ---------------------------------------------------------------
; unsigned char __near__ readSidHeader (unsigned int, __near__ struct SidHeader1*)
; ---------------------------------------------------------------
.segment "CODE"
.proc _readSidHeader: near
.segment "CODE"
jsr ldax0sp
sta ptr1
stx ptr1+1
ldy #$03
jsr ldaxysp
ldy #$00
sta (ptr1),y
iny
txa
sta (ptr1),y
jsr ldax0sp
jsr incax2
jsr pushax
ldy #$07
jsr pushwysp
lda #$04
jsr pusha0
jsr __memcpy
jsr ldax0sp
jsr incax2
jsr pushax
lda #<(_MAGIG_ID_PSID)
ldx #>(_MAGIG_ID_PSID)
jsr pushax
lda #$04
jsr pusha
jsr _memcmp
cmp #$00
bne L0039
tax
jmp incsp4
L0039: jsr pushw0sp
ldy #$05
jsr ldaxysp
jsr incax4
jsr pushax
jsr __readBigEndianW
ldy #$06
jsr staxspidx
jsr pushw0sp
ldy #$05
jsr ldaxysp
jsr incax6
jsr pushax
jsr __readBigEndianW
ldy #$08
jsr staxspidx
jsr pushw0sp
ldy #$05
jsr ldaxysp
jsr incax8
jsr pushax
jsr __readBigEndianW
ldy #$0A
jsr staxspidx
jsr pushw0sp
ldy #$05
jsr ldaxysp
ldy #$0A
jsr incaxy
jsr pushax
jsr __readBigEndianW
ldy #$0C
jsr staxspidx
jsr pushw0sp
ldy #$05
jsr ldaxysp
ldy #$0C
jsr incaxy
jsr pushax
jsr __readBigEndianW
ldy #$0E
jsr staxspidx
jsr pushw0sp
ldy #$05
jsr ldaxysp
ldy #$0E
jsr incaxy
jsr pushax
jsr __readBigEndianW
ldy #$10
jsr staxspidx
jsr pushw0sp
ldy #$05
jsr ldaxysp
ldy #$10
jsr incaxy
jsr pushax
jsr __readBigEndianW
ldy #$12
jsr staxspidx
jsr ldax0sp
ldy #$14
jsr incaxy
jsr pushax
ldy #$05
jsr ldaxysp
ldy #$12
jsr incaxy
jsr pushax
lda #$04
jsr pusha0
jsr __memcpy
jsr ldax0sp
ldy #$18
jsr incaxy
jsr pushax
ldy #$05
jsr ldaxysp
ldy #$16
jsr incaxy
jsr pushax
lda #$20
jsr pusha0
jsr __strcpy
jsr ldax0sp
ldy #$38
jsr incaxy
jsr pushax
ldy #$05
jsr ldaxysp
ldy #$36
jsr incaxy
jsr pushax
lda #$20
jsr pusha0
jsr __strcpy
jsr ldax0sp
ldy #$58
jsr incaxy
jsr pushax
ldy #$05
jsr ldaxysp
ldy #$56
jsr incaxy
jsr pushax
lda #$20
jsr pusha0
jsr __strcpy
ldx #$00
lda #$01
jmp incsp4
.endproc
; ---------------------------------------------------------------
; unsigned int __near__ moveSIDCodeToPlace (__near__ struct SidHeader1*, unsigned int)
; ---------------------------------------------------------------
.segment "CODE"
.proc _moveSIDCodeToPlace: near
.segment "CODE"
jsr decsp2
ldy #$05
jsr ldaxysp
jsr ldaxi
sta sreg
stx sreg+1
ldy #$05
jsr ldaxysp
ldy #$09
jsr ldaxidx
clc
adc sreg
pha
txa
adc sreg+1
tax
pla
jsr pushax
ldy #$07
jsr ldaxysp
ldy #$0B
jsr ldaxidx
cpx #$00
bne L00C9
cmp #$00
beq L0069
L00C9: ldy #$07
jsr ldaxysp
ldy #$0B
jsr ldaxidx
ldy #$02
jsr staxysp
jmp L006E
L0069: jsr ldax0sp
jsr ldaxi
ldy #$02
jsr staxysp
ldx #$00
lda #$02
jsr addeq0sp
L006E: ldy #$05
jsr pushwysp
ldy #$05
jsr pushwysp
ldy #$0B
jsr pushwysp
jsr __memcpy
ldy #$03
jsr ldaxysp
jmp incsp8
.endproc
; ---------------------------------------------------------------
; void __near__ _strcpy (__near__ unsigned char*, unsigned int, unsigned int)
; ---------------------------------------------------------------
.segment "CODE"
.proc __strcpy: near
.segment "CODE"
jsr push0
L0019: jsr ldax0sp
ldy #$02
cmp (sp),y
txa
iny
sbc (sp),y
bcs L001A
jsr ldax0sp
clc
ldy #$04
adc (sp),y
sta ptr1
txa
iny
adc (sp),y
sta ptr1+1
ldy #$00
lda (ptr1),y
jsr pusha
ldy #$00
lda (sp),y
cmp #$61
bcc L001F
lda (sp),y
sec
sbc #$20
sta (sp),y
L001F: ldy #$02
jsr ldaxysp
clc
ldy #$07
adc (sp),y
sta ptr1
txa
iny
adc (sp),y
sta ptr1+1
ldy #$00
lda (sp),y
sta (ptr1),y
ldy #$02
jsr ldaxysp
jsr incax1
ldy #$01
jsr staxysp
jsr incsp1
jmp L0019
L001A: ldy #$09
jsr pushwysp
ldy #$05
jsr ldaxysp
jsr decax1
jsr tosaddax
sta ptr1
stx ptr1+1
lda #$00
tay
sta (ptr1),y
jmp incsp8
.endproc
; ---------------------------------------------------------------
; void __near__ _memcpy (__near__ unsigned char*, unsigned int, unsigned int)
; ---------------------------------------------------------------
.segment "CODE"
.proc __memcpy: near
.segment "CODE"
jsr push0
L000E: jsr ldax0sp
ldy #$02
cmp (sp),y
txa
iny
sbc (sp),y
jcs incsp8
jsr ldax0sp
clc
ldy #$06
adc (sp),y
sta sreg
txa
iny
adc (sp),y
sta sreg+1
jsr ldax0sp
clc
ldy #$04
adc (sp),y
sta ptr1
txa
iny
adc (sp),y
sta ptr1+1
ldy #$00
lda (ptr1),y
sta (sreg),y
jsr ldax0sp
jsr incax1
jsr stax0sp
jmp L000E
.endproc
; ---------------------------------------------------------------
; unsigned int __near__ _readBigEndianW (unsigned int)
; ---------------------------------------------------------------
.segment "CODE"
.proc __readBigEndianW: near
.segment "CODE"
jsr ldax0sp
sta ptr1
stx ptr1+1
ldy #$00
lda (ptr1),y
tax
tya
jsr pushax
jsr pushw0sp
ldy #$05
jsr ldaxysp
jsr incax1
sta ptr1
stx ptr1+1
ldx #$00
lda (ptr1,x)
jsr tosadda0
jmp incsp4
.endproc