; Vesa Mouse 1.0.2 object file
; by Thomas Lack¢, http://togye.host.sk
IDEAL
MODEL LARGE,PASCAL
P386

DATASEG

  HourglassCount=8
  MaxPredefinedDataSize=2*13*15 ; IMPORTANT!

  struc TMouseCursor
    Width  dw ?
    Height dw ?
    HotX   dw ?
    HotY   dw ?
    Icon   dd ?
    Transparent dw ?
  ends
  struc TPtrList
    Count dw ?
    Items dd ?
  ends

  extrn BlackColor,WhiteColor
  extrn MouseX, MouseY, MouseVisible:byte
  extrn Cursor:TMouseCursor
  extrn Background:dword, BgWidth,BgSize
  extrn AniProc:dword, AnimationDelay:byte,AniStat:byte
  extrn GetM:proc, FreeM:proc
  extrn OnMouseMove:TPtrList

  extrn SegA000, GrMode:byte, RVideoPage, WVideoPage
  extrn CanvasWidth, CanvasHeight, LineSize
  extrn SetRVideoPage:proc, IncRVideoPage:proc, DecRVideoPage:proc
  extrn SetWVideoPage:proc, IncWVideoPage:proc, DecWVideoPage:proc

  PredefinedCursor dw offset ArrowData

CODESEG

public ShowMouse,HideMouse,RefreshMouse,SetMouseXY
public ButtonCount,MouseButtons,PushedButton,ReleasedButton
public SetMouseWindow,ClearMouseWindow,SetSensitivity
public SaveDataSeg,GetOldIntVec,SetOldIntVec,Animate
public SetMouseCursor,ArrowCursor,CrossCursor,HourglassCursor
public ModeChangeEvent

proc HandleEvents near ; MouseX,MouseY ®¯ old position, CX,DX ®¯ new position
  xchg ax,cx
  mov  cx,[OnMouseMove.Count]
  jcxz @@exit
  les  di,[OnMouseMove.Items]
@@nexthandler:
  push ax cx dx es di
  push [MouseX] [MouseY] ax dx
  call [dword ptr es:di]
  pop  di es dx cx ax
  add  di,4
  loop @@nexthandler
@@exit:
  xchg cx,ax
  ret
endp

proc InitCoor near ; AX ¯ icon's top, BX ¯ icon's left
  mov  ax,[MouseY]
  sub  ax,[Cursor.HotY]
  mov  bx,[MouseX]
  sub  bx,[Cursor.HotX]
  ret
endp

proc InitBgndCoor near ; DX:AX ¯ bgnd's top left
  call InitCoor
  cmp  [GrMode],16
  je   @@hi
  and  bx,not 3
  jmp  short @@cont
@@hi:
  and  bx,not 1
  shl  bx,1
@@cont:
  mul  [LineSize]
  add  ax,bx
  adc  dx,0
  ret
endp

proc SetBgndRegs near ; BX ¯ width (dwords), CX ¯ height, DX ¯ scrx-width
  mov  bx,[BgWidth]
  mov  dx,[CanvasWidth]
  sub  dx,bx
  cmp  [GrMode],16
  sete cl
  shl  dx,cl
  neg  cl
  add  cl,2
  shr  bx,cl
  mov  cx,[Cursor.Height]
  ret
endp

proc GetBgnd
local DSeg
  call InitBgndCoor
  xchg si,ax
  cmp  [RVideoPage],dx
  je   @@pgok
  call SetRVideoPage
@@pgok:
  call SetBgndRegs
  jcxz @@exit
  mov  [DSeg],ds
  les  di,[Background]
  mov  ds,[SegA000]
@@nextline:
  push cx
  mov  cx,bx
@@nextpixel:
  movsd
  or   si,si
  jnz  @@looppixel
  push ds
  mov  ds,[DSeg]
  call IncRVideoPage
  pop  ds
@@looppixel:
  loop @@nextpixel
  add  si,dx
  jnc  @@loopline
  push ds
  mov  ds,[DSeg]
  call IncRVideoPage
  pop  ds
@@loopline:
  pop  cx
  loop @@nextline
  mov  ds,[DSeg]
@@exit:
  ret
endp

proc PutBgnd
local DSeg
  call InitBgndCoor
  xchg di,ax
  cmp  [WVideoPage],dx
  je   @@pgok
  call SetWVideoPage
@@pgok:
  call SetBgndRegs
  jcxz @@exit
  mov  [DSeg],ds
  mov  es,[SegA000]
  lds  si,[Background]
@@nextline:
  push cx
  mov  cx,bx
@@nextpixel:
  movsd
  or   di,di
  jnz  @@looppixel
  push ds
  mov  ds,[DSeg]
  call IncWVideoPage
  pop  ds
@@looppixel:
  loop @@nextpixel
  add  di,dx
  jnc  @@loopline
  push ds
  mov  ds,[DSeg]
  call IncWVideoPage
  pop  ds
@@loopline:
  pop  cx
  loop @@nextline
  mov  ds,[DSeg]
@@exit:
  ret
endp

proc PutCursor
local DSeg,VisWidth,CanWid,X1,X2,Y1,Y2 ; X1+X2 & Y1+Y2 out of screen
  mov  [DSeg],ds
  xor  dx,dx
  ; counting Y1
  mov  ax,[Cursor.HotY]
  sub  ax,[MouseY]
  js   @@gety2
  mov  [Y1],ax
  mov  [Y2],dx
  jmp  short @@hotysgot
@@gety2:
  mov  [Y1],dx
  ; counting Y2
  neg  ax
  add  ax,[Cursor.Height]
  sub  ax,[CanvasHeight]
  jns  @@y2not0
  xor  ax,ax
@@y2not0:
  mov  [Y2],ax
@@hotysgot:
  ; counting X1
  mov  ax,[Cursor.HotX]
  sub  ax,[MouseX]
  js   @@getx2
  mov  [X1],ax
  mov  [X2],dx
  jmp  short @@hotxsgot
@@getx2:
  mov  [X1],dx
  ; counting X2
  neg  ax
  add  ax,[Cursor.Width]
  sub  ax,[CanvasWidth]
  jns  @@x2not0
  xchg ax,dx
@@x2not0:
  mov  [X2],ax
@@hotxsgot:
  ; some variables
  mov  ax,[Cursor.Width]
  sub  ax,[X1]
  sub  ax,[X2]
  jz   @@exit
  jns  @@cont
@@exit:
  ret
@@cont:
  mov  [VisWidth],ax
  mov  ax,[CanvasWidth]
  mov  [CanWid],ax
  ; skipping Y1
  mov  cx,[Cursor.Height]
  sub  cx,[Y1]
  sub  cx,[Y2]
  jz   @@exit
  js   @@exit
  ; screen and pointers
  push cx
  call InitCoor
  add  ax,[Y1]
  add  bx,[X1]
  cmp  [GrMode],16
  sete cl
  shl  bx,cl
  mul  [LineSize]
  add  ax,bx
  adc  dx,0
  xchg di,ax
  cmp  [WVideoPage],dx
  je   @@go
  call SetWVideoPage
@@go:
  pop  cx
  ; getting ready to draw
  mov  bx,[Cursor.Transparent]
  mov  ax,[Cursor.Width]
  mul  [Y1]
  mov  es,[SegA000]
  cmp  [GrMode],16
  je   @@hi
  ; 8-bit mode
  lds  si,[Cursor.Icon]
  add  si,ax
@@nextline8:
  push cx
  add  si,[X1]
  mov  cx,[VisWidth]
  ; drawing line
@@nextpixel8:
  lodsb
  cmp  al,bl
  je   @@skip8
  stosb
  or   di,di
  jmp  short @@cmpdi8
@@skip8:
  inc  di
@@cmpdi8:
  jnz  @@looppixel8
  push ds
  mov  ds,[DSeg]
  call IncWVideoPage
  pop  ds
@@looppixel8:
  loop @@nextpixel8
  ; additional operations
  add  si,[X2]
  mov  ax,[CanWid]
  sub  ax,[VisWidth]
  add  di,ax
  jnc  @@loopline8
  push ds
  mov  ds,[DSeg]
  call IncWVideoPage
  pop  ds
@@loopline8:
  pop  cx
  loop @@nextline8
  mov  ds,[DSeg]
  ret
@@hi: ; 16-bit mode
  shl  ax,1
  shl  [X1],1
  shl  [X2],1
  lds  si,[Cursor.Icon]
  add  si,ax
@@nextline16:
  push cx
  add  si,[X1]
  mov  cx,[VisWidth]
  ; drawing line
@@nextpixel16:
  lodsw
  cmp  ax,bx
  je   @@skip16
  stosw
  or   di,di
  jmp  short @@cmpdi16
@@skip16:
  inc  di
  inc  di
@@cmpdi16:
  jnz  @@looppixel16
  push ds
  mov  ds,[DSeg]
  call IncWVideoPage
  pop  ds
@@looppixel16:
  loop @@nextpixel16
  ; additional operations
  add  si,[X2]
  mov  ax,[CanWid]
  sub  ax,[VisWidth]
  shl  ax,1
  add  di,ax
  jnc  @@loopline16
  push ds
  mov  ds,[DSeg]
  call IncWVideoPage
  pop  ds
@@loopline16:
  pop  cx
  loop @@nextline16
  mov  ds,[DSeg]
  ret
endp

proc ShowMouse
  cmp  [MouseVisible],0
  jne  @@exit
  mov  [MouseVisible],1
  mov  ax,3
  int  33h
  cmp  [GrMode],1
  je   @@norm
  shr  cx,3
  shr  dx,3
@@norm:
  call HandleEvents
  mov  [MouseX],cx
  mov  [MouseY],dx
  call GetBgnd
  call PutCursor
@@exit:
  ret
endp

proc HideMouse
  cmp  [MouseVisible],0
  je   @@exit
  mov  [MouseVisible],0
  call PutBgnd
  mov  cx,[MouseX]
  mov  dx,[MouseY]
  call HandleEvents
@@exit:
  ret
endp

proc RefreshCursor
  cmp  [MouseVisible],0
  je   @@hidden
  push cx dx
  call PutBgnd
  pop  dx cx
  call HandleEvents
  mov  [MouseX],cx
  mov  [MouseY],dx
  call GetBgnd
  call PutCursor
  ret
@@hidden:
  mov  [MouseX],cx
  mov  [MouseY],dx
  ret
endp

proc RefreshMouse
  mov  ax,3
  int  33h
  cmp  [GrMode],1
  je   @@norm
  shr  cx,3
  shr  dx,3
@@norm:
  cmp  [MouseX],cx
  jne  @@changed
  cmp  [MouseY],dx
  je   @@exit
@@changed:
  call RefreshCursor
@@exit:
  ret
endp

proc SetMouseXY X,Y
  mov  ax,4
  mov  cx,[X]
  mov  dx,[Y]
  cmp  [GrMode],1
  je   @@norm
  shl  cx,3
  shl  dx,3
@@norm:
  int  33h
  call RefreshMouse
  ret
endp

proc ButtonCount ; function:Byte
  xor  ax,ax
  int  33h
  inc  ax
  jz   @@exit
  mov  bl,0
@@exit:
  xchg ax,bx
  ret
endp

proc MouseButtons ; function:Integer
  mov  ax,3
  int  33h
  xchg ax,bx
  ret
endp

proc PushedButton B:byte,vX:dword,vY:dword ; function:Integer
  mov  ax,5
  jmp  short @pushedreleased
proc ReleasedButton B:byte,vX:dword,vY:dword ; function:Integer
  mov  ax,6
@pushedreleased:
  movzx bx,[B]
  int  33h
  xchg bx,ax
  les  di,[vX]
  mov  [es:di],cx
  les  di,[vY]
  mov  [es:di],dx
  ret
endp
endp

proc SetMouseWindow X1,Y1,X2,Y2
  mov  ax,7
  mov  cx,[X1]
  mov  dx,[X2]
  cmp  [GrMode],1
  je   @@normx
  shl  cx,3
  shl  dx,3
@@normx:
  int  33h
  mov  ax,8
  mov  cx,[Y1]
  mov  dx,[Y2]
  cmp  [GrMode],1
  je   @@normy
  shl  cx,3
  shl  dx,3
@@normy:
  int  33h
  call RefreshMouse
  ret
endp

proc ClearMouseWindow
  mov  ax,7
  xor  cx,cx
  mov  dx,[CanvasWidth]
  dec  dx
  cmp  [GrMode],1
  je   @@normx
  shl  dx,3
@@normx:
  int  33h
  inc  ax
  mov  dx,[CanvasHeight]
  dec  dx
  cmp  [GrMode],1
  je   @@normy
  shl  dx,3
@@normy:
  int  33h
  call RefreshMouse
  ret
endp

proc SetSensitivity X,Y
  mov  ax,000Fh
  mov  cx,[X]
  mov  dx,[Y]
  int  33h
  ret
endp

proc SaveDataSeg near
  mov  [cs:SavedDS],ds
  ret
  SavedDS dw ?
  IntVec  dd ?
endp

proc GetOldIntVec near
  mov  ax,351Ch
  int  21h
  mov  [word ptr IntVec],bx
  mov  [word ptr IntVec+2],es
  ret
endp

proc SetOldIntVec near
uses ds
  lds  dx,[IntVec]
  mov  ax,251Ch
  int  21h
  ret
endp

proc Animate far ; interrupt
;  cmp [IntVec],0
;  je @@skip
  pushf
  call [IntVec]
;@@skip:
  push ds
  mov  ds,[SavedDS]
  dec  [AniStat]
  jnz  @@exit
  pushad
  push es
  call [AniProc]
  mov  al,[AnimationDelay]
  mov  [AniStat],al
  pop  es
  popad
@@exit:
  pop  ds
  iret
endp

proc SetMouseCursor pMC:dword
  ; clear cursor
  cmp  [MouseVisible],0
  je   @@dontput
  call PutBgnd
@@dontput:
  ; free memory
  cmp  [BgSize],0
  je   @@dontfree
  push [Background] [BgSize]
  call FreeM
@@dontfree:
  ; variables
  push ds
  mov  ax,ds
  mov  es,ax
  mov  di,offset Cursor
  lds  si,[pMC]
  mov  ax,cs
  cmp  ax,[word ptr pMC+2]
  jne  @@own
  cmp  si,offset Cur
  je   @@cont
@@own:
  mov  [PredefinedCursor],0
@@cont:
  mov  cx,size TMouseCursor
  rep  movsb
  pop  ds
  mov  ax,[Cursor.Width]
  add  ax,3+3
  and  ax,not 3
  mov  [BgWidth],ax
  cmp  [GrMode],16
  sete cl
  shl  ax,cl
  mul  [Cursor.Height]
  or   dx,dx
  jz   @@ok
  xor  ax,ax
  mov  [Cursor.Height],ax
  mov  [BgSize],ax
  ret
@@ok:
  mov  [BgSize],ax
  ; allocate memory
  or   ax,ax
  jz   @@exit
  push ds offset Background ax
  call GetM
  ; draw cursor
  cmp  [MouseVisible],0
  je   @@exit
  call GetBgnd
  call PutCursor
@@exit:
  ret
endp

proc SetPredefinedCursor near ; CS:SI ® data, DX:AX ¯ cursor
  jmp  @@go

  Cur TMouseCursor ?
  Data db MaxPredefinedDataSize dup (?)

@@go:
  mov  [PredefinedCursor],si
  mov  bx,[BlackColor]
  mov  dx,[WhiteColor]
  push ds
  mov  ax,ds
  mov  es,ax
  mov  ax,cs
  mov  ds,ax
  mov  di,offset Data
  lodsw
  mov  [Cur.Width],ax
  lodsw
  mov  [Cur.Height],ax
  lodsw
  mov  [Cur.HotX],ax
  lodsw
  mov  [Cur.HotY],ax
  mov  ax,bx
  inc  ax
  cmp  ax,dx
  sete cl
  add  al,cl
  mov  [Cur.Transparent],ax
  mov  ax,[Cur.Width]
  push dx
  mul  [Cur.Height]
  pop  dx
  or   ax,ax
  jz   @@exit
  xchg cx,ax
  cmp  [es:GrMode],16
  je   @@wrd
  clc
  jmp  short @@cont
@@wrd:
  stc
@@cont:
  mov  ax,cs
  mov  es,ax
  push bp
  mov  bp,[Cur.Transparent] ; BP changed!
@@nextpixel:
  lodsb
  dec  al
  jz   @@black
  dec  al
  jz   @@white
  mov  ax,bp
  jc   @@stosw
