fix: correction d'un bogue dans la fonction "getxy" (paramètre en trop) Ajout de nombreuses exportations qui n'étaient alors pas au format STDCALL/CE (sauvegarde/restaurations)

This commit is contained in:
Nicolas Hordé 2007-03-23 16:49:04 +00:00
parent 2a1dd56ef4
commit 1582591ab8
1 changed files with 199 additions and 174 deletions

View File

@ -10,7 +10,7 @@ include "..\include\graphic.h"
org 0h org 0h
header exe <"CE",1,0,0,offset exports,,,> header exe <"CE",1,0,0,offset exports,offset imports,,>
exporting exporting
declare setvideomode declare setvideomode
@ -20,7 +20,7 @@ declare setfont
declare loadfont declare loadfont
declare getfont declare getfont
declare addline declare addline
declare showchar declare showchars
declare showpixel declare showpixel
declare getpixel declare getpixel
declare setstyle declare setstyle
@ -46,8 +46,31 @@ declare savestate
declare restorestate declare restorestate
declare enablescroll declare enablescroll
declare disablescroll declare disablescroll
declare getchar declare getchars
declare savescreen
declare savescreento
declare saveparamto
declare restoreparamfrom
declare restorescreen
declare restorescreenfrom
declare page2to1
declare page1to2
declare xchgpages
declare savestate
declare restorestate
declare savestate
declare restoredacfrom
declare restoredac
declare savedacto
ende ende
importing
use SYSTEME,mbcreate
use SYSTEME,mbfindsb
use SYSTEME,mbfree
use SYSTEME,mbchown
endi
;================================Table des modes videos (64 BYTES) ============================================ ;================================Table des modes videos (64 BYTES) ============================================
;40*25 16 couleurs ;40*25 16 couleurs
mode0 DB 67H,00H, 03H,08H,03H,00H,02H mode0 DB 67H,00H, 03H,08H,03H,00H,02H
@ -693,14 +716,12 @@ PROC scrolldown FAR
endp scrolldown endp scrolldown
;==========GETXY========= ;==========GETXY=========
;Met les coordonnées du curseur dans %0 au format point ;Met les coordonnées du curseur dans ah,al au format point
;-> ;->
;<- ah coordonnées x, al coordonnées y ;<- ah coordonnées x, al coordonnées y
;======================== ;========================
PROC getxy FAR PROC getxy FAR
ARG @pointer:word
USES bx USES bx
mov bx,[@pointer]
mov ah,[cs:datablock.x] mov ah,[cs:datablock.x]
mov al,[cs:datablock.y] mov al,[cs:datablock.y]
ret ret
@ -872,7 +893,7 @@ endp waithretrace
;<- ;<-
;-> ;->
;========================== ;==========================
PROC getchar FAR PROC getchars FAR
USES di,es USES di,es
mov ax,0B800h mov ax,0B800h
mov es,ax mov es,ax
@ -880,14 +901,14 @@ PROC getchar FAR
mov al,[es:di] mov al,[es:di]
xor ah,ah xor ah,ah
ret ret
endp getchar endp getchars
;==========SHOWCHAR========= ;==========SHOWCHAR=========
;Ecrit le caractère ASCII %0 attribut %1 aprés le curseur, en le mettant à jours ;Ecrit le caractère ASCII %0 attribut %1 aprés le curseur, en le mettant à jours
;<- ;<-
;-> ;->
;=========================== ;===========================
PROC showchar FAR PROC showchars FAR
ARG @char:word,@attr:word ARG @char:word,@attr:word
USES ax,bx,cx,dx,di,es USES ax,bx,cx,dx,di,es
mov cl,[byte ptr @char] mov cl,[byte ptr @char]
@ -915,7 +936,7 @@ PROC showchar FAR
@@noadjusted: @@noadjusted:
call setcursor call setcursor
ret ret
endp showchar endp showchars
setcursor: setcursor:
push ax cx dx push ax cx dx
@ -979,107 +1000,121 @@ ended:
pop di dx cx bx ax pop di dx cx bx ax
ret ret
;sauve l'ecran dans un bloc de mémoire ;sauve l'ecran dans un bloc de mémoire
savescreen: PROC savescreen FAR
push ax cx dx si di bp ds es gs USES ax,ds
mov bp,sp call [cs:mbcreate],offset data3,[cs:datablock.pagesize]
mov dx,[ss:bp+22] jc @@error
mov ah,2 call [cs:mbchown],ax,[word ptr ss:bp+4]
mov cx,[cs:datablock.pagesize] jc @@error
push cs push ax
pop ds pop ds
mov si,offset data3 call savescreento,0
int 49h clc
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 ret
@@error:
stc
ret
endp savescreen
data3 db '/vgascreen',0 data3 db '/vgascreen',0
;===================================sauve l'ecran rapidement en es:di================ ;===================================sauve l'ecran rapidement en ds:%1================
savescreento: PROC savescreento FAR
push cx si di ds ARG @offset:word
USES ecx,si,di,ds,es
push ds
pop es
mov cx,0B800h mov cx,0B800h
mov ds,cx mov ds,cx
xor ecx,ecx xor ecx,ecx
mov cx,[cs:datablock.pagesize] mov cx,[cs:datablock.pagesize]
mov di,[@offset]
shr cx,2 shr cx,2
xor si,si xor si,si
cld cld
rep movsd rep movsd
pop ds di si cx
ret ret
endp savescreento
;===================================sauve les parametres en es:di================ ;===================================sauve les parametres en ds:%0================
saveparamto: PROC saveparamto FAR
push ecx si di ds ARG @offset:word
USES ecx,si,di,ds,es
push ds
pop es
push cs push cs
pop ds pop ds
xor ecx,ecx xor ecx,ecx
mov cx,size datablock mov cx,size datablock
mov di,[@offset]
mov si,offset datablock mov si,offset datablock
cld cld
rep movsb rep movsb
pop ds di si ecx
ret ret
endp saveparamto
;===================================restore les parametres depuis en ds:si================ ;===================================restore les parametres depuis en ds:%0================
restoreparamfrom: PROC restoreparamfrom FAR
push ecx si di es ARG @offset:word
USES ecx,si,di,es
push cs push cs
pop es pop es
xor ecx,ecx xor ecx,ecx
mov cx,size datablock mov cx,size datablock
mov si,[@offset]
mov di,offset datablock mov di,offset datablock
cld cld
rep movsb rep movsb
pop es di si ecx
ret ret
endp restoreparamfrom
;RcupŠ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
;restaure l'ecran dans un bloc de mémoire
PROC restorescreen FAR
USES ax,ds
call [cs:mbfindsb],offset data3,[word ptr ss:bp+4]
jc @@error
push ax
pop ds pop ds
mov si,offset data3 call restorescreenfrom,0
mov ah,9 clc
int 49h
push gs
pop ds
xor si,si
call restorescreenfrom
pop gs ds bp si dx ax
ret ret
@@error:
stc
ret
endp restorescreen
;===================================restore l'ecran rapidement de ds:si================
restorescreenfrom: ;===================================restaure l'ecran rapidement en %1================
push ecx si di ds es PROC restorescreenfrom FAR
mov cx,0B800H ARG @offset:word
USES ecx,si,di,es
mov cx,0B800h
mov es,cx mov es,cx
xor ecx,ecx xor ecx,ecx
mov cx,[cs:datablock.pagesize] mov cx,[cs:datablock.pagesize]
mov si,[@offset]
shr cx,2 shr cx,2
xor di,di xor di,di
cld cld
rep movsd rep movsd
pop es ds di si ecx
ret ret
endp restorescreenfrom
;===============================Page2to1============================ ;===============================Page2to1============================
page2to1:
push ecx si di ds es PROC page2to1 FAR
ARG @offset:word
USES ecx,si,di,ds,es
mov cx,0B800H mov cx,0B800H
mov es,cx mov es,cx
mov ds,cx mov ds,cx
@ -1090,12 +1125,13 @@ page2to1:
xor di,di xor di,di
cld cld
rep movsd rep movsd
pop es ds di si ecx
ret ret
endp page2to1
;===============================Page1to2============================ ;===============================Page1to2============================
page1to2: PROC page1to2 FAR
push ecx si di ds es ARG @offset:word
USES ecx,si,di,ds,es
mov cx,0B800H mov cx,0B800H
mov es,cx mov es,cx
mov ds,cx mov ds,cx
@ -1106,31 +1142,19 @@ page1to2:
xor si,si xor si,si
cld cld
rep movsd rep movsd
pop ds es di si ecx
ret ret
endp page1to2
;===============================xchgPages============================ ;===============================xchgPages============================
xchgpages: PROC xchgpages FAR
push ax cx dx si di bp ds es gs USES ax,ecx,si,di,ds,es
mov bp,sp call [cs:mbcreate],offset data4,[cs:datablock.pagesize]
mov dx,[ss:bp+22] jc @@error
mov ah,2 call [cs:mbchown],ax,[word ptr ss:bp+4]
mov cx,size datablock jc @@error
add cx,[cs:datablock.pagesize] push ax
add cx,3*256
push cs
pop ds pop ds
mov si,offset data4 call savescreento,0
int 49h
mov ah,6
int 49h
push gs
pop es
xor di,di
call savescreento
call page2to1 call page2to1
push gs
pop ds
xor si,si xor si,si
mov cx,0B800H mov cx,0B800H
mov es,cx mov es,cx
@ -1140,142 +1164,142 @@ mov cx,[cs:datablock.pagesize]
shr cx,2 shr cx,2
cld cld
rep movsd rep movsd
mov ah,01h clc
int 49h
pop gs es ds bp di si dx cx ax
ret ret
@@error:
stc
ret
endp xchgpages
data4 db '/vgatemp',0 data4 db '/vgatemp',0
;Sauve l'tat de la carte dans un bloc mémoire ;Sauve l'tat de la carte dans un bloc mémoire
savestate: PROC savestate FAR
push ax cx dx si di bp ds es gs USES ax,cx,di,ds
mov bp,sp
mov dx,[ss:bp+22]
mov ah,2
mov cx,size datablock mov cx,size datablock
add cx,[cs:datablock.pagesize] add cx,[cs:datablock.pagesize]
add cx,3*256 add cx,3*256
push cs call [cs:mbcreate],offset data,cx
jc @@error
call [cs:mbchown],ax,[word ptr ss:bp+4]
jc @@error
push ax
pop ds pop ds
mov si,offset data
int 49h
mov ah,6
int 49h
push gs
pop es
xor di,di xor di,di
call saveparamto call saveparamto,di
add di,size datablock add di,size datablock
call savescreento call savescreento,di
add di,[cs:datablock.pagesize] add di,[cs:datablock.pagesize]
call savedacto call savedacto,di
pop gs es ds bp di si dx cx ax clc
ret ret
@@error:
stc
ret
endp savestate
data db '/vga',0 data db '/vga',0
;RcupŠre l'tat de la carte depuis son bloc mémoire ;RcupŠre l'tat de la carte depuis son bloc mémoire
restorestate: PROC restorestate FAR
push ax dx si bp ds gs USES ax,cx,di,ds
mov bp,sp call [cs:mbfindsb],offset data,[word ptr ss:bp+4]
mov dx,[ss:bp+16] jc @@error
push cs push ax
pop ds pop ds
mov si,offset data xor di,di
mov ah,9 call restoreparamfrom,di
int 49h add di,size datablock
push gs call restorescreenfrom,di
pop ds add di,[cs:datablock.pagesize]
mov al,[ds:7] call restoredacfrom,di
cmp [cs:datablock.mode],al clc
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 ret
@@error:
stc
ret
endp restorestate
;sauve le DAC dans un bloc de mémoire ;sauve le DAC dans un bloc de mémoire
savedac: PROC savedac FAR
push ax cx dx si di bp ds es gs USES ax,ds
mov bp,sp call [cs:mbcreate],offset data3,3*256
mov dx,[ss:bp+22] jc @@error
mov ah,2 call [cs:mbchown],ax,[word ptr ss:bp+4]
mov cx,3*256 jc @@error
push cs push ax
pop ds pop ds
mov si,offset data2 call savedacto,0
int 49h clc
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 ret
@@error:
stc
ret
endp savedac
data2 db '/vgadac',0 data2 db '/vgadac',0
;RcupŠ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: ;RcupŠre le dac depuis son bloc mémoire
push ax cx dx di PROC restoredac FAR
USES ax,ds
call [cs:mbfindsb],offset data2,[word ptr ss:bp+4]
jc @@error
push ax
pop ds
call restoredacfrom,0
clc
ret
@@error:
stc
ret
endp restoredac
;sauve le DAC en ds:%0
PROC savedacto FAR
USES ax,cx,dx,di
mov dx,3C7h mov dx,3C7h
mov cx,256 mov cx,256
save: @@save:
mov al,cl mov al,cl
dec al dec al
out dx,al out dx,al
inc dx inc dx
inc dx inc dx
in al,dx in al,dx
mov [es:di],al mov [ds:di],al
inc di inc di
in al,dx in al,dx
mov [es:di],al mov [ds:di],al
inc di inc di
in al,dx in al,dx
mov [es:di],al mov [ds:di],al
inc di inc di
dec dx dec dx
dec dx dec dx
dec cx dec cx
jne save jne @@save
pop di dx cx ax
ret ret
endp savedacto
;restore le DAC depuis ds:si ;restore le DAC depuis ds:si
restoredacfrom: PROC restoredacfrom FAR
push ax cx dx si USES ax,cx,dx,si
xor ax,ax xor ax,ax
mov dx,3C8h mov dx,3C8h
mov cx,256 mov cx,256
save2: @@save2:
mov al,cl mov al,cl
dec al dec al
out dx,al out dx,al
@ -1291,9 +1315,10 @@ inc si
out dx,al out dx,al
dec dx dec dx
dec cx dec cx
jne save2 jne @@save2
pop si dx cx ax
ret ret
endp restoredacfrom
font8x8: font8x8: