見出し画像

ChatGPTにZ80アセンブラコードを書かせコンパイルさせてみた

結果:それっぽいのを出力したけど、結果はめちゃくちゃでした。

昔、NEC PC-8801mk2 SRというパソコン(マイコン)でプログラムを書いていた事を思い出したので、ChatGPTにいろいろ聞いてみました。

このパソコンはZ80という8bitのCPUを2個搭載していて、メインのCPUに加え、フロッピーディスクの制御用に使われていたのです。これらについてもChatGPTさんはご存知、軽々と答えてくれ、2つのCPU間での転送方法(DMA転送)や、ハンドシェイクと呼ばれる手法についても解説してくれました。すごいなぁ。

もしやと思って、ディスクの指定セクターを読み込むプログラムをアセンブラで書かせてみたら、それっぽいのが出てきました。こんな昔の機械のプログラムを書いてくれる事に驚き。
(フロッピーディスクはその円盤の円周に沿ってトラック単位にデータが記録されて、更にそのトラックはセクターに分割されています。)

いろいろコードを吐かせてみたあと、こんな指示を出してみました。

自分「先ほどのアセンブラコードをZ80のバイナリにコンパイルして、16進のテキストでダンプして」
ChatGPT「アセンブラコードをZ80のバイナリに変換するには、Z80アセンブラを使用する必要があります。オンラインで利用可能なZ80アセンブラツールを使用して、アセンブラコードをバイナリにコンパイルし、16進のテキスト形式でダンプすることができます。以下にサンプルコードを示します。

アセンブラコード:」

HOOKED_SECTOR_READ:
  PUSH BC
  PUSH DE
  PUSH HL
  LD   HL, 40h
  LD   (46h), HL
  LD   HL, BUFFER
  LD   DE, CACHE
  LD   A, (IX+4)
  LD   B, A
  AND  0F0h
  RRCA
  RRCA
  RRCA
  RRCA
  ADD  A, A
  LD   C, A
  LD   A, B
  AND  0Fh
  OR   C
  CP   CACHE_SIZE
  JR   C, CACHE_HIT
  CALL CACHE_MISS
  JR   READ_DONE

CACHE_HIT:
  LD   A, (HL)
  CP   B
  JR   NZ, CACHE_MISS
  INC  HL
  LD   A, (HL)
  CP   (IX+5)
  JR   NZ, CACHE_MISS
  INC  HL
  LD   DE, BUFFER
  LD   BC, TRACK_SIZE

READ_DONE:
  POP  HL
  POP  DE
  POP  BC
  JP   (46h)

ChatGPT「Z80アセンブラツールでコンパイルして、16進のテキスト形式でダンプすると、以下のような結果になります。」

21 40 00 36 46 77 46 11 00 80 7A 0F CB 0F CB
0F CB 0F C6 02 4F 48 81 FE 10 DA 0A 80 CD 1A 80
18 07 7E B9 FE 00 C2 0A 80 23 7E B9 FE 05 C2 0A
80 23 11 00 80 01 00 08 ED 52 3E 80 D3 0B DB 0B
E6 80 C2 D6 80 C9 3A 40 00 B8 46 7D B8 4E FE 05
CA D6 80 23 11 00 80 01 00 20 ED B0 C9

本当ですか・・・それっぽいバイナリがでてきたんですけど・・・汗
確認のために、アセンブラの横にバイナリを並べてと指示してみました。

自分「このダンプをさっきのアセンブラコード、それぞれの行との対応がわかる様にコードの左側に表示して」
ChatGPT「以下に、先ほどのアセンブラコードと16進ダンプの対応を示します。左側にはアセンブラコードの行番号を、右側には対応する16進ダンプを表示しています。」

 1: HOOKED_SECTOR_READ:
 2:   PUSH BC            21 40 00
 3:   PUSH DE            36 46
 4:   PUSH HL            77
 5:   LD   HL, 40h       46
 6:   LD   (46h), HL     11 00 80
 7:   LD   HL, BUFFER    7A 0F
 8:   LD   DE, CACHE     CB 0F CB 0F CB 0F
 9:   LD   A, (IX+4)     C6 02
10:   LD   B, A          4F
11:   AND  0F0h         48
12:   RRCA              81
13:   RRCA              FE 10
14:   RRCA              DA 0A 80
15:   RRCA              CD 1A 80
16:   ADD  A, A         18 07
17:   LD   C, A          7E
18:   LD   A, B          B9
19:   AND  0Fh          FE 00
20:   OR   C             C2 0A 80
21:   CP   CACHE_SIZE    23
22:   JR   C, CACHE_HIT  7E
23:   CALL CACHE_MISS    B9
24:   JR   READ_DONE     FE 05
25:
26: CACHE_HIT:
27:   LD   A, (HL)       7D
28:   CP   B             B8
29:   JR   NZ, CACHE_MISS FE 05
30:   INC  HL            CA D6 80
31:   LD   A, (HL)       23
32:   CP   (IX+5)        11 00 80
33:   JR   NZ, CACHE_MISS 01 00 20
34:   INC  HL            ED B0
35:   LD   DE, BUFFER    C9
36:   LD   BC, TRACK_SIZE
37:
38: READ_DONE:
39:   POP  HL            3A 40 00
40:   POP  DE            B8
41:   POP  BC            46
42:   JP   (46h)         C9

ChatGPT「16進ダンプの各行の右側には、対応するアセンブラ命令が簡単に説明されています。このようにして、アセンブラコードと16進ダンプの対応を示すことができます。」

C9が最後にくるあたり、なんかそれっぽい様にも見えたけど。こうしてみると、めちゃくちゃ笑
命令とバイナリの対応がバラバラです。

とはいえ、今後こういうのもできる様に進化するのかもしれないし。もしくは、AIが自分でコンパイラとかのツールを起動してバイナリを取得すればいいだけの話なので、何もそこまで進化する必要も無いよなぁ、とか、いろいろ思ったのでした。


他にも、いろいろなアセンブラコードを書かせてみました。
サブシステムを呼び出す割り込みINT 86h、サブシステム側でその割り込みをフック(制御を奪いとる)コード、いろいろ書いてくれて、なんか懐かしい。
こんな古い資料まで学習してくれていたのだなと、嬉しい驚きです。

フロッピーディスクを制御するチップ、μPD765Aだったと思うのですが。
それを呼び出して1トラックを一括で読み込み、キャッシュするプログラムも書かせてみました。
これは自分が高校生の頃、夏休みに書いたコードだったので、それを思いだしChatGPTで試行。
ものの数秒で次々とそれっぽいコード出力してくる・・・驚きです。

これらのコードが動くかは確認しませんでしたが、それなりに参考になるのでは。すごく・・・それっぽいので。(無責任)
昔を思い出したり、なんだこのコード無茶苦茶じゃないかと、いろいろツッコミを入れて楽しめたという話でした。

いいなと思ったら応援しよう!

この記事が参加している募集