PHILIPS CDI450のCDドライブを修理する

オークションなどで入手して、最悪CDドライブが壊れていても、BIOSの吸い出しはできるのでエミュレータで遊ぶことはできます。自分が入手したCDI450も音楽CDは再生できるものの、CD-iソフトが認識しませんでした。古いものなのでCDドライブを交換します。

Amazon | VAM1202 VAM1201 CDM1202 CDM1201 CDM12.1 CDM12.2 VAM1201L3 プレーヤー光ピックアップブロックオプティークレーザーレンズ機構付き光ピックアップレーザーレンズ | QMQJIA | 光ピックアップレンズ

新品ドライブが2000円くらいでCDM12.1互換のものを買えばよさそうです。

Philips CDM 12.1T Laser Sledge Replacement - retrostuff

貴重なのはCDI本体よりもACアダプタ、コントローラ、マウスなどです。本体は修理できるので、付属品がよければ落札するのもいいと思います。

PHILIPS CDI450のBIOSをDUMPする

PHILIPS CD-iエミュレータを動かすにはBIOSが必要となります。

www.cdiemu.org

PHILIPS CDI450の場合は以下の結線でコントローラ端子1(前面)とPCをつなぎます。

1赤、3茶、5黄、6青、7紫

PHILIPS CDI220の場合はコントローラ端子2(背面)とPCをつなぎます。

2赤、3茶、5黄、6青、7紫

PHILIPS CD-iエミュレータサイトにあるCD-i Linkというプログラムを使います。

>cdilink.exe -roms -p 5
CD-i Link version 0.5.1
Waiting for stub...
Downloading cdistub...
000087CC
Ending download stub...
CD-i Stub version 0.5.1
Reading module directory...
Reading module information...
00E54F4C
Found 74 modules
Reading memory list...
Building ROM list...
Uploading cdi450a.rom (512K)...
0080000
Ending stub...
Done!480000
Uploading vmpeg605.rom (256K)...
00E80000
Ending stub...
Done!

SUPER VISION 8000 PAC PAC BIRDをPC-6001で動かす その2

ジョイスティック1、ジョイスティック2にも対応しました!

 org  $4000
.header
    db    41h
    db    42h
    db    04h
    db    40h
Attr:
    di
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), 20h
    ldir
Screen:
    ld    hl, c200h
    ld    de, c201h
    ld    bc, 180fh
    ld    (hl), ffh
    ldir
    ld    hl, Game5Patch
    dec  hl
    ld    (80fch), hl
    ld    hl, pacpacbird
Title:
    ld    de, c200h
    ld    bc, 19
    ldir
    ld    hl, color1
    ld    de, c240h
    ld    bc, 19
    ldir
    ld    hl, color2
    ld    de, c280h
    ld    bc, 19
    ldir
    ld    hl, color3
    ld    de, c2c0h
    ld    bc, 19
    ldir
    ld    hl, color4
    ld    de, c300h
    ld    bc, 19
    ldir
Vram:
    ld    a, 01h
    out   (b0h), a
Ram:
    ld    a, 66h
    out   (06h), a
    ld    a, 0dh
    out   (f0h), a
    out   (f2h), a
    ld    a, 40h
    out   (30h), a
;  ld   a, 4dh
;  out  (f0h), a
;  ld   a, 55h
;  out  (f2h), a
Rom:
    ld    hl, 5000h
    ld    de, 0000h
    ld    bc, 1000h
    ldir
Vector:
    ld    a, fah
    ld    i, a
Patch:
    ld    hl, (80fch)
Next:
    inc   hl
    ld    a, (hl)
    inc   hl
    ld    c, (hl)
    inc  c
Addr:
    dec   c
    jr    z, Value
    inc   hl
    ld    d, (hl)
    inc   hl
    ld    e, (hl)
    ld    (de), a
    jr    Addr
Value:
    cp    ffh
    jr    nz, Next

Select:
    ld    hl, c000h
    ld    de, c001h
Mode:
    ei
    ld   a, (80f0h)
    cp   ffH
    jr   nz, Keys
    jr   Mode
Keys:
    ld   b, 84h
    cp   31h
    jr   z, Run
    ld   b, 86h
    cp   32h
    jr   z, Run
    ld   b, dch
    cp   33h
    jr   z, Run
    ld   b, deh
    cp   34h
    jr   z, Run
    ld   b, 20h
    jr   Mode
Run:
    ld   (hl), b
    ld   a, (hl)
    ld   (8400h), a
    ld    bc, 01ffh
    ldir
    ld   hl, 0000h
    ld   (8000h), hl
    jp    $0000

JoyS:
    rrca
    rrca
    or    %10000000
    push bc
    ld    b, a
    ld    a, 07h
    out   (a0h), a
    in    a, (a2h)
    ld    c, a
    or    %10000000
    and   %10111111
    out   (a1h), a
    ld    a, 0fh
    out   (a0h), a
    ld    a, b
    out   (a1h), a
    ld    a, 0eh
    out   (a0h), a
    in    a, (a2h)
    cpl
    ld    b, a
    ld    a, 07h
    out   (a0h), a
    ld    a, c
    out   (a1h), a
    ld    a, b
JoyB:
    bit   5, a
    jr    z, JoyR
    ld    a, 80h
    inc   hl
    ld    (hl), a
    dec   hl
JoyR:
    ld    a, b
    bit   3, a
    jr    z, JoyU
    ld    a, 10h
    jr    JoyE
JoyU:
    ld    a, b
    bit   0, a
    jr    z, JoyD
    ld    a, 04h
    jr    JoyE
JoyD:
    ld    a, b
    bit   1, a
    jr    z, JoyL
    ld    a, 08h
    jr    JoyE
JoyL:
    bit   2,a
    jr    z, JoyN
    ld    a, 20h
    jr    JoyE
JoyN:
    ld    a, 00h
JoyE:
    ld    (hl), a
    pop  bc
    ret

    org  $4200
Key:
    push af
    call SubCPU
    ld    (80f0h), a
    pop   af
    ei
    reti

SubCPU:
    ld    a, 0ch
    out   (93h), a
Scan:
    in    a,(92h)
    and   20h
    jr    z, Scan
    ld    a, 0dh
    out   (93h), a
    in    a, (90h)
    ret

    org  $4220
Counter:
    di
    push af
    ld    a, (8100h)
    cp    00h
    jp   nz, Disable
    ld    a, (80feh)
    add   a, 20h
    ld    (80feh), a
    cp    00h
    jp   z, $0038
Disable:
    ld    a, 08h
    out   (93h), a
Wait:
    in    a, (92h)
    and   80h
    jr    z, Wait
    ld    a, 09h
    out   (93h), a
    ld    a, 06h
    out   (90h), a
    pop  af
    ei
    reti

    org $4280
GameOver:
    ld   a, ffh
    ld    (8100h),a
    ld   hl, (805ah)
    ei
    ret

    org  $4290
Startup:
    ld   a, 20h
    call Clear
    ld   a, ffh
    ld   (80f0h), a
    ld    (8100h),a
    jp   $01da

    org $42a0
SelectGame:
    ld   a, (80f0h)
Space:
    cp   20h
    jr   nz, Return
    ld   a,ffh
    ld   (80f0h), a
    ld   a,00h
    ld   (8010h), a
    ld   a, 2ah
    ret
