BIOSF UPLOAD: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
mNo edit summary
No edit summary
 
(5 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
bsr LoadMicrocodeA0 ;0BEA6: 610000C8
moveq #0,d0 ;0BEAA: 7000
bsr DoDMAWordCopyBypass ;0BEAC: 61000038
*BIOS_UPZONE=1:Upload Fix DMA
Load byte copy microcode
bsr DoDMAWordCopy ;0BDDC: 61000102
Dest=Dest+(size*2)
*BIOS_UPZONE=2:Upload Srites DMA
Load word copy microcode
<pre>
move.l UploadSize(a5),32226(a5) ;0BD62: 2B6D7EFC7DE2
LAB_021A:
move.l 32226(a5),d0 ;0BD68: 202D7DE2
beq.s LAB_021C ;0BD6C: 675C
add.l UploadDest(a5),d0 ;0BD6E: D0AD7EF4
cmpi.l #$00100000,d0 ;0BD72: 0C8000100000
bls.s LAB_021B ;0BD78: 632E
move.l #$00100000,d0 ;0BD7A: 203C00100000
sub.l UploadDest(a5),d0 ;0BD80: 90AD7EF4
move.l d0,UploadSize(a5) ;0BD84: 2B407EFC
move.l 32226(a5),d1 ;0BD88: 222D7DE2
sub.l d0,d1 ;0BD8C: 9280
move.l d1,32226(a5) ;0BD8E: 2B417DE2
bsr DoDMAWordCopy ;0BD92: 6100014C
clr.l UploadDest(a5) ;0BD96: 42AD7EF4
addq.b #1,UploadBank(a5) ;0BD9A: 522D7EDB
move.b UploadBank(a5),EXT_023D ;0BD9E: 13ED7EDB00FF01A1
bra.s LAB_021A ;0BDA6: 60C0
LAB_021B:
bsr DoDMAWordCopy ;0BDA8: 61000136
move.l UploadDest(a5),d0 ;0BDAC: 202D7EF4
add.l UploadSize(a5),d0 ;0BDB0: D0AD7EFC
cmpi.l #$00100000,d0 ;0BDB4: 0C8000100000
bcs.s LAB_021C ;0BDBA: 650E
clr.l d0 ;0BDBC: 4280
addq.b #1,UploadBank(a5) ;0BDBE: 522D7EDB
move.b UploadBank(a5),EXT_023D ;0BDC2: 13ED7EDB00FF01A1
LAB_021C:
move.l d0,UploadDest(a5) ;0BDCA: 2B407EF4
rts ;0BDCE: 4E75
</pre>
*BIOS_UPZONE=3 Upload Z80 DMA
Load byte copy microcode
Dest=Dest+(size*2)


*BIOS_UPZONE=4 Upload PCM 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
<pre>
move.l UploadSize(a5),32226(a5) ;0BDFA: 2B6D7EFC7DE2
LAB_021E:
move.l 32226(a5),d0 ;0BE00: 202D7DE2
beq.s LAB_0221 ;0BE04: 6756
add.l d0,d0 ;0BE06: D080
add.l UploadDest(a5),d0 ;0BE08: D0AD7EF4
cmpi.l #$00100000,d0 ;0BE0C: 0C8000100000
bhi.s LAB_021F ;0BE12: 6208
move.l 32226(a5),UploadSize(a5) ;0BE14: 2B6D7DE27EFC
bra.s LAB_0220 ;0BE1A: 603C
LAB_021F:
move.l #$00100000,d0 ;0BE1C: 203C00100000
sub.l UploadDest(a5),d0 ;0BE22: 90AD7EF4
lsr.l #1,d0 ;0BE26: E288
move.l d0,UploadSize(a5) ;0BE28: 2B407EFC
move.l 32226(a5),d1 ;0BE2C: 222D7DE2
sub.l d0,d1 ;0BE30: 9280
move.l d1,32226(a5) ;0BE32: 2B417DE2
bsr DoByteCopy ;0BE36: 61000112
clr.l UploadDest(a5) ;0BE3A: 42AD7EF4
addq.b #1,UploadBank(a5) ;0BE3E: 522D7EDB
move.b UploadBank(a5),EXT_023E ;0BE42: 13ED7EDB00FF01A3
move.l UploadSrc(a5),d0 ;0BE4A: 202D7EF8
add.l UploadSize(a5),d0 ;0BE4E: D0AD7EFC
move.l d0,UploadSrc(a5) ;0BE52: 2B407EF8
bra.s LAB_021E ;0BE56: 60A8
LAB_0220:
bsr DoByteCopy ;0BE58: 610000F0
LAB_0221:
move.l UploadDest(a5),d0 ;0BE5C: 202D7EF4
add.l UploadSize(a5),d0 ;0BE60: D0AD7EFC
add.l UploadSize(a5),d0 ;0BE64: D0AD7EFC
cmpi.l #$00100000,d0 ;0BE68: 0C8000100000
bcs.s LAB_0222 ;0BE6E: 650E
clr.l d0 ;0BE70: 4280
addq.b #1,UploadBank(a5) ;0BE72: 522D7EDB
move.b UploadBank(a5),EXT_023E ;0BE76: 13ED7EDB00FF01A3
LAB_0222:
move.l d0,UploadDest(a5) ;0BE7E: 2B407EF4
rts ;0BE82: 4E75
</pre>
*BIOS_UPZONE=5 UploadCopyPATMethod0&1:
<pre>
move.b #$00,EXT_022D ;0BF98: 13FC000000FF0127 Z80 set
move.b #$04,EXT_0224 ;0BFA0: 13FC000400FF0105 Upload type
lea UPLOADZONE,a1 ;0BFA8: 43F900E00000
moveq #0,d0 ;0BFAE: 7000
move.b UploadBank(a5),d0 ;0BFB0: 102D7EDB
swap d0 ;0BFB4: 4840
lsl.l #4,d0 ;0BFB6: E988
or.l UploadDest(a5),d0 ;0BFB8: 80AD7EF4
lsr.l #8,d0 ;0BFBC: E088
move d0,30518(a5) ;0BFBE: 3B407736
movea.l UploadSrc(a5),a0 ;0BFC2: 206D7EF8
moveq #0,d0 ;0BFC6: 7000
LAB_022D:
move (a0),d0 ;0BFC8: 3010
beq LAB_0232 ;0BFCA: 67000082
move 2(a0),d1 ;0BFCE: 32280002
add EXT_016D,d1 ;0BFD2: D2790010F736
lsr #1,d1 ;0BFD8: E249
bsr LAB_022F ;0BFDA: 61000046
move 4(a0),d1 ;0BFDE: 32280004
add EXT_016D,d1 ;0BFE2: D2790010F736
lsr #1,d1 ;0BFE8: E249
subq #1,d1 ;0BFEA: 5341
bsr LAB_022F ;0BFEC: 61000034
tst.l 6(a0) ;0BFF0: 4AA80006
beq LAB_022E ;0BFF4: 67000026
addq #1,d0 ;0BFF8: 5240
move 6(a0),d1 ;0BFFA: 32280006
add EXT_016D,d1 ;0BFFE: D2790010F736
lsr #1,d1 ;0C004: E249
bsr LAB_022F ;0C006: 6100001A
move 8(a0),d1 ;0C00A: 32280008
add EXT_016D,d1 ;0C00E: D2790010F736
lsr #1,d1 ;0C014: E249
subq #1,d1 ;0C016: 5341
bsr LAB_022F ;0C018: 61000008
LAB_022E:
lea 10(a0),a0 ;0C01C: 41E8000A
bra.s LAB_022D ;0C020: 60A6
LAB_022F:
btst #0,d0 ;0C022: 08000000
bne LAB_0233 ;0C026: 66000030
move d1,d3 ;0C02A: 3601
lsr #8,d1 ;0C02C: E049
bsr LAB_0230 ;0C02E: 61000004
move d3,d1 ;0C032: 3203
LAB_0230:
move.l d0,d2 ;0C034: 2400
add.l d2,d2 ;0C036: D482
btst #0,d0 ;0C038: 08000000
beq.s LAB_0231 ;0C03C: 6708
move.b d1,-1(a1,d2.l) ;0C03E: 138128FF
addq #1,d0 ;0C042: 5240
rts ;0C044: 4E75
</pre>
*BIOS_UPZONE=6:
<pre>
lea MicrocodeWordCopy(pc),a0 ;0BEBE: 41FA01BC
bsr LoadMicrocodeA0 ;0BEC2: 610000AC
move.l #$00400000,d0 ;0BEC6: 203C00400000
bsr DoDMAWordCopyBypass ;0BECC: 61000018
move.l UploadDest(a5),d0 ;0BED0: 202D7EF4
add.l UploadSize(a5),d0 ;0BED4: D0AD7EFC
move.l d0,UploadDest(a5) ;0BED8: 2B407EF4
rts ;0BEDC: 4E75
rts ;0BEDE: 4E75
</pre>
*BIOS_UPZONE=7
<pre>
move.l #$00E00000,d0 ;0BC5A: 203C00E00000
add.l UploadDest(a5),d0 ;0BC60: D0AD7EF4
movea.l d0,a1 ;0BC64: 2240
movea.l UploadSrc(a5),a0 ;0BC66: 206D7EF8
moveq #0,d0 ;0BC6A: 7000
move.l (a0)+,d7 ;0BC6C: 2E18
beq.s LAB_0218 ;0BC6E: 6738
LAB_0215:
move.l (a0)+,(a1)+ ;0BC70: 22D8
beq.s LAB_0216 ;0BC72: 6712
dbf d7,LAB_0215 ;0BC74: 51CFFFFA
move.l a1,d0 ;0BC78: 2009
subi.l #$00E00000,d0 ;0BC7A: 048000E00000
move.l d0,UploadDest(a5) ;0BC80: 2B407EF4
rts ;0BC84: 4E75
</pre>
*BIOS_UPZONE=8
Same as 0
*BIOS_UPZONE=9~F:RTS


*BIOS_UPZONE=10
==$04: Copy PCM bytes (CPU)==
<pre>
Loads byte copy DMA microcode.
UploadCopyPRGMethod1:
lea MicrocodeWordCopy(pc),a0 ;0BD0E: 41FA036C
bsr LoadMicrocodeA0 ;0BD12: 6100025C
moveq #0,d0 ;0BD16: 7000
move #$0031,EXT_0210 ;0BD18: 33FC003100FF0004
bsr DoLongwordCopyBypass ;0BD20: 610001EA
move #$0331,EXT_0210 ;0BD24: 33FC033100FF0004
move.l UploadDest(a5),d0 ;0BD2C: 202D7EF4
add.l UploadSize(a5),d0 ;0BD30: D0AD7EFC
move.l d0,UploadDest(a5) ;0BD34: 2B407EF4
rts ;0BD38: 4E75


lea MicrocodeWordCopy(pc),a0 ;0BD3A: 41FA0340
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 LoadMicrocodeA0 ;0BD3E: 61000230
move.l #$00400000,d0 ;0BD42: 203C00400000
bsr DoLongwordCopyBypass ;0BD48: 610001C2
move.l UploadDest(a5),d0 ;0BD4C: 202D7EF4
add.l UploadSize(a5),d0 ;0BD50: D0AD7EFC
move.l d0,UploadDest(a5) ;0BD54: 2B407EF4
rts ;0BD58: 4E75
</pre>
*BIOS_UPZONE=11
<pre>
UploadCopyFIXMethod1:
bsr DoWordToByteCopy ;0BCB6: 6100026A
move.l UploadDest(a5),d0 ;0BCBA: 202D7EF4
add.l UploadSize(a5),d0 ;0BCBE: D0AD7EFC
add.l UploadSize(a5),d0 ;0BCC2: D0AD7EFC
move.l d0,UploadDest(a5) ;0BCC6: 2B407EF4
rts ;0BCCA: 4E75
</pre>
*BIOS_UPZONE=12
<pre>
UploadCopySpritesMethod1:
bsr DoLongwordCopy ;0BC48: 610002BC
move.l UploadDest(a5),d0 ;0BC4C: 202D7EF4
add.l UploadSize(a5),d0 ;0BC50: D0AD7EFC
move.l d0,UploadDest(a5) ;0BC54: 2B407EF4
rts ;0BC58: 4E75


move.l #$00E00000,d0 ;0BC5A: 203C00E00000
==$05: Install [[PAT file]]==
add.l UploadDest(a5),d0 ;0BC60: D0AD7EF4
Notes:
movea.l d0,a1 ;0BC64: 2240
*10F736.l=((Bank*$10000)+Dest)/256
movea.l UploadSrc(a5),a0 ;0BC66: 206D7EF8
*10F736+Address/2
moveq #0,d0 ;0BC6A: 7000
move.l (a0)+,d7 ;0BC6C: 2E18
beq.s LAB_0218 ;0BC6E: 6738
LAB_0215:
move.l (a0)+,(a1)+ ;0BC70: 22D8
beq.s LAB_0216 ;0BC72: 6712
dbf d7,LAB_0215 ;0BC74: 51CFFFFA
move.l a1,d0 ;0BC78: 2009
subi.l #$00E00000,d0 ;0BC7A: 048000E00000
move.l d0,UploadDest(a5) ;0BC80: 2B407EF4
rts ;0BC84: 4E75
</pre>
*BIOS_UPZONE=13
<pre>
UploadCopyZ80Method1:
bsr DoByteCopy ;0BCF8: 61000250
move.l UploadDest(a5),d0 ;0BCFC: 202D7EF4
add.l UploadSize(a5),d0 ;0BD00: D0AD7EFC
add.l UploadSize(a5),d0 ;0BD04: D0AD7EFC
move.l d0,UploadDest(a5) ;0BD08: 2B407EF4
rts ;0BD0C: 4E75
</pre>
*BIOS_UPZONE=14
<pre>
UploadCopyPCMMethod1:
bsr DoByteCopy ;0BCCC: 6100027C
move.l UploadDest(a5),d0 ;0BCD0: 202D7EF4
add.l UploadSize(a5),d0 ;0BCD4: D0AD7EFC
add.l UploadSize(a5),d0 ;0BCD8: D0AD7EFC
cmpi.l #$00100000,d0 ;0BCDC: 0C8000100000
bcs.s LAB_0219 ;0BCE2: 650E
addq.b #1,UploadBank(a5) ;0BCE4: 522D7EDB
move.b UploadBank(a5),EXT_023E ;0BCE8: 13ED7EDB00FF01A3
clr.l d0 ;0BCF0: 4280
LAB_0219:
move.l d0,UploadDest(a5) ;0BCF2: 2B407EF4
rts ;0BCF6: 4E75
</pre>
*BIOS_UPZONE=15
Same as 5
*BIOS_UPZONE=16
<pre>
lea MicrocodeWordCopy(pc),a0 ;0BD3A: 41FA0340
bsr LoadMicrocodeA0 ;0BD3E: 61000230
move.l #$00400000,d0 ;0BD42: 203C00400000
bsr DoLongwordCopyBypass ;0BD48: 610001C2
move.l UploadDest(a5),d0 ;0BD4C: 202D7EF4
add.l UploadSize(a5),d0 ;0BD50: D0AD7EFC
move.l d0,UploadDest(a5) ;0BD54: 2B407EF4
rts ;0BD58: 4E75
</pre>
*BIOS_UPZONE=17
<pre>
move.l #$00E00000,d0 ;0BC5A: 203C00E00000
add.l UploadDest(a5),d0 ;0BC60: D0AD7EF4
movea.l d0,a1 ;0BC64: 2240
movea.l UploadSrc(a5),a0 ;0BC66: 206D7EF8
moveq #0,d0 ;0BC6A: 7000
move.l (a0)+,d7 ;0BC6C: 2E18
beq.s LAB_0218 ;0BC6E: 6738
LAB_0215:
move.l (a0)+,(a1)+ ;0BC70: 22D8
beq.s LAB_0216 ;0BC72: 6712
dbf d7,LAB_0215 ;0BC74: 51CFFFFA
move.l a1,d0 ;0BC78: 2009
subi.l #$00E00000,d0 ;0BC7A: 048000E00000
move.l d0,UploadDest(a5) ;0BC80: 2B407EF4
rts ;0BC84: 4E75
</pre>
*BIOS_UPZONE=18
Same as 10
*BIOS_UPZONE=19~1F:RTS


*Watchdog kicked
==$06: Copy palette words (DMA)==
*$FF016F.b=0 enable interrupts ?
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.


[[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.