BIOSF UPLOAD: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(4 intermediate revisions by one other user not shown)
Line 1: Line 1:
== BIOSF_UPLOAD ($C00546): Upload data to [[DRAM]] ==
The BIOSF_UPLOAD ($C00546) call copies data to the NeoGeo CD [[DRAM]].


<pre>
The parameters are:
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)
</pre>


For FIX, Z80 (, PAT ?) and PCM upload, the destination has to be multiplied by 2 (8bit busses).
*{{BR|BIOS_UPSRC}} (longword): Data source address
The SPR bank size is 1MiB (4 banks), PCM bank size is 512KiB (4 banks). The other zones aren't banked.
*{{BR|BIOS_UPDEST}} (longword): Data destination address
*{{BR|BIOS_UPSIZE}} (longword): Data size
*{{BR|BIOS_UPZONE}} (byte): Zone/method, see below
*{{BR|BIOS_UPBANK}} (byte): DRAM bank


BIOS_UPDEST (and BIOS_UPSRC ?) is incremented by the size upon completion, which allows to do multiple consecutive uploads.
When the call returns, BIOS_UPDEST points to the end of the copied data, allowing multiple consecutive uploads without setting the destination address again.


==Steps==
=Banks=


*$FF0004.w and $10FD80 are pushed
Some DRAM zones have banks: SPR has 4 banks (each 1MiB), PCM has 2 banks (each 512KiB).
*$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===
=Zones/methods=


*BIOS_UPZONE=0: RTS
==$00: Copy PRG words (DMA)==
*BIOS_UPZONE=1: $FF0129.b=0, $FF0105.b=5 (FIX set, upload type)
Loads word copy DMA microcode.
*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===
==$01: Copy Fix graphics bytes (DMA)==
*BIOS_UPZONE=0: RTS
Loads byte copy DMA microcode. Dest = Dest + Size * 2.
*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==
==$02: Copy Sprite graphics words (DMA)==
*$FF016F.b=1 disable interrupts ?
Loads word copy DMA microcode. Copies over 1MiB are possible, the bank is incremented automatically.
*BIOS_UPZONE anded with $1F
*Jump table


*BIOS_UPZONE=0:Upload PRG DMA
==$03: Copy Z80 program bytes (DMA)==
Load word copy microcode
Loads byte copy DMA microcode.
Dest=size+dest
LoadMicrocodeA0
d0=0
DoDMAWordCopyBypass


*BIOS_UPZONE=1:Upload Fix DMA
The destination address must be multiplied by 2 (8bit bus) ? Size doesn't have to be multiplied, but has to be an even number ?
Load byte copy microcode
DoDMAWordCopy
Dest=Dest+(size*2)


*BIOS_UPZONE=2:Upload Srites DMA
==$04: Copy PCM bytes (CPU)==
Load word copy microcode
Loads byte copy DMA microcode.
Is size = 0 ? Yes: dest=0, RTS
No:
Upload (>1MiB possible, bank is autoincremented)
DoDMAWordCopy


*BIOS_UPZONE=3 Upload Z80 DMA
The destination address must be multiplied by 2 (8bit bus). Size doesn't have to be multiplied, but has to be an even number. Copies over 1MiB are possible, the bank is incremented automatically.
Load byte copy microcode
Dest=Dest+(size*2)


*BIOS_UPZONE=4 Upload PCM DMA
==$05: Install [[PAT file]]==
Load byte copy microcode
Notes:
Upload (>1MiB possible, bank is autoincremented)
*10F736.l=((Bank*$10000)+Dest)/256
DoByteCopy
*10F736+Address/2


*BIOS_UPZONE=5 UploadCopyPATMethod0&1:
==$06: Copy palette words (DMA)==
$FF0127.b=0, Z80 set
Loads word copy DMA microcode.
$FF0105.b=4, upload type
10F736.l=((Bank*$10000)+Dest)/256
10F736+Address/2