@@stosb:
  stosb
  loop @@nextpixel
  jmp  short @@then
@@stosw:
  stosw
  loop @@nextpixel
@@then:
  pop  bp
@@exit:
  pop  ds
  mov  dx,cs
  mov  ax,offset Cur
  mov  [word ptr Cur.Icon],offset Data
  mov  [word ptr 2+Cur.Icon],dx
  ret
@@black:
  mov  ax,bx
  jc   @@stosw
  jmp  short @@stosb
@@white:
  mov  ax,dx
  jc   @@stosw
  jmp  short @@stosb
endp

proc ArrowCursor ; function:PMouseCursor
  mov  si,offset ArrowData
  call SetPredefinedCursor
  ret

  ArrowData dw 10,16,0,0
    db 1,1,3,3,3,3,3,3,3,3
    db 1,2,1,3,3,3,3,3,3,3
    db 1,2,2,1,3,3,3,3,3,3
    db 1,2,2,2,1,3,3,3,3,3
    db 1,2,2,2,2,1,3,3,3,3
    db 1,2,2,2,2,2,1,3,3,3
    db 1,2,2,2,2,2,2,1,3,3
    db 1,2,2,2,2,2,2,2,1,3
    db 1,2,2,2,2,2,2,2,2,1
    db 1,2,2,2,2,2,1,1,1,1
    db 1,2,2,1,2,2,1,3,3,3
    db 1,2,1,3,1,2,2,1,3,3
    db 1,1,3,3,1,2,2,1,3,3
    db 3,3,3,3,3,1,2,2,1,3
    db 3,3,3,3,3,1,2,2,1,3
    db 3,3,3,3,3,3,1,1,3,3
endp

proc CrossCursor ; function:PMouseCursor
  mov  si,offset CrossData
  call SetPredefinedCursor
  ret

  CrossData dw 13,13,6,6
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 2,2,2,2,2,2,1,2,2,2,2,2,2
    db 1,1,1,1,1,1,3,1,1,1,1,1,1
    db 2,2,2,2,2,2,1,2,2,2,2,2,2
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
    db 3,3,3,3,3,2,1,2,3,3,3,3,3
endp

proc HourglassCursor ; Index ; function:PMouseCursor
  mov  bx,sp
  mov  cx,[ss:bx+4] ;Index
  cmp  cx,HourglassCount
  jae  @@exit
  mov  si,offset HourglassData
  jcxz @@found
@@findnext:
  mov  ax,[cs:si]
  mul  [word ptr cs:si+2]
  add  ax,8
  add  si,ax
  loop @@findnext
@@found:
  call SetPredefinedCursor
