home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TTT405.ZIP / WINTTT.ASM < prev    next >
Encoding:
Assembly Source File  |  1987-11-27  |  9.0 KB  |  218 lines

  1.  
  2. ;       TechnoJocks Turbo Toolkit v4.0
  3. ;       Display Routines : included in UNIT WinTTT
  4. ;       Copyright (c) R. D. Ainsbury 1986, 1987
  5. ;
  6. ;       Credit: Brian Foley
  7.  
  8. ;****************************************************** Data
  9.  
  10. DATA    SEGMENT BYTE PUBLIC
  11.  
  12.         EXTRN   BaseOfScreen : WORD     ;Pascal variables
  13.         EXTRN   WaitForRetrace : BYTE
  14.  
  15.    ;     CurrentMode     DB      ?       ;local variables
  16.    ;     Display         DB      ?
  17.  
  18. DATA    ENDS
  19.  
  20. ;****************************************************** Code
  21.  
  22. CODE    SEGMENT BYTE PUBLIC
  23.  
  24.         ASSUME  CS:CODE,DS:DATA
  25.  
  26.         PUBLIC  Attribute, MoveFromScreen, MoveToScreen
  27.  
  28. ;****************************************************** CalcOffset
  29.  
  30. ;Calculates offset in video memory corresponding to Row,Column
  31. ;On entry, CH has Row, BX has Column (both 1-based)
  32. ;On exit, ES:DI points to proper address in video memory, AX = 0
  33.  
  34. CalcOffset      PROC NEAR
  35.  
  36.         XOR     AX,AX                   ;AX = 0
  37.         MOV     CL,AL                   ;CL = 0
  38.         MOV     BH,AL                   ;BH = 0
  39.         DEC     CH                      ;Row (in CH) to 0..24 range
  40.         SHR     CX,1                    ;CX = Row * 128
  41.         MOV     DI,CX                   ;Store in DI
  42.         SHR     DI,1                    ;DI = Row * 64
  43.         SHR     DI,1                    ;DI = Row * 32
  44.         ADD     DI,CX                   ;DI = (Row * 160)
  45.         DEC     BX                      ;Col (in BX) to 0..79 range
  46.         SHL     BX,1                    ;Account for attribute bytes
  47.         ADD     DI,BX                   ;DI = (Row * 160) + (Col * 2)
  48.         MOV     ES,BaseOfScreen         ;ES:DI points to BaseOfScreen:Row,Col
  49.         RET                             ;Return
  50.  
  51. CalcOffset      ENDP
  52.  
  53. ;****************************************************** ChangeAttribute
  54.  
  55. ;procedure Attribute(Col,Row,Attr:byte;Number : Word);
  56. ;Change Number video attributes to Attr starting at Row,Col
  57.  
  58. ;equates for parameters:
  59. ANumber        EQU     WORD PTR [BP+6]
  60. AAttr          EQU     BYTE PTR [BP+8]
  61. ARow           EQU     BYTE PTR [BP+10]
  62. ACol           EQU     BYTE PTR [BP+12]
  63.  
  64. Attribute PROC FAR
  65.  
  66.         PUSH    BP                      ;Save BP
  67.         MOV     BP,SP                   ;Set up stack frame
  68.         MOV     CH,ARow                 ;CH = Row
  69.         MOV     BL,ACol                 ;BL = Column
  70.         CALL    CalcOffset              ;Call routine to calculate offset
  71.         INC     DI                      ;Skip character
  72.         CLD                             ;Set direction to forward
  73.         MOV     CX,ANumber              ;CX = Number to change
  74.         JCXZ    AExit                   ;If zero, exit
  75.         MOV     AL,AAttr                ;AL = Attribute
  76.         CMP     WaitForRetrace,1        ;Get wait state
  77.         JNE     ANoWait                 ;If WaitForRetrace is False
  78.                                         ; use ANoWait routine
  79.         MOV     AH,AL                   ;Store attribute in AH
  80.         MOV     DX,03DAh                ;Point DX to CGA status port
  81. AGetNext:
  82.         CLI                             ;No interrupts now
  83. AWaitNoH:
  84.         IN      AL,DX                   ;Get 6845 status
  85.         TEST    AL,8                    ;Check for vert. retrace
  86.         JNZ     AGo                     ;In progress? Go
  87.         RCR     AL,1                    ;Wait for end of horizontal
  88.         JC      AWaitNoH                ; retrace
  89. AWaitH:
  90.         IN      AL,DX                   ;Get 6845 status again
  91.         RCR     AL,1                    ;Wait for horizontal
  92.         JNC     AWaitH                  ; retrace
  93. AGo:
  94.         MOV     AL,AH                   ;Move Attr back to AL...
  95.         STOSB                           ; and then to screen
  96.         STI                             ;Allow interrupts
  97.         INC     DI                      ;Skip characters
  98.         LOOP    AGetNext                ;Look for next opportunity
  99.         JMP     AExit                   ;Done
  100. ANoWait:
  101.         STOSB                           ;Change the attribute
  102.         INC     DI                      ;Skip characters
  103.         LOOP    ANoWait                 ;Get next character
  104. AExit:                                  ;Next instruction
  105.         MOV     SP,BP                   ;Restore SP
  106.         POP     BP                      ;Restore BP
  107.         RET     8                       ;Remove parameters and return
  108.  
  109. Attribute ENDP
  110.  
  111. ;****************************************************** MoveFromScreen
  112.  
  113. ;procedure MoveFromScreen(var Source, Dest; Length : Word);
  114. ;Move Length words from Source (video memory) to Dest without snow
  115.  
  116. ;equates for parameters:
  117. MFLength        EQU     WORD PTR [BP+6]
  118. MFDest          EQU     DWORD PTR [BP+8]
  119. MFSource        EQU     DWORD PTR [BP+12]
  120.  
  121. MoveFromScreen  PROC FAR
  122.  
  123.         PUSH    BP                      ;Save BP
  124.         MOV     BP,SP                   ;Set up stack frame
  125.         MOV     BX,DS                   ;Save DS in BX
  126.         MOV     AL,WaitForRetrace       ;Grab before changing DS
  127.         LES     DI,MFDest               ;ES:DI points to Dest
  128.         LDS     SI,MFSource             ;DS:SI points to Source
  129.         MOV     CX,MFLength             ;CX = Length
  130.         CLD                             ;Set direction to forward
  131.         RCR     AL,1                    ;Check WaitForRetrace
  132.         JNC     MFNoWait                ;False? Use MFNoWait routine
  133.         MOV     DX,03DAh                ;Point DX to CGA status port
  134. MFNext:
  135.         CLI                             ;No interrupts now
  136. MFWaitNoH:
  137.         IN      AL,DX                   ;Get 6845 status
  138.         TEST    AL,8                    ;Check for vertical retrace
  139.         JNZ     MFGo                    ;In progress? go
  140.         RCR     AL,1                    ;Wait for end of horizontal
  141.         JC      MFWaitNoH               ; retrace
  142. MFWaitH:
  143.         IN      AL,DX                   ;Get 6845 status again
  144.         RCR     AL,1                    ;Wait for horizontal
  145.         JNC     MFWaitH                 ; retrace
  146. MFGo:
  147.         LODSW                           ;Load next video word into AX
  148.         STI                             ;Allow interrupts
  149.         STOSW                           ;Store video word in Dest
  150.         LOOP    MFNext                  ;Get next video word
  151.         JMP     MFExit                  ;All Done
  152. MFNoWait:
  153.         REP     MOVSW                   ;That's it!
  154. MFExit:
  155.         MOV     DS,BX                   ;Restore DS
  156.         MOV     SP,BP                   ;Restore SP
  157.         POP     BP                      ;Restore BP
  158.         RET     10                      ;Remove parameters and return
  159.  
  160. MoveFromScreen  ENDP
  161.  
  162. ;****************************************************** MoveToScreen
  163.  
  164. ;procedure MoveToScreen(var Source, Dest; Length : Word);
  165. ;Move Length words from Source to Dest (video memory) without snow
  166.  
  167. ;equates for parameters:
  168. MTLength        EQU     WORD PTR [BP+6]
  169. MTDest          EQU     DWORD PTR [BP+8]
  170. MTSource        EQU     DWORD PTR [BP+12]
  171.  
  172. MoveToScreen    PROC FAR
  173.  
  174.         PUSH    BP                      ;Save BP
  175.         MOV     BP,SP                   ;Set up stack frame
  176.         PUSH    DS                      ;Save DS
  177.         MOV     AL,WaitForRetrace       ;Grab before changing DS
  178.         LES     DI,MTDest               ;ES:DI points to Dest
  179.         LDS     SI,MTSource             ;DS:SI points to Source
  180.         MOV     CX,MTLength             ;CX = Length
  181.         CLD                             ;Set direction to forward
  182.         RCR     AL,1                    ;Check WaitForRetrace
  183.         JNC     MTNoWait                ;False? Use MTNoWait routine
  184.         MOV     DX,03DAh                ;Point DX to CGA status port
  185. MTGetNext:
  186.         LODSW                           ;Load next video word into AX
  187.         MOV     BX,AX                   ;Store video word in BX
  188.         CLI                             ;No interrupts now
  189. MTWaitNoH:
  190.         IN      AL,DX                   ;Get 6845 status
  191.         TEST    AL,8                    ;Check for vertical retrace
  192.         JNZ     MTGo                    ;In progress? Go
  193.         RCR     AL,1                    ;Wait for end of horizontal
  194.         JC      MTWaitNoH               ; retrace
  195. MTWaitH:
  196.         IN      AL,DX                   ;Get 6845 status again
  197.         RCR     AL,1                    ;Wait for horizontal
  198.         JNC     MTWaitH                 ; retrace
  199. MTGo:
  200.         MOV     AX,BX                   ;Move word back to AX...
  201.         STOSW                           ; and then to screen
  202.         STI                             ;Allow interrupts
  203.         LOOP    MTGetNext               ;Get next video word
  204.         JMP     MTExit                  ;All done
  205. MTNoWait:
  206.         REP     MOVSW                   ;That's all!
  207. MTExit:
  208.         POP     DS                      ;Restore DS
  209.         MOV     SP,BP                   ;Restore SP
  210.         POP     BP                      ;Restore BP
  211.         RET     10                      ;Remove parameters and return
  212.  
  213. MoveToScreen    ENDP
  214.  
  215. CODE    ENDS
  216.  
  217.         END
  218.