;=============================================
; EDNUM version 3.001e
; programmation commande numerique Num 750/760F
; Copyright (S) 1997-2010
; programmeur du logiciel A.Ara
; 64150 Mourenx ville France.
; Licence d'utilisation accord dans un but démonstratif
; la vente du logiciel et interdite.
; Numero de serie 00-331-7431-A1133071e
;=============================================
;==================================
; Fichier Screen.ASM
;==================================
MODEL TPASCAL
LOCALS
DATASEG
EXTRN CheckSnow : BYTE
CODESEG
PUBLIC MoveToScreen, MoveFromScreen
;====================================================
; procedure MoveToScreen(var Source, Dest; Len : Word);
;
; Recopie une zone memoire entre RAM et memoire video en gerant
; un eventuel effet de neige sur certains ecrans CGA.
; Variables:
; Source : Pointeur long vers la zone RAM ? copier
; Dest : Pointeur long vers la zone video ? ecraser
; Len : Quantite d'octets ? copier
;=====================================================
Proc MoveToScreen Source : DWord, Dest : DWord, Len : Word
push ds
mov bh,[CheckSnow] ; Charge valeur de CheckSnow
lds si,[Source] ; Pointeur source dans DS:SI
les di,[Dest] ; Pointeur dest dans ES:DI
mov cx,[Len] ; Len dans CX
jcxz @@0 ; Fin si Len = 0
cmp si,di ; Teste si source est avant destination
jle @@1 ; Si oui, copie ? partir de la fin
cld ; Incrementation de copie de chainesnes
jmp short @@2
@@1:
add si,cx ; Amene SI et DI en fin de zones memoire
sub si,2
add di,cx
sub di,2
std ; Decrementation chaines
@@2:
cmp bh,0 ; Si CheckSnow = false, affichages rapides
je @@7
@@3:
shr cx,1 ; Conversion octets en mots
mov dx,3DAh ; DX pointe sur le port d'etat de CGA
mov bl,9
@@4:
lodsw ; Lecture d'un mot
mov bp,ax ; Le sauve dans BP
@@5:
in al,dx ; Lit l'etat du 6845
rcr al,1 ; Teste si en balayage ligne
jb @@5 ; Boucle si oui : on evite d'ecrire
; pendant ce temps. Il n'y a de temps que
; pour exactement 1 STOSW
cli ; Et surtout pas d'interruptions !
@@6:
in al,dx ; Lit l'etat du 6845
and al,bl ;Teste les deux balayages : si la carte video
; n'indique pas de balayage ligne pendant
; le balayage trame, on peut envoyer plusieurs
; caracteres pendant la trame
jz @@6 ; Boucle si = 0
mov ax,bp ;Lit le mot de l'ecran video
stosw ; Le sauve
sti ; Demasque les interruptions
loop @@4 ; Au suivant !
jmp short @@0
@@7:
shr cx,1 ; Conversion d'octets en mots
rep movsw
@@0:
pop ds ; Restaure DS
ret
ENDP
;==============================================================
; procedure MoveFromScreen(var Source, Dest; Len : Word);
;
; Recopie une zone de memoire video en memoire normale en gerant l'effet de
; neige des ancienness cartes CGA.
; Variables:
; Source : Pointeur long vers la zone video ? copier
; Dest : Pointeur long vers la zone memoire vive ? ecraser
; Len : Quantite d'octets ? copier
;===============================================================
Proc MoveFromScreen Source : DWord, Dest : DWord, Len : Word
push ds
mov bh,[CheckSnow]
lds si,[Source]
les di,[Dest]
mov cx,[Len]
jcxz @@0
cmp si,di
jle @@1
cld
jmp short @@2
@@1:
add si,cx
sub si,2
add di,cx
sub di,2
std
@@2:
cmp bh,0
je @@6
@@3:
shr cx,1
mov dx,3DAh
@@4:
in al,dx
rcr al,1
jb @@4
cli
@@5:
in al,dx
rcr al,1
jnb @@5
lodsw
sti
stosw
loop @@4
jmp short @@0
@@6:
shr cx,1
rep movsw
@@0:
pop ds
ret
ENDP
END
;=================================
; Fin Fichier Screen.ASM
;=================================