システムタイマー値を参照する方法は比較的簡単。
システムタイマーはハードウエアのVDP割り込み処理によって実現されており、
1/60secの間隔でVDPから投げられる割り込み信号を使いカウントする。
割り込み発生直後はBIOS内部の処理が呼ばれ、この内部でシステムタイマーのカウントが行なわれる。
ROMBASICにはシステムタイマーとしてTIME変数がある。
これは16bitの長さを持つアップカウンタで1/60Sec毎にカウントを行なう。
システムタイマーは約18分に一回ゼロクリアするアップカウンタで、数値が65535を超えるとクリアされゼロからカウントする。
このカウンタはBASICの変数と等しいので代入によりカウンタの初期値を決めることができる。
資料には書かれていない(誤記??)が、カウンタの値はシステムワークエリアの
0xFC9Eの2byteが使われているようだ。
このほかに16bitの0xFCA2はダウンカウンタがある。これらはお互いに独立している。
up_counter |
0xFC9E |
down_counter |
0xFCA2 |
ROMBASICが動作している時は必ずカウンタは動作しているが、
カウンタはDOS起動時にも有効dでシステムタイマーは動作している。
DOSからシステムタイマーを参照するCコードの例を示す。
この例はsdccクロス開発環境のほかに、セルフ開発環境のHI-TECH Cでも動作する。
#include <stdio.h>
void main(void){
unsigned int * p_timer;
p_timer=(unsigned int *)0xFC9E;
printf("system timer - %u \n",(*p_timer));
}
この例は、システムタイマー変数を参照するBASICの以下の命令と同じである。
(DOS上で動作するCのプログラムでシステムタイマー値を変更すればROMBASICのタイマー値も変化する)
10 print time
最終更新:2013年01月11日 00:22