home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / bbs / mikes30c.arc / NOSNOW.ASM < prev    next >
Assembly Source File  |  1985-09-25  |  4KB  |  188 lines

  1. ; THIS IS A BOILER PLATE THAT ALLOWS YOU TO INTERFACE ASSEMBLY ROUTINES
  2. ; WITH A MICRSOFT 3.0 C PROGRAM.
  3. ; THIS PROGRAM CONTAINS TWO FUNCTIONS CALLED IN THE FOLLOWING MANOR:
  4. ;
  5. ;            scrnsave(seg_ptr, offset_ptr)
  6. ;            flash(seg_ptr, offset_ptr)
  7. ;            char far seg_ptr, offset_ptr;
  8. ;
  9. ;      Example:
  10. ;            flash(FP_SEG(holdscn1), FP_OFF(holdscn1));
  11. ;
  12. ; These pointers should point to a 4000 byte buffer ie. 
  13. ;     char far savebuf[4000];
  14. ; The first function will save the current screen into the buffer and 
  15. ; the second function will put a formatted screen (attribute, char,...etc)
  16. ; onto the screen very fast without the "snow" usually associated with
  17. ; the movedata() function. FP_SEG & FP_OFF are documented in the 
  18. ; Microsoft manual. I have used this this routine to create professional
  19. ; looking and fast screens that overcome the snails pace that printf()
  20. ; is known for. These routines automatically check for Mono or graphic
  21. ; adapter cards. Don't forget the /Fe compiler switch to enable the 
  22. ; "far" keyword and that the first byte of every character on the screen
  23. ; is an attribute value. See scrnput.c for further examples.
  24. ;
  25. ;                  by Garland Wong & Mike Elkins
  26. ;                  Mike's "C" Board  619-722-8724
  27. ;                       Oceanside, Calif.
  28. ;
  29.  
  30. SCREEN        SEGMENT    AT 0B000H
  31. SCREEN        ENDS
  32.  
  33. _TEXT    SEGMENT    BYTE    PUBLIC    'CODE'
  34.     ASSUME    CS:_TEXT
  35.     PUBLIC    _FLASH,_SCRNSAVE                   
  36.  
  37. _FLASH     PROC     NEAR
  38.     ASSUME DS:SCREEN
  39.     PUSH    BP            ;SAVE CALLER'S BP
  40.     MOV    BP,SP            ;ALLOWS US TO SEE THE STACK
  41.  
  42.     PUSH     DS            ;SAVE THE REGISTERS FOR GOOD FORM
  43.     PUSH     ES
  44.     PUSH     DI
  45.     PUSH     DX
  46.     PUSH    SI
  47.     PUSH     CX
  48.     PUSH    BX
  49.     PUSH    AX
  50.     
  51.     MOV    DX,[BP+4]        ;GET OFFSET 
  52.     MOV    CS:SEG_SCRN,DX
  53.     MOV    DX,[BP+6]        ;GET SEGMENT
  54.     MOV    CS:PNT_TO_OLD_SCRN,DX
  55.  
  56.     MOV    AH,15
  57.     INT    10H
  58.     SUB    AH,8
  59.     SHL    AH,1
  60.     MOV    CS:VIDEO_PORT,03BAH    ;THIS IS FOR MONOCHROME PORT
  61.     MOV    CS:POINT_TO_SCREEN,0    ;MAKE OFFSET THE MONOCHROME BUFFER
  62.     TEST    AL,4
  63.     JNZ    NOT_GRAPHICS
  64.     MOV    CS:VIDEO_PORT,03DAH    ;THIS IS FOR COLOR GRAPHICS PORT
  65.     MOV    CS:POINT_TO_SCREEN,8000H    ;MAKE OFFSET THE GRAPHICS BUFFER
  66.  
  67. NOT_GRAPHICS:
  68.     MOV    CX,SCREEN
  69.     MOV    DS,CX
  70.     MOV    DI,CS:POINT_TO_SCREEN
  71.     MOV    CX,2000
  72.     MOV    AX,CS:SEG_SCRN
  73.     MOV    ES,AX
  74.     MOV    SI,CS:PNT_TO_OLD_SCRN        ;MOVE OFFSET OF SCREEN TO SI
  75.     MOV    DX,CS:VIDEO_PORT        ;mike this can be either monochrome or graphics
  76.     CLI
  77.  
  78. SCAN_LOW:
  79.     IN    AL,DX
  80.     TEST    AL,1
  81.     JNZ    SCAN_LOW
  82.     MOV    BX,ES:[SI]            ;here is where you move the character into a temporary holder until okay to send
  83.     
  84. SCAN_HIGH:
  85.     IN    AL,DX
  86.     TEST    AL,1
  87.     JZ    SCAN_HIGH
  88.     MOV    [DI],BX                ;here is the actual move to the screen memory map
  89.     ADD    DI,2
  90.     ADD    SI,2
  91.     LOOP    SCAN_LOW            ;DO UNTIL SCREEN UPDATED
  92.     STI
  93.  
  94.     POP    AX
  95.     POP    BX
  96.     POP    CX
  97.     POP     SI
  98.     POP    DX
  99.     POP     DI
  100.     POP    ES
  101.     POP    DS
  102.  
  103.     MOV    SP,BP            ;GET BACK CALLER'S STACK POINTER
  104.     POP    BP            ;GET BACK BASE POINTER
  105.     RET
  106. _FLASH    ENDP    
  107.  
  108. _SCRNSAVE    PROC    NEAR
  109.     PUSH    BP            ;SAVE CALLER'S BP
  110.     MOV    BP,SP            ;ALLOWS US TO SEE THE STACK
  111.     ASSUME     DS:SCREEN
  112.     PUSH     DS
  113.     PUSH     ES
  114.     PUSH     DI
  115.     PUSH     DX
  116.     PUSH    SI
  117.     PUSH     CX
  118.     PUSH    BX
  119.     PUSH    AX
  120.  
  121.     MOV    AH,15
  122.     INT    10H
  123.     SUB    AH,8
  124.     SHL    AH,1
  125.     MOV    CS:VIDEO_PORT,03BAH    ;THIS IS FOR MONOCHROME PORT
  126.     MOV    CS:POINT_TO_SCREEN,0    ;MAKE OFFSET THE MONOCHROME BUFFER
  127.     TEST    AL,4
  128.     JNZ    IS_MONO
  129.     MOV    CS:VIDEO_PORT,03DAH    ;THIS IS FOR COLOR GRAPHICS PORT
  130.     MOV    CS:POINT_TO_SCREEN,8000H    ;MAKE OFFSET THE GRAPHICS BUFFER
  131.  
  132. IS_MONO:
  133.     
  134.     MOV    DX,[BP+4]        ;GET OFFSET 
  135.     MOV    CS:SEG_SCRN,DX
  136.     MOV    DX,[BP+6]        ;GET SEGMENT
  137.     MOV    CS:PNT_TO_OLD_SCRN,DX
  138.     MOV    CX,SCREEN
  139.     MOV    DS,CX
  140.     MOV    SI,CS:POINT_TO_SCREEN
  141.     MOV    CX,2000
  142.     MOV    AX,CS:SEG_SCRN
  143.     MOV    ES,AX
  144.     MOV    DI,CS:PNT_TO_OLD_SCRN        ;MOVE OFFSET OF SCREEN TO SI
  145.     MOV    DX,CS:VIDEO_PORT
  146.     CLI
  147.  
  148. SCAN_LOW_READ:
  149.     IN    AL,DX
  150.     TEST    AL,1
  151.     JNZ    SCAN_LOW_READ
  152.     
  153. SCAN_HIGH_READ:
  154.     IN    AL,DX
  155.     TEST    AL,1
  156.     JZ    SCAN_HIGH_READ
  157.     MOV    BX,WORD PTR [SI]
  158.     MOV    ES:[DI],BX
  159.     ADD    DI,2
  160.     ADD    SI,2
  161.     LOOP    SCAN_LOW_READ        ;DO UNTIL SCREEN UPDATED
  162.     STI
  163.  
  164.     POP    AX    
  165.     POP    BX    
  166.     POP    CX
  167.     POP     SI
  168.     POP    DX
  169.     POP     DI
  170.     POP    ES
  171.     POP    DS
  172.  
  173.     MOV    SP,BP            ;GET BACK CALLER'S STACK POINTER
  174.     POP    BP            ;GET BACK BASE POINTER
  175.     RET
  176. _SCRNSAVE    ENDP
  177.  
  178. POINT_TO_SCREEN     DW    0
  179. PNT_TO_OLD_SCRN        DW    0
  180. VIDEO_PORT        DW    0
  181. OLD_SCREEN        DW    0
  182. SEG_SCRN        DW    0
  183. _TEXT    ENDS
  184.     END
  185.  
  186.  
  187.  
  188.