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 + -
显示快捷键?