2019-03-24 21:07 — asano
MC68kボード復活作戦のために当時の開発環境を引っ張り出しました。今回はそれについて書いてみたいと思います。
まずは使用したアセンブラです。
CP/M-68Kが動いてからは付属のアセンブラ・Cコンパイラを使用しましたが、それまではPC-8001mk2上でクロスアセンブラを使用していました。『I/O』1986年2月号掲載のクロスアセンブラです。
これはN BASIC上で動作するもので、ソースは次のようにBASICのエディタを流用して入力します。
10 "loop: bra loop
BASICの文法的には間違っているので「run」すれば当然エラーになりますが、文字列の形式になっているのでそのままメモリに格納されます。アセンブラはそれを読んでアセンブルするというわけです。
これはディスク無しで動作するものなのでアセンブラ本体・ソース・オブジェクト・シンボルテーブルなどすべてがRAM上になければなりません。ソースとオブジェクトはオーバラップさせることもできますが、一度アセンブルするとソースが破壊されます。
少しでもメモリを節約するためにソースは切り詰めていました。
- コメントは無し
- ラベルは短く:どうせ先頭から6文字しか識別されません。
- インデント無し
それでもメモリが足りなくなり、RAMエリア拡大を行ないました。
PC-8001mk2のN BASICモードでのメモリマップは次のようになっています。
- 0000H~5FFFH:N BASIC ROM
- 6000H~7FFFH:未使用
- 8000H~0E9FFH:フリーエリア
- 0EA00H~0FFFFH:N BASIC ワークエリア
0000H~7FFFHには普段使われない裏RAMがあるので、これを6000H~7FFFHに出現させられれば8kBフリーエリアが増やせる可能性があります。残念ながら部分的に切り替えることはできないので、次のようなプログラムを実行していました。
1/ 0 : CPU Z80
2/ 0 :
3/ FF40 : ORG 0FF40H
4/ FF40 :
5/ FF40 : 21 00 00 LD HL,0000H
6/ FF43 : 11 00 00 LD DE,0000H
7/ FF46 : 01 00 60 LD BC,6000H
8/ FF49 : 3E 10 LD A,10H
9/ FF4B : D3 E2 OUT (0E2H),A
10/ FF4D : ED B0 LDIR
11/ FF4F : 3E 11 LD A,11H
12/ FF51 : D3 E2 OUT (0E2H),A
13/ FF53 : 21 00 60 LD HL,6000H
14/ FF56 : C3 E9 17 JP 17E9H
15/ FF59 :
当時はこの程度わざわざアセンブラなど使っていません。頭の中でアセンブルできていましたし、暗記していた時期もあります。
5~10行目はBASIC ROMの内容を同アドレスの裏RAMにコピーし、11,12行目で裏RAMに切り替えます。これ以降はBASICのエリアも書き込めるので壊さないように注意する必要があります。13,14行目でフリーエリアの開始アドレスを6000Hに変更します。
これでしばらく時間が稼げたのですが、Tiny BASICの拡張が続いてまた足りなくなりました。
しかたなくTiny BASICのソースを3分割したのですが、アブソリュートアセンブラなので相互参照は面倒なことになりました。
その後、CP/M-68Kを移植してからはメモリの制限も事実上無く、分割アセンブルも自由にできるようになり、この環境はまったく使わなくなりました。
コメント
裏RAM
N-BASICをシャドウRAMにしたのですね。そういう目的ではないにせよ。(笑)
Re: 裏RAM
RAMにしてもウエイトは変わらなかったと思いますね。
PC-8001は16kBと32kBでRAM開始アドレスが変わったので開始アドレスを変更するルーチンがROMに入っていて簡単に切り替えられたのです。
コメントを追加