GophHub - zajo/appler/src/VIDEO.ASM


Raw File

;  _____________________________________________
; |                                             |
; |  Project:   APPLER                          |
; |  File:      VIDEO.ASM                       |
; |  Compiler:  16-bit TASM (2.5)               |
; |                                             |
; |  Subject:   Screen Emulation                |
; |                                             |
; |  Author:    Alexander Patalenski            |
; |_____________________________________________|

;       This file is included in EMULATE.ASM

;-------------- Video emulation entries ----------------------------------------

                assume  CS:Emulate,DS:Apple,ES:Video,SS:Data

                UseNextFreeSpace
ResetVideo      Proc    far
                ret
ResetVideo      Endp
                CheckAddress

C05X            MACRO   Adr,Table,Mask
                Local   l_r,l_w
                UseNextFreeSpace
Adr&r:          mov     al,C050
                mov     ah,al
IFE 0&Adr&h mod 2
                and     al,Mask
ELSE
                or      al,Mask
ENDIF
                cmp     al,ah
                je      l_r
                mov     C050,al
                cbw
                mov     bx,ax
                shl     bx,1
                push    di
                jmp     SS:Table[bx]
l_r:            xor     bl,bl
                jmp     di
Adr&w:          mov     al,C050
                mov     bh,al
IFE 0&Adr&h mod 2
                and     al,Mask
ELSE
                or      al,Mask
ENDIF
                cmp     al,bh
                je      l_w
                mov     C050,al
                Save    ax
                cbw
                mov     bx,ax
                shl     bx,1
                call    SS:Table[bx]
                Restore ax
                sahf
                DoNext
l_w:            sahf
                DoNext
                CheckAddress
                ENDM

                C05X    C050,C050table,1110b
                C05X    C051,C050table,0001b
                C05X    C052,C052table,1101b
                C05X    C053,C052table,0010b
                C05X    C054,C054table,1011b
                C05X    C055,C054table,0100b
                C05X    C056,C056table,0111b
                C05X    C057,C056table,1000b

;-------------- Video emulation subroutines ------------------------------------

SetTEXT         MACRO                           ;; Destroys DX
                mov     ax,0001h
                int     10h
                mov     ax,0606h
                mov     dx,3CEh
                out     dx,ax
                mov     cx,2000h
                mov     ah,01h
                int     10h
                mov     bl,1
                mov     ax,1003h
                int     10h
                mov     byte ptr SS:[TEXTchars+60h*2],0DBh
                ENDM

SetGR           MACRO                           ;; Destroys DX
                mov     ax,0001h
                int     10h
                mov     ax,0606h
                mov     dx,3CEh
                out     dx,ax
                mov     cx,2000h
                mov     ah,01h
                int     10h
                mov     bl,0
                mov     ax,1003h
                int     10h
                mov     byte ptr SS:[TEXTchars+60h*2],020h
                ENDM

SetPage         MACRO   VideoPage               ;; Destroys DX
                mov     dx,Port3?4h
                mov     ax,high(VideoPage)*100h+0Ch
                out     dx,ax
                jmp     short $+2
                mov     ax,low(VideoPage)*100h+0Dh
                out     dx,ax
		ENDM

SetHGR          MACRO   Page
                mov     ax,000Eh
                int     10h
                call    SetHGRpalette
		SetPage (Page-1)*4000h
		call    FillHGRpage
                ENDM

ShowTEXT        MACRO   Page                    ;; 1 or 2
                Local   Lab1,Lab2,Lab3,Lab4
                cld                             ;; Destroys DX, SI, DI
                mov     si,Page*400h
                xor     di,di
                mov     cx,di
                mov     dx,0800h+40

Lab1:           mov     cl,dl
Lab2:           lodsb
                mov     bl,al
                mov     bh,ch
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab2
                add     di,-40*2 + 8*40*2
                mov     cl,dl
Lab3:           lodsb
                mov     bl,al
                mov     bh,ch
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab3
                add     di,-40*2 + 8*40*2
                mov     cl,dl
Lab4:           lodsb
                mov     bl,al
                mov     bh,ch
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab4

                add     si,8
                add     di,-2*8*40*2
                dec     dh
                jnz     Lab1
		ENDM

ShowGR          MACRO   Page                    ;; 1 or 2
                Local   Lab1,Lab2,Lab3,Lab4
                cld                             ;; Destroys DX, SI, DI
                mov     si,Page*400h
                xor     di,di
                mov     bx,offset GRcolors
                mov     dx,0800h + GRchar

Lab1:           mov     cx,40
Lab2:           lodsb
                xlat    SS:[bx]
                mov     ah,al
                mov     al,dl
                stosw
                loop    Lab2
                add     di,-40*2 + 8*40*2
                mov     cx,40
Lab3:           lodsb
                xlat    SS:[bx]
                mov     ah,al
                mov     al,dl
                stosw
                loop    Lab3
                add     di,-40*2 + 8*40*2
                mov     cx,40
Lab4:           lodsb
                xlat    SS:[bx]
                mov     ah,al
                mov     al,dl
                stosw
                loop    Lab4

                add     si,8
                add     di,-2*8*40*2
                dec     dh
                jnz     Lab1
                ENDM

ShowHGR         MACRO
                Save    bp                      ;; Destroys DX, SI, DI
                mov     si,2000h
                mov     bp,0
                call    ShowHGRsub
                mov     si,4000h
                mov     bp,4000h
                call    ShowHGRsub
                Restore bp
		ENDM

ShowGRmix       MACRO   Page                    ;; 1 or 2
                Local   Lab0,Lab1,Lab2,Lab3,Lab4,Lab5
                cld                             ;; Destroys DX, SI, DI
                mov     si,Page*400h
                xor     di,di
                mov     dx,702h

Lab0:           mov     bx,offset GRcolors
Lab1:           mov     cx,40
Lab2:           lodsb
                xlat    SS:[bx]
                mov     ah,al
                mov     al,GRchar
                stosw
                loop    Lab2

                add     di,-40*2 + 8*40*2
                dec     dl
                jz      Lab3
                jns     Lab1

                add     si,8
                add     di,-3*8*40*2 + 40*2
                sub     dx,01FFh-2
                jns     Lab1
                jmp     Lab5

Lab3:           cmp     dh,3
                ja      Lab1
                mov     cx,40
Lab4:           lodsb
                mov     bl,al
                mov     bh,ch
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab4

                add     si,8
                add     di,-2*8*40*2
                sub     dx,100h-2
                jns     Lab0
Lab5:
		ENDM

ShowHGRmix      MACRO
                Save    bp
                mov     si,2000h
                mov     bp,0
                call    ShowHgrMixSub
                mov     si,4000h
                mov     bp,4000h
                call    ShowHgrMixSub
                Restore bp
                ENDM

Show4TEXT       MACRO   Page                    ;; 1 or 2
                Local   Lab1,Lab2,Lab3,Lab4
                cld                             ;; Destroys DX, SI, DI
                mov     bx,offset GRcolors
                mov     dx,40
                mov     di,20*40*2

                mov     si,Page*400h+250h
                mov     cx,dx
Lab1:           lodsb
                mov     bl,al
                mov     bh,dh
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab1
                mov     si,Page*400h+2D0h
                mov     cx,dx
Lab2:           lodsb
                mov     bl,al
                mov     bh,dh
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab2
                mov     si,Page*400h+350h
                mov     cx,dx
Lab3:           lodsb
                mov     bl,al
                mov     bh,dh
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab3
                mov     si,Page*400h+3D0h
                mov     cx,dx
Lab4:           lodsb
                mov     bl,al
                mov     bh,dh
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab4
		ENDM

Show4GR         MACRO   Page                    ;; 1 or 2
                Local   Lab1,Lab2,Lab3,Lab4
                cld                             ;; Destroys DX, SI, DI
                mov     bx,offset GRcolors
                xor     cx,cx
                mov     dx,40*100h + GRchar
                mov     di,20*40*2

                mov     si,Page*400h+250h
                mov     cl,dh
