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
- BIOS_UPZONE anded with $F
- Jump table
- Subrout1
- Copydata
- BIOS_UPZONE anded with $F
- Jump table
- Subrout2
- Restore $10FD80.w and $FF0004.w
Subrout1
- BIOS_UPZONE=0: RTS
- BIOS_UPZONE=1: $FF0129.b=0, $FF0105.b=5 (FIX set, upload type)
- BIOS_UPZONE=2: $FF0121.b=0, $FF0105.b=0, $FF01A1.b=UploadBank (SPR set, upload type)
- BIOS_UPZONE=3: $FF0127.b=0, $FF0105.b=4 (Z80 set, upload type)
- BIOS_UPZONE=4: $FF0123.b=0, $FF0105.b=1, $FF01A3.b=UploadBank (PCM set, upload type)
- BIOS_UPZONE=5: RTS
- BIOS_UPZONE=6: RTS
- BIOS_UPZONE=7: $FF0121.b=0, $FF0105.b=0, $FF01A1.b=UploadBank (SPR set, upload type)
- BIOS_UPZONE=8: RTS
- BIOS_UPZONE=9~F:RTS
Subrout2=
- BIOS_UPZONE=0: RTS
- BIOS_UPZONE=1: $FF0149.b=0 FIX unset
- BIOS_UPZONE=2: $FF0141.b=0 SPR unset
- BIOS_UPZONE=3: $FF0147.b=0 Z80 unset
- BIOS_UPZONE=4: $FF0143.b=0 PCM unset
- BIOS_UPZONE=5: RTS
- BIOS_UPZONE=6: RTS
- BIOS_UPZONE=7: $FF0141.b=0 SPR unset
- BIOS_UPZONE=8: RTS
- BIOS_UPZONE=9~F:RTS
Copydata
- $FF016F.b=1 disable interrupts ?
- BIOS_UPZONE anded with $1F
- Jump table
- BIOS_UPZONE=0:Upload PRG DMA
Load word copy microcode Dest=size+dest LoadMicrocodeA0 d0=0 DoDMAWordCopyBypass
- BIOS_UPZONE=1:Upload Fix DMA
Load byte copy microcode DoDMAWordCopy Dest=Dest+(size*2)
- BIOS_UPZONE=2:Upload Srites DMA
Load word copy microcode Is size = 0 ? Yes: dest=0, RTS No: Upload (>1MiB possible, bank is autoincremented) DoDMAWordCopy
- BIOS_UPZONE=3 Upload Z80 DMA
Load byte copy microcode Dest=Dest+(size*2)
- BIOS_UPZONE=4 Upload PCM DMA
Load byte copy microcode Upload (>1MiB possible, bank is autoincremented) DoByteCopy
- BIOS_UPZONE=5 UploadCopyPATMethod0&1:
$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:
Load word copy microcode move.l #$00400000,d0 ;0BEC6: 203C00400000 bsr DoDMAWordCopyBypass ;0BECC: 61000018 Dest=size+dest
- BIOS_UPZONE=7
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
- BIOS_UPZONE=8
Same as 0
- BIOS_UPZONE=9~F:RTS
- BIOS_UPZONE=10
UploadCopyPRGMethod1: Load word copy microcode $FF0004.w=$31 DoLongwordCopyBypass ;0BD20: 610001EA $FF0004.w=$0331 Dest=Dest+Size *BIOS_UPZONE=11 UploadCopyFIXMethod1: bsr DoWordToByteCopy ;0BCB6: 6100026A Dest=Dest+(size*2) *BIOS_UPZONE=12 UploadCopySpritesMethod1: bsr DoLongwordCopy ;0BC48: 610002BC Dest=Dest+Size *BIOS_UPZONE=13 UploadCopyZ80Method1: bsr DoByteCopy ;0BCF8: 61000250 Dest=Dest+(size*2) *BIOS_UPZONE=14 UploadCopyPCMMethod1: DoByteCopy ;0BCCC: 6100027C Dest=Dest+(size*2) Auto bank++ *BIOS_UPZONE=15 Same as 5 *BIOS_UPZONE=16 Load word copy microcode move.l #$00400000,d0 ;0BD42: 203C00400000 bsr DoLongwordCopyBypass ;0BD48: 610001C2 Dest=Dest+Size *BIOS_UPZONE=17 Similar to 7, longword copy in a loop to upload zone *BIOS_UPZONE=18 Same as 10 *BIOS_UPZONE=19~1F:RTS *Watchdog kicked *$FF016F.b=0 enable interrupts ?