Estex-DSS/DSS/INTMOUSE.ASM

966 lines
14 KiB
NASM
Raw Blame History

;[BEGIN]
;//MODULE: INTMOUSE
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
PORT_MOUSE.Ctrl EQU Z84.SIO.Ch_B.Ctrl
PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data
; 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 SENSITIVE)
; OUTPUT: H - VERTICAL SENSITIVE
; L - HORIZONTAL SENSITIVE
;---------------------------------------------
; COMMAND 0Fh (SET SENSITIVE)
; INPUT: H - VERTICAL SENSITIVE
; L - HORIZONTAL SENSITIVE
;---------------------------------------------
; 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 <20><> <20><><EFBFBD><EFBFBD>.
MS_INIT DI
;!TEST mouse
;LD A,85
;OUT (#10),A
;LD A,45
;OUT (#10),A
;
XOR A ;LD A,0
OUT (PORT_MOUSE.Ctrl),A
INC A ;LD A,1
OUT (PORT_MOUSE.Ctrl),A
DEC A ;LD A,0
OUT (PORT_MOUSE.Ctrl),A
LD A,3
OUT (PORT_MOUSE.Ctrl),A
LD A,#41
OUT (PORT_MOUSE.Ctrl),A
LD A,4
OUT (PORT_MOUSE.Ctrl),A
;!TEST mouse
LD A,#47 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 16 875000/<2F><>1*<2A><>2=1215
;LD A,#44
;LD A,#04 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 1 875000/<2F><>1*<2A><>2=4807
OUT (PORT_MOUSE.Ctrl),A
;
LD A,5
OUT (PORT_MOUSE.Ctrl),A
; [ ] <20><><EFBFBD> <20><><EFBFBD>४⭮<E0A5AA><E2ADAE> <20><><EFBFBD><EFBFBD><EFBFBD> Sega <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD A,%1110'0000
;LD A,%0110'0000
;
OUT (PORT_MOUSE.Ctrl),A
;!TEST mouse
LD A,#55
OUT (Z84.CTC.Ch_0),A
LD A,#2D ; <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 45 875000/<2F><>1*<2A><>2=1215
;LD A,#B6 ; <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 182 875000/<2F><>1*<2A><>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 SENSITIVE
; L - HORIZONTAL SENSITIVE
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,(PORT_MOUSE.Ctrl)
RRCA
RET NC
IN A,(PORT_MOUSE.Data)
LD L,A
BIT 6,A
CCF
RET Z
;[x] mouse freeeeezzzz
LD BC,#2000
;
TST_01: IN A,(PORT_MOUSE.Ctrl)
RRCA
;[x] mouse freeeeezzzz
JR C,.NXT
DEC BC
LD A,B
OR C
JR NZ,TST_01
RET
;JR NC,TST_01
;
.NXT: IN A,(PORT_MOUSE.Data)
LD E,A
BIT 6,A
CCF
RET NZ
;[x] mouse freeeeezzzz
LD BC,#2000
;
TST_02: IN A,(PORT_MOUSE.Ctrl)
RRCA
;[x] mouse freeeeezzzz
JR C,.NXT
DEC BC
LD A,B
OR C
JR NZ,TST_02
RET
;JR NC,TST_02
;
.NXT: IN A,(PORT_MOUSE.Data)
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 ; ????? <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> .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
;????? <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD> <20> <20><EFBFBD><E0A8A3><EFBFBD><EFBFBD><EFBFBD>?
;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 - <20><> <20><EFBFBD>?
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]