2D-Studio/INTERFACE/INTMOUSE.ASM
2025-07-11 00:23:19 +10:00

667 lines
9.6 KiB
NASM

;[BEGIN]
CMOUSE EQU #1B
DMOUSE EQU #1A
VSIZEX EQU 320
VSIZEY EQU 256
X EQU #EE
W EQU #EF
N EQU #FF
; 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 (GET CLICK FROM BUFFER)
;
; RETURN: NC - BUFFER EMPTY
; C - CLICK
; HL - X COORD
; DE - Y COORD
; A - BUTTONS
;---------------------------------------------
; COMMAND 06h (SELECT CURSOR)
;
; INPUT: A - CURSOR NUMBER
;---------------------------------------------
; ERRORS: 0 - NO ERROR
; 1 - COMMAND NOT PRESENT
; 2 - DEVICE ABSENT
; 3 - CURSOR ON (UZHE)
; 4 - CURSOR OFF (UZHE)
INTMOUS INC C
DEC C
JP 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_CLIK
DEC C
JP Z,MS_CURS
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,#60
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
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_CLIK CALL GCLICK
LD H,B
LD L,C
RET
MS_CURS LD HL,MS_BMP
INC A
LD D,H
LD E,L
LD BC,140
MS_CUR2 ADD HL,BC
DEC A
JP NZ,MS_CUR2
DI
LDIR
EI
XOR A
RET
RESTORE IN A,(PAGE1)
LD B,A
IN A,(Y_PORT)
LD C,A
PUSH BC
LD A,#50
OUT (PAGE1),A
REST_X LD HL,0
REST_Y LD DE,0
REST_H LD BC,0
LD A,E
EX AF,AF'
LD DE,#4040
ADD HL,DE
LD XH,14
EX AF,AF'
RS002 LD BC,10
OUT (Y_PORT),A
EX AF,AF'
PUSH HL
LD D,H
LD E,L
LDIR
POP HL
DEC XH
JR Z,RS003
EX AF,AF'
INC A
JP NZ,RS002
RS003 POP BC
LD A,B
OUT (PAGE1),A
LD A,C
OUT (Y_PORT),A
XOR A
RET
;HL/DE - X/Y
; B - WIDTH
; C - HEIGHT
MOUSE LD (REST_X+1),HL
LD (REST_Y+1),DE
LD (REST_H+1),BC
PUSH HL
IN A,(PAGE1)
LD H,A
IN A,(Y_PORT)
LD L,A
EX (SP),HL
LD A,#5C
OUT (PAGE1),A
LD A,E
EX AF,AF'
LD DE,#4040
ADD HL,DE
LD DE,MS_BMP
EX DE,HL
LD XH,14
EX AF,AF'
MS002 LD BC,10
OUT (Y_PORT),A
EX AF,AF'
MS001 PUSH DE
LDIR
POP DE
MS004 DEC XH
JR Z,MS003
EX AF,AF'
INC A
JP NZ,MS002
MS003 POP BC
LD A,B
OUT (PAGE1),A
LD A,C
OUT (Y_PORT),A
XOR A
RET
READ_M IN A,(CMOUSE)
RRCA
RET NC
IN A,(DMOUSE)
LD L,A
BIT 6,A
CCF
RET Z
TST_01 IN A,(CMOUSE)
RRCA
JP NC,TST_01
IN A,(DMOUSE)
LD E,A
BIT 6,A
CCF
RET NZ
TST_02 IN A,(CMOUSE)
RRCA
JP NC,TST_02
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
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
JP NZ,DECX
ADD HL,DE
LD (PIX_X),HL
EX DE,HL
LD HL,VSIZEX-1
AND A
SBC HL,DE
JP NC,YCOO
LD HL,VSIZEX-1
LD (PIX_X),HL
JP YCOO
DECX LD A,E
NEG
LD E,A
AND A
SBC HL,DE
LD (PIX_X),HL
JP NC,YCOO
LD HL,0
LD (PIX_X),HL
YCOO LD HL,(PIX_Y)
LD DE,(MY)
LD D,0
BIT 7,E
JP NZ,DECY
ADD HL,DE
LD (PIX_Y),HL
EX DE,HL
LD HL,VSIZEY-1
AND A
SBC HL,DE
RET NC
LD HL,VSIZEY-1
LD (PIX_Y),HL
RET
DECY LD A,E
NEG
LD E,A
AND A
SBC HL,DE
LD (PIX_Y),HL
RET NC
LD HL,0
LD (PIX_Y),HL
RET
INTON DI
LD HL,INT_
LD (INTA*256+#FF),HL
LD A,INTA
LD I,A
IM 2
EI
RET
INTOFF DI
LD A,#3F
LD I,A
IM 1
EI
RET
;Main Interrupt
INT_ PUSH IY
PUSH IX
PUSH HL
PUSH DE
PUSH BC
PUSH AF
EX AF,AF'
EXX
PUSH HL
PUSH DE
PUSH BC
PUSH AF
IN A,(PAGE1)
LD B,A
IN A,(Y_PORT)
LD C,A
PUSH BC
CALL REFRESH ;Refresh mouse
CALL CONTROL
LD A,5 ;SPECTRUM
OUT (PAGE1),A ;
LD A,#C0 ;INTERRUPT
OUT (Y_PORT),A ;
LD IY,#5C3A ;!!!!!!!!!
CALL #0038 ;
DI
POP BC
LD A,B
OUT (PAGE1),A
LD A,C
OUT (Y_PORT),A
POP AF
POP BC
POP DE
POP HL
EXX
EX AF,AF'
POP AF
POP BC
POP DE
POP HL
POP IX
POP IY
EI
RETI
CONTROL CALL READ_M
RET NC
CALL MCORECT
LD A,#00
LD (REDY+1),A
LD HL,MB_OLD
LD A,(MB)
CP (HL)
RET Z
LD (MB_OLD),A
EX AF,AF'
LD A,(CLICKS)
CP 50
RET Z
LD E,A
ADD A,A
ADD A,A
ADD A,E
LD E,A
LD D,0
LD HL,CLICK_B
ADD HL,DE
LD BC,(PIX_X)
LD DE,(PIX_Y)
EX AF,AF'
LD (HL),A
INC HL
LD (HL),C
INC HL
LD (HL),B
INC HL
LD (HL),E
INC HL
LD (HL),D
LD A,(CLICKS)
INC A
LD (CLICKS),A
RET
GCLICK LD A,(CLICKS)
OR A
RET Z
DEC A
LD (CLICKS),A
LD HL,CLICK_B
LD A,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
EXX
LD HL,CLICK_B-5
LD DE,CLICK_B
LD BC,245
LDIR
EXX
SCF
RET
REFRESH LD A,#01
OR A
RET NZ
REDY LD A,#00
; OR A
; RET NZ
CALL RESTORE
LD HL,(PIX_X)
LD DE,(PIX_Y)
CALL MOUSE
LD A,#FF
LD (REDY+1),A
RET
PIX_X DW 160
PIX_Y DW 128
MX DB #00
MY DB #00
MB DB #00
MB_OLD DB #00
CLICKS DB #00
CLICK_B DS 250
MS_BMP DS 140
CURSOR1 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
CURSOR2 DB N,N,X,X,X,X,N,N,N,N
DB N,X,W,W,W,W,X,N,N,N
DB X,W,N,X,X,N,N,X,N,N
DB X,W,X,N,N,N,N,X,N,N
DB X,W,X,N,N,N,N,X,N,N
DB X,W,N,N,N,N,N,X,N,N
DB N,X,N,N,N,N,X,X,N,N
DB N,N,X,X,X,X,X,W,X,N
DB N,N,N,N,N,N,N,X,W,X
DB N,N,N,N,N,N,N,N,X,X
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
CURSOR3 DB X,N,N,N,N,N,N,N,N,N
DB N,X,X,N,N,N,N,N,N,N
DB N,X,W,X,X,N,N,N,N,N
DB N,N,X,X,W,X,N,N,N,N
DB N,N,X,W,X,W,X,N,N,N
DB N,N,N,X,W,X,W,X,N,N
DB N,N,N,N,X,W,X,W,X,N
DB N,N,N,N,N,X,W,X,W,X
DB N,N,N,N,N,N,X,W,X,N
DB N,N,N,N,N,N,N,X,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
CURSOR4 DB X,N,N,N,N,N,N,N,N,N
DB N,X,X,N,N,N,N,N,N,N
DB N,X,W,X,X,N,N,N,N,N
DB N,N,X,X,W,X,N,N,N,N
DB N,N,X,W,X,W,X,N,N,N
DB N,N,N,X,W,X,W,X,N,N
DB N,N,N,N,X,W,X,W,X,N
DB N,N,N,N,N,X,W,X,W,X
DB N,N,N,N,N,N,X,W,X,N
DB N,N,N,N,N,N,N,X,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
CURSOR5 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,X,X,X,X,N,N,N
DB X,W,X,W,X,N,N,N,N,N
DB X,X,N,X,W,X,N,N,N,N
DB X,N,N,N,X,X,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
CURSOR6 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,X,X,X,X,N,N,N
DB X,W,X,W,X,N,N,N,N,N
DB X,X,N,X,W,X,N,N,N,N
DB X,N,N,N,X,X,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
CURSOR7 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,X,X,X,X,N,N,N
DB X,W,X,W,X,N,N,N,N,N
DB X,X,N,X,W,X,N,N,N,N
DB X,N,N,N,X,X,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
DB N,N,N,N,N,N,N,N,N,N
CURSOR8 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
CURSOR9 DB X,X,X,X,X,X,X,X,X,N
DB N,X,X,X,X,X,X,X,N,N
DB N,X,W,W,W,W,W,X,N,N
DB N,X,W,X,W,X,W,X,N,N
DB N,X,W,W,X,W,W,X,N,N
DB N,N,X,W,W,W,X,N,N,N
DB N,N,N,X,W,X,N,N,N,N
DB N,N,N,X,W,X,N,N,N,N
DB N,N,X,W,W,W,X,N,N,N
DB N,X,W,W,W,W,W,X,N,N
DB N,X,W,W,X,W,W,X,N,N
DB N,X,W,X,W,X,W,X,N,N
DB N,X,X,X,X,X,X,X,N,N
DB X,X,X,X,X,X,X,X,X,N