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

610 lines
7.5 KiB
NASM

P_M_OBJ DW #FFFF
P_L_OBJ DW #FFFF
WAITMOD DB #00
P_MOUSE DB #00
; HL - OBJECT
; A - MESSAGE
; 1 - ACTIVE
; 2 - DEACTIVE
; 3 - PRESS LEFT
; 4 - UNPRESS LEFT
; 5 - DRAG
; 6 - DROP
; 7 - PRESS RIGHT
; 8 - UNPRESS RIGHT
WAITMSG LD C,5
CALL INTMOUS
JP C,CLIKMSG
CALL OBJECT
EX DE,HL
LD HL,(P_M_OBJ)
AND A
SBC HL,DE
EX DE,HL
CALL NZ,NEWMOBJ
CALL LOBJECT
EX DE,HL
LD HL,(P_L_OBJ)
AND A
SBC HL,DE
JP Z,WAITMSG
PUSH DE
LD C,3
CALL INTMOUS
POP DE
OR A
JP Z,NONPRES
CP 1
JP Z,LFTPRES
CP 2
JP Z,NONPRES
CP 3
JP Z,LFTPRES
LFTPRES LD HL,(P_L_OBJ)
LD A,(WAITMOD)
XOR #FF
LD (WAITMOD),A
LD A,5
RET Z
EX DE,HL
LD (P_L_OBJ),HL
LD A,6
AND A
RET
NONPRES LD HL,(P_L_OBJ)
LD A,(WAITMOD)
XOR #FF
LD (WAITMOD),A
LD A,2
RET Z
EX DE,HL
LD (P_L_OBJ),HL
LD A,1
AND A
RET
CLIKMSG PUSH AF
PUSH HL
PUSH DE
CALL GOBJ
EX DE,HL
LD HL,(P_M_OBJ)
AND A
SBC HL,DE
EX DE,HL
JP Z,CLIKMS2
CALL NEWMOBJ
POP DE
POP HL
POP AF
SCF
RET
CLIKMS2 POP DE
POP HL
CALL LOBJ
LD A,(P_MOUSE)
LD C,A
POP AF
LD (P_MOUSE),A
OR A
JP Z,RESPRES
CP 1
JP Z,FRIPRES
CP 2
JP Z,SECPRES
CP 3
JP Z,DUUPRES
DUUPRES LD A,C
AND 1
LD A,3
RET Z
LD A,7
RET
RESPRES LD A,C
AND 1
LD A,4
RET NZ
LD A,8
RET
FRIPRES LD A,C
AND 1
LD A,3
RET Z
LD A,8
RET
SECPRES LD A,C
AND 2
LD A,7
RET Z
LD A,4
RET
RE_MOBJ CALL NEWMOBJ
SCF
RET
NEWMOBJ LD (P_M_OBJ),HL
LD DE,LOBJADR
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
; LD (LOBJ_T),HL
; LD (LOBJ_SZ),BC
RET
;LOCAL OBJECT DETECTER
; INPUT: NONE
;OUTPUT:
; NC; HL - OBJECT ID
; C; ERROR
LOBJ PUSH IX
PUSH HL
PUSH DE
JP LOBJC
LOBJECT PUSH IX
LD C,3
CALL INTMOUS
PUSH HL
PUSH DE
LOBJC LD IX,(LOBJ_T) ;CURRENT LOCAL OBJECT TABLE
POP HL ;Y MOUSE COORD
LD DE,(WIN_Y)
AND A
SBC HL,DE
EX DE,HL
POP HL ;X MOUSE COORD
LD BC,(WIN_X)
AND A
SBC HL,BC
LD B,H
LD C,L
LOBJ_AG LD L,(IX+2)
LD H,(IX+3) ;OBJECT X-MIN
AND A
SBC HL,BC
JP Z,OBJXYEP
JP NC,LOBJ_NN
LD L,(IX+4)
LD H,(IX+5) ;OBJECT X-MAX
AND A
SBC HL,BC
JP C,LOBJ_NN
LOBJXEP LD L,(IX+6)
LD H,(IX+7) ;OBJECT Y-MIN
AND A
SBC HL,DE
JP Z,LOBJ_EP
JP NC,LOBJ_NN
LD L,(IX+8)
LD H,(IX+9) ;OBJECT Y-MAX
AND A
SBC HL,DE
JP C,LOBJ_NN
LOBJ_EP LD L,(IX+0) ;OBJECT ID
LD H,(IX+1)
POP IX
AND A
RET
LOBJ_NN EX DE,HL ;NEXT OBJECT
LD DE,10
ADD IX,DE
EX DE,HL
LD A,(IX+1) ;END MARKER?
INC A
JP NZ,LOBJ_AG
LD A,(IX+0) ;END MARKER?
INC A
JP NZ,LOBJ_AG
POP IX
SCF
RET
;LOCAL OBJECT CONSTRUCTOR
; INPUT:
; DE/BC - X-MIN/X-MAX
; DE'/BC' - Y-MIN/Y-MAX
; HL - OBJECT ID
LCONST EXX
PUSH IX
PUSH DE
PUSH BC
LD HL,(LOBJ_T)
LD BC,(LOBJ_SZ)
ADD HL,BC
DEC HL
LD D,H
LD E,L
LD BC,10
ADD HL,BC
EX DE,HL
LD BC,(LOBJ_SZ)
LDDR
POP BC
POP DE
EXX
LD IX,(LOBJ_T)
LD (IX+0),L
LD (IX+1),H
LD (IX+2),E
LD (IX+3),D
LD (IX+4),C
LD (IX+5),B
EXX
LD (IX+6),E
LD (IX+7),D
LD (IX+8),C
LD (IX+9),B
EXX
LD HL,(LOBJ_SZ)
LD BC,10
ADD HL,BC
LD (LOBJ_SZ),HL
POP IX
AND A
RET
;LOCAL OBJECT DESTRUCTOR
; INPUT:
; HL - OBJECT ID
;OUTPUT:
; NC - OBJECT DESTROYED
; C - OBJECT ABSENT
LDESTR EX DE,HL
PUSH IX
LD IX,(LOBJ_T)
LD A,(IX+1) ;END MARKER?
INC A
JP NZ,LDESTR0
LD A,(IX+0) ;END MARKER?
INC A
JP NZ,LDESTR0
POP IX
SCF
RET
LDESTR0 LD L,(IX+0)
LD H,(IX+1)
AND A
SBC HL,DE
JP NZ,LDESTR1
LD D,XH
LD E,XL
LD H,D
LD L,E
LD BC,10
ADD HL,BC
EXX
LD HL,(LOBJ_T)
LD DE,(LOBJ_SZ)
ADD HL,DE
LD D,XH
LD E,XL
AND A
SBC HL,DE
PUSH HL
EXX
POP BC
LDIR
LD HL,(LOBJ_SZ)
LD BC,10
AND A
SBC HL,BC
LD (LOBJ_SZ),HL
POP IX
AND A
RET
LDESTR1 LD BC,10
ADD IX,BC
LD A,(IX+1) ;END MARKER?
INC A
JP NZ,LDESTR0
LD A,(IX+0) ;END MARKER?
INC A
JP NZ,LDESTR0
POP IX
SCF
RET
;GLOBAL OBJECT DETECTER
; INPUT: NONE
;OUTPUT:
; NC; HL - OBJECT ID
; C; ERROR
GOBJ PUSH IX
PUSH HL
JP GOBJC
OBJECT PUSH IX
LD C,3
CALL INTMOUS
PUSH HL
GOBJC POP BC
LD IX,OBJ_TAB ;OBJECT TABLE
OBJ_CNT LD L,(IX+2)
LD H,(IX+3) ;OBJECT X-MIN
AND A
SBC HL,BC
JP Z,OBJXYEP
JP NC,OBJ_NON
LD L,(IX+4)
LD H,(IX+5) ;OBJECT X-MAX
AND A
SBC HL,BC
JP C,OBJ_NON
OBJXYEP LD L,(IX+6)
LD H,(IX+7) ;OBJECT Y-MIN
AND A
SBC HL,DE
JP Z,OBJ_YEP
JP NC,OBJ_NON
LD L,(IX+8)
LD H,(IX+9) ;OBJECT Y-MAX
AND A
SBC HL,DE
JP C,OBJ_NON
OBJ_YEP LD L,(IX+0) ;OBJECT ID
LD H,(IX+1)
POP IX
AND A
RET
OBJ_NON EX DE,HL ;NEXT OBJECT
LD DE,10
ADD IX,DE
EX DE,HL
LD A,(IX+1) ;END MARKER?
INC A
JP NZ,OBJ_CNT
LD A,(IX+0) ;END MARKER?
INC A
JP NZ,OBJ_CNT
POP IX
SCF
RET
_HLX DW #0000
_DEX DW #0000
_BCX DW #0000
_HL DW #0000
_DE DW #0000
_BC DW #0000
STACKR1
SAVERG LD A,R
DI
LD (SAVESP+1),SP
LD SP,STACKR1
PUSH BC
PUSH DE
PUSH HL
EXX
PUSH BC
PUSH DE
PUSH HL
EXX
SAVESP LD SP,#0000
RET PO
EI
RET
RESTRG LD A,R
DI
LD (RESTSP+1),SP
LD SP,_HLX
EXX
POP HL
POP DE
POP BC
EXX
POP HL
POP DE
POP BC
RESTSP LD SP,#0000
RET PO
EI
RET
;INPUT:
; HL/DE - X/Y
; BC - WIDTH
; BC' - HEIGH
;OUTPUT:
; DE/BC - X-MIN/X-MAX
;DE'/BC' - Y-MIN/Y-MAX
OPTIMIZ PUSH DE
LD D,H
LD E,L
ADD HL,BC
LD B,H
LD C,L
EXX
POP HL
LD D,H
LD E,L
ADD HL,BC
LD B,H
LD C,L
EXX
RET
;GLOBAL OBJECT CONSTRUCTOR
; INPUT:
; DE/BC - X-MIN/X-MAX
;DE'/BC' - Y-MIN/Y-MAX
; HL - OBJECT ID
CONST EXX
PUSH IX
PUSH DE
PUSH BC
LD HL,OBJ_TAB
LD BC,(SZ_OBJ)
ADD HL,BC
DEC HL
LD D,H
LD E,L
LD BC,10
ADD HL,BC
EX DE,HL
LD BC,(SZ_OBJ)
LDDR
POP BC
POP DE
EXX
LD IX,OBJ_TAB
LD (IX+0),L
LD (IX+1),H
LD (IX+2),E
LD (IX+3),D
LD (IX+4),C
LD (IX+5),B
EXX
LD (IX+6),E
LD (IX+7),D
LD (IX+8),C
LD (IX+9),B
LD HL,(SZ_OBJ)
LD BC,10
ADD HL,BC
LD (SZ_OBJ),HL
EXX
LD DE,LOBJADR
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD DE,LOBJTAB
LD BC,10
; LD (HL),E
INC HL
; LD (HL),D
INC HL
; LD (HL),C
INC HL
; LD (HL),B
POP IX
AND A
RET
;GLOBAL OBJECT DESTRUCTOR
; INPUT:
; HL - OBJECT ID
;OUTPUT:
; NC - OBJECT DESTROYED
; C - OBJECT ABSENT
DESTR EX DE,HL
PUSH IX
LD IX,OBJ_TAB
LD A,(IX+1) ;END MARKER?
INC A
JP NZ,DESTR0
LD A,(IX+0) ;END MARKER?
INC A
JP NZ,DESTR0
POP IX
SCF
RET
DESTR0 LD L,(IX+0)
LD H,(IX+1)
AND A
SBC HL,DE
JP NZ,DESTR1
LD D,XH
LD E,XL
LD H,D
LD L,E
LD BC,10
ADD HL,BC
EXX
LD HL,OBJ_TAB
LD DE,(SZ_OBJ)
ADD HL,DE
LD D,XH
LD E,XL
AND A
SBC HL,DE
PUSH HL
EXX
POP BC
LDIR
LD HL,(SZ_OBJ)
LD BC,10
AND A
SBC HL,BC
LD (SZ_OBJ),HL
POP IX
AND A
RET
DESTR1 LD BC,10
ADD IX,BC
LD A,(IX+1) ;END MARKER?
INC A
JP NZ,DESTR0
LD A,(IX+0) ;END MARKER?
INC A
JP NZ,DESTR0
POP IX
SCF
RET
WIN_X DW 0
WIN_Y DW 0
LOBJ_T DW LOBJTAB
LOBJ_SZ DW 10
NN_OBJ DW 0
SZ_OBJ DW 10
LOBJADR DW LOBJTAB,10,LOBJTAB,10,LOBJTAB,10
DS 512
; WORD #FEFF ;OBJECT ID
; WORDS 0,320 ;X-MIN -- X-MAX
; WORDS 0,256 ;Y-MIN -- Y-MAX
OBJ_TAB DW #FFFF ;END MARKER
DW #FFFF,#FFFF ;END MARKER
DW #FFFF,#FFFF ;END MARKER
DS 246
; WORD #FEFF ;OBJECT ID
; WORDS 0,320 ;X-MIN -- X-MAX
; WORDS 0,256 ;Y-MIN -- Y-MAX
LOBJTAB DW #FFFF ;END MARKER
DW #FFFF,#FFFF ;END MARKER
DW #FFFF,#FFFF ;END MARKER
DS 2038