cos2000v1/noyau/video.asm

1305 lines
27 KiB
NASM
Raw Blame History

model tiny,stdcall
p486
locals
jumps
codeseg
option procalign:byte
include "..\include\mem.h"
include "..\include\graphic.h"
org 0h
header exe <"CE",1,0,0,offset exports,,,>
exporting
declare setvideomode
declare getvideomode
declare clearscreen
declare setfont
declare loadfont
declare getfont
declare addline
declare showchar
declare showpixel
declare getpixel
declare setstyle
declare getstyle
declare enablecursor
declare disablecursor
declare setcolor
declare getcolor
declare scrolldown
declare getxy
declare setxy
declare savescreen
declare restorescreen
declare page2to1
declare page1to2
declare xchgpages
declare waithretrace
declare waitretrace
declare getvideoinfos
declare savedac
declare restoredac
declare savestate
declare restorestate
declare enablescroll
declare disablescroll
declare getchar
ende
;================================Table des modes videos (64 BYTES) ============================================
;40*25 16 couleurs
mode0 DB 67H,00H, 03H,08H,03H,00H,02H
DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H
DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH
DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH
DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH
DB 0CH,00H,0FH,08H,00H
DB 40,25
;80*25 16 couleurs
mode1 DB 67H,00H, 03H,00H,03H,00H,02H
DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H
DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3h,0FFH
DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH
DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH
DB 0CH,00H,0FH,08H,00H
DB 80,25
;80*50 16 couleurs
mode2 DB 63H, 00H, 03H,01H,03H,01H,02H
DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H
DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH
DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH
DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH
DB 0CH,00H,0FH,00H,00H
DB 80,50
;100*50 16 couleurs
mode3 DB 067H,00H,03H,01H,03H,01H,02H
DB 70H,63H,64H,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H
DB 00H,9Ch,08EH,8FH,32H,1FH,96H,0B9H,0A3H,0FFH
DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH
DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH
DB 0CH,00H,0FH,00H,00H
DB 100,50
;100*60 16 couleurs
mode4 DB 0A7H,00H,03H,01H,03H,01H,02H
DB 70H,63H,64H,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H
DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH
DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH
DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH
DB 0CH,00H,0FH,00H,00H
DB 100,60
;320*200 256 couleurs
mode5 DB 63H, 00H, 03H,01H,0FH,00H,06H
DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H
DB 9CH,0EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH
DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 41H,00H,0FH,00H,00H
DB 40,25
;320*400 256 couleurs
mode6 DB 063H, 00H, 03H,01H,0FH,00H,06H
DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H
DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH
DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 41H,00H,0FH,00H,00H
DB 40,50
;320*480 256 couleurs
mode7 DB 0E3H, 00H, 03H,01H,0FH,00H,06H
DB 5FH,4FH,50H,82H,54H,80H,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,00H
DB 0EAH,0ACH,0DFH,28H,00H,0E7H,06H,0E3H,0FFH
DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 41H,00H,0FH,00H,00H
DB 40,60
;360*480 256 couleurs
mode8 DB 0E7H, 00H, 03H,01H,0FH,00H,06H
DB 6BH,59H,5AH,8EH,5EH,8AH,0DH,3EH,00H,40H,00H,00H,00H,00H,00H,00H
DB 0EAH,0ACH,0DFH,2DH,00H,0E7H,06H,0E3H,0FFH
DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 41H,00H,0FH,00H,00H
DB 45,60
;400*600 256 couleurs
mode9 DB 0E7H, 00H, 03H,01H,0FH,00H,06H
DB 74h,63h,64h,97h,68h,95h,86h,0F0h,00h,60h,00h,00h,00h,00h,00h,00h
DB 5Bh,8Dh,57h,32h,00h,60h,80h,0E3h,0FFh
DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 41H,00H,0FH,00H,00H
DB 50,75
;640*480 16 couleurs
mode10 DB 0E3H
DB 00H
DB 03H,01H,0FH,00H,06H
DB 5FH,4FH,50H,82H,53H,9FH,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,00H,0E9H,8BH,0DFH,28H,00H,0E7H,04H,0E3H,0FFH
DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04H,05H,06H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH,01H,00H,0FH,00H,00H
DB 80,60
;800*600 16 couleurs
mode11 DB 0E7H
DB 00H
DB 03H,01H,0FH,00H,06H
DB 70H,63H,64H,92H,65H,82H,70H,0F0H,00H,60H,00H,00H,00H,00H,00H,00H,5BH,8CH,57H,32H,00H,58H,70H,0E3H,0FFH
DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04H,05H,06H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH,01H,00H,0FH,00H,00H
DB 100,75
;============================================DATABLOCK=========================================================
datablock vgainf <0,0,0,0,0,7,0FFh,0,0,0,0,0,0,0,0,0,0,0,1>
;=======================================Equivalence pour la clart<72> du code========================================
sequencer equ 03C4h
misc equ 03C2h
ccrt equ 03D4h
attribs equ 03C0h
graphics equ 03CEh
statut equ 03DAh
maxmode equ 11
planesize equ 65000
;============================================Fonctions de l'int VIDEO===========================================
;=============ENABLESCROLLING=========
;Autorise le d<>filement
;->
;<-
;=====================================
PROC enablescroll FAR
mov [cs:datablock.scrolling],1
ret
endp enablescroll
;=============DISABLESCROLLING=========
;D<>sactive le d<>filement
;->
;<-
;======================================
PROC disablescroll FAR
mov [cs:datablock.scrolling],0
ret
endp disablescroll
;=============ENABLECURSOR=============
;Autorise le d<>filement
;->
;<-
;======================================
PROC enablecursor FAR
USES ax,dx
mov [cs:datablock.cursor],1
mov dx,ccrt
mov al,0Ah
out dx,al
inc dx
in al,dx
and al,11011111b
mov ah,al
dec dx
mov al,0Ah
out dx,ax
mov al,[cs:datablock.x]
xor ah,ah
mov dl,[cs:datablock.y]
xor dh,dh
call setxy,ax,dx
ret
endp enablecursor
;=============DISABLECURSOR=============
;D<>sactive le d<>filement
;->
;<-
;=======================================
PROC disablecursor FAR
USES ax,dx
mov [cs:datablock.cursor],0
mov dx,ccrt
mov al,0Ah
out dx,al
inc dx
in al,dx
or al,00100000b
mov ah,al
dec dx
mov al,0Ah
out dx,ax
ret
endp disablecursor
;==========SETSTYLE=========
;Change le style du texte a %0
;-> %0 style
;<-
;============================
PROC setstyle FAR
ARG @style:word
USES cx
mov ax,[@style]
mov [cs:datablock.style],al
ret
endp setstyle
;==========GETSTYLE=========
;R<>cup<75>re le style du texte dans AX
;->
;<- AX style
;===========================
PROC getstyle FAR
mov al,[cs:datablock.style]
xor ah,ah
ret
endp getstyle
;=============SetVideoMode=========
;Fixe le mode vid<69>o courant a %0
;-> %0 mode d'<27>cran
;<- Carry if error
;==================================
PROC setvideomode FAR
ARG @mode:word
USES ax,cx,dx,di
mov ax,[@mode]
xor ah,ah
cmp al,maxmode
ja @@errorsetvideomode
cmp [cs:datablock.mode],5h
jb @@nographic
cmp al,5h
jae @@nographic
call initfont
@@nographic:
cmp [cs:datablock.mode],0FFh
jne @@noinit
call initfont
@@noinit:
mov [cs:datablock.mode],al
xor ah,ah
mov di,ax
shl di,6
add di,offset mode0
mov dx,misc
mov al,[cs:di]
out dx,al
inc di
mov dx,statut
mov al,[cs:di]
out dx,al
inc di
mov dx,sequencer
xor ax,ax
@@initsequencer:
mov ah,[cs:di]
out dx,ax
inc al
inc di
cmp al,4
jbe @@initsequencer
mov ax,0E11h
mov dx,ccrt
out dx,ax
xor ax,ax
@@initcrt:
mov ah,[cs:di]
out dx,ax
inc al
inc di
cmp al,24
jbe @@initcrt
mov dx,graphics
xor ax,ax
@@initgraphic:
mov ah,[cs:di]
out dx,ax
inc al
inc di
cmp al,8
jbe @@initgraphic
mov dx,statut
in al,dx
mov dx,attribs
xor ax,ax
@@initattribs:
mov ah,[cs:di]
push ax
in ax,dx
pop ax
out dx,al
xchg ah,al
out dx,al
xchg ah,al
inc al
inc di
cmp al,20
jbe @@initattribs
mov al,20h
out dx,al
mov al,[cs:di]
mov [cs:datablock.columns],al
mov ah,[cs:di+1]
mov [cs:datablock.lines],ah
mul ah
mov cl,[cs:di-5]
and cl,01000000b
cmp cl,0
je @@colors16
mov [cs:datablock.color],8
mov cl,4
jmp @@colors256
@@colors16:
mov [cs:datablock.color],4
mov cl,3
@@colors256:
cmp [cs:datablock.mode],5
setae [cs:datablock.graphic]
jb @@istext
shl ax,cl
mov [cs:datablock.segments],0A000h
jmp @@wasgraph
@@istext:
mov [cs:datablock.segments],0B800h
shl ax,1
@@wasgraph:
mov [cs:datablock.pagesize],ax
mov ax,planesize
xor dx,dx
div [cs:datablock.pagesize]
mov [cs:datablock.nbpage],al
mov al,[cs:di-36]
xor ah,ah
shl ax,2
mov cl,[cs:datablock.graphic]
shr ax,cl
mov [cs:datablock.linesize],ax
mov ax,[cs:di-43]
mov [cs:datablock.adress],ax
mov [cs:datablock.base],ax
mov [cs:datablock.cursor],1
mov [cs:datablock.style],0
ret
@@errorsetvideomode:
ret
endp setvideomode
initfont:
push ds
call clearscreen
push cs
pop ds
call loadfont,offset font8x8,8,1
call loadfont,offset font8x16,16,0
pop ds
ret
;=============GetVideoMode=========
;Renvoie le mode vid<69>o courant dans AX
;->
;<- AX
;==================================
PROC getvideomode FAR
mov al,[cs:datablock.mode]
xor ah,ah
ret
endp getvideomode
;=============CLEARSCREEN=========
;Efface l'ecran graphique ou texte
;->
;<-
;=================================
PROC clearscreen FAR
USES eax,cx,dx,di,es
mov cx,planesize
mov di,[cs:datablock.adress]
shr cx,2
cmp [cs:datablock.graphic],1
jne @@erasetext
mov ax,0A000h
mov es,ax
@@erasegraph:
mov ax,0F02h
mov dx,sequencer
out dx,ax
mov ax,0205h
mov dx,graphics
out dx,ax
mov ax,0003h
out dx,ax
mov ax,0FF08h
out dx,ax
mov eax,00000000h
cld
rep stosd
mov ax,0005h
cmp [cs:datablock.color],4
je @@not256
mov ax,4005h
@@not256:
mov dx,graphics
out dx,ax
mov ax,0003h
out dx,ax
jmp @@endoferase
@@erasetext:
mov ax,0B800h
mov es,ax
mov eax,07200720h
cld
rep stosd
@@endoferase:
call setxy,0,0
ret
endp clearscreen
;=============SetFont=========
;Active la font %0 parmi les 8
;-> %0 n<> font
;<- Carry if error
;=============================
PROC setfont FAR
ARG @font:word
USES ax,cx,dx
mov cx,[@font]
xor ch,ch
cmp cl,7
ja @@errorsetfont
mov [cs:datablock.font],cl
mov ah,cl
and cl,11b
and ah,0100b
shl ah,2
add ah,cl
mov dx,sequencer
mov al,3
out dx,ax
ret
@@errorsetfont:
ret
endp setfont
;=============GetFont=========
;R<>cup<75>re le n<> de la font active AX
;->
;<- CL n<> font, Carry if error
;=============================
PROC getfont FAR
mov al,[cs:datablock.font]
xor ah,ah
endp getfont
;!!!!!!!!!!!!!!!!!!!! a remettre les anciens params de timing depuis origine
;=============LoadFont========
;Charge une police point<6E>e par %0 dans la carte vid<69>o sous n<>font %1, taille police dans %2
;-> %0 n<>font, %1 pointeur vers Font, %2 taille police
;<- Carry if error
;=============================
PROC loadfont FAR
ARG @pointer:word,@size:word,@font:word
USES ax,bx,cx,dx,si,di,es
mov si,[@pointer]
mov cx,[@size]
mov bx,[@font]
cmp bl,7
ja @@errorloadfont
xor di,di
cli
mov dx,sequencer
@@doseq:
mov ax,[cs:di+offset reg1]
out dx,ax
inc di
inc di
cmp di,6
jbe @@doseq
mov dx,graphics
@@doseq2:
mov ax,[cs:di+offset reg1]
out dx,ax
inc di
inc di
cmp di,6+6
jbe @@doseq2
sti
mov ax,0A000h
mov es,ax
mov dx,256
mov al,0
xor bh,bh
cmp bl,4
jb @@isless
sub bl,4
shl bl,1
inc bl
jmp @@okmake
@@isless:
shl bl,1
@@okmake:
mov di,bx
shl di,13
mov bh,cl
mov bl,cl
sub bl,32
neg bl
xor cx,cx
cld
@@popz:
mov cl,bh
rep movsb
mov cl,bl
rep stosb
dec dx
jnz @@popz
xor di,di
mov dx,sequencer
@@doseqs:
mov ax,[cs:di+offset reg2]
out dx,ax
inc di
inc di
cmp di,6
jbe @@doseqs
mov dx,graphics
@@doseqs2:
mov ax,[cs:di+offset reg2]
out dx,ax
inc di
inc di
cmp di,6+6
jbe @@doseqs2
ret
@@errorloadfont:
stc
ret
reg2 dw 0100h, 0302h, 0304h, 0300h
dw 0004h, 1005h, 0E06h
reg1 dw 0100h, 0402h, 0704h, 0300h
dw 0204h, 0005h, 0406h
endp loadfont
;==========SHOWLINE===============
;remet le curseur text a la ligne avec un retour chariot
;->
;<-
;=================================
PROC addline FAR
USES bx,cx
mov bl,[cs:datablock.y]
xor bh,bh
mov cl,[cs:datablock.lines]
sub cl,2
cmp bl,cl
jne @@scro
dec bl
mov cx,1
cmp [cs:datablock.graphic],0
je @@okscro
mov cx,8
@@okscro:
call scrolldown,cx
@@scro:
inc bl
call setxy,0,bx
ret
endp addline
;==========SETCOLOR=========
;Change les attributs du texte a CL
;-> %0 couleur
;<-
;===========================
PROC setcolor FAR
ARG @color:word
USES cx
mov cx,[@color]
mov [cs:datablock.colors],cl
ret
endp setcolor
;==========GETCOLOR=========
;R<>cup<75>re les attributs du texte dans AX
;->
;<- AX couleur
;===========================
PROC getcolor FAR
mov al,[cs:datablock.colors]
xor ah,ah
ret
endp getcolor
;==========SCROLLDOWN=========
;defile de %0 lines vers le bas
;-> %0 lines <20> d<>filer vers le bas
;<-
;=============================
PROC scrolldown FAR
ARG @line:word
USES ax,cx,dx,si,di,ds,es
cmp [cs:datablock.scrolling],0
je @@graphp
mov ax,[@line]
mul [cs:datablock.linesize]
mov si,ax
mov cx,[cs:datablock.pagesize]
sub cx,si
mov di,[cs:datablock.adress]
cld
cmp [cs:datablock.graphic],1
jne @@textp
mov ax,0A000h
mov es,ax
mov ds,ax
mov ax,0F02h
mov dx,sequencer
out dx,ax
mov ax,0105h
mov dx,graphics
out dx,ax
cld
rep movsb
mov ax,0005h
cmp [cs:datablock.color],4
je @@not256ok
mov ax,4005h
@@not256ok:
mov dx,graphics
out dx,ax
mov ax,0003h
out dx,ax
jmp @@graphp
@@textp:
mov ax,0B800h
mov es,ax
mov ds,ax
rep movsb
@@graphp:
ret
endp scrolldown
;==========GETXY=========
;Met les coordonn<6E>es du curseur dans %0 au format point
;->
;<- ah coordonn<6E>es x, al coordonn<6E>es y
;========================
PROC getxy FAR
ARG @pointer:word
USES bx
mov bx,[@pointer]
mov ah,[cs:datablock.x]
mov al,[cs:datablock.y]
ret
endp getxy
;==========SETXY=========
;Change les coordonn<6E>es du curseur a X:%0,Y:%1
;-> %0 coordonn<6E>es x, %1 coordonn<6E>es y
;<-
;========================
PROC setxy FAR
ARG @x:word,@y:word
USES ax,bx,dx,di
mov ax,[@y]
mov bx,[@x]
mov [cs:datablock.x],bl
mov [cs:datablock.y],al
mov di,[cs:datablock.adress]
add di,bx
mul [cs:datablock.columns]
add di,ax
shl di,1
mov [cs:datablock.xy],di
call setcursor
ret
endp setxy
;==========SHOWPIXEL=========
;Affiche un pixel de couleur AL en X:%0,Y:%1
;-> %0 coordonn<6E>es x, %1 coordonn<6E>es y, %2 couleur
;<-
;============================
PROC showpixel FAR
ARG @x:word,@y:word,@color:word
USES ax,bx,cx,dx,si,di,es
mov bx,[@x]
mov cx,[@y]
mov ax,[@color]
cmp [cs:datablock.color],4
je @@showpixel4
mov si,ax
mov ax,cx
mov cl,bl
mul [cs:datablock.linesize]
shr bx,2
add ax,bx
mov di,ax
add di,[cs:datablock.adress]
and cl,3
mov ah,1
shl ah,cl
mov al,2
mov dx,sequencer
out dx,ax
mov bx,0A000h
mov es,bx
mov ax,si
mov [es:di],al
jmp @@endofshow
@@showpixel4:
mov dx,ax
mov ax,cx
mov ch,dl
mov cl,bl
mul [cs:datablock.linesize]
shr bx,3
add ax,bx
mov di,ax
add di,[cs:datablock.adress]
and cl,111b
xor cl,111b
mov ah,1
shl ah,cl
mov al,8
mov dx,graphics ;masque
out dx,ax
mov ax,0205h
out dx,ax
mov ax,0003h
out dx,ax
mov bx,0A000h
mov es,bx
mov al,[es:di]
mov [es:di],ch
@@endofshow:
ret
endp showpixel
;!!!!!!!!!!!!!! gerer le mode chain 4
;==========GETPIXEL=========
;R<>cup<75>re en ax la couleur du pixel de coordonn<6E>es X:%0,Y:%1
;-> %0 coordonn<6E>es x, %1 coordonn<6E>es y
;<- AX couleur
;=========================================
PROC getpixel FAR
ARG @x:word,@y:word
USES ax,bx,cx,dx,di,es
mov bx,[@x]
mov cx,[@y]
mov ax,cx
mov cl,bl
mul [cs:datablock.linesize]
shr bx,2
add ax,bx
mov di,ax
add di,[cs:datablock.adress]
and cl,3
mov ah,cl
mov al,4
mov dx,graphics
out dx,ax
mov bx,0A000h
mov es,bx
mov al,[es:di]
ret
endp getpixel
;==========GETVGAINFO=========
;Renvoie un bloc de donn<6E>e en ES:DI sur l'<27>tat de la carte graphique
;<- ES:%0 pointeur
;->
;=============================================
PROC getvideoinfos FAR
ARG @pointer:word
USES cx,si,di,ds
push cs
pop ds
mov cx,size datablock
mov si,offset datablock
mov di,[@pointer]
cld
rep movsb
ret
endp getvideoinfos
;==========WAITRETRACE=========
;Synchronisation avec la retrace verticale
;<-
;->
;==============================
PROC waitretrace FAR
USES ax,dx
mov dx,3DAh
@@waitr:
in al,dx
test al,8
jz @@waitr
ret
endp waitretrace
;==========WAITHRETRACE=========
;Synchronisation avec la retrace horizontale
;<-
;->
;===============================
PROC waithretrace FAR
USES ax,dx
mov dx,3DAh
@@waitr:
in al,dx
test al,1
jz @@waitr
ret
endp waithretrace
;==========GETCHAR=========
;Renvoie en AX le caract<63>re sur le curseur
;<-
;->
;==========================
PROC getchar FAR
USES di,es
mov ax,0B800h
mov es,ax
mov di,[cs:datablock.xy]
mov al,[es:di]
xor ah,ah
ret
endp getchar
;==========SHOWCHAR=========
;Ecrit le caract<63>re ASCII %0 attribut %1 apr<70>s le curseur, en le mettant <20> jours
;<-
;->
;===========================
PROC showchar FAR
ARG @char:word,@attr:word
USES ax,bx,cx,dx,di,es
mov cl,[byte ptr @char]
mov ch,[byte ptr @attr]
cmp [@attr],0FFFFh
jne @@notlastattr
mov ch,[cs:datablock.colors]
@@notlastattr:
cmp [cs:datablock.graphic],1
jne @@textaccess
call emulatechar
jmp @@adjusttext
@@textaccess:
mov ax,0B800h
mov es,ax
mov di,[cs:datablock.xy]
mov [es:di],cx
add [cs:datablock.xy],2
@@adjusttext:
inc [cs:datablock.x]
mov cl,[cs:datablock.columns]
cmp [cs:datablock.x],cl
jb @@noadjusted
call addline
@@noadjusted:
call setcursor
ret
endp showchar
setcursor:
push ax cx dx
cmp [cs:datablock.cursor],1
jne notshow
mov dx,ccrt
mov al,0Eh
mov cx,[cs:datablock.xy]
shr cx,1
mov ah,ch
out dx,ax
mov ah,cl
inc al
out dx,ax
notshow:
pop dx cx ax
ret
;Ecrit le caract<63>re ASCII CL attribut CH apr<70>s le curseur graphique, en le mettant <20> jours en mode graphique
emulatechar:
push ax bx cx dx di
mov al,ch
mov di,cx
and di,11111111b
shl di,3
add di,offset font8x8
mov bl,[cs:datablock.x]
mov cl,[cs:datablock.y]
xor bh,bh
xor ch,ch
shl bx,3
shl cx,3
mov ah,[cs:di]
xor dx,dx
bouclet:
rol ah,1
push ax
jc colored
shr al,4
cmp [cs:datablock.style],0
jnz transparent
colored:
and ax,1111b
call showpixel,bx,cx,ax
transparent:
pop ax
inc bx
inc dl
cmp dl,8
jb bouclet
inc di
mov ah,[cs:di]
xor dl,dl
sub bx,8
inc cx
inc dh
cmp dh,8
jb bouclet
ended:
pop di dx cx bx ax
ret
;sauve l'ecran dans un bloc de m<>moire
savescreen:
push ax cx dx si di bp ds es gs
mov bp,sp
mov dx,[ss:bp+22]
mov ah,2
mov cx,[cs:datablock.pagesize]
push cs
pop ds
mov si,offset data3
int 49h
mov ah,6
int 49h
push gs
pop es
xor di,di
call savescreento
pop gs es ds bp di si dx cx ax
ret
data3 db '/vgascreen',0
;===================================sauve l'ecran rapidement en es:di================
savescreento:
push cx si di ds
mov cx,0B800h
mov ds,cx
xor ecx,ecx
mov cx,[cs:datablock.pagesize]
shr cx,2
xor si,si
cld
rep movsd
pop ds di si cx
ret
;===================================sauve les parametres en es:di================
saveparamto:
push ecx si di ds
push cs
pop ds
xor ecx,ecx
mov cx,size datablock
mov si,offset datablock
cld
rep movsb
pop ds di si ecx
ret
;===================================restore les parametres depuis en ds:si================
restoreparamfrom:
push ecx si di es
push cs
pop es
xor ecx,ecx
mov cx,size datablock
mov di,offset datablock
cld
rep movsb
pop es di si ecx
ret
;R<>cup<75>re l'ecran de la carte depuis son bloc m<>moire
restorescreen:
push ax dx si bp ds gs
mov bp,sp
mov dx,[ss:bp+16]
push cs
pop ds
mov si,offset data3
mov ah,9
int 49h
push gs
pop ds
xor si,si
call restorescreenfrom
pop gs ds bp si dx ax
ret
;===================================restore l'ecran rapidement de ds:si================
restorescreenfrom:
push ecx si di ds es
mov cx,0B800H
mov es,cx
xor ecx,ecx
mov cx,[cs:datablock.pagesize]
shr cx,2
xor di,di
cld
rep movsd
pop es ds di si ecx
ret
;===============================Page2to1============================
page2to1:
push ecx si di ds es
mov cx,0B800H
mov es,cx
mov ds,cx
xor ecx,ecx
mov cx,[cs:datablock.pagesize]
shr cx,2
mov si,[cs:datablock.pagesize]
xor di,di
cld
rep movsd
pop es ds di si ecx
ret
;===============================Page1to2============================
page1to2:
push ecx si di ds es
mov cx,0B800H
mov es,cx
mov ds,cx
xor ecx,ecx
mov cx,[cs:datablock.pagesize]
shr cx,2
mov di,[cs:datablock.pagesize]
xor si,si
cld
rep movsd
pop ds es di si ecx
ret
;===============================xchgPages============================
xchgpages:
push ax cx dx si di bp ds es gs
mov bp,sp
mov dx,[ss:bp+22]
mov ah,2
mov cx,size datablock
add cx,[cs:datablock.pagesize]
add cx,3*256
push cs
pop ds
mov si,offset data4
int 49h
mov ah,6
int 49h
push gs
pop es
xor di,di
call savescreento
call page2to1
push gs
pop ds
xor si,si
mov cx,0B800H
mov es,cx
mov di,[cs:datablock.pagesize]
xor ecx,ecx
mov cx,[cs:datablock.pagesize]
shr cx,2
cld
rep movsd
mov ah,01h
int 49h
pop gs es ds bp di si dx cx ax
ret
data4 db '/vgatemp',0
;Sauve l'<27>tat de la carte dans un bloc m<>moire
savestate:
push ax cx dx si di bp ds es gs
mov bp,sp
mov dx,[ss:bp+22]
mov ah,2
mov cx,size datablock
add cx,[cs:datablock.pagesize]
add cx,3*256
push cs
pop ds
mov si,offset data
int 49h
mov ah,6
int 49h
push gs
pop es
xor di,di
call saveparamto
add di,size datablock
call savescreento
add di,[cs:datablock.pagesize]
call savedacto
pop gs es ds bp di si dx cx ax
ret
data db '/vga',0
;R<>cup<75>re l'<27>tat de la carte depuis son bloc m<>moire
restorestate:
push ax dx si bp ds gs
mov bp,sp
mov dx,[ss:bp+16]
push cs
pop ds
mov si,offset data
mov ah,9
int 49h
push gs
pop ds
mov al,[ds:7]
cmp [cs:datablock.mode],al
je nochangemode
mov ah,0
call setvideomode
nochangemode:
xor si,si
call restoreparamfrom
add si,size datablock
call restorescreenfrom
add si,[cs:datablock.pagesize]
call restoredacfrom
pop gs ds bp si dx ax
ret
;sauve le DAC dans un bloc de m<>moire
savedac:
push ax cx dx si di bp ds es gs
mov bp,sp
mov dx,[ss:bp+22]
mov ah,2
mov cx,3*256
push cs
pop ds
mov si,offset data2
int 49h
mov ah,6
int 49h
push gs
pop es
xor di,di
call savedacto
pop gs es ds bp di si dx cx ax
ret
data2 db '/vgadac',0
;R<>cup<75>re le dac depuis son bloc m<>moire
restoredac:
push ax dx si bp ds gs
mov bp,sp
mov dx,[ss:bp+16]
push cs
pop ds
mov si,offset data2
mov ah,9
int 49h
push gs
pop ds
xor si,si
call restoredacfrom
pop gs ds bp si dx ax
ret
;sauve le DAC en es:di
savedacto:
push ax cx dx di
mov dx,3C7h
mov cx,256
save:
mov al,cl
dec al
out dx,al
inc dx
inc dx
in al,dx
mov [es:di],al
inc di
in al,dx
mov [es:di],al
inc di
in al,dx
mov [es:di],al
inc di
dec dx
dec dx
dec cx
jne save
pop di dx cx ax
ret
;restore le DAC depuis ds:si
restoredacfrom:
push ax cx dx si
xor ax,ax
mov dx,3C8h
mov cx,256
save2:
mov al,cl
dec al
out dx,al
inc dx
mov al,[ds:si]
inc si
out dx,al
mov al,[ds:si]
inc si
out dx,al
mov al,[ds:si]
inc si
out dx,al
dec dx
dec cx
jne save2
pop si dx cx ax
ret
font8x8:
include "..\include\pol8x8.inc"
font8x16:
include "..\include\pol8x16.inc"