Cmouse equ 1Bh Dmouse equ 1Ah ; RST 30h. Mouse Driver (текстовый экран) ; На вход номер функции: ; A=00h Инициализация мыши ; A=01h Вывести мышиный курсор на экран ; A=02h Убрать мышиный курсор с экрана ; A=03h Получить координаты мышки и состояние кнопок ; A=04h Получить координаты мышки и состояние кнопок ; после их отпускания MouseDrv: or a ; a=0 jr z,Init_MS dec a ; a=1 jr z,SetMouse dec a ; a=2 jp z,ResMouse dec a ; a=3 jp z,ExmFire dec a ; a=4 jp z,GetFire ret ; Initialization LPT port & Mouse Init_MS:di ld a,55h out (10h),a ld a,2Dh out (10h),a ld a,0 out (1Bh),a ld a,1 out (1Bh),a ld a,0 out (1Bh),a ld a,3 out (1Bh),a ld a,41h out (1Bh),a ld a,4 out (1Bh),a ld a,47h out (1Bh),a ld a,5 out (1Bh),a ld a,0E0h out (1Bh),a ei xor a ld (MSbutt),a ret ; Set Mouse & Print Cursor Mouse on Screen SetMouse: di push ix push hl push de push bc call Refresh pop bc pop de pop hl pop ix ld a,1 ld (MouseFlg),a ei ret ; Res Mouse & Clear Cursor Mouse from Screen ResMouse: ld a,(MouseFlg) or a ret z di xor a ld (MouseFlg),a ld (MSbutt),a push ix push hl push de push bc call RestorM pop bc pop de pop hl pop ix ei ret ; Examination on Fire ; Input: None ; OutPut: Z-Not Fire ; NZ-Yes Fire: ; HL=Y,X (in Znak) ; A=0-bit Right Button ; A=1-bit Left Button ExmFire:ld hl,(Tcoords) ld a,(MSbutt) and 3 ret ; Get Fire (Wait Not Fire) ; Input: None ; OutPut: Z-Not Fire ; NZ-Yes Fire: ; HL=Y,X (in Znak) ; A=0-bit Right Button ; A=1-bit Left Button GetFire:ld hl,(Tcoords) ld a,(MSbutt) and 3 ret z push af ld a,(MSbutt) and 3 jr nz,$-5 pop af ret ; Refresh Mouse on Screen Refresh:call GetMousInfo db 3Eh ; ld a,.. hidden_mouse: db true ; true - прятать мышь при работе с клавой or a jr z,RefrMs ld hl,(Xcoord) srl h rr l srl h rr l srl l ld a,(Ycoord) rra rra rra and 1Fh ld h,a ld de,(TempXY) sbc hl,de jr nz,RefrMs KeyPres:ld a,0 or a jr z,RefrMs1 jp RestorM ; RefrMs: xor a ld (KeyPres+1),a RefrMs1:call RestorM jp MousWrt ; Restore Screen from Mouse RestorM:ld de,(TempXY) in a,(PORT_Y) ld c,a in a,(0E2h) ld b,a push bc ld a,5Ch ; 54h видео-страница out (0E2h),a ld a,d add a,a add a,a ld l,a ld h,0C3h in a,(0C9h) rrca and 80h or 1 add a,e out (PORT_Y),a inc l inc l ld a,(hl) ld (hl),a pop bc ld a,b out (0E2h),a ld a,c out (PORT_Y),a ret ; Put Text Mouse Cursor On Screen MousWrt:ld de,(Xcoord) srl d rr e srl d rr e srl e ld a,(Ycoord) rra rra rra and 1Fh ld d,a ld (TempXY),de in a,(PORT_Y) ld c,a in a,(0E2h) ld b,a push bc ld a,5Ch ; 54h видео-страница out (0E2h),a ld a,d add a,a add a,a ld l,a ld h,0C3h in a,(0C9h) rrca and 80h or 1 add a,e out (PORT_Y),a inc l inc l ld a,(hl) xor 77h ld (hl),a pop bc ld a,b out (0E2h),a ld a,c out (PORT_Y),a ret ; Получить новую информацию о мышке GetMousInfo: call Read_MS ret c ld de,(Xcoord) srl d rr e srl d rr e srl e ld a,(Ycoord) rra rra rra and 1Fh ld d,a ld (Tcoords),de ret ; Input Mouse Data from LPT ports Read_MS:scf in a,(Cmouse) bit 0,a ret z in a,(Dmouse) ld l,a bit 6,a ret z Read_L1:in a,(Cmouse) rrca jr nc,Read_L1 in a,(Dmouse) ld e,a bit 6,a ret nz Read_L2:in a,(Cmouse) rrca jr nc,Read_L2 in a,(Dmouse) ld d,a bit 6,a ret nz ld a,e and 3Fh ld e,a ld a,l and 3 rrca rrca or e ld c,a ; X addition ld a,d and 3Fh ld d,a ld a,l and 0Ch rrca rrca rrca rrca or d ld b,a ; Y addition ld a,l and 30h rrca rrca rrca rrca ld (MSbutt),a ; Button Pressed ; Corrected Mouse Place ld hl,(Xcoord) bit 7,c ld e,c jr nz,subX ld d,0 add hl,de ld de,027Fh ex de,hl sbc hl,de add hl,de jr c,$+3 ex de,hl ld (Xcoord),hl jr NxtCoord ; subX: ld d,0FFh add hl,de jr c,$+5 ld hl,0 ld (Xcoord),hl NxtCoord: ld hl,(Ycoord) bit 7,b ld a,l jr nz,subY add a,b jr nc,$+4 ld a,0FFh ld l,a ld (Ycoord),hl and a ret ; subY: add a,b jr c,$+3 xor a ld l,a ld (Ycoord),hl and a ret ; Флаг мышки MouseFlg: db 0 ; 00 - мышки нет ; 01 - мышка есть ; Координаты мышки в точках ;Coords: ;Xcoord: dw 320 ; координата X (0..639) ;Ycoord: dw 128 ; координата Y (0..255) ; Временные координаты в знакоместах TempXY: dw 0000h ; X (0..79), Y (0..31) ; Состояние кнопок MSbutt: db 0 ; 0-bit правая кнопка ; 1-bit левая кнопка ; Координаты мышки в знакоместах Tcoords: TcoordX:db 40 ; координата X (0..79) TcoordY:db 16 ; координата Y (0..31) ; Буфер для хранения информации из под мышки MouseBuff: db 0