SSブログ
English Version

レトロマイコン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) 
共通テーマ:趣味・カルチャー

レトロマイコン86ボードの構想(その10)回路図整理とパターン設計 [8086]

 ブレッドボード上に作ったV20(8088互換)とPIC24を使ったPic24V20でCP/M-86が動いているようなので回路図を整理してパターン設計しました。

 回路図はレトロマイコン86シリーズの最初の記事の「レトロマイコン86ボードの構想」の内容から大体想像が付いてしまいそうですが、下図になります。
 8088はデータがアドレスに多重化されているので74HC573を2個使い、5チップ構成になります。
 アドレスとデータが多重化されたことでPIC24の使用ピンに余裕ができたので、RTCC(リアルタイムクロックカレンダ)モジュール用に水晶の実装回路も付けてみました。
 使用したCADはDesignSparkPCBです。

Pic24V20(8088ワンボードマイコン)の回路図
※2019/10/20 最新版に更新(下記のパターン図はアップデートしていません)
★2021/02/25
 V20での16MHzクロック動作に対応した回路図をここにアップしました

 従来通り、抵抗やコンデンサ等は表面実装部品を使いますが、ボトム面が割合空いているのでラッチ用のIC(74HC573)は5.2mm幅のSOPパッケージのものを使いボトム面に実装しました。

 パターン図(グランドをベタパターン化前のもの)は下図になります。赤色がトップ面、水色がボトム面のパターンです。
 細い線が何本かありますがこれらはグランドの接続線で、グランドをベタパターン化することで接続されます。

Pic24V20パターン図


 グランドをベタパターン化後のトップ面のパターンが下図です。

Pic24V20パターン図(トップ面)


 ボトム面は次のとおりです。

Pic24V20パターン図(ボトム面)


 部品の3Dデータは作っていないので表示がイマイチですが3D表示が下図になります。
 右端の黒いものはSDカードホルダーです。

3D表示(トップ面)


 ボトム面の3D表示は下図で、前述のようにラッチICを2個、ボトム面に実装しました。
 右側の赤い大きなものはリアルタイムクロック用の電池(CR2032)ホルダです。

3D表示(ボトム面)


★2019/11/20 追記
 完成したプリント基板の写真等を「レトロマイコン86ボードの構想(その16)プリント基板完成」に記載しました。


★2020/12/14 追記
 V20の16MHzクロック対応のために改善した回路図及びパターン図を「レトロマイコン86ボードの構想(その25)回路図アップデート」の記事に記載しました。


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

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

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

 前回の記事でCP/M-86をCold Start Loaderで起動できたことを書きました。
 今回はBootstrapを使ってCP/M-86を本来の起動方法で立ち上げます。

 BootstrapはDiskAのシステム用トラック(今回は1トラックをシステム用に確保しています)からCold Start Loaderを読込んで起動するだけの機能なので作成は簡単なのですが、ブレッドボード上で回路を組んでいるため、ハードが不安定になることが度々あり、その都度、原因調査と対策をして時間が掛かりました(何度か安定化したといっているのでオオカミ少年状態です(少年ではないのですがw))
 ブレッドボードで評価する時は、次回から新しいブレッドボードを使い、結線の線材も自作するなど、検討した方がいいかもしれません。

 話をBootstrapに戻すとシステムトラック上のBootstrapとCold Boot Loaderの配置はSDカードのブロックサイズが512bytesであることを考慮してCold Boot Loaderのヘッダを除く、コード部を0200H(2ブロック目)から配置しました。
 Bootstrapは先頭の128バイトに収めます。
   ; ++++ SD block assign ++++
   ;
   ;  blk No  adr  length  content
   ;    0    0000H   80H    Bootstrap
   ;    0    0080H  100H    not use
   ;    0    0180H   80H    ColdStartLoader's header
   ;    1    0200H  nnnn    code of ColdStartLoader
   ;   ...

 Bootstrapのソースは短いので全リストを貼っておきます。