Return:
    cp   0dh
    jr   nz, Other
    ld   a, ffh
    ld   (80f0h), a
    ld   a, 23h
    ret
Other:
    cp   ffh
    ret  z
    ld   b, a
    ld   a, ffh
    ld   (80f0h), a
    ld   a, b
    ld   (8010h), a
    ret

    org  $42e7
Init:
    ld   a, (8400h)
Clear:
    push de
    push bc
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), a
    ldir
    pop   bc
    pop   de
    ret

    org  $4341
StartScreen:
    call $01c9
    call Init
    ret

    org  $4370
StartSound:
    ld   hl, $0731
    rst  20h
    ld   a, 00h
    ld    (8100h),a
    ld    a, 00h
    out   (b0h), a
    ret

    org  $4390
GameKey:
    push af
    call SubCPU
    ld    b, a
    ld    a, (80f2h)
    or    b
    ld    (80f2h), a
    pop   af
    ei
    reti

    org  $43a0
Cursor:
    ld   a, 01h
    ld   b, 00h
    ld   hl, 80f6h
    call JoyS
    ld    a, (80f6h)
    cp   00h
    jr   nz, Left
    ld    a, (80f2h)
Left:
    bit   4, a
    jr    z, Right
    and   efh
    ld   (80f2h), a
    ld   b, 08h
    jr   Left2
Right:
    bit   5, a
    jr    z, Up
    and   dfh
    ld   (80f2h), a
    ld   b, 04h
    jr   Left2
Up:
    bit   2, a
    jr    z, Down
    and   fbh
    ld   (80f2h), a
    ld   b, 01h
    jr   Left2
Down:
    bit   3, a
    jr    z, Left2
    and   f7h
    ld   (80f2h), a
    ld   b, 02h
    jr   Left2

    org  $43f0
Button:
    ld   b, 00h
    ld    a, (80f7h)
    bit  7, a
    jr   z, KeyB
    and   7fh
    ld   (80f7h), a
    ld   b, 01h
    jr   Button2
KeyB:
    ld    a, (80f2h)
    bit   7, a
    jr    z, Button2
    and   7fh
    ld   (80f2h), a
    ld   b, 01h
Button2:
    ld    a, (80f9h)
    bit  7, a
    jr   z, None2
    and   7fh
    ld   (80f9h), a
    ld   a, 10h
None2:
    or   b
    ret

Left2:
    ld   a, 02h
    ld   hl, 80f8h
    call JoyS
    ld    a, (80f8h)
    bit   4, a
    jr    z, Right2
    ld   a, 80h
    or   b
    ret
Right2:
    bit   5, a
    jr    z, Up2
    ld   a, 40h
    or   b
    ret
Up2:
    bit   2, a
    jr    z, Down2
    ld   a, 10h
    or   b
    ret
Down2:
    bit   3, a
    jr    z, None
    ld   a, 20h
    or   b
    ret
None:
    ld   a, b
    ret

    org  $4500

pacpacbird: db 'PAC PAC BIRD:#     '
color1:   db '128x96  4 COLOR #1 '
color2:   db '128x96  4 COLOR #2 '
color3:   db '256x192 GW MONO #3 '
color4:   db '256x192 BW MONO #4 '

Game5Patch:
    db  00h,0ch,00h,05h,00h,06h,00h,07h,00h,77h,00h,78h,01h,49h,01h,4ah,01h,4bh,01h,4ch,00h,39h,fah,02h,fah,14h
    db  01h,01h,00h,01h
    db  08h,01h,fah,04h
    db  20h,01h,fah,06h
    db  3eh,01h,00h,00h
    db  41h,01h,01h,21h
    db  42h,07h,fah,03h,fah,05h,fah,07h,fah,15h,00h,2dh,00h,e8h,01h,78h
    db  43h,05h,01h,22h,01h,4bh,03h,85h,03h,97h,fah,17h
    db  70h,01h,01h,4ah
    db  80h,01h,01h,77h
    db  90h,02h,00h,2ch,fah,16h
    db  a0h,10h,00h,15h,01h,ceh,01h,d5h,06h,6bh,06h,82h,06h,c9h,06h,d1h,06h,d8h,06h,dfh,06h,e7h,06h,efh,06h,f7h,06h,ffh,07h,07h,07h,0fh,00h,e7h
    db  a1h,0fh,00h,19h,01h,d1h,01h,d9h,06h,6fh,06h,86h,06h,cdh,06h,d4h,06h,dbh,06h,e3h,06h,ebh,06h,f3h,06h,fbh,07h,03h,07h,0bh,07h,13h
    db  b0h,01h,00h,03h
    db  a0h,01h,03h,84h
    db  c2h,0ch,01h,dch,01h,2fh,01h,35h,01h,42h,01h,84h,06h,29h,01h,c0h,00h,7eh,00h,85h,00h,8ch,04h,27h,04h,87h
    db  c3h,05h,00h,93h,00h,9ah,00h,a1h,00h,b2h,00h,deh
    db  c7h,01h,01h,99h
    db  cch,02h,06h,3ah,06h,43h
    db  cdh,08h,04h,2dh,04h,8dh,03h,83h,03h,95h,00h,e6h,06h,1bh,01h,49h,01h,76h
    db  cfh,01h,01h,e2h
    db  d3h,01h,00h,02h
    db  f0h,01h,03h,96h
    db  fbh,01h,00h,04h
    db  ffh,03h,80h,f0h,80h,f2h,80h,f4h

    org  $4fff
.footer   db   ffh

SUPER VISION 8000 MISSILEVADERをPC-6001で動かす その2

プログラム後半($4500-$4fff)は、パッチ情報などのデータ部分です。

VRAMアドレスにパッチを当てます。

    db  c2h,07h,00h,69h,00h,72h,05h,b3h,05h,c1h,05h,cch,00h,91h,07h,8ah
    db  c3h,05h,00h,a0h,0ah,13h,0ah,07h,0dh,dfh,0bh,8bh
    db  c4h,01h,07h,86h
    db  c5h,01h,05h,f2h
    db  c6h,03h,03h,31h,05h,e8h,05h,e5h
    db  cah,02h,03h,46h,03h,46h
    db  cbh,01h,06h,ffh
    db  cch,0ch,00h,f4h,00h,fah,01h,00h,0ch,ddh,0bh,c4h,0dh,46h,0dh,14h,0dh,4fh,0dh,52h,0dh,7dh,0ch,e6h,0ch,e9h
    db  cdh,0dh,04h,1ah,0dh,17h,0dh,80h,0dh,c5h,04h,38h,02h,a2h,00h,e7h,02h,a2h,02h,a5h,02h,a5h,06h,fah,07h,30h,0ah,46h
    db  ceh,06h,01h,d8h,01h,edh,02h,02h,0ah,4bh,0ah,5ch,0bh,d8h

サウンドポートにパッチを当てます。

    db  a0h,19h,00h,5dh,00h,afh,04h,6bh,04h,73h,04h,7bh,04h,83h,04h,8bh
    db  07h,e5h,09h,26h,09h,2eh,09h,4eh,09h,56h,09h,5dh,09h,cch,09h,fbh
    db  0ah,85h,0ah,99h,0ch,cch,0dh,adh,0eh,2ah,0eh,40h,0eh,48h,0eh,50h
    db  0eh,58h,0eh,adh
    db  a1h,19h,00h,61h,00h,b3h,04h,6fh,04h,77h,04h,7fh
    db  04h,87h,04h,8eh,07h,e8h,09h,2ah,09h,32h,09h,52h,09h,59h,09h,61h
    db  09h,cfh,09h,ffh,0ah,88h,0ah,9dh,0ch,d0h,0dh,b0h,0eh,2fh,0eh,44h
    db  0eh,4ch,0eh,54h,0eh,5bh,0eh,b0h

ミサイルベーダー固有のパッチ処理($4300-$44ff)は以下になります。

 org  $4000
.header
    db    41h
    db    42h
    db    04h
    db    40h
Attr:
    di
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), 20h
    ldir
Screen:
    ld    hl, c200h
    ld    de, c201h
    ld    bc, 180fh
    ld    (hl), ffh
    ldir
    ld    hl, Game1Patch
    dec  hl
    ld    (80fch), hl
    ld    hl, missilevader
    
Title:
    ld    de, c200h
    ld    bc, 19
    ldir
    ld    hl, color1
    ld    de, c240h
    ld    bc, 19
    ldir
    ld    hl, color2
    ld    de, c280h
    ld    bc, 19
    ldir
    ld    hl, color3
    ld    de, c2c0h
    ld    bc, 19
    ldir
    ld    hl, color4
    ld    de, c300h
    ld    bc, 19
    ldir
Vram:
    ld    a, 01h
    out   (b0h), a
Ram:
    ld    a, 66h
    out   (06h), a
    ld    a, 0dh
    out   (f0h), a
    out   (f2h), a
    ld    a, 40h
    out   (30h), a
;  ld   a, 4dh
;  out  (f0h), a
;  ld   a, 55h
;  out  (f2h), a
Rom:
    ld    hl, 5000h
    ld    de, 0000h
    ld    bc, 1000h
    ldir
Vector:
    ld    a, fah
    ld    i, a
Patch:
    ld    hl, (80fch)
Next:
    inc   hl
    ld    a, (hl)
    inc   hl
    ld    c, (hl)
    inc  c
Addr:
    dec   c
    jr    z, Value
    inc   hl
    ld    d, (hl)
    inc   hl
    ld    e, (hl)
    ld    (de), a
    jr    Addr
Value:
    cp    ffh
    jr    nz, Next

Select:
    ld    hl, c000h
    ld    de, c001h
Mode:
    ei
    ld   a, (80f0h)
    cp   ffH
    jr   nz, Keys
    jr   Mode
Keys:
    ld   b, 84h
    cp   31h
    jr   z, Run
    ld   b, 86h
    cp   32h
    jr   z, Run
    ld   b, dch
    cp   33h
    jr   z, Run
    ld   b, deh
    cp   34h
    jr   z, Run
    ld   b, 20h
    jr   Mode
Run:
    ld   (hl), b
    ld   a, (hl)
    ld   (8400h), a
    ld    bc, 01ffh
    ldir
    jp    $0000

JoyS:
    ld    a, 01h
    rrca
    rrca
    or    %10000000
    push bc
    ld    b, a
    ld    a, 07h
    out   (a0h), a
    in    a, (a2h)
    ld    c, a
    or    %10000000
    and   %10111111
    out   (a1h), a
    ld    a, 0fh
    out   (a0h), a
    ld    a, b
    out   (a1h), a
    ld    a, 0eh
    out   (a0h), a
    in    a, (a2h)
    cpl
    ld    b, a
    ld    a, 07h
    out   (a0h), a
    ld    a, c
    out   (a1h), a
    ld    a, b
JoyB:
    bit   5, a
    jr    z, JoyR
    ld    a, 80h
    ld    (80f8h), a
JoyR:
    ld    a, b
    bit   3, a
    jr    z, JoyU
    ld    a, 10h
    jr    JoyE
JoyU:
    ld    a, b
    bit   0, a
    jr    z, JoyD
    ld    a, 40h
    jr    JoyE
JoyD:
    ld    a, b
    bit   1, a
    jr    z, JoyL
    ld    a, 80h
    jr    JoyE
JoyL:
    bit   2,a
    jr    z, JoyN
    ld    a, 20h
    jr    JoyE
JoyN:
    ld    a, 00h
JoyE:
    ld    (80f6h), a
    pop  bc
    ret
    
    org  $4200
Key:
    push af
    call SubCPU
    ld    (80f0h), a
    pop   af
    org $4208
    ei
    reti

SubCPU:
    ld    a, 0ch
    out   (93h), a
Scan:
    in    a,(92h)
    and   20h
    jr    z, Scan
    ld    a, 0dh
    out   (93h), a
    in    a, (90h)
    ret

    org  $4270
GameKey:
    push af
    call SubCPU
    ld    b, a
    ld    a, (80f2h)
    or    b
    ld    (80f2h), a
    pop   af
    ei
    reti

    org  $4280
Init:
    ld   a, (8400h)
Clear:
    push de
    push bc
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), a
    ldir
    pop   bc
    pop   de
    ld   hl, c2fah
    ret

    org  $4300
Reverse:
    ld   a, (de)
    and  %01111111
    ld    (hl), a
    ld    a, h
    and   %11111101
    ld    h, a
    ld    (hl), 21h
    ld    a, h
    or    %00000010
    ld    h, a
    inc   hl
    inc   de
    dec   c
    jr   nz, Reverse
    ret

    org  $4380
    ld   a, 20h
    call Clear
    ei
    jp    $05a8

    org  $4400
    ld   a, ffh
    ld   (80f0h), a
StartMode:
    ld   a, (80f0h)
    cp   ffH
    jr   nz, ModeNum
    jr   StartMode
ModeNum:
    cp   30h
    jr   z, RetNum
    cp   31h
    jr   z, RetNum
    cp   32h
    jr   z, RetNum
    cp   33h
    jr   z, RetNum
    jp    $4400
RetNum:
    sub  30h
    ret

    org  $4430
    call JoyS
    ld    a, (80f6h)
    bit   4, a
    jp    nz, $0c17
    bit   5,a
    jp    nz, $0c5f
    jr    Cursor

    org  $4450
    call JoyS
    ld    a, (80f8h)
    ld   b, a
    ld   a, 00h
    ld   (80f8h), a
    ld   a, b
    bit   7, a
    jp    nz, $044f
    jp   Button

    org  $44b0
Cursor:
    ld    a, (80f0h)
Left:
    cp   1ch
    jr    nz, Right
    ld   a,ffh
    ld   (80f0h), a
    jp   $0c17
Right:
    cp   1dh
    ret  nz
    ld    a,ffh
    ld   (80f0h), a
    jp   $0c5f

    org  $44f0
Button:
    ld    a, (80f0h)
    cp   20h
    ret   nz
    ld   a, ffh
    ld   (80f0h), a
    jp   $044f

    org  $4500
missilevader: db 'MISSILEVADER:#     '   
color1:   db '128x96  4 COLOR #1 '
color2:   db '128x96  4 COLOR #2 '
color3:   db '256x192 GW MONO #3 '
color4:   db '256x192 BW MONO #4 '

