mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-27 17:29:49 +00:00
megademo: working on loader
This commit is contained in:
parent
6edc175c3b
commit
74c01cad2e
@ -7,8 +7,10 @@ PNG_TO_RLE = ../gr-utils/png2rle
|
||||
|
||||
all: megademo.dsk
|
||||
|
||||
megademo.dsk: MEGADEMO
|
||||
megademo.dsk: MEGADEMO MEGALOAD
|
||||
$(DOS33) -y megademo.dsk BSAVE -a 0x4000 MEGADEMO
|
||||
$(DOS33) -y megademo.dsk BSAVE -a 0x800 MEGALOAD
|
||||
$(DOS33) -y megademo.dsk RAWWRITE -t 27 -s 0 MEGADEMO MEGA2
|
||||
# $(DOS33) -y megademo.dsk BSAVE -a 0x4000 D_HGRC.BIN
|
||||
# $(DOS33) -y megademo.dsk BSAVE -a 0x4000 FS_HGRC.BIN
|
||||
# $(DOS33) -y megademo.dsk BSAVE -a 0x2000 C64C.BIN
|
||||
@ -40,6 +42,14 @@ megademo.o: megademo.s \
|
||||
|
||||
####
|
||||
|
||||
MEGALOAD: megaload.o
|
||||
ld65 -o MEGALOAD megaload.o -C ../linker_scripts/apple2_800.inc
|
||||
|
||||
megaload.o: megaload.s
|
||||
ca65 -o megaload.o megaload.s -l megaload.lst
|
||||
|
||||
####
|
||||
|
||||
apple_40_96.inc: ./images/apple_40_96.png
|
||||
$(PNG_TO_40x96) asm ./images/apple_40_96.png apple > apple_40_96.inc
|
||||
|
||||
@ -115,4 +125,4 @@ C64C.BIN: c64.bmp
|
||||
$(B2D) c64.bmp HGR
|
||||
|
||||
clean:
|
||||
rm -f *~ *.o *.lst MEGADEMO c64.img
|
||||
rm -f *~ *.o *.lst MEGADEMO MEGALOAD c64.img
|
||||
|
215
megademo/megaload.s
Normal file
215
megademo/megaload.s
Normal file
@ -0,0 +1,215 @@
|
||||
;fast bootable seek/read, slot 6 version
|
||||
;copyright (c) Peter Ferrie 2011-2012
|
||||
|
||||
; Translated to ca64 by Vince Weaver
|
||||
|
||||
chksum = 0 ;otherwise safer but 12 bytes larger
|
||||
secldr2 = $0e ;14th sector is fastest when loaded from bootsector but can be any of them
|
||||
seekback = 0 ;set to 1 to enable seek backwards
|
||||
|
||||
adrlo = $26 ;constant from boot prom
|
||||
adrhi = $27 ;constant from boot prom
|
||||
slot = $2b ;constant from boot prom
|
||||
tmpsec = $3c ;constant from boot prom
|
||||
tmpadr = $41
|
||||
partial2 = $f9 ;copy of partial1
|
||||
partial1 = $fa ;sectors to read from one track
|
||||
total = $fb ;total sectors to read
|
||||
step = $fc ;state for stepper motor
|
||||
tmptrk = $fd ;temporary copy of current track
|
||||
curtrk = $fe ;current track (must initialise before calling seek)
|
||||
phase = $ff ;current phase for seek
|
||||
addrtbl = $50 ;requires 16 bytes
|
||||
nibtbl = $2d6 ;constant from boot prom
|
||||
bit2tbl = $200 ;hard-coded (uses $2aa-$2ff)
|
||||
|
||||
maxsec = $10 ;sectors per track, usually 10 but 0b for Olympic Decathlon, 0c for Karateka
|
||||
|
||||
;this section is specific to bootsectors
|
||||
;load second stage sector to $900, enabling track seek
|
||||
tax ;1 sector
|
||||
lda #secldr2
|
||||
ldy #9
|
||||
jsr seekread
|
||||
jmp ldr2
|
||||
;
|
||||
|
||||
seekread: stx total
|
||||
sta addrtbl
|
||||
sty tmpadr
|
||||
calcpart: sec
|
||||
lda #maxsec
|
||||
sbc addrtbl
|
||||
cmp total
|
||||
bcs L1
|
||||
tax
|
||||
L1: stx partial1
|
||||
stx partial2
|
||||
callseek: jsr seek - 1 ;(seekret) disabled during boot, increment to enable
|
||||
ldy addrtbl
|
||||
ldx #$0f
|
||||
lda #0
|
||||
L2: sta addrtbl, x
|
||||
dex
|
||||
bpl L2
|
||||
L3: lda tmpadr
|
||||
ldx sectbl, y
|
||||
sta addrtbl, x
|
||||
inc tmpadr
|
||||
iny
|
||||
dec partial1
|
||||
bne L3
|
||||
|
||||
read: ldx #0
|
||||
read1:
|
||||
L4: jsr readnib
|
||||
L5: cmp #$d5
|
||||
bne L4
|
||||
jsr readnib
|
||||
cmp #$aa
|
||||
bne L5
|
||||
tay ;we need Y=#$AA later
|
||||
jsr readnib
|
||||
eor #$ad ;zero A if match
|
||||
beq check_mode
|
||||
|
||||
;if not #$AD, then #$96 is assumed
|
||||
|
||||
ldy #2 ;high 8 bits of bit2tbl
|
||||
sty adrhi ;store 2-bits array at $2xx
|
||||
L6: jsr readnib
|
||||
rol ;set carry
|
||||
sta tmpsec
|
||||
jsr readnib
|
||||
and tmpsec
|
||||
dey
|
||||
bpl L6
|
||||
.if chksum
|
||||
sta tmpsec
|
||||
tay
|
||||
ldx addrtbl, y
|
||||
stx step
|
||||
.else
|
||||
tay
|
||||
lda addrtbl, y
|
||||
sta step
|
||||
stx addrtbl, y
|
||||
tax
|
||||
.endif
|
||||
bcs read1
|
||||
check_mode: cpx #0 ;set carry if non-zero
|
||||
beq read1
|
||||
.byte $90
|
||||
L7: clc
|
||||
L8: ldx $c0ec
|
||||
bpl L8
|
||||
eor nibtbl, x
|
||||
sta (adrlo), y ;$2xx initially, and then the real address
|
||||
iny
|
||||
bne L8
|
||||
ldx step
|
||||
stx adrhi ;set real address
|
||||
bcs L7 ;carry is set on first pass, clear on second, loops one time
|
||||
.if chksum
|
||||
L9: ldx $c0ec
|
||||
bpl L9
|
||||
eor nibtbl, x
|
||||
bne read
|
||||
ldx tmpsec
|
||||
sta addrtbl, x
|
||||
.endif
|
||||
L10: ldx #$a9
|
||||
L11: inx
|
||||
beq L10
|
||||
lda (adrlo), y
|
||||
lsr bit2tbl, x
|
||||
rol
|
||||
lsr bit2tbl, x
|
||||
rol
|
||||
sta (adrlo), y
|
||||
iny
|
||||
bne L11
|
||||
dec total
|
||||
dec partial2
|
||||
bne read ;read all requested sectors in one track
|
||||
ldx total
|
||||
beq seekret
|
||||
inc phase
|
||||
inc phase ;update current track
|
||||
jmp calcpart
|
||||
|
||||
sectbl: .byte 0, $0d, $0b, 9, 7, 5, 3, 1, $0e, $0c, $0a, 8, 6, 4, 2, $0f
|
||||
|
||||
readnib:
|
||||
L12: lda $c0ec
|
||||
bpl L12
|
||||
seekret: rts ;hard-coded relative to seek
|
||||
|
||||
seek: lda #0
|
||||
sta step
|
||||
copy_cur: lda curtrk
|
||||
sta tmptrk
|
||||
sec
|
||||
sbc phase
|
||||
beq seekret
|
||||
.if seekback
|
||||
bcs L13
|
||||
.endif
|
||||
eor #$ff
|
||||
inc curtrk
|
||||
.if seekback
|
||||
bcc L14
|
||||
L13: adc #$fe
|
||||
dec curtrk
|
||||
L14:
|
||||
.endif
|
||||
cmp step
|
||||
bcc L15
|
||||
lda step
|
||||
L15: cmp #8
|
||||
bcs L16
|
||||
tay
|
||||
sec
|
||||
L16: lda curtrk
|
||||
ldx step1, y
|
||||
bne L18
|
||||
L17: clc
|
||||
lda tmptrk
|
||||
ldx step2, y
|
||||
L18: stx tmpsec
|
||||
and #3
|
||||
rol
|
||||
tax
|
||||
sta $c0e0, x
|
||||
L19: ldx #$13
|
||||
L20: dex
|
||||
bne L20
|
||||
dec tmpsec
|
||||
bne L19
|
||||
lsr
|
||||
bcs L17
|
||||
inc step
|
||||
bne copy_cur
|
||||
|
||||
step1: .byte 1, $30, $28, $24, $20, $1e, $1d, $1c
|
||||
step2: .byte $70, $2c, $26, $22, $1f, $1e, $1d, $1c
|
||||
|
||||
newtrk = $36 ;track*2 for main stage
|
||||
newnum = $80 ;number of sectors in main stage
|
||||
newsec = 0 ;first sector in main stage
|
||||
newadr = $40 ;load address for main stage
|
||||
newstart = $4000 ;start address for main stage
|
||||
|
||||
ldr2: ;jmp ldr2
|
||||
;replace with something like the following:
|
||||
inc callseek + 1
|
||||
sty curtrk
|
||||
lda #newtrk
|
||||
sta phase
|
||||
ldx #newnum
|
||||
lda #newsec
|
||||
ldy #newadr
|
||||
jsr seekread
|
||||
; jmp newstart
|
||||
|
||||
ldr3: jmp ldr3
|
Loading…
Reference in New Issue
Block a user