🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.sys.pc98
Article #277

Q. on using timer IC

#277
From: Takashi Yoshimi
Date: Wed, 26 Aug 1992 04:54
258 lines
5210 bytes
吉見@電総研です。

現在、PC-98 上でストップウォッチのプログラムを作ろうとしています。

タイマIC からの割り込みで外部変数を増加するようにしておいて、キー入力
があるとその値を読みに行かせるプログラムを書きましたが、うまく動作しま
せん。アセンブラでいくつかの関数を書いておき、それを C で呼ぶようにし
ています。タイマICを使うのは、1秒以下(このプログラムでは10ms)の精度
を出したいからです。タイマ割り込みがからむので、デバッガでも解析がしに
くい。。

以前、別のプログラムでタイマIC の別の機能を使って40ms のディレイを作る
関数を作ったことがあってそのときにはうまく動いたのですが、今回はなぜか
うまくいかずに困っています。なにか、おまじないが足らないのかも。危険な
ことに、ハードディスクをアクセスした状態で帰ってこないことがあります。
壊してはいないようですが。。

いくつか8086 や PC-98 のアセンブラに関する本を探してみましたが、まだ良
い文献にたどりついていません。

次のような情報がいただけるとありがたいです。

1:そのような関数がすでにある。市販、PDS etc..
2:この本に詳しい。

一応、プログラムを載せておきます。恥ずかしい点には目をつぶってください。

>>>>ここから
Cプログラム
extern unsigned long outcount;
extern unsigned short loopc0, loopc1;
unsigned long d[256];

main()
{
	int	n, cont, c, i;
	unsigned long oldd, tmpd, diff;
	
	printf("\f");
	printf("## Stop-Watch Program ##\n");
	printf("* SPACE : Record Time\n");
	printf("* q     : Quit\n\n");
	printf("* type CR to start > ");
	
	loopc0 = 0x6000;
	loopc1 = 1;
	outcount = 0;
	n = 0;
	oldd = 0;
	
	getche();
	laptime();
	
	do{
		c = getch();
		if(c == 'q'){
			cont = 0;
		}else{
			tmpd = d[n] = outcount;
			if(n){
				diff = tmpd-oldd;
			}
			oldd = tmpd;
			n++;
			cont = 1;
		}
	}while(cont);
	qtimer();
	for(i = 0; i < n; i++){
		printf("%d %ld.%02ld\n", i, d[i]/100, d[i]%100);
	}
}

アセンブラ関数
;*********hardware interrupt routine ********* 
;	written by T.Yoshimi
;
.286c
INT_ADR	equ	20H	;addres for interrupt vector of timer
C8253	equ	01110111B
MODE0_SET equ	00110000B
MODE2_SET equ	00110100B
COUNT0	equ	01110001B
IMR	equ	2
;
	include dos.mac
;
DSEG
	outcount	dd	?
	incount dw	?
	loopc0	dw	?
	loopc1	dw	?
	intoff	dw	?
	intseg	dw	?
ENDDS

PSEG
;
public laptime, outcount, loopc0, loopc1, qtimer
laptime proc near
	pusha
	push ds
	push es
	push ss
	mov bp, sp
	;
	;set intterupt vector address in SI
	;
	mov si, INT_ADR
	mov ax, loopc1
	mov incount, ax
	;
	;set interrupt routine address in ax
	;
	mov ax, offset hard_int_routine
	mov bx, cs
	;
	;exchange interrupt vector
	;
	push ds
	push ax
	xor ax, ax
	mov ds, ax
	pop ax
	;
	cli
	xchg ax, [si]
	inc si
	inc si
	xchg bx, [si]
	sti
	pop ds
	;
	;store old interrupt routine address
	;
	mov intoff, ax
	mov intseg, bx
	;
	; set 8253
	;
	mov al, MODE2_SET
	out C8253, al
	jmp $+2
	jmp $+2
	;
	mov ax, loopc0
	out COUNT0, al
	jmp $+2
	jmp $+2
	mov al, ah
	out COUNT0, al
	;
	; SET 8259
	;
	cli
	in al, IMR
	and al, 11111110B
	out IMR, al
	sti
	;
	pop ss
	pop es
	pop ds
	popa
	ret
	;
hard_int_routine:
	cli
	;
	pusha
	push ds
	push es
	push ss
	mov ax, incount
	dec ax
	mov incount, ax
	cmp ax, 0000H
	jne recover
	;
	; inc_out
	;
	mov ax, loopc1
	mov incount, ax
	mov bx,offset ds:outcount
	mov ax, [bx]
	inc ax
	mov [bx], ax
	jnz recover
	mov ax, [bx+2]
	inc ax
	mov [bx+2], ax
recover:
	mov al, 20H
	out 00H, al
	pop ss
	pop es
	pop ds
	popa
	sti
	iret
	;
laptime endp
;
qtimer proc near
	pusha
	push ds
	push es
	push ss
	;
	; reset 8259
	;
	cli
	in al, IMR
	or al, 00000001B
	out IMR, al
	sti
	;
	; reset interrupt vector
	;
	mov si, INT_ADR
	mov ax, intoff
	mov bx, intseg
	;
	push ds
	push ax
	xor ax, ax
	mov ds, ax
	pop ax
	;
	cli
	xchg ax, [si]
	inc si
	inc si
	xchg bx, [si]
	sti
	pop ds
	pop ss
	pop es
	pop ds
	popa
	ret
	;
qtimer endp
;
ENDPS

end

<<<<ここまで

----------
吉見 隆(よしみ たかし)0x21歳 妻1人(1959.Jun.19) yoshimi@etl.go.jp
[所属]電子技術総合研究所知能システム部視覚情報研究室[仕事]コンピュータビジョン,
[好]美和ちゃん,SF,漫画,車,バイク,ばか話,ゲーム,映画,ビデオ,テニス,スキー,
銀玉鉄砲,AlanParsonsProject,刀根麻理子[嫌]たばこ(のみ,会社,広告,etc.),mohta

                          619
                           ~    Copyright 1988-1992 Takashi YOSHIMI
Technical Details
Message-ID: <gcmVU.yoshimi@etl.go.jp>
Path: arc1-ca.pugleaf.net!sparky!uunet!sun-barr!sh.wide!wnoc-tyo-news!etl.go.jp!yoshimi

Show Full Headers
Complete Article Headers
Newsgroups: fj.sys.pc98
Path: arc1-ca.pugleaf.net!sparky!uunet!sun-barr!sh.wide!wnoc-tyo-news!etl.go.jp!yoshimi
From: yoshimi@etl.go.jp (Takashi Yoshimi)
Subject: Q. on using timer IC
Content-Type: text/plain; charset=ISO-2022-JP
Message-ID: <gcmVU.yoshimi@etl.go.jp>
Reply-To: yoshimi@etl.go.jp (Shikaku ex5958)
Organization: Electrotechnical Laboratory, Tsukuba Science City
Mime-Version: 1.0
Distribution: fj
Date: Wed, 26 Aug 1992 04:54:26 GMT
Lines: 258