int10h.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 1,057 行 · 第 1/2 页
ASM
1,057 行
;
;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
;
.386P
_Int10h segment para private 'extension code' use32
assume cs:_Int10h, ds:nothing, es:nothing
Int10hStart label byte
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Int10hOpen proc near
;
;Setup int 10h patch.
;
assume ds:_Int10h
assume es:_cwMain
mov Int10hDSeg,es ;Store cwCode selector.
mov Int10hCSeg,cs ;store this segment.
mov Int10hDDSeg,ds
;
sys GetSel ;Get a selector
jc int101_9
mov Int10hStaticSel,bx
sys GetSel
jc int101_9
mov Int10hUltraFont,bx
;
mov bl,10h
sys GetVect
test BYTE PTR es:SystemFlags,1
jz int101_Use32
mov w[OldInt10h],dx
mov w[OldInt10h+2],cx
jmp int101_Use0
int101_Use32: mov d[OldInt10h],edx
mov w[OldInt10h+4],cx
int101_Use0: mov edx,offset Int10h
mov cx,cs
mov bl,10h
sys SetVect
assume es:nothing
assume ds:nothing
clc
int101_9: ;
db 66h
retf
Int10hOpen endp
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Int10hClose proc near
;
;Remove int 10h patch.
;
push ds
mov ds,cs:Int10hDDSeg
assume ds:_Int10h
cmp d[OldInt10h],0
jz int102_9
mov ds,Int10hDseg
assume ds:_cwMain
test BYTE PTR SystemFlags,1
assume ds:nothing
mov ds,cs:Int10hDDSeg
assume ds:_Int10h
jz int102_Use32
movzx edx,w[OldInt10h]
mov cx,w[OldInt10h+2]
jmp int102_Use0
int102_Use32: mov edx,d[OldInt10h]
mov cx,w[OldInt10h+4]
int102_Use0: mov bl,10h
sys SetVect
assume ds:nothing
int102_9: pop ds
;
db 66h
retf
Int10hClose endp
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Int10h proc far
cmp ax,1002h ;set pen numbers?
jz int103_SetPens
cmp ax,1009h ;get pen numbers?
jz int103_GetPens
cmp ax,1012h ;set colour values?
jz int103_SetColours
cmp ax,1017h ;get colour values?
jz int103_GetColours
cmp ax,1100h ;Set font?
jz int103_SetFont1
cmp ax,1110h ;Set font and program CRTC?
jz int103_SetFont1
cmp ax,1130h ;Get font details?
jz int103_GetFont
cmp ah,13h ;write teletype string?
jz int103_WriteString
cmp ah,1bh ;state info?
jz int103_VideoState
cmp ax,1c00h
jz int103_StateSize
cmp ax,1c01h ;state save?
jz int103_StateSave
cmp ax,1c02h ;state restore?
jz int103_StateRestore
cmp ax,0cd00h ;Ultra set palette?
jz int103_UltraSetPal
cmp ax,0cd02h ;Ultra get palette?
jz int103_UltraGetPal
cmp ax,0cd10h ;Ultra set font?
jz int103_UltraSetFont
jmp int103_NotOurs
;
int103_GetFont: ;Get font details?
;
push eax
push ebx
push esi
push edi
push ds
push fs
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
mov es:[edi].RealRegsStruc.Real_EAX,eax
mov es:[edi].RealRegsStruc.Real_EBX,ebx
assume es:nothing
mov bl,10h
sys IntXX
mov bx,es:[edi].RealRegsStruc.Real_ES
mov ax,0002h
int 31h
jc int103_9
mov ebp,es:[edi].RealRegsStruc.Real_EBP
movzx ebp,bp
mov edx,es:[edi].RealRegsStruc.Real_EDX
mov ecx,es:[edi].RealRegsStruc.Real_ECX
mov es,ax
int103_9:
pop fs
pop ds
pop edi
pop esi
pop ebx
pop eax
jmp int103_Done
;
int103_UltraSetFont: ;UltraVision set font.
;
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_Use32Bit503
movzx ebp,bp
int103_Use32Bit503: xor eax,eax
mov ax,ds
lsl eax,eax
cmp eax,10000h
jnc int103_Use32Bit504
movzx esi,si
int103_Use32Bit504: pop eax
push ax
push bx
push cx
push dx
push ds
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
mov ecx,8
cld
rep movsb ;copy into transfer buffer.
pop dx
pop cx
pop bx
pop ax
push ax
push bx
push cx
push dx
movzx ax,bh
mul cx
movzx ecx,ax
mov esi,ebp ;source buffer.
push es
mov ds,cs:Int10hDseg
assume ds:_cwMain
mov fs,PSPSegment
mov edi,8
mov es,WORD PTR fs:[EPSP_Struc.EPSP_TransProt]
pop ds
assume ds:nothing
cld
rep movsb ;copy into transfer buffer.
pop dx
pop cx
pop bx
pop ax
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
mov es:[edi].RealRegsStruc.Real_EAX,eax
mov es:[edi].RealRegsStruc.Real_EBX,ebx
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov es:[edi].RealRegsStruc.Real_EDX,edx
mov es:[edi].RealRegsStruc.Real_ESI,0
mov es:[edi].RealRegsStruc.Real_EBP,8
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:[edi].RealRegsStruc.Real_DS,ax
mov es:[edi].RealRegsStruc.Real_ES,ax
assume es:nothing
mov bl,10h
sys IntXX
mov eax,es:[edi].RealRegsStruc.Real_EAX
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
jmp int103_Done
;
int103_UltraGetPal: ;UltraVision get palette.
;
push eax
push ebx
push ecx
push edi
push ebp
push es
push fs
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
mov fs,es:PSPSegment
mov es:[edi].RealRegsStruc.Real_EAX,eax
assume es:nothing
mov bl,10h
sys IntXX ;read pen values.
mov ds,cs:Int10hDDseg
assume ds:_Int10h
mov bx,Int10hUltraFont
assume ds:nothing
movzx edx,es:[edi].RealRegsStruc.Real_DS
shl edx,4
mov ecx,65535
sys SetSelDet32
mov ds,bx
mov edx,es:[edi].RealRegsStruc.Real_EDX
mov esi,es:[edi].RealRegsStruc.Real_ESI
movzx esi,si
movzx edx,dx
pop fs
pop es
pop ebp
pop edi
pop ecx
pop ebx
pop eax
jmp int103_Done
;
int103_UltraSetPal: ;UltraVision set palette.
;
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,ds
lsl eax,eax
cmp eax,10000h
jnc int103_Use32Bit502
movzx edx,dx
int103_Use32Bit502: pop eax
mov esi,edx ;source buffer.
push ds
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
mov ecx,16
rep movsb ;copy into transfer buffer.
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
xor edx,edx
mov es:[edi].RealRegsStruc.Real_EAX,eax
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov es:[edi].RealRegsStruc.Real_EDX,edx
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
mov es:[edi].RealRegsStruc.Real_DS,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_VideoState: ;Some sort of video state table function.
;
or bx,bx
jnz int103_NotOurs
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_Use32Bit501
movzx edi,di
int103_Use32Bit501: pop eax
push edi
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,eax
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 ;read pen values.
mov eax,es:[edi].RealRegsStruc.Real_EAX
pop es
pop edi
cmp al,1bh
jz int103_ok100
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
xor eax,eax
jmp int103_Done
int103_ok100: push eax
push 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,64
cld
rep movsb ;copy the results.
pop edi
movzx edx,WORD PTR es:[edi+2]
shl edx,4
mov ecx,65535
mov ds,cs:Int10hDDseg
assume ds:_Int10h
mov bx,Int10hStaticSel
assume ds:nothing
mov WORD PTR es:[edi+2],bx
sys SetSelDet32
pop eax
pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
jmp int103_Done
;
int103_SetFont1: ;Load user font into character generator ram.
;
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_Use32Bit500
movzx ebp,bp
int103_Use32Bit500: pop eax
push ax
push bx
push cx
push dx
movzx ax,bh
mul cx
movzx ecx,ax
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
rep movsb ;copy into transfer buffer.
pop dx
pop cx
pop bx
pop ax
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
mov es:[edi].RealRegsStruc.Real_EAX,eax
mov es:[edi].RealRegsStruc.Real_EBX,ebx
mov es:[edi].RealRegsStruc.Real_ECX,ecx
mov es:[edi].RealRegsStruc.Real_EDX,edx
mov es:[edi].RealRegsStruc.Real_EBP,0
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_SetPens: ;ES:DX - List of 17 bytes to send to video.
;
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_Use32Bit50
movzx edx,dx
int103_Use32Bit50: 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
mov ecx,17
rep movsb ;copy into transfer buffer.
mov edi,offset Int10Buffer
mov es,cs:Int10hDseg
assume es:_cwMain
xor edx,edx
mov es:[edi].RealRegsStruc.Real_EAX,1002h
mov es:[edi].RealRegsStruc.Real_EDX,edx
mov ax,WORD PTR fs:[EPSP_Struc.EPSP_TransReal]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?