So-net無料ブログ作成
  • ブログをはじめる
  • ログイン
English Version
前の5件 | -

CP/M-68K シミュレータ [68K]

 「3チップ構成Pic24CPMマイコン(CP/M起動までの作業まとめ」の記事に3チップ構成のワンボードマイコンで CP/M-80 を動作させる手順を書きましたが、CP/M系はソフトの入手性がいいので他の CP/M にも興味が沸き、CP/M-68K Simulatorのwebページの情報を参考に CP/M-68K のシミュレータを動かしてみました。

 MusashiというLinux上で動く MC68000 のエミュレータを使ってCP/M-68Kを動作させているとのことです。

 このCP/M-68KシミュレータはWindows対応ではないですが、Windows10であればWSL(Windows Subsystem for Linux)が使えるので以前のように VM上でLinuxを動かしたりCygwinを入れたりしなくてもWSL上で簡単に動かすことができます。

 動作させるまでの手順を簡単にメモしておきます。
  1. Linux環境の準備
     Windows10であれば上記のようにWSLでLinux環境を使えるようになります。
     WSLの設定自体はネット上に豊富に情報があるので(例えばここ)、そちらを参照してください。
     Linux自体も選択肢がありますが私はUbuntsuを導入しています。
     Ubuntsuであれば"sudo apt install gcc"などのコマンドでCコンパイラ環境の導入も簡単です(後述のmakeを起動すると何が足りないか表示されるのでそれを参考に必要なモジュールをインストールする)。

  2. ソースの準備
     上記のCP/M-68K Simulatorのページのリンク先からMusashiCP/M-68K Simulatorのソースファイルをダウンロードします。
     それぞれのファイルを解凍してソースを一つのフォルダにまとめます。
     フォルダ内には下記のファイルが入った状態になります。

    ビルド前のディレクトリの状態
    2018/07/21 17:23 <DIR> . 2018/07/21 17:21 <DIR> .. 2014/04/08 07:36 6,634 m68kconf.h 2001/01/30 09:37 37,535 m68kcpu.c 2001/01/30 09:49 60,715 m68kcpu.h 2001/02/03 10:34 99,849 m68kdasm.c 2001/02/03 11:31 44,972 m68kmake.c 2001/01/29 08:52 13,019 m68k.h 2001/01/29 13:07 225,370 m68k_in.c 2014/04/22 17:36 32,768 simbios.bin 2014/04/22 17:36 5,396 simbios.s 2018/02/05 18:53 21,402 cpmsim.c 2014/04/27 14:07 16,777,216 diskc.cpm.fs 2014/04/17 09:01 1,334 makefile 2014/04/08 07:22 497 sim.h 2018/07/21 17:23 <DIR> obj


  3. CP/M-68Kシミュレータのビルド
     Windows上でLinuxを起動した状態でmakeします。
     WSLの機能によりWindowsのドライブはLinux環境内では /mnt ディレクトリの下にマウンドされた状態に見えます。
     Linux環境で上記のソースを入れたディレクトリに移動した状態でmakeを実行します。

    ビルドの状況
    skyriver@Dospar:/mnt/c/sat/files/src/CPM/CPM68K/BuildTest$ ll total 17092 drwxrwxrwx 1 skyriver skyriver 4096 Jul 21 20:41 ./ drwxrwxrwx 1 skyriver skyriver 4096 Jul 21 18:15 ../ -rwxrwxrwx 1 skyriver skyriver 21402 Feb 5 18:53 cpmsim.c* -rwxrwxrwx 1 skyriver skyriver 16777216 Apr 27 2014 diskc.cpm.fs* -rwxrwxrwx 1 skyriver skyriver 6634 Apr 8 2014 m68kconf.h* -rwxrwxrwx 1 skyriver skyriver 37535 Jan 30 2001 m68kcpu.c* -rwxrwxrwx 1 skyriver skyriver 60715 Jan 30 2001 m68kcpu.h* -rwxrwxrwx 1 skyriver skyriver 99849 Feb 3 2001 m68kdasm.c* -rwxrwxrwx 1 skyriver skyriver 147816 Jul 21 18:38 m68kdasm.o* -rwxrwxrwx 1 skyriver skyriver 13019 Jan 29 2001 m68k.h* -rwxrwxrwx 1 skyriver skyriver 225370 Jan 29 2001 m68k_in.c* -rwxrwxrwx 1 skyriver skyriver 44972 Feb 3 2001 m68kmake.c* -rwxrwxrwx 1 skyriver skyriver 1334 Apr 17 2014 makefile* drwxrwxrwx 1 skyriver skyriver 4096 Jul 21 20:41 obj/ -rwxrwxrwx 1 skyriver skyriver 32768 Apr 22 2014 simbios.bin* -rwxrwxrwx 1 skyriver skyriver 5396 Apr 22 2014 simbios.s* -rwxrwxrwx 1 skyriver skyriver 497 Apr 8 2014 sim.h* skyriver@Dospar:/mnt/c/sat/files/src/CPM/CPM68K/BuildTest$ make gcc -Wall -O2 -c -Iobj -I. cpmsim.c -o obj/sim.o cpmsim.c: In function ‘MC6850_data_write’: cpmsim.c:338:3: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result] write(STDOUT_FILENO, &ch, 1); ^ cpmsim.c: In function ‘read_fig_track’: cpmsim.c:761:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p], 512); ^ cpmsim.c:762:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0xa00], 512); ^ cpmsim.c:763:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0x200], 512); ^ cpmsim.c:764:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0xc00], 512); ^ cpmsim.c:765:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0x400], 512); ^ cpmsim.c:766:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0xe00], 512); ^ cpmsim.c:767:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0x600], 512); ^ cpmsim.c:768:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0x1000], 512); ^ cpmsim.c:769:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0x800], 512); ^ cpmsim.c:770:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result] read(g_disk_fds[2], &g_ram[p+0x1200], 512); ^ In file included from /usr/include/unistd.h:1151:0, from cpmsim.c:67: In function ‘read’, inlined from ‘load_srecords’ at cpmsim.c:739:11: /usr/include/x86_64-linux-gnu/bits/unistd.h:42:9: warning: call to ‘__read_chk_warn’ declared with attribute warning: read called with bigger length than size of the destination buffer return __read_chk_warn (__fd, __buf, __nbytes, __bos0 (__buf)); ^ gcc -Wall m68kmake.c -o obj/m68kmake obj/m68kmake obj m68k_in.c Musashi v3.3 68000, 68010, 68EC020, 68020 emulator Copyright 1998-2000 Karl Stenerud (karl@mame.net) Generated 1962 opcode handlers from 503 primitives gcc -Wall -O2 -c -Iobj -I. m68kcpu.c -o obj/m68kcpu.o gcc -Wall -O2 -c -Iobj -I. obj/m68kops.c -o obj/m68kops.o gcc -Wall -O2 -c -Iobj -I. obj/m68kopac.c -o obj/m68kopac.o gcc -Wall -O2 -c -Iobj -I. obj/m68kopdm.c -o obj/m68kopdm.o gcc -Wall -O2 -c -Iobj -I. obj/m68kopnz.c -o obj/m68kopnz.o gcc -Wall obj/sim.o obj/m68kcpu.o obj/m68kops.o obj/m68kopac.o obj/m68kopdm.o obj/m68kopnz.o m68kdasm.o -o cpmsim skyriver@Dospar:/mnt/c/sat/files/src/CPM/CPM68K/BuildTest$ ll total 17672 drwxrwxrwx 1 skyriver skyriver 4096 Jul 21 20:25 ./ drwxrwxrwx 1 skyriver skyriver 4096 Jul 21 18:15 ../ -rwxrwxrwx 1 skyriver skyriver 591912 Jul 21 20:25 cpmsim* -rwxrwxrwx 1 skyriver skyriver 21402 Feb 5 18:53 cpmsim.c* -rwxrwxrwx 1 skyriver skyriver 16777216 Apr 27 2014 diskc.cpm.fs* -rwxrwxrwx 1 skyriver skyriver 6634 Apr 8 2014 m68kconf.h* -rwxrwxrwx 1 skyriver skyriver 37535 Jan 30 2001 m68kcpu.c* -rwxrwxrwx 1 skyriver skyriver 60715 Jan 30 2001 m68kcpu.h* -rwxrwxrwx 1 skyriver skyriver 99849 Feb 3 2001 m68kdasm.c* -rwxrwxrwx 1 skyriver skyriver 147816 Jul 21 18:38 m68kdasm.o* -rwxrwxrwx 1 skyriver skyriver 13019 Jan 29 2001 m68k.h* -rwxrwxrwx 1 skyriver skyriver 225370 Jan 29 2001 m68k_in.c* -rwxrwxrwx 1 skyriver skyriver 44972 Feb 3 2001 m68kmake.c* -rwxrwxrwx 1 skyriver skyriver 1334 Apr 17 2014 makefile* drwxrwxrwx 1 skyriver skyriver 4096 Jul 21 20:25 obj/ -rwxrwxrwx 1 skyriver skyriver 32768 Apr 22 2014 simbios.bin* -rwxrwxrwx 1 skyriver skyriver 5396 Apr 22 2014 simbios.s* -rwxrwxrwx 1 skyriver skyriver 497 Apr 8 2014 sim.h* skyriver@Dospar:/mnt/c/sat/files/src/CPM/CPM68K/BuildTest$


  4. CP/M-68Kシミュレータの起動
     ビルド時に多少warningが表示されますが、シミュレータは動きました。
     CドライブにはCP/Mの基本的なファイル(アセンブラ等emacsも)が入った状態で起動されます。

    CP/M-68Kシミュレータの起動
    skyriver@Dospar:/mnt/c/sat/files/src/CPM/CPM68K/BuildTest$ ./cpmsim Read 32768 bytes from boot track CP/M-68K(tm) Version 1.2 03/20/84 Copyright (c) 1984 Digital Research, Inc. CP/M-68K BIOS Version 1.0 Simulated system of April 2014 TPA =16251 K C>AUTOST.SUB C>INIT.REL M Do you really want to init disk M ? y C>dir C: RELOC 68K : DUMP 68K : PIP 68K : STAT 68K : INIT REL C: SENDC68 68K : DDT 68K : AS68 68K : CP68 68K : AS68INIT C: C068 68K : C168 68K : AR68 68K : CONFIG 68K : LO68 68K C: MORE 68K : NM68 68K : SIZE68 68K : COPY SUB : CC REL C: CC 68K : AS68SYMB DAT : ED 68K : SID 68K : WHEREIS 68K C: BBYE 68K : UEMACS 68K : F83 BIN : PUTBOOT 68K : AUTOST SUB C: GREEN 68K : MAKE REL : ARC 68K : EMACS 68K : F83 68K C: SPLIT 68K : CPM SYS : MAKE 68K : EMACS HLP : DDT68000 68K C: SID68K 68K : EMACS RC : TAIL 68K : ROBOTS21 68K : PIP REL C: ERAQ 68K : LINK68 68K C>


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

I2Cロガーの製作 [PIC]

 I2Cで接続される複数のセンサのデータを連続的に保存したいことからI2Cロガーを作ってみました。
 パソコンにUSBケーブルで接続し、スクリプトで制御可能な市販されているI2Cインターフェースボックスがありますが、サンプリング周期を一定にして連続してデータを取得するのが困難であることから、このI2Cインターフェースボックスの中身をPIC24FJ64を使った簡単なボードに入れ替えます。

 PIC24FJ上ではpicleコンパイラも動作するのでスクリプト感覚でデータ取得処理を記述できます。
 ファイルへの保存はTeraTermのマクロで実現する予定です。
 回路図は下図のとおりでUSBシリアル変換は安易に市販の変換基板(FT232RL)を使い必要最小限の信号をコネクタに出しています。

回路図


 この程度の回路であれば片面基板で対応可能でCNCルーターでPCB基板を作成しました。ガラエポの両面基板と比べれば難易度はかなり低いですが、後述のように手抜きしてジャンパー接続することに ^^;

 今回もいつものように DesignSparkPCB でパターンを作成しました。

DesignSparkPCBでパターン作成


 次にDesingSparkPCBで出力したガーバーデータを FlatCAM に読ませて、CNC用のNCファイルを作成します。

FlatCAMでのNCファイル作成


 PCB作成の最後の工程として作成したNCファイルを使ってCNCルーターで生基板を切削し、ホームメイドのプリント基板を作ります。

CNCルーターでの生基板の切削


 CNCで切削後の導通チェックではOKでしたが、ソルダーレジスト塗布後、グランドとショート状態のパターンがあったのでパターンカットし、ジャンパーで接続しました^^;
 今回はベーク版の片面基板ということで手抜きしてCNCでの切削後のヤスリ掛け工程を省略してしまったため、レジスト塗布時に切削した溝に残っていた銅層の切りくずでショートしてしまったようです(今後気を付けねば)。
 まぁ、これくらいの回路であれば、PCB製造業者に依頼して何週間か待つよりは、CNCでサクッと作れるので便利です。^^
(汎用基板で作った方が早いけどそれは言わない約束ということで・・・w)

PCB半田面


 部品面は下の写真のとおりです。後述するようにケースがアルミ製なのでケースとの接触防止のためにUSBコネクタの上にマスキングテープを張っています。
 また、OneBitLoaderはコンソール接続用のシリアル通信に対応させた2線式のものを入れています。

PCB部品面


 冒頭で書いたようにケースはI2Cインターフェースボックスのものを流用することにして、コネクタ部とUSB&LED部のキャップを3Dプリンタで作成しました。

コネクタ側のキャップ


USB&LED側のキャップ


 ケースに収めた外観が下の写真です。

ケースに収納した写真


 おまけとして、I2Cでアドレス出力しACK応答の有無で接続されているI2Cセンサのアドレスをスキャンした結果を付けておきます。
 接続しているのは「I2C通信実験 照度センサー」の記事で書いた照度センサです。

I2Cスキャン実行例
:\\ +B000-B670 # Life Game in picle language +B800-BEA5 # I2C check +C000-CAD1 # I2C test Light Sensor(BH1750) :\<$b800 1701 :run 00 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20 : -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- 30 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- :


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

3チップ構成Pic24CPMマイコン(その5)XMODEMでファイル送受信 [Z80]

 「レトロマイコンZ80ボードの構想(その14)CP/MでのWM動作実験」の記事のコメントに書いたようにCP/Mが動作するワンボードマイコンPic24CPMとPCとのファイルのやり取りはSDカード経由では面倒なのでコンソール接続のシリアル通信を利用して XMODEM プロトコルで行うのが便利です。

 上記のコメントにも書いたようにCP/M用の XMODEM 処理のソース(アセンブリ言語)を見つけて使ってみましたが、ある程度サイズの大きな(20KBくらい以上)ファイルをパソコンへ送信する際、私の環境では送信処理がすぐに完了してしまい、うまく動きませんでした(PCからの受信は問題なく動く)

 入手したアセンブリソースを解析して動かしてみるのも面白そうですが、今回は「3チップ構成Pic24CPMマイコン(その4)ZSIDで小文字のシンボルを使う方法その2」の記事に書いたように HI-TECH C でコンパイル時に生成される 小文字を含むシンボル情報を ZSID で使えるようにする ZSID 用のパッチも作ったので HI-TECH C を使ってスクラッチで CP/M 用の XMODEM アプリを作ってみました。パソコン側は TeraTerm の XMODEM 機能を利用します。

 XMODEMのプロトコル自体は ここ に書いてあるようにシンプルなもので実装するのは簡単そうです。

今回、HI-TECH C を使ってみて感じたことは
  • 構造体/共用体に対応
     CP/MのCコンパイラの中では未対応なものが多いですが HI-TECH C では普通に使えます。今回も2バイト変数をバイトに分割する部分でstructとunionを使いました。
  • ループ処理内での"break"に未対応
     for文等のループ内でループから抜け出すための"break"が使えない^^;。switch文では当然"break"が使えます。
     "break"は自作のpicle言語でも最初は未対応でしたが、使い勝手が悪いので途中で追加しています("continue"は未対応ですがなくてもあまり困らない)。
  • ANSI準拠
     CP/M-80用のCコンパイラでは珍しく、ANSI対応していて使い易い。従ってK&Rの構文へのトランスレータも必要ありません。
    ★2018/06/26 追記
     学生のころから「リッチー&カーニハン」と覚えていたのでR&Kと書いたけどK&Rが正解みたいなので修正しました^^;
  • コンパイル速度
     小さなソースでも1分弱程度時間が掛かります。私の環境では今回作成した xmodem.cをコンパイルするのに57秒掛かりました。BDS C のコンパイル速度がうらやましいw。
     因みにpicleコンパイラのコンパイル速度はメチャ速です。
  • ライブラリ
     まだ、ほんの一部しか使っていませんが、toupper()が予期せぬ動作でしたw
    CTYPE.H(23): #define toupper(c) ((c)-'a'+'A')
  • コンパイル後のマシン語
     関数への引数はレジスタ渡しではなくIXレジスタ経由でのアクセスになるので関数中にアセンブリ言語を埋め込む際にアクセスし辛いです。グローバル変数を使った方が実行速度は速そうです。


 以前、LSI-C80の使っていたこともありますが、関数をリカーシブ対応にしない場合には関数内変数を極力レジスタに割り振るという素晴らしいコードを吐き出していました(でもコンパイル速度はかなり遅い)
 今回の XMODEM の初期バージョンではブロック送信でデータ間に隙間が空いてしまうので(シリアル通信速度は38400bps)1文字入出力処理を軽量なBIOS/BDOSコールにしたり、CRC計算をアセンブリ言語での埋め込みにし、隙間なく通信できるようになりました。

 下記は今回開発した XMODEM のソースをパソコン側から受信し、HI-TECH C でコンパイル後、実行ファイルをパソコンへ送信している操作ログです。
 Pic24CPMで使う場合は、OPEスイッチ操作により、エスケープシーケンスOFFの状態で使用してください(ONだとコンソール出力データが変換されるため)

XMODEMアプリ使用例


 尚、今回開発した CP/M-80用の xmodem のC言語ソースと実行ファイルは下記からダウンロード可能です。商用利用以外であれば自由に使用可能です。


★追記 2018/06/25
 xmodemでの転送とWordStarを一緒に使う場合等にエスケープシーケンスのON/OFF設定の変更が面倒なので xmodem 起動時の /p オプションで PUN/RDRディバイス指定可能にしました。(上記の画面キャプチャもアップデートしました)
 PIC24CPMでは /p 指定した場合でもコンソール用のシリアル通信を使いますが、PUNではエスケープシーケンスの変換処理がないので通信データの透過性が保証されます。
 また、RDRではBIOSコールの仕様上、データ有無のステータス確認ができないため、データがない場合にはゼロフラグをONにしてリターンするように拡張しています(普及率は不明ですがネット上に同様に拡張実装している例があったので採用)。


★追記 2018/06/28
 ネット上で昔の雑誌のスキャンデータがアップされているところを見つけ、1991年10月号の「MSX FUN」(表紙には「今月からディスクが付録!」と書いてある)があったので見ていたら「パソ通天国」というコーナーがあってそこに XMODEM についての解説?があった。残念ながらASCIIは一冊も無かった・・



[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(1) 
共通テーマ:趣味・カルチャー

3チップ構成Pic24CPMマイコン(その4)ZSIDで小文字のシンボルを使う方法その2 [Z80]

 「3チップ構成Pic24CPMマイコン(その3)ZSIDで小文字のシンボルを使う方法」の記事でCP/M上でHI-TECH Cを使い ZSID でシンボリックデバッグする上で ZSID がコマンド内の小文字のシンボルを解釈できないという問題があることを書きました。
 その解決方法として ZSID 内部のコマンド入力を大文字変換する処理を無効にするパッチを提案しました。

 しかし、前回の記事の最後に書いたようにコマンドを小文字で入力するとエラーになるという制限がありました。その他にもヘキサ入力時も大文字にする必要がある等、色々使い勝手がよくないのでもう少しきちんと対処することにしました。

 結果から先に書くと下記のパッチ(2ヶ所の書換え)でコマンド入力のシンボル部のみ大文字変換しないようにすることに成功しました (^^)/


ZSIDへの小文字シンボル対応パッチ適用手順
a>ddt zsid.com DDT VERS 2.2 NEXT PC 2900 0100 -s1b6f 1B6F CD 1B70 90 9c 1B71 18 . -s1b9a 1B9A CD 1B9B 90 9c 1B9C 18 . -g0 a>save 40 zsidd.com a>b: b>a:zsidd hello.com hello.sym ZSID VERS 1.4 SYMBOLS NEXT PC END 1100 0100 C72E #l._main _main: 013D CALL 0EAA .ncsv 0140 NOP 0141 NOP 0142 LD HL,0EBF 0145 PUSH HL 0146 CALL 0151 ._printf 0149 LD HL,0002 014C ADD HL,SP 014D LD SP,HL 014E JP 0EA2 .cret _printf: 0151 CALL 0E96 .csv #g0 b>



 それでは解析過程の概要を簡単に記録しておきます。

  1. ZSIDの自己コード移動処理
     ZSIDはCP/M上で動作する実行ファイルをディバッグするので初期化処理で自身のコードをメモリの最後の方に移動しています。
     今回使用したCP/Mのメモリサイズは64KBですが、この場合、ZSID自身の0200H以降をA800Hへコピーしていました。
     なので0200H以降のコードについてはディスアセンブルでのアドレスに+A600H(=A800H-0200H)加えたものが実行アドレスになります。
     また、「CALL」や「JP」などのニーモニック内のアドレスから0200H引いたアドレスがディスアセンブルリスト上のコードアドレスとなり、少々ヤヤコシイ状態になりますw
     この辺りは ZSID で ZSID 自身をステップ動作等させて確かめましたw

ZSIDのコード移動処理
0155 210002 LD HL,T0200 0158 78 A0158: LD A,B 0159 B1 OR C 015A CA6501 JP Z,A0165 015D 0B DEC BC 015E 7E LD A,(HL) 015F 12 A015F: LD (DE),A 0160 13 INC DE 0161 23 INC HL 0162 C35801 JP A0158



  1. コマンド入力処理
     下記がコマンド入力内容を大文字変換しているところで1A90Hがコマンド入力文字を1文字取得する処理のエントリです。
     前回の記事では「AND 05FH」部分の05FHを0FFHに変更することで大文字変変換を無効にしました。
     先頭の"CALL A189C"は直下の1A9Cをコールしています(0200H分のオフセットが付くので)
     このことからA189Cをコールすれば大文字変換無しのコマンド1文字入力に使えそうです。

ZSIDのコマンド入力処理
1A90 CD9C18 CALL A189C 1A93 FE7F CP 07FH 1A95 C8 A1A95: RET Z 1A96 FE61 CP 061H 1A98 D8 A1A98: RET C 1A99 E65F AND 05FH 1A9B C9 RET ; 1A9C E5 PUSH HL 1A9D 216D21 A1A9D: LD HL,D216D 1AA0 7E LD A,(HL) 1AA1 B7 OR A 1AA2 3E0D LD A,00DH 1AA4 CAB018 JP Z,A18B0 1AA7 35 DEC (HL) 1AA8 2A6A21 LD HL,(D216A) 1AAB 7E A1AAB: LD A,(HL) 1AAC 23 INC HL 1AAD 226A21 LD (D216A),HL 1AB0 E1 POP HL 1AB1 C9 RET



  1. シンボル処理
     次にシンボル処理の箇所はシンボル入力時に使う'.'(02EH)記号のコンペア命令を目印に探したところ下記の部分を見つけました。
     すぐ下にシンボル表現で使用するもう一つの記号'@'(040H)の比較部分もあるのでシンボル処理である可能大です。
     試しに'.'を'''に変更するパッチを入れたところ、'''でシンボル参照できたのでシンボル処理であることが確定です。

ZSIDのシンボル処理
1BD3 EB EX DE,HL 1BD4 210000 LD HL,00000H 1BD7 FE2E CP 02EH ;シンボル記号'.' 1BD9 CA6E19 JP Z,A196E 1BDC FE40 CP 040H ;シンボル記号'@' 1BDE C2EB19 JP NZ,A19EB 1BE1 CD6E19 CALL A196E 1BE4 E5 PUSH HL 1BE5 EB EX DE,HL 1BE6 5E LD E,(HL) 1BE7 23 INC HL 1BE8 56 LD D,(HL) 1BE9 E1 POP HL 1BEA C9 RET



  1. パッチ適用箇所
     上記の'.'と'@'の場合にコールされている1B6EH(0200Hオフセットが掛かる)がコマンド内のシンボル文字列を実際の値に変換する処理ということになります。
     コマンド文字入力(1890Hをコール)は2ヶ所あり、これを189CHの大文字変換無しの処理をコールするように変更すればシンボル処理だけ大文字変換が掛からず、小文字のシンボルも使えるということになります。

ZSIDのコマンド内のシンボル文字列処理
1B6E D5 PUSH DE 1B6F CD9018 CALL A1890 ;change to 189CH 1B72 2AB221 LD HL,(D21B2) 1B75 F5 PUSH AF 1B76 4E LD C,(HL) 1B77 79 LD A,C 1B78 FE10 CP 010H 1B7A D25D18 JP NC,A185D 1B7D F1 A1B7D: POP AF 1B7E EB EX DE,HL 1B7F D5 PUSH DE 1B80 F5 PUSH AF 1B81 2A6A21 LD HL,(D216A) 1B84 E5 PUSH HL 1B85 2A6C21 LD HL,(D216C) 1B88 E5 PUSH HL 1B89 EB EX DE,HL 1B8A 0C INC C 1B8B CD4519 A1B8B: CALL A1945 1B8E CAA019 JP Z,A19A0 1B91 0D A1B91: DEC C 1B92 CABA19 JP Z,A19BA 1B95 2B DEC HL 1B96 BE CP (HL) 1B97 C2BA19 JP NZ,A19BA 1B9A CD9018 CALL A1890 ;change to 189CH 1B9D C38B19 JP A198B



[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(1)  コメント(1) 
共通テーマ:趣味・カルチャー

3チップ構成Pic24CPMマイコン(その3)ZSIDで小文字のシンボルを使う方法 [Z80]

 「レトロマイコンZ80ボードの構想(その19)PCB化」の記事の最後の方に書いたようにHI-TECH CはANCI規格にも準拠していてプロトタイプ宣言や構造体も使えCP/M-80上で使用可能なC言語の中では最も使い易いのものの一つではないかと思います。

 また、添付されているREAD.MEを見ると

The HI-TECH Z80 CP/M C compiler V3.09 is provided free of charge for any
use, private or commercial, strictly as-is. No warranty or product
support is offered or implied.

You may use this software for whatever you like, providing you acknowledge
that the copyright to this software remains with HI-TECH Software.


と書かれており、営利的な使用も含めて特に使用制限は無いようです。
 HI-TECH C(V3.09)はマニュアルも含めて ここ からダウンロード可能です(z80v309.exeにコンパイラが入っている)。

 開発元のHI-TECHソフトウェア社は2009年3月にマイクロチップ社に買収され、現在、マイクロチップ社が提供しているPIC用Cコンパイラの開発元でもあります。
 CP/M版HI-TECH Cのマニュアル(Z80DOC.TXT)を見るとZAS(アセンブラ)での数字表現のテンポラリラベルの後にf(forward)またはb(back)を付けて参照できる辺りにもPIC用の開発環境に通じる片鱗を垣間見ることができます。

 HI-TECH Cでコンパイル時に -f オプションを付けることでシンボルファイルも作成できディバッグ時に活用できます。
 また、シンボルは大文字/小文字の区別もありC言語を使う上では助かります。
 しかし、ZSIDにシンボル情報を読込ませることはできましたが、コマンド内でシンボルを参照できませんでした・・・

ZSIDへHI-TECH Cのシンボルファイル読込み
b>type hello.c #include <stdio.h> void main( void ) { printf( "hello !" ); } b>c -fhello.sym hello.c HI-TECH C COMPILER (CP/M-80) V3.09 Copyright (C) 1984-87 HI-TECH SOFTWARE b>dir hello.* B: HELLO C : HELLO COM : HELLO SYM b>a:zsid hello.com hello.sym ZSID VERS 1.4 SYMBOLS NEXT PC END 1100 0100 C72E #l0125 0125 LD HL,0081 0128 PUSH HL 0129 CALL 06C7 .startup 012C POP BC 012D POP BC 012E PUSH HL 012F LD HL,(12F8 .__argc_) 0132 PUSH HL 0133 CALL 013D ._main 0136 PUSH HL 0137 CALL 06B4 ._exit #l._main ? #g0 b>


 上記のようなZSIDでシンボル参照できない問題の解決方法をネットで探しましたがすぐには見つかりませんでした・・・

 リスト表示ではシンボル表記になることからシンボル情報自体はZSIDに読込まれているようです。
 コマンドで入力したシンボル文字列がZSIDの内部処理で大文字変換されるため、内部のシンボル文字列とマッチせず入力したシンボルが参照できないようです。
 (因みにMBASICは小文字も入力可能なので小文字のファイル名も作成でき、逆に小文字のファイル名のファイル削除にも使えます)

 そこで、ZSIDの内部処理でコマンドラインを大文字変換している部分にパッチを当ててみました。
 CP/M-80のコマンドはサイズが小さいので該当の処理を探すのは楽です^^
 ZSIDへのパッチはDDTを使って当てていますw

ZSIDへパッチ適用し小文字のシンボルに対応
a>ddt zsid.com DDT VERS 2.2 NEXT PC 2900 0100 -s1a99 1A99 E6 1A9A 5F ff 1A9B C9 . -g0 a>save 40 zsidd.com a>b: b>a:zsidd hello.com hello.sym ZSID VERS 1.4 SYMBOLS NEXT PC END 1100 0100 C72E #L._main _main: 013D CALL 0EAA .ncsv 0140 NOP 0141 NOP 0142 LD HL,0EBF 0145 PUSH HL 0146 CALL 0151 ._printf 0149 LD HL,0002 014C ADD HL,SP 014D LD SP,HL 014E JP 0EA2 .cret _printf: 0151 CALL 0E96 .csv #G0 b>


 ZSID内でコマンドからもシンボルが使えるようになりました^^
 注意点としてはコマンド自体が小文字だとエラーになるのでコマンドを大文字で入力する必要があります(パッチ適用前は大文字変換されるのでエラーにならなかった)

 上記の制約は発生しますが、シンボルが使えるようになるメリットは私にとっては大きいです^^

[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(1) 
共通テーマ:趣味・カルチャー
前の5件 | -