セミグラフィックを使ったゲームを作りたい、と思い調べたことのメモになります。
ますはメモリマップを理解しました。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
サンプルプログラム
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