Pic24V20でのCP/M-86用Bootstrap(アセンブラ)
CP/M ASM86 1.1 SOURCE: BOOTV20.A86 Pic24V20 booter PAGE 1 title 'Pic24V20 booter' ;++++++++++++++++++++++++++++++++++++++ ; Pic24V20 CP/M-86 booter for CpmLoader ; Ver 0.01 2019/08/27 skyriver ;++++++++++++++++++++++++++++++++++++++ 0080 SEC_SIZE EQU 128 ; sector size 0200 SdBufSz EQU 512 ; SD card block size ; ++++ SD block assign ++++ ; ; blk No adr length content ; 0 0000H 80H this(bootstrap) ; 0 0080H 100H not use ; 0 0180H 80H ColdStartLoader's header ; 1 0200H nnn code of ColdStartLoader ; ... ; ; ++++ memory assign definition ++++ 0000 BooterSeg EQU 0 ; booter segment 0380 BooterStart EQU 0380H ; booter start address 0400 LoaderSeg EQU 0400H ; CpmLoader segment 000B LoaderBlk EQU (( 1600H + SdBufSz - 1) / SdBufSz ) ; ++++ CpmLoader entry ++++ 1200 bios_code EQU 1200h ;start of LDBIOS 0003 ccp_offset EQU 0003h ;base of CPMLOADER 0406 bdos_ofst EQU 0406h ;stripped BDOS entry 000D cr EQU 0dh ;carriage return 000A lf EQU 0ah ;line feed 0000 CSEG BooterSeg ORG BooterStart ;++++++++++++++++++++++++++++++++++++ ; PIC interface ;++++++++++++++++++++++++++++++++++++ ; memory assign ; ffde0 ffde:0000 SD buf 512bytes ; fffe0 ffde:0200 work area 16 bytes ; ffff0 ffff:0000 reset jump ; FFDE PWrkSeg EQU 0FFDEH ; function No. 0000 FC_EXIT EQU 0 ; EXIT CP/M 0001 FC_CONST EQU 1 ; CONST 0002 FC_CONIN EQU 2 ; CONIN 0003 FC_CONOUT EQU 3 ; CONOUT 0004 FC_READ EQU 4 ; READ SD Card 0005 FC_WRITE EQU 5 ; WRITE SD Card 0006 FC_PUNCH EQU 6 ; PUNCH 0007 FC_READER EQU 7 ; READER 0000 SdBuf EQU 0 ; SD buffer offset 0200 PicWrk EQU SdBuf + SdBufSz ; Pic I/F work area 0200 FuncNo EQU PicWrk ; RB 1 ; function No 0201 CoData EQU FuncNo + 1 ; RB 1 ; conout data 0202 SdSec EQU CoData + 1 ; RB 4 ; SD block No. 0206 RetVal EQU SdSec + 4 ; RB 2 ; return value 0208 PreSd EQU RetVal + 2 ; RB 4 ; previos SD block No. 020C ChgFlg EQU PreSd + 4 ; RB 1 ; buffer change flag for Blocking/Deblocking 020D BlkCnt EQU ChgFlg + 1 ; RB 1 ; Block first write counter ; *** offset from PicWrk *** 0000 oFuncNo EQU FuncNo - PicWrk 0001 oCoData EQU CoData - PicWrk 0002 oSdSec EQU SdSec - PicWrk 0006 oRetVal EQU RetVal - PicWrk 0008 oPreSd EQU PreSd - PicWrk 000C oChgFlg EQU ChgFlg - PicWrk 000D oBlkCnt EQU BlkCnt - PicWrk 0380 FA Start: CLI 0381 8CC8 MOV AX,CS 0383 8ED0 MOV SS,AX 0385 B8DEFF MOV AX,PWrkSeg 0388 8ED8 MOV DS,AX 038A B80004 MOV AX,LoaderSeg 038D 8EC0 MOV ES,AX 038F BC0604 MOV SP,offset stkbase 0392 FC CLD ;set forward direction 0393 BB0002 MOV BX,PicWrk ; PIC I/F work 0396 BA0B80 MOV DX,08000H + LoaderBlk ; DL : load blk counter 0399 BEE703 MOV SI,offset StMsg 039C E83400 03D3 CALL Puts 039F C60704 MOV BYTE PTR oFuncNo[BX],FC_READ 03A2 C747020100 MOV WORD PTR oSdSec[BX],1 ; set first blk No. 03A7 BF0000 MOV DI,0 03AA EE LOOP: OUT DX,AL ; read SD Block 03AB 8A4706 MOV AL,oRetVal[BX] ; get return value 03AE 84C0 TEST AL,AL 03B0 751A 03CC JNZ ERR 03B2 BE0000 MOV SI,SdBuf 03B5 B90001 MOV CX,SdBufSz / 2 03B8 F3A5 REP MOVSW 03BA FE4702 INC BYTE PTR oSdSec[BX] 03BD FECA DEC DL 03BF 75E9 03AA JNZ LOOP 03C1 BEF403 MOV SI,offset OkMsg 03C4 E80C00 03D3 CALL Puts 03C7 EA00120004 JMPF Init ; error handler 03CC BEF703 ERR: MOV SI,offset ErrMsg 03CF E80100 03D3 CALL Puts 03D2 F4 HLT ; put string on console ; SI <- string adr 03D3 C60703 Puts: MOV BYTE PTR oFuncNo[BX],FC_CONOUT 03D6 2E8A840000 Puts10: MOV AL,CS:[SI] 03DB 0AC0 OR AL,AL 03DD 7407 03E6 JZ PutsEn 03DF 884701 MOV BYTE PTR oCoData[BX],AL 03E2 46 INC SI 03E3 EE OUT DX,AL 03E4 EBF0 03D6 JMPS Puts10 03E6 C3 PutsEn: RET 03E7 6C6F6164696E StMsg DB 'loading ... ',0 67202E2E2E20 00 03F4 6F6B00 OkMsg DB 'ok',0 03F7 6572726F7200 ErrMsg DB 'error',0 03FD CodEnd EQU offset $ ORG ( offset $ + 1 ) AND 0FFFEH 03FE RW 4 0406 stkbase EQU offset $ 0400 CSEG LoaderSeg ORG bios_code Init: ; loader bios Init entry END END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 1%

