DOSからBIOS機能を使う

DOSからBIOS(API)の機能を使う例を示す。

DOSが起動中はZ80全ての物理アドレスは、スロットアドレス拡張によりRAMが選択されている。

DOS動作時にBIOS(API)機能を使いたい場合は、物理アドレスのページングを行ない、メモリー空間を切り替える必要がある。
通常は物理アドレスを直接切り替えるのではなく、インタースロットコール(内部スロットコール)
を使い、特定のスロットの論理アドレスにある指定アドレスのAPIを呼び出す。

ここではBIOS(API)のCLS(0x00c3)機能をDOSから使う例を示す。
(DOS1にはCLSコマンドがないので、BIOSを使ってCLSを外部コマンドで作る)


callcls.c
extern void cls(void);

void main(void){
	cls();
}

cls.asm
;
	.area	_ASMCODE
;
;	cls()
;
_cls::
	push	AF		;backup registerfile
	push	BC
	push	DE
	push	HL
	push	IX
	push	IY
;
	ld	iy,(0xFCC1)	;mainrom slotaddress(reference)
	ld	ix,#0x00c3	;bios(api) address
;
	call	0x001c		;interslotcall
;
	pop	IY		;restore register
	pop	IX
	pop	HL
	pop	DE
	pop	BC
	pop	AF
;
	ei
	ret
;


>sdcc -c -mz80 callcls.c
>sdasz80 -o cls.rel cls.asm
>sdld -b _CODE=0x100 -b _DATA=300 -b _ASMCODE=0x400 -i callcls.ihx callcls.rel cls.rel
>makebin -s 4096 callcls.ihx > callcls.bin
>perl binout.pl callcls.bin > callcls.com


この例ではアセンブラコードは専用のメモリセクションに割り当てるように明示的に指定した。

もしCコードの後ろに並べて(詰めて)ASMコードを配置するならば、Cセクションの_CODEと
同じエリアセクション名をASMコード中に.area _CODEで指定し、
リンカでファイル名を必ず[Cソース.rel] [ASMソース.rel]の順に指定すること。
逆にするとリンカはASMを0x100の先頭に配置してしまう。


同様にしてスクリーンモードを切り替える方法を示す。
このコマンド例はSCREEN0の状態と仮定し、BIOSを使ってDOS上からSCREEN1のテキストモードに切り替える。

calscrm.c
extern void screen(unsigned char);

void main(void){
	int i;
	
	screen(1);
}


screen.asm
;
	.area	_ASMCODE
;
;	screen(uchar scrmode)
;
_screen::
	ld	hl,#2
	add	hl,sp
;
	ld	a,(hl)		;screen -> [A]
;
	push	AF		;backup register
	push	BC
	push	DE
	push	HL
	push	IX
	push	IY
;
;	call	0x005f		;call bios CHGMOD(0x005F)
;
	ld	iy,(0xFCC1)	;slot number
	ld	ix,#0x005f	;bios(api) address
;
	call	0x001c		;interslotcall
;
	pop	IY		;restore register
	pop	IX
	pop	HL
	pop	DE
	pop	BC
	pop	AF
;
	ei
	ret
;


>sdcc -c -mz80 calscrm.c
>sdasz80 -o screen.rel screen.asm
>sdld -b _CODE=0x100 -b _DATA=300 -b _ASMCODE=0x400 -i calscrm.ihx calscrm.rel screen.rel
>makebin -s 4096 calscrm.ihx > calscrm.bin
>perl binout.pl calscrm.bin > calscrm.com


この関数を使えばDOSプログラムでグラフィック画面モードを扱うことも可能だろう。しかし、
BIOSにはキースキャンやパッドスキャン、CLSやSCREEN,VRAMへの描画用のAPIは有るが、
基本描画は無いので(CIRCLEやBOXは有るが)、PSET,LINE関数などは自前で作ったほうが良いだろう。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2013年01月11日 00:41
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。