BIOSF UPLOAD

From NeoGeo Development Wiki
Revision as of 01:39, 15 December 2011 by Furrtek (talk | contribs)
Jump to navigation Jump to search

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 ?