SUPER VISION 8000 BEAM GALAXIANをPC-6001で動かす その5

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

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

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

ゲーム画面の表示乱れを修正し、ジョイスティック1、ジョイスティック2にも対応しました。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, Game1Patch
    dec  hl
    ld    (80fch), hl
    ld    hl, beamgalaxian
    
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:
    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
    inc   hl
    ld    (hl), a
    dec   hl
    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, 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
    ld    (80f2h), a
JoyE:
    ld    (hl), a
    pop  bc
    ret

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

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

Shot1:
    org  $4300
    push hl
    push af
    ld    a, 01h
    ld    hl, 80f6h
    call JoyS
    ld    a, 02h
    ld    hl, 80f7h
    call JoyS
    pop   af
    pop   hl
    cp    eeh
    jr    nz, Pad2
    ld    a, (80f8h)
    cp    80h
    jr    nz, Shot0
    ld    a, ffh
    ld    (80f0h), a
    ld    (80f8h), a
    ld    a, 01h
    ret
Shot0:
    ld   a, (80f0h)
    cp   20h
    jr   nz, Shot2
    ld   a,ffh
    ld   (80f0h), a
    ld   a, 01h
    ret
Shot2:
    ld   a, (80f9h)
    cp   80h
    jr   nz, Pad1
    ld   a,ffh
    ld   (80f9h), a
    ld   a, 10h
    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  $4420
Left:
    ld    a, (80f2h)
    bit   5, a
    jr    z, Right
    ld    a, 04h
    ret
Right:
    bit   4,a
    jr    z, Left1
    ld    a, 08h
    ret
Left1:
    ld    a, (80f6h)
    bit   5, a
    jr    z, Right1
    ld    a, 04h
    ret
Right1:
    bit   4,a
    jr    z, Left2
    ld    a, 08h
    ret
Left2:
    ld    a, (80f7h)
    bit   5, a
    jr    z, Right2
    ld    a, 40h
    ret
Right2:
    bit   4,a
    jr    z, None
    ld    a, 80h
    ret
None:
    ld    a, 00h
    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

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

    org  $4500
beamgalaxian: db 'BEAMGALAXIAN:#     '
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,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,05h,01h,98h,02h,29h,fah,03h,fah,05h,fah,07h
    db  43h,01h,03h,aeh
    db  44h,04h,03h,6bh,04h,06h,fah,17h,03h,9ch
    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

初代PC-6001実機では、戦士のカートリッジmkIIをESCキーを押しながら起動して、PiOモニタからロードします。

000.la.coocan.jp

>bin2io.exe bg 4000 beamgalaxian.rom beamgalaxian.p6
>p6towav.exe -f io beamgalaxian.p6 beamgalaxian.wav