プチコンまとめArchive

PTCファイル、mkIIのQRコード仕様と内部コード

パンくずリスト

このページの最終更新 : 2020/06/21 (日) 12:48:03

PTCファイルとは?

プチコンmkIIの「SDメモリーカード書き込み」で書き込まれる、拡張子が「.PTC」のファイルです。
「SDメモリーカード書き込み」では、SDカードのルート/private/app/4B4E414A/(mkIIで指定した名前)/ にPTCファイルが書き込まれます。
公式サイトのQRコード変換ツールを使用すると、QRコードに変換できます。
変換したQRコードは、プチコンmkIIの「QRコード読み込み」で読み込むことができます。
非公式のツールもあります。→リンク集

オフセット内容
0x00-0x03PX01(必須)
0x04-0x07PETC~以降のファイルサイズ(バイト数)
0x08-0x0b未使用(任意の値に書き換えてもQRコードに変化なし)
0x0c-0x13ファイル名(余分なバイトはすべて00)
0x14-0x23"PETITCOM"とPETC~以降をつなげた物のMD5ハッシュ値
0x24-PETC~ (データ。リソースごとの説明参照)
  • このうち、ファイルサイズとMD5ハッシュ値は公式のQRコード変換ツールが使用します。
    • 非公式ツールを使用する場合は不要です。
  • PTCファイル内の値はすべてリトルエンディアンなので注意です。

PRG(mkII)

オフセット内容
0x24-0x2fPETC0300RPRG
0x30-0x33パッケージパラメータ 上4Byte
0x34-0x37パッケージパラメータ 下4Byte
0x38-0x3bプログラムのサイズ(末尾の00を含まないバイト数)
0x3c-プログラム本体(1文字→1Byte)
  • プログラムのサイズが4の倍数でないときは、長さが4の倍数になるようにプログラム末尾に0x00が付きます。
  • プログラム本体の後にパッケージリソース(PETC~以降)がパッケージパラメータの一番下のビットのものから順にくっつきます。
  • プログラム本体はCHR$で取得できるものと同じ文字コードで1文字ずつ書かれています。改行は0x0dです。

パッケージパラメータ

  • 上4Byte(下4Byteより前に書かれています。)
    ビットリソース名内容
    b32-b34COL0-2L下画面BG/SP/GRP色
    b35-b36SCU0-1L下画面BGスクリーン
    b37-b38SPS0-1U上画面システム使用スプライト
    b39-b40BGD0-1U上画面システム使用BG
    b41-b42SPS0-1L下画面スプライト
    b43-b44BGD0-1L下画面システム使用BG
    b45-未使用(エラー)
  • 下4Byte
    ビットリソース名内容
    b00-b07SPU0-7上画面スプライト
    b08-b11BGU0-3U上画面BG
    b12BGF0U上画面フォント
    b13-b15COL0-2U上画面BG/SP/GRP色
    b16-b17SCU0-1U上画面BGスクリーン
    b18-b21GRP0-3グラフィック
    b22MEMMEM$中身
    b23-b26SPD0-3下画面パネルアイコン(32x32サイズのスプライト)
    b27-b30BGU0-3L下画面BG
    b31BGF0L下画面フォント
  • SPS1Uはカーソルに使用されます。
  • SPS0Uはおそらく使われていません。
  • BGDは編集画面、キーボード、LOAD/SAVE画面などで使用されるBG。これを編集すれば多少は画面をカスタマイズできます。

PRG(初代)

オフセット内容
0x24-0x2fPETC0100RPRG
0x30-0x33プログラムのサイズ(バイト数/2)
0x34-Xプログラム本体
X -X+3プログラムの行数
X+4-X+71行目の開始位置((位置-0x34)/2)
X+8-X+111行目のサイズ(バイト数/2)
X+12-X+152行目の開始位置((位置-0x34)/2)
X+16-X+192行目のサイズ(バイト数/2)

...(以下、行数分繰り返す。)
(Xはプログラムの終端位置です。)

  • (投稿者が初代プチコンを持っていないので、正確ではない可能性があります。)
  • 初代プチコンからmkIIへSENDFILEし、そのままmkIIでQRコード書き出しを行うと得られます。
  • しかしmkIIで一度SAVEするとmkII形式のフォーマットへ変換されてしまいます。
  • このWikiで1つだけ発見しました。Toukou/RND関数を使わないサイコロ 他にもあるかも。
  • このフォーマットはPTCUtilitiesで開くことができません。
  • このフォーマットのファイルは、初代へSENDFILEで送り返せるはずです。
  • 1文字2バイトの内部コード(後述)で記録されています。
  • また、命令、システム変数もすべて2バイトのコードになっています。
  • 改行コード(000d)はありますが、表示だけであり、改行されません。
  • また、プログラムは1行目から始まっていません。
    • プログラムの後にある行数、開始位置、サイズの情報から行の順番を復元します。
    • 行末が改行(000d)で終わっていない場合、行末の文字が(000d)に置き換えられます。
  • 例(PETC0100RPRGの直後から)
    04 00 00 00 1f e0 0d 00 1e e0 0d 00 02 00 00 00
    02 00 00 00 02 00 00 00 00 00 00 00 02 00 00 00
    プログラムサイズ=4 (8バイト)
    プログラム本体 PRINT(改行)CLS(改行)
    行数=2
    1行目:位置=2,サイズ=2(4バイト)→1e e0 0d 00→CLS(改行)
    2行目:位置=0,サイズ=2(4バイト)→1f e0 0d 00→PRINT(改行)

MEM

オフセット内容
0x24-0x2fPETC0200RMEM
0x30-0x22f文字列(1文字2バイトの内部コード)余りは00
0x230-0x233文字列長さ
  • 長さは0~256なので実質最後の2バイトは常に0x00です。

GRP

オフセット内容
0x24-0x2fPETC0100RGRP
0x30-0xc02fパレット番号(1ドット→1Byte)
  • GRPリソースは単純に左上→右下に書き込まれているのではありません。
    • 以下、8x8ドットを1キャラ、8x8キャラを1ブロックと呼びます。
    • 1キャラは左上ドットから右に進み、右端まで行くと1段下に進みます。
    • 1ブロックも同様に、一番左上のキャラから右下まで進みます。
    • そしてGRPリソースは4x3ブロックで出来ていて、一番左上のブロックから右に進み、一番右下のブロックまでを順に書き込んでいます。
  • 言葉では分かりにくいのでイメージはこんな感じです。
    GRP_image.png

CHR

オフセット内容
0x24-0x2fPETC0100RCHR
0x30-0x202fパレット番号(2ドット→1Byte)
  • 8x8ドットで1キャラです。
  • 1キャラごとに、左上のドットからから右下へ順に書き込みます。
  • 1ドットは0-15のパレット番号なので、1ドット当たり4bitとなります。
  • しかしリトルエンディアンなので、下位4bitが左のドット、上位4bitが右のドットとなります。

SCR

オフセット内容
0x24-0x2fPETC0100RSCR
0x30-0x202fスクリーンデータ(1キャラ→2Byte)
  • キャラ配置順は、左上の32x32の範囲→右上→左下→右下です。
  • スクリーンデータはBGPUT、BGREAD等で使用するものと同じです。
    ビット内容
    b00-b09キャラ番号(0-1023)
    b10横反転
    b11縦反転
    b12-b15パレット番号(0-15)

COL

オフセット内容
0x24-0x2fPETC0100RCOL
0x30-0x22f色(1色→2Byte)
  • 緑1bit,青5bit,緑5bit,赤5bitで1色16bitです。
  • ただし先頭の緑1bitは真ん中の緑5bitの下の桁です。
  • GBBBBBGGGGGRRRRR (R=赤,G=緑,B=青)
  • (リトルエンディアンなので後半のGGGRRRRRが先に来ます)。
  • 例) 1110100110011111は、
    • 赤248(11111000)
    • 緑100(01100100)
    • 青208(11010000)

プチコンmkII 内部コード

  • PRG(初代)、MEMで使用される文字コードです。
  • 以下はmkIIでの結果です。初代プチコンでは一部異なる結果になる可能性があります。

CHR$文字コード→内部コード

+  
  • 内部コードはプチコン3号の文字コード(Unicode)に近いコードであるということがわかります。
  • ちなみにUnicodeのff01-ff5fは全角英数です。

内部コード→CHR$コード

+  
  • []内はCHR$で取得できる文字コード(16進数)です。
  • 0000は初代PRGでは改行[0d]、MEMでは[00]となります。
  • 0100-01ffについて
    exchr.jpg
    • PTCファイルを編集する以外の方法で入手できません。
    • mkIIでPRGとして保存する際、1文字1バイトに変換するため[20]-[ff],[00]-[1f]に変化してしまいます。
    • しかしMEMリソースで保存すると、失われず残ります。
    • MEMリソースに保存しておけば、いつでもプログラム中で取り出して使用できます。
    • 0100-01ffのMEMリソース作りました。これを使えばいつでも0100-01ffの文字が使えます。(MEM:EXCHR)
      exchrqr.png
  • 3000-30ffについて
    • 濁点、半濁点付きの文字コードがあります。
      • ただし、「ガ」はなぜかありません。また、「ヅ」が2つあります。
      • これらの文字は濁点、半濁点がない状態で表示されます。
      • mkIIでPRG保存すると、次の文字を上書きして濁点、半濁点に変えてしまいます。
  • e000-について
    • 初代PRGリソースの場合のみ、命令、システム変数などを表します。
    • (null)と記したものは何も表示されません。
    • MEMリソースの場合は、ほかの文字コードと同様に扱われます。(下記参照)
  • 上記以外の文字コードは、文字コードの下2桁+0x20の文字が表示されます。
    • しかしASCは0~255の値しか返しません。
    • 複数のコードに同じ文字が割り当てられることになりますが、内部コードが異なるためSyntax Error等を起こします。
    • プログラムに使用する場合は上の「CHR$コード→内部コード」の表にあるコードを使用します。
    • mkIIでPRG保存すると、正規の文字に置き換えられます。

mkIIのQRコード

PTC2QRのソースコードより。

オフセット内容
0x00-0x01PT
0x02QRコードの番号(何枚目か)
0x03QRコードの総枚数
0x04-0x13データのうち、このQRコードにある分のMD5ハッシュ
0x14-0x23データ全体のMD5ハッシュ
0x24-データ

データ

1枚のQRコードに入らない場合、分割される。

オフセット内容
0x24-0x2bファイル名(余分なバイトはすべて00)
0x2c-0x2fリソースタイプ(RPRG,RMEMなど)
0x30-0x330x38以降のサイズ
0x34-0x37PTCファイルのサイズ(0x04-0x07にあったもの)
0x38-PTCのPETC~以降をDeflate圧縮したもの

コメント