int10h.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 1,057 行 · 第 1/2 页
ASM
1,057 行
mov es:[edi].RealRegsStruc.Real_ES,ax
assume es:nothing
mov bl,10h
sys IntXX
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
jmp int103_Done
;
int103_GetPens: ;ES:DX - Space for list of 17 pen numbers.
;
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
push ds
push es
push fs
push eax
xor eax,eax
mov ax,es
lsl eax,eax
cmp eax,10000h
jnc int103_Use32Bit51
movzx edx,dx
int103_Use32Bit51: pop eax
push edx
push es
;
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
mov fs,es:PSPSegment
xor edx,edx
mov es:[edi].RealRegsStruc.Real_EAX,1009h
mov es:[edi].RealRegsStruc.Real_EDX,edx
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:[edi].RealRegsStruc.Real_ES,ax
assume es:nothing
mov bl,10h
sys IntXX ;read pen values.
pop es
pop edi
mov ds,cs:Int10hDseg
assume ds:_cwMain
xor esi,esi
mov ds,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
assume ds:nothing
mov ecx,17
cld
rep movsb ;copy the results.
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
jmp int103_Done
;
int103_SetColours: ;ES:DX - list of RGB values.
;CX - number of values.
;
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
push ds
push es
push fs
push eax
xor eax,eax
mov ax,es
lsl eax,eax
cmp eax,10000h
jnc int103_Use32Bit52
movzx edx,dx
int103_Use32Bit52: pop eax
mov esi,edx ;source buffer.
push es
mov ds,cs:Int10hDseg
assume ds:_cwMain
mov fs,PSPSegment
xor edi,edi
mov es,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
pop ds
assume ds:nothing
cld
push cx
movzx ecx,cx
mov eax,ecx
add ecx,ecx
add ecx,eax ;3 bytes per entry.
rep movsb ;copy into transfer buffer.
pop cx
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
xor edx,edx
mov es:[edi].RealRegsStruc.Real_EAX,1012h
mov es:[edi].RealRegsStruc.Real_EDX,edx
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov es:[edi].RealRegsStruc.Real_EBX,ebx
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:[edi].RealRegsStruc.Real_ES,ax
assume es:nothing
mov bl,10h
sys IntXX
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
jmp int103_Done
;
int103_GetColours: ;ES:DX - Buffer for list of RGB values.
;CX - Number of values.
;
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
push ds
push es
push fs
push eax
xor eax,eax
mov ax,es
lsl eax,eax
cmp eax,10000h
jnc int103_Use32Bit53
movzx edx,dx
int103_Use32Bit53: pop eax
push ecx
push edx
push es
;
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
mov fs,es:PSPSegment
xor edx,edx
mov es:[edi].RealRegsStruc.Real_EAX,1017h
mov es:[edi].RealRegsStruc.Real_EDX,edx
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov es:[edi].RealRegsStruc.Real_EBX,ebx
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:[edi].RealRegsStruc.Real_ES,ax
assume es:nothing
mov bl,10h
sys IntXX ;read pen values.
pop es
pop edi
pop ecx
mov ds,cs:Int10hDseg
assume ds:_cwMain
xor esi,esi
mov ds,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
assume ds:nothing
movzx ecx,cx
mov eax,ecx
add ecx,ecx
add ecx,eax ;3 bytes per entry.
cld
rep movsb ;copy the results.
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
jmp int103_Done
;
int103_WriteString: ;ES:BP - String to write.
;CX - Number of characters to write.
;
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
push ds
push es
push fs
push eax
xor eax,eax
mov ax,es
lsl eax,eax
cmp eax,10000h
jnc int103_Use32Bit54
movzx ebp,bp
int103_Use32Bit54: pop eax
mov esi,ebp ;source buffer.
push es
mov ds,cs:Int10hDseg
assume ds:_cwMain
mov fs,PSPSegment
xor edi,edi
mov es,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
pop ds
assume ds:nothing
cld
push cx
cmp al,2
jc int103_noatts
add cx,cx
int103_noatts: movzx ecx,cx
rep movsb ;copy into transfer buffer.
pop cx
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
xor ebp,ebp
mov es:[edi].RealRegsStruc.Real_EAX,eax
; mov es:[edi].RealRegsStruc.Real_EBP,edx
mov es:[edi].RealRegsStruc.Real_EBP,ebp
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov es:[edi].RealRegsStruc.Real_EBX,ebx
mov es:[edi].RealRegsStruc.Real_EDX,edx
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:[edi].RealRegsStruc.Real_ES,ax
assume es:nothing
mov bl,10h
sys IntXX
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
jmp int103_Done
;
int103_StateSize: ;Return state size.
;
push eax
push ecx
push edi
push es
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
mov es:[edi].RealRegsStruc.Real_EAX,eax
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov bl,10h
sys IntXX
mov ebx,es:RealRegsStruc.Real_EBX[edi]
cmp bx,2048/64
jc int103_ss3
;
xor bx,bx
test cl,1
jz int103_ss0
add bx,0c0h
int103_ss0: test cl,2
jz int103_ss1
add bx,0c0h
int103_ss1: test cl,4
jz int103_ss2
add bx,0380h
int103_ss2: add bx,63
shr bx,6
int103_ss3:
pop es
pop edi
pop ecx
pop eax
jmp int103_Done
;
int103_StateSave: ;Save state function.
;
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
push ds
push es
push fs
push eax
xor eax,eax
mov ax,es
lsl eax,eax
cmp eax,10000h
jnc int103_Use32Bit58
movzx ebx,bx
int103_Use32Bit58: pop eax
push eax
push ebx
push ecx
push es
;
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
mov fs,es:PSPSegment
xor ebx,ebx
mov es:[edi].RealRegsStruc.Real_EAX,eax
mov es:[edi].RealRegsStruc.Real_EBX,ebx
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:[edi].RealRegsStruc.Real_ES,ax
assume es:nothing
mov bl,10h
sys IntXX
pop es
pop ecx
pop ebx
pop eax
;
push eax
push ebx
push es
mov ax,1c00h
int 10h ;Get buffer size.
movzx ecx,bx
pop es
pop ebx
pop eax
shl ecx,6 ;*64
mov edi,ebx ;destination buffer.
mov ds,cs:Int10hDseg
assume ds:_cwMain
xor esi,esi
mov ds,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
assume ds:nothing
cld
rep movsb
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
jmp int103_Done
;
int103_StateRestore: ;Restore state function.
;
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
push ds
push es
push fs
push eax
xor eax,eax
mov ax,es
lsl eax,eax
cmp eax,10000h
jnc int103_Use32Bit59
movzx ebx,bx
int103_Use32Bit59: pop eax
;
push eax
push ebx
push ecx
push es
push eax
push ebx
push es
mov ax,1c00h
int 10h ;Get buffer size.
movzx ecx,bx
pop es
pop ebx
pop eax
shl ecx,6 ;*64
mov esi,ebx ;source buffer.
push es
mov ds,cs:Int10hDseg
assume ds:_cwMain
mov fs,PSPSegment
xor edi,edi
mov es,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
assume ds:nothing
pop ds
cld
rep movsb
pop es
pop ecx
pop ebx
pop eax
;
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
xor ebx,ebx
mov es:[edi].RealRegsStruc.Real_EAX,eax
mov es:[edi].RealRegsStruc.Real_EBX,ebx
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:[edi].RealRegsStruc.Real_ES,ax
assume es:nothing
mov bl,10h
sys IntXX
;
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
jmp int103_Done
;
int103_Done: ;Now update stacked flags.
;
push eax
push ebx
pushf
pop ax ;get new flags.
push ds
mov ds,cs:Int10hDSeg
assume ds:_cwMain
test BYTE PTR SystemFlags,1
assume ds:nothing
pop ds
jz int103_Use32Bit8
mov bx,sp
mov bx,ss:[bx+(4+4)+(2+2)] ;get origional flags.
jmp int103_Use16Bit8
int103_Use32Bit8: mov bx,ss:[esp+(4+4)+(4+4)] ;get origional flags.
int103_Use16Bit8: and bx,0000011000000000b ;retain IF.
and ax,1111100111111111b ;lose IF.
or ax,bx ;get old IF.
push ds
mov ds,cs:Int10hDseg
assume ds:_cwMain
test BYTE PTR SystemFlags,1
assume ds:nothing
pop ds
jz int103_Use32Bit9
mov bx,sp
mov ss:[bx+(4+4)+(2+2)],ax ;modify stack flags.
jmp int103_Use16Bit9
int103_Use32Bit9: mov ss:[esp+(4+4)+(4+4)],ax ;modify stack flags.
int103_Use16Bit9:
pop ebx
pop eax
push ds
mov ds,cs:Int10hDseg
assume ds:_cwMain
test BYTE PTR SystemFlags,1
assume ds:nothing
pop ds
jz int103_Use32Bit10
iret
int103_Use32Bit10: ;
iretd
;
int103_NotOurs: ;Not a function recognised by us so pass control to previous handler.
;
push ds
mov ds,cs:Int10hDSeg
assume ds:_cwMain
test BYTE PTR SystemFlags,1
assume ds:nothing
pop ds
jz int103_Use32Bit11
db 66h
jmp FWORD PTR cs:[OldInt10h] ;pass it onto previous handler.
int103_Use32Bit11: jmp FWORD PTR cs:[OldInt10h] ;pass it onto previous handler.
Int10h endp
;
OldInt10h df 0
Int10hCSeg dw ?
Int10hDSeg dw ?
Int10hDDSeg dw ?
;
Int10hStaticSel dw ?
Int10hUltraFont dw ?
;
db 4 dup (0)
Int10hEnd label byte
_Int10h ends
.286
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?