260 lines
3.0 KiB
NASM
260 lines
3.0 KiB
NASM
;====================================================
|
|
;
|
|
; Library ASM code
|
|
;
|
|
;====================================================
|
|
IDEAL
|
|
P386N
|
|
MODEL medium,C
|
|
|
|
extrn xormask:WORD,yshift:WORD,CGAfont:WORD,VGAfont:WORD
|
|
|
|
DATASEG
|
|
|
|
SCindex = 3c4h
|
|
SCmapmask = 2
|
|
GCindex = 3CEh
|
|
GCreadmap = 4
|
|
GCmode = 5
|
|
|
|
a = 0
|
|
LABEL CGAlookup WORD
|
|
PUBLIC CGAlookup
|
|
REPT 100
|
|
dw a,a XOR 2000h
|
|
a = a+80
|
|
ENDM
|
|
|
|
a = 0
|
|
LABEL EGA1lookup WORD
|
|
PUBLIC EGA1lookup
|
|
REPT 200
|
|
dw a
|
|
a = a+40
|
|
ENDM
|
|
|
|
a = 0
|
|
LABEL EGA2lookup WORD
|
|
PUBLIC EGA2lookup
|
|
REPT 480
|
|
dw a
|
|
a = a+80
|
|
ENDM
|
|
|
|
a = 0
|
|
LABEL VGAlookup WORD
|
|
PUBLIC VGAlookup
|
|
REPT 200
|
|
dw a
|
|
a = a+320
|
|
ENDM
|
|
|
|
|
|
CODESEG
|
|
|
|
;====================================================
|
|
;
|
|
; Draw CGA chars
|
|
;
|
|
;====================================================
|
|
PROC CGAcharout
|
|
PUBLIC CGAcharout
|
|
ARG x:WORD,y:WORD,chr:BYTE
|
|
USES si,di,ds
|
|
mov bx,[y]
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
mov di,[CGAlookup+bx]
|
|
mov ax,[x]
|
|
shl ax,1
|
|
add di,ax
|
|
|
|
mov al,[chr]
|
|
xor ah,ah
|
|
shl ax,1
|
|
shl ax,1
|
|
shl ax,1
|
|
shl ax,1
|
|
mov si,ax
|
|
|
|
mov ax,0b800h
|
|
mov es,ax
|
|
mov ds,[CGAfont]
|
|
cld
|
|
cmp [ss:xormask],0
|
|
ja @@1
|
|
|
|
REPT 4
|
|
movsw
|
|
add di,2000h-2
|
|
movsw
|
|
sub di,2000h-78
|
|
ENDM
|
|
jmp @@exit
|
|
@@1:
|
|
REPT 4
|
|
lodsw
|
|
xor ax,0ffffh
|
|
stosw
|
|
add di,2000h-2
|
|
lodsw
|
|
xor ax,0ffffh
|
|
stosw
|
|
sub di,2000h-78
|
|
ENDM
|
|
@@exit:
|
|
ret
|
|
ENDP
|
|
|
|
;====================================================
|
|
;
|
|
; Draw EGA chars
|
|
;
|
|
;====================================================
|
|
PROC EGAcharout
|
|
PUBLIC EGAcharout
|
|
ARG x:WORD,y:WORD,chr:BYTE,video:WORD
|
|
USES si,di,ds,bp
|
|
|
|
mov dx,GCindex
|
|
mov ax,GCmode
|
|
out dx,ax
|
|
|
|
mov bx,[y]
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
add bx,[yshift]
|
|
shl bx,1
|
|
|
|
cmp [video],1
|
|
jne @@0
|
|
mov cx,39
|
|
mov di,[EGA1lookup+bx]
|
|
jmp @@1
|
|
@@0:
|
|
mov cx,79
|
|
mov di,[EGA2lookup+bx]
|
|
@@1:
|
|
add di,[x]
|
|
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov ds,ax
|
|
|
|
mov si,0f000h
|
|
mov al,[chr]
|
|
xor ah,ah
|
|
shl ax,1
|
|
shl ax,1
|
|
shl ax,1
|
|
add si,ax
|
|
|
|
cld
|
|
cmp [ss:xormask],0
|
|
ja @@2
|
|
|
|
mov dx,GCindex
|
|
mov ax,GCmode OR 100h
|
|
out dx,ax
|
|
mov dx,SCindex
|
|
mov ax,SCmapmask OR 0f00h
|
|
out dx,ax
|
|
|
|
REPT 8
|
|
movsb
|
|
add di,cx
|
|
ENDM
|
|
jmp @@exit
|
|
|
|
@@2:
|
|
ga = 100h
|
|
gb = 0
|
|
mov bp,si
|
|
mov bx,di
|
|
REPT 4
|
|
mov dx,SCindex
|
|
mov ax,SCmapmask OR ga
|
|
out dx,ax
|
|
mov dx,GCindex
|
|
mov ax,GCreadmap OR gb
|
|
out dx,ax
|
|
REPT 8
|
|
lodsb
|
|
xor al,0ffh
|
|
stosb
|
|
add di,cx
|
|
ENDM
|
|
mov di,bx
|
|
mov si,bp
|
|
ga = ga*2
|
|
gb = gb+100h
|
|
ENDM
|
|
@@exit:
|
|
mov dx,GCindex
|
|
mov ax,GCmode
|
|
out dx,ax
|
|
ret
|
|
ENDP
|
|
|
|
;====================================================
|
|
;
|
|
; Draw VGA chars
|
|
;
|
|
;====================================================
|
|
PROC VGAcharout
|
|
PUBLIC VGAcharout
|
|
ARG x:WORD,y:WORD,chr:BYTE
|
|
USES si,di,ds
|
|
|
|
mov bx,[y]
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
add bx,[yshift]
|
|
shl bx,1
|
|
mov di,[VGAlookup+bx]
|
|
|
|
mov ax,[x]
|
|
shl ax,1
|
|
shl ax,1
|
|
shl ax,1
|
|
add di,ax
|
|
|
|
mov ah,[chr]
|
|
xor al,al
|
|
shr ax,1
|
|
shr ax,1 ;[chr]*64!
|
|
mov si,ax
|
|
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov ds,[VGAfont]
|
|
|
|
cmp [ss:xormask],0
|
|
ja @@1
|
|
|
|
REPT 8
|
|
REPT 4
|
|
movsw
|
|
ENDM
|
|
add di,320-8
|
|
ENDM
|
|
jmp @@exit
|
|
@@1:
|
|
REPT 8
|
|
REPT 4
|
|
lodsw
|
|
xor ax,0ffffh
|
|
stosw
|
|
ENDM
|
|
add di,320-8
|
|
ENDM
|
|
@@exit:
|
|
ret
|
|
ENDP
|
|
|
|
END
|