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

PC-6001でマシン語モニタを動かす

初代PC-6001にはmonコマンドはありません。マシン語モニタはいくつかありますがIOモニタが良さそうです。

000.la.coocan.jp

ここら辺を参考にマシン語モニタ(I/O 1982/2、1982/3)、新マシン語モニタ(I/O 1982/6)、PiOモニタを打ち込んでみました。

000.la.coocan.jp

PiOモニタはIOモニタと互換性があり使いやすく、BASICだけで入力できるのも良かったです。国会図書館などで複写してもらってOCRを利用するのがいいと思います。

beamgalaxian.romをPiOモニタからロードしてみます。

>bin2io.exe bg 4000 beamgalaxian.rom beamgalaxian.p6

p6ers.net

PC-6001Vで初代PC-6001+戦士のカートリッジmk2のROMなしで起動してモニタモードで以下を実行します。

>out 0x06 0x66
>out 0x32 0x42
>out 0x33 0x43
>out 0xf2 0x55

PiOモニタからbeamgalaxian.p6をロードして実行します。

*l
FOUND;bg
4000,5FFF
*d4000
4000:41 42 04 40 F3 21 00 C0:9B 
*g4004

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

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

BEAMGALAXIANを初代PC-6001本体+戦士のカートリッジmkIIで遊ぶ方法です。

ローダーとしてテープ版(32K):エミュレーター用を使います。

http://inufuto.web.fc2.com/8bit/cacorm/

テープファイル(cacorm.p6)から、WAVファイル(cacorm.wav)を作成します。

https://000.la.coocan.jp/p6/uchikomi.html#bin2io

PC-6001本体+戦士のカートリッジmkIIをESCキーを押しながら起動して、PAGE1でCLOADしたらWAVファイル(cacorm.wav)を再生します。

http://p6ers.net/beluga/

ROMファイル(beamgalaxian.rom)から、テープファイル(beamgalaxian.p6)を以下の通り作成し、WAVファイル(beamgalaxian.wav)を作成します。ローダーをRUNしたらWAVファイル(beamgalaxian.wav)を再生します。

ここまでがテープファイル(beamgalaxian.p6)のヘッダーでROMファイルの先頭5バイト目(F3)以降すべてを貼りつけます。

C9 C9 C9 C9 C9 C9 C9 C9-C9 C9 00 40 FF 1F 00 00 00 00

作成したテープファイルの先頭はこんな感じです。

beamgalaxian.p6

0000 C9 C9 C9 C9 C9 C9 C9 C9-C9 C9 00 40 FF 1F 00 00
0010 00 00 F3 21 00 C0-11 01 C0 01 FF 01 36 20 ED B0
0020 21 00 C2 11 01 C2-01 0F 18 36 FF ED B0 3A 23 50
0030 FE C3 20 10 21 1A-44 7C 32 FC 80 7D 32 FD 80 21
0040 54 43 18 72 FE 6D-20 10 21 1A 44 7C 32 FC 80 7D
0050 32 FD 80 21 66 43-18 5E FE A8 20 10 21 1A 44 7C

前回作成したROMファイルの先頭はこんな感じです。先頭(41 42 04 40 F3)から5バイト目はF3です。

beamgalaxian.rom

0000 41 42 04 40 F3 21 00 C0-11 01 C0 01 FF 01 36 20
0010 ED B0 21 00 C2 11 01 C2-01 0F 18 36 FF ED B0 3A
0020 23 50 FE C3 20 10 21 1A-44 7C 32 FC 80 7D 32 FD
0030 80 21 54 43 18 72 FE 6D-20 10 21 1A 44 7C 32 FC
0040 80 7D 32 FD 80 21 66 43-18 5E FE A8 20 10 21 1A
0050 44 7C 32 FC 80 7D 32 FD-80 21 78 43 18 4A FE 00

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

BEAMGALAXIANをPC-6001Vで遊ぶ方法です。

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

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

