SSブログ
English Version

レトロマイコン86ボードの構想(その15)DDT86でパッチ [8086]

 CP/M-86の頃にはパソコンがグラフィック表示対応もして来たり、CP/M-86自体もパーソナルCP/Mとして機種毎に販売されたこと等もあり、TeraTerm接続環境でうまく動かないソフトが結構あります。

 今回はgulperというパックマンライクのゲームにDDT86でパッチをあてて動かしてみたのでメモとして書いておきます。

 最初にダウンロードしたままの状態で起動すると

GULPER実行画面(対処前)


 Pascalのソースも添付されていたので確認してみると

GULPERのソース(抜粋)
PROCEDURE assign_values; { If your computer's character set is different from the IBM PC's you may } { have to assign other characters to these variables } BEGIN normal_gulper := chr (2); { face } super_gulper := chr (234); { square: ~ } ghost := chr (1); { inverse-video face } wall := chr (219); { solidly coloured rectangle: / } den := chr (176); { half-tone rectangle: 0 } bonus := chr (3); { heart shape } power_pill := chr (4); { lozenge } blank := ' '; dot := '.'; terminal := '$' END; { assign_values } PROCEDURE title_page; VAR row: 1..24; PROCEDURE sidescroll (slice: charstring); VAR i, j: 1..24; BEGIN FOR i :=1 TO 16 DO BEGIN GotoXY (1, row); FOR j:= 1 TO i DO write (' '); write (slice) END; row := row + 1 END; { sidescroll }


 機種依存のキャラクタコードの設定は一カ所で行っています。また、ソース内の先頭で設定しているので探し易そうです。

 今回は次のようにキャラクタコードを変更することにしました。
  • 02 -> 4f O
  • EA -> 23 #
  • 01 -> 40 @
  • DB -> 48 H
  • B0 -> 5a Z
  • 03 -> 56 V
  • 04 -> 2A *

 DDT86でパッチを当てる場合、ddt86 gulper.cmdで読込んでパッチを当ててもwコマンドでセーブできないのでrコマンドで読込んでパッチ適用後にwコマンドでセーブしています。
 最初に0080hから逆アセンブルしているのはヘッダ分を飛ばしてコードの先頭から見るためです。
 コードの先頭でスタートアップ処理にジャンプし、スタートアップ処理の直後に上述のキャラクタコード設定処理がありました。

DDT86でのパッチ操作
J>dir J: AZTEC TAR : CTYPE H : FCNTL H : LIBC H J: STDIO H : GULPER CMD J>a:ddt86 DDT86 1.2 -rgulper.cmd START END 77BE:0000 77BE:4A7F -l80 77BE:0080 JMP 2800 77BE:0083 NOP 77BE:0084 NOP 77BE:0085 INT AB 77BE:0087 INC BX 77BE:0088 ??= 6F 77BE:0089 JO 0104 77BE:008B JB 00F6 77BE:008D ??= 67 77BE:008E ??= 68 77BE:008F JZ 00B1 77BE:0091 SUB 29[BP+DI],AL -l2800 77BE:2800 CALL 0741 77BE:2803 ADD AL,[BX+SI] 77BE:2805 DAA 77BE:2806 OR 11[BX+SI],AL 77BE:2809 MOV BP,SP 77BE:280B CALL 23CF 77BE:280E DEC DI 77BE:280F AND DL,E927[BP+SI] 77BE:2813 ??= 0F 77BE:2814 PUSH DS 77BE:2815 PUSH BP 77BE:2816 MOV BP,SP -l 77BE:2818 PUSH BP 77BE:2819 JMP 281C 77BE:281C MOV AX,0002 77BE:281F MOV [02CC],AL 77BE:2822 MOV AX,00EA 77BE:2825 MOV [02CD],AL 77BE:2828 MOV AX,0001 77BE:282B MOV [02CE],AL 77BE:282E MOV AX,00DB 77BE:2831 MOV [02CF],AL 77BE:2834 MOV AX,00B0 77BE:2837 MOV [02D0],AL -s281c 77BE:281C B8 77BE:281D 02 4f 77BE:281E 00 77BE:281F A2 77BE:2820 CC 77BE:2821 02 77BE:2822 B8 77BE:2823 EA 23 77BE:2824 00 77BE:2825 A2 77BE:2826 CD 77BE:2827 02 77BE:2828 B8 77BE:2829 01 40 77BE:282A 00 77BE:282B A2 77BE:282C CE 77BE:282D 02 77BE:282E B8 77BE:282F DB 48 77BE:2830 00 77BE:2831 A2 77BE:2832 CF 77BE:2833 02 77BE:2834 B8 77BE:2835 B0 5a 77BE:2836 00 77BE:2837 A2 77BE:2838 D0 77BE:2839 02 77BE:283A B8 77BE:283B 03 56 77BE:283C 00 77BE:283D A2 77BE:283E D1 77BE:283F 02 77BE:2840 B8 77BE:2841 04 2a 77BE:2842 00 . -wgulper2.cmd -^C J>


 パッチ適用により、下記の画面のように標準のアスキーコードを使った画面にすることができました。

