OSと言えばコレでしょ!CP/Mスレ ver.4

0001ナイコンさん2018/10/08(月) 15:49:50.58
「世界初の個人で買えるOS」であるCP/Mについて語るスレです。

前スレ
OSと言えばコレでしょ!CP/Mスレ ver.3
http://matsuri.2ch.net/test/read.cgi/i4004/1416873034/
https://matsuri.5ch.net/test/read.cgi/i4004/1416873034/

0183ナイコンさん2021/09/27(月) 23:41:41.68
CP/M86やCP/M68Kでもテキストファイル末尾に0x1aは必要だったんですか?

0184ナイコンさん2021/09/30(木) 07:06:19.30
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
になります

0185ナイコンさん2021/09/30(木) 22:33:39.13
>>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
になります

0186ナイコンさん2021/10/01(金) 07:50:00.65
上の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

0187ナイコンさん2021/10/02(土) 12:23:35.35
こちらの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

0188ナイコンさん2021/10/02(土) 12:40:42.01
続き
コンパイル方法は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
になります

0189ナイコンさん2021/10/04(月) 21:05:44.10
PC-9801Fを買ったとき、N88diskBASIC環境でアセンブラがなかったから
CP/M86のディスクだけ買ってきた。
(ディスク1万円、マニュアル1.5万円でNECは売ってたんだよね)

で、CP/M86のアセンブラ使ってプログラム作っては、DiskBasic側で読み込んで
BASIC+機械語の形で動かしてた。

0190ナイコンさん2022/05/14(土) 10:57:13.77
ロマンティックが止まらない?

0191ナイコンさん2023/01/04(水) 00:52:10.32
CP/M86が動くx86系CPUって、どれが最後なんだろ?

0192ナイコンさん2023/01/04(水) 19:51:19.59
リアルモードがある奴ならCP/M86は動きそうな気はするけどFD付かないマザボでも動くんだろうか?

0193ナイコンさん2023/01/05(木) 07:23:18.56
vmware上でなら、ryzenでも動いた。実機では試してないけど。

0194ナイコンさん2023/01/06(金) 14:18:16.16
どのCPUでもMS-DOSは動くのかな?

0195ナイコンさん2023/01/10(火) 08:50:46.09
リヤルモードが切り捨てられない限り

0196ナイコンさん2023/01/10(火) 11:10:40.21
uefiのみになってBIOS互換モード廃止されたM/BならCPU自体は対応できても起動できなくなるのでは?

0197ナイコンさん2023/01/10(火) 15:50:35.72
いちおうBIOS対応してても動作が酷くて実用にならないようなのもあるしな

0198ナイコンさん2023/01/11(水) 10:37:50.21
MS-DOSにはさすがに自己書き換えコードは入ってないかな?

0199ナイコンさん2023/01/11(水) 13:44:24.90
どうだろうね。masmの教科書で、任意のソフト割り込みをかけるマクロがint21→バイナリでcd 21だけど、この21を書き換えることで任意の割り込みをかけるようなマクロの記載があったから、そのまま使っていれば自己書き換えするはず

0200ナイコンさん2023/05/09(火) 12:04:54.52
ひさびさage

0201ナイコンさん2023/05/11(木) 11:49:41.10
>>199
マクロならコンパイルした後は変わらないのでは?

02021992023/05/11(木) 12:49:48.03
Cのマクロならね。
masmだからそのまま展開されます。

0203ナイコンさん2023/05/11(木) 13:44:07.26
ソースを書き換えるマクロじゃなくてコードを書き換えるマクロが展開されるならCでもアセンブラでもコード書き換えは出来るか

0204ナイコンさん2023/05/11(木) 21:27:51.90
コードセグメントのアドレスさえ手に入れられる言語で、8086のようにコードセグメントでも書き込みができるCPUなら

0205ナイコンさん2023/05/12(金) 10:30:50.83
ジャンプテーブルとか動的に生成したりしたよな

0206ナイコンさん2023/10/18(水) 13:11:29.02
わかんねぇわかんねぇって思いながら、ずっと俺のこと考えてな

0207ナイコンさん2023/10/19(木) 10:35:26.01
5年で206書き込みか。

0208ナイコンさん2023/11/14(火) 20:19:14.86
・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」ファイルが既に入っています。

0209ナイコンさん2023/11/14(火) 20:21:18.68
バイナリエディタで「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
------------------------------------------------------------------

0210ナイコンさん2023/11/14(火) 20:24:48.14
「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
------------------------------------------------------------------

0211ナイコンさん2023/11/14(火) 22:06:06.55
今どきPC-9801-16なんて誰も持ってないw

0212ナイコンさん2023/11/15(水) 03:10:49.88
PC-9801用で68000ボードっていうと勝山システムのKSB-2が圧倒的に
安かったからな
 CPU乗っ取り形じゃなくてI/Oや表示は本体のCPUにやらせてCP/M-86と
CP/M-68Kが98側とボード側で同時に動く変態ボードだった。

0213ナイコンさん2023/11/15(水) 20:08:18.81
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メモリダンプが表示されるはず)

0214ナイコンさん2023/11/18(土) 16:12:28.05
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