Game1Patch:
    db  00h,04h,fah,02h,fah,14h,00h,79h,00h,a4h
    db  08h,01h,fah,04h
    db  20h,01h,fah,06h
    db  30h,01h,01h,0eh
    db  42h,06h,fah,03h,fah,05h,fah,07h,fah,15h,fah,17h,00h,e9h
    db  43h,02h,00h,a5h,00h,49h
    db  44h,03h,01h,0fh,01h,2dh,00h,7ah
    db  50h,01h,01h,2ch
    db  70h,01h,fah,16h
    db  80h,02h,00h,48h,00h,e8h
    db  a0h,19h,00h,5dh,00h,afh,04h,6bh,04h,73h,04h,7bh,04h,83h,04h,8bh
    db  07h,e5h,09h,26h,09h,2eh,09h,4eh,09h,56h,09h,5dh,09h,cch,09h,fbh
    db  0ah,85h,0ah,99h,0ch,cch,0dh,adh,0eh,2ah,0eh,40h,0eh,48h,0eh,50h
    db  0eh,58h,0eh,adh
    db  a1h,19h,00h,61h,00h,b3h,04h,6fh,04h,77h,04h,7fh
    db  04h,87h,04h,8eh,07h,e8h,09h,2ah,09h,32h,09h,52h,09h,59h,09h,61h
    db  09h,cfh,09h,ffh,0ah,88h,0ah,9dh,0ch,d0h,0dh,b0h,0eh,2fh,0eh,44h
    db  0eh,4ch,0eh,54h,0eh,5bh,0eh,b0h
    db  c2h,07h,00h,69h,00h,72h,05h,b3h,05h,c1h,05h,cch,00h,91h,07h,8ah
    db  c3h,05h,00h,a0h,0ah,13h,0ah,07h,0dh,dfh,0bh,8bh
    db  c4h,01h,07h,86h
    db  c5h,01h,05h,f2h
    db  c6h,03h,03h,31h,05h,e8h,05h,e5h
    db  cah,02h,03h,46h,03h,46h
    db  cbh,01h,06h,ffh
    db  cch,0ch,00h,f4h,00h,fah,01h,00h,0ch,ddh,0bh,c4h,0dh,46h,0dh,14h,0dh,4fh,0dh,52h,0dh,7dh,0ch,e6h,0ch,e9h
    db  cdh,0dh,04h,1ah,0dh,17h,0dh,80h,0dh,c5h,04h,38h,02h,a2h,00h,e7h,02h,a2h,02h,a5h,02h,a5h,06h,fah,07h,30h,0ah,46h
    db  ceh,06h,01h,d8h,01h,edh,02h,02h,0ah,4bh,0ah,5ch,0bh,d8h
    db  f0h,01h,fah,16h
    db  fbh,01h,00h,00h
    db  ffh,01h,80h,f0h

    org  $4fff
.footer   db   ffh

SUPER VISION 8000 MISSILEVADERをPC-6001で動かす

プログラム前半($4000-$41ff)は各ゲーム共通部分で、スクリーンモード選択機能とパッチ機能を提供します。

 org  $4000
.header
    db    41h
    db    42h
    db    04h
    db    40h
Attr:
    di
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), 20h
    ldir
Screen:
    ld    hl, c200h
    ld    de, c201h
    ld    bc, 180fh
    ld    (hl), ffh
    ldir
    ld    hl, Game1Patch
    dec  hl
    ld    (80fch), hl
    ld    hl, missilevader
    
Title:
    ld    de, c200h
    ld    bc, 19
    ldir
    ld    hl, color1
    ld    de, c240h
    ld    bc, 19
    ldir
    ld    hl, color2
    ld    de, c280h
    ld    bc, 19
    ldir
    ld    hl, color3
    ld    de, c2c0h
    ld    bc, 19
    ldir
    ld    hl, color4
    ld    de, c300h
    ld    bc, 19
    ldir
Vram:
    ld    a, 01h
    out   (b0h), a
Ram:
    ld    a, 66h
    out   (06h), a
    ld    a, 0dh
    out   (f0h), a
    out   (f2h), a
    ld    a, 40h
    out   (30h), a
Rom:
    ld    hl, 5000h
    ld    de, 0000h
    ld    bc, 1000h
    ldir
Vector:
    ld    a, fah
    ld    i, a
Patch:
    ld    hl, (80fch)
Next:
    inc   hl
    ld    a, (hl)
    inc   hl
    ld    c, (hl)
    inc  c
Addr:
    dec   c
    jr    z, Value
    inc   hl
    ld    d, (hl)
    inc   hl
    ld    e, (hl)
    ld    (de), a
    jr    Addr
Value:
    cp    ffh
    jr    nz, Next

Select:
    ld    hl, c000h
    ld    de, c001h
Mode:
    ei
    ld   a, (80f0h)
    cp   ffH
    jr   nz, Keys
    jr   Mode
Keys:
    ld   b, 84h
    cp   31h
    jr   z, Run
    ld   b, 86h
    cp   32h
    jr   z, Run
    ld   b, dch
    cp   33h
    jr   z, Run
    ld   b, deh
    cp   34h
    jr   z, Run
    ld   b, 20h
    jr   Mode
Run:
    ld   (hl), b
    ld   a, (hl)
    ld   (8400h), a
    ld    bc, 01ffh
    ldir
    jp    $0000

プログラム後半($4500-$4fff)は、パッチ情報などのデータ部分です。

 org  $4500

missilevader: db 'MISSILEVADER:#     '   
color1:   db '128x96  4 COLOR #1 '
color2:   db '128x96  4 COLOR #2 '
color3:   db '256x192 GW MONO #3 '
color4:   db '256x192 BW MONO #4 '

Game1Patch:
    db  42h,05h,fah,03h,fah,05h,fah,07h,fah,15h,fah,17h
    db  00h,02h,fah,02h,fah,14h
    db  08h,01h,fah,04h
    db  20h,01h,fah,06h
    db  70h,01h,fah,16h
    db  ffh,00h

    org  $4fff
.footer   db   ffh

パッチは以下のフォーマットで値がffhになるまで繰り返されます。上記は割り込みテーブル($fa00-$fa1f)を書き換えるデータの例です。

値 回数n 番地1 番地2 ... 番地n

割り込み処理($4200-$42ff)は以下になります。

    org  $4200
Key:
    push af
    call SubCPU
    ld    (80f0h), a
    pop   af
    org $4208
    ei
    reti

SubCPU:
    ld    a, 0ch
    out   (93h), a
Scan:
    in    a,(92h)
    and   20h
    jr    z, Scan
    ld    a, 0dh
    out   (93h), a
    in    a, (90h)
    ret

    org  $4220
Counter:
    di
    push af
    ld    a, (8100h)
    cp    00h
    jp   nz, Disable
    ld    a, (80feh)
    add   a, 20h
    ld    (80feh), a
    cp    00h
    jp   z, $0038
Disable:
    ld    a, 08h
    out   (93h), a
Wait:
    in    a, (92h)
    and   80h
    jr    z, Wait
    ld    a, 09h
    out   (93h), a
    ld    a, 06h
    out   (90h), a
    pop  af
    ei
    reti

    org  $4270
GameKey:
    push af
    call SubCPU
    ld    b, a
    ld    a, (80f2h)
    or    b
    ld    (80f2h), a
    pop   af
    ei
    reti