GULPER実行画面(対処後)


★2019/10/14 追記
 twitterに動画付きでコメントをポストしました。
https://twitter.com/wcinp/status/1183623815596634112



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

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

レトロマイコン86ボードの構想(その14)untarの製作 [8086]

 今日(2019/10/12 土曜日)の夕方から明日にかけて関東を直撃するおそれがある過去最強クラスとも言われている台風19号のため、JRは全面運休を予定していて、昨日夕方に近くのスーパーマーケットに行ったらレジが長蛇の行列でパンやカップ麺類が殆ど無い状態でした。
 危険なので緊急以外の外出をしないように政府見解もでているので今日はパソコンの前に座っています(いつものことだけどw)

 「レトロマイコン86ボードの構想(その11)xmodemの移植」の記事で書いたように自作のV20ボードで動くCP/M-86上でxmodemが動くようになり、パソコンとのファイル送受信が簡単にできるようになりました。

 kuninetさんが書かれた「KZ80シリーズ、SBC8080 8085でCP M」の最後の方で拙作のxmodemを紹介して頂いていて、ここでは同時にCP/M-80用のunzipも紹介されています。パソコン側のGUI操作で複数ファイルのアーカイブを作り、xmodemでCP/Mへ転送する環境は確かに便利です。

 そこでCP/M-86用のunzipを探してみましたが見つかりませんでした・・・
 パソコンで使用している圧縮/解凍ソフトである7-zipの圧縮ファイル作成時の設定ウィンドを見ていたらなんとtarに対応していました^^

7-zipの圧縮ファイル作成時の設定ウィンド

★追記 2020/12/23
 Windows10自体もtarに対応していました。

コマンドラインでtarコマンド


 そこでCP/M-86用のtarファイルを解凍するuntarを作ってみました。
 tarは古くからあるツールで、tarファイルの構造は単純なので解凍ツールの作成は割合簡単です。

 tarファイルのフォーマットについてはネット上に豊富に情報があり「tar の構造」等を参考にさせて頂きました。

 制作したuntarの操作ログのサンプルを貼っておきます。

untar操作ログ
J>a:xmodem aztec.tar /r /p aztec.tar (PUN/RDR) received 60 block(s). J>a:stat *.* Drive J: User : 0 Recs Bytes FCBs Attributes Name 60 8k 1 Dir RW J:AZTEC .TAR ---------------------------------------------- Total: 8k 1 J: RW, Free Space: 1,936k J>a:untar usage : untar [/l /e] FileName /e : extract all files Ver 0.01 2019/10/11 by skyriver J>a:untar aztec aztec.tar CTYPE.H 638 bytes FCNTL.H 211 bytes LIBC.H 1222 bytes STDIO.H 1306 bytes J>a:untar /e aztec aztec.tar CTYPE.H 638 bytes created FCNTL.H 211 bytes created LIBC.H 1222 bytes created STDIO.H 1306 bytes created J>a:stat *.* Drive J: User : 0 Recs Bytes FCBs Attributes Name 60 8k 1 Dir RW J:AZTEC .TAR 5 2k 1 Dir RW J:CTYPE .H 2 2k 1 Dir RW J:FCNTL .H 10 2k 1 Dir RW J:LIBC .H 11 2k 1 Dir RW J:STDIO .H ---------------------------------------------- Total: 16k 5 J: RW, Free Space: 1,928k J>


 コンパイル時のログも貼っておきます。"-a"オプションで自動的にリンクまで行うようにしています。

B>drc -a untar
--------------------------------------------------
Digital Research C       04/17/84     Version 1.11
Serial No. 3073-0000-001282    All Rights Reserved
Copyright (c) 1983,1984     Digital Research, Inc.
--------------------------------------------------