MISSILEVADERにも対応しました!SUPER VISION 8000用ROM(missilevader.bin)と結合してPC-6001用ROM(missilevader.rom)を作ります。

>copy /b loader.bin+missilevader.bin missilevader.rom

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
Game1:
    ld   a, (5023h)
    cp   c3h
    jr   nz, Game2
    ld   hl, Game1Patch
    ld   a, h
    ld   (80fch), a
    ld   a, l
    ld   (80fdh), a
    ld   hl, missilevader
    jr   Title
Game2:
    cp   6dh
    jr   nz, Game3
    ld   hl, Game2Patch
    ld   a, h
    ld   (80fch), a
    ld   a, l
    ld   (80fdh), a
    ld   hl, spacefire
    jr   Title
Game3:
    cp   a8h
    jr   nz, Game4
    ld   hl, Game3Patch
    ld   a, h
    ld   (80fch), a
    ld   a, l
    ld   (80fdh), a
    ld   hl, othello
    jr   Title
Game4:
    cp   00h
    jr   nz, Game5
    ld   hl, Game4Patch
    ld   a, h
    ld   (80fch), a
    ld   a, l
    ld   (80fdh), a
    ld   hl, gunfighter
    jr   Title
Game5:
    cp   31h
    jr   nz, Game6
    ld   hl, Game5Patch
    ld   a, h
    ld   (80fch), a
    ld   a, l
    ld   (80fdh), a
    ld   hl, pacpacbird
    jr   Title
Game6:
    cp   3eh
    jr   nz, Game7
    ld   hl, Game6Patch
    ld   a, h
    ld   (80fch), a
    ld   a, l
    ld   (80fdh), a
    ld   hl, submarine
    jr   Title
Game7:
    ld   hl, Game7Patch
    ld   a, h
    ld   (80fch), a
    ld   a, l
    ld   (80fdh), a
    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
Rom:
    ld   hl, 5000h
    ld   de, 0000h
    ld   bc, 1000h
    ldir
Vector:
    ld   a, fah
    ld   i, a
Patch:
    ld   a, (80fch)
    ld   h, a
    ld   a, (80fdh)
    ld   l, a
Next:
    inc  hl
    ld   a, (hl)
    inc  hl
    ld   c, (hl)
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
    ld   bc, 01ffh
Mode:
    ei
    call JOYS
    ld   a, (80f0h)
    cp   ffH
    jr   nz, Keys
    ld   a, (80f4h)
    cp   80h
    jr   nz, Mode
Keys:
    ld   (hl), 84h
    cp   31h
    jr   z, Run
    ld   (hl), 86h
    cp   32h
    jr   z, Run
    ld   (hl), dch
    cp   33h
    jr   z, Run
    ld   (hl), deh
Run:
    ld   a, (hl)
    ld   (8400h),a
    ldir
    jp   0000h

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
Space:
    ld   a,(80f2h)
    bit  7, a
    jr   z, Left
    ld   a, 80h
    ld   (80f4h), a
Left:
    ld   a, (80f2h)
    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   039ah

Counter:
    org  $4270
    di
    push af
    ld   a, (80feh)
    add  a, 20h
    ld   (80feh), a
    cp   00h
    jp   z, 003ah
    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   (80f4h), a
JOYR:
    ld   a, b
    bit  3, a
    jr   z, JOYL
    ld   a, 10h
    jr   JOYE
JOYL:
    bit  2,a
    jr   z, JOYN
    ld   a, 20h
    jr   JOYE
JOYN:
    ld   a, 00h
JOYE:
    ld   (80f2h), a
    pop  bc
    ret

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

Shot1:
    org  $4300
    push af
    call JOYS
    pop  af
    cp   eeh
    jr   nz, Pad2
    ld   a,(80f4h)
    cp   80h
    jr   nz, Shot0
    ld   a, ffh
    ld   (80f0h), a
    ld   (80f4h), a
    ld   a, 11h
    ret
