Article View: fj.sys.pc98
Article #277Q. on using timer IC
From: Takashi Yoshimi
Date: Wed, 26 Aug 1992 04:54
Date: Wed, 26 Aug 1992 04:54
258 lines
5210 bytes
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!yoshimiShow 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