facebook twitter hatena line google mixi email
★お気に入り追加


■ このスレッドは過去ログ倉庫に格納されています

  • 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,'$'

ここまで見た
  • 247
  •  
  • 2011/04/15(金) 00:08:40.80
psp:0にあるのはcdh, 20h。つまりint 20h。
ret命令やjmp 0はint 20hを実行して終わる。


ここまで見た
  • 248
  •  
  • 2011/04/16(土) 21:45:40.90
psp:0へのfar jmpなら、exeファイルであっても
csはpspを指さなければならないという制約をクリアできる。

ここまで見た
jmp farよりも、xor ax,ax; int 21Hの方が短い気がするする。

ここまで見た
  • 250
  •  
  • 2011/04/17(日) 17:36:05.08
comファイルなら。
exeでもコードセグメントが64kB 1つしかないスモールかコンパクトなら可能

ここまで見た
  • 251
  •  
  • 2011/04/17(日) 22:25:49.77
スモールやコンパクトモデルでもCSはコードセグメントを指してる。
初期値がPSPなのはDS。

ここまで見た
  • 252
  •  
  • 2011/04/18(月) 18:09:08.49
とりあえずこういうことか。CP/M臭い・・
 .MODEL SMALL,STDCALL,NEARSTACK
 .DATA
PEXIT dd 00000000h
BDOS dd 00000050h
msg   db 'hello world !', 0dh, 0ah, '$'
 .STACK
 .CODE
 .STARTUP
 mov ax, es
 mov word ptr PEXIT[2], ax
 mov word ptr BDOS[2], ax
 mov dx, offset msg
 mov ah, 09h
 call BDOS
 jmp PEXIT
 END


ここまで見た
  • 253
  •  
  • 2011/04/18(月) 19:55:13.72
BDOSエントリは0005hでなかったか?


ここまで見た
  • 254
  •  
  • 2011/04/18(月) 20:01:59.72
CPM-80ではそうだな。
こっちのはDOS独自のCPM互換機能で0x0050で正解。
CP/M-86には無い。
int 21, retfがあるだけ。

ここまで見た
  • 255
  •  
  • 2011/04/18(月) 22:49:59.27
>>251
あー、そうか。
Cの場合pspを指してるのはdsか。

ここまで見た
  • 256
  •  
  • 2011/04/18(月) 23:05:17.65
お前ら何語を話してるんだ?w

ここまで見た
  • 257
  •  
  • 2011/04/19(火) 05:58:51.81
爺共が久々に活性化w

ここまで見た
  • 258
  •  
  • 2011/04/19(火) 10:11:02.79
システムコール呼び出しでcall 50hなんて使ったことないな。

ここまで見た
  • 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
例外じゃなくて割り込みじゃないのか?
リアルモードで例外は扱えなかったと思ったけど。

ここまで見た
  • 282
  •  
  • 2011/10/09(日) 13:45:42.04
>>281
x86の場合には例外と割り込みを区別していたんだね。
知らなかった。

で、>>279が聞きたかったことって、power.exeを常駐させた上での話だったのかな?
なら、getch関数でDOSに制御が移るので空き時間作れると思う。


ここまで見た
  • 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ぶん回すのが手っ取り早いんじゃね

ここまで見た
  • 285
  • 279
  • 2011/10/10(月) 00:33:50.30
回答ありがとうございます。

>>283
直接コードにhalt命令を埋め込んでも常に何かしら割り込みが
発生しているので問題ないと言うことですね。

>>284
探していたのはそれだと思います。
int28hをググってみましたがint28hをフックするコードしか
みつけられず、int28hを呼び出す側はどのような値をレジスタに
セットしてcallすれば良いかわかりませんでした…。

ここまで見た
  • 286
  •  
  • 2011/10/10(月) 01:00:41.71
int28hは呼び出し側で特定のレジスタ値をセットする必要はないはずだよ
int28hは「DOSが暇な時に動いて欲しい複数の常駐物のチェーンの入り口」なんで
それぞれの常駐物が勝手に何とかしてるはず、ただ、スタック少なすぎるのはまずいかも

C言語とかで普通に作ったプログラムならスタックは十分だと思うけど
破壊されちゃまずいレジスタはint28h前後で念のため退避復元するか、呼び出し後に再設定だね

古い記憶なんで間違ってたらスマソ

ここまで見た
  • 287
  •  
  • 2011/10/10(月) 01:23:38.97
>>285直接コードにhalt命令を埋め込んでも・・・
>>283にも書いたけど9801(初期の9821はよく知らん)はカレンダIRQ15が無いんでまずいかもね
あと、hlt命令は仮想86モードだと一般保護例外になるんで
実際に実行されるhlt命令は仮想86モニタ(EMM386等)の例外処理内部のhlt命令になるよ

ここまで見た
  • 288
  • 279
  • 2011/10/10(月) 10:40:18.65
>>286
int28hを試してみたいと思います。

>>287
開発はOpenWatcomのDOSエクステンダなので確か特権0で
動作していたハズですからhalt埋め込みも可能かも。と思っています。
対象CPUをPentium以降にしていますのでPC-9801はほとんどが外れます。
(ODP,CPUアクセラレータ機種は微妙ですが…)

ここまで見た
  • 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の画面モードに変更するという事自体が間違っているのでしょうか?

ここまで見た
>>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
それだけで解像度まで変わったか?

ここまで見た
変わらなかった。
/(^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でも画面表示とカーソル表示は消えるので自前で再設定する。

フリックラーニング
フリックラーニング
ここまで見た

★お気に入り追加

このページを共有する
facebook twitter hatena line google mixi email