OSと言えばコレでしょ!CP/Mスレ ver.4
CP/M86やCP/M68Kでもテキストファイル末尾に0x1aは必要だったんですか? http://www.brackeen.com/vga/ ここにVGAの320x200の256色表示のC言語でのプログラミングの方法が載ってるね CP/M-86版のAztec C 3.2d用にとりあえず、pixel.cを移植してみました CP/M-86版のAztec C 3.2dはメモリモデルにsmallモデルしか使えないようなので VGAのメモリアクセスにはAztec C 3.2dの組み込み関数のpokebを使ってます CP/M-86 Aztec C 3.2d VGA TEST pixel.c https://pastebin.com/iNnP3t6P コンパイル方法は cc pixel.c ln pixel.o m.lib c.lib です Bドライブをカレントディレクトリにしてコンパイルする時に インクルードファイルがBドライブにある場合は cc -ib: pixel.c ln pixel.o m.lib c.lib になります >>184 にアップしたプログラムで時間計測の部分にミスがありました 修正版をアップします CP/M-86 Aztec C 3.2d VGA TEST pixel.c https://pastebin.com/JV0sDqR2 また、lines.cも移植してみました CP/M-86 Aztec C 3.2d VGA TEST lines.c https://pastebin.com/ShmSSnec コンパイル方法は cc lines.c ln lines.o m.lib c.lib です Bドライブをカレントディレクトリにしてコンパイルする時に インクルードファイルがBドライブにある場合は cc -ib: lines.c ln lines.o m.lib c.lib になります 上のCP/M-86でAztec C Ver 3.2dを使う方法がわかりにくいと思われるので CP/M-86でAztec C Ver 3.2dを使う方法をまとめてみました VMware PlayerのCP/M-86上でAztec C Ver3.2dを使う方法 https://pastebin.com/0zpmybh7 こちらのVGAの320x200の256色画面のC言語によるプログラミングのサンプルプログラムを CP/M-86のAztec C 3.2dに移植してみました 256-Color VGA Programming in C http://www.brackeen.com/vga/ ここのこれらのプログラムを移植しました pixel.c lines.c rect.c circle.c bitmap.c palette.c unchain.c modes.c mouse.cはマウスが使えないので移植してません 5chはたくさんのURLを一度に貼れないのでこちらに各ソースコードのURLを貼ってあります https://pastebin.com/tGGgYmGQ 続き コンパイル方法は8つのプログラムどれも一緒です コンパイル方法は cc pixel.c ln pixel.o m.lib c.lib です Bドライブをカレントディレクトリにしてコンパイルする時に インクルードファイルがBドライブにある場合はccで-iオプションで-ib:のように指定します cc -ib: pixel.c ln pixel.o m.lib c.lib になります PC-9801Fを買ったとき、N88diskBASIC環境でアセンブラがなかったから CP/M86のディスクだけ買ってきた。 (ディスク1万円、マニュアル1.5万円でNECは売ってたんだよね) で、CP/M86のアセンブラ使ってプログラム作っては、DiskBasic側で読み込んで BASIC+機械語の形で動かしてた。 CP/M86が動くx86系CPUって、どれが最後なんだろ? リアルモードがある奴ならCP/M86は動きそうな気はするけどFD付かないマザボでも動くんだろうか? vmware上でなら、ryzenでも動いた。実機では試してないけど。 uefiのみになってBIOS互換モード廃止されたM/BならCPU自体は対応できても起動できなくなるのでは? いちおうBIOS対応してても動作が酷くて実用にならないようなのもあるしな MS-DOSにはさすがに自己書き換えコードは入ってないかな? どうだろうね。masmの教科書で、任意のソフト割り込みをかけるマクロがint21→バイナリでcd 21だけど、この21を書き換えることで任意の割り込みをかけるようなマクロの記載があったから、そのまま使っていれば自己書き換えするはず >>199 マクロならコンパイルした後は変わらないのでは? Cのマクロならね。 masmだからそのまま展開されます。 ソースを書き換えるマクロじゃなくてコードを書き換えるマクロが展開されるならCでもアセンブラでもコード書き換えは出来るか コードセグメントのアドレスさえ手に入れられる言語で、8086のようにコードセグメントでも書き込みができるCPUなら わかんねぇわかんねぇって思いながら、ずっと俺のこと考えてな ・CP/M68Kを98に移植する。I/O雑誌 工学社 1986年8月号 (234ページ参照) ------------------------------------------------------------------ https://archive.org/details/Io19868/page/n235/mode/2up ------------------------------------------------------------------ ハード構成: PC-9801本体 + PC-9801-16(68000ポード) + PC-9801-17(68000専用メモリポード) ソフト構成: CP/M-86(OS) + CPM400.SR など ・CP/M-68K バージョン 1.2 バイナリファイル ------------------------------------------------------------------ http://www.cpm.z80.de/download/68kv1_2.zip ------------------------------------------------------------------ 「68kv1_2.zip」を解凍し、「DISK」フォルダの中にある「CPM400.SR」「CPMLIB」「LO68.REL」 「RELOC.REL」ファイルが既に入っています。 バイナリエディタで「SREAD.CMD」「L68K.CMD」「HI68.CMD」バイナリファイルを編集しますが、 そのまま実行できないので、以下のようにCMDベッターを作成する必要があります。 [1]「SREAD.CMD」CMDベッターファイル内容は次のとおり。 ------------------------------------------------------------------ 0000 01 27 00 00 00 27 00 00 ・・・・・・・・・00 0010 00 00 00 00 00 00 00 00 ・・・・・・・・・00 0180 B8 00 00 2E A3 3C 02 B8 ・・・・・・・・・BA ------------------------------------------------------------------ ※ PC-9801-16(68000ポード)が無くても「CPM400.SRO」ファイル出力可能です。 [2]「L68K.CMD」CMDベッターファイル内容は次のとおり。 ------------------------------------------------------------------ 0000 01 31 00 00 00 31 00 00 ・・・・・・・・・00 0010 00 00 00 00 00 00 00 00 ・・・・・・・・・00 0180 BB CA 02 E8 1F 00 B8 00 ・・・・・・・・・41 ------------------------------------------------------------------ [3]「HI68.CMD」CMDベッターファイル内容は次のとおり。 ------------------------------------------------------------------ 0000 01 34 00 00 00 34 00 00 ・・・・・・・・・00 0010 00 00 00 00 00 00 00 00 ・・・・・・・・・00 0180 BB E5 02 E8 0E 00 B8 00 ・・・・・・・・・30 ------------------------------------------------------------------ 「SREAD.CMD」「L68K.CMD」「HI68.CMD」バイナリファイルを編集した後、 できれば、MS-DOS上で逆アセンブルして、「CSEG」「ORG 100H」を追加し、 プログラムを編集してからCP/M-86上でASM86コマンドでアセンブルして、 GENCMDコマンドで「CMD」実行形式ブログラムを出力しておけば良いです。 「SREAD.CMD」バイナリファイルの中に一部の逆アセンブルできない部分がありますが、 しかたなく、DW命令でバイナリデータ([例] DW 2EA3H)を直接編集しておくと良いです。 GENCMDコマンドで「CMD」実行形式ブログラムを出力した後、ちょっと面倒ですが、 バイナリエディタで「A3 2E」<->「2E A3」を逆変換して修正する必要があります。 それは2バイトのチェックサム値っぽいではないか?と推測されますが。 ・バイナリエディタ MEDIT ------------------------------------------------------------------ https://www.vector.co.jp/soft/dos/util/se020725.html ------------------------------------------------------------------ ・マルチプル機械語エディター EDIX (チェックサム機能付き) ------------------------------------------------------------------ https://www.vector.co.jp/soft/dos/util/se000796.html ------------------------------------------------------------------ PC-9801用で68000ボードっていうと勝山システムのKSB-2が圧倒的に 安かったからな CPU乗っ取り形じゃなくてI/Oや表示は本体のCPUにやらせてCP/M-86と CP/M-68Kが98側とボード側で同時に動く変態ボードだった。 L68K.CMD からL68D.CMD(デバッグ用)にコピーして、 0239アドレスに下記の5バイト分を書き換える。 ------------------------------ 0239 F4 E9 FC FF FA 0239 B1 00 CD E0 00 ------------------------------ HI68.CMDからHI68D.CMD(デバッグ用)にコピーして、 0254アドレスに下記の5バイト分を書き換える。 ------------------------------ 0254 F4 E9 FC FF FA 0254 B1 00 CD E0 00 ------------------------------ CP/M-68Kが起動できない場合、上記のデバッグプログラムを作成しておけば、 デバッグプログラムを実行後、DDT86コマンドでメモリダンプを参照できます。 A>DDT86 -D1000:0400 (CPM400.SROメモリダンプが表示されるはず) -D1000:6000 (BIOS68Kメモリダンプが表示されるはず) 68000ボードの0番地のアドレス設定値(スイッチ2G2)と クロック周波数(スイッチ2G3)を取得するプログラムを 作成してみました。 ------------------------------------------ BDOS EQU 0E0h CR EQU 0DH LF EQU 0AH cseg org 100h in al,9Fh and ax,0Fh cmp al,0Ch jnz LBL1 mov cl,9 mov dx,offset OK1 int BDOS jmp LBL5 LBL1: cmp al,0Dh jnz LBL2 mov cl,9 mov dx,offset OK2 int BDOS jmp LBL5 LBL2: cmp al,0Eh jnz LBL3 mov cl,9 mov dx,offset OK3 int BDOS jmp LBL5 LBL3: cmp al,0Fh jnz LBL4 mov cl,9 mov dx,offset OK4 int BDOS jmp LBL5 LBL4: mov cl,9 mov dx,offset NG int BDOS LBL5: mov cl,00h int BDOS dseg org 100h OK1 db CR,LF db 'PC-9801-16 Board 5MHz + 10000h SET OK!!' db CR,LF,'$' OK2 db CR,LF db 'PC-9801-16 Board 5MHz + 20000h SET OK!!' db CR,LF,'$' OK3 db CR,LF db 'PC-9801-16 Board 8MHz + 10000h SET OK!!' db CR,LF,'$' OK4 db CR,LF db 'PC-9801-16 Board 8MHz + 20000h SET OK!!' db CR,LF,'$' NG db CR,LF db 'PC-9801-16 Board no Found!!' db CR,LF,'$' end ------------------------------------------ 現時点では、CP/M-68Kが起動できない原因はまだわかりませんが、 下記のように、スタートアドレス設定が必要とか、スタックをセットし、 INITへジャンプする必要があると思いますけど。 L68K,HI68プログラム(後半)にスタックプログラム(PUSH,POP,IRETなど)が既に入っていますが、 何も実行されない状態で、CP/M-68Kが起動できないみたいですが。 例えば、L68KのCMDベッターにスタートアドレスとか、04のスタックアドレスをセットするとか。 もしくはSR400.MAPファイルを正しく編集するとか。 逆アセンブラで(L68K),HI68プログラムに6F01,(6F06)アドレスが記載されてあり、 INITへジャンプするための作業領域?とか、チェックサム値?をセットするとか? ●SREAD 「スタートアドレスとチェックサムはすべて省略しています」と記載されてありますけど、 スタートアドレスをどのように設定するのがよくわからず、 CMDベッターにスタートアドレスを入れるとか、まだ不明ですが。 [参考文献] https://archive.org/details/Io19837/page/n321/mode/2up [表1 CP/M-68K 移植手順] (I/O雑誌 1983年7月号 319ページ参照) -------------------------------------------------------------------------------- @他のシステムもしくは68KモニタなどでBIOSを作成する。 ASフォーマット・ローダーを作成し、SR400.SYSまたはSR128K.SYSファイルを メモリにロードする(BDOSとCCPのみのファイル)。 B@で作成したBIOSをロードする。 CAでロードしたプログラムの頭($400,$15000)から実行する(スタックをセットし、INITへジャンプする)。 注)BIOS作成時のCP/Mのエントリ・ポイントの変更点 ------------------------------------------------- INIT:SR400 $5F96 ,SR128K $19B96 SR400 $4F4 ,SR128K $150F4 ------------------------------------------------- ●CCP,BDOS,BIOSはどこにあってもかまいません。 -------------------------------------------------------------------------------- [参考文献] プロセッサ 1985年11月号 技術評論社(54〜64ページ参照) https://www.suruga-ya.jp/product/detail/ZSARU6973 その内容にPC-9801-16 ボードの機能概要とMS-DOS上で動作する サポートソフト(NEC製)の概要が記載されてあります。 PC-9801-16 メモリマップとメモリ動作概要とIN,OUT命令(I/Oポート)しかなく、 サポートソフトの概要を読んでも使いものになりません。 おう、阪神が西武をこてんぱんにして日本一になった年だな ----------- : : CALL SUBR RET ----↓----- : : JMP SUBR ----↓----- : : SUBR: ----------- ----------- : : CALL SUBR RET ----↓----- : : SUBR: ----↓----- : : JMP SUBR ・・・BIOSをCCPとBDOSに接ぎますが、このとき_ccpと_initの2つの アドレスだけはリンクしなければなりません。 リンカならすぐにできる、この作業も手で書き加えなければなりません。 SR400.SYSの$4F96は、4EF900000000になっています。 4EF9は絶対アドレス・ジャンプで、この次の部分を _initのアドレスに改めることによりリンクできます。 _ccpは$4F9Cなので、BIOS中の_ccpをこのアドレスにします。 BIOSとのリンクが終わったシステムは、CCPとBDOSの先頭アドレスから 実行を開始することにより、CP/M68Kが走り始めます。 このとき、ディスクが少し動いて何もメッセージもなく、 いきなり、A>のプロンプトが表われ、CP/M68Kが動きます。 このときからCP/M68Kの全ての機能が働きます。 とマイコンピュータNO.12 (徹底特殊 MC68000とCP/M68K)雑誌 (135ページ)に記載してありました。 CPM400.MAPの中身を覗いてみたら、 _ccp(4B8)と_init(6000)アドレスが入っていました。 ----------------------------------------------- _ccp 4B8 global text cpm 400 global text _bdos 4C6 global text _init 6000 equ global abs ----------------------------------------------- DDT.68Kを起動してから「-R BIOS68K」を入力し、 BIOS68Kプログラムを逆アセンブラで覗いてみました。 ----------------------------------------------- movea.l #6F01,A1 : jmp $4B8 : movea.l #6F06,A0 : movea.l #6F80,A1 : movea.l #6F80,A2 ----------------------------------------------- 上記の6F01と6F06と4B8アドレスが見つかっており、 BIOS68Kプログラムを書き換える必要はないですが、 CP/M86のCMDヘッダ側(04)でスタック領域を確保しておかないと CP/M68Kが起動できないのではないかと思うけど? 例外(動作保証なし)ですが、「SREAD」CMDベッターを編集してみて、 それを実行してみたら、SR400.SROが勝手に出力されました。 ------------------------------------------------------------------ 0000 01 18 40 00 00 18 40 00 00 02 C0 0B 00 00 C0 0B 0010 00 00 00 00 00 00 00 00 ・・・・・・・・・・・00 0080 B8 00 00 2E A3 3C 02 B8 ・・・・・・・・・・・BA ------------------------------------------------------------------ 上記のアドレス0180ではなく、0080でした。半年前だけど、 DSEGセグメント(02)を用いて、プログラム実行を試してみました。 再度、BIOS68Kプログラムを逆アセンブラで覗いてみたら、 なぜ、stop命令が入っていたかわからないですが。 ---------------------------- move.b D0,$600000 stop #$2000 clr.l D0 ---------------------------- >>228 ありがとうございます。_intが既にわかっていたけど、 CP/M68K(英語版)の68ページを参照し、 _ccpが記載してあるけど、_intが見つからなかった。 http://www.bitsavers.org/pdf/digitalResearch/cpm-68k/CPM-68K_System_Guide_Jan83.pdf 166ページに前回(NO.11)の訂正と補足が記載してありますけど、 次回NO.13に訂正箇所が記載してあるかどうか確認すると良いですが。 マイコンピュータNO.14 入門特集8086 アセンブリ・プログラミング103ページを参照し、 プログラム本体はコード領域に、メモリはデータ領域に 指定して用いましたが、さらにスタックを用いるときは、 それをスタック領域に、また繰り返し転送、比較を行うときには、 予備領域を用います。これらのいくつかの領域を用いるときは、 それぞれの区分名がどの領域に属するものであるかを、 すべてASSUME命令で指定しておきます。 例えば、CSEG、DSEG、SSEGをそれぞれコード、データ、 スタック領域に指定するには、 ASSUME CS:CSEG ASSUME DS:DSEG ASSUME SS:SSEG ASSUME ES:NOTHING のように書きます。 1つのASSUME命令の処理対象に、いくつかの領域指定を 同時に行うことができます。このときはそれらを ,(カンマ)で 区切って並べておきます。例えば、 上の例は、 ASSUME CS:CSEG , ASSUME DS:DSEG ASSUME SS:SSEG , ASSUME ES:NOTHING と書きます。 >>212 あぁ勝山さん元気かなぁ?独特の雰囲気のエンジニアだった 最近になってPlus初めて使った。 リブートなしってこんなに快適だったのかと read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる