ポケコンのエミュレータをみつけたので、試してみることにした。
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
実行した結果は以下の通り。
長いので、実行結果は次のページで。
 続きを読む →