ポケコンのエミュレータをみつけたので、試してみることにした。
Linux/Windows/MacOSX用ソフトウェアから「g800win32.0.10.14.zip」(エミュレータ)と「copyrom.zip」(ROM吸出し)でPC上で動かすことに成功。
各ページのROMのアドレス0xC000-0xFFFF内容を0x1000-0x4FFFに転送して、それをHEXファイル(拡張子はTXT)として吸い出してエミュレータで動かすものだが、HEXファイルをバイナリにして中身をざっと覗いたところ、どうやら「rom14.txt」にPICのINIファイルが存在してるようなので、ちょっと調べてみた。
もう10年以上前のポケコンで、わざわざ制限付きのアセンブラ環境でPICのプログラムなんてする人なんてもういないだろうけど、ネットで調べてもあまり情報がなく、なんとなく気になったので調べてみる。
0x208DのところからINCファイルの一覧がある。
INCファイル定義部分
00010203 04050607 08090A0B 0C0D0E0F 0123456789ABCDEF 02080 075049 .PI 02090 432E494E 433ED10B 50313646 3632372E C.INC>..P16F627. 020A0 494E43CB D10A5031 36463833 2E494E43 INC...P16F83.INC 020B0 F4D60A50 31364638 342E494E 43F4D60B ...P16F84.INC... 020C0 50313646 3834412E 494E43F4 D60B5031 P16F84A.INC...P1 020D0 36463632 382E494E 43CBD10B 50313646 6F628.INC...P16F 020E0 3837302E 494E43CB D80B5031 36463837 870.INC...P16F87 020F0 312E494E 4394DE0B 50313646 3837322E 1.INC...P16F872. 02100 494E43DF E40B5031 36463837 332E494E INC...P16F873.IN 02110 4334EB0B 50313646 3837342E 494E432D C4..P16F874.INC- 02120 F30B5031 36463837 362E494E 4334EB0B ..P16F876.INC4.. 02130 50313646 3837372E 494E432D F3 P16F877.INC-.
構成としては、
ファイル名長さ(1バイト)+ファイル名(可変長)+参照先ROMアドレス下上(2バイト)
となっているようなので、わかりやすく並べなおす。
長 P 1 6 F x x x . I N C 下上 ファイル名 参照先 転送後読み替え +- +-+-+-+- +-+-+- +-+-+-+- +-+- ------------ ---- ---- 07 504943 2E494E43 3ED1 PIC.INC D13E -> 213E 0B 50313646 363237 2E494E43 CBD1 P16F627.INC D1CB -> 21CB 0A 50313646 3833 2E494E43 F4D6 P16F83.INC D6F4 -> 26F4 0A 50313646 3834 2E494E43 F4D6 P16F84.INC D6F4 -> 26F4 0B 50313646 383441 2E494E43 F4D6 P16F84A.INC D6F4 -> 26F4 0B 50313646 363238 2E494E43 CBD1 P16F628.INC D1CB -> 21CB 0B 50313646 383730 2E494E43 CBD8 P16F870.INC D8CB -> 28CB 0B 50313646 383731 2E494E43 94DE P16F871.INC DE94 -> 2E94 0B 50313646 383732 2E494E43 DFE4 P16F872.INC E4DF -> 34DF 0B 50313646 383733 2E494E43 34EB P16F873.INC EB34 -> 3B34 0B 50313646 383734 2E494E43 2DF3 P16F874.INC F32D -> 432D 0B 50313646 383736 2E494E43 34EB P16F876.INC EB34 -> 3B34 0B 50313646 383737 2E494E43 2DF3 P16F877.INC F32D -> 432D
マニュアルに書かれている以外にも対応しているPICがあるようだ。
ROMの内容が0xC000-0xFFFF内容を0x1000-0x4FFFに転送されているため、参照先のアドレスも読み替えてPIC.INCの参照先(0x213E )を見てみる。
PIC.INCファイル
00010203 04050607 08090A0B 0C0D0E0F 0123456789ABCDEF 02130 0E57 .W 02140 00000000 00000000 00460000 00000000 .........F...... 02150 00010049 4E444600 00000000 00544D52 ...INDF......TMR 02160 30000000 00010050 434C0000 00000002 0......PCL...... 02170 00535441 54555300 00030046 53520000 .STATUS....FSR.. 02180 00000004 00504F52 54410000 00050050 .....PORTA.....P 02190 4F525442 00000006 0050434C 41544800 ORTB.....PCLATH. 021A0 000A0049 4E54434F 4E00000B 004F5054 ...INTCON....OPT 021B0 494F4E5F 52810054 52495341 00000085 ION_R..TRISA.... 021C0 00545249 53420000 008600 .TRISB.....
どうやら、
1個目:定義数(1バイト)+定数名(8バイト)+値(1バイト)
2個目以降:0x00 or 0x01(1バイト)+定数名(8バイト)+値(1バイト)
と10バイトの固定長になっているようだ。
一つ一つ手作業で変換するのも面倒なので、ポケコンでBASICでプログラムを組んでみる。
前提条件としては、copyromでAレジスタで0x14を指定した後、ROMの内容を0xC000-0xFFFFから0x1000-0x4FFFに転送済みになっていること。
PCとポケコンを通信ケーブルでつないでTeraTermなどでデータを受信できる状態であること。
定数定義吸出しプログラム
100OPEN "COM1:" 110INPUT "ADDRESS: ";AD$ 120IF AD$="END" OR AD$="EXIT" THEN PRINT "==END==":CLOSE :END 130DC= PEEK ( VAL ("&H"+AD$)) 140PRINT #1,"" 150PRINT #1,"ADD:"+AD$ 160PRINT #1,"CNT:"+ STR$ DC 170PRINT #1," LABEL VAL" 180PRINT #1,"---- -------- ----" 190FOR LC=1 TO DC 200PP$="" 210PB$="" 220PP$= RIGHT$ (" "+ STR$ ( PEEK ( VAL ("&H"+AD$)+(LC-1)*10)),4)+" " 230FOR C=1 TO 8 240 DT= PEEK ( VAL ("&H"+AD$)+(LC-1)*10+C) 250 IF DT>=&H30 AND DT <&H7F THEN PP$=PP$+ CHR$ DT ELSE PP$=PP$+ " " 260NEXT 270PB$= " &H"+ RIGHT$ ("0"+ HEX$ ( PEEK ( VAL ("&H"+AD$)+9+(LC-1)*10)),2) 280PRINT #1,PP$;PB$ 290NEXT 300PRINT #1,"==== ======== ====" 310PRINT #1,"" 320GOTO 110