BIOSF UPLOAD
BIOSF_UPLOAD ($C00546): Upload data to DRAM
BIOS_UPSRC (32bit): Source (Long) BIOS_UPDEST (32bit): Destination (Long) BIOS_UPSIZE (32bit): Size (Long) BIOS_UPZONE $10FEDA (8bit): Zone (Byte, 0=PRG, 1=FIX, 2=SPR, 3=Z80, 4=PCM, 5=PAT) BIOS_UPBANK (8bit): Bank (Byte)
For FIX, Z80 (, PAT ?) and PCM upload, the destination has to be multiplied by 2 (8bit busses). The SPR bank size is 1MiB (4 banks), PCM bank size is 512KiB (4 banks). The other zones aren't banked.
BIOS_UPDEST (and BIOS_UPSRC ?) is incremented by the size upon completion, which allows to do multiple consecutive uploads.
Steps
- $FF0004.w and $10FD80 are pushed
- $FF0004.w = 1
- $10FD80=0, system mode
- Mapping
- $FF016F.b=1 disable interrupts ?
- Copy
- Watchdog kicked
- $FF016F.b=0 enable interrupts ?
- Unmapping
- Restore $10FD80.w and $FF0004.w
Modes
- BIOS_UPZONE=0: Upload PRG DMA words
- Load word copy microcode
- Dest=size+dest
- LoadMicrocodeA0
- DoDMAWordCopyBypass
- BIOS_UPZONE=1: Upload Fix DMA bytes
- $FF0129.b=0, $FF0105.b=5 (FIX set, upload type)
- Load byte copy microcode
- DoDMAWordCopy
- Dest=Dest+(size*2)
- $FF0149.b=0 FIX unset
- BIOS_UPZONE=2: Upload Srites DMA words
- $FF0121.b=0, $FF0105.b=0, $FF01A1.b=UploadBank (SPR set, upload type)
- Load word copy microcode
- Upload (>1MiB possible, bank is autoincremented)
- DoDMAWordCopy
- $FF0141.b=0 SPR unset
- BIOS_UPZONE=3: Upload Z80 DMA bytes
- $FF0127.b=0, $FF0105.b=4 (Z80 set, upload type)
- Load byte copy microcode
- DoByteCopy
- Dest=Dest+(size*2)
- $FF0147.b=0 Z80 unset
- BIOS_UPZONE=4: Upload PCM DMA bytes
- $FF0123.b=0, $FF0105.b=1, $FF01A3.b=UploadBank (PCM set, upload type)
- Load byte copy microcode
- Upload (>1MiB possible, bank is autoincremented)
- DoByteCopy
- $FF0143.b=0 PCM unset
- BIOS_UPZONE=5: Install PAT
- $FF0127.b=0, Z80 set
- $FF0105.b=4, upload type
- 10F736.l=((Bank*$10000)+Dest)/256
- 10F736+Address/2
- See PAT file for data format
- BIOS_UPZONE=6: Upload palette words
- Load word copy microcode
- move.l #$00400000,d0 ;0BEC6: 203C00400000
- bsr DoDMAWordCopyBypass ;0BECC: 61000018
- Dest=size+dest
- BIOS_UPZONE=7: Upload sprites loop longwords (?)
- $FF0121.b=0, $FF0105.b=0, $FF01A1.b=UploadBank (SPR set, upload type)
- A1=Dest+$E00000
- Size.l=(Src.l)
- Size=0 ? Yes: Dest=A1-$E00000
- Copy src to dest
- ...weird longword copy in a loop to upload zone
- $FF0141.b=0 SPR unset
- BIOS_UPZONE=8: Upload PRG DMA
- Same as 0
- BIOS_UPZONE=10: Upload PRG loop longwords
- Load word copy microcode
- $FF0004.w=$31
- DoLongwordCopyBypass
- $FF0004.w=$0331
- Dest=Dest+Size
- BIOS_UPZONE=11: Upload FIX loop words
- $FF0129.b=0, $FF0105.b=5 (FIX set, upload type)
- DoWordToByteCopy
- Dest=Dest+(size*2)
- $FF0149.b=0 FIX unset
- BIOS_UPZONE=12: Upload Sprites loop longwords
- $FF0121.b=0, $FF0105.b=0, $FF01A1.b=UploadBank (SPR set, upload type)
- bsr DoLongwordCopy ;0BC48: 610002BC
- Dest=Dest+Size
- $FF0141.b=0 SPR unset
- BIOS_UPZONE=13: Upload Z80 loop bytes
- $FF0127.b=0, $FF0105.b=4 (Z80 set, upload type)
- bsr DoByteCopy ;0BCF8: 61000250
- Dest=Dest+(size*2)
- $FF0147.b=0 Z80 unset
- BIOS_UPZONE=14: Upload PCM loop bytes
- $FF0123.b=0, $FF0105.b=1, $FF01A3.b=UploadBank (PCM set, upload type)
- DoByteCopy ;0BCCC: 6100027C
- Dest=Dest+(size*2)
- Auto bank++
- $FF0143.b=0 PCM unset
- BIOS_UPZONE=15: Install PAT
- Same as 5
- BIOS_UPZONE=16: Upload palette longwords
- Load word copy microcode
- move.l #$00400000,d0 ;0BD42: 203C00400000
- bsr DoLongwordCopyBypass ;0BD48: 610001C2
- Dest=Dest+Size
- BIOS_UPZONE=17: Upload sprites loop longwords (?)
- $FF0121.b=0, $FF0105.b=0, $FF01A1.b=UploadBank (SPR set, upload type)
- Similar to 7, longword copy in a loop to upload zone
- $FF0141.b=0 SPR unset
- BIOS_UPZONE=18
- Same as 10