home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / mouse / pointer / pointer.asm next >
Assembly Source File  |  1991-08-19  |  38KB  |  871 lines

  1. .model small
  2. .stack 200h
  3. .data
  4. NO_MSG          DB      0Ah,0Dh,'Staben Technologies "DOS_MOUSE" v0.95 ',0Ah,0Dh
  5.                 DB      '================================',0Ah,0Dh
  6.                 DB      'You must have a MICROSOFT mouse ',0Ah,0Dh
  7.                 DB      'driver installed in your machine',0Ah,0Dh
  8.                 DB      'to use this program.           $'
  9.         
  10. BAD_ENV         DB      0Ah,0Dh,'Staben Technologies "DOS_MOUSE" v0.95 ',0Ah,0Dh
  11.                 DB      '================================',0Ah,0Dh
  12.                 DB      'You must have a "BMOUSE" string ',0Ah,0Dh
  13.                 DB      'in your environment.  To correct',0Ah,0Dh
  14.                 DB      'this situation, type:           ',0Ah,0Dh
  15.                 DB      'SET BMOUSE=00000                ',0Ah,0Dh,'$'          
  16.                 
  17. BAD_DOS         DB      0Ah,0Dh,'Staben Technologies "DOS_MOUSE" v0.95 ',0Ah,0Dh
  18.                 DB      '================================',0Ah,0Dh
  19.                 DB      'Incorrect DOS version.  DOS 3.0 ',0Ah,0Dh
  20.                 DB      'or better required.             ',0Ah,0Dh,'$'
  21.                 
  22. .code
  23. INIT_MOUSE:
  24.                 xor     ax, ax
  25.                 int     33h
  26.                 ;==================================:
  27.                 ; return values are:               :
  28.                 ; AX = FFFF if mouse installed     :
  29.                 ; AX =  0 if no mouse              :
  30.                 ; BX =  # of buttions              :
  31.                 ;==================================:
  32.                 cmp     ax, 0FFFFh
  33.                 je      mouse_avail
  34.                 jmp     no_mouse
  35. MOUSE_AVAIL:            
  36.                 ;===============================:
  37.                 ; first, test for MS-DOS or 4DOS:
  38.                 ;===============================:
  39.                 mov     ax, 0D44Dh              ; 4DOS swap area
  40.                 mov     bx, 0
  41.                 int     2Fh                     ; and interrupt it
  42.                 ;===============================:
  43.                 ;IF ax = 44DD, 4DOS is used.    :
  44.                 ;===============================:
  45.                 cmp     ax, 44DDh               ; compare the deal
  46.                 je      IS_4DOS                 ; and if equal, its 4DOS
  47.                 mov     ax, 352Eh               ; find the master env
  48.                 int     21h
  49.                 mov     es, [es:2Ch]            ; es = environment segment
  50.                 jmp     short   dos_checked     ; jump past 4dos stuff
  51.         is_4dos:
  52.                 mov     es, cx                  ; es = 4dos environment segment
  53.                 mov     es, [es:2Ch]
  54.         dos_checked:            
  55.                 mov     [cs:envseg1], es
  56.                 xor     di, di                  ; point to start of env in es:di
  57.                 cld                             ; scan in forward
  58. FIND_STRING:                                    ; - loop thru 1 by 1
  59.                 test    [byte ptr es:[di]], -1  ; end of env?
  60.                 jnz     check_string            ; nope... continue
  61.                 jmp     short   no_environment  ; error...
  62. CHECK_STRING:           
  63.                 push    cs
  64.                 pop     ds
  65.                 mov     si, offset ENVSTR       ; point to BMOUSE
  66.                 mov     bx, di                  ; save ptr to start
  67.                 mov     cx, envlen              ; length of envstr
  68.                 repe    cmpsb                   ; compare
  69.                 je      ALL_PASSED              ; found it!
  70.                 mov     di, bx                  ; restore ptr to start
  71.                 xor     al, al                  ; scan for end of string
  72.                 mov     cx, -1                  ; FFFF <- cx
  73.                 repne   scasb
  74.                 jmp     short   find_string     ; go back for next string
  75.                 
  76. ALL_PASSED:
  77.                 mov     [cs:envoff1], di
  78. CHECK_DOS:
  79.                 mov     ah, 30h
  80.                 int     21h
  81.                 cmp     al, 03h
  82.                 jnz     wrongversion
  83.                 dec     bx
  84.                 cmp     ah, 1eh
  85.                 jnz     v3xx
  86.                 mov     ax, 5d06h
  87.                 int     21h
  88.         v3xx:
  89.                 clc
  90.                 jmp     BEGIN
  91.         wrongversion:
  92.                 stc
  93.                 jmp     BADDOS          
  94.                 
  95. NO_ENVIRONMENT:
  96.                 ;===========================:
  97.                 ; This procedure is called  :
  98.                 ; if the environment string :
  99.                 ; does not exist.           :
  100.                 ;===========================:
  101.                 mov     ax, @data
  102.                 mov     ds, ax
  103.                 mov     dx, offset BAD_ENV      ; point to bad env.
  104.                 jmp     show_message
  105. NO_MOUSE:
  106.                 ;===========================:
  107.                 ; This procedure is called  :
  108.                 ; if there is NO MOUSE      :
  109.                 ; installed.                :
  110.                 ;===========================:
  111.                 mov     ax, @data
  112.                 mov     ds, ax
  113.                 mov     dx, offset NO_MSG       ; point to NO MOUSE MSG.
  114.                 jmp     show_message
  115.                 
  116. BADDOS:
  117.                 ;===========================:
  118.                 ; This procedure is called  :
  119.                 ; if the DOS version is bad :
  120.                 ;===========================:
  121.                 mov     ax, @data
  122.                 mov     ds, ax
  123.                 mov     dx, offset BAD_DOS
  124.  
  125. SHOW_MESSAGE:
  126.                 mov     ah, 09h
  127.                 int     21h
  128.                 
  129. EXIT_OUT:
  130.                 jmp     bye_bye
  131. BEGIN:
  132.                 mov     [cs:videooffs], 08888h
  133.                 
  134.                 mov     [cs:vid_shift], 3
  135.                 mov     [cs:vid_count], 16
  136.                 mov     [cs:vid_cursr], offset curs_bmp         
  137.                 jmp     GET_CHARS
  138. GET_POSITION:           
  139.                 mov     ax, 000Bh               ; get mickeys since last call
  140.                                                 ; into CX, DX   
  141.                 int     33h
  142.                 
  143. ;
  144. ; If CX or DX is greater than 08888h, then the value in CX/DX happens to be 
  145. ; FFFF-CX/DX = # of mickeys moved LEFT/UP.  
  146.         @check_newx:
  147.                 cmp     CX, 08888h              ; see if its a LEFT for CX
  148.                 ja      @cx_left
  149.                 cmp     CX, 00000h              ; see if never moved
  150.                 je      @check_newy
  151.                 add     [cs:actual_x], cx               ; just add it if positive
  152.                 jmp     short   @check_newy
  153.         @cx_left:
  154.                 mov     ax, 0FFFFh              ; load high
  155.                 xor     ax, cx                  ; get change in positive
  156.                 sub     [cs:actual_x], ax               ; and subtract change
  157.         @check_newy:    
  158.                 cmp     DX, 08888h              ; see if its an up for DX
  159.                 ja      @dx_up  
  160.                 cmp     dx, 00000h              ; see if never moved
  161.                 je      check_range
  162.                 add     [cs:actual_y], dx       ; just add if positive
  163.                 jmp     short   CHECK_RANGE
  164.         @dx_up:
  165.                 mov     ax, 0FFFFh              ; load high
  166.                 xor     ax, dx                  ; get change in positive
  167.                 sub     [cs:actual_y], ax       ; and subtract change
  168.  
  169. CHECK_RANGE:
  170.         @compare_xsmall:
  171.                 mov     ax, [cs:min_actual_x]
  172.                 cmp     [cs:actual_x], ax
  173.                 jb      @xtoolow
  174.                 cmp     [cs:actual_x], 08888h
  175.                 ja      @xtoolow
  176.         @compare_ysmall:
  177.                 mov     ax, [cs:min_actual_y]
  178.                 cmp     [cs:actual_y], ax
  179.                 jb      @ytoolow
  180.                 cmp     [cs:actual_y], 08888h
  181.                 ja      @ytoolow
  182.         @compare_xbig:
  183.                 mov     ax, [cs:max_actual_x]
  184.                 cmp     [cs:actual_x], ax
  185.                 ja      @xtoohigh
  186.         @compare_ybig:
  187.                 mov     ax, [cs:max_actual_y]
  188.                 cmp     [cs:actual_y], ax
  189.                 ja      @ytoohigh
  190.                 jmp     CONVERT_TO_BLOCK
  191.         @xtoolow:
  192.                 mov     [cs:actual_x], ax
  193.                 jmp     @compare_ysmall
  194.         @ytoolow:
  195.                 mov     [cs:actual_y], ax
  196.                 jmp     @compare_xbig
  197.         @xtoohigh:
  198.                 mov     [cs:actual_x], ax
  199.                 jmp     @compare_ybig
  200.         @ytoohigh:
  201.                 mov     [cs:actual_y], ax
  202.  
  203. CONVERT_TO_BLOCK:
  204.                 ;===============================:
  205.                 ; The actual values need to be  :
  206.                 ; converted to block values     :
  207.                 ; based on # of pixels per char :
  208.                 ; and then these values are used:
  209.                 ; to determine BMOUSE=xxxxx     :
  210.                 ;===============================:
  211.                 mov     dx, [cs:actual_y]
  212.                 mov     cl, [cs:vid_shift]
  213.                 shr     dx, cl
  214.                 mov     cl, 3
  215.                 mov     ax, [cs:actual_x]
  216.                 shr     ax, cl
  217.                 
  218.                 ;=============================:
  219.                 ; ax = actual_x/8             :
  220.                 ; dx = actual_y/8/16          :
  221.                 ;=============================:
  222.                 mov     [cs:vx_position], ax
  223.                 mov     [cs:vy_position], dx
  224.  
  225.                 mov     ax, 3                   ; call get mouse position
  226.                 int     33h                     ; and do the interrupt
  227.                 mov     [cs:vb_position], bx    ; and save button status
  228.  
  229. MODIFY_ENV:
  230.                 ; [slave] = cycle 1 or 2
  231.                 ;==================================================:
  232.                 ; A button was apparently pushed.  We need to      :
  233.                 ; fix a SETting to the environment to reflect the  :
  234.                 ; current positions of the mouse, etc.             :
  235.                 ; BMOUSE=xxyyb                                     :
  236.                 ;==================================================:
  237.                 mov     [cs:slave], 65          ; cycle 1
  238.         @mod_loop:
  239.                 cmp     [cs:slave], 66
  240.                 je      @SECOND_CYCLE
  241.                 mov     ah, 62h                 ; get PSP
  242.                 int     21h             
  243.                 mov     es, bx                  ; and es=bx
  244.                 mov     es, es:[2Ch]            ; get env segment
  245.                 mov     [cs:envseg2], es
  246.                 jmp     @SECOND_PAST
  247.         @second_cycle:  
  248.                 mov     ax, 0D44Dh
  249.                 mov     bx, 0
  250.                 int     2Fh
  251.                 cmp     ax, 44DDh
  252.                 je      @IS_4DOS
  253.                 mov     ax, 352Eh
  254.                 int     21h
  255.                 mov     es, [es:2Ch]
  256.                 jmp     short   @dos_checked
  257.         @is_4dos:
  258.                 mov     es, cx
  259.                 mov     es, [es:2Ch]
  260.         @dos_checked:
  261.                 mov     [cs:envseg1], es
  262.         @second_past:
  263.                 xor     di, di                  ; point to start of env in es:di
  264.                 cld                             ; scan in forward
  265.         @find_string:                           ; - loop thru 1 by 1
  266.                 test    [byte ptr es:[di]], -1  ; end of env?
  267.                 jnz     @scan_string            ; nope... continue
  268.                 jmp     bye_bye                 ; error... so quit
  269.         @scan_string:           
  270.                 push    cs
  271.                 pop     ds
  272.                 mov     si, offset ENVSTR       ; point to BMOUSE
  273.                 mov     bx, di                  ; save ptr to start
  274.                 mov     cx, envlen              ; length of envstr
  275.                 repe    cmpsb                   ; compare
  276.                 je      @found_string           ; found it!
  277.                 mov     di, bx                  ; restore ptr to start
  278.                 xor     al, al                  ; scan for end of string
  279.                 mov     cx, -1                  ; FFFF <- cx
  280.                 repne   scasb
  281.                 jmp     short   @find_string    ; go back for next string
  282.         @found_string:
  283.                 cmp     [cs:slave], 66
  284.                 je      @SECOND_STORE
  285.                 mov     [cs:envoff2], di                
  286.                 mov     [cs:slave], 66
  287.                 jmp     @MOD_LOOP
  288.         @second_store:
  289.                 mov     [cs:envoff1], di                
  290.                 
  291.                 ;================================:
  292.                 ; Notes of interest.  We've got  :
  293.                 ; a possible two digits, or just :
  294.                 ; one.                           :
  295.                 ;================================:
  296.                 mov     es, [cs:envseg1]                ; prepare the env. segment
  297.                 mov     di, [cs:envoff1]                ; prepare the offset to env.
  298.                 mov     ds, [cs:envseg2]
  299.                 mov     si, [cs:envoff2]
  300.                 
  301.                 ;===============================:
  302.                 ; When making DECIMAL from BIN  :
  303.                 ; need to simply divide by 10   :
  304.                 ; and convert the al, ah to the :
  305.                 ; correct memory locations.     :
  306.                 ;===============================:
  307. WRITE_BMOUSE:
  308.                 mov     ax, [cs:vy_position]    ; ready the row coord
  309.                 mov     dl, 10                  ; to divide by 10
  310.                 
  311.                 div     dl                      ; get first digit >> AL = first
  312.                                                 ; AH = remainder
  313.                 add     al, 30h                 ; and convert to ASCII
  314.                 add     ah, 30h
  315.                 mov     [byte ptr es:[di]], al
  316.                 mov     [byte ptr ds:[si]], al
  317.                 inc     di
  318.                 inc     si
  319.                 mov     [byte ptr es:[di]], ah  
  320.                 mov     [byte ptr ds:[si]], ah
  321.                 inc     di
  322.                 inc     si
  323.                 
  324.                 mov     ax, [cs:vx_position]    ; ready the column coord
  325.                 mov     dl, 10                  ; to divide by 10
  326.         
  327.                 div     dl                      ; get first digit >> AL - first
  328.                                                 ; ah = remainder
  329.                 add     al, 30h                 ; and convert to ASCII
  330.                 add     ah, 30h
  331.                 mov     [byte ptr es:[di]], al
  332.                 mov     [byte ptr ds:[si]], al
  333.                 inc     di
  334.                 inc     si
  335.                 mov     [byte ptr es:[di]], ah
  336.                 mov     [byte ptr ds:[si]], ah
  337.                 inc     di
  338.                 inc     si
  339.                 
  340.                 mov     ax, [cs:vb_position]    ; and then the button...
  341.                 mov     dl, 1                   ; to divide by 1
  342.                 
  343.                 div     dl                      ; get first digit >> al - first
  344.                                                 ; ah = remainder
  345.                 add     al, 30h                 ; and convert to ASCII
  346.                 mov     [byte ptr es:[di]], al
  347.                 mov     [byte ptr ds:[si]], al
  348.                         
  349.  
  350.  
  351. PLACE_CURSOR:
  352.  
  353.                 ; The actual character pointed to by the "hotspot" is the
  354.                 ; character pointed to by BMOUSE.  The cursor MUST be on the
  355.                 ; character.  So, save the position, the one below, the one
  356.                 ; over, and one down and over.  
  357.                 
  358.                 ;======================:
  359.                 ; get hot character    :
  360.                 ;======================:
  361.                 
  362.                 mov     ax, [cs:vy_position]    ; get Y-position
  363.                 mov     dl, 5                   ; multiply by 5
  364.                 mul     dl                      ; and then shift for *32
  365.                 mov     cl, 5                   ; to get ax * 160
  366.                 shl     ax, cl                  ; ax = the row
  367.                 mov     bx, [cs:vx_position]    ; get X-position
  368.                 mov     cl, 1                   ; multiply by 2 (miss attrib)
  369.                 shl     bx, cl                  ; to get column.
  370.                 add     ax, bx
  371.                 mov     [cs:videooffs], ax      ; save the offset to block of 4
  372.  
  373.                 ;==========================:
  374.                 ; restore screen so that   :
  375.                 ; the cursor isn't being   :
  376.                 ; read in! on > 1st time   :
  377.                 ;==========================:
  378.                 mov     ax, [cs:vb_position]
  379.                 cmp     ax, 0
  380.                 jne     REST_SCREEN
  381.                 mov     ax, [cs:videooffs]
  382.                 cmp     ax, [cs:ovideooffs]
  383.                 je      OFFSET_CALC
  384.  
  385. REST_SCREEN:            
  386.                 mov     ds, [cs:videopage]
  387.                 mov     di, [cs:ovideooffs]             
  388.                 mov     ah, [cs:char_1]         ; and re-write it out
  389.                 mov     byte ptr [ds:di], ah
  390.                 ;=====================:
  391.                 ; put char over one   :
  392.                 ;=====================: 
  393.                 inc     di                      ; set pointer to next one
  394.                 inc     di                      ; but skip attribute byte
  395.                 mov     ah, [cs:char_2]
  396.                 mov     byte ptr [ds:di], ah
  397.                 
  398.                 ;=====================:
  399.                 ; put char down one   :
  400.                 ; and over.           :
  401.                 ;=====================:
  402.                 mov     ax, di                  ; add 160 for next row
  403.                 add     ax, 160
  404.                 mov     di, ax
  405.                 mov     ah, [cs:char_4]
  406.                 mov     byte ptr [ds:di], ah
  407.                 
  408.                 ;=====================  
  409.                 ; put char down      :
  410.                 ;====================:
  411.                 dec     di                      ; character under hot
  412.                 dec     di                      ; and skip attribute byte
  413.                 mov     ah, [cs:char_3]
  414.                 mov     byte ptr [ds:di], ah                            
  415.                 ;=============================:
  416.                 ; if a button is pressed,     :
  417.                 ; exit out                    :
  418.                 ;=============================:
  419.                 cmp     [cs:vb_position], 0
  420.                 je      GET_CHARS
  421.                 jmp     bye_bye         
  422.                 
  423. GET_CHARS:              
  424.                 mov     di, [cs:videooffs]
  425.                 mov     ah, byte ptr [ds:di]    ; and save the character there          
  426.                 mov     [cs:char_1], ah
  427.                 ;=====================:
  428.                 ; get char over one   :
  429.                 ;=====================: 
  430.                 inc     di                      ; set pointer to next one
  431.                 inc     di                      ; but skip attribute byte
  432.                 mov     ah, byte ptr [ds:di]
  433.                 mov     [cs:char_2], ah
  434.                 
  435.                 ;=====================:
  436.                 ; get char down one   :
  437.                 ; and over.           :
  438.                 ;=====================:
  439.                 mov     ax, di                  ; add 160 for next row
  440.                 add     ax, 160
  441.                 mov     di, ax
  442.                 mov     ah, byte ptr [ds:di]
  443.                 mov     [cs:char_4], ah
  444.                 
  445.                 ;=====================  
  446.                 ; get char down      :
  447.                 ;====================:
  448.                 dec     di                      ; character under hot
  449.                 dec     di                      ; and skip attribute byte
  450.                 mov     ah, byte ptr [ds:di]
  451.                 mov     [cs:char_3], ah
  452.                 
  453.                 ;==========================================:
  454.                 ; now the characters at these locations    :
  455.                 ; have been saved.  Find the offset to     :
  456.                 ; these characters where the cursor is to  :
  457.                 ; be.                                      :
  458.                 ;==========================================:
  459. OFFSET_CALC:            
  460.                 mov     dx, [cs:vx_position]
  461.                                 
  462.                 mov     cl, 3                   
  463.                 shl     dx, cl                  ; get rounded column
  464.                 mov     bx, [cs:vy_position]
  465.                 mov     cl, [cs:vid_shift]
  466.                 shl     bx, cl                  ; get rounded row
  467.                 
  468.                 ;========================================:
  469.                 ; Now, the rounded row/column XOR'd with :
  470.                 ; the non-rounded should give the offset :
  471.                 ; for the cursor.                        :
  472.                 ;========================================:
  473.                 
  474.                 xor     bx, [cs:actual_y]               ; get vertical offset
  475.                 xor     dx, [cs:actual_x]               ; get horizontal offset
  476.                 mov     ax, bx
  477.                 mov     cl, 1
  478.                 shl     ax, cl
  479.                 cmp     ax, 0
  480.                 je      save_offs
  481.                 dec     ax
  482.         save_offs:
  483.                 mov     [cs:horizont_offs], dl
  484.                 mov     [cs:vertical_offs], al
  485.                 
  486.                 ;=======================================:
  487.                 ; Get the bitmaps of the characters in  :
  488.                 ; char_1,2,3 & 4.  These are to be OR'd :
  489.                 ; with the cursor bitmaps.              :
  490.                 ;=======================================:
  491. SET_MAP:                
  492.                 ;=====================:
  493.                 ; Set char map 2 to   :
  494.                 ; readable form       :
  495.                 ;=====================:
  496.                 mov     dx, 3C4h
  497.                 mov     ax, 0402h
  498.                 out     dx, ax
  499.                 mov     ax, 0704h
  500.                 out     dx, ax
  501.                 mov     dl, 0CEh
  502.                 mov     ax, 0204h
  503.                 out     dx, ax
  504.                 mov     ax, 0005h
  505.                 out     dx, ax
  506.                 mov     ax, 0006h
  507.                 out     dx, ax  
  508.                 
  509.                 ;============================:
  510.                 ; In this section, each loop :
  511.                 ; will read, modify, and     :
  512.                 ; write modified char sets   :
  513.                 ;============================:  
  514. READ_WRITE_MAPS:
  515.         RP01:
  516.                 mov     ds, [cs:videochar]              ; get videochar offset
  517.                 xor     ax, ax
  518.                 mov     di, 219*32                      ; new location pointer
  519.                 mov     es, [cs:videochar]
  520.                 cld
  521.  
  522.                 mov     al, [cs:char_1]         ; char_1's position
  523.                 mov     cl, 5                   ; shift it 5 to get *32
  524.                 shl     ax, cl                  
  525.                 mov     si, ax                  ; and put it in si
  526.                 mov     cx, [cs:vid_count]      ; do it 16 times
  527.                 xor     dx, dx
  528.                 push    di
  529.                 mov     di, [cs:vid_cursr]
  530.         RL01:   
  531.                 lodsb                           ; load byte at DS:SI -> al
  532.                 ;============:
  533.                 ; Vertical   :
  534.                 ;============:
  535.                 cmp     dl, [cs:vertical_offs]
  536.                 jb      copyPL01
  537.                 ;============:
  538.                 ; Horizontal :
  539.                 ;============:
  540.                 mov     bh, byte ptr [cs:di]    ; load cursor bitmap at line si
  541.                 inc     di
  542.                 push    cx
  543.                 mov     cl, [cs:horizont_offs]  ; and cl the shift amount
  544.                 shr     bx, cl                  ; and move it over
  545.                 pop     cx
  546.                 xor     al, bh
  547.                 
  548.         COPYPL01:
  549.                 mov     bx, di
  550.                 pop     di
  551.                 mov     byte ptr [es:di], al    ; and save it on table
  552.                 inc     di
  553.                 push    di
  554.                 mov     di, bx
  555.                 inc     dx
  556.                 loop    RL01
  557.  
  558.                 pop     di
  559.                 
  560.         RP02:   
  561.                 xor     ax, ax
  562.                 mov     di, 220*32
  563.                 cld
  564.                 
  565.                 mov     al, [cs:char_2]         ; char_2's position
  566.                 mov     cl, 5                   ; shift it 5 to get *32
  567.                 shl     ax, cl                  
  568.                 mov     si, ax                  ; and put it in si
  569.                 mov     cx, [cs:vid_count]
  570.                 xor     dx, dx
  571.                 push    di
  572.                 mov     di, [cs:vid_cursr]
  573.         RL02:   
  574.                 lodsb                           ; load byte at DS:SI -> al
  575.                 xor     bx, bx
  576.                 ;==========:
  577.                 ; vertical :
  578.                 ;==========:
  579.                 cmp     dl, [cs:vertical_offs]
  580.                 jb      copyPL02
  581.                 ;============:
  582.                 ; Horizontal :
  583.                 ;============:
  584.                 mov     bh, byte ptr [cs:di]    ; load cursor bitmap
  585.                 inc     di
  586.                 push    cx
  587.                 mov     cl, [cs:horizont_offs]
  588.                 mov     ch, 8
  589.                 sub     ch, cl
  590.                 mov     cl, ch
  591.                 shl     bx, cl
  592.                 pop     cx
  593.                 xor     al, bh
  594.         copyPL02:
  595.                 mov     bx, di
  596.                 pop     di
  597.                 mov     byte ptr [es:di], al
  598.                 inc     di
  599.                 push    di
  600.                 mov     di, bx
  601.                 inc     dx
  602.                 loop    RL02
  603.                 
  604.                 pop     di
  605.  
  606.         RP03:   
  607.                 xor     ax, ax
  608.                 mov     di, 221*32
  609.                 cld
  610.                 
  611.                 mov     al, [cs:char_3]         ; char_2's position
  612.                 mov     cl, 5                   ; shift it 5 to get *32
  613.                 shl     ax, cl                  
  614.                 mov     si, ax                  ; and put it in si
  615.  
  616.                 xor     dx, dx
  617.                 push    di
  618.                 mov     di, [cs:vid_cursr]
  619.                 inc     di
  620.                 mov     cx, [cs:vid_count]
  621.                 mov     ch, [cs:vertical_offs]
  622.                 sub     cl, ch
  623.                 mov     ch, 0
  624.                 add     di, cx
  625.                 mov     [cs:vslave1], cl
  626.                 mov     cx, [cs:vid_count]
  627.                 xor     dx, dx
  628.                                 
  629.         RL03:   
  630.                 lodsb                           ; load byte at DS:SI -> al
  631.                 xor     bx, bx
  632.                 ;==========:
  633.                 ; vertical :
  634.                 ;==========:
  635.                 push    cx
  636.                 mov     cx, [cs:vid_count]
  637.                 cmp     [cs:vslave1], cl
  638.                 pop     cx
  639.                 ja      copyPL03
  640.                 ;============:
  641.                 ; Horizontal :
  642.                 ;============:
  643.                 mov     bh, byte ptr [cs:di]    ; load cursor bitmap
  644.                 inc     di
  645.                 inc     [cs:vslave1]
  646.                 push    cx
  647.                 mov     cl, [cs:horizont_offs]
  648.                 shr     bx, cl
  649.                 pop     cx
  650.                 xor     al, bh
  651.         copyPL03:
  652.                 mov     bx, di
  653.                 pop     di
  654.                 mov     byte ptr [es:di], al
  655.                 inc     di
  656.                 push    di
  657.                 mov     di, bx
  658.                 inc     dx
  659.                 loop    RL03
  660.                 
  661.                 pop     di
  662.                 
  663.         RP04:   
  664.                 xor     ax, ax
  665.                 mov     di, 222*32
  666.                 cld
  667.                 
  668.                 mov     al, [cs:char_4]         ; char_2's position
  669.                 mov     cl, 5                   ; shift it 5 to get *32
  670.                 shl     ax, cl                  
  671.                 mov     si, ax                  ; and put it in si
  672.  
  673.                 xor     dx, dx
  674.                 push    di
  675.                 mov     di, [cs:vid_cursr]
  676.                 inc     di
  677.                 mov     cx, [cs:vid_count]
  678.                 mov     ch, [cs:vertical_offs]
  679.                 sub     cl, ch
  680.                 mov     ch, 0
  681.                 add     di, cx
  682.                 mov     [cs:vslave1], cl
  683.                 mov     cx, [cs:vid_count]
  684.                 xor     dx, dx          
  685.         RL04:   
  686.                 lodsb                           ; load byte at DS:SI -> al
  687.                 xor     bx, bx
  688.                 ;==========:
  689.                 ; vertical :
  690.                 ;==========:
  691.                 push    cx
  692.                 mov     cx, [cs:vid_count]
  693.                 cmp     [cs:vslave1], cl
  694.                 pop     cx
  695.                 ja      copyPL04
  696.                 ;============:
  697.                 ; Horizontal :
  698.                 ;============:
  699.                 mov     bh, byte ptr [cs:di]    ; load cursor bitmap
  700.                 inc     di
  701.                 inc     [cs:vslave1]
  702.                 push    cx
  703.                 mov     cl, [cs:horizont_offs]
  704.                 mov     ch, 8
  705.                 sub     ch, cl
  706.                 mov     cl, ch
  707.                 shl     bx, cl
  708.                 pop     cx
  709.                 xor     al, bh
  710.         copyPL04:
  711.                 mov     bx, di
  712.                 pop     di
  713.                 mov     byte ptr [es:di], al
  714.                 inc     di
  715.                 push    di
  716.                 mov     di, bx
  717.                 inc     dx
  718.                 loop    RL04
  719.                 
  720.                 pop     di              
  721.                 
  722.                 ;========================================:
  723.                 ; Now the bitmaps are loaded up in to    :
  724.                 ; the memory.                            :
  725.                 ;========================================:              
  726.                 ;=====================:
  727.                 ; turn on sequencer   :
  728.                 ;=====================:
  729.                 mov     dx, 3C4h
  730.                 mov     ax, 0302h
  731.                 out     dx, ax
  732.                 mov     ax, 0304h
  733.                 out     dx, ax
  734.                 mov     dl, 0CEh
  735.                 mov     ax, 0004h
  736.                 out     dx, ax
  737.                 mov     ax, 1005h
  738.                 out     dx, ax
  739.                 mov     ax, 0E06h
  740.                 out     dx, ax          
  741.                 
  742.                 ;===========================:
  743.                 ; now, check for position   :
  744.                 ; changes, if the position  :
  745.                 ; has changed, the old ones :
  746.                 ; need to be written back   :
  747.                 ; out and then the new ones :
  748.                 ; are then the old ones.    :
  749.                 ;===========================:
  750.                 
  751.                 mov     ax, [cs:videooffs]
  752.                 cmp     ax, [cs:ovideooffs]
  753.                 jne     changed
  754.                 jmp     PUT_SCREEN
  755.         changed:
  756.                 ;======================:
  757.                 ; the new ones are now :
  758.                 ; the old ones.        :
  759.                 ;======================:
  760.                 mov     ah, [cs:char_1]
  761.                 mov     [cs:old_char_1], ah
  762.                 mov     ah, [cs:char_2]
  763.                 mov     [cs:old_char_2], ah
  764.                 mov     ah, [cs:char_3]
  765.                 mov     [cs:old_char_3], ah
  766.                 mov     ah, [cs:char_4]
  767.                 mov     [cs:old_char_4], ah
  768.                 mov     ax, [cs:videooffs]
  769.                 mov     [cs:ovideooffs], ax
  770. PUT_SCREEN:
  771.                 ;=======================================:
  772.                 ; and put those 4 characters at the     :
  773.                 ; cursor's current location             :
  774.                 ;=======================================:
  775.                 mov     ds, [cs:videopage]
  776.                 mov     di, [cs:videooffs]              ; get screen offset
  777.                 mov     byte ptr [ds:di], 219           ; put remap #1
  778.                 inc     di
  779.                 inc     di                              ; go one over
  780.                 cmp     [cs:vx_position], 79
  781.                 je      skip1
  782.                 mov     byte ptr [ds:di], 220           ; put remap #2
  783.         skip1:
  784.                 mov     ax, di
  785.                 add     ax, 160                         ; add 160 for next row
  786.                 mov     di, ax
  787.                 cmp     [cs:vx_position], 79            
  788.                 je      skip2
  789.                 mov     byte ptr [ds:di], 222           ; put remap #3
  790.         skip2:
  791.                 dec     di
  792.                 dec     di                              ; go back one over
  793.                 mov     byte ptr [ds:di], 221           ; put remap #4
  794.  
  795.                 jmp     get_position
  796.                 
  797. bye_bye:
  798.                 mov     ah, 4Ch
  799.                 int     21h             
  800.                 
  801. ;============================================:
  802. ; Variables which are internally used by the :
  803. ; program.                                   :
  804. ;============================================:
  805. EMPTYSPOT       DB      'D'
  806. ENVSTR          DB      'BMOUSE='               ; Env. variable to find
  807. ENVLEN          EQU     7                       ; length of env variable
  808. envseg1         DW      0                       ; PSP environment seg
  809. envseg2         DW      0                       ; PSP environment offset
  810. envoff1         DW      0                       ; MASTER environment seg
  811. envoff2         DW      0                       ; MASTER environment offset
  812. slave           DB      0                       ; Slave spot            
  813.                 
  814. ;===========================================:
  815. ; Video & Pixel Location Information        :
  816. ;===========================================:
  817. videopage       DW      0B800h                  ; Videopage starting location
  818. videochar       DW      0A000h                  ; Videochar map location
  819. videooffs       DW      00000h                  ; Offset to block of 4
  820. actual_x        DW      0                       ; actual x position
  821. actual_y        DW      0                       ; actual y position
  822. old_actual_x    DW      0                       ; old actual x position
  823. old_actual_y    DW      0                       ; old actual y position
  824. min_actual_x    DW      1                       ; minimum actual x position
  825. max_actual_x    DW      638                     ; maximum actual x position
  826. min_actual_y    DW      1                       ; minimum actual y position
  827. max_actual_y    DW      199                     ; maximum actual y position
  828. vx_position     DW      0                       ; current alpha x position
  829. vy_position     DW      0                       ; current alpha y position
  830. vb_position     DW      0                       ; current button position
  831. ovideooffs      DW      0                       ; old position of block of 4
  832. vid_count       DW      0                       ; video count 16 or 8
  833. vid_shift       DB      0                       ; shift count, 3 or 4
  834. vid_cursr       DW      0                       ; cursor offset
  835. char_1          DB      0                       ; character hot'spotted
  836. char_2          DB      0                       ; character over one
  837. char_3          DB      0                       ; character under hot'spotted
  838. char_4          DB      0                       ; character down and over
  839. old_char_1      DB      0                       ; old character hot'spotted
  840. old_char_2      DB      0                       ; old character over one
  841. old_char_3      DB      0                       ; old character under hot'spotted
  842. old_char_4      DB      0                       ; old character down and over
  843. vertical_offs   DB      0                       ; vertical offset
  844. horizont_offs   DB      0                       ; horizontal offset
  845. char_map        DB      64 DUP (255)
  846. vslave1         DB      0
  847. vslave2         DW      0
  848. ; 8x16
  849.  
  850. curs_bmp        DB      00000000b
  851.                 DB      00000000b
  852.                 DB      10000000b
  853.                 DB      11000000b
  854.                 DB      11100000b
  855.                 DB      11110000b
  856.                 DB      11111000b
  857.                 DB      11111100b
  858.                 DB      11111110b
  859.                 DB      11111111b
  860.                 DB      00011100b
  861.                 DB      00001100b
  862.                 DB      00000110b
  863.                 DB      00000011b
  864.                 DB      00000000b
  865.                 DB      00000000b
  866.                 DB      00000000b                               
  867.                 DB      00000000b
  868.                 
  869.                 END             
  870.