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

ここまで見た
  • 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でも画面表示とカーソル表示は消えるので自前で再設定する。

ここまで見た
  • 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

ここまで見た
  • 311
  •  
  • 2011/11/18(金) 20:38:14.53
emm386とかのUMB領域の検出ってどうやってるんだろう?

ここまで見た
  • 312
  •  
  • 2011/11/18(金) 22:57:49.03
4kBごとにメモリを読んで調べてたような・・・
怪しそうな領域はMSDで調べると「恐らく使用可」なんて曖昧な答えが出たりした。

ここまで見た
ここまで見た
  • 314
  •  
  • 2011/11/21(月) 01:16:07.22
>>311-312
該当アドレスにRAMを自作メモリーボードで繋げたら見つけてくれるんかな?


ここまで見た
  • 315
  •  
  • 2011/12/08(木) 22:23:44.01


ここまで見た
  • 316
  •  
  • 2011/12/15(木) 17:54:20.54
メガデモを98のDOSに移植したいんだけど、Milleniumを使う方法はないかね?


ここまで見た
  • 317
  •  
  • 2011/12/16(金) 23:43:42.65
シーラスロジックにしとけ。16ビットカラーも使える。

ここまで見た
I/Oとメモリを見えるようにしてやれば使えるだろうけど、何かと手間

ここまで見た
  • 319
  •  
  • 2011/12/17(土) 09:21:34.34
PCIは起動時にI/Oとメモリを割り当ててるから普通に見えるだろ。
(9821ではブリッヂを経由すると割り当てられないらしいが。)

PCI BIOSを使えばデバイス検索、リソース検索はできるから
1M以上のメモリアクセスをどうするかだ。


ここまで見た
  • 320
  •  
  • 2012/01/10(火) 09:21:55.94
MS−DOSとは一体何だったのか
http://awabi.2ch.net/test/read.cgi/poverty/1326153783/l50


ここまで見た
  • 321
  •  
  • 2012/02/25(土) 21:41:54.99
保守

昔は1バイトでも節約するのに苦労してたのに、
今はアプリ1つ起動しただけで数100MB食う有様。
メモリがいくら安くなったとはいえ、食い過ぎじゃないかと。

ここまで見た
  • 322
  •  
  • 2012/02/26(日) 00:07:38.09
くたばれよジジイ

ここまで見た
MS-DOSなら16[Byte]単位での節約だよねー。

くたばれよジジイ

ここまで見た
  • 324
  •  
  • 2012/02/26(日) 13:47:34.72
16 bits

ここまで見た
  • 325
  •  
  • 2012/02/27(月) 14:35:58.53
OpenWatcom 1.9でnearポインタをunsigned longにキャストしたら
セグメント:オフセット形式になったんだけど、他のコンパイラもこんなだったっけ?

ここまで見た
>>325
C はよくわからないけれども、アセンブラですら、4バイト確保してseg:off だから、多分そうじゃないかな。

ここまで見た
  • 327
  •  
  • 2012/02/27(月) 19:15:13.91
>>291

今でもドライバ書こうとすれば…

ここまで見た
  • 328
  •  
  • 2012/02/27(月) 23:11:26.15
プログラミングはUNIX(SunOS)から入ったから、ポインタのNEARとかFAR
とかはハァ?って感じだった。

ここまで見た
>>325
そこはFP_SEG, FP_OF, MK_FPを使おうか...。

>>327
X64なWindowsだと自由とはいかないんだけどね。

ここまで見た
nearなら無関係だったか。

ここまで見た
  • 331
  •  
  • 2012/02/28(火) 18:51:22.22
MK_FPとかあったなー
今の今まで忘れてた

ここまで見た
  • 332
  •  
  • 2012/03/25(日) 10:39:32.43
Turbo C++でやってみたけどsmall/large/huge共にセグメントアドレスは入らなかった


ここまで見た
  • 333
  •  
  • 2012/03/25(日) 14:28:05.68
333

ここまで見た
  • 334
  •  
  • 2012/04/27(金) 01:08:04.98
シフトキー
capsロック
numlock等
実際にはキー入力されないキーを利用して
バッチファイルを条件分岐したい
適当なdosプログラムが探せないので
作りたい
バッチファイルで返り血を読む方法も
よくわからないです


ここまで見た
  • 335
  •  
  • 2012/04/27(金) 01:28:31.15
そいつはDOSの守備範囲外だ。
どの機種かはしらんがキーボードBIOSをつかうか、
あるいはキーボードI/Oを直接叩くしかないぞ。

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

★お気に入り追加

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