Lab1:           lodsb
                xlat    SS:[bx]
                mov     ah,al
                mov     al,dl
                stosw
                loop    Lab1
                mov     si,Page*400h+2D0h
                mov     cl,dh
Lab2:           lodsb
                xlat    SS:[bx]
                mov     ah,al
                mov     al,dl
                stosw
                loop    Lab2
                mov     si,Page*400h+350h
                mov     cl,dh
Lab3:           lodsb
                xlat    SS:[bx]
                mov     ah,al
                mov     al,dl
                stosw
                loop    Lab3
                mov     si,Page*400h+3D0h
                mov     cl,dh
Lab4:           lodsb
                xlat    SS:[bx]
                mov     ah,al
                mov     al,dl
                stosw
                loop    Lab4
		ENDM

Show4HGR        MACRO
                Save    bp
                mov     si,2000h
                mov     bp,0
                call    Show4HgrSub
                mov     si,4000h
                mov     bp,4000h
                call    Show4HgrSub
                Restore bp
                ENDM

Show4HgrText    MACRO
                Save    bp
                mov     si,400h
                mov     bp,0
                call    Show4HgrTextSub
                mov     si,800h
                mov     bp,4000h
                call    Show4HgrTextSub
                Restore bp
                ENDM

ShowGR12        MACRO   Page                    ;; 1 or 2
                Local   Lab1,Lab2,Lab3,Lab4
                cld                             ;; Destroys DX, SI, DI
                mov     si,Page*400h
                mov     di,1
                mov     bx,offset GRcolors
                xor     cx,cx
                mov     dx,800h+40

Lab1:           mov     cl,dl
Lab2:           lodsb
                xlat    SS:[bx]
                stosb
                inc     di
                loop    Lab2
                add     di,-40*2 + 8*40*2
                mov     cl,dl
Lab3:           lodsb
                xlat    SS:[bx]
                stosb
                inc     di
                loop    Lab3
                add     di,-40*2 + 8*40*2
                mov     cl,dl
Lab4:           lodsb
                xlat    SS:[bx]
                stosb
                inc     di
                loop    Lab4

                add     si,8
                add     di,-2*8*40*2
                dec     dh
                jnz     Lab1
		ENDM

ShowGRmix12     MACRO   Page                    ;; 1 or 2
                Local   Lab0,Lab1,Lab2,Lab3,Lab4,Lab5
                cld                             ;; Destroys DX, SI, DI
                mov     si,Page*400h
                xor     di,di
                mov     dx,702h

Lab0:           mov     bx,offset GRcolors
Lab1:           mov     cx,40
Lab2:           lodsb
                xlat    SS:[bx]
                inc     di
                stosb
                loop    Lab2

                add     di,-40*2 + 8*40*2
                dec     dl
                jz      Lab3
                jns     Lab1

                add     si,8
                add     di,-3*8*40*2 + 40*2
                sub     dx,01FFh-2
                jns     Lab1
                jmp     Lab5

Lab3:           cmp     dh,3
                ja      Lab1
                mov     cx,40
Lab4:           lodsb
                mov     bl,al
                mov     bh,ch
                shl     bx,1
                mov     ax,SS:TEXTchars[bx]
                stosw
                loop    Lab4

                add     si,8
                add     di,-2*8*40*2
                sub     dx,100h-2
                jns     Lab0
Lab5:
		ENDM


;-------------------------------------------------------------------------------

                UseNextFreeSpace
