home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / turbo4 / mcmvsmem.asm < prev    next >
Assembly Source File  |  1987-12-08  |  5KB  |  144 lines

  1.  
  2. ;           Copyright (c) 1985, 87 by Borland International, Inc.
  3.  
  4.     TITLE    MCMVSMEM
  5.  
  6. DATA    SEGMENT    WORD PUBLIC    ; "MicroCalc MoVe Screen MEMory"
  7.  
  8.         ASSUME DS:DATA
  9.  
  10.         EXTRN CheckSnow : BYTE
  11.  
  12. DATA    ENDS
  13.  
  14. CODE    SEGMENT    BYTE PUBLIC
  15.  
  16.     ASSUME    CS:CODE
  17.  
  18.     PUBLIC    MoveToScreen, MoveFromScreen
  19.  
  20. ; procedure MoveToScreen(var Source, Dest; Len : Word);
  21.  
  22. MoveToScreen    PROC    FAR    ; Schreiben in den Bildspeicher
  23.   push    bp
  24.   mov     bp,sp
  25.   push    bp                   ; BP-Reg (= SP)
  26.   push    ds                   ;   und DS sichern
  27.   mov     bh,ds:CheckSnow      ; Variable CheckSnow -> BH
  28.   lds     si,dword ptr [bp+12] ; Parm "Source" -> DS:SI
  29.   les     di,dword ptr [bp+8]  ; Parm "Dest" -> ES:DI
  30.   mov     cx,[bp+6]            ; Parm "Len" -> CX
  31.   cmp     cx,0                 ; Ende, wenn Länge = 0
  32.   je      x0
  33.   cmp     si,di
  34.   jle     x1
  35.   cld                          ; aufsteigende Adressen
  36.   jmp short x2
  37. x1:
  38.   add     si,cx
  39.   sub     si,2
  40.   add     di,cx
  41.   sub     di,2
  42.   std
  43. x2:
  44.   cmp     bh,0        ; Snow-Check notwendig?
  45.   je      x7        ; nein -> 2 Bytes auf einmal
  46. x3:
  47.   shr     cx,1                 ; zählt nicht Bytes, sondern Wörter
  48.   mov     dx,3DAh              ; Status-Register des CGA
  49.   mov     bl,9                 ; Maske für "Retrace" -> BL
  50. x4:
  51.   lodsw                        ; ein Wort von "Source"
  52.   mov     bp,ax                ; in BP zwischenspeichern
  53. x5:
  54.   in      al,dx                ; Status des Video-Controllers
  55.   rcr     al,1                 ; horizontaler Rücklauf?
  56.   jb      x5                   ; wenn ja: Wiederholung! (Wir müssen auf den
  57.                                ;   Anfang des Rücklaufs warten, weil exakt
  58.                                ;   ein einziger STOSW-Befehl zeitlich drin
  59.                                ;   ist - nicht mehr)
  60.   cli                          ; keine Störungsversuche, bitte
  61. x6:
  62.   in      al,dx                ; erneute Status-Abfrage
  63.   and     al,bl                ; nur vertikaler Rücklauf? Hier lassen
  64.                                ;   sich mehrere Speicherzugriffe hinterein-
  65.                                ;   ander ausführen
  66.   jz      x6                   ; nein... Wiederholung
  67.   mov     ax,bp                ; o.k. Ein Wort von "Source" lesen
  68.   stosw                        ; und in den Bildspeicher schreiben
  69.   sti                          ; Interrupts wieder erlaubt
  70.   loop    x4                   ; nächstes Wort von "Source" lesen
  71.   jmp short x0
  72. x7:
  73.   shr     cx,1                 ; KEIN SNOW-CHECK: Hier werden einfach
  74.   rep     movsw               ; "Len" Bytes (= CX / 2 Wörter) kopiert
  75. x0:
  76.   pop     ds                   ; DS-Reg
  77.   pop     bp                   ;   und BP wieder vom Stack
  78.   mov     sp,bp
  79.   pop     bp
  80.   ret     10               ; Rücksprung, 10 Bytes Parameter vom Stack
  81. MoveToScreen    ENDP
  82.  
  83. ; procedure MoveFromScreen(var Source, Dest; Len : Word);
  84.  
  85. MoveFromScreen    PROC    FAR    ; Lesen vom Bildspeicher
  86.   push    bp
  87.   mov     bp,sp
  88.   push    bp                   ; BP-Reg (= SP)
  89.   push    ds                   ;   und DS sichern
  90.   mov     bh,ds:CheckSnow      ; Variable CheckSnow -> H
  91.   lds     si,dword ptr [bp+12] ; Parm "Source" -> DS:SI
  92.   les     di,dword ptr [bp+8]  ; Parm "Dest" -> ES:DI
  93.   mov     cx,[bp+6]            ; Parm "Len" -> CX
  94.   cmp     cx,0                 ; Ende, wenn Bytezahl = 0
  95.   je      y0
  96.   cmp     si,di
  97.   jle     y1
  98.   cld                          ; aufsteigende Adressen
  99.   jmp short y2
  100. y1:
  101.   add     si,cx
  102.   sub     si,2
  103.   add     di,cx
  104.   sub     di,2
  105.   std
  106. y2:
  107.   cmp     bh,0        ; Snow-Check notwendig?
  108.   je      y6        ; nein, direktes Schreiben
  109. y3:
  110.   shr     cx,1                 ; zählt nicht Bytes, sondern Wörter
  111.   mov     dx,3DAh              ; Status-Register des CGA
  112. y4:
  113.   in      al,dx                ; Status lesen
  114.   rcr     al,1                 ; horizontaler Rücklauf?
  115.   jb      y4                   ; Wenn ja: Wiederholung! (siehe oben)
  116.   cli                          ; keine Interrupts, bitte
  117. y5:
  118.   in      al,dx                ; Status erneut lesen
  119.   rcr     al,1                 ; Prüfung auf horizontalen Rücklauf: LODSW
  120.                                ;   braucht einen Takt länger als STOSW -
  121.                    ;   deshalb geht der Trick mit dem vertikalen
  122.                    ;   Rücklauf hier nicht! (RCR AL,1 ist einen
  123.                    ;   Takt schneller als AND AL,AH)
  124.   jnb     y5                   ; Wiederholung, falls nicht im Rücklauf
  125.   lodsw                        ; o.k. ein Wort vom Bildspeicher laden
  126.   sti                          ; Interrupts wieder erlaubt
  127.   stosw                        ; Speicherung in "Dest"
  128.   loop    y4                   ; nächstes Wort
  129.   jmp short y0
  130. y6:
  131.   shr     cx,1                 ; KEIN SNOW-CHECK: Hier werden einfach
  132.   rep movsw               ; "Len" Bytes (= CX/2 Wörter) kopiert
  133. y0:
  134.   pop     ds                   ;  DS-Reg
  135.   pop     bp                   ;   und BP wieder vom Stack
  136.   mov     sp,bp
  137.   pop     bp               ; Rücksprung, 10 Bytes vom Stack
  138.   ret     10                   ;  (Source, Dest jeweils 4, Len = 2 Bytes)
  139. MoveFromScreen    ENDP
  140.  
  141. CODE    ENDS
  142.  
  143.     END
  144.