マルチカートリッジから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モニタからロードします。
>bin2io.exe bg 4000 beamgalaxian.rom beamgalaxian.p6 >p6towav.exe -f io beamgalaxian.p6 beamgalaxian.wav