C050_0:         Save    cx dx si
		SetTEXT
		ShowTEXT 1
                mov     ax,TEXT_TextMode
                mov     bx,ax
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_1:         Save    cx dx si
		SetTEXT
		ShowTEXT 2
                mov     ax,TEXT_TextMode
                mov     bx,ax
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_A:         Save    cx dx si
		SetTEXT
		ShowTEXT 1
                mov     ax,HGR_NA
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                mov     ax,TEXT_TextMode
                mov     bx,ax
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_B:         Save    cx dx si
		SetTEXT
		ShowTEXT 2
                mov     ax,HGR_NA
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                mov     ax,TEXT_TextMode
                mov     bx,ax
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_2:         Save    cx dx si
                SetGR
		ShowGR  1
                mov     ax,TEXT_GrMode
                mov     bx,ax
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_3:         Save    cx dx si
		SetGR
		ShowGR  2
                mov     ax,TEXT_GrMode
                mov     bx,ax
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_4:         Save    cx dx si
                SetGR
                ShowGRmix 1
                mov     ax,TEXT_GrMode
                mov     bx,TEXT_MixedGrMode
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_5:         Save    cx dx si
		SetGR
                ShowGRmix 2
                mov     ax,TEXT_GrMode
                mov     bx,TEXT_MixedGrMode
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_6:         Save    cx dx si
                SetHGR  1
                ShowHGR
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage1
                mov     ax,HGR_HgrMode
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_7:         Save    cx dx si
		SetHGR  2
                ShowHGR
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage2
                mov     ax,HGR_HgrMode
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_8:         Save    cx dx si
		SetHGR  1
                ShowHGRmix
                mov     ax,TEXT_NA
                mov     bx,TEXT_MixedHgrMode
                call    SetTextWMpage1
                call    Set4TextWMpage2
                mov     ax,HGR_HgrMode
                mov     bx,HGR_MixedMode
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C050_9:         Save    cx dx si
		SetHGR  2
                ShowHGRmix
                mov     ax,TEXT_NA
                mov     bx,TEXT_MixedHgrMode
                call    SetTextWMpage2
                call    Set4TextWMpage1
                mov     ax,HGR_HgrMode
                mov     bx,HGR_MixedMode
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                Restore cx dx si

C052_0:
C052_1:         mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C052_2:         Save    cx dx si
                Show4GR 1
                mov     bx,TEXT_GrMode
                call    Set4TextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C052_3:         Save    cx dx si
                Show4GR 2
                mov     bx,TEXT_GrMode
                call    Set4TextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C052_4:         Save    cx dx si
                Show4TEXT 1
                mov     bx,TEXT_MixedGrMode
                call    Set4TextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C052_5:         Save    cx dx si
                Show4TEXT 2
                mov     bx,TEXT_MixedGrMode
                call    Set4TextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C052_6:         Save    cx dx si
                Show4HGR
                mov     bx,TEXT_NA
                call    Set4TextWMpage1
                call    Set4TextWMpage2
                mov     bx,HGR_HgrMode
                call    Set4HgrWMpage1
                call    Set4HgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C052_7:         Save    cx dx si
                Show4HGR
                mov     bx,TEXT_NA
                call    Set4TextWMpage1
                call    Set4TextWMpage2
                mov     bx,HGR_HgrMode
                call    Set4HgrWMpage1
                call    Set4HgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C052_8:         Save    cx dx si
                Show4HgrText
                mov     bx,HGR_MixedMode
                call    Set4HgrWMpage1
                call    Set4HgrWMpage2
                mov     bx,TEXT_MixedHgrMode
                call    Set4TextWMpage1
                call    Set4TextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C052_9:         Save    cx dx si
                Show4HgrText
                mov     bx,HGR_MixedMode
                call    Set4HgrWMpage1
                call    Set4HgrWMpage2
                mov     bx,TEXT_MixedHgrMode
                call    Set4TextWMpage1
                call    Set4TextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress


                UseNextFreeSpace
C054_0:         Save    cx dx si
		ShowTEXT 1
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage2
                mov     ax,TEXT_TextMode
                mov     bx,ax
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_1:         Save    cx dx si
		ShowTEXT 2
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage1
                mov     ax,TEXT_TextMode
                mov     bx,ax
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_2:         Save    cx dx si
                ShowGR12 1
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage2
                mov     ax,TEXT_GrMode
                mov     bx,ax
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_3:         Save    cx dx si
                ShowGR12 2
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage1
                mov     ax,TEXT_GrMode
                mov     bx,ax
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_4:         Save    cx dx si
                ShowGRmix12 1
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage2
                mov     ax,TEXT_GrMode
                mov     bx,TEXT_MixedGrMode
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_5:         Save    cx dx si
                ShowGRmix12 2
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage1
                mov     ax,TEXT_GrMode
                mov     bx,TEXT_MixedGrMode
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_6:         Save    cx dx si
		SetPage 0
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_7:         Save    cx dx si
		SetPage 4000h
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_8:         Save    cx dx si
                SetPage 0
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C054_9:         Save    cx dx si
                SetPage 4000h
                Restore cx dx si

C056_0:
C056_1:         mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C056_2:         Save    cx dx si
		SetGR
		ShowGR  1
                mov     ax,HGR_NA
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                mov     ax,TEXT_GrMode
                mov     bx,ax
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C056_3:         Save    cx dx si
		SetGR
		ShowGR  2
                mov     ax,HGR_NA
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                mov     ax,TEXT_GrMode
                mov     bx,ax
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C056_4:         Save    cx dx si
		SetGR
                ShowGRmix 1
                mov     ax,HGR_NA
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                mov     ax,TEXT_GrMode
                mov     bx,TEXT_MixedGrMode
                call    SetTextWMpage1
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C056_5:         Save    cx dx si
		SetGR
                ShowGRmix 2
                mov     ax,HGR_NA
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                mov     ax,TEXT_GrMode
                mov     bx,TEXT_MixedGrMode
                call    SetTextWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C056_6:         Save    cx dx si
		SetHGR  1
                ShowHGR
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage1
                mov     ax,HGR_HgrMode
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C056_7:         Save    cx dx si
		SetHGR  2
                ShowHGR
                mov     ax,TEXT_NA
                mov     bx,ax
                call    SetTextWMpage2
                mov     ax,HGR_HgrMode
                mov     bx,ax
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C056_8:         Save    cx dx si
		SetHGR  1
                ShowHGRmix
                mov     ax,TEXT_NA
                mov     bx,TEXT_MixedHgrMode
                call    SetTextWMpage1
                call    Set4TextWMpage2
                mov     ax,HGR_HgrMode
                mov     bx,HGR_MixedMode
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

                UseNextFreeSpace
C056_9:         Save    cx dx si
		SetHGR  2
                ShowHGRmix
                mov     ax,TEXT_NA
                mov     bx,TEXT_MixedHgrMode
                call    SetTextWMpage2
                call    Set4TextWMpage1
                mov     ax,HGR_HgrMode
                mov     bx,HGR_MixedMode
                call    SetHgrWMpage1
                call    SetHgrWMpage2
                Restore cx dx si
                mov     bl,0
                ret
                CheckAddress

;-------------------------------------------------------------------------------

                UseNextFreeSpace
MixedHgrMode1:  pushf
                cli
                shl     di,1
                mov     ax,di
                cmp     al,2*40*2
                jb      MixedHgrMode10
                mov     di,SS:HgrTextAdr[di-(1*400h+200h)*2]
                xchg    bl,bh
                shl     bx,1
Temp            =       0
                REPT    8
                mov     ax,SS:HGRchars[bx][Temp*100h*2]
                mov     ES:[di][Temp*40*2],ax
Temp            =       Temp+1
                ENDM
                mov     bl,0
MixedHgrMode10: popf
                DoNext
                CheckAddress

                UseNextFreeSpace
MixedHgrMode2:  pushf
                cli
                shl     di,1
                mov     ax,di
                cmp     al,2*40*2
                jb      MixedHgrMode20
                mov     di,SS:HgrTextAdr[di-(2*400h+200h)*2]
                xchg    bl,bh
                shl     bx,1
Temp            =       0
                REPT    8
                mov     ax,SS:HGRchars[bx][Temp*100h*2]
                mov     ES:[di+4000h][Temp*40*2],ax