Shot0:
    ld   a,(80f0h)
    cp   20h
    jr   nz, Pad1
    ld   a,ffh
    ld   (80f0h), 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  $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, (80f2h)
    bit  4, a
    jp   nz, $0c17
    bit  5,a
    jp   nz, $0c5f
    ret

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

missilevader: db   'MISSILEVADER:?    '
spacefire:    db   'SPACE FIRE:?      '
othello:  db   'OTHELLO:?         '
gunfighter:   db   'GUN FIGHTER:?     '
pacpacbird:   db   'PAC PAC BIRD:?    '
submarine:    db   'SUBMARINE:?       '
beamgalaxian: db   'BEAMGALAXIAN:?    '

color1:   db   '1:SCREEN3:COLOR,,1'
color2:   db   '2:SCREEN3:COLOR,,2'
color3:   db   '3:SCREEN4:COLOR,,1'
color4:   db   '4:SCREEN4:COLOR,,2'

Game1Patch:
    db   00h,42h,05h,fah,03h,fah,05h,fah,07h,fah,17h,08h,02h,fah
    db   04h,70h,02h,fah,06h,f0h,02h,fah,16h,00h,03h,fah,02h,00h
    db   79h,30h,02h,01h,0eh,50h,02h,01h,2ch,44h,03h,01h,0fh,01h
    db   2dh,44h,02h,00h,7ah,fbh,02h,00h,00h,a0h,1ah,00h,5dh,00h
    db   afh,04h,6bh,04h,73h,04h,7bh,04h,83h,04h,8bh,07h,e5h,09h
    db   26h,09h,2eh,09h,4eh,09h,56h,09h,5dh,09h,cch,09h,fbh,0ah
    db   85h,0ah,99h,0ch,cch,0dh,adh,0eh,2ah,0eh,40h,0eh,48h,0eh
    db   50h,0eh,58h,0eh,adh,a1h,1ah,00h,61h,00h,b3h,04h,6fh,04h
    db   77h,04h,7fh,04h,87h,04h,8eh,07h,e8h,09h,2ah,09h,32h,09h
    db   52h,09h,59h,09h,61h,09h,cfh,09h,ffh,0ah,88h,0ah,9dh,0ch
    db   d0h,0dh,b0h,0eh,2fh,0eh,44h,0eh,4ch,0eh,54h,0eh,5bh,0eh
    db   b0h,c2h,07h,00h,69h,00h,72h,05h,b3h,05h,c1h,05h,cch,00h
    db   91h,c2h,03h,00h,e9h,07h,8ah,c3h,03h,00h,a0h,0ah,13h,c3h
    db   04h,0ah,07h,0dh,dfh,0bh,8bh,c5h,02h,05h,f2h,c6h,04h,03h
    db   31h,05h,e8h,05h,e5h,cch,0bh,00h,f4h,00h,fah,01h,00h,0ch
    db   ddh,0bh,c4h,0dh,46h,0dh,14h,0dh,4fh,0dh,52h,0dh,7dh,cch
    db   03h,0ch,e6h,0ch,e9h,cdh,0bh,04h,1ah,0dh,17h,0dh,80h,0dh
    db   c5h,04h,38h,02h,a2h,02h,a5h,06h,fah,07h,30h,0ah,46h,c4h
    db   02h,07h,86h,cah,03h,03h,46h,03h,46h,cbh,02h,06h,ffh,ceh
    db   07h,01h,d8h,01h,edh,02h,02h,0ah,4bh,0ah,5ch,0bh,d8h,cdh
    db   02h,00h,e7h,e7h,02h,00h,e8h,43h,04h,00h,a5h,00h,e9h,00h
    db   49h,80h,02h,00h,48h,cdh,03h,02h,a2h,02h,a5h,ffh,02h,80h
    db   f0h
Game2Patch:
Game3Patch:
Game4Patch:
Game5Patch:
Game6Patch:
Game7Patch:
    db   00h,a0h,10h,00h,17h,01h,aeh,03h,f8h,03h,ffh,04h,46h,0ah
    db   66h,0ah,76h,0ah,90h,0ah,97h,0ah,a8h,0ah,b5h,0ah,cfh,0ah
    db   d6h,0ah,e2h,0ah,e9h,a1h,0dh,00h,1bh,01h,b8h,03h,fbh,04h
    db   03h,04h,42h,04h,49h,0Ah,6Fh,0Ah,93h,0ah,7ah,0ah,b1h,0ah
    db   d2h,0ah,e5h,c2h,0bh,00h,93h,00h,9eh,00h,a4h,00h,b8h,03h
    db   6ah,04h,06h,04h,65h,04h,99h,05h,fah,06h,05h,c3h,02h,04h
    db   12h,c4h,02h,00h,c4h,c5h,03h,00h,cdh,01h,42h,c6h,02h,03h
    db   69h,c7h,04h,00h,d6h,01h,4bh,02h,00h,c8h,04h,00h,dfh,02h
    db   09h,02h,18h,cah,02h,00h,fch,cbh,02h,01h,0fh,cch,03h,00h
    db   e8h,0dh,f3h,cfh,02h,04h,0ch,cdh,05h,03h,9ah,03h,ach,01h
    db   96h,02h,27h,20h,02h,03h,9bh,42h,04h,03h,9ch,01h,98h,02h
    db   29h,00h,06h,03h,adh,fah,02h,00h,00h,00h,01h,00h,02h,43h
    db   02h,03h,aeh,40h,02h,01h,97h,60h,02h,02h,28h,42h,05h,fah
    db   03h,fah,05h,fah,07h,fah,17h,08h,02h,fah,04h,70h,02h,fah
    db   06h,f0h,02h,fah,16h,ffh,04h,80h,f0h,80h,f2h,80h,f4h

    org  $4fff
.footer   db   ffh

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

BANDAI SUPER VISION 8000を最近知りました。

www.youtube.com

ハードウェア構成がPC-6001そっくりではないですか!

fuckin.rash.jp

コンバーターを作成してみます。キーボード[1][2][←][→][SPC][RET]を使います。ジョイスティック1にも対応しました。

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, 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
Rom:
    ld   hl, 5000h
    ld   de, 0000h
    ld   bc, 1000h
    ldir
Vector:
    ld   a, fah
    ld   i, a
    ld   a, 42h
    ld   (fa03h), a
    ld   (fa05h), a
    ld   (fa07h), a
    ld   (fa17h), a
    ld   a, 00h
    ld   (fa02h), a
    ld   a, 08h
    ld   (fa04h), a
    ld   a, 70h
    ld   (fa06h), a
    ld   a, f0h
    ld   (fa16h), a
SoundPatch:
    ld   a, a0h
    ld   (0017h), a
    ld   (01aeh), a
    ld   (03f8h), a
    ld   (03ffh), a
    ld   (0446h), a
    ld   (0a66h), a
    ld   (0a76h), a
    ld   (0a90h), a
    ld   (0a97h), a
    ld   (0aa8h), a
    ld   (0ab5h), a
    ld   (0acFh), a
    ld   (0ad6h), a
    ld   (0ae2h), a
    ld   (0ae9h), a
    ld   a, a1h
    ld   (001bh), a
    ld   (01b8h), a
    ld   (03fbh), a
    ld   (0403h), a
    ld   (0442h), a
    ld   (0449h), a
    ld   (0a6fh), a
    ld   (0a93h), a
    ld   (0a7ah), a
    ld   (0ab1h), a
    ld   (0ad2h), a
    ld   (0ae5h), a
