home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 1
/
FREEWARE.BIN
/
dmycon
/
bios.asm
< prev
next >
Wrap
Assembly Source File
|
1989-10-17
|
7KB
|
478 lines
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
extrn _cflush:NEAR
extrn _BIOS_91:NEAR
extrn _ankfont:BYTE
extrn _CUR_X:WORD
extrn _CUR_Y:WORD
extrn _ureg:NEAR
GVRAM equ 0C000h
CVRAM equ 0C800h
KVRAM equ 0CA00h
_TEXT SEGMENT
;*****************************
;* 割り込みワ-ク
;*****************************
ds_bak dw ?
es_bak dw ?
vct_off dw ?
vct_seg dw ?
old_x dw 0
old_y dw 0
;*****************************
;* タイマ割り込みテ-ブル
;*****************************
tim_no db ?
tim_md db 00h
db 00h
tim_off dw ?
tim_seg dw ?
dw 0
dw 10 ; 割り込み間隔 (1 = 10ms)
;*****************************
;* タイマ割り込み
;*****************************
int_ent proc far
mov ds,cs:[ds_bak]
mov es,cs:[es_bak]
mov dx,05C8h
in al,dx
test al,80h
jnz int_go
mov ax,[_CUR_X]
cmp ax,cs:[old_x]
jnz int_go
mov ax,[_CUR_Y]
cmp ax,cs:[old_y]
jz int_rt
int_go: call _cflush
mov ax,[_CUR_X]
mov cs:[old_x],ax
mov ax,[_CUR_Y]
mov cs:[old_y],ax
int_rt: ret
int_ent endp
;******************************
;* コンソ-ルBIOS(int 91h)
;******************************
bios_ent proc far
; push cf ;+24
; push cs ;+22
; push ip ;+20
; push ax ;+18
; push cx ;+16
; push dx ;+14
; push bx ;+12
; push sp ;+10
; push bp ;+8
; push si ;+6
; push di ;+4
db 60h ; pusha
push ds ;+2
push es ;+0
mov si,sp
mov di,offset _ureg
push ss
pop ds
mov es,cs:[ds_bak]
mov cx,13
cld
rep movsw
mov ds,cs:[ds_bak]
mov es,cs:[es_bak]
call _BIOS_91
mov di,sp
mov si,offset _ureg
push ss
pop es
mov cx,13
cld
rep movsw
pop es
pop ds
db 61h ; popa
iret
bios_ent endp
;*********************************************
;* コンソ-ルBIOSベクタ(int 91h) &
;* タイマ割り込みの設定
;*********************************************
PUBLIC _setbios
_setbios PROC NEAR
push ds
push es
push bp
mov ax,ds
mov cs:[ds_bak],ax
mov ax,es
mov cs:[es_bak],ax
mov ax,3591h ; int 91h
int 21h
mov ax,es
mov cs:[vct_seg],ax
mov cs:[vct_off],bx
mov dx,offset bios_ent
push cs
pop ds
mov ax,2591h ; int 91h
int 21h
mov ax,offset int_ent
mov cs:[tim_off],ax
mov ax,cs
mov cs:[tim_seg],ax
mov di,offset tim_md
push cs
pop ds
mov ah,00h
int 97h
mov cs:[tim_no],al
pop bp
pop es
pop ds
ret
_setbios ENDP
;***************************************
;* ベクタ及び割り込みの解除 & 終了
;***************************************
PUBLIC _resetbios
_resetbios PROC NEAR
push ds
push es
mov ax,cs:[vct_seg]
mov ds,ax
mov dx,cs:[vct_off]
mov ax,2591h
int 21h
mov al,cs:[tim_no]
mov ah,01h
int 97h
mov ah,4ch
mov al,00h
int 21h
pop es
pop ds
ret
_resetbios ENDP
PUBLIC _colset
_colset proc near
push bp
mov bp,sp
push es
push di
cld
mov ax,CVRAM
mov es,ax
mov di,[bp+4]
sub al,al
mov ah,[bp+6]
mov cx,[bp+8]
shr cx,1
jcxz colst1
rep stosw
colst1: pop di
pop es
pop bp
ret
_colset endp
PUBLIC _vramcpy
_vramcpy proc near
push bp
mov bp,sp
push ds
push es
push di
push si
cld
mov ax,CVRAM
mov ds,ax
mov es,ax
mov di,[bp+4]
mov si,[bp+6]
mov cx,[bp+8]
shr cx,1
jcxz vfcp1
rep movsw
mov ax,KVRAM
mov ds,ax
mov es,ax
mov di,[bp+4]
mov si,[bp+6]
mov cx,[bp+8]
shr cx,1
rep movsw
vfcp1: pop si
pop di
pop es
pop ds
pop bp
ret
_vramcpy endp
PUBLIC _vramrcpy
_vramrcpy proc near
push bp
mov bp,sp
push ds
push es
push di
push si
std
mov ax,CVRAM
mov ds,ax
mov es,ax
mov di,[bp+4]
mov si,[bp+6]
mov cx,[bp+8]
shr cx,1
jcxz vrcp1
rep movsw
mov ax,KVRAM
mov ds,ax
mov es,ax
mov di,[bp+4]
mov si,[bp+6]
mov cx,[bp+8]
shr cx,1
rep movsw
vrcp1: pop si
pop di
pop es
pop ds
pop bp
ret
_vramrcpy endp
PUBLIC _Wrt_Ank
_Wrt_Ank proc near
push bp
mov bp,sp
push es
push si
push di
mov al,[bp+4] ;ch
sub ah,ah
mov cl,4
shl ax,cl
add ax,OFFSET _ankfont
mov si,ax
mov ax,1280
imul WORD PTR [bp+8] ;y
add ax,[bp+6] ;x
mov di,ax
mov bx,[bp+10] ;cl
and bx,7
test BYTE PTR [bp+10],32 ;cl
je $I147
or bl,8 ;at
$I147:
test BYTE PTR [bp+10],24 ;cl
je $I148
mov bh,0FFh ;bk
$I148:
mov al,0Fh
mov dx,0FF81h
out dx,al
mov ax,GVRAM
mov es,ax
mov cx,16
push di
sub al,al
$F151: mov es:[di],al
add di,80
loop $F151
pop di
mov al,bl
out dx,al
mov cx,16
cld
$F155: lodsb
xor al,bh
mov es:[di],al
add di,80
loop $F155
pop di
pop si
pop es
pop bp
ret
_Wrt_Ank ENDP
PUBLIC _Wrt_Kan
_Wrt_Kan PROC NEAR
push bp
mov bp,sp
push es
push si
push di
mov ax,1280
imul WORD PTR [bp+8] ;y
add ax,[bp+6] ;x
mov di,ax
mov dx,0FF94h
mov al,[bp+5] ;ch
out dx,al
inc dx
mov al,[bp+4] ;ch
out dx,al
mov bx,[bp+10] ;cl
and bx,7
test BYTE PTR [bp+10],32 ;cl
je $I247
or bl,8 ;at
$I247:
test BYTE PTR [bp+10],24 ;cl
je $I248
mov bh,0FFh ;bk
$I248:
mov al,0Fh
mov dx,0FF81h
out dx,al
mov ax,GVRAM
mov es,ax
mov cx,16
push di
sub al,al
$F251: mov es:[di],al
mov es:[di+1],al
add di,80
loop $F251
pop di
mov al,bl
out dx,al
mov cx,16
$F277: mov dx,0FF96h
in al,dx
xor al,bh
mov es:[di],al
inc dx
in al,dx
xor al,bh
mov es:[di+1],al
add di,80
loop $F277
pop di
pop si
pop es
pop bp
ret
_Wrt_Kan ENDP
PUBLIC _locate
_locate proc near
push bp
mov bp,sp
push es
push di
mov ax,80*16
imul WORD PTR [bp+6] ;y
add ax,[bp+4] ;x
add ax,80*14
mov di,ax
mov al,0Fh
mov dx,0FF81h
out dx,al
mov ax,GVRAM
mov es,ax
mov cx,2
mov al,0FFh
loca1: mov es:[di],al
add di,80
loop loca1
pop di
pop es
pop bp
ret
_locate ENDP
PUBLIC _sjisto
_sjisto proc near
push bp
mov bp,sp
mov ax,[bp+4]
cmp ah,9fh
jbe sjto1
sub ah,0B1h-071h
sjto1: sub ah,071h
shl ah,1
inc ah
cmp al,7fh
jbe sjto2
dec al
sjto2: cmp al,9eh
jb sjto3
sub al,7dh
inc ah
jmp sjto4
sjto3: sub al,1fh
sjto4: pop bp
ret
_sjisto ENDP
PUBLIC _Beep
_Beep proc near
push dx
push cx
mov dx,0FF98h
in al,dx
mov cx,5000 ; x 10us
int 0FDh
out dx,al
pop cx
pop dx
ret
_Beep ENDP
_TEXT ENDS
END