SUPER VISION 8000 PAC PAC BIRDをPC-6001で動かす

前回のマルチカートリッジからPAC PAC BIRDを切り出して、ローダー(loader.z80)を書き直して行きます。

AILZ80ASMでアセンブルします。アセンブルされたバイナリ(loader.bin)をSUPER VISION 8000用ROMと結合してPC-6001用ROM(pacpacbird.rom)を作ります。

>AILZ80ASM.exe loader.z80 -f
>copy /b loader.bin+pacpacbird.bin pacpacbird.rom

ローダーは[1][2][3][4]で操作します。ゲームは[↑][↓][→][←][SPC][RET][1][2][3][4][5][6][7][8]で遊びます。

PC-6001Vで本体を初代PC-6001にして、戦士のカートリッジmkIIのROMとして遊べます。

loader.z80

 org  $4000
.header
    db    41h
    db    42h
    db    04h
    db    40h
Attr:
    di
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), 20h
    ldir
Screen:
    ld    hl, c200h
    ld    de, c201h
    ld    bc, 180fh
    ld    (hl), ffh
    ldir
    ld    hl, Game5Patch
    dec  hl
    ld    (80fch), hl
    ld    hl, pacpacbird
Title:
    ld    de, c200h
    ld    bc, 19
    ldir
    ld    hl, color1
    ld    de, c240h
    ld    bc, 19
    ldir
    ld    hl, color2
    ld    de, c280h
    ld    bc, 19
    ldir
    ld    hl, color3
    ld    de, c2c0h
    ld    bc, 19
    ldir
    ld    hl, color4
    ld    de, c300h
    ld    bc, 19
    ldir
Vram:
    ld    a, 01h
    out   (b0h), a
Ram:
    ld    a, 66h
    out   (06h), a
    ld    a, 0dh
    out   (f0h), a
    out   (f2h), a
    ld    a, 40h
    out   (30h), a
;  ld   a, 4dh
;  out  (f0h), a
;  ld   a, 55h
;  out  (f2h), a
Rom:
    ld    hl, 5000h
    ld    de, 0000h
    ld    bc, 1000h
    ldir
Vector:
    ld    a, fah
    ld    i, a
Patch:
    ld    hl, (80fch)
Next:
    inc   hl
    ld    a, (hl)
    inc   hl
    ld    c, (hl)
    inc  c
Addr:
    dec   c
    jr    z, Value
    inc   hl
    ld    d, (hl)
    inc   hl
    ld    e, (hl)
    ld    (de), a
    jr    Addr
Value:
    cp    ffh
    jr    nz, Next

Select:
    ld    hl, c000h
    ld    de, c001h
Mode:
    ei
    ld   a, (80f0h)
    cp   ffH
    jr   nz, Keys
    jr   Mode
Keys:
    ld   b, 84h
    cp   31h
    jr   z, Run
    ld   b, 86h
    cp   32h
    jr   z, Run
    ld   b, dch
    cp   33h
    jr   z, Run
    ld   b, deh
    cp   34h
    jr   z, Run
    ld   b, 20h
    jr   Mode
Run:
    ld   (hl), b
    ld   a, (hl)
    ld   (8400h), a
    ld    bc, 01ffh
    ldir
    ld   hl, 0000h
    ld   (8000h), hl
    jp    $0000

    org  $4200
Key:
    push af
    call SubCPU
    ld    (80f0h), a
    pop   af
    ei
    reti

SubCPU:
    ld    a, 0ch
    out   (93h), a
Scan:
    in    a,(92h)
    and   20h
    jr    z, Scan
    ld    a, 0dh
    out   (93h), a
    in    a, (90h)
    ret

    org  $4220
Counter:
    di
    push af
    ld    a, (8100h)
    cp    00h
    jp   nz, Disable
    ld    a, (80feh)
    add   a, 20h
    ld    (80feh), a
    cp    00h
    jp   z, $0038
Disable:
    ld    a, 08h
    out   (93h), a
Wait:
    in    a, (92h)
    and   80h
    jr    z, Wait
    ld    a, 09h
    out   (93h), a
    ld    a, 06h
    out   (90h), a
    pop  af
    ei
    reti

    org $4280
GameOver:
    ld   a, ffh
    ld    (8100h),a
    ld   hl, (805ah)
    ei
    ret

    org  $4290
Startup:
    ld   a, 20h
    call Clear
    ld   a, ffh
    ld   (80f0h), a
    ld    (8100h),a
    jp   $01da

    org $42a0
SelectGame:
    ld   a, (80f0h)
Space:
    cp   20h
    jr   nz, Return
    ld   a,ffh
    ld   (80f0h), a
    ld   a,00h
    ld   (8010h), a
    ld   a, 2ah
    ret
Return:
    cp   0dh
    jr   nz, Other
    ld   a, ffh
    ld   (80f0h), a
    ld   a, 23h
    ret
Other:
    cp   ffh
    ret  z
    ld   b, a
    ld   a, ffh
    ld   (80f0h), a
    ld   a, b
    ld   (8010h), a
    ret

    org  $42e7
Init:
    ld   a, (8400h)
Clear:
    push de
    push bc
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), a
    ldir
    pop   bc
    pop   de
    ret

    org  $4341
StartScreen:
    call $01c9
    call Init
    ret

    org  $4370
StartSound:
    ld   hl, $0731
    rst  20h
    ld   a, 00h
    ld    (8100h),a
    ld    a, 00h
    out   (b0h), a
    ret

    org  $4390
GameKey:
    push af
    call SubCPU
    ld    b, a
    ld    a, (80f2h)
    or    b
    ld    (80f2h), a
    pop   af
    ei
    reti

    org  $43b0
Cursor:
    ld    a, (80f2h)
Left:
    bit   4, a
    jr    z, Right
    and   0efh
    ld   (80f2h), a
    ld   a, 08h
    ret
Right:
    bit   5, a
    jr    z, Up
    and   0dfh
    ld   (80f2h), a
    ld   a, 04h
    ret
Up:
    bit   2, a
    jr    z, Down
    and   0fbh
    ld   (80f2h), a
    ld   a, 01h
    ret
Down:
    bit   3, a
    jr    z, None
    and   0f7h
    ld   (80f2h), a
    ld   a, 02h
    ret

    org  $43f0
Button:
    ld    a, (80f2h)
    bit   7, a
    jr    z, None
    and   07fh
    ld   (80f2h), a
    ld   a, 01h
    ret
None:
    ld   (80f2h), a
    ld   a, 00h
    ret

    org  $4500

pacpacbird: db 'PAC PAC BIRD:#     '
color1:   db '128x96  4 COLOR #1 '
color2:   db '128x96  4 COLOR #2 '
color3:   db '256x192 GW MONO #3 '
color4:   db '256x192 BW MONO #4 '

