home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG088P.ASM < prev    next >
Assembly Source File  |  1988-05-02  |  8KB  |  326 lines

  1.  
  2. ;************************************************************************
  3. ; Set Cursor:                                *
  4. ; This procedure will expand the two cursor masks into            *
  5. ; four planes.    The expanded masks will be stored            *
  6. ; after the last visible scan line at A000:(640/8*350).         *
  7. ; Entry:    AND_Mask - 2x16 bytes with AND mask            *
  8. ;        XOR_Mask - 2x16 bytes with XOR mask            *
  9. ;        BG_Color - Foreground color                *
  10. ;        FG_Color - Background color                *
  11. ;************************************************************************
  12.  
  13.  
  14. YSIZE        EQU    350
  15. HBYTES        EQU    80
  16. CUR_HEIGHT    EQU    16
  17. GRFSEG        EQU    0A000H
  18.  
  19. AND_SAVE    EQU    (YSIZE*HBYTES+0)
  20. XOR_SAVE    EQU    (YSIZE*HBYTES+2)
  21. CUR_SAVE    EQU    (YSIZE*HBYTES+4)
  22.  
  23. AND_Mask    EQU    [BP+12]
  24. XOR_Mask    EQU    [BP+10]
  25. BG_Color    EQU    [BP+8]
  26. FG_Color    EQU    [BP+6]
  27.  
  28. Last_Cursor    DW    0
  29.  
  30.     PUBLIC    Set_Cursor
  31.  
  32. Set_Cursor    PROC FAR
  33.     PUSH    BP
  34.     MOV    BP,SP
  35.     PUSH    SI
  36.     PUSH    DI
  37.     PUSH    ES            ; always save seg regs
  38.     PUSH    DS
  39.  
  40.     MOV    AX,GRFSEG        ;Point ES to video ram.
  41.     MOV    ES,AX
  42.  
  43.     ;Set EGA to use SET/RESET register to fill with background color
  44.  
  45.     MOV    DX,3CEH         ; enable use of reset register
  46.     MOV    AL,1
  47.     OUT    DX,AL
  48.     INC    DX
  49.     MOV    AL,0Fh
  50.     OUT    DX,AL
  51.     DEC    DX            ; move color into reset register
  52.     XOR    AL,AL
  53.     OUT    DX,AL
  54.     INC    DX
  55.     MOV    AX,BG_Color
  56.     OUT    DX,AL
  57.  
  58.     ; Fill with background
  59.  
  60.     MOV    DI,AND_SAVE        ;Pointer to save area (AND and XOR)
  61.     MOV    CX,CUR_HEIGHT        ;Number of scanlines to do
  62. Back_Loop1:
  63.     STOSW                ;16 bits for AND mask
  64.     STOSW                ;16 bits for XOR mask
  65.     ADD    DI,HBYTES-4        ;Point to next scanline
  66.     LOOP    Back_Loop1
  67.  
  68.     ; Change foreground bits for the AND mask save area
  69.  
  70.     MOV    AX,FG_Color        ;Load SET/RESET with foreground color
  71.     OUT    DX,AL
  72.     DEC    DX            ;Select BIT MASK register
  73.     MOV    AL,8
  74.     OUT    DX,AL
  75.     INC    DX
  76.     MOV    CX,CUR_HEIGHT        ;Initialize counter
  77.     MOV    DI,AND_Save        ;Get pointer to AND save area
  78.     MOV    SI,AND_Mask        ;Get pointer to AND mask
  79.  
  80. Fore_Loop1:
  81.     LODSB                ;Fetch next byte from the mask
  82.     OUT    DX,AL            ;Set BIT MASK REGISTER using cursor mas
  83.     MOV    AH,ES:[DI]        ;Latch data
  84.     STOSB                ;Write next 8 bits
  85.     LODSB                ;Fetch next byte from the mask
  86.     OUT    DX,AL            ;Set BIT MASK REGISTER using cursor mas
  87.     MOV    AH,ES:[DI]        ;Latch data
  88.     STOSB                ;Write next 8 bits
  89.     ADD    DI,HBYTES-2
  90.     LOOP    Fore_Loop1
  91.  
  92.     ; Change foreground bits for the XOR mask save area
  93.  
  94.     MOV    CX,CUR_HEIGHT        ;Initialize counter
  95.     MOV    DI,XOR_Save        ;Get pointer to XOR save area
  96.     MOV    SI,XOR_Mask        ;Get pointer to XOR mask
  97.  
  98. Fore_Loop2:
  99.     LODSB                ;Fetch next byte from the mask
  100.     OUT    DX,AL            ;Set BIT MASK REGISTER using cursor mas
  101.     MOV    AH,ES:[DI]        ;Latch data
  102.     STOSB                ;Write next 8 bits
  103.     LODSB                ;Fetch next byte from the mask
  104.     OUT    DX,AL            ;Set BIT MASK REGISTER using cursor mas
  105.     MOV    AH,ES:[DI]        ;Latch data
  106.     STOSB                ;Write next 8 bits
  107.     ADD    DI,HBYTES-2
  108.     LOOP    Fore_Loop2
  109.  
  110.     ;Setup EGA registers for data copy (WRITE LATCH write mode)
  111.  
  112.     MOV    DX,3CEH         ;Restore graphics controller
  113.     MOV    AL,1            ;Disable use of SET/RESET
  114.     OUT    DX,AL
  115.     INC    DX
  116.     XOR    AL,AL
  117.     OUT    DX,AL
  118.     DEC    DX
  119.     MOV    AL,8            ;Enable all 8 bits for write
  120.     OUT    DX,AL
  121.     INC    DX
  122.     MOV    AL,0FFH
  123.     OUT    DX,AL
  124.     DEC    DX
  125.     MOV    AL,5            ;Select WRITE LATCH write mode
  126.     OUT    DX,AL
  127.     INC    DX
  128.     MOV    AL,1
  129.     OUT    DX,AL
  130.  
  131.     ;Copy upper left corner into save area (this is needed for first
  132.     ;call to Move_Cursor procedure, because it always restores and
  133.     ;we need meaningfull data for the first restore).
  134.  
  135.     MOV    SI,0            ;Copy from upper left
  136.     MOV    CS:Last_Cursor,SI    ;Keep where it came from
  137.     MOV    DI,CUR_SAVE        ;Copy to cursor save area
  138.     MOV    AX,ES            ;Point DS to display buffer
  139.     MOV    DS,AX
  140.     MOV    CX,CUR_HEIGHT        ;Number of lines to copy
  141. Set_Copy_Loop:
  142.     MOVSB                ;Copy 24 bits from next raster
  143.     MOVSB
  144.     MOVSB
  145.     ADD    DI,HBYTES-3        ;Update pointers to next raster
  146.     ADD    SI,HBYTES-3
  147.     LOOP    Set_Copy_Loop
  148.  
  149.     ;Restore normal write mode
  150.  
  151.     XOR    AL,AL            ;WRITE MODE register is still selected
  152.     OUT    DX,AL            ;so load it with value 0
  153.  
  154.     ;Clean up and return
  155.  
  156.     POP    DS            ;Restore segment registers
  157.     POP    ES
  158.     POP    DI
  159.     POP    SI
  160.     MOV    SP,BP
  161.     POP    BP
  162.     RET    8
  163. Set_Cursor    ENDP
  164.  
  165. ;************************************************************************
  166. ; Remove_Cursor:                            *
  167. ; This procedure is used to remove the cursor from the screen        *
  168. ; and to restore the screen to its original appearance            *
  169. ;************************************************************************
  170.  
  171.     PUBLIC    Remove_Cursor
  172.  
  173. Remove_Cursor    PROC FAR
  174.     PUSH    BP
  175.     MOV    BP,SP
  176.     PUSH    SI
  177.     PUSH    DI
  178.     PUSH    ES            ; always save seg regs
  179.     PUSH    DS
  180.  
  181.     ;Setup EGA registers for data copy (WRITE LATCH write mode)
  182.  
  183.     MOV    DX,3CEH         ;Address of GRAPICS controller
  184.     MOV    AL,5            ;Select WRITE LATCH write mode
  185.     OUT    DX,AL
  186.     INC    DX
  187.     MOV    AL,1
  188.     OUT    DX,AL
  189.  
  190.     ;Copy save area back to last location of the cursor
  191.  
  192.     MOV    AX,0A000H        ;Set up segment pointers
  193.     MOV    ES,AX
  194.     MOV    DS,AX
  195.     MOV    DI,CS:Last_Cursor    ;Copy to last X,Y of cursor
  196.     MOV    SI,CUR_SAVE        ;Copy form cursor save area
  197.     MOV    CX,CUR_HEIGHT        ;Number of lines to copy
  198. Rest_Copy_Loop:
  199.     MOVSB                ;Copy 16 bits from next raster
  200.     MOVSB
  201.     MOVSB
  202.     ADD    DI,HBYTES-3        ;Update pointers to next raster
  203.     ADD    SI,HBYTES-3
  204.     LOOP    Rest_Copy_Loop
  205.  
  206.     ;Restore normal write mode
  207.  
  208.     MOV    AL,0            ;WRITE MODE register is still selected
  209.     OUT    DX,AL            ;so load it with value 0
  210.  
  211.     ;Clean up and return
  212.  
  213.     POP    DS            ;Restore segment registers
  214.     POP    ES
  215.     POP    DI
  216.     POP    SI
  217.     MOV    SP,BP
  218.     POP    BP
  219.     RET
  220. Remove_Cursor    ENDP
  221.  
  222. ;************************************************************************
  223. ; Move_Cursor:                                *
  224. ; This procedure is used to move the cursor from one            *
  225. ; location to another.                            *
  226. ; Entry:    Curs_X - Position of the new cursor            *
  227. ;        Curs_Y                            *
  228. ;************************************************************************
  229.  
  230. FUNC_AND    EQU    1
  231. FUNC_XOR    EQU    3
  232.  
  233. Curs_X        EQU    [BP+8]
  234. Curs_Y        EQU    [BP+6]
  235.  
  236.     PUBLIC    Move_Cursor
  237.  
  238. Move_Cursor    PROC    FAR
  239.     PUSH    BP
  240.     MOV    BP,SP
  241.     PUSH    SI
  242.     PUSH    DI
  243.     PUSH    ES            ; always save seg regs
  244.     PUSH    DS
  245.  
  246.     CALL    Remove_Cursor        ;Restore last location
  247.  
  248.     ;Setup EGA registers for data copy (WRITE LATCH write mode)
  249.  
  250.     MOV    DX,3CEH         ;Address of GRAPICS controller
  251.     MOV    AL,5            ;Select WRITE LATCH write mode
  252.     OUT    DX,AL
  253.     INC    DX
  254.     MOV    AL,1
  255.     OUT    DX,AL
  256.  
  257.     ;Copy next location of the cursor to the save area
  258.  
  259.     MOV    AX,Curs_Y        ;Convert cursor X,Y to offset
  260.     MOV    BX,HBYTES
  261.     MUL    BX
  262.     MOV    SI,Curs_X
  263.     SHR    SI,1
  264.     SHR    SI,1
  265.     SHR    SI,1
  266.     ADD    SI,AX
  267.     MOV    CS:Last_Cursor,SI    ;Keep location so we can restore later
  268.     MOV    AX,GRFSEG        ;Point ES and DS to display buffer
  269.     MOV    DS,AX
  270.     MOV    ES,AX
  271.     MOV    DI,CUR_SAVE        ;Pointer to save area
  272.     MOV    CX,CUR_HEIGHT        ;Number of lines to copy
  273. Move_Copy_Loop:
  274.     MOVSB                ;Copy 16 bits from next raster
  275.     MOVSB
  276.     MOVSB
  277.     ADD    DI,HBYTES-3        ;Update pointers to next raster
  278.     ADD    SI,HBYTES-3
  279.     LOOP    Move_Copy_Loop
  280.  
  281.     ;Restore normal write mode
  282.  
  283.     MOV    DX,3CFH
  284.     MOV    AL,0            ;WRITE MODE register is still selected
  285.     OUT    DX,AL            ;so load it with value 0
  286.  
  287.     ;Use BITBLT procedure to copy AND and XOR masks of the cursor
  288.  
  289.     MOV    AX,0
  290.     PUSH    AX
  291.     MOV    AX,YSIZE        ;Push x and y of source
  292.     PUSH    AX
  293.     PUSH    WORD PTR Curs_X
  294.     PUSH    WORD PTR Curs_Y     ;Push x and y of destination
  295.     MOV    AX,CUR_HEIGHT        ;Push width and height
  296.     PUSH    AX
  297.     PUSH    AX
  298.     MOV    AX,FUNC_AND        ;Push function on the stack
  299.     PUSH    AX
  300.     CALL    BitBlt
  301.  
  302.     MOV    AX,16
  303.     PUSH    AX
  304.     MOV    AX,YSIZE        ;Push x and y of source
  305.     PUSH    AX
  306.     PUSH    WORD PTR Curs_X
  307.     PUSH    WORD PTR Curs_Y     ;Push x and y of destination
  308.     MOV    AX,CUR_HEIGHT        ;Push width and height
  309.     PUSH    AX
  310.     PUSH    AX
  311.     MOV    AX,FUNC_XOR        ;Push function on the stack
  312.     PUSH    AX
  313.     CALL    BitBlt
  314.  
  315.     ;Clean up and return
  316.  
  317.     POP    DS            ;Restore segment registers
  318.     POP    ES
  319.     POP    DI
  320.     POP    SI
  321.     MOV    SP,BP
  322.     POP    BP
  323.     RET    4
  324. Move_Cursor    ENDP
  325.  
  326.