懐かしのMS-DOSプログラミング [sc](★0)
-
- 1
- 2010/04/21(水) 12:42:23
-
mov dx,offset msg
mov ah,9
int 21h
mov ax,4c00h
int 21h
msg db '懐かしのDOS時代のプログラミングについて語ろうぜ',0dh,0ah,'$'
-
- 259
- 2011/04/19(火) 23:59:57.68
-
親プロセス環境へのポインタ(非公開)がpsp:16h辺りにあったような気がする
-
- 260
- 2011/04/21(木) 00:01:51.48
-
親プロセスのPSPのセグメントかな。
PSP:16-17hだったと思う。
-
- 261
- 2011/04/28(木) 11:36:34.33
-
>>218
cd8枚組だっけか
買ったよ
次はDVDで出るかもなんて冊子に書かれてた
-
- 262
- 2011/06/20(月) 22:08:52.71
-
LSI C-86は俺の青春。
何万円もしたCコンパイラが無料で手に入るなんて夢のようだった。
-
- 263
- 2011/06/21(火) 12:43:24.37
-
でもパラメータのレジスタ受け渡しとかやってるのに
吐き出したコードの速度は遅いんだよな。
同じソースで吐き出したコードを比べると
Turbo-C > MS-C >> LSI-C
な感じ。
-
- 264
- 2011/06/22(水) 08:26:38.88
-
LSI-Cの出力したアセンブリリストを加工するsedスクリプトを書いたなぁ。
それだけで数%は速くなった記憶が。
-
- 265
- 2011/06/22(水) 21:09:03.72
-
この時代は何でも出来そうな気がしていた
-
- 266
- 2011/06/26(日) 22:16:55.97
-
>>262
未だに使い続けてる俺
-
- 267
- 2011/07/09(土) 09:57:32.88
-
問題
Turbo-C 2.0のメモリモデルの特徴を表にしてまとめなさい
-
- 268
- 2011/07/09(土) 22:53:18.85
-
MS-Cとほぼ同じだけど、ラージだとスタックはDGROUPの外なのが目立ったな。
ヒュージだとDGROUPそのものが存在しない。
-
- 269
- 2011/07/12(火) 22:14:03.78
-
その時代のMS-Cには、タイニーモデルはまだ存在してなかったね。
-
- 270
- 2011/07/30(土) 13:03:37.64
-
【OS】MS-DOS、誕生から30年に [11/07/28]
http://toki.2ch.net/test/read.cgi/bizplus/1311974777/
-
- 271
- 2011/07/30(土) 23:43:10.44
-
もう30年も経つんだな。
QDOSとかSCPとか懐かしい言葉だ。
DOS誕生の経緯は「MS-DOSエンサイクロペディア」に詳しく書かれてたけど、今でも持ってる。
-
- 272
- 2011/09/01(木) 19:37:33.24
-
ぐぐっても見かけないからここにこっそり書き残しておこう
tasm32のparity?の生成コードはmasm等の逆
-
- 273
- 2011/09/01(木) 22:21:02.45
-
ボーランドはアンチMSだったからな。
Turbo-Cのマウス制御関数の説明に、
「Microsoft形式のマウスには対応しておりません」
とキッパリ書いてある、なんてこともあった。
-
- 274
- 2011/09/01(木) 22:35:37.48
-
そりゃマウスドライバの話だべ
-
- 275
- 2011/09/02(金) 00:27:18.69
-
mouse.comとmouse.sysか
mouse.comのほうが見た目良かったんだが、再配布禁止だったからなあ…
-
- 276
- 2011/09/02(金) 00:48:57.49
-
ソフト側ではどちらでも動くように作れてたような気がするし
ADDDEVなどで切り替えたりしてたような気もするし
今となってはどうでもいい小手先か
-
- 277
- 2011/09/02(金) 01:15:19.43
-
>>276
基本同じなんだが、困ったことに微妙に違う所があったりした
俺はそのへんめんどいので自前ドライバを使ってたが
-
- 278
- 2011/09/03(土) 18:06:47.28
-
>>195
IBM-DOS2000買うとか?(CDで売ってた)
多分まだ売ってるはず
-
- 279
- 2011/10/08(土) 19:32:22.10
-
power.exeってMS-DOSの処理が空いている時にhalt命令で消費電力を
下げるらしいですが、ユーザープログラムでこの「空いてる状態」を
作り出すにはどうしたらよいでしょうか?
(C言語ならgetch()すればいい?)
-
- 280
- 2011/10/09(日) 00:53:11.24
-
>>279
haltからの復帰には例外が必要。
自動的に復帰させるためには、haltさせる前に、復帰させるための例外を用意してやる必要がある。
タイマなんかを使うんでは無いかな。
-
- 281
- 2011/10/09(日) 11:13:26.33
-
>>280
例外じゃなくて割り込みじゃないのか?
リアルモードで例外は扱えなかったと思ったけど。
-
- 283
- 2011/10/09(日) 18:56:19.31
-
ATならタイマIRQ0、9821ならカレンダIRQ15(初期の9821はよく知らん)が常時ぶん回ってるから
通常、hltで止まることはないよ(どのみちキー入力IRQ1で復帰するけど)
-
- 284
- 2011/10/09(日) 19:10:56.89
-
DOSに制御が移る→暇そうならint 28h→power.exe
なんで、暇なら直接int 28hぶん回すのが手っ取り早いんじゃね
-
- 286
- 2011/10/10(月) 01:00:41.71
-
int28hは呼び出し側で特定のレジスタ値をセットする必要はないはずだよ
int28hは「DOSが暇な時に動いて欲しい複数の常駐物のチェーンの入り口」なんで
それぞれの常駐物が勝手に何とかしてるはず、ただ、スタック少なすぎるのはまずいかも
C言語とかで普通に作ったプログラムならスタックは十分だと思うけど
破壊されちゃまずいレジスタはint28h前後で念のため退避復元するか、呼び出し後に再設定だね
古い記憶なんで間違ってたらスマソ
-
- 289
- 2011/10/10(月) 14:29:16.43
-
そういう動作環境なら特に問題ないかもね
まあ、DOSやBIOSを介してキー入力してるならpower.exeがうまいことhlt実行してくれるだろうから
標準ライブラリのgetch()等を使ってる限りは独自にint28h呼び出さなくても平気かもだけど
98だとそもそもINT18 AH=0のキー入力BIOSが「キー入力バッファ監視無限ループ」なんだけど
power.exeがトラップしてpower.exe内部でループさせるようにしてhlt実行されとるね
-
- 290
- 279
- 2011/10/10(月) 19:06:22.80
-
空ループの中でint28hを呼ぶ版と呼ばない版を用意して実験した結果、
呼ぶ版ではpower.exeのアイドル率が上昇しているのが確認できました。
仮想86環境+DOSエクステンダでhlt命令の埋め込みも実験してみましたが
一瞬で制御が戻って来ましたのでループの中で呼んでも問題なさそうです。
有用な情報ありがとうございました。
-
- 291
- 2011/10/13(木) 22:21:22.37
-
ハードを骨までしゃぶれたDOS時代は楽しかったな〜
-
- 292
- 2011/10/19(水) 23:44:20.28
-
なんとなくBIOSを使わずにCTRCを直接制御して480ラインにしたいと思って
// Text GDC 30(16*30=480) line
outp( 0x62,0x0e ); // Sync command
outp( 0x60,0x4e ); // C/R (80-2 = 78)
outp( 0x60,(0x08<<5)|0x07 ); // VS(l) | HS
outp( 0x60,(0x09<<2)|(0x08>>3) ); // HFP | VS(h)
outp( 0x60,0x07 ); // HBP
outp( 0x60,0x07 ); // HFP
outp( 0x60,0x480 & 0xff ); // L/F(l)
outp( 0x60,(0x19<<2)|(0x480>>8) ); // VBP | LFh(h)
outp( 0x62,0x47 ); // Pitch command
outp( 0x60,0x50 ); // 80
// Graphics GDC 480 line
outp( 0xa2,0x0e ); // Sync command
outp( 0xa0,0x4e ); // C/R (80-2 = 78)
outp( 0xa0,(0x08<<5)|0x07 ); // VS(l) | HS
outp( 0xa0,(0x09<<2)|(0x08>>3) ); // HFP | VS(h)
outp( 0xa0,0x07 ); // HBP
outp( 0xa0,0x07 ); // HFP
outp( 0xa0,0x480 & 0xff ); // L/F(l)
outp( 0xa0,(0x19<<2)|(0x480>>8) ); // VBP | LFh(h)
outp( 0xa2,0x47 ); // Pitch command
outp( 0xa0,0x50 ); // 80
という風に作ってみたけど画面が映らなくなってしまいます。
CRTCの直接制御で9821の画面モードに変更するという事自体が間違っているのでしょうか?
-
- 293
- ◆0uxK91AxII
- 2011/10/20(木) 01:15:23.37
-
>>292
256色の640*480なら、
outp(0x6a, 0x07);
outp(0x6a, 0x21);
http://www.webtech.co.jp/company/doc/undocumented_mem/io_disp.txt
-
- 294
- 2011/10/20(木) 01:35:06.70
-
それだけで解像度まで変わったか?
-
- 295
- ◆0uxK91AxII
- 2011/10/20(木) 03:39:41.71
-
変わらなかった。
/(^o^)\
>>292のようなGDCの設定に加えて、outp(0x9a8, 0x01);が要る気がしてきた。
-
- 296
- 2011/10/20(木) 20:16:52.46
-
映らなくなったって事は何か足りないよりもパラメータ間違ってんじゃね?
-
- 297
- 2011/10/20(木) 23:56:32.98
-
GDC 5MHz,HS 31KHz を対象にしているので 0x9a8 は関係ないと考えています。
-
- 298
- 2011/10/21(金) 18:02:45.48
-
>>292
・SYNCコマンドのパラメータ先頭1個が抜けてる、よって後続の設定値全部間違ってる。
・SYNCコマンド0x0Eを使えば表示はどのみち消える、STARTコマンド発行するか、SYNCコマンド0x0Fを使う。
・480ラインなのに16進数の0x480で設定してるから1152ラインとか無茶振りすぎる。
・480ラインに設定出来てもSCROLLコマンド設定しなきゃ見えない(はず)。
・上記修正してもBIOS AX=300Ch BH=32h INT18hの表示と違い、画面全体が水平方向にずれて何か変。
・ちなみにBIOSでも画面表示とカーソル表示は消えるので自前で再設定する。
-
- 299
- 2011/10/21(金) 18:05:04.21
-
BIOS解析してどういうパラメータ設定してるか見た方が早い気がする
-
- 300
- 2011/10/21(金) 18:15:24.95
-
まあそうだねー
>>292の質問は画面映らなくて困ってるって話なんで、それは何とかなるやろ
-
- 301
- 2011/10/21(金) 20:27:08.28
-
>>298
SYNCコマンドが1つ不足していたのと0x480を修正したら
テキストは左寄り&グラフィックは乱れていますが画面には映るようになりました。
ありがとうございます。
30行系ソフトのソースを見たのですがBIOSが対応していない26〜29行は
CRTCを制御して、25,30行はBIOSを使うようになっていたので
パラメータがわからなかったので…
パラメータはもうちょっと調べて見ます。
-
- 302
- 2011/11/02(水) 23:48:17.04
-
DOSの環境変数ってメモリのどこに記憶されているのでしょうか?
最初はDOSファンクションにあるのかと思っていましたがそれらしいのがなく、
CRT(getenv)のソースを見たらグローバル変数のポインタを参照して
その中から該当する文字列を返しているようでした。
たぶん、グローバル変数はStartupで設定されていると思うのですが…
-
- 303
- 2011/11/02(水) 23:56:00.48
-
DOS(コマンドプロンプトではない)なら
PSPのどっかに、環境変数を示すセグメントが書いてあるよ。
-
- 304
- 2011/11/03(木) 00:01:05.69
-
>>303
ありがとうございます。
やっぱりPSPですか…。
-
- 305
- 2011/11/03(木) 00:02:32.20
-
ds:2c
-
- 306
- 2011/11/03(木) 16:27:58.08
-
>>302
MS-Cならgetenv関数が用意してあるが
-
- 307
- 2011/11/03(木) 17:24:10.86
-
既にgetenvのソースを読んだ人に向かって
getenvでできるよ(キリッ とか言われても・・・
-
- 308
- 2011/11/03(木) 23:37:40.29
-
PSPの資料を見つけたのでなんとかなりそうです。
ttp://www5c.biglobe.ne.jp/~ecb/assembler2/7_5.html
-
- 309
- 2011/11/11(金) 22:30:52.49
-
質問。DOS(16Bit)上からのCONFIG.SYSで読込む、デバイスドライバーの*.SYSや*.EXEのHEADER情報と、
実行(起動?)手順が知りたいのですが、ググッたが参考になる所が見つけられませんでした。
コマンドライン(又は、AUTOEXEC.BATからの実行)での*.EXEのHEADER情報は、色々と見つかり参考にさせて頂きました。
デバイスドライバー又はコマンドラインで実行できる形式の物を作りたいと思っています。
お指導・ご指南を、お願いいたします。
-
- 310
- 2011/11/12(土) 07:36:04.35
-
EXEヘッダの情報と、デバイスドライバのヘッダの構造は勝手に調べてもらうとして
俺の記憶をたどると、
COM型ドライバはそのまま読み込まれ、EXE型はax=4B01(だったと思う)でロードされる。
後は、デバイスヘッダに書かれているアドレスに来るリクエストの指示に従って初期化や常駐等を行う。
デバイスヘッダは、とりあえずぐぐって最初に出てきたDR-DOSのページでも参考になるはず。
http://hp.vector.co.jp/authors/VA003720/lpproj/drdos/progdoc/sysprog/chap6j.htm
このページを共有する