VramPatch:
    ld   a, c2h
    ld   (0093h), a
    ld   (009eh), a
    ld   (00a4h), a
    ld   (00b8h), a
    ld   (036ah), a
    ld   (0406h), a
    ld   (0465h), a
    ld   (0499h), a
    ld   (05fah), a
    ld   (0605h), a
    ld   a, c3h
    ld   (0412h), a
    ld   a, c4h
    ld   (00c4h), a
    ld   a, c5h
    ld   (00cdh), a
    ld   (0142h), a
    ld   a, c6h
    ld   (0369h), a
    ld   a, c7h
    ld   (00d6h), a
    ld   (014bh), a
    ld   (0200h), a
    ld   a, c8h
    ld   (00dfh), a
    ld   (0209h), a
    ld   (0218h), a
    ld   a, cah
    ld   (00fch), a
    ld   a, cbh
    ld   (010fh), a
    ld   a, cch
    ld   (00e8h), a
    ld   (0df3h), a
    ld   a, cfh
    ld   (040ch), a
    ld   a,ffH
    ld   (80f0H), a
LRPatch:
    ld   a, cdh
    ld   (039ah), a
    ld   a, 20h
    ld   (039bh), a
    ld   a, 42h
    ld   (039ch), a
PadPatch:
    ld   a, cdh
    ld   (03ach), a
    ld   a, 00h
    ld   (03adh), a
    ld   a, 43h
    ld   (03aeh), a
StartPatch:
    ld   a, cdh
    ld   (0196h), a
    ld   a, 40h
    ld   (0197h), a
    ld   a, 42h
    ld   (0198h), a
GameOverPatch:
    ld   a, cdh
    ld   (0227h), a
    ld   a, 60h
    ld   (0228h), a
    ld   a, 42h
    ld   (0229h), a

    ld   hl, c000h
    ld   de, c001h
    ld   bc, 01ffh
Mode:
    ei
    call JOYS
    ld   a, (80f0h)
    cp   ffh
    jr   nz, Keys
    ld   a, (80f4h)
    cp   80h
    jr   nz, Mode
Keys:
    ld   (hl), 84h
    cp   31h
    jr   z, Run
    ld   (hl), 86h
    cp   32h
    jr   z, Run
    ld   (hl), dch
    cp   33h
    jr   z, Run
    ld   (hl), deh

Run:
    ldir
    jp   0003h

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
Space:
    ld   a, (80f2h)
    bit  7, a
    jr   z, Left
    ld   a, 80h
    ld   (80f4h), a
Left:
    ld   a, (80f2h)
    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   039ah

Counter:
    org  $4270
    di
    push af
    ld   a, (80feh)
    add  a, 20h
    ld   (80feh), a
    cp   00h
    jp   z, 003ah
    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   (80f4h), a
JOYR:
    ld   a, b
    bit  3, a
    jr   z, JOYL
    ld   a, 10h
    jr   JOYE
JOYL:
    bit  2, a
    jr   z, JOYN
    ld   a, 20h
    jr   JOYE
JOYN:
    ld   a, 00h
JOYE:
    ld   (80f2h), a
    pop  bc
    ret

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

Shot1:
    org  $4300
    push af
    call JOYS
    pop  af
    cp   eeh
    jr   nz, Pad2
    ld   a, (80f4h)
    cp   80h
    jr   nz, Shot0
    ld   a, ffh
    ld   (80f0h), a
    ld   (80f4h), a
    ld   a, 11h
    ret
Shot0:
    ld   a, (80f0h)
    cp   20h
    jr   nz, Pad1
    ld   a, ffh
    ld   (80f0h), 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

title:    db   'BEAMGALAXIAN:?    '
color1:   db   '1:SCREEN3:COLOR,,1'
color2:   db   '2:SCREEN3:COLOR,,2'
color3:   db   '3:SCREEN4:COLOR,,1'
color4:   db   '4:SCREEN4:COLOR,,2'

    org  $4fff
.footer   db   ffh