Game5Patch:
    db  00h,0ch,00h,05h,00h,06h,00h,07h,00h,77h,00h,78h,01h,49h,01h,4ah,01h,4bh,01h,4ch,00h,39h,fah,02h,fah,14h
    db  01h,01h,00h,01h
    db  08h,01h,fah,04h
    db  20h,01h,fah,06h
    db  3eh,01h,00h,00h
    db  41h,01h,01h,21h
    db  42h,07h,fah,03h,fah,05h,fah,07h,fah,15h,00h,2dh,00h,e8h,01h,78h
    db  43h,05h,01h,22h,01h,4bh,03h,85h,03h,97h,fah,17h
    db  70h,01h,01h,4ah
    db  80h,01h,01h,77h
    db  90h,02h,00h,2ch,fah,16h
    db  a0h,10h,00h,15h,01h,ceh,01h,d5h,06h,6bh,06h,82h,06h,c9h,06h,d1h,06h,d8h,06h,dfh,06h,e7h,06h,efh,06h,f7h,06h,ffh,07h,07h,07h,0fh,00h,e7h
    db  a1h,0fh,00h,19h,01h,d1h,01h,d9h,06h,6fh,06h,86h,06h,cdh,06h,d4h,06h,dbh,06h,e3h,06h,ebh,06h,f3h,06h,fbh,07h,03h,07h,0bh,07h,13h
    db  b0h,02h,00h,03h,03h,84h
    db  c2h,0ch,01h,dch,01h,2fh,01h,35h,01h,42h,01h,84h,06h,29h,01h,c0h,00h,7eh,00h,85h,00h,8ch,04h,27h,04h,87h
    db  c3h,05h,00h,93h,00h,9ah,00h,a1h,00h,b2h,00h,deh
    db  c7h,01h,01h,99h
    db  cch,02h,06h,3ah,06h,43h
    db  cdh,08h,04h,2dh,04h,8dh,03h,83h,03h,95h,00h,e6h,06h,1bh,01h,49h,01h,76h
    db  cfh,01h,01h,e2h
    db  d3h,01h,00h,02h
    db  f0h,01h,03h,96h
    db  fbh,01h,00h,04h
    db  ffh,03h,80h,f0h,80h,f2h,80h,f4h

    org  $4fff
.footer   db   ffh

戦士のカートリッジmkIIを使わずに、PC-6001mkIIのROMとして遊ぶには以下の変更をします。

Ram:
;  ld   a, 66h
;  out  (06h), a
;  ld   a, 0dh
;  out  (f0h), a
;  out  (f2h), a
;  ld   a, 40h
;  out  (30h), a
    ld    a, 4dh
    out   (f0h), a
    ld    a, 55h
    out   (f2h), a

SUPER VISION 8000 BEAMGALAXIANをPC-6001で動かす その4

マルチカートリッジに対応し、PAC PAC BIRDにも対応しました!ローダー(loaderv1.z80)をAILZ80ASMでアセンブルします。アセンブルされたバイナリ(loaderv1.bin)をSUPER VISION 8000用ROMと結合してPC-6001用ROM(sv8000v1.rom)を作ります。

>AILZ80ASM.exe loaderv1.z80 -f
>copy /b loaderv1.bin+missilevader.bin+pacpacbird.bin+beamgalaxian.bin sv8000v1.rom

ローダーは[SPC][1][2][3][4]で操作します。ゲームはジョイパッドで遊びます。

loaderv1.z80

 org  $4000
.header
    db    41h
    db    42h
    db    04h
    db    40h
Attr:
    di
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), 20h
    ldir
Screen:
    ld    hl, c200h
    ld    de, c201h
    ld    bc, 180fh
    ld    (hl), ffh
    ldir
    ld    hl, 5000h
    ld   (80fah), hl
    ld    a, (5023h)
Game1:
    cp    c3h
    jr    nz, Game5
    ld    hl, Game1Patch
    dec  hl
    ld    (80fch), hl
    ld    hl, missilevader
    jr    Title
Game5:
    cp    31h
    jr    nz, Game7
    ld    hl, Game5Patch
    dec  hl
    ld    (80fch), hl
    ld    hl, pacpacbird
    jr    Title
Game7:
    ld    hl, Game7Patch
    dec  hl
    ld    (80fch), hl
    ld    hl, beamgalaxian
Title:
    ld    de, c200h
    ld    bc, 18
    ldir
    ld    hl, color1
    ld    de, c240h
    ld    bc, 18
    ldir
    ld    hl, color2
    ld    de, c280h
    ld    bc, 18
    ldir
    ld    hl, color3
    ld    de, c2c0h
    ld    bc, 18
    ldir
    ld    hl, color4
    ld    de, c300h
    ld    bc, 18
    ldir
Vram:
    ld    a, 01h
    out   (b0h), a
Ram:
    ld    a, 66h
    out   (06h), a
    ld    a, 0dh
    out   (f0h), a
    out   (f2h), a
    ld    a, 40h
    out   (30h), a
    ;;; Senshi no cartridge mk II 16K ROM
    ld    a, 11h
    out   (33h), a
Rom:
    ld   hl, (80fah)
    ld    de, 0000h
    ld    bc, 1000h
    ldir
Vector:
    ld    a, fah
    ld    i, a
Patch:
    ld    hl, (80fch)
Next:
    inc   hl
    ld    a, (hl)
    inc   hl
    ld    c, (hl)
    inc  c
Addr:
    dec   c
    jr    z, Value
    inc   hl
    ld    d, (hl)
    inc   hl
    ld    e, (hl)
    ld    (de), a
    jr    Addr
Value:
    cp    ffh
    jr    nz, Next

Select:
    ld    hl, c000h
    ld    de, c001h
Mode:
    ei
    ld   a, (80f0h)
    cp   ffH
    jr   nz, Keys
    jr   Mode
Keys:
    ld   b, 84h
    cp   31h
    jr   z, Run
    ld   b, 86h
    cp   32h
    jr   z, Run
    ld   b, dch
    cp   33h
    jr   z, Run
    ld   b, deh
    cp   34h
    jr   z, Run
    ld   b, 20h
    cp   20h
    jr   nz, Mode
    ld   a, (80fbh)
    add  a, 10h
    cp   80h
    jr   nz, Reset
    ld   a, 50h
Reset:
    ld   h, a
    ld   l, 23h
    ld   (80fbh), a
    ld   a, (hl)
    jp   Game1
Run:
    ld   (hl), b
    ld   a, (hl)
    ld   (8400h), a
    ld    bc, 01ffh
    ldir
    ld   hl, 0000h
    ld   (8000h), hl
    jp    $0000

Key:
    org  $4200
    push af
    call SubCPU
    ld    (80f0h), a
    pop   af
    ei
    reti

SubCPU:
    ld    a, 0ch
    out   (93h), a
Scan:
    in    a,(92h)
    and   20h
    jr    z, Scan
    ld    a, 0dh
    out   (93h), a
    in    a, (90h)
    ret

    org  $4220
Left:
    ld    a, (80f6h)
    bit   5, a
    jr    z, Right
    ld    a, 44h
    ret
Right:
    bit   4,a
    jr    z, None
    ld    a, 88h
    ret
None:
    ld    a, 00h
    ret

Start:
    org  $4240
    ld    (8031h) ,a
    ld    a, 00h
    out   (b0h), a
    ret

GameOver:
    org  $4260
    ld    a, 01h
    out   (b0h), a
    ei
    jp    $039a

Counter:
    org  $4270
    di
    push af
    ld    a, (80feh)
    add   a, 20h
    ld    (80feh), a
    cp    00h
    jp   z, $0038
    ld    a, 08h
    out   (93h), a
