home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
oricon
/
src
/
bios.asm
next >
Wrap
Assembly Source File
|
1990-06-14
|
13KB
|
833 lines
.286p
_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
_TEXT SEGMENT
;*******************************************
;* ORICON40用にアセブルするなら
;* LINE40を定義すること
;* ゲェ失敗じゃ
;* 仮想VRAMがC800:1000以上に無い!
;*******************************************
;LINE40 equ 1
;*******************************************
extrn _BIOS_91:NEAR
extrn _CUR_X:WORD
extrn _CUR_Y:WORD
extrn _CUR_OFF2:WORD
extrn _CUR_SIZE2:WORD
extrn _CUR_DSP_FLG:BYTE
extrn _Act_Dsp:BYTE
extrn oak_set:near
extrn oak_reset:near
;*******************************************
GVRAM equ 0C000h
CVRAM equ 0C800h
KVRAM equ 0CA00h
ifdef LINE40
ANKCG equ 0CA00h
else
ANKCG equ 0CB00h
endif
MAX_X equ 80
ifdef LINE40
MAX_Y equ 39
MAX_Y2 equ 40
CHRSIZ equ 8
LINSIZ equ 10
else
MAX_Y equ 24
MAX_Y2 equ 25
CHRSIZ equ 16
LINSIZ equ 16
endif
;*****************************
;* Work Vram Eria
;****************************
dmy_ram dw (MAX_X*MAX_Y2) dup(0)
;*****************************
;* 割り込みワ-ク
;*****************************
ds_bak dw ?
es_bak dw ?
vct_off dw ?
vct_seg dw ?
old_x dw 0
;*********************
;* VSYNC
;*********************
IRQ_CODE equ 0Bh
VS_TIME equ 4 ; 画面更新間隔の設定
vs_para db 0,0
vs_off dw ?
vs_seg dw ?
old_off dw ?
old_seg dw ?
irq_map db 0,0,0,0
vs_cnt db 0
int_ent proc far
mov dx,05CAh
out dx,al
sti
inc cs:[vs_cnt]
cmp cs:[vs_cnt],VS_TIME
jb int_rt
mov cs:[vs_cnt],0
mov ds,cs:[ds_bak]
mov es,cs:[es_bak]
cmp byte ptr [_Act_Dsp],0 ;割り込み禁止フラグ
jne int_rt
mov dx,05C8h
in al,dx
test al,80h
jnz int_go
mov ah,byte ptr [_CUR_X]
mov al,byte ptr [_CUR_Y]
cmp ax,cs:[old_x]
jz int_rt
int_go: mov byte ptr [_Act_Dsp],1 ;多重割り込み防止
call _cflush
mov byte ptr [_Act_Dsp],0
mov ah,byte ptr [_CUR_X]
mov al,byte ptr [_CUR_Y]
mov cs:[old_x],ax
int_rt: ret
int_ent endp
vs_set proc near
push ds
mov ah,01h
mov dl,IRQ_CODE
int 0AEh
mov cs:[old_off],di
mov cs:[old_seg],ds
push cs
pop ds
mov di,offset int_ent
mov cs:[vs_off],di
mov cs:[vs_seg],ds
mov di,offset vs_para
mov ah,00h
mov dl,IRQ_CODE
int 0AEh
mov ah,03h
mov di,offset irq_map
int 0AEh
or byte ptr cs:[di+2],08h
mov ah,02h
int 0AEh
pop ds
ret
vs_set endp
vs_reset proc near
push ds
push cs
pop ds
mov ah,03h
mov di,offset irq_map
int 0AEh
and byte ptr cs:[di+2],0F7h
mov ah,02h
int 0AEh
mov di,cs:[old_off]
mov ds,cs:[old_seg]
mov ah,00h
mov dl,IRQ_CODE
int 0AEh
pop ds
ret
vs_reset endp
;******************************
;* コンソ-ルBIOS(int 91h)
;******************************
bios_ent proc far
pusha
push ds ;+2
push es ;+0
sti
cld
mov bp,sp
mov ds,cs:[ds_bak]
mov es,cs:[es_bak]
push ss
push bp
call _BIOS_91
add sp,4
pop es
pop ds
popa
iret
bios_ent endp
;*********************************************
;* コンソ-ルBIOSベクタ(int 91h) &
;* タイマ割り込みの設定
;*********************************************
PUBLIC _setbios
_setbios PROC NEAR
pusha
push ds
push es
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 [vct_seg],ax
mov [vct_off],bx
mov dx,offset bios_ent
push cs
pop ds
mov ax,2591h ; int 91h
int 21h
call oak_set
call vs_set
pop es
pop ds
popa
ret
_setbios ENDP
;***************************************
;* ベクタ及び割り込みの解除 & 終了
;***************************************
PUBLIC _resetbios
_resetbios PROC NEAR
pusha
push ds
push es
call vs_reset
call oak_reset
mov ax,cs:[vct_seg]
mov ds,ax
mov dx,cs:[vct_off]
mov ax,2591h
int 21h
pop es
pop ds
popa
ret
_resetbios ENDP
;**********************************************
;* colset(char *vram,int color,int byte);
;**********************************************
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
;*****************************************************
;* vramcpy(char *src,char *des,int byte);
;*****************************************************
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
; mov byte ptr [_Act_Dsp],1 ;スクロ-ル時 漢字表示が乱れるなら
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
; mov byte ptr [_Act_Dsp],0 ; このフラグを操作してちょ
vfcp1: pop si
pop di
pop es
pop ds
pop bp
ret
_vramcpy endp
;*****************************************************
;* vramcpy(char *src,char *des,int byte);
;*****************************************************
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
;*********************************
;* int sjisto(int code);
;*********************************
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
;*************************
;* Beep();
;*************************
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
;**********************************************
;*
;* fork(char *cmd,char *pram)
;*
;**********************************************
para dw 0
dw ? ; param offset
dw ? ; seg
dw ? ; FCB1 offset
dw ? ; seg
dw ? ; FCB2 offset
dw ? ; seg
fcb1 db 16 dup (0)
fcb2 db 16 dup (0)
public _fork
_fork proc near
push bp
mov bp,sp
push ds
push es
push di
push si
push dx
push bx
mov di,offset para
mov ax,[bp+6] ; parameter offset
mov cs:[di+2],ax
mov ax,ds
mov cs:[di+4],ax
mov ax,cs
mov bx,offset fcb1
mov cs:[di+6],bx
mov cs:[di+8],ax
mov bx,offset fcb2
mov cs:[di+10],bx
mov cs:[di+12],ax
mov es,ax
mov si,[bp+6]
mov di,offset fcb1
mov ax,2901h
int 21h
mov di,offset fcb2
mov ax,2901h
int 21h
mov ax,cs
mov es,ax
mov dx,[bp+4]
mov bx,offset para
mov ax,4B00h
int 21h
pop bx
pop dx
pop si
pop di
pop es
pop ds
pop bp
ret
_fork endp
;********************************************
;*
;* AsinKey(int ch,int byte,char *str)
;*
;********************************************
public _AsinKey
_AsinKey proc near
push bp
mov bp,sp
push di
mov ax,0E00h ; Assin String
mov dx,[bp+4] ; Key Code
mov cx,[bp+6] ; Str Count
mov di,[bp+8] ; Str Addr
int 90h ; Key BIOS
pop di
pop bp
ret
_AsinKey endp
;****************************************
; Wrt_Ank
; al:char ah:attr
; cx:x bx:y
;****************************************
PUBLIC _Wrt_Ank
_Wrt_Ank proc near
push ds
push si
push es
push di
push cx
push bx
push ax
sub ah,ah ; char=>ANKCG address [si]
ifdef LINE40
shl ax,3 ; * 8
else
shl ax,4 ; * 16
endif
mov si,ax
mov ax,80*LINSIZ ; x + y * 80*16(GVRAM address) [di]
mul bx
add ax,cx
mov di,ax
pop ax
mov bl,ah
mov cl,bl ;cl
and bx,7
test cl,20h ;cl
je $I147
or bl,8 ;at
$I147:
test cl,18h ;cl
je $I148
mov bh,0FFh ;bk
$I148:
mov ax,ANKCG
mov ds,ax
mov ax,GVRAM
mov es,ax
mov dx,0FF99h
mov al,01h
out dx,al
mov al,0Fh
mov dx,0FF81h
out dx,al
mov cx,LINSIZ
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,CHRSIZ
$F155: lodsb
xor al,bh
mov es:[di],al
add di,80
loop $F155
mov dx,0FF99h
xor al,al
out dx,al
pop bx
pop cx
pop di
pop es
pop si
pop ds
ret
_Wrt_Ank ENDP
;************************************
; Wrt_Kan
; dx:漢字(反転注意) ah:attr
; cx:x bx:y
;************************************
PUBLIC _Wrt_Kan
_Wrt_Kan PROC NEAR
push es
push di
push cx
push bx
push ax
push dx
mov ax,80*LINSIZ ; x + y * 80*16(GVRAM address) [di]
mul bx
add ax,cx
mov di,ax
pop dx
pop ax
mov cl,ah
push cx
mov cx,dx
xchg ch,cl
;****** Bug Fix Start *******
cmp ch,70h
jb Not_Cnv
cmp ch,74h
ja Not_Cnv
cmp cl,60h
jb Not_Cnv
cmp cl,7Eh
ja Not_Cnv
add cx,07C0h
jmp Cnv_End
Not_Cnv:cmp ch,75h
je Ext_Cnv
cmp ch,76h
jne Cnv_End
Ext_Cnv:sub ch,75h
sub cl,21h
mov al,94
mul ch
xor ch,ch
add ax,cx
mov dx,ax
mov cl,5
shr dx,cl ; dx / 32
and ax,1Fh ; ax % 32
mov ch,dl ; dx * 256
mov cl,al
add cx,0900h
Cnv_End:
;******* Bug Fix End ********
xchg ch,cl
mov ax,cx
pop cx
mov dx,0FF94h
out dx,al
inc dx
mov al,ah
out dx,al
mov bl,cl ;cl
and bx,7
test cl,20h ;cl
je $I247
or bl,8 ;at
$I247:
test cl,18h ;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,LINSIZ
push di
sub ax,ax
$F251: mov es:[di],ax
add di,80
loop $F251
pop di
mov al,bl
out dx,al
mov cx,CHRSIZ
ifdef LINE40
$F277: push cx
mov dx,0FF96h
in al,dx
mov ah,al
inc dx
in al,dx
mov cx,ax
dec dx
in al,dx
mov ah,al
inc dx
in al,dx
or ax,cx
xor al,bh
xor ah,bh
xchg ah,al
mov es:[di],ax
add di,80
pop cx
loop $F277
else
$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
endif
pop bx
pop cx
pop di
pop es
ret
_Wrt_Kan ENDP
;*****************************
; locate
;*****************************
PUBLIC _locate
_locate proc near
push es
mov cx,[_CUR_X]
mov bx,[_CUR_Y]
mov ax,MAX_X
mul bx
add ax,cx
shl ax,1
add ax,offset dmy_ram
mov di,ax
xor byte ptr cs:[di+1],0FFh
ifdef LINE40
mov ax,LINSIZ
mul bx
mov bx,[_CUR_OFF2]
shr bx,1
add ax,bx
mov bx,80
else
shl bx,4 ; y *= 16
add bx,[_CUR_OFF2]
mov ax,80
endif
mul bx ; y *= 80
add ax,cx ; y + x
mov di,ax
mov ax,GVRAM
mov es,ax
mov dx,0FF81h
mov al,00000001b
call loca_sub
mov al,01000010b
call loca_sub
mov al,10000100b
mov al,10000100b
call loca_sub
mov al,11001000b
call loca_sub
pop es
ret
loca_sub:
out dx,al
push di
mov cx,[_CUR_SIZE2]
ifdef LINE40
shr cx,1
endif
loca1: not byte ptr es:[di]
add di,80
loop loca1
pop di
ret
_locate ENDP
;***********************************************
;仮想VRAM部(DMYCON Ver2.03)
; by (山)
;***********************************************
public _cflush2
_cflush2 proc near
pusha
push ds
push es
call _cflush
pop es
pop ds
popa
ret
_cflush2 endp
_cflush proc near
push es
push ds
cld
mov ax,CVRAM ; cp
mov ds,ax
xor si,si
mov ax,cs ; dp
mov es,ax
mov di,offset dmy_ram
xor cx,cx ; x:cx
xor bx,bx ; y:bx
cf_lp1: mov ax,[si]
test ah,40h
je short cf_ank
mov dx,[si+2000h]
cmp dx,es:[di+2]
jne short cf_knj
cmp ah,es:[di+1]
je short cf_ked
cf_knj: mov es:[di],ax
mov es:[di+2],dx
call _Wrt_kan
cf_ked: add si,4
add di,4
add cx,2
jmp short cf_end
cf_ank: cmp ax,es:[di]
mov es:[di],ax
je short cf_aed
call _Wrt_ank
cf_aed: add si,2
add di,2
inc cx
cf_end: cmp cx,MAX_X
jb short cf_lp1
sub cx,MAX_X
inc bx
cmp bx,MAX_Y2
jb short cf_lp1
pop ds
pop es
cmp byte ptr [_CUR_DSP_FLG],0
jne short cf_end2
call _locate
cf_end2: ret
_cflush endp
_TEXT ENDS
END