Temp            =       Temp+1
                ENDM
                mov     bl,0
MixedHgrMode20: popf
                DoNext
                CheckAddress

                UseNextFreeSpace
SetHGRpalette   Proc    near
                Save    es
                mov     bx,0
                mov     cx,40h
                mov     dx,seg DACtable
                mov     es,dx
                mov     dx,offset DACtable
                mov     ax,1012h
                int     10h
                push    cs
		pop     es
		mov     dx,offset HGRpalettes
                mov     ax,1002h
                int     10h
                Restore es
                ret

HGRpalettes     db      2 dup(0,101100b,0,001011b,0,100011b,0,010110b),0
SetHGRpalette   Endp


FillHGRpage     Proc    near
		mov     di,0
                mov     dx,3C4h
                mov     ax,0402h                ; write to plane 2
                out     dx,ax
		mov     byte ptr ES:[di], 00110011b
                mov     ax,0202h                ; write to plane 1
                out     dx,ax
                mov     byte ptr ES:[di], 01010101b
                mov     ax,0F02h                ; write to all planes
                out     dx,ax
                mov     dx,3CEh
		mov     ax,0105h                ; write mode 1
                out     dx,ax
                mov     al,ES:[di]
                inc     di
		cld
		stosb
                mov     cx,8000h/2-1
	rep     stosw
                mov     ax,0005h                ; write mode 0
                out     dx,ax
                mov     ax,0004h                ; read from plane 0
		out     dx,ax
                mov     dx,3C4h
                mov     ax,0102h                ; write to plane 0
                out     dx,ax
		ret
FillHGRpage     Endp
                CheckAddress


                UseNextFreeSpace
SetTextWMpage1  Proc    near
                mov     CS:TEXT_ModefyAdr[000h],ax
                mov     CS:TEXT_ModefyAdr[100h],ax
Set4TextWMpage1 label   near
                mov     CS:TEXT_ModefyAdr[200h],bx
                mov     CS:TEXT_ModefyAdr[300h],bx
                ret
SetTextWMpage1  Endp

SetTextWMpage2  Proc    near
                mov     CS:TEXT_ModefyAdr[400h],ax
                mov     CS:TEXT_ModefyAdr[500h],ax
Set4TextWMpage2 label   near
                mov     CS:TEXT_ModefyAdr[600h],bx
                mov     CS:TEXT_ModefyAdr[700h],bx
                ret
SetTextWMpage2  Endp
                CheckAddress

                UseNextFreeSpace
SetHgrWMpage1   Proc    near
Temp            =       0
        REPT    20h/4
                mov     CS:HGR_ModefyAdr[Temp],ax
                mov     CS:HGR_ModefyAdr[Temp+100h],ax
Temp            =       Temp+400h
        ENDM
Set4HgrWMpage1  label   near
Temp            =       200h
        REPT    20h/4
                mov     CS:HGR_ModefyAdr[Temp],bx
                mov     CS:HGR_ModefyAdr[Temp+100h],bx
Temp            =       Temp+400h
        ENDM
                ret
SetHgrWMpage1   Endp
                CheckAddress

                UseNextFreeSpace
SetHgrWMpage2   Proc    near
Temp            =       2000h
        REPT    20h/4
                mov     CS:HGR_ModefyAdr[Temp],ax
                mov     CS:HGR_ModefyAdr[Temp+100h],ax
Temp            =       Temp+400h
        ENDM
Set4HgrWMpage2  label   near
Temp            =       2200h
        REPT    20h/4
                mov     CS:HGR_ModefyAdr[Temp],bx
                mov     CS:HGR_ModefyAdr[Temp+100h],bx
Temp            =       Temp+400h
        ENDM
                ret
SetHgrWMpage2   Endp
                CheckAddress

;-------------------------------------------------------------------------------

Peripher        segment public
                assume  CS:Peripher,DS:Nothing,ES:Nothing

