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で試行。
ものの数秒で次々とそれっぽいコード出力してくる・・・驚きです。
これらのコードが動くかは確認しませんでしたが、それなりに参考になるのでは。すごく・・・それっぽいので。(無責任)
昔を思い出したり、なんだこのコード無茶苦茶じゃないかと、いろいろツッコミを入れて楽しめたという話でした。