Wait:
    in    a, (92h)
    and   80h
    jr    z, Wait
    ld    a, 09h
    out   (93h), a
    ld    a, 06h
    out   (90h), a
    pop  af
    ei
    reti

JoyS:
    ld    a, 01h
    rrca
    rrca
    or    %10000000
    push bc
    ld    b, a
    ld    a, 07h
    out   (a0h), a
    in    a, (a2h)
    ld    c, a
    or    %10000000
    and   %10111111
    out   (a1h), a
    ld    a, 0fh
    out   (a0h), a
    ld    a, b
    out   (a1h), a
    ld    a, 0eh
    out   (a0h), a
    in    a, (a2h)
    cpl
    ld    b, a
    ld    a, 07h
    out   (a0h), a
    ld    a, c
    out   (a1h), a
    ld    a, b
JoyB:
    bit   5, a
    jr    z, JoyR
    ld    a, 80h
    ld    (80f8h), a
JoyR:
    ld    a, b
    bit   3, a
    jr    z, JoyU
    ld    a, 10h
    jr    JoyE
JoyU:
    ld    a, b
    bit   0, a
    jr    z, JoyD
    ld    a, 40h
    jr    JoyE
JoyD:
    ld    a, b
    bit   1, a
    jr    z, JoyL
    ld    a, 80h
    jr    JoyE
JoyL:
    bit   2,a
    jr    z, JoyN
    ld    a, 20h
    jr    JoyE
JoyN:
    ld    a, 00h
JoyE:
    ld    (80f6h), a
    pop  bc
    ret

Shot1:
    org  $4300
    push af
    call JoyS
    pop   af
    cp    eeh
    jr    nz, Pad2
    ld    a, (80f8h)
    cp    80h
    jr    nz, Pad1
    ld    a, ffh
    ld    (80f0h), a
    ld    (80f8h), a
    ld    a, 11h
    ret
Pad1:
    ld    a,(80f0h)
    cp    31h
    jr    nz, Pad0
    ld    a, 08h
    ret
Pad2:
    cp    ddh
    jr    nz, Pad3
    ld    a, (80f0h)
    cp    32h
    jr    nz, Pad0
    ld    a, 08h
    ret
Pad3:
    ld    a, (80f0h)
    cp    0dh
    jr    nz, Pad0
    ld    a, ffh
    ld    (80f0h), a
    ld    a, 01h
    ret
Pad0:
    ld    a, 00h
    ret

    org  $4369
Reverse:
    ld   a, (de)
    and  %01111111
    ld    (hl), a
    ld    a, h
    and   %11111101
    ld    h, a
    ld    (hl), 21h
    ld    a, h
    or    %00000010
    ld    h, a
    inc   hl
    inc   de
    dec   c
    jr   nz, Reverse
    di
    ret

    org  $4380
    ld   a, 20h
    call $43ea
    ei
    jp    $05a8

    org  $4390
    ld   a, 20h
    call $43ea
    ld   a, ffh
    ld   (80f0h), a
    jp   $01da

    org $43a0
    ld   a, (80f0h)
SpcK:
    cp   20h
    jr   nz, RetK
    ld   a,ffh
    ld   (80f0h), a
    ld   a,00h
    ld   (8010h), a
    ld   a, 2ah
    ret
RetK:
    cp   0dh
    jr   nz, OthK
    ld   a, ffh
    ld   (80f0h), a
    ld   a, 23h
    ret
OthK:
    cp   ffh
    ret  z
    ld   b, a
    ld   a, ffh
    ld   (80f0h), a
    ld   a, b
    ld   (8010h), a
    ret

    org  $43e7
    ld   a, (8400h)
Init:
    push de
    push bc
    ld    hl, c000h
    ld    de, c001h
    ld    bc, 01ffh
    ld    (hl), a
    ldir
    pop   bc
    pop   de
    ld    hl, c2fah
    ret

    org  $4400
    ld   a, ffh
    ld   (80f0h), a
StartMode:
    ld   a, (80f0h)
    cp   ffH
    jr   nz, ModeNum
    jr   StartMode
ModeNum:
    cp   30h
    jr   z, RetNum
    cp   31h
    jr   z, RetNum
    cp   32h
    jr   z, RetNum
    cp   33h
    jr   z, RetNum
    jp    $4400
RetNum:
    sub  30h
    ret

    org  $4430
    call JoyS
    ld    a, (80f6h)
    bit   4, a
    jp    nz, $0c17
    bit   5,a
    jp    nz, $0c5f
    ret

    org  $4441
    call $01c9
    call $43e7
    ret

    org  $4450
    call JoyS
    ld    a, (80f8h)
    ld   b, a
    ld   a, 00h
    ld   (80f8h), a
    ld   a, b
    bit   7, a
    jp    nz, $044f
    ret

    org  $4470
    ld   hl, $0731
    rst  20h
    ld    a, 00h
    out   (b0h), a
    ret

    org  $4480
    or   c0h
    cp   cdh
    jr    c, Ok
    add  a, 20h
Ok:
    add  a, 02h
    ld   h, a
    ret

    org  $4490
    push de
    push bc
    ld    hl, c200h
    ld    de, c201h
    ld    bc, 0d1fh
    ld    (hl), 00h
    ldir
    pop   bc
    pop   de
    ret

    org  $44b0
    ld    a, (80f2h)
    cp    00h
    jr   z,JLL
    bit   4, a
    jr    z,RRR
    ld   a, 00h
    ld   (80f2h), a
    ld   a, 80h
    ret
RRR:
    bit   5, a
    jr    z, UUU
    ld   a, 00h
    ld   (80f2h), a
    ld   a, 40h
    ret
UUU:
    bit   2, a
    jr    z, DDD
    ld   a, 00h
    ld   (80f2h), a
    ld   a, 10h
    ret
DDD:
    bit   3, a
    jr    z, NNN
    ld   a, 00h
    ld   (80f2h), a
    ld   a, 20h
    ret
NNN:
    cp    80h
    jr    nz, JLL
    ret

GameKey:
    org  $44f0
    push af
    call SubCPU
    ld    b, a
    ld    a, (80f2h)
    or    b
    ld    (80f2h), a
    pop   af
    ei
    reti

    org  $4508
    ld    a, (80f2h)
    bit   7, a
    jr    z, GKEY
    ld   a, 00h
    ld    (80f2h), a
    ld    (8003h), a
    ld   a, 10h
    ret
GKEY:
    call Joys
    ld    a, (80f8h)
    bit   7, a
    jr    z, GNN
    ld   a, 00h
    ld    (80f8h), a
    ld   a, 01h
    ret
GNN:
    ld   a, 00h
    ret

    org  $4530
JLL:
    call Joys
    cp    00h
    ret z
    bit   4, a
    jr    z, JRR
    ld   a, 00h
    ld    (80f6h), a
    ld   a, 08h
    ret
JRR:
    bit   5, a
    jr    z, JUU
    ld   a, 00h
    ld    (80f6h), a
    ld   a, 04h
    ret
JUU:
    bit   6, a
    jr    z, JDD
    ld   a, 00h
    ld    (80f6h), a
    ld   a, 01h
    ret
JDD:
    bit   7, a
    jr    z, NON
    ld   a, 00h
    ld    (80f6h), a
    ld   a, 02h
    ret
NON:
    ld   a, 00h
    ret

