home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / PWINDO.ZIP / PWINDOW.ASM next >
Encoding:
Assembly Source File  |  1988-05-04  |  8.0 KB  |  243 lines

  1. COMMENT *
  2.  
  3. FILE        pWINDOW.ASM
  4.  
  5.             John Tal
  6.             Rollins Medical/Dental Systems
  7.             Southfield, MI
  8.  
  9.              
  10.             Wget(BX,By,Bw,Bh,BUFFER) will save the specified window into 
  11.             BUFFER.   Bx,By,Bw,Bh are BYTES, Buffer is a BYTE array
  12.  
  13.             Wget(Bx,By,Bw,Bh,BUFFER) will restore the specified window 
  14.             from BUFFER.
  15.  
  16.  
  17.             Based on RWINDOW routines by Rollins Medical/Dental Systems
  18.             for saving screen images to QuickBasic string type.
  19.  
  20.  
  21.  
  22.             Thanks to
  23.  
  24.                      John Sieraski (Sysop Bproga) 76117,2022
  25.                      Michael Day                  73577,2225
  26.                      Brian Foley                  76317,3247
  27.  
  28.                 and especially
  29.  
  30.                      Steve Rollins, original author of Rwindow.Asm.
  31.  
  32.                      
  33.                      Without the assistance of these brave men, this
  34.                      trivial piece of code would not be possible.
  35.  
  36.  
  37.  
  38. * ----------------------------------------------------------------
  39.  
  40. DATA        SEGMENT BYTE PUBLIC
  41.  
  42. WX1         DB      ?                   ; X1
  43. WY1         DB      ?                   ; Y1
  44. WX2         DB      ?                   ; X2
  45. WY2         DB      ?                   ; Y2
  46.  
  47.  
  48. DATA        ENDS
  49.  
  50.  
  51.  
  52. CODE        SEGMENT BYTE PUBLIC
  53.  
  54.             ASSUME  CS:CODE,DS:DATA
  55.  
  56.             PUBLIC  WGET,WPUT
  57.  
  58. ;  procedure  Wget (x,  y,  w,  h:byte; buffer:buff_ptr);
  59. ;stack positions -> 16, 14, 12, 10,     8:6 pointer (DS:SI)
  60.  
  61.  
  62. WGET        PROC    FAR                 ; entry point 
  63.  
  64.             PUSH    BP                  ; save Turbos's bp & ds
  65.             MOV     BP,SP               ; get addressability to stack
  66.  
  67.             PUSH    DS                  ; setup for local data  
  68.  
  69.             MOV     AX,DATA
  70.             MOV     DS,AX
  71.  
  72.             MOV     AX,[BP+8]           ; get Pointer Segment to byte BUFFER pushed first 
  73.  
  74.             MOV     ES,AX         ; will use ES:DI to get at buffer
  75.  
  76.             MOV     DI,[BP+6]           ; get Pointer Offset, next word paramater
  77.                                         ; 
  78.  
  79.             MOV     AL,[BP+16]          ; 
  80.             DEC     AL                  ; change col to 0 - 24
  81.             MOV     WX1,AL              ; BX = X1
  82.  
  83.             MOV     AH,[BP+14]          ;
  84.             DEC     AH                  ; change row to 0 - 24
  85.             MOV     WY1,AH              ; BY = Y1
  86.  
  87.             MOV     CL,[BP+12]          ; bw
  88.             DEC     CL                  ;
  89.             ADD     CL,AL               ; BX+BW = X2
  90.             MOV     WX2,CL              ;
  91.  
  92.             MOV     CH,[BP+10]          ; bh
  93.             DEC     CH                  ;
  94.             ADD     CH,AH               ; BY+BH = Y2
  95.             MOV     WY2,CH              ; 
  96.  
  97.  
  98.  
  99.  
  100.             MOV     AH,15D              ; service 15: get current video mode
  101.             INT     10H                 ; request ROM-BIOS video service
  102.                                         ; this puts display page into bh
  103.  
  104.             MOV     AH,3D               ; service 3: read cursor position
  105.             INT     10H                 ; request ROM-BIOS video service
  106.  
  107.             MOV     [DI],CX             ; put cursor size in buffer$
  108.             INC     DI                  ; 
  109.             INC     DI                  ; 
  110.  
  111.             MOV     [DI],DX             ; put cursor pos BUFFER   
  112.             INC     DI                  ;
  113.             INC     DI                  ;
  114.  
  115.  
  116.  
  117.             MOV     DH,WY1              ; set row to top
  118.  
  119. LOOP1:      MOV     DL,WX1              ; set column to left
  120.  
  121. LOOP2:      MOV     AH,2D               ; service 2: set cursor position
  122.             INT     10H                 ; request ROM-BIOS video service
  123.  
  124.             MOV     AH,8D               ; service 8: read character and attribute
  125.             INT     10H                 ; request ROM-BIOS video service
  126.  
  127.             MOV     [DI],AX          
  128.             INC     DI                  ; increment past char
  129.             INC     DI                  ; increment  past attrib
  130.  
  131.             INC     DL                  ; increment column
  132.             CMP     DL,WX2              ; finished with this row?
  133.             JLE     LOOP2               ; jump if not
  134.  
  135.             INC     DH                  ; increment row
  136.             CMP     DH,WY2              ; finshed?
  137.             JLE     LOOP1               ; jump if not
  138.  
  139. ENDSAVE:    
  140.             POP     DS                  ; restore ds
  141.             POP     BP                  ; restore bp
  142.  
  143.             RET     12                  ; 
  144.  
  145. WGET        ENDP
  146.  
  147.  
  148. ;  procedure  Wput (x,  y,  w,  h:byte; buffer:buff_ptr);
  149. ;stack positions -> 16, 14, 12, 10,     8:6 pointer (DS:SI)
  150.  
  151.  
  152. WPUT        PROC    FAR                 ; entry point
  153.  
  154.             PUSH    BP                  ; save Turbo bp & ds
  155.             MOV     BP,SP               ; get addressability to stack
  156.  
  157.             PUSH    DS
  158.  
  159.             MOV     AX,DATA
  160.             MOV     DS,AX
  161.  
  162.             MOV     AX,[BP+8]           ; get Pointer Segment to byte BUFFER 
  163.  
  164.             MOV     ES,AX 
  165.  
  166.             MOV     DI,[BP+6]            ; get Pointer Offset 
  167.  
  168.  
  169.             MOV     AL,[BP+16]          ; get top row
  170.             DEC     AL                  ; change row to 0 - 24
  171.             MOV     WX1,AL              ; BX = X1
  172.  
  173.             MOV     AH,[BP+14]          ; get bottom row
  174.             DEC     AH                  ; change row to 0 - 24
  175.             MOV     WY1,AH              ; BY = Y1
  176.  
  177.             MOV     CL,[BP+12]          ; bw
  178.             DEC     CL                  ;
  179.             ADD     CL,AL               ; BX+BW = X2
  180.             MOV     WX2,CL              ;
  181.  
  182.             MOV     CH,[BP+10]          ; bw
  183.             DEC     CH                  ;
  184.             ADD     CH,AH               ; BY+BH = Y2
  185.             MOV     WY2,CH              ; 
  186.  
  187.         PUSH    DI
  188.             ADD     DI,4                ; set si to first char/byte
  189.  
  190.             MOV     AH,15D              ; service 15: get current video mode
  191.             INT     10H                 ; request ROM-BIOS video service
  192.                                         ; this puts display page into bh
  193.  
  194.             MOV     CX,1                ; repetition count for service 9
  195.  
  196.  
  197.  
  198.             MOV     DH,WY1              ; set row to top
  199.  
  200. LOOP3:      MOV     DL,WX1              ; set column to left
  201.  
  202. LOOP4:      MOV     AH,2D               ; service 2: set cursor position
  203.             INT     10H                 ; request ROM-BIOS video service
  204.  
  205.             MOV     AL,[DI]             ; get character
  206.             INC     DI                  ; increment si
  207.             MOV     BL,[DI]             ; get attribute
  208.             INC     DI                  ; increment si
  209.             MOV     AH,9D               ; service 8: write character and attribute
  210.             INT     10H                 ; request ROM-BIOS video service
  211.  
  212.             INC     DL                  ; increment column
  213.             CMP     DL,WX2              ; finished with this row?
  214.             JLE     LOOP4               ; jump if not
  215.  
  216.             INC     DH                  ; increment row
  217.             CMP     DH,WY2              ; finshed?
  218.             JLE     LOOP3               ; jump if not
  219.  
  220.             POP     DI                  ; retrieve address of BUFFER start
  221.  
  222.             MOV     CX,[DI]             ; get cursor size
  223.             MOV     AH,1D               ; service 1: set cursor size
  224.             INT     10H                 ; request ROM-BIOS video service
  225.  
  226.             MOV     DX,[DI+2]           ; get row and column
  227.             MOV     AH,2D               ; service 2: set cursor position
  228.             INT     10H                 ; request ROM-BIOS video service
  229.  
  230. ENDREST:    POP     DS
  231.             POP     BP                  ; restore bp
  232.  
  233.             RET     12                  ; 4 byte/words and byte pointer
  234.  
  235. WPUT        ENDP
  236.  
  237.  
  238.  
  239. CODE        ENDS
  240.  
  241.             END
  242.  
  243.