初代PC-6001(32K)でセミグラフィック

セミグラフィックを使ったゲームを作りたい、と思い調べたことのメモになります。

ますはメモリマップを理解しました。8000-81FFがアトリビュート、8200-83FFが画面データ。

http://p6ers.net/hashi/furoku2.html

SCREEN1のときアトリビュートは20Hですが、SCREEN2では60Hで埋められます。

SCREEN2,1,1:CONSOLE0,16,0,0:COLOR1,0,1:CLS

カラー0は黒でカラー1~4が2セットあります。2セット目ではアトリビュートは62Hで埋められます。

SCREEN2,1,1:CONSOLE0,16,0,0:COLOR1,0,2:CLS

つまりアトリビュートと画面データをうまくいじれば、SCREEN1の文字、SCREEN2のカラー合計9色を混在させることがでます。

アトリビュートは画面データと1対1で対応していて32x16なので、セミグラフィックの64x48ドットは2x3ドット毎に指定することになります。bit 01でカラー1~4の指定、アトリビュートでカラーセット(60H or 62H)の指定。

 ++
+23
+45
+67

これを考えながらプログラムするのはきついので、PCGライブラリーを改造してセミグラフィックライブラリーをつくってみました。

http://www.tiny-yarou.com/pcgp6exec.html

説明はほぼ上記サイトのままですが、以下をセミグラフィックに対応してみました。

EXEC &HDB9D …キャラクターデータセット 
・指定した番号のキャラクターデータを16進文字列で定義します。
・DATA文で、キャラ番号と文字列を指定してください。RESTORE文も有効です。
・キャラ番号は 0~255までです。
・キャラクターのサイズは6x6ドット、定義文字列は必ず16文字(<1>~<8>)になります。

<1>カラー(00、40、80、C0)
<2>アトリビュート(00、60、62)
<3><4><5>
 ++ ++ ++
+23 23 23
+45 45 45
+67 67 67

<6><7><8>
+23 23 23
+45 45 45
+67 67 67

サンプルプログラム

f:id:tanam:20160619064001p:image:w360

10 REM TINY PAKPAK MONSTER --- 2016 OCHIXN
20 REM PC-6001(32K) PAGE 1           TANAM
30 CLEAR 200,&HD000
1020 SCREEN1,1,1:COLOR1,0,1:CONSOLE0,16,0:CLS
1030 LOCATE14,4:PRINT"TINY";:LOCATE9,6:PRINT"PAKPAK MONSTER";
1040 LOCATE11,8:PRINT"OCHIXN2016";
1050 GOSUB 50000
1060 SCREEN2,1,1:CONSOLE0,16,0:CLS
1070 EXEC&HDB00
1080 FORI=0TO1:EXEC&HDB9D:NEXTI
1140 POKE&HFC00,0:POKE&HFC02,14:POKE&HFC04,0:EXEC&HDB51
1150 POKE&HFC00,0:POKE&HFC02,6:POKE&HFC04,2:EXEC&HDB51
1160 POKE&HFC00,0:POKE&HFC02,22:POKE&HFC04,2:EXEC&HDB51
1170 POKE&HFC00,1:POKE&HFC02,14:POKE&HFC04,5:EXEC&HDB51
1180 POKE&HFC00,0:POKE&HFC02,2:POKE&HFC04,7:EXEC&HDB51
1190 POKE&HFC00,1:POKE&HFC02,11:POKE&HFC04,7:EXEC&HDB51
1200 POKE&HFC00,1:POKE&HFC02,14:POKE&HFC04,7:EXEC&HDB51
1210 POKE&HFC00,1:POKE&HFC02,17:POKE&HFC04,7:EXEC&HDB51
1220 POKE&HFC00,0:POKE&HFC02,26:POKE&HFC04,7:EXEC&HDB51
1230 POKE&HFC00,1:POKE&HFC02,14:POKE&HFC04,9:EXEC&HDB51
1240 POKE&HFC00,0:POKE&HFC02,6:POKE&HFC04,12:EXEC&HDB51
1250 POKE&HFC00,0:POKE&HFC02,22:POKE&HFC04,12:EXEC&HDB51
1260 POKE&HFC00,0:POKE&HFC02,14:POKE&HFC04,14:EXEC&HDB51
1280 GOTO 1280
50000 REM-------------
50010 REM PCG CONTROL
50020 REM-------------
50030 RESTORE 50100
50040 FOR I=&HDB00 TO AD+&HDC2F+48
50050 READ A$:POKE I,VAL("&H"+A$)
50060 NEXT
50070 RETURN
50100 DATA 21,00,00,22,00,FC,22,02,FC,22,04,FC,21,00,D0,22
50110 DATA 08,FC,21,00,D8,22,0A,FC,21,00,82,22,06,FC,AF,2A
50120 DATA 08,FC,5D,54,13,77,01,FF,07,ED,B0,2A,0A,FC,5D,54
50130 DATA 13,77,01,FF,02,ED,B0,C9,0E,18,79,3D,32,04,FC,06
50140 DATA 20,78,3D,32,02,FC,C5,CD,51,DB,C1,10,F4,0D,20,EA
50150 DATA C9,2A,04,FC,29,29,29,29,29,E5,ED,4B,02,FC,09,ED
50160 DATA 4B,0A,FC,09,3A,00,FC,77,E1,00,00,00,ED,4B,02,FC
50170 DATA 09,ED,4B,06,FC,09,EB,ED,4B,08,FC,2A,00,FC,29,29
50180 DATA 29,09,EB,1A,47,13,1A,4F,13,1A,B0,77,23,13,C3,23
50190 DATA DC,E1,5E,23,56,EB,18,09,1E,06,C3,01,04,2A,5C,FF
50200 DATA 23,7C,B5,28,F3,E5,23,23,23,23,7E,FE,83,20,E2,23
50210 DATA CD,06,0E,7A,B7,C2,55,07,EB,29,29,29,ED,4B,08,FC
50220 DATA 09,EB,7E,FE,2C,C2,EA,03,23,06,08,7E,D6,30,DA,EA
50230 DATA 03,FE,0A,38,17,D6,07,FE,0A,DA,EA,03,FE,10,38,0C
50240 DATA D6,20,FE,0A,DA,EA,03,FE,10,D2,EA,03,07,07,07,07
50250 DATA 4F,23,7E,D6,30,DA,EA,03,FE,0A,38,17,D6,07,FE,0A
50260 DATA DA,EA,03,FE,10,38,0C,D6,20,FE,0A,DA,EA,03,FE,10
50270 DATA D2,EA,03,81,12,23,13,10,B2,E1,5E,23,56,EB,2B,22
50280 DATA 5C,FF,C9,1A,B0,77,23,13,1A,B0,77,C5,01,1E,00,09
50290 DATA 13,C1,1A,B0,77,23,13,1A,B0,77,23,13,1A,B0,77,79
50300 DATA FE,00,C8,11,00,02,ED,52,77,2B,77,2B,77,11,1E,00
50310 DATA ED,52,77,2B,77,2B,77,C9,00,00,00,00,00,00,00,00
60000 REM-------------
60010 REM CHARACTER DATA
60020 REM-------------
60030 DATA 0,00003F3F3F3F3F3F
60040 DATA 1,00623F3F3F3F3F3F