home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / windows / baswind8.zip / NEWSCRN.ASM < prev    next >
Assembly Source File  |  1990-09-14  |  8KB  |  219 lines

  1. ;
  2. ;
  3. ;Title:NEWSCRN.ASM              SEPT 1 , 1990
  4. ;
  5. ;==============================================================================
  6. ;
  7. ;
  8. ;  Module (external) : SAVESCRN
  9. ;
  10. ;   INPUT  :  BP+8 - address of the address to Basic's 4k save area (offset)
  11. ;
  12. ;             BP+0a- address of the Segment address of Basic's save area
  13. ;
  14. ;             BP+0c- address of interger variable that indicates how to
  15. ;                    handle refresh of video for CGA monitors.
  16. ;
  17. ;  OUTPUT:   [BP+a]:[BP+8] - an area allocated by Basic that contains copy of
  18. ;                        the screen image.
  19. ;
  20. ;            ALL OTHER REGS PRESERVED.
  21. ;
  22. ;  Module (external) : RESTSCRN
  23. ;
  24. ;   INPUT  :  BP+8 - address of the address to Basic's save area (offset)
  25. ;
  26. ;             BP+0a- address of the Segment address of Basic's save area
  27. ;
  28. ;             BP+0c- address of interger variable that indicates how to
  29. ;                    handle refresh of video for CGA monitors.
  30. ;
  31. ;  OUTPUT:  The 2000 words at [BP+a]:[BP+8] are moved to the video regen buffer
  32. ;
  33. ;            ALL OTHER REGS PRESERVED.
  34. ;
  35. ;============================================================================
  36.  
  37. ;
  38. Basic_setup    MACRO
  39.                PUSH     BP
  40.                MOV      BP,SP
  41.  
  42.  
  43.                PUSH     AX
  44.                PUSH     BX
  45.                PUSH     CX
  46.                PUSH     DX
  47.  
  48.                PUSH     SI
  49.                PUSH     DI
  50.                PUSH     DS
  51.                PUSH     ES
  52.                ENDM
  53.  
  54. Basic_cleanup  MACRO
  55.                CLD
  56.                POP      ES
  57.                POP      DS
  58.                POP      DI
  59.                POP      SI
  60.                POP      DX
  61.                POP      CX
  62.                POP      BX
  63.                POP      AX
  64.  
  65.                POP      BP
  66.                ENDM
  67.  
  68. Bios_data      SEGMENT  At 40H
  69.                ORG      10H
  70. Equip_flag     LABEL    WORD
  71.                ORG      63H
  72. Addr_6845      LABEL    WORD
  73. Bios_data      ENDS
  74.  
  75. Stack          STRUC
  76. Bpsav          DW       ?                       ;saved by us
  77. Retoff         DW       ?                       ;from callf
  78. Retseg         DW       ?                       ;from basic
  79. Return_code    DW       ?
  80. Array_off      DW       ?                       ;pointer to array in far heap
  81. Array_seg      DW       ?                       ;pointer to array in far heap
  82. Retrace        DW       ?                       ;vertical retrace wait indicator
  83. Stack          ENDS
  84.  
  85. ;
  86. Code           SEGMENT  BYTE PUBLIC 'CODE'
  87.                ASSUME   CS:Code,DS:Code
  88.  
  89.                PUBLIC   Savescrn
  90.                PUBLIC   Restscrn
  91.  
  92. ;
  93. Savescrn       PROC     FAR
  94.                Basic_setup                      ;save for basic
  95.  
  96.                MOV      BX,[BP].Return_code
  97.                MOV      WORD PTR [BX],0
  98.  
  99.                MOV      BX,[BP].Array_off       ;get location of array
  100.                MOV      SI,[BX]                 ;
  101.  
  102.                MOV      BX,[BP].Array_seg       ;get location to segment
  103.                MOV      DS,[BX]                 ;address of basics save area
  104.  
  105.                CALL     Get_set                 ;set up transfer conditions
  106.  
  107.                PUSH     ES                      ;exchange es and ds registers
  108.                PUSH     DS                      ;since we are moving data
  109.  
  110.                POP      ES                      ;from screen to array
  111.                POP      DS                      ;
  112.  
  113.                XCHG     SI,DI                   ;exchange indexes too
  114.  
  115.                CALL     Go                      ;do transfer
  116.  
  117.                Basic_cleanup                    ;prepare to return to basic
  118.  
  119.                RET      8                       ;go past 4 integer parameters
  120. Savescrn       ENDP
  121.  
  122. ;
  123. Restscrn       PROC     FAR
  124.                Basic_setup                      ;save for basic
  125.  
  126.                MOV      BX,[BP].Return_code
  127.                MOV      WORD PTR [BX],0
  128.  
  129.                MOV      BX,[BP].Array_off       ;get offset address of basica
  130.                MOV      SI,[BX]                 ;save area
  131.  
  132.                MOV      BX,[BP].Array_seg       ;get data segement address of
  133.                MOV      DS,[BX]                 ;basics save area
  134.  
  135.                CALL     Get_set                 ;set up transfer conditions
  136.  
  137.                CALL     Go                      ;do transfer
  138.  
  139.                Basic_cleanup                    ;prepare to return to basic
  140.  
  141.                RET      8                       ;go past 4 integer parameter
  142. Restscrn       ENDP
  143.  
  144. ;
  145. Get_set        PROC     NEAR
  146.                XOR      DI,DI                   ;point di to 0(zero) offset to an area
  147.  
  148.                MOV      CX,2000D                ;number of words (4096) bytes to move
  149.  
  150.                MOV      BX,Bios_data            ;
  151.                MOV      ES,BX                   ;point to bios data block
  152.  
  153.                MOV      DX,ES:Addr_6845         ;set up dx to base of 6845
  154.                ADD      DX,6                    ;set it up for status port
  155.  
  156.                MOV      AX,0B800H               ;assume it is a color card segment address
  157.  
  158.                MOV      BX,ES:Equip_flag        ;test to see if it is a cga card installed
  159.  
  160.                AND      BX,30H                  ;mask out all but the correct bits
  161.                CMP      BX,30H                  ;
  162.                JNE      Ok                      ;ok it is color
  163.  
  164.                MOV      AX,0B000H               ;no, it's monochrome adapter installed
  165. OK:
  166.                MOV      ES,AX                   ;set up correct segment address of video adapter
  167.  
  168.                RET
  169. Get_set        ENDP
  170.  
  171. ;
  172. Go             PROC     NEAR
  173.                CLD                              ;do a forward move
  174.                MOV      AX,[BP].Retrace         ;get snowtest parameter
  175.                CMP      AX,1                    ;is it ok for no snow?
  176.                JZ       Notest                  ;yes, do fast transfer
  177.  
  178. TESTCARD:
  179.                MOV      BX,ES                   ;test destination
  180.                CMP      BX,0B000H               ;is it monochrome?
  181.                JZ       Notest                  ;yes, do fast transfer
  182. AGAIN:
  183.                MOV      BX,DS                   ;test source
  184.                CMP      BX,0B000H               ;same here except for screen
  185.                JZ       Notest                  ;restore
  186.  
  187. ; if all above tests fail, card must be an IBM CGA  and must test for snow
  188.  
  189. IBMCGA:
  190.                CLI                              ;disable interrupts
  191. TEST_LO:
  192.                IN       AL,DX                   ;test horizontal retrace
  193.                JMP      SHORT $+2
  194.                SHR      AL,1                    ;wait 'til it's low
  195.                JC       Test_lo
  196. TEST_HI:
  197.                IN       AL,DX                   ;now test 'til it's high
  198.                JMP      SHORT $+2
  199.                SHR      AL,1
  200.                JNC      Test_hi
  201.  
  202.                MOVSW                            ;ok now to move char and attr
  203.  
  204.                STI                              ;restore interrupts
  205.  
  206.                LOOP     Ibmcga                  ;do 2000 times for full screen
  207.  
  208.                RET
  209.  
  210. NOTEST:
  211.                MOVSW                            ;move character and attribute
  212.                LOOP     Notest                  ;do 2000 times
  213.  
  214.                RET
  215. Go             ENDP
  216.  
  217. Code           ENDS
  218.                END
  219.