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関数などは自前で作ったほうが良いだろう。
最終更新:2013年01月11日 00:41