ShowHGRsub      Proc    far                     ; SI - 2000h or 4000h
                cld                             ; BP - 0 or 4000h
                mov     di,[HGRadr]

ShowHGRsub1:    add     di,bp
                mov     dx,0200h+9

ShowHGRsub2:    mov     al,0

ShowHGRsub3:    mov     bh,0
                mov     bl,[si]
                inc     si
		shl     bx,1
                mov     cx,HGRcolors[bx]
		and     al,byte ptr HGRmasks[bx]+1
                or      al,ch
                stosb

		mov     bh,1
                mov     bl,[si]
                inc     si
		shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     ch,byte ptr HGRmasks[bx]+1
                and     cl,ch
                and     ch,ah
                xor     ah,ch
                or      ah,cl
		xchg    al,ah
                stosw

		mov     bh,2
                mov     bl,[si]
                inc     si
		shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     cl,byte ptr HGRmasks[bx]+1
                and     ch,cl
                and     cl,ah
                xor     ah,cl
                or      ah,ch
		xchg    al,ah
                stosw

		mov     bh,3
                mov     bl,[si]
                inc     si
		shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     ch,byte ptr HGRmasks[bx]+1
                and     cl,ch
                and     ch,ah
                xor     ah,ch
                or      ah,cl
		xchg    al,ah
                stosw
		mov     al,ch

                dec     dl
                jns     ShowHGRsub3

                add     di,-35*2 + 8*8*40*2
                sub     dx,01FFh-9
                jns     ShowHGRsub2

                add     si,8
                mov     di,si
                and     di,1FFFh
                jz      ShowHGRsub4
                shl     di,1
                mov     di,HGRadr[di]
		jmp     ShowHGRsub1
ShowHGRsub4:    ret
ShowHGRsub      Endp


ShowHgrMixSub   Proc    far                     ; SI - 2000h or 4000h
                Save    si bp                   ; BP - 0 or 4000h
                cld
                mov     di,[HGRadr]

ShowHgrMixSub1: add     di,bp
                mov     dx,0200h+9

ShowHgrMixSub2: mov     al,0

ShowHgrMixSub3: mov     bh,0
                mov     bl,[si]
                inc     si
                shl     bx,1
                mov     cx,HGRcolors[bx]
                and     al,byte ptr HGRmasks[bx]+1
                or      al,ch
                stosb

                mov     bh,1
                mov     bl,[si]
                inc     si
                shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     ch,byte ptr HGRmasks[bx]+1
                and     cl,ch
                and     ch,ah
                xor     ah,ch
                or      ah,cl
                xchg    al,ah
                stosw

                mov     bh,2
                mov     bl,[si]
                inc     si
                shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     cl,byte ptr HGRmasks[bx]+1
                and     ch,cl
                and     cl,ah
                xor     ah,cl
                or      ah,ch
                xchg    al,ah
                stosw

                mov     bh,3
                mov     bl,[si]
                inc     si
                shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     ch,byte ptr HGRmasks[bx]+1
                and     cl,ch
                and     ch,ah
                xor     ah,ch
                or      ah,cl
                xchg    al,ah
                stosw
                mov     al,ch

                dec     dl
                jns     ShowHgrMixSub3

                add     di,-35*2 + 8*8*40*2
                sub     dx,01FFh-9
                js      ShowHgrMixSub5
                mov     ax,di
                sub     ax,bp
                cmp     ax,20*8*40*2
                jae     ShowHgrMixSub6
                jmp     ShowHgrMixSub2

ShowHgrMixSub6: add     si,40
ShowHgrMixSub5: add     si,8
                mov     di,si
                and     di,1FFFh
                jz      ShowHgrMixSub4
                shl     di,1
                mov     di,HGRadr[di]
                jmp     ShowHgrMixSub1
ShowHgrMixSub4: Restore si bp
                shr     si,3

Show4HgrTextSub label   far                     ; SI - 400h or 800h
                add     si,250h                 ; BP - 0 or 4000h
                lea     di,[bp+20*8*40*2]
                mov     dl,4
