mirror of
https://github.com/Tolik-Trek/2D-Studio.git
synced 2026-06-15 01:21:33 +03:00
610 lines
7.5 KiB
NASM
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
|
|
|
|
|