Estex-DSS/DSS/INTMOUSE.ASM
Anatoliy Belyanskiy a99ed14bda bug fix
2023-08-12 05:21:13 +10:00

963 lines
13 KiB
NASM
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.

;[BEGIN]
;//MODULE: INTMOUSE
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
CMOUSE EQU #1B ; !FIXIT ­  sp2000.inc
DMOUSE EQU #1A ; !FIXIT ­  sp2000.inc
; MOUSE SOFTWARE SPECIFICATION
;---------------------------------------------
; COMMAND 00h (INITIALIZATION)
;
; RETURN: NC - MOUSE PRESENT
; C - MOUSE ABSENT
;---------------------------------------------
; COMMAND 01h (SHOW MOUSE CURSOR)
;
; RETURN: NC - DONE
; C - MOUSE ON SCREEN
;---------------------------------------------
; COMMAND 02h (HIDE MOUSE CURSOR)
;
; RETURN: NC - DONE
; C - NONE MOUSE
;---------------------------------------------
; COMMAND 03h (READ MOUSE STATE)
;
; RETURN: HL - X COORD
; DE - Y COORD
; A - BUTTONS D2-D0 (MIDDLE,RIGHT,LEFT)
;---------------------------------------------
; COMMAND 04h (GOTO MOUSE CURSOR)
;
; INPUT: HL - X COORD
; DE - Y COORD
;---------------------------------------------
; COMMAND 05h (RESERVED)
;---------------------------------------------
; COMMAND 06h (RESERVED)
;---------------------------------------------
; COMMAND 07h (SET VERT. BOUNDS)
;
; INPUT: HL - Y MIN
; DE - Y MAX
;---------------------------------------------
; COMMAND 08h (SET HORZ. BOUNDS)
;
; INPUT: HL - X MIN
; DE - X MAX
;---------------------------------------------
; COMMAND 09h (LOAD CURSOR)
;
; INPUT: IX - CURSOR IMAGE
; H - HEIGHT CURSOR
; L - WIDTH CURSOR
; D - Y HOT SPOT
; E - X HOT SPOT
; B = 0
;---------------------------------------------
; COMMAND 0Ah (SET CURSOR IN TEXT MODES)
;
; INPUT: H - AND SIMBOL MASK
; L - XOR SIMBOL MASK
; D - AND ATTRIBUT MASK
; E - XOR ATTRIBUT MASK
; B = 0
;---------------------------------------------
; COMMAND 0Bh (RETURN CURSOR)
;
; INPUT: IX - CURSOR IMAGE BUFFER
; OUTPUT: H - HEIGHT CURSOR
; L - WIDTH CURSOR
; D - Y HOT SPOT
; E - X HOT SPOT
;---------------------------------------------
; COMMAND 0Ch (RESERVED)
;---------------------------------------------
; COMMAND 0Dh (RESERVED)
;---------------------------------------------
; COMMAND 0Eh (GET SENSETIVE)
; OUTPUT: H - VERTICAL SENSETIVE
; L - HORIZONTAL SENSETIVE
;---------------------------------------------
; COMMAND 0Fh (SET SENSETIVE)
; INPUT: H - VERTICAL SENSETIVE
; L - HORIZONTAL SENSETIVE
;---------------------------------------------
; COMMAND 80h (MOUSE HARDWARE INTERRUPT)
;---------------------------------------------
; COMMAND 81h (CHANGE VIDEO MODE)
; INPUT: A - MODE
;---------------------------------------------
; COMMAND 82h (RESERVED)
;---------------------------------------------
; COMMAND 83h (MOUSE REFRESH)
;---------------------------------------------
; ERRORS: 0 - NO ERROR
; 1 - COMMAND NOT PRESENT
; 2 - DEVICE ABSENT
; 3 - CURSOR ON (UZHE)
; 4 - CURSOR OFF (UZHE)
; 5 - CURSOR IMAGE VERY BIG
INTMOUS BIT 7,C
JR NZ,EMOUSE
INC C
DEC C
JR Z,MS_INIT ; 0
DEC C
JR Z,MS_SHOW ; 1
DEC C
JP Z,MS_HIDD ; 2
DEC C
JP Z,MS_READ ; 3
DEC C
JP Z,MS_GOTO ; 4
DEC C
JR Z,MS_RESR ; 5
DEC C
JR Z,MS_RESR ; 6
DEC C
JP Z,MS_VERT ; 7
DEC C
JP Z,MS_HORZ ; 8
DEC C
JP Z,MS_CURS ; 9
DEC C
JP Z,MS_MASK ; 10
DEC C
JP Z,MS_BCUR ; 11
DEC C
JR Z,MS_RESR ; 12
DEC C
JR Z,MS_RESR ; 13
DEC C
JP Z,MS_GSEN ; 14
DEC C
JP Z,MS_SENT ; 15
MS_RESR LD A,DSS_Error.mouse.INVALID_COMMAND
SCF
RET
EMOUSE RES 7,C
INC C
DEC C
JP Z,M_INT
DEC C
JP Z,M_MODE
DEC C
JR Z,M_RESR
DEC C
JP Z,M_REFR
M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND
SCF
RET
;!TODO ­  ¡¨®á.
MS_INIT DI
;!TEST mouse
;LD A,85
;OUT (#10),A
;LD A,45
;OUT (#10),A
;
XOR A ;LD A,0
OUT (CMOUSE),A
INC A ;LD A,1
OUT (CMOUSE),A
DEC A ;LD A,0
OUT (CMOUSE),A
LD A,3
OUT (CMOUSE),A
LD A,#41
OUT (CMOUSE),A
LD A,4
OUT (CMOUSE),A
;!TEST mouse
LD A,#47 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16 875000/Œ­1*Œ­2=1215
;LD A,#44
;LD A,#04 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 1 875000/Œ­1*Œ­2=4807
;
OUT (CMOUSE),A
LD A,5
OUT (CMOUSE),A
LD A,#E0
OUT (CMOUSE),A
;!TEST mouse
LD A,#55
OUT (Z84.CTC.Ch_0),A
LD A,#2D ; ¢â®à®© ¬­®¦¨â¥«ì = 45 875000/Œ­1*Œ­2=1215
;LD A,#B6 ; ¢â®à®© ¬­®¦¨â¥«ì = 182 875000/Œ­1*Œ­2=4807
OUT (Z84.CTC.Ch_0),A
;
EI
XOR A
RET
MS_SHOW PUSH IX
PUSH HL
PUSH DE
EX AF,AF'
PUSH AF
LD HL,(PIX_X)
LD DE,(PIX_Y)
DI
CALL MOUSE
XOR A
LD (REFRESH+1),A
EI
POP AF
EX AF,AF'
POP DE
POP HL
POP IX
XOR A
RET
MS_HIDD PUSH IX
PUSH HL
PUSH DE
EX AF,AF'
PUSH AF
DI
LD A,1
LD (REFRESH+1),A
CALL RESTORE
EI
POP AF
EX AF,AF'
POP DE
POP HL
POP IX
XOR A
RET
MS_READ LD HL,(PIX_X)
LD DE,(PIX_Y)
LD A,(MB)
AND A
RET
MS_GOTO PUSH IX
PUSH HL
PUSH DE
LD (PIX_X),HL
LD (PIX_Y),DE
EX AF,AF'
PUSH AF
DI
CALL REFRESH
EI
POP AF
EX AF,AF'
POP DE
POP HL
POP IX
XOR A
RET
MS_CURS PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD A,L
LD (M_XSIZE),A
LD A,H
LD (M_YSIZE),A
LD C,E
LD B,0
LD (XHOT_SP),BC
LD C,D
LD B,0
LD (YHOT_SP),BC
EXX
LD A,(M_XSIZE)
LD C,A
LD B,0
LD A,(M_YSIZE)
LD HL,0
MSCURS1 ADD HL,BC
DEC A
JR NZ,MSCURS1
PUSH HL
LD BC,M_IMAGE.Size+1
AND A
SBC HL,BC
CCF
EXX
POP BC
POP HL
LD A,5
JR C,NOLOADM
LD DE,M_IMAGE
DI
LDIR
XOR A
NOLOADM POP HL
POP DE
POP BC
EI
RET
MS_BCUR PUSH IX
EXX
LD A,(M_XSIZE)
LD C,A
LD B,0
LD A,(M_YSIZE)
LD HL,0
MSBCUR1 ADD HL,BC
DEC A
JR NZ,MSBCUR1
PUSH HL
LD BC,M_IMAGE.Size+1
AND A
SBC HL,BC
CCF
EXX
POP BC
POP HL
LD A,5
JR C,NOSAVEM
LD DE,M_IMAGE
EX DE,HL
DI
LDIR
LD A,(M_XSIZE)
LD L,A
LD A,(M_YSIZE)
LD H,A
LD BC,(XHOT_SP)
LD E,C
LD BC,(YHOT_SP)
LD D,C
LD BC,0
XOR A
NOSAVEM EI
RET
MS_HORZ
LD (MIN_X),HL
LD (MAX_X),DE
XOR A
RET
MS_VERT
LD (MIN_Y),HL
LD (MAX_Y),DE
XOR A
RET
MS_MASK
LD (ANDXORS),HL
LD (ANDXORA),DE
XOR A
RET
; H - VERTICAL SENSETIVE
; L - HORIZONTAL SENSETIVE
MS_SENT
LD (SENSEXY),HL
XOR A
RET
MS_GSEN
LD HL,(SENSEXY)
XOR A
RET
MOUSET LD (REST_XT+1),HL
LD (REST_YT+1),DE
;Y
SRL D
RR E
SRL D
RR E
SRL D
RR E
LD D,E
;X
SRL H
RR L
SRL H
RR L
SRL H
RR L
LD E,L
IN A,(PORT_Y)
LD XH,A
IN A,(SLOT1)
LD XL,A
;
DI
;
LD A,#54 ;!HARDCODE video page
OUT (SLOT1),A
;
LD A,D
ADD A,A
ADD A,A ;Y * 4
LD L,A
LD H,#43 ;+ #4300
;
IN A,(RGMOD)
RRCA
AND #80
OR #01
ADD A,E
OUT (PORT_Y),A
INC L
LD A,(HL) ;SIMBOL
LD BC,(ANDXORS)
AND B
XOR C
LD (HL),A
INC L
LD A,(HL) ;ATTRIBUT
LD BC,(ANDXORA)
AND B
XOR C
LD (HL),A
;
LD A,XL
OUT (SLOT1),A
LD A,XH
OUT (PORT_Y),A
RET
RESTORT:
REST_XT: LD HL,#0000
REST_YT: LD DE,#0000
;Y
SRL D
RR E
SRL D
RR E
SRL D
RR E
LD D,E
;X
SRL H
RR L
SRL H
RR L
SRL H
RR L
LD E,L
IN A,(PORT_Y)
LD XH,A
IN A,(SLOT1)
LD XL,A
;
DI
;
LD A,#50
OUT (SLOT1),A
;
LD A,D
ADD A,A
ADD A,A ;Y * 4
LD L,A
LD H,#43 ;+ #4300
;
IN A,(RGMOD)
RRCA
AND #80
OR #01
ADD A,E
OUT (PORT_Y),A
INC L
LD A,(HL) ;SIMBOL
LD (HL),A
INC L
LD A,(HL) ;ATTRIBUT
LD (HL),A
;
LD A,XL
OUT (SLOT1),A
LD A,XH
OUT (PORT_Y),A
RET
RESTORE:
.sw+1: LD A,#00
BIT 7,A
JP Z,RESTORT
RESTORG IN A,(SLOT3)
LD B,A
IN A,(PORT_Y)
LD C,A
PUSH BC
LD A,#50 ;!HARDCODE videopage
OUT (SLOT3),A
REST_X LD HL,0
REST_Y LD DE,0
LD A,E
EX AF,AF'
REST_V LD A,#00
AND 1
LD DE,#C000 ;screen 0
JR Z,AA2
LD DE,#C000+320 ;screen 1
AA2 ADD HL,DE
REST_A LD A,0
LD XH,A
EX AF,AF'
REST_H
RS002 LD BC,10
OUT (PORT_Y),A
EX AF,AF'
LD (PUSH_HL),HL
LD D,H
LD E,L
LDIR
PUSH_HL+1: LD HL,#0000
; POP HL
EX AF,AF'
INC A
JR Z,RS003
DEC XH
JR NZ,RS002
RS003 POP BC
LD A,B
OUT (SLOT3),A
LD A,C
OUT (PORT_Y),A
XOR A
RET
;HL/DE - X/Y
MOUSE: LD A,(MODE_M)
LD (RESTORE.sw),A
BIT 7,A
JP Z,MOUSET
MOUSEG: CP #82 ;640x256x16
JR NZ,NOFX
SRL H
RR L
NOFX: LD IX,M_IMAGE
LD A,(M_XSIZE)
LD C,A
LD B,0
LD (REALXS),BC
LD (REST_H+1),BC
LD C,B
LD (SKIPXF),BC
LD A,(M_YSIZE)
LD (REST_A+1),A
LD C,A
LD B,0
LD (REALYS),BC
LD BC,(YHOT_SP)
LD A,E
SUB C
LD E,A
JR NC,GOODY
NEG
LD E,A
LD A,(M_XSIZE)
LD C,A
LD B,0
LD A,(M_YSIZE)
SUB E
SKIPMY: ADD IX,BC
DEC E
JR NZ,SKIPMY
LD C,A
LD (REALYS),BC
GOODY: LD BC,(XHOT_SP)
AND A
SBC HL,BC
JR NC,GOODX
LD B,H
LD C,L
LD HL,0
AND A
SBC HL,BC
LD (SKIPXF),HL
LD A,(M_XSIZE)
SUB L
LD L,A
LD (REALXS),HL
LD HL,0
GOODX: LD (REST_X+1),HL
LD (REST_Y+1),DE
PUSH HL
IN A,(SLOT3)
LD H,A
IN A,(PORT_Y)
LD L,A
EX (SP),HL
LD A,#5C ;!HARDCODE videopage
OUT (SLOT3),A
LD A,E
EX AF,AF'
IN A,(RGMOD)
LD (REST_V+1),A
AND 1
LD DE,#C000 ;PAGE 0
JR Z,AA1
LD DE,#C000+320 ;PAGE 1
AA1 ADD HL,DE
LD D,XH
LD E,XL
EX DE,HL ;HL - BITMAP
LD BC,(REALYS)
LD XH,C
EX AF,AF'
MS002 LD BC,(SKIPXF)
ADD HL,BC
LD BC,(REALXS)
OUT (PORT_Y),A
EX AF,AF'
;PUSH DE
LD (PUSH_DE+1),DE
LDIR
PUSH_DE LD DE,#0000
; POP DE
EX AF,AF'
INC A
JR Z,MS003
DEC XH
JR NZ,MS002
MS003 POP BC
LD A,B
OUT (SLOT3),A
LD A,C
OUT (PORT_Y),A
XOR A
RET
READ_M: IN A,(CMOUSE)
RRCA
RET NC
IN A,(DMOUSE)
LD L,A
BIT 6,A
CCF
RET Z
;!TEST mouse freeeeezzzz
LD BC,#2000
;
TST_01: IN A,(CMOUSE)
RRCA
;!TEST mouse freeeeezzzz
JR C,.NXT
DEC BC
LD A,B
OR C
JR NZ,TST_01
;JR NC,TST_01
RET
;
.NXT: IN A,(DMOUSE)
LD E,A
BIT 6,A
CCF
RET NZ
;!TEST mouse freeeeezzzz
LD BC,#2000
;
TST_02: IN A,(CMOUSE)
RRCA
;!TEST mouse freeeeezzzz
JR C,.NXT
DEC BC
LD A,B
OR C
JR NZ,TST_02
;JR NC,TST_02
RET
;
.NXT: IN A,(DMOUSE)
LD D,A
BIT 6,A
CCF
RET NZ
LD A,E
AND #3F
LD E,A
LD A,L
AND #03
RRCA
RRCA
OR E
LD E,A
LD A,D
AND #3F
LD D,A
LD A,L
AND #0C
RRCA
RRCA
RRCA
RRCA
OR D
LD D,A
LD A,L
RLCA
RLCA
RLCA
RES 6,A
JR NC,STBU
SET 6,A
STBU RLCA
RLCA
AND #03
LD (MB),A
CALL SENSE
LD A,E
LD (MX),A
LD A,D
LD (MY),A
SCF
RET
MCORECT LD HL,(PIX_X)
LD DE,(MX)
LD D,0
BIT 7,E
JR NZ,DECX
ADD HL,DE
LD (PIX_X),HL
EX DE,HL
LD HL,(MAX_X)
AND A
SBC HL,DE
JR NC,YCOO
LD HL,(MAX_X)
LD (PIX_X),HL
JP YCOO
DECX LD A,E
NEG
LD E,A
AND A
SBC HL,DE
LD (PIX_X),HL
JR C,YCOO2
LD DE,(MIN_X)
SBC HL,DE
JR NC,YCOO
YCOO2 LD HL,(MIN_X)
LD (PIX_X),HL
YCOO LD HL,(PIX_Y)
LD DE,(MY)
LD D,0
BIT 7,E
JR NZ,DECY
ADD HL,DE
LD (PIX_Y),HL
EX DE,HL
LD HL,(MAX_Y)
AND A
SBC HL,DE
RET NC
LD HL,(MAX_Y)
LD (PIX_Y),HL
RET
DECY LD A,E
NEG
LD E,A
AND A
SBC HL,DE
LD (PIX_Y),HL
JR C,XCOO
LD DE,(MIN_Y)
SBC HL,DE
RET NC
XCOO LD HL,(MIN_Y)
LD (PIX_Y),HL
RET
SENSE LD HL,(SENSEXY)
LD A,L
OR L
RET Z
DEC A
RET Z
LD A,E
BIT 7,A
LD B,#FF
JR Z,SEN1
LD B,#7F
NEG
SEN1 INC B
SUB L
JR NC,SEN1
BIT 7,B
JR Z,SEN2
LD A,B
RES 7,A
NEG
LD B,A
SEN2 LD E,B
LD A,D
BIT 7,A
LD B,#FF
JR Z,SEN3
LD B,#7F
NEG
SEN3 INC B
SUB H
JR NC,SEN3
BIT 7,B
JR Z,SEN4
LD A,B
RES 7,A
NEG
LD B,A
SEN4 LD D,B
RET
M_MODE LD (MODE_M),A
OR A
JR Z,UNKMODE
CP 1
JR Z,UNKMODE
CP 2
JR Z,S320256
CP 3
JR Z,S640256
BIT 7,A
JR Z,UNKMODE
RES 7,A
CP 1
JR Z,S320256
CP 2
JR Z,S640256
UNKMODE XOR A ; ????? ¬®¦¥â âãâ ­ ¤® .INVALID_COMMAND ?
SCF
RET
S320256
LD HL,0 ;MIN X
LD DE,319 ;MAX X
CALL MS_HORZ
LD HL,0 ;MIN X
LD DE,255 ;MAX X
CALL MS_VERT
XOR A
RET
S640256
LD HL,0 ;MIN X
LD DE,639 ;MAX X
CALL MS_HORZ
LD HL,0 ;MIN X
LD DE,255 ;MAX X
CALL MS_VERT
XOR A
RET
;Mouse Interrupt
M_INT IN A,(SLOT3)
LD B,A
IN A,(PORT_Y)
LD C,A
PUSH BC
CALL REFRESH ;Refresh mouse
CALL CONTROL
POP BC
LD A,B
OUT (SLOT3),A
LD A,C
OUT (PORT_Y),A
RET
M_REFR CALL CONTROL
AND A
RET
CONTROL CALL READ_M
RET NC
CALL MCORECT
LD A,#00
LD (REDY),A
RET
REFRESH LD A,#01
OR A
RET NZ
REDY+1: LD A,#00
;????? ¯®ç¥¬ã § ª®¬¬¥­â¨à®¢ ­­® ¢ ®à¨£¨­ «¥?
;OR A
;RET NZ
;
CALL RESTORE
LD HL,(PIX_X)
LD DE,(PIX_Y)
CALL MOUSE
LD A,#FF
LD (REDY),A
RET
MODE_M DB #03
PIX_X DW 160
PIX_Y DW 128
MX DB #00
MY DB #00
MB DB #00
MB_OLD DB #00 ; !FIXIT - ­¥ ­ã¦­®?
MIN_X DW 0
MAX_X DW 319
MIN_Y DW 0
MAX_Y DW 255
SENSEXY
SENSE_X DB 0
SENSE_Y DB 0
XHOT_SP DW 0
YHOT_SP DW 0
ANDXORS DW #FF00
ANDXORA DW #FF77
M_XSIZE DB 10
M_YSIZE DB 14
SKIPXF DW 0
REALXS DW 0
REALYS DW 0
; Xx EQU #00
; Ww EQU #FE
; Nn EQU #FF
;MS_BMP
M_IMAGE:
DH "00 00 FF FF FF FF FF FF FF FF"
DH "00 FE 00 FF FF FF FF FF FF FF"
DH "00 FE FE 00 FF FF FF FF FF FF"
DH "00 FE FE FE 00 FF FF FF FF FF"
DH "00 FE FE FE FE 00 FF FF FF FF"
DH "00 FE FE FE FE FE 00 FF FF FF"
DH "00 FE FE FE FE FE FE 00 FF FF"
DH "00 FE FE FE FE 00 00 00 00 FF"
DH "00 FE FE 00 FE 00 FF FF FF FF"
DH "00 FE 00 00 FE FE 00 FF FF FF"
DH "00 00 FF FF 00 FE 00 FF FF FF"
DH "00 FF FF FF 00 FE FE 00 FF FF"
DH "FF FF FF FF FF 00 00 FF FF FF"
DH "FF FF FF FF FF FF FF FF FF FF"
BLOCK 256-($-M_IMAGE),0
.Size EQU $-M_IMAGE
;//MODULE: INTMOUSE
;[END]