S4HT1:          mov     cx,40
S4HT2:          lodsb
                xor     ah,ah
                shl     ax,1
                mov     bx,ax
Temp            =       0
                REPT    8
                mov     ax,HGRchars[bx][Temp*100h*2]
                mov     ES:[di][Temp*40*2],ax
Temp            =       Temp+1
                ENDM
                add     di,2
                loop    S4HT2
                add     si,-40+80h
                add     di,-40*2+8*40*2
                dec     dl
                jnz     S4HT1
                ret
ShowHgrMixSub   Endp


Show4HgrSub     Proc    far                     ; SI - 2000h or 4000h
                add     si,250h                 ; BP - 0 or 4000h
                mov     di,HGRadr[250h*2]
                lea     di,[di+bp-(40*2-35*2)]

Show4HgrSub1:   mov     dx,0700h+9
Show4HgrSub2:   mov     cx,40*2-35*2
                mov     al,0
        rep     stosb
                mov     bx,di
                sub     bx,bp
                cmp     bx,24*8*40*2
                jae     Show4HgrSub4

Show4HgrSub3:   mov     bh,0
                mov     bl,[si]
                inc     si
                shl     bx,1
                mov     cx,HGRcolors[bx]
                and     al,byte ptr HGRmasks[bx]+1
                or      al,ch
                stosb

                mov     bh,1
                mov     bl,[si]
                inc     si
                shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     ch,byte ptr HGRmasks[bx]+1
                and     cl,ch
                and     ch,ah
                xor     ah,ch
                or      ah,cl
                xchg    al,ah
                stosw

                mov     bh,2
                mov     bl,[si]
                inc     si
                shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     cl,byte ptr HGRmasks[bx]+1
                and     ch,cl
                and     cl,ah
                xor     ah,cl
                or      ah,ch
                xchg    al,ah
                stosw

                mov     bh,3
                mov     bl,[si]
                inc     si
                shl     bx,1
                mov     ax,HGRcolors[bx]
                mov     ch,byte ptr HGRmasks[bx]+1
                and     cl,ch
                and     ch,ah
                xor     ah,ch
                or      ah,cl
                xchg    al,ah
                stosw
                mov     al,ch

                dec     dl
                jns     Show4HgrSub3

                add     si,-40+400h
                sub     dx,01FFh-9
                js      Show4HgrSub5
                jmp     Show4HgrSub2
Show4HgrSub4:   ret
Show4HgrSub5:   add     si,-8*400h+80h
                jmp     Show4HgrSub1
Show4HgrSub     Endp

Peripher        ends

Data            segment stack 'stack'

; 0/1 - TEXT Mode Page 1/2 (from  GR Mode)
; A/B - TEXT Mode Page 1/2 (from HGR Mode)
; 2/3 -   GR Mode Page 1/2
; 4/5 -   GR Mode Page 1/2, Mixed
; 6/7 -  HGR Mode Page 1/2
; 8/9 -  HGR Mode Page 1/2, Mixed
		even
C050table       dw      C050_2,C050_0,C050_4,C050_0,C050_3,C050_1,C050_5,C050_1
                dw      C050_6,C050_A,C050_8,C050_A,C050_7,C050_B,C050_9,C050_B
C052table       dw      C052_2,C052_0,C052_4,C052_0,C052_3,C052_1,C052_5,C052_1
                dw      C052_6,C052_0,C052_8,C052_0,C052_7,C052_1,C052_9,C052_1
C054table       dw      C054_2,C054_0,C054_4,C054_0,C054_3,C054_1,C054_5,C054_1
                dw      C054_6,C054_0,C054_8,C054_0,C054_7,C054_1,C054_9,C054_1
C056table       dw      C056_2,C056_0,C056_4,C056_0,C056_3,C056_1,C056_5,C056_1
                dw      C056_6,C056_0,C056_8,C056_0,C056_7,C056_1,C056_9,C056_1
Data            ends

Generated by GNU Enscript 1.6.6, and GophHub 1.3.