; _____________________________________________
; | |
; | 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