home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l045 / 2.ddi / GRAF3270.ASM < prev    next >
Encoding:
Assembly Source File  |  1987-12-23  |  7.4 KB  |  204 lines

  1. ;********************************************************************
  2. ;*                         GRAPHIX TOOLBOX 4.0                      *
  3. ;*       Copyright (c) 1985, 87 by  Borland International, Inc.     *
  4. ;*                                                                  *
  5. ;*       Externals for IBM 3270 PC Video Adapter device driver      *
  6. ;********************************************************************
  7.  
  8. DATA     SEGMENT  WORD PUBLIC
  9.          EXTRN    ScreenGlb:DWORD, GrafBase:WORD, RamScreenGlb:BYTE
  10.          EXTRN    XTextGlb:BYTE, YTextGlb:BYTE, ColorGlb:BYTE, Font:BYTE
  11. DATA     ENDS
  12.  
  13. HardwareGrafBase  EQU 0B800H          ;Segment of graphics screen buffer
  14. ScreenSizeGlb     EQU 16383           ;The size of the screen in words
  15.  
  16. CODE     SEGMENT  BYTE PUBLIC
  17.  
  18.          ASSUME   CS:CODE, DS:DATA
  19.  
  20.          PUBLIC   DC, DP, SwapScreen, InvertScreen  ;Public routines
  21.  
  22. ; procedure DC(C : byte);
  23. ; var
  24. ;   X, Y, I : integer;
  25. ; begin
  26. ;   X := XTextGlb-1;
  27. ;   Y := (YTextGlb-1) * 14;
  28. ;   for I := 0 to 13 do
  29. ;     Mem[GrafBase:BaseAddress(Y+I) + X] := Font[C][I];
  30. ; end; { DC }
  31.  
  32. CPtr              EQU     BYTE PTR [BP+6]
  33.  
  34. DC                PROC FAR
  35.  
  36.          PUSH     BP              ;Save BP
  37.          MOV      BP,SP           ;Set up stack frame
  38.          MOV      BL,CPtr
  39.          XOR      BH,BH           ;BX := C
  40.          MOV      AX,14
  41.          MUL      BX
  42.          MOV      BX,AX           ;BX := C * 14
  43.          ADD      BX, OFFSET Font ;BX := Addr(Font[C])
  44.          MOV      DL,[XTextGlb]
  45.          XOR      DH,DH
  46.          INC      DX
  47.          MOV      DI,DX           ;DI := XTextGlb
  48.  
  49.          MOV      DL,[YTextGlb]
  50.          DEC      DX              ;DX := YTextGlb - 1
  51.          MOV      AX,14
  52.          MUL      DX
  53.          MOV      DX,AX           ;DX := (YTextGlb-1) * 14
  54.          MOV      AX,[GrafBase]
  55.          MOV      ES,AX           ;ES := GrafBase
  56.          MOV      AX,DX
  57.          MOV      CX,90
  58.          MUL      CX
  59.          MOV      DX,AX           ;DX := BaseAddress(Y + I)
  60.          MOV      CH,14           ;Loop 14 times
  61. Loop:    MOV      SI,DX           ;SI := BaseAddress(Y + I)
  62.          ADD      SI,DI           ;SI := BaseAddress(Y + I) + X
  63.          MOV      AL,[BX]         ;AL := Font[C][I]
  64.          MOV   ES:[SI],AL         ;Write piece of char to mem
  65.          INC      BX              ;Increment font offset
  66.          ADD      DX,90           ;DX := BaseAddress(Y + I)
  67.          DEC      CH              ;Decrement loop counter
  68.          JNZ      Loop            ;If Ch not zero then jump to loop:
  69.          POP      BP              ;Restore BP
  70.          RET      2               ;Remove parameter and return
  71.  
  72. DC                ENDP
  73.  
  74. ; procedure DP(X, Y : word);
  75. ; var
  76. ;   I : word;
  77. ; begin
  78. ;   I := BaseAddress(Y) + X shr 3;
  79. ;   if ColorGlb = 255 then
  80. ;     Mem[GrafBase:I] := Mem[GrafBase:I] or 128 shr (X and 7)
  81. ;   else
  82. ;     Mem[GrafBase:I] := Mem[GrafBase:I] and ($FF7F shr (X and 7));
  83. ; end; { DP }
  84.  
  85. XPtr              EQU     WORD PTR [BP+8]
  86. YPtr              EQU     WORD PTR [BP+6]
  87.  
  88. DP                PROC FAR
  89.  
  90.          PUSH     BP                       ;Save BP
  91.          MOV      BP,SP                    ;Set up stack frame
  92.          MOV      AX,YPtr                  ;BX := Y
  93.          MOV      CX,90
  94.          MUL      CX                       ;AX := BaseAddress(Y)
  95.          MOV      BX,XPtr                  ;BX := X
  96.          MOV      DX,BX
  97.          MOV      CL,03
  98.          SHR      BX,CL                    ;BX := X shr 3
  99.          ADD      BX,AX                    ;BX := BaseAddress(Y) + (X shr 3)
  100.          MOV      CL,DL
  101.          AND      CL,07                    ;CL := X and 7
  102.          MOV      DL,80H                   ;DL := 128
  103.          SHR      DL,CL                    ;DL := 128 shr (X and 7)
  104.          MOV      ES,[GrafBase]            ;ES := base of graphics screen
  105.          CMP      BYTE PTR [ColorGlb],0FFH ;Is ColorGlb = 255 ?
  106.          JNZ      AndBit
  107.          OR    ES:[BX],DL                  ;YES : OR the bit onto the screen
  108.          JMP      Done
  109. AndBit:  NOT      DL                       ;NO  : Invert the bits in DL
  110.          AND   ES:[BX],DL                  ;      AND the bit onto the screen
  111. Done:    POP      BP                       ;Restore BP
  112.          RET      4                        ;Remove parameters and return
  113.  
  114. DP                ENDP
  115.  
  116. ; procedure SwapScreen;
  117. ; { Exchanges the contents the of the displayed }
  118. ; { screen with the contents of the RAM screen  }
  119. ; const
  120. ;   HardwareGrafBase = $B800;
  121. ; var
  122. ;   ScanLine,
  123. ;   LineBase,
  124. ;   RamScrSeg  : word;
  125. ;   LineBuffer : array[0..XMaxGlb] of byte;
  126. ; begin
  127. ;   if RamScreenGlb then
  128. ;   begin
  129. ;     RamScrSeg := Seg(ScreenGlb^);
  130. ;     for ScanLine := 0 to YMaxGlb do
  131. ;     begin
  132. ;       LineBase := BaseAddress(Scanline);
  133. ;       Move(Mem[HardwareGrafBase:LineBase], LineBuffer, XMaxGlb+1);
  134. ;       Move(Mem[RamScrSeg:LineBase], Mem[HardwareGrafBase:LineBase], XMaxGlb+1);
  135. ;       Move(LineBuffer, Mem[RamScrSeg:LineBase], XMaxGlb+1);
  136. ;     end;
  137. ;   end;
  138. ; end; { SwapScreen }
  139.  
  140. SwapScreen          PROC FAR
  141.  
  142.            PUSH     BP                     ;Save BP
  143.            MOV      BP,SP                  ;Set up stack frame
  144.            MOV      AL,RamScreenGlb        ;Load boolean into AL
  145.            XOR      AH,AH                  ;AH <- 0
  146.            OR       AX,AX
  147.            JZ       JumpOut                ;Exit if boolean is false
  148.            LES      DI,[ScreenGlb]         ;ES <- Seg(ScreenGlb^)
  149.            PUSH     DS                     ;Save DS
  150.            MOV      AX,HardwareGrafBase    ;
  151.            MOV      DS,AX                  ;DS <- Seg of hardware screen
  152.            MOV      CX,ScreenSizeGlb       ;CX <- Size of screen in words
  153.            XOR      BX,BX                  ;BX <- word offset of zero
  154. SwapWords: MOV      AX,[BX]                ;AX <- word from hardware screen
  155.            XCHG     AX,ES:[BX]             ;AX <-> soft screen
  156.            MOV      [BX],AX                ;Hardware screen <- AX
  157.            INC      BX
  158.            INC      BX                     ;Increment word offset by 2
  159.            LOOP     SwapWords              ;Swap next byte
  160.            POP      DS                     ;Restore DS
  161. JumpOut:   POP      BP                     ;Restore BP
  162.            RET                             ;Return
  163.  
  164. SwapScreen        ENDP
  165.  
  166. ; procedure InvertScreen;
  167. ; { Invert the contents of screen memory }
  168. ; var
  169. ;   Offset : word;
  170. ; begin
  171. ;   for Offset := 0 to (16383 shl 1)+1 do
  172. ;     Mem[GrafBase:Offset] := Not(Mem[GrafBase:Offset]);
  173. ; end; { InvertScreen }
  174.  
  175. InvertScreen      PROC FAR
  176.  
  177.          PUSH     BP                  ;Save BP
  178.          MOV      BP,SP               ;Set up stack frame
  179.          PUSH     DS                  ;Save data segment
  180.          MOV      AX,[GrafBase]
  181.          MOV      DS,AX               ;DS := base address of graphics screen
  182.          MOV      CX,ScreenSizeGlb    ;CX := Size of screen in integers
  183.          XOR      BX,BX               ;Zero out BX
  184. InvWrd:  NOT      WORD PTR [BX]       ;Invert word at DS:BX
  185.          INC      BX
  186.          INC      BX                  ;Increment to next word
  187.          Loop     InvWrd
  188.          POP      DS                  ;Restore data segment
  189.          POP      BP                  ;Restore BP
  190.          RET                          ;Return
  191.  
  192. InvertScreen      ENDP
  193.  
  194. CODE     ENDS
  195.          END
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.