Digital Research C  Version 1.11 -- Preprocessor

Digital Research C  Version 1.11 -- Code Gen
untar.c:         code:  1541 static:   235 extern:   694

--------------------------------------------------
LINK-86 Linkage Editor  19 March 1984  Version 1.4
Serial No. 3073-0000-001282    All Rights Reserved
Copyright (C) 1982-1984     Digital Research, Inc.
--------------------------------------------------

CODE    06186
DATA    011A1

USE FACTOR:  18%

B>


 最後に、今回作成したuntarプログラムは下記のリンクからダウンロードできます。
 ※商用目的以外であれば自由に使用可能

UNTAR_CPM86_V005.zip

・2021/01/04 Ver 0.05
 Win10のtarコマンド等のヘッダ内サイズデータのデリミタが20Hの場合に対応
・2019/10/24 Ver0.04
 ファイルエンドの処理を修正
・2019/10/18 Ver0.03a
 Aztec C 8086 Ver3.20d でコンパイル(File size was turned to 10KB from 30KB)
・2019/10/16 Ver0.03
 ファイルリスト表示を高速化
・2019/10/13 Ver0.02
 "/l"オプションを廃止し、リスト表示をディフォルトとした
・2019/10/12 Ver0.01a
 ファイルサイズが128の倍数の場合の処理を改善


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

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

レトロマイコン86ボードの構想(その13)自作スクリーンエディタ [8086]

 前回の記事で書いたようにCP/M-86でWordStarが動くようになりました。
 しかし、WordStarは起動の度にファイル内容の表示領域を広げるために操作が必要だったり、ディフォルトでページ境界線が表示されていたり、更には当時の基本的なエスケープシーケンスのみで制御していることもあり動作が重いです・・・

 そこで「3チップ構成68Kマイコンの構想(その14)スクリーンエディタの開発」の記事で書いた自作のsked(Simple Kitten EDitor)をDRC(デジタルリサーチ社製C言語)環境を使ってCP/M-86に移植してみました。

 skedのコマンド体系はWordStarライクの2ストロークにしているので私にとっては使い勝手がいいです。

help表示状態の画面


 実装機能は必要最小限(エディタの追加機能を考え出したら切りがない)ですがオンメモリ処理でBIOSを直にコール(BDOS経由でのBIOSコール機能しか提供していないCP/M-86ではあまり例がないと思う)しているのでWordStarと比較し動作がかなり速いです。

 DRC(Ver 1.11)への移植作業について気が付いたこと等をメモしておきます。

  1. SIZE_T/size_tの定義
    SIZE_Tの定義がDOS.Hのみにあり、今回はDOS.Hは使わないので自分でunsigned intとして定義しています。

  2. SIZE_T(unsigned int)の演算
    SIZE_Tでキャストした0x8000の2除算が0xc000になってしまう。除算式に含まれる全ての数値をSIZE_Tでキャストしても変化ありませんでした。

  3. unsigned charが使えない
    DRCのコンパイラが対応していないためunsigned charでエラーになります。

  4. 実行ファイルのサイズが大きい
    "Hello!"表示のプログラムのサイズが28KBでAztecCの6KBと比較してかなり大きい。

  5. コンパイル時間
    結構時間が掛かります。体感ではAztecCの5倍程度かかります。
    但し、AztecCは大きめのソースをコンパイルしたところ、私の環境ではコンパイラがうまく動かなかったので今回はDRCを使っています。
    ★2019/10/24 追記 {
     Pic24V20をプリント基板化したことで安定化できました。AztecCも問題なく動いています。AztecCの方がコンパイル&リンクの速度も速く、C言語自体もDRCより使い易いです。何より実行ファイルのサイズが小さい(というかDRCが大きすぎ)。
     DRCはおそらくデジタルリサーチ社初のCコンパイラでこなれていない部分がある印象です。
    }

  6. マニュアルの情報は多い
    マニュアルの内容は充実しています。インラインアセンブル機能は無いようですがrasm86(リロケータブルアセンブラ)の処理と割合簡単にリンクできます。

  7. デバッガ
    DRCには関係ないですがCP/M-86用のシンボリックディバッガを探したけれどまだ見つけられていないのでシンボルをマニュアルで参照する必要があり不便です。
    ★2019/10/01 追記 {
     シンボリックディバッガ(SID86)はここからダウンロードできました。
    }

★2019/09/30 追記
twitterにWordStarとの比較動画をアップしました。




★2019/10/13 追記
 自作スクリーンエディタsked(CP/M-86版)は下記のリンクからダウンロードできます。(商用目的以外であれば自由に使用可能)

SKED_CPM86_V001f.zip



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

レトロマイコン86ボードの構想(その12)CP/M-86でWordStar [8086]

 前回の記事で書いたようにCP/M-86で自作のxmodemが動くようになったので、次にエディタが欲しいところです。

 そこでまずはメジャーなWordStarを動かしてみました。

 「レトロマイコンZ80ボードの構想(その15)エスケープシーケンスの実験」の記事で書いたようにCP/M-80ではPIC24側で当時のエスケープシーケンスをANSIエスケープコードに変換してWordStarを動かしていて、この変換処理は今回のCP/M-86でも入れているのですが、CP/M-86のWordStarはうまく動きませんでした。

 TeraTermのログ機能を使ってCP/M-86版WordStarが使用しているエスケープシーケンスを確認し、次のエスケープシーケンスの変換処理を追加することで無事動くようになりました。
  • ESC 'E'
    画面消去

  • ESC 'Y' (y+' ') (x+' ')
    カーソル移動。()は1キャラクタコードで移動先カーソル位置(x,y)にスペースコードを加算したキャラクタコード。

  • ESC 'b' 0x0e
    強調文字属性に変更。今回はTeraTermで太文字黄色になるようにしました。

  • ESC 'b' 0x03
    強調文字属性の解除

 ネット情報ではTEDも人気が高かったようですが、起動するとトラップが発生し、動作しませんでした。
 ソース付きだったので初期化部分の処理を見てみたら int 10h を使用していた・・・

;
; We start by initializing the display, then allocate memory for the
; file and paste segments.  Parse the command line for a filename , if
; one was input, read in the file.  Finally set the INT 23 and 24 vectors.
cseg

start:
       mov      cl,9
       mov      dx,offset cls
       int      224

       push     ds 
             xor      ax,ax
             mov      ds,ax
             mov      ah,12h
             mov      bl,10h
             int      10h
             cmp      bl,10h
             je       not_ega


 WordStarの画面キャプチャを以下に貼っておきます。
 「レトロマイコンZ80ボードの構想(その15)エスケープシーケンスの実験」の記事に貼ってあるCP/M-80のWordStarの画面と同じですね。

 起動直後に表示される今で言うスプラッシュウィンド相当の画面です。

CP/M-86版WordStarの起動画面


 メニュー画面です。'F'コマンドでファイル一覧表示をON後の画面です。

CP/M-86版WordStarのメニュー画面


 ファイル編集画面です。

CP/M-86版WordStarの編集画面1


 ^JHコマンドでヘルプレベルを1にしてファイル内容の表示領域を広げています。

CP/M-86版WordStarの編集画面2


 スクリーンエディタ操作のバイナリエディタであるFileViewも動かしてみたので画面を貼っておきます。

FileView画面



★2019/10/09 追記
 WordStarのインストーラー(winstall.cmd)でターミナルタイプを「DEC VT-100」に設定したらなんなく動いた^^
 ディフォルト設定のエスケープシーケンスに対応しなくてもよかったかも(でも対応した方が動くソフトが増えるのでいいと思う)

Opening screen of WordStar Menu screnn of WordStar



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

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

レトロマイコン86ボードの構想(その11)xmodemの移植 [8086]

 CP/M-86の環境を整えるためにCP/M-80とCP/M-68Kで自作したxmodemをCP/M-86へ移植しました。
 移植するまではパソコンでソース編集し、pipでpip xmodem.c=con:のコマンドでCP/M-86へ転送していて、TeraTermで1キャラクタ毎に10msのウェイトを入れているので転送に時間が掛かります。

 コンパイラ環境が整ったので最初にxmodemの移植したいと思い、自作したソースなので簡単にいくだろうと思っていましたが、少し手こずりました・・

 CP/M-86本体はTinyモデル(コードセグメントとデータセグメントが共通)なのでBIOSの各機能が RET命令でリターンするため別セグメントで動作するアプリケーションから直にコールする方法がありません。
 DRC(デジタルリサーチ社製C言語)環境で調べてみるとBIOSコールはbios.hの中で次のように宣言されています。

/****************************************************************************
       BIOS86.H - compatibilty header for CP/M-86 & the IBM-PC family

                  (C)1999 Ken Mauro, All Rights Reserved.
                          Free for non-commercial use.
****************************************************************************/

                /* CP/M & IBMPC bios related stuff */


struct{ char fn;
        char cl,ch;
        char dl, dh; } pblk;


bios(p)   unsigned int *p;    { return __BDOS(50,&pblk); }


 BDOS経由では遅くなりそうだと予感しながら移植してみたところ、xmodemが動作しません・・・

 コンソール送信データはPIC側の処理で当時のエスケープシーケンスをANSIのエスケープコードに変換しているのでバイナリデータの透過性を保証するために/pオプションでPUNCH/READERデバイス(コンソールと同じシリアル通信を使いますがコード変換処理無し)を指定できるようにしています。

 READERではBIOSの仕様上、受信データの有無を確認できないのですが、受信データが無い場合には0xffffを返すようにBIOSを拡張実装しています。
 しかし、上記の__BDOS処理部分でリターン値の上位バイトをマスクする実装になっているのでREADERの受信データ有無チェック機能が動作しません。

 次のログがDDT86で確認した__BDOS部分のコードです("***"部分は追加コメント)。

F>a:ddt86 xmodem.cmd
DDT86 1.2
     START      END
CS 662D:0000 662D:638F
DS 6C66:0000 6C66:FFFF
-l0d5                      *** シンボルファイルから確認した__BDOSのアドレス
662D:00D5 PUSH   BP
662D:00D6 MOV    BP,SP
662D:00D8 PUSH   DI
662D:00D9 PUSH   SI
662D:00DA MOV    DX,06[BP]
662D:00DD MOV    CL,04[BP]
662D:00E0 PUSH   ES
662D:00E1 INT    E0
662D:00E3 POP    ES
662D:00E4 MOV    [0FB4],AX *** 0FB4 __cpmrv
662D:00E7 MOV    [0FDE],CX
662D:00EB SUB    AH,AH     *** change 90H x 2
-l
662D:00ED POP    SI
662D:00EE POP    DI
662D:00EF POP    BP
662D:00F0 RET
662D:00F1 MOV    CL,0C
662D:00F3 PUSH   ES
662D:00F4 INT    E0
662D:00F6 POP    ES
662D:00F7 CMP    AH,11
662D:00FA JNZ    0100
662D:00FC INC    BYTE [0050]
662D:0100 MOV    AL,[0050]
-^C
F>


 "SUB AH,AH"部分をNOP(90H)に変更するパッチ当てて確認したところ、READERのデータ有無確認の機能は動作したのでハイバイトをマスクする前に保存している0x0FB4(シンボルファイルでは__cpmrvとなっている)を使い、xmodemのCソース内で__cpmrvを参照するようにして対処しました。

 この対処でCP/M-86からファイル送信はできるようになりましたが、ファイル受信でエラーが発生します。

 ロジアナで受信処理時の状況を確認した波形サンプルが下記で受信処理が間に合わず取りこぼしている状況でした。
 シリアルの通信速度は38400bpsなので1バイト当たり0.26ms(=1000/38400*10)ですが、受信データのポーリング周期が0.34ms程度になってしまっています。

xmodemでのファイル受信時のロジアナ波形例(NGケース)


 READY信号が一瞬 lowになっている部分がV20からPICへサービス要求している部分でBUSREQ信号がhighの部分はPIC側が処理している部分です。

 上述したようにBDOS経由では遅そうなのでBIOSを直にコールすべく、BIOSの先頭の"JMP INIT"部分に一時的に4バイトのfar CALLされるコード(RETFで終わる)を書込みBIOSの機能をコールし、コール後元に戻すようにしました。
 DRCのオブジェクトとリンクするためにリロケータブルアセンブラのRASM86を使い、セグメント名やCの引数の渡し方等を確認し、ソース作成したところ、最初はリンクできなかったのですが、RASM内のラベルは大文字変換されるようなので大文字に変更したらほぼ一発で動作しました^^

★2019/11/01 追記 {
 最初に使ったBDOS経由でのBIOSコールはBDOSコールファクションNo.50の「DIRECT BIOS CALL」というBDOSコールですが逆アセンブルしてみると判るとおりBIOSに辿り着くまで多くのステップ数のマシン語を実行しています。
}

 RASM86のサンプルソースはネット上で中々見つからなかったので、他の人の参考になるかも(ならないかも)と思いソースを貼っておきます。

BIOSコール用の橋渡し処理(アセンブラ)
CP/M RASM-86 1.2 SOURCE: CALLBIOS.A86 ;*********************************** ; direct bios call for CP/M-86 ; for speed up with RASM-86 ; adapt to ; 2:CONST ; 3:CONIN ; 4:CONOUT ; 5:LISTOUT ; 6:PUNCH ; 7:READER ; Ver 0.01 2019/08/24 by skyriver ;*********************************** 0040 BIOSSEG EQU 0040H 2500 BIOSOFT EQU 02500H 00E8 C_CALL EQU 0E8H ; call ope code 00CB C_RETF EQU 0CBH ; retf code 009A C_CALLF EQU 09AH ; callf code PUBLIC GOBIOS,CALBIOS CSEG ; bios call ; CL <- bios parameter ; DL <- function No GOBIOS: 0000 53 PUSH BX 0001 B84000 MOV AX,BIOSSEG 0004 8ED8 MOV DS,AX 0006 BB0025 MOV BX,BIOSOFT 0009 8B07 MOV AX,[BX] 000B 50 PUSH AX 000C 8B4702 MOV AX,2[BX] 000F 50 PUSH AX 0010 FECA DEC DL 0012 8AE2 MOV AH,DL 0014 02E2 ADD AH,DL 0016 02E2 ADD AH,DL ; AH = (func No - 1) * 3 0018 B0E8 MOV AL,C_CALL 001A 8907 MOV [BX],AX 001C B800CB MOV AX,C_RETF * 256 001F 894702 MOV 2[BX],AX 0022 53 PUSH BX 0023 9A DB C_CALLF ; CALLF BIOSSEG:BIOSOFT 0024 00254000 DW BIOSOFT,BIOSSEG 0028 5B POP BX 0029 59 POP CX 002A 894F02 MOV 2[BX],CX 002D 59 POP CX 002E 890F MOV [BX],CX 0030 5B POP BX 0031 C3 RET ; bios call ; BiosCall( char FNo, char CL ) ; FNo <- BIOS function No. ; CL <- C register value CALBIOS: 0032 55 PUSH BP 0033 8BEC MOV BP,SP 0035 57 PUSH DI 0036 56 PUSH SI 0037 8A5604 MOV DL,4[BP] ; get function No 003A 8A4E06 MOV CL,6[BP] ; get bios parameter 003D 1E PUSH DS 003E 06 PUSH ES 003F E8BEFF 0000 CALL GOBIOS 0042 07 POP ES 0043 1F POP DS 0044 5E POP SI 0045 5F POP DI 0046 5D POP BP 0047 C3 RET END END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 0%


 安全を見て多くのレジスタを保存していますがそれでもBDOS経由よりはかなり早くなり、ファイル受信処理も問題なく動作するようになりました^^

xmodemでのファイル受信時のロジアナ波形例(改善後)


 受信データのポーリング周期は0.34msから0.23msに高速化され連続的なデータ受信時にも取りこぼしが発生しなくなりました。

 メモとして、xmodemのコンパイル&リンク時の操作ログを貼っておきます。

B>rasm86 callbios
--------------------------------------------------
RASM-86 Relocating Assembler           Version 1.2
Serial No. 3073-0000-001282    All Rights Reserved
Copyright (C) 1982,1983     Digital Research, Inc.
--------------------------------------------------

END OF PASS 1
END OF PASS 2

CODE  00048

END OF ASSEMBLY.  NUMBER OF ERRORS:   0.  USE FACTOR:  0%

B>drc f:xmodem
--------------------------------------------------
Digital Research C       04/17/84     Version 1.11
Serial No. 3073-0000-001282    All Rights Reserved
Copyright (c) 1983,1984     Digital Research, Inc.
--------------------------------------------------

Digital Research C  Version 1.11 -- Preprocessor

Digital Research C  Version 1.11 -- Code Gen
f:xmodem.c:      code:  1894 static:   320 extern:   335

B>link86 f:xmodem=xmodem,callbios
--------------------------------------------------
LINK-86 Linkage Editor  19 March 1984  Version 1.4
Serial No. 3073-0000-001282    All Rights Reserved
Copyright (C) 1982-1984     Digital Research, Inc.
--------------------------------------------------

CODE    06366
DATA    01093

USE FACTOR:  19%

B>a:stat f:xmodem.*

 Drive F:                         User :  0
 Recs  Bytes FCBs Attributes      Name
   58     8k    1 Dir RW        F:XMODEM  .C
  234    30k    2 Dir RW        F:XMODEM  .CMD
    6     2k    1 Dir RW        F:XMODEM  .SYM
----------------------------------------------
Total:   40k    4
F: RW, Free Space:     1,866k
B>f:
F>xmodem
usage : xmodem [/s /r /p] FileName
        /s : send[default]
        /r : receive
        /p : use PUN/RDR device
            Ver0.01 2019/10/23 by skyriver
F>xmodem xmodem.cmd /s /p
xmodem.cmd  (PUN/RDR) sent 234 block(s).
F>


 最後に、今回作成したCP/M-86用のxmodemプログラムは下記のリンクからダウンロード可能です(商用目的以外であれば自由に使用可能)

XMODEM_CPM86_001a.zip

・2019/10/23 Ver0.01a
 コンパイラをDRCからAztec Cに変更(サイズ:30KB->10KB)
・2019/10/09 Ver0.01
 日付表示の誤記修正

★2019/11/05 追記
 Aztec CでのBIOS直コール部のアセンブルリストを貼っておきます。

BIOSコール用の橋渡し処理(アセンブラ)
0000 1 ;*********************************** 0000 2 ; direct bios call for CP/M-86 0000 3 ; for speed up with RASM-86 0000 4 ; adapt to 0000 5 ; 2:CONST 0000 6 ; 3:CONIN 0000 7 ; 4:CONOUT 0000 8 ; 5:LISTOUT 0000 9 ; 6:PUNCH 0000 10 ; 7:READER 0000 11 ; Ver 0.01 2019/08/24 by skyriver 0000 12 ; Ver 0.02 2019/10/23 by skyriver 0000 13 ;*********************************** 0000 14 0000 15 0000 16 BIOSSEG EQU 0040H 0000 17 BIOSOFT EQU 02500H 0000 18 0000 19 C_CALL EQU 0E8H ; call ope code 0000 20 C_RETF EQU 0CBH ; retf code 0000 21 C_CALLF EQU 09AH ; callf code 0000 22 0000 23 0000 24 codeseg segment para public 'code' 0000 25 assume cs:codeseg 0000 26 0000 27 public CalBios_ 0000 28 0000 29 0000 30 ; bios call 0000 31 ; CL <- bios parameter 0000 32 ; DL <- function No 0000 33 0000 34 GOBIOS: 0000 b8 40 00 35 MOV AX,BIOSSEG 0003 8e d8 36 MOV DS,AX 0005 bb 00 25 37 MOV BX,BIOSOFT 0008 ff 37 38 PUSH [BX] 000a ff 77 02 39 PUSH 2[BX] 000d fe ca 40 DEC DL 000f 8a e2 41 MOV AH,DL 0011 02 e2 42 ADD AH,DL 0013 02 e2 43 ADD AH,DL ; AH = (func No - 1) * 3 0015 b0 e8 44 MOV AL,C_CALL 0017 89 07 45 MOV [BX],AX 0019 b8 00 cb 46 MOV AX,C_RETF * 256 001c 89 47 02 47 MOV 2[BX],AX 001f 53 48 PUSH BX 0020 9a 49 DB C_CALLF ; CALLF BIOSSEG:BIOSOFT 0021 00 25 40 00 50 DW BIOSOFT,BIOSSEG 0025 5b 51 POP BX 0026 8f 47 02 52 POP 2[BX] 0029 8f 07 53 POP [BX] 002b c3 54 RET 002c 55 002c 56 002c 57 ; bios call 002c 58 ; BiosCall( char FNo, char CL ) 002c 59 002c 60 CalBios_ proc near 002c 55 61 PUSH BP 002d 8b ec 62 MOV BP,SP 002f 57 63 PUSH DI 0030 56 64 PUSH SI 0031 8a 56 04 65 MOV DL,4[BP] ; get function No 0034 8a 4e 06 66 MOV CL,6[BP] ; get bios parameter 0037 1e 67 PUSH DS 0038 06 68 PUSH ES 0039 e8 xx xx 69 CALL GOBIOS 003c 07 70 POP ES 003d 1f 71 POP DS 003e 5e 72 POP SI 003f 5f 73 POP DI 0040 5d 74 POP BP 0041 c3 75 RET 0042 76 0042 77 CalBios_ endp 0042 78 codeseg ends 0042 79 0042 80 END


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

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