0215ナイコンさん2023/11/18(土) 16:13:36.28
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

0216ナイコンさん2023/11/18(土) 16:14:32.49
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
------------------------------------------

0217ナイコンさん2023/11/19(日) 14:05:25.33
現時点では、CP/M-68Kが起動できない原因はまだわかりませんが、
下記のように、スタートアドレス設定が必要とか、スタックをセットし、
INITへジャンプする必要があると思いますけど。

L68K,HI68プログラム(後半)にスタックプログラム(PUSH,POP,IRETなど)が既に入っていますが、
何も実行されない状態で、CP/M-68Kが起動できないみたいですが。

例えば、L68KのCMDベッターにスタートアドレスとか、04のスタックアドレスをセットするとか。
もしくはSR400.MAPファイルを正しく編集するとか。

逆アセンブラで(L68K),HI68プログラムに6F01,(6F06)アドレスが記載されてあり、
INITへジャンプするための作業領域?とか、チェックサム値?をセットするとか?

●SREAD
「スタートアドレスとチェックサムはすべて省略しています」と記載されてありますけど、
スタートアドレスをどのように設定するのがよくわからず、
CMDベッターにスタートアドレスを入れるとか、まだ不明ですが。

0218ナイコンさん2023/11/19(日) 14:06:57.44
[参考文献]

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はどこにあってもかまいません。
--------------------------------------------------------------------------------

0219ナイコンさん2023/11/19(日) 17:52:47.65
[参考文献]

プロセッサ 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ポート)しかなく、
サポートソフトの概要を読んでも使いものになりません。

0220ナイコンさん2023/11/19(日) 19:36:33.88
おう、阪神が西武をこてんぱんにして日本一になった年だな

0221ナイコンさん2023/11/20(月) 08:05:52.44
-----------
 :
 :
 CALL SUBR
 RET
----↓-----
 :
 :
 JMP SUBR
----↓-----
 :
 :
SUBR:
-----------

0222ナイコンさん2023/11/20(月) 20:42:20.37
-----------
 :
 :
 CALL SUBR
 RET
----↓-----
 :
 :
SUBR:
----↓-----
 :
 :
 JMP SUBR

0223ナイコンさん2023/11/25(土) 20:59:01.64
・・・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
-----------------------------------------------

0224ナイコンさん2023/11/25(土) 21:01:43.45
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が起動できないのではないかと思うけど?

0225ナイコンさん2023/11/26(日) 15:59:42.03
例外(動作保証なし)ですが、「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)を用いて、プログラム実行を試してみました。

0226ナイコンさん2023/11/26(日) 21:03:14.76
再度、BIOS68Kプログラムを逆アセンブラで覗いてみたら、
なぜ、stop命令が入っていたかわからないですが。
----------------------------
move.b D0,$600000
stop #$2000
clr.l D0
----------------------------

0227ナイコンさん2023/11/28(火) 21:53:53.94
BDOS機能の呼出しには68000の例外処理命令Trapを使用する。

68000は0番地から3FFFHまでの各4バイトには
255個の例外ベクターを持つ必要があります。

やはり、例外ベクター領域が何も入ってないと
CP/M68Kが起動できないのではないかと思うけど。

https://ipsj.ixsq.nii.ac.jp/ej/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=25038&item_no=1&attribute_id=1&file_no=1&page_id=13&block_id=8

0228ナイコンさん2023/11/28(火) 22:43:59.30
>>223
上の方は_intって書いてあるね

0229ナイコンさん2023/11/29(水) 20:34:16.82
>>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に訂正箇所が記載してあるかどうか確認すると良いですが。

0230ナイコンさん2023/11/30(木) 21:29:49.63
マイコンピュータNO.14 入門特集8086
アセンブリ・プログラミング103ページを参照し、
プログラム本体はコード領域に、メモリはデータ領域に
指定して用いましたが、さらにスタックを用いるときは、
それをスタック領域に、また繰り返し転送、比較を行うときには、
予備領域を用います。これらのいくつかの領域を用いるときは、
それぞれの区分名がどの領域に属するものであるかを、
すべてASSUME命令で指定しておきます。
例えば、CSEG、DSEG、SSEGをそれぞれコード、データ、
スタック領域に指定するには、
ASSUME CS:CSEG
ASSUME DS:DSEG
ASSUME SS:SSEG
ASSUME ES:NOTHING
のように書きます。

0231ナイコンさん2023/11/30(木) 21:36:39.99
1つのASSUME命令の処理対象に、いくつかの領域指定を
同時に行うことができます。このときはそれらを ,(カンマ)で
区切って並べておきます。例えば、
上の例は、
ASSUME CS:CSEG , ASSUME DS:DSEG
ASSUME SS:SSEG , ASSUME ES:NOTHING
と書きます。

0232ナイコンさん2024/01/21(日) 19:38:09.52
>>212
あぁ勝山さん元気かなぁ?独特の雰囲気のエンジニアだった

0233ナイコンさん2024/05/02(木) 02:42:18.31
最近になってPlus初めて使った。
リブートなしってこんなに快適だったのかと

新着レスの表示
レスを投稿する