home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / turbo55 / install / demos.arc / WIN.ASM < prev    next >
Assembly Source File  |  1989-05-02  |  5KB  |  285 lines

  1. ; Turbo Pascal 5.5 example
  2. ; Assembler include file for WIN.PAS unit
  3. ; Copyright (c) 1989 by Borland International, Inc.
  4.  
  5.         TITLE   WIN
  6.  
  7.         LOCALS  @@
  8.  
  9. ; Coordinate record
  10.  
  11. X               EQU     (BYTE PTR 0)
  12. Y               EQU     (BYTE PTR 1)
  13.  
  14. ; BIOS workspace equates
  15.  
  16. CrtMode         EQU     (BYTE PTR 49H)
  17. CrtWidth        EQU     (BYTE PTR 4AH)
  18.  
  19. DATA    SEGMENT WORD PUBLIC
  20.  
  21. ; Externals from CRT unit
  22.  
  23.         EXTRN   CheckSnow:BYTE,WindMin:WORD,WindMax:WORD
  24.  
  25. DATA    ENDS
  26.  
  27. CODE    SEGMENT BYTE PUBLIC
  28.  
  29.         ASSUME  CS:CODE,DS:DATA
  30.  
  31. ; procedure WriteStr(X, Y: Byte; S: String; Attr: Byte);
  32.  
  33.         PUBLIC  WriteStr
  34.  
  35. WriteStr:
  36.  
  37.         PUSH    BP
  38.         MOV     BP,SP
  39.         LES     BX,[BP+8]
  40.         MOV     CL,ES:[BX]
  41.         MOV     SI,OFFSET CS:CrtWriteStr
  42.         CALL    CrtWrite
  43.         POP     BP
  44.         RETF    10
  45.  
  46. ; procedure WriteChar(X, Y, Count: Byte; Ch: Char; Attr: Byte);
  47.  
  48.         PUBLIC  WriteChar
  49.  
  50. WriteChar:
  51.  
  52.         PUSH    BP
  53.         MOV     BP,SP
  54.         MOV     CL,[BP+10]
  55.         MOV     SI,OFFSET CS:CrtWriteChar
  56.         CALL    CrtWrite
  57.         POP     BP
  58.         RETF    10
  59.  
  60. ; procedure FillWin(Ch: Char; Attr: Byte);
  61.  
  62.         PUBLIC  FillWin
  63.  
  64. FillWin:
  65.  
  66.         MOV     SI,OFFSET CS:CrtWriteChar
  67.         JMP     SHORT CommonWin
  68.  
  69. ; procedure ReadWin(var Buf);
  70.  
  71.         PUBLIC  ReadWin
  72.  
  73. ReadWin:
  74.  
  75.         MOV     SI,OFFSET CS:CrtReadWin
  76.         JMP     SHORT CommonWin
  77.  
  78. ; procedure WriteWin(var Buf);
  79.  
  80.         PUBLIC  WriteWin
  81.  
  82. WriteWin:
  83.  
  84.         MOV     SI,OFFSET CS:CrtWriteWin
  85.  
  86. ; Common FillWin/ReadWin/WriteWin routine
  87.  
  88. CommonWin:
  89.  
  90.         PUSH    BP
  91.         MOV     BP,SP
  92.         XOR     CX,CX
  93.         MOV     DX,WindMin
  94.         MOV     CL,WindMax.X
  95.         SUB     CL,DL
  96.         INC     CX
  97. @@1:    PUSH    CX
  98.         PUSH    DX
  99.         PUSH    SI
  100.         CALL    CrtBlock
  101.         POP     SI
  102.         POP     DX
  103.         POP     CX
  104.         INC     DH
  105.         CMP     DH,WindMax.Y
  106.         JBE     @@1
  107.         POP     BP
  108.         RETF    4
  109.  
  110. ; Write string to screen
  111.  
  112. CrtWriteStr:
  113.  
  114.         PUSH    DS
  115.         MOV     AH,[BP+6]
  116.         LDS     SI,[BP+8]
  117.         INC     SI
  118.         JC      @@4
  119. @@1:    LODSB
  120.         MOV     BX,AX
  121. @@2:    IN      AL,DX
  122.         TEST    AL,1
  123.         JNE     @@2
  124.         CLI
  125. @@3:    IN      AL,DX
  126.         TEST    AL,1
  127.         JE      @@3
  128.         MOV     AX,BX
  129.         STOSW
  130.         STI
  131.         LOOP    @@1
  132.         POP     DS
  133.         RET
  134. @@4:    LODSB
  135.         STOSW
  136.         LOOP    @@4
  137.         POP     DS
  138.         RET
  139.  
  140. ; Write characters to screen
  141.  
  142. CrtWriteChar:
  143.  
  144.         MOV     AL,[BP+8]
  145.         MOV     AH,[BP+6]
  146.         JC      @@4
  147.         MOV     BX,AX
  148. @@1:    IN      AL,DX
  149.         TEST    AL,1
  150.         JNE     @@1
  151.         CLI
  152. @@2:    IN      AL,DX
  153.         TEST    AL,1
  154.         JE      @@2
  155.         MOV     AX,BX
  156.         STOSW
  157.         STI
  158.         LOOP    @@1
  159.         RET
  160. @@4:    REP     STOSW
  161.         RET
  162.  
  163. ; Read window buffer from screen
  164.  
  165. CrtReadWin:
  166.  
  167.         PUSH    DS
  168.         PUSH    ES
  169.         POP     DS
  170.         MOV     SI,DI
  171.         LES     DI,[BP+6]
  172.         CALL    CrtCopyWin
  173.         MOV     [BP+6],DI
  174.         POP     DS
  175.         RET
  176.  
  177. ; Write window buffer to screen
  178.  
  179. CrtWriteWin:
  180.  
  181.         PUSH    DS
  182.         LDS     SI,[BP+6]
  183.         CALL    CrtCopyWin
  184.         MOV     [BP+6],SI
  185.         POP     DS
  186.         RET
  187.  
  188. ; Window buffer copy routine
  189.  
  190. CrtCopyWin:
  191.  
  192.         JC      @@4
  193. @@1:    LODSW
  194.         MOV     BX,AX
  195. @@2:    IN      AL,DX
  196.         TEST    AL,1
  197.         JNE     @@2
  198.         CLI
  199. @@3:    IN      AL,DX
  200.         TEST    AL,1
  201.         JE      @@3
  202.         MOV     AX,BX
  203.         STOSW
  204.         STI
  205.         LOOP    @@1
  206.         RET
  207. @@4:    REP     MOVSW
  208.         RET
  209.  
  210. ; Do screen operation
  211. ; In    CL = Buffer length
  212. ;       SI = Write procedure pointer
  213. ;       BP = Stack frame pointer
  214.  
  215. CrtWrite:
  216.  
  217.         MOV     DL,[BP+14]
  218.         DEC     DL
  219.         ADD     DL,WindMin.X
  220.         JC      CrtExit
  221.         CMP     DL,WindMax.X
  222.         JA      CrtExit
  223.         MOV     DH,[BP+12]
  224.         DEC     DH
  225.         ADD     DH,WindMin.Y
  226.         JC      CrtExit
  227.         CMP     DH,WindMax.Y
  228.         JA      CrtExit
  229.         XOR     CH,CH
  230.         JCXZ    CrtExit
  231.         MOV     AL,WindMax.X
  232.         SUB     AL,DL
  233.         INC     AL
  234.         CMP     CL,AL
  235.         JB      CrtBlock
  236.         MOV     CL,AL
  237.  
  238. ; Do screen operation
  239. ; In    CL = Buffer length
  240. ;       DX = CRT coordinates
  241. ;       SI = Procedure pointer
  242.  
  243. CrtBlock:
  244.  
  245.         MOV     AX,40H
  246.         MOV     ES,AX
  247.         MOV     AL,DH
  248.         MUL     ES:CrtWidth
  249.         XOR     DH,DH
  250.         ADD     AX,DX
  251.         SHL     AX,1
  252.         MOV     DI,AX
  253.         MOV     AX,0B800H
  254.         CMP     ES:CrtMode,7
  255.         JNE     @@1
  256.         MOV     AH,0B0H
  257. @@1:    MOV     ES,AX
  258.         MOV     DX,03DAH
  259.         CLD
  260.         CMP     CheckSnow,1
  261.         JMP     SI
  262.  
  263. ; Exit from screen operation
  264.  
  265. CrtExit:
  266.  
  267.         RET
  268.  
  269. ; function WinSize: Word;
  270.  
  271.         PUBLIC  WinSize
  272.  
  273. WinSize:
  274.  
  275.         MOV     AX,WindMax
  276.         SUB     AX,WindMin
  277.         ADD     AX,101H
  278.         MUL     AH
  279.         SHL     AX,1
  280.         RETF
  281.  
  282. CODE    ENDS
  283.  
  284.         END
  285.