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