@@exit:
  ret  4

  HourglassData dw 13,15,6,7 ;#0
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,2,1,2,1,2,1,2,1,2,1,1
    db 3,1,2,2,1,2,1,2,1,2,2,1,3
    db 3,1,1,2,2,1,2,1,2,2,1,1,3
    db 3,1,3,1,2,2,1,2,2,1,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,3,3,1,2,1,3,3,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,1,2,2,2,2,2,1,3,1,3
    db 3,1,1,2,2,2,2,2,2,2,1,1,3
    db 3,1,2,2,2,2,2,2,2,2,2,1,3
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
       dw 13,15,6,7 ;#1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,2,1,2,2,2,2,2,1,2,1,1
    db 3,1,2,2,1,2,1,2,1,2,2,1,3
    db 3,1,1,2,2,1,2,1,2,2,1,1,3
    db 3,1,3,1,2,2,1,2,2,1,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,3,3,1,2,1,3,3,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,1,2,2,2,2,2,1,3,1,3
    db 3,1,1,2,2,2,2,2,2,2,1,1,3
    db 3,1,2,2,2,2,2,2,2,2,2,1,3
    db 1,1,2,2,2,1,2,1,2,2,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
       dw 13,15,6,7 ;#2
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 3,1,2,2,1,2,1,2,1,2,2,1,3
    db 3,1,1,2,2,1,2,1,2,2,1,1,3
    db 3,1,3,1,2,2,1,2,2,1,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,3,3,1,2,1,3,3,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,1,2,2,2,2,2,1,3,1,3
    db 3,1,1,2,2,2,2,2,2,2,1,1,3
    db 3,1,2,2,2,2,2,2,2,2,2,1,3
    db 1,1,2,1,2,1,2,1,2,1,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
       dw 13,15,6,7 ;#3
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 3,1,2,2,2,2,1,2,2,2,2,1,3
    db 3,1,1,2,2,1,2,1,2,2,1,1,3
    db 3,1,3,1,2,2,1,2,2,1,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,3,3,1,2,1,3,3,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,1,2,2,2,2,2,1,3,1,3
    db 3,1,1,2,2,2,2,2,2,2,1,1,3
    db 3,1,2,2,2,2,1,2,2,2,2,1,3
    db 1,1,2,1,2,1,2,1,2,1,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
       dw 13,15,6,7 ;#4
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 3,1,2,2,2,2,2,2,2,2,2,1,3
    db 3,1,1,2,2,1,2,1,2,2,1,1,3
    db 3,1,3,1,2,2,1,2,2,1,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,3,3,1,2,1,3,3,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,1,2,2,2,2,2,1,3,1,3
    db 3,1,1,2,2,2,2,2,2,2,1,1,3
    db 3,1,2,2,1,2,1,2,1,2,2,1,3
    db 1,1,2,1,2,1,2,1,2,1,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
       dw 13,15,6,7 ;#5
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 3,1,2,2,2,2,2,2,2,2,2,1,3
    db 3,1,1,2,2,2,2,2,2,2,1,1,3
    db 3,1,3,1,2,2,1,2,2,1,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,3,3,1,2,1,3,3,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,1,2,2,2,2,2,1,3,1,3
    db 3,1,1,2,2,1,2,1,2,2,1,1,3
    db 3,1,2,2,1,2,1,2,1,2,2,1,3
    db 1,1,2,1,2,1,2,1,2,1,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
       dw 13,15,6,7 ;#6
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 3,1,2,2,2,2,2,2,2,2,2,1,3
    db 3,1,1,2,2,2,2,2,2,2,1,1,3
    db 3,1,3,1,2,2,2,2,2,1,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,3,3,1,2,1,3,3,3,1,3
    db 3,1,3,3,1,2,2,2,1,3,3,1,3
    db 3,1,3,1,2,2,1,2,2,1,3,1,3
    db 3,1,1,2,2,1,2,1,2,2,1,1,3
    db 3,1,2,2,1,2,1,2,1,2,2,1,3
    db 1,1,2,1,2,1,2,1,2,1,2,1,1
    db 1,1,2,2,2,2,2,2,2,2,2,1,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1
       dw 15,13,7,6 ;#7
    db 1,1,1,3,3,3,3,3,3,3,3,3,1,1,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,2,2,2,1,3,3,3,3,3,1,2,2,2,1
    db 1,2,2,2,2,1,3,3,3,1,2,2,1,2,1
    db 1,2,2,2,2,2,1,3,1,2,2,1,2,2,1
    db 1,2,2,2,2,2,2,1,2,2,1,2,1,2,1
    db 1,2,2,2,2,2,2,2,2,1,2,1,2,2,1
    db 1,2,2,2,2,2,2,1,2,2,1,2,1,2,1
    db 1,2,2,2,2,2,1,3,1,2,2,1,2,2,1
    db 1,2,2,2,2,1,3,3,3,1,2,2,1,2,1
    db 1,2,2,2,1,3,3,3,3,3,1,2,2,2,1
    db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
    db 1,1,1,3,3,3,3,3,3,3,3,3,1,1,1
endp

proc ModeChangeEvent Success:byte
  cmp  [Success],0
  je   @@exit
  mov  [MouseVisible],0
  mov  [BlackColor],0
  cmp  [GrMode],16
  je   @@hi
  mov  [WhiteColor],15
  jmp  short @@cont
@@hi:
  mov  [WhiteColor],0FFFFh
@@cont:
  mov  ax,1
  cmp  [GrMode],1
  sete cl
  shl  cl,1
  shl  ax,cl
  push ax ax
  call SetSensitivity
  call ClearMouseWindow
  mov  si,[PredefinedCursor]
  or   si,si
  jz   @@exit
  call SetPredefinedCursor
  push dx ax
  call SetMouseCursor
@@exit:
  ret
endp

END