SprinterFirmware/DOS/intmouse.asm
2024-05-27 11:03:22 +03:00

931 lines
12 KiB
NASM

;[BEGIN]
;//MODULE: INTMOUSE
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
CMOUSE EQU #1B
DMOUSE EQU #1A
Y_PORT EQU #89
VPAGE EQU #C9
; 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
DEC C
JP Z,MS_SHOW
DEC C
JP Z,MS_HIDD
DEC C
JP Z,MS_READ
DEC C
JP Z,MS_GOTO
DEC C
JP Z,MS_RESR ; TODO: JR?
DEC C
JR Z,MS_RESR
DEC C
JP Z,MS_VERT
DEC C
JP Z,MS_HORZ
DEC C
JP Z,MS_CURS
DEC C
JP Z,MS_MASK
DEC C
JP Z,MS_BCUR
DEC C
JR Z,MS_RESR
DEC C
JR Z,MS_RESR
DEC C
JP Z,MS_GSEN
DEC C
JP Z,MS_SENT
MS_RESR
LD A,1
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,1
SCF
RET
MS_INIT
DI
LD A,85
OUT (#10),A
LD A,45
OUT (#10),A
LD A,0
OUT (CMOUSE),A
LD A,1
OUT (CMOUSE),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
LD A,#47
OUT (CMOUSE),A
LD A,5
OUT (CMOUSE),A
LD A,#E0
OUT (CMOUSE),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
LD A,1
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
XOR A
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 (YHOT_SP),BC
EXX
LD A,(M_XSIZE)
LD C,A
LD B,0
LD A,(M_YSIZE)
LD L,B
LD H,B
MSCURS1
ADD HL,BC
DEC A
JR NZ,MSCURS1
PUSH HL
LD BC,MAXSIZM+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 L,B
LD H,B
MSBCUR1
ADD HL,BC
DEC A
JR NZ,MSBCUR1
PUSH HL
LD BC,MAXSIZM+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 HL,(M_XSIZE)
LD BC,(XHOT_SP)
LD E,C
LD BC,(YHOT_SP)
LD D,C
XOR A
LD C,A
LD B,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,(Y_PORT)
LD XH,A
IN A,(PAGE1)
LD XL,A
;
DI
;
LD A,#54
OUT (PAGE1),A
;
LD A,D
ADD A,A
ADD A,A ;Y * 4
LD L,A
LD H,#43 ;+ #4300
;
IN A,(VPAGE)
RRCA
AND #80
OR #01
ADD A,E
OUT (Y_PORT),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 (PAGE1),A
LD A,XH
OUT (Y_PORT),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,(Y_PORT)
LD XH,A
IN A,(PAGE1)
LD XL,A
;
DI
;
LD A,#50
OUT (PAGE1),A
;
LD A,D
ADD A,A
ADD A,A ;Y * 4
LD L,A
LD H,#43 ;+ #4300
;
IN A,(VPAGE)
RRCA
AND #80
OR #01
ADD A,E
OUT (Y_PORT),A
INC L
LD A,(HL) ;SIMBOL
LD (HL),A
INC L
LD A,(HL) ;ATTRIBUT
LD (HL),A
;
LD A,XL
OUT (PAGE1),A
LD A,XH
OUT (Y_PORT),A
RET
RESTORE
LD A,#00
BIT 7,A
JR Z,RESTORT
RESTORG
IN A,(PAGE3)
LD B,A
IN A,(Y_PORT)
LD C,A
PUSH BC
LD A,#50
OUT (PAGE3),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 ;PAGE 0
JR Z,AA2
LD DE,#C000+320 ;PAGE 1
AA2 ADD HL,DE
REST_A LD A,0
LD XH,A
EX AF,AF'
REST_H
RS002 LD BC,10
OUT (Y_PORT),A
EX AF,AF'
; PUSH HL
LD (PUSH_HL+1),HL
LD D,H
LD E,L
LDIR
PUSH_HL 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 (PAGE3),A
LD A,C
OUT (Y_PORT),A
XOR A
RET
;HL/DE - X/Y
MOUSE
LD A,(MODE)
LD (RESTORE+1),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,(PAGE3)
LD H,A
IN A,(Y_PORT)
LD L,A
EX (SP),HL
LD A,#5C
OUT (PAGE3),A
LD A,E
EX AF,AF'
IN A,(VPAGE)
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 (Y_PORT),A
EX AF,AF'
;USH 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 (PAGE3),A
LD A,C
OUT (Y_PORT),A
XOR A
RET
READ_M
LD A,(M_VAR_Y)
LD E,A
LD BC, 0xFFDF
IN A,(C)
LD (M_VAR_Y), A
LD (M_VAR_Y2), A
SUB E
NEG
LD D,A
LD A,(M_VAR_X)
LD E,A
LD B,0xfb
IN A,(C)
LD (M_VAR_X),A
LD (M_VAR_Y2),A
SUB E
LD E,A
LD B,0xfa
IN A,(C)
CPL
AND 0x7
LD (MB),A
LD A,(M_VAR_Y2)
OR A
RET Z
CALL SENSE
LD (MX),DE
XOR A
LD (M_VAR_Y2),A
SCF
RET
M_VAR_Y2 DB 0x00
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
JR 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),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
CP 0x81
JR Z,S320256
CP 0x82
JR Z,S640256
UNKMODE
XOR A
SCF
RET
S320256
LD DE,319
SET_HV
LD HL,0x0
CALL MS_HORZ
LD DE,0xff
JP MS_VERT
S640256
LD DE,639
JR SET_HV
;Mouse Interrupt
M_INT IN A,(PAGE3)
LD B,A
IN A,(Y_PORT)
LD C,A
PUSH BC
CALL REFRESH ;Refresh mouse
CALL CONTROL
POP BC
LD A,B
OUT (PAGE3),A
LD A,C
OUT (Y_PORT),A
RET
M_REFR CALL CONTROL
AND A
RET
CONTROL CALL READ_M
RET NC
CALL MCORECT
LD A,#00
LD (REDY+1),A
RET
REFRESH
LD A,#00
OR A
RET Z
REDY
LD A,#00
CALL RESTORE
LD HL,(PIX_X)
LD DE,(PIX_Y)
CALL MOUSE
LD A,#FF
LD (REDY+1),A
RET
MODE DB #03
PIX_X DW 160
PIX_Y DW 128
MX DB #00
MY DB #00
MB DB #00
MB_OLD DB #00
M_VAR_X DB 0
M_VAR_Y DB 0
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
X EQU #00
W EQU #FE
N EQU #FF
M_IMAGE
MS_BMP DB X,X,N,N,N,N,N,N,N,N
DB X,W,X,N,N,N,N,N,N,N
DB X,W,W,X,N,N,N,N,N,N
DB X,W,W,W,X,N,N,N,N,N
DB X,W,W,W,W,X,N,N,N,N
DB X,W,W,W,W,W,X,N,N,N
DB X,W,W,W,W,W,W,X,N,N
DB X,W,W,W,W,X,X,X,X,N
DB X,W,W,X,W,X,N,N,N,N
DB X,W,X,X,W,W,X,N,N,N
DB X,X,N,N,X,W,X,N,N,N
DB X,N,N,N,X,W,W,X,N,N
DB N,N,N,N,N,X,X,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DS 116
MAXSIZM EQU $-M_IMAGE
;//MODULE: INTMOUSE
;[END]