See [[PAT file]] for data format
==$07: Copy compressed sprite graphics (CPU)==
The first longword's value indicates the size of the '''compressed''' data, BIOS_UPSIZE isn't used.
When a longword zero is copied, the following longword indicates how many zero longwords to insert.


*BIOS_UPZONE=6:
This method allows compression of large transparent zones. Is it ever used by games ?
Load word copy microcode
move.l #$00400000,d0 ;0BEC6: 203C00400000
bsr DoDMAWordCopyBypass ;0BECC: 61000018
Dest=size+dest


*BIOS_UPZONE=7
==$08: Copy PRG words (DMA)==
A1=Dest+$E00000
Same as method $00.
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
==$10: Copy PRG longwords (CPU)==
Same as 0
Size must be a multiple of 4.
*BIOS_UPZONE=9~F:RTS


*BIOS_UPZONE=10
==$11: Copy Fix graphics words (CPU)==
<pre>
The destination address must be multiplied by 2 (8bit bus). Size doesn't have to be multiplied, but has to be an even number.
UploadCopyPRGMethod1:
Load word copy microcode
$FF0004.w=$31
DoLongwordCopyBypass ;0BD20: 610001EA
$FF0004.w=$0331
Dest=Dest+Size


*BIOS_UPZONE=11
==$12: Copy Sprite graphics longwords (CPU)==
UploadCopyFIXMethod1:
Size must be a multiple of 4.
bsr DoWordToByteCopy ;0BCB6: 6100026A
Dest=Dest+(size*2)


*BIOS_UPZONE=12
==$13: Copy Z80 program bytes (CPU)==
UploadCopySpritesMethod1:
The destination address must be multiplied by 2 (8bit bus). Size doesn't have to be multiplied, but has to be an even number.
bsr DoLongwordCopy ;0BC48: 610002BC
Dest=Dest+Size


*BIOS_UPZONE=13
==$14: Copy PCM bytes (CPU)==
UploadCopyZ80Method1:
The destination address must be multiplied by 2 (8bit bus). Size doesn't have to be multiplied, but has to be an even number. Copies over 1MiB are possible, the bank is incremented automatically.
bsr DoByteCopy ;0BCF8: 61000250
Dest=Dest+(size*2)


*BIOS_UPZONE=14
Difference with $04 ?
UploadCopyPCMMethod1:
DoByteCopy ;0BCCC: 6100027C
Dest=Dest+(size*2)
Auto bank++


*BIOS_UPZONE=15
==$15: Install PAT file==
Same as 5
Same as method $05.
*BIOS_UPZONE=16
Load word copy microcode
move.l #$00400000,d0 ;0BD42: 203C00400000
bsr DoLongwordCopyBypass ;0BD48: 610001C2
Dest=Dest+Size


*BIOS_UPZONE=17
==$16: Copy palette longwords (CPU)==
Similar to 7, longword copy in a loop to upload zone
Size must be a multiple of 4.


*BIOS_UPZONE=18
==$17: Copy compressed sprite graphics (CPU)==
Same as 10
Same as method $07.
*BIOS_UPZONE=19~1F:RTS


*Watchdog kicked
==$18: Copy PRG longwords (CPU)==
*$FF016F.b=0 enable interrupts ?
Same as method $10.


[[Category:BIOS calls]]
[[Category:BIOS calls]]

Latest revision as of 20:15, 15 May 2024

The BIOSF_UPLOAD ($C00546) call copies data to the NeoGeo CD DRAM.

The parameters are:

BIOS_UPSRC ($10FEF8 ) (longword): Data source address

BIOS_UPDEST ($10FEF4 ) (longword): Data destination address

BIOS_UPSIZE ($10FEFC ) (longword): Data size

BIOS_UPZONE ($10FEDA ) (byte): Zone/method, see below

BIOS_UPBANK ($10FEDB ) (byte): DRAM bank

When the call returns, BIOS_UPDEST points to the end of the copied data, allowing multiple consecutive uploads without setting the destination address again.

Banks

Some DRAM zones have banks: SPR has 4 banks (each 1MiB), PCM has 2 banks (each 512KiB).

Zones/methods

$00: Copy PRG words (DMA)

Loads word copy DMA microcode.

$01: Copy Fix graphics bytes (DMA)

Loads byte copy DMA microcode. Dest = Dest + Size * 2.

$02: Copy Sprite graphics words (DMA)

Loads word copy DMA microcode. Copies over 1MiB are possible, the bank is incremented automatically.

$03: Copy Z80 program bytes (DMA)

Loads byte copy DMA microcode.

The destination address must be multiplied by 2 (8bit bus) ? Size doesn't have to be multiplied, but has to be an even number ?

$04: Copy PCM bytes (CPU)

Loads byte copy DMA microcode.

The destination address must be multiplied by 2 (8bit bus). Size doesn't have to be multiplied, but has to be an even number. Copies over 1MiB are possible, the bank is incremented automatically.

$05: Install PAT file

Notes:

  • 10F736.l=((Bank*$10000)+Dest)/256
  • 10F736+Address/2

$06: Copy palette words (DMA)

Loads word copy DMA microcode.

$07: Copy compressed sprite graphics (CPU)

The first longword's value indicates the size of the compressed data, BIOS_UPSIZE isn't used. When a longword zero is copied, the following longword indicates how many zero longwords to insert.

This method allows compression of large transparent zones. Is it ever used by games ?

$08: Copy PRG words (DMA)

Same as method $00.

$10: Copy PRG longwords (CPU)

Size must be a multiple of 4.

$11: Copy Fix graphics words (CPU)

The destination address must be multiplied by 2 (8bit bus). Size doesn't have to be multiplied, but has to be an even number.

$12: Copy Sprite graphics longwords (CPU)

Size must be a multiple of 4.

$13: Copy Z80 program bytes (CPU)

The destination address must be multiplied by 2 (8bit bus). Size doesn't have to be multiplied, but has to be an even number.

$14: Copy PCM bytes (CPU)

The destination address must be multiplied by 2 (8bit bus). Size doesn't have to be multiplied, but has to be an even number. Copies over 1MiB are possible, the bank is incremented automatically.

Difference with $04 ?

$15: Install PAT file

Same as method $05.

$16: Copy palette longwords (CPU)

Size must be a multiple of 4.

$17: Copy compressed sprite graphics (CPU)

Same as method $07.

$18: Copy PRG longwords (CPU)

Same as method $10.