missilevader: db 'MISSILEVADER:#    '
pacpacbird: db 'PAC PAC BIRD:#    '
beamgalaxian: db 'BEAMGALAXIAN:#    '

color1:   db '128x96  4COLORS #1'
color2:   db '128x96  4COLORS #2'
color3:   db '256x192 GW MONO #3'
color4:   db '256x192 BW MONO #4'

Game1Patch:
    db  00h,02h,fah,02h,00h,79h
    db  08h,01h,fah,04h
    db  30h,01h,01h,0eh
    db  42h,03h,fah,03h,fah,05h,fah,07h
    db  43h,03h,00h,a5h,00h,e9h,00h,49h
    db  44h,04h,01h,0fh,01h,2dh,00h,7ah,fah,17h
    db  50h,01h,01h,2ch
    db  70h,01h,fah,06h
    db  80h,01h,00h,48h
    db  a0h,19h,00h,5dh,00h,afh,04h,6bh,04h,73h,04h,7bh,04h,83h,04h,8bh
    db  07h,e5h,09h,26h,09h,2eh,09h,4eh,09h,56h,09h,5dh,09h,cch,09h,fbh
    db  0ah,85h,0ah,99h,0ch,cch,0dh,adh,0eh,2ah,0eh,40h,0eh,48h,0eh,50h
    db  0eh,58h,0eh,adh
    db  a1h,19h,00h,61h,00h,b3h,04h,6fh,04h,77h,04h,7fh
    db  04h,87h,04h,8eh,07h,e8h,09h,2ah,09h,32h,09h,52h,09h,59h,09h,61h
    db  09h,cfh,09h,ffh,0ah,88h,0ah,9dh,0ch,d0h,0dh,b0h,0eh,2fh,0eh,44h
    db  0eh,4ch,0eh,54h,0eh,5bh,0eh,b0h
    db  c2h,07h,00h,69h,00h,72h,05h,b3h,05h,c1h,05h,cch,00h,91h,07h,8ah
    db  c3h,05h,00h,a0h,0ah,13h,0ah,07h,0dh,dfh,0bh,8bh
    db  c4h,01h,07h,86h
    db  c5h,01h,05h,f2h
    db  c6h,03h,03h,31h,05h,e8h,05h,e5h
    db  cah,02h,03h,46h,03h,46h
    db  cbh,01h,06h,ffh
    db  cch,0ch,00h,f4h,00h,fah,01h,00h,0ch,ddh,0bh,c4h,0dh,46h,0dh,14h,0dh,4fh,0dh,52h,0dh,7dh,0ch,e6h,0ch,e9h
    db  cdh,0dh,04h,1ah,0dh,17h,0dh,80h,0dh,c5h,04h,38h,02h,a2h,00h,e7h,02h,a2h,02h,a5h,02h,a5h,06h,fah,07h,30h,0ah,46h
    db  ceh,06h,01h,d8h,01h,edh,02h,02h,0ah,4bh,0ah,5ch,0bh,d8h
    db  e7h,01h,00h,e8h
    db  f0h,01h,fah,16h
    db  fbh,01h,00h,00h
    db  ffh,01h,80h,f0h

Game5Patch:
    db  00h,0bh,00h,05h,00h,06h,00h,07h,00h,77h,00h,78h,01h,49h,01h,4ah,01h,4bh,01h,4ch,00h,39h,fah,02h
    db  01h,01h,00h,01h
    db  08h,02h,03h,96h,fah,04h
    db  3eh,01h,00h,00h
    db  41h,01h,01h,21h
    db  42h,03h,fah,03h,fah,05h,fah,07h
    db  43h,02h,00h,2dh,00h,e8h
    db  44h,04h,01h,22h,01h,4bh,fah,17h,03h,85h
    db  45h,01h,03h,97h
    db  70h,02h,01h,4ah,fah,06h
    db  90h,01h,00h,2ch
    db  a0h,10h,00h,e7h,00h,15h,01h,ceh,01h,d5h,06h,6bh,06h,82h,06h,c9h,06h,d1h,06h,d8h,06h,dfh,06h,e7h,06h,efh,06h,f7h,06h,ffh,07h,07h,07h,0fh
    db  a1h,0fh,00h,19h,01h,d1h,01h,d9h,06h,6fh,06h,86h,06h,cdh,06h,d4h,06h,dbh,06h,e3h,06h,ebh,06h,f3h,06h,fbh,07h,03h,07h,0bh,07h,13h
    db  b0h,02h,00h,03h,03h,84h
    db  c2h,0ch,01h,dch,01h,2fh,01h,35h,01h,42h,01h,84h,06h,29h,01h,c0h,00h,7eh,00h,85h,00h,8ch,04h,27h,04h,87h
    db  c3h,05h,00h,93h,00h,9ah,00h,a1h,00h,b2h,00h,deh
    db  c7h,01h,01h,99h
    db  cch,02h,06h,3ah,06h,43h
    db  cdh,07h,04h,2dh,04h,8dh,03h,83h,03h,95h,00h,e6h,06h,1bh,01h,49h
    db  cfh,01h,01h,e2h
    db  d3h,01h,00h,02h
    db  f0h,01h,fah,16h
    db  fbh,01h,00h,04h
    db  ffh,03h,80h,f0h,80h,f2h,80h,f4h

Game7Patch:
    db  00h,07h,00h,38h,00h,39h,03h,adh,fah,02h,00h,00h,00h,01h,00h,02h
    db  08h,01h,fah,04h
    db  20h,01h,03h,9bh
    db  40h,01h,01h,97h
    db  42h,06h,03h,9ch,01h,98h,02h,29h,fah,03h,fah,05h,fah,07h
    db  43h,01h,03h,aeh
    db  44h,03h,03h,6bh,04h,06h,fah,17h
    db  60h,01h,02h,28h
    db  70h,01h,fah,06h
    db  80h,01h,03h,6ah
    db  90h,01h,04h,05h
    db  a0h,0fh,00h,17h,01h,aeh,03h,f8h,03h,ffh,04h,46h,0ah,66h,0ah,76h,0ah,90h,0ah,97h,0ah,a8h,0ah,b5h,0ah,cfh,0ah,d6h,0ah,e2h,0ah,e9h
    db  a1h,0ch,00h,1bh,01h,b8h,03h,fbh,04h,03h,04h,42h,04h,49h,0Ah,6Fh,0ah,93h,0ah,7ah,0ah,b1h,0ah,d2h,0ah,e5h
    db  c2h,08h,00h,93h,00h,9eh,00h,a4h,00h,b8h,04h,65h,04h,99h,05h,fah,06h,05h
    db  c3h,03h,04h,12h,03h,69h,04h,04h
    db  c4h,01h,00h,c4h
    db  c5h,02h,00h,cdh,01h,42h
    db  c7h,03h,00h,d6h,01h,4bh,02h,00h
    db  c8h,03h,00h,dfh,02h,09h,02h,18h
    db  cah,01h,00h,fch
    db  cbh,01h,01h,0fh
    db  cch,02h,00h,e8h,0dh,f3h
    db  cdh,04h,03h,9ah,03h,ach,01h,96h,02h,27h
    db  f0h,01h,fah,16h
    db  ffh,03h,80h,f0h,80h,f2h,80h,f4h

    org  $4fff
.footer   db   ffh