★2019/11/16 変更 Bootstrapリストを最新版に変更

 ハードが安定している時には、CP/M-86の起動がメチャ楽になりました。
 電源投入時からCP/M-86起動までのサンプルログを以下に示します。
 下記のサンプルログでは手動でCP/M-86を起動していますが、picle言語で書いたCP/M-86booterを自動起動するように設定すれば電源オンでCP/M-86が起動するようになります。

BootstrapでのCP/M-86の起動
picle compiler CP/M-86 Ver0.01 2019/07/03 by skyriver :¥¥ +B000-BDAB # CP/M-86 boot 2019/08/23 +C000-CC8D #LibCpm CP/M86(PMP) v0.01 2019/08/17 +D000-DEEB #LibSpi SPI lib V0.04 for CP/M86 2019/08/16 +E000-E4F6 # Memory check executer 2019/08/19 +F000-FC43 # Pic24V20 HexLoader v0.02 2019/08/12 :¥< 3499 :run ... loading Pic24V20 CP/M-86 Version 2.2 Segment Address = 0040 Last Offset = 31FF System Generated by skyriver 2019/08/14 A>dir A: ASM86 CMD : ASSIGN CMD : CONFIG CMD : CPM SYS A: DATA PFK : DDT86 CMD : DSKMAINT CMD : ED CMD A: FUNCTION CMD : GENCMD CMD : HELP CMD : HELP HLP A: PIP CMD : PRINT CMD : SETUP CMD : STAT CMD A: SUBMIT CMD : TOD CMD A>dir p: NO FILE A>stat A: RW, Free Space: 1,780k P: RW, Free Space: 1,944k A>


★2019/09/07 追記
 CP/M-86用のデジタルリサーチ社製Cコンパイラでhello表示してみた。
 stdio.hの67行目でエラーが発生しましたがリンク後起動したところ、hello表示できました。

DRCでhello
B>type hello.c #include <stdio.h> main() { printf("Hello!"); } B>drc hello -------------------------------------------------- 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 stdio.h:67: Illegal operator in constant expression Digital Research C Version 1.11 -- Code Gen hello.c: code: 14 static: 7 extern: 160 B>link86 hello=hello -------------------------------------------------- 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 05ADD DATA 00EA8 STACK 00000 USE FACTOR: 17% B>a:stat hello.* Drive B: User : 0 Recs Bytes FCBs Attributes Name 1 2k 1 Dir RW B:HELLO .C 213 28k 2 Dir RW B:HELLO .CMD 5 2k 1 Dir RW B:HELLO .OBJ 4 2k 1 Dir RW B:HELLO .SYM ---------------------------------------------- Total: 34k 5 B: RW, Free Space: 1,014k B>hello Hello! B>


