File-Manager/MOD0/MOUSEDRV.ASM
2025-04-04 00:37:36 +10:00

374 lines
5.0 KiB
NASM
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Cmouse equ 1Bh
Dmouse equ 1Ah
; RST 30h. Mouse Driver (⥪áâ®¢ë© íªà ­)
; <20>  ¢å®¤ ­®¬¥à ä㭪樨:
; A=00h ˆ­¨æ¨ «¨§ æ¨ï ¬ëè¨
; A=01h ‚뢥á⨠¬ëè¨­ë© ªãàá®à ­  íªà ­
; A=02h “¡à âì ¬ëè¨­ë© ªãàá®à á íªà ­ 
; A=03h <20>®«ãç¨âì ª®®à¤¨­ âë ¬ë誨 ¨ á®áâ®ï­¨¥ ª­®¯®ª
; A=04h <20>®«ãç¨âì ª®®à¤¨­ âë ¬ë誨 ¨ á®áâ®ï­¨¥ ª­®¯®ª
; ¯®á«¥ ¨å ®â¯ã᪠­¨ï
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,(89h)
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 (89h),a
inc l
inc l
ld a,(hl)
ld (hl),a
pop bc
ld a,b
out (0E2h),a
ld a,c
out (89h),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,(89h)
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 (89h),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 (89h),a
ret
; <20>®«ãç¨âì ­®¢ãî ¨­ä®à¬ æ¨î ® ¬ë誥
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)
; <20>ãä¥à ¤«ï åà ­¥­¨ï ¨­ä®à¬ æ¨¨ ¨§ ¯®¤ ¬ë誨
MouseBuff:
db 0