★2019/09/15 追記
 デジタルリサーチ社の Personal Basic でASCIIARTを動かしてみました。
 Personal Basicはプロンプト行がそのまま入力行になっているためかプログラムからの出力が80文字手前で次の行へ改行してしまうので冒頭にwidth命令を追加して80文字/行に設定しています。

 実行時間は2分5秒でした(V20のクロックは8MHzです)
 因みにマイクロソフトのMBASICでの実行時間は2分42秒でした。
 CP/M-68Kではデジタルリサーチ社のCBASICはBCD演算のためかASCIIARTの実行時間がかなり遅かったのですがCP/M-86ではMSより速いですね。

Personal BasicでのASCIIART実行
E>basic -------------------------------------------------- Personal Basic Version 1.1 Serial No. 3085-0000-000530 All Rights Reserved Copyright (c) 1983 Digital Research, Inc. -------------------------------------------------- Ok merge asciiart Ok list 1 width 80 10 FOR Y=-12 TO 12 20 FOR X=-39 TO 39 30 CA=X*.0458 40 CB= Y*.08333 50 A=CA 60 B=CB 70 FOR I=0 TO 15 80 T=A*A-B*B+CA 90 B=2*A*B+CB 100 A=T 110 IF (A*A+B*B)>4 THEN GOTO 200 120 NEXT I 130 PRINT " "; 140 GOTO 210 200 IF I>9 THEN I=I+7 205 PRINT CHR$(48+I); 210 NEXT X 220 PRINT 230 NEXT Y Ok run 000000011111111111111111122222233347E7AB322222111100000000000000000000000000000 000001111111111111111122222222333557BF75433222211111000000000000000000000000000 000111111111111111112222222233445C 643332222111110000000000000000000000000 011111111111111111222222233444556C 654433332211111100000000000000000000000 11111111111111112222233346 D978 BCF DF9 6556F4221111110000000000000000000000 111111111111122223333334469 D 6322111111000000000000000000000 1111111111222333333334457DB 85332111111100000000000000000000 11111122234B744444455556A 96532211111110000000000000000000 122222233347BAA7AB776679 A32211111110000000000000000000 2222233334567 9A A532221111111000000000000000000 222333346679 9432221111111000000000000000000 234445568 F B5432221111111000000000000000000 864332221111111000000000000000000 234445568 F B5432221111111000000000000000000 222333346679 9432221111111000000000000000000 2222233334567 9A A532221111111000000000000000000 122222233347BAA7AB776679 A32211111110000000000000000000 11111122234B744444455556A 96532211111110000000000000000000 1111111111222333333334457DB 85332111111100000000000000000000 111111111111122223333334469 D 6322111111000000000000000000000 11111111111111112222233346 D978 BCF DF9 6556F4221111110000000000000000000000 011111111111111111222222233444556C 654433332211111100000000000000000000000 000111111111111111112222222233445C 643332222111110000000000000000000000000 000001111111111111111122222222333557BF75433222211111000000000000000000000000000 000000011111111111111111122222233347E7AB322222111100000000000000000000000000000 Ok


★2019/09/22 追記
 CP/M-86はネットから入手できるソフトが思ったより多くないですね^^;
 デジタルリサーチ以外のCコンパイラを探したところ、Aztec Cを見つけました。
 でもincludeでファイルが読めないとのエラーが出てコンパイルできない・・
 CP/M-86が正常に動いていないのか・・

Aztec Cでのコンパイルエラー
C>dir C: ARCV CMD : AS CMD : C LIB : CC CMD C: CCB CMD : CNM CMD : CPM86 ARC : CRC CMD C: CRCLIST : D11 LIB : D20 LIB : DEVRLS DOC C: DIFF CMD : DOS11 ARC : DOS20 ARC : EXMPL C C: G ARC : G LIB : HEADER ARC : HEX86 CMD C: LB CMD : LN CMD : M LIB : M87 LIB C: M87S LIB : MATH ARC : MCH86 ARC : MISC ARC C: OBD CMD : ORD CMD : OVBGN O : OVLD O C: OVLDPATH O : S ARC : S LIB : SQZ CMD C: SROM O : STDIO ARC : STKSIZ C : TERM ARC C: STDIO H : CTYPE H : CTMPA28 638 : CTMPB28 638 C: CTMPC28 638 : CTMPD28 638 : HELLO C : CTMPE28 638 C>type hello.c #include <stdio.h> main() { printf( "Hello!" ); } C>cc hello Aztec C 8086 3.20d 7-18-85 (C) 1982,83,84,85 by Manx Software Systems, Inc. #include <stdio.h> ^ HELLO.c:1: ERROR 47: open failure on include file: C>a:stat stdio.h Drive C: User : 0 Recs Bytes FCBs Attributes Name 10 2k 1 Dir RW C:STDIO .H ---------------------------------------------- Total: 2k 1 C: RW, Free Space: 1,204k C>


★2019/09/22 追記
 上に書いたAztec Cのコンパイルエラーですが、#includeで指定するファイルを<>ではなく""で囲むとエラーが出なくなりました。
 下のログはDRC(デジタルリサーチ社製)とAztecCでのコンパイル状況と実行ファイルのサイズの比較です。
 AztecCの方がかなりコンパクトな実行ファイルを作成してますね。
 まぁもっと大きなプログラムの場合、どうなるかはやってみないと判らないですが・・

Aztec CとDRCとの比較
B>drc hello -------------------------------------------------- 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 hello.c: code: 14 static: 7 extern: 160 B>link86 hello=hello -------------------------------------------------- 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 05ADD DATA 00EA8 USE FACTOR: 17% B>c: C>cc hello Aztec C 8086 3.20d 7-18-85 (C) 1982,83,84,85 by Manx Software Systems, Inc. 8086 Assembler Vers. 3.20d 7-18-85 C>ln hello.o c.lib Aztec C Linker Vers. 3.20d 7-18-85 Base: 0000 Code: 1238 Data: 02d4 Udata: 0200 Total: 001820 C>a:stat b:hello.* Drive B: User : 0 Recs Bytes FCBs Attributes Name 1 2k 1 Dir RW B:HELLO .C 213 28k 2 Dir RW B:HELLO .CMD 5 2k 1 Dir RW B:HELLO .OBJ 4 2k 1 Dir RW B:HELLO .SYM ---------------------------------------------- Total: 34k 5 B: RW, Free Space: 1,018k C>a:stat c:hello.* Drive C: User : 0 Recs Bytes FCBs Attributes Name 1 2k 1 Dir RW C:HELLO .C 46 6k 1 Dir RW C:HELLO .CMD 2 2k 1 Dir RW C:HELLO .O ---------------------------------------------- Total: 10k 3 C: RW, Free Space: 1,180k C>


★2019/10/22 追記
 Aztec Cのコンパイルオプションでインクルードドライブを標準ヘッダファイルのあるドライブ(今回の場合はCドライブ)に指定するとエラーが出なくなりました。

   cc -ic: SrcFileName


★2019/09/23 追記
 AztecCの著作権についてメモしておきます。

 the official AZTEC C onlineのサイトでApple IIとCommondore 64用のAztec Cが公開されていて、このサイト内のLeap into a new dimension with Aztec Cのページで免責事項として次のように記載されています。
 Apple IIとCommondore 64用のAztec Cに関してはfreeで使っていいようです。


Disclaimer

This website and the content available from this website unless otherwise noted are original or derivative works and as such the licencing by the original authors applies insofar as legal Copyright ownership applies. Bill Buckels makes no claims of ownership whatsoever for the content available from this website unless otherwise noted, and further assumes no liability for the results of its use.

You may use the content available from this website in any way you find useful (subject to all the aforestated conditions of use) and provided that you agree that Bill Buckels has no warranty obligations or liability resulting from said use in any way whatsoever. If you do not agree or if your use is not Fair then do not download from this website .



 google翻訳が下記で「所有権を一切主張せず」とあるので少なくともこのサイトで公開されているApple IIとCommondore 64用のコンパイラに関しては自由に使えるようです。


免責事項

このウェブサイトおよびこのウェブサイトから入手可能なコンテンツは、特に明記しない限り、オリジナルまたは二次的著作物であり、著作権の法的所有権が適用される限り、オリジナル著者によるライセンスが適用されます。ビル・バックルズは、特に明記しない限り、このウェブサイトから入手可能なコンテンツの所有権を一切主張せず、さらにその使用結果について責任を負いません

このウェブサイトから入手できるコンテンツは、有用と思われる方法で使用することができます(すべての植林された使用条件に従うものとします)。また、Bill Buckelsが何らかの方法で上記の使用に起因する保証義務または責任を負わないことに同意するものとします。同意しない場合、または使用が公正でない場合は、このWebサイトからダウンロードしないでください 。




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

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