; LAST UPDATE: 20.04.2025 savelij ;[]----------------------------------------------------------[] ResFire: LD A,(MouseFlag) OR A RET Z RsFire1 CALL TestCMOS SPMOUSE MOUSEF.READ_STATE OR A RET Z JR RsFire1 ;[]----------------------------------------------------------[] ; Проверка координат мыши по таблице ; На вход: ; IX - Адрес таблицы TestCoords: CALL TestCMOS SPMOUSE MOUSEF.READ_STATE EX AF,AF' LD BC,0x0000 .PrvTabl EQU $-2 LD A,IXL CP C JR NZ,.L2 LD A,IXH CP B JR Z,.L3 .L2 LD (.PrvTabl),IX CALL ResMInvert LD BC,ResFire PUSH BC SUB A LD (RunFlag),A JR .L4 .L3 LD A,0x01 LD (RunFlag),A EX AF,AF' OR A JR NZ,.L4 PUSH HL LD BC,0x0000 .PrMousX EQU $-2 OR A SBC HL,BC POP HL JR NZ,.L4 EX DE,HL PUSH HL LD BC,0x0000 .PrMousY EQU $-2 OR A SBC HL,BC POP HL EX DE,HL RET Z .L4 LD (.PrMousX),HL LD (.PrMousY),DE CoordLp LD C,(IX+FORMTABL.XMINL) ; 00 LD B,(IX+FORMTABL.XMINH) ; 01 OR A SBC HL,BC ADD HL,BC JP C,NxtCrds LD C,(IX+FORMTABL.XMAXL) ; 02 LD B,(IX+FORMTABL.XMAXH) ; 03 SBC HL,BC ADD HL,BC JP NC,NxtCrds LD C,(IX+FORMTABL.YMINL) ; 04 LD B,(IX+FORMTABL.YMINH) ; 05 OR A EX DE,HL SBC HL,BC ADD HL,BC EX DE,HL JP C,NxtCrds LD C,(IX+FORMTABL.YMAXL) ; 06 LD B,(IX+FORMTABL.YMAXH) ; 07 EX DE,HL SBC HL,BC ADD HL,BC EX DE,HL JP NC,NxtCrds LD C,A LD A,(MouseFlag) OR A LD A,C JR Z,CoordL1 BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,SetSelect1 CoordL1 BIT FORMTABL.B_STATICINV,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,SetSelect2 LD C,0x00 RunFlag EQU $-1 DEC C JP NZ,NxtCrds1 LD C,A LD A,(MouseFlag) OR A RET Z LD A,C OR A ; нет огня JR Z,Execute1 BIT 0,A JR Z,Execute2 BIT FORMTABL.B_BUTTON,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,PushButton CCF RET NC OR A BIT FORMTABL.B_WORKBUTTON,(IX+FORMTABL.FLAGL) ; 08 ; рабочая кнопка RET NZ LD C,(IX+FORMTABL.FIRELEFTL) ; 0C ; запуск по левой кнопке LD B,(IX+FORMTABL.FIRELEFTH) ; 0D LD A,B OR C JP Z,NxtCrds1 BIT FORMTABL.B_EXECNORETLMB,(IX+FORMTABL.FLAGL) ; 08 ; запуск без возврата JR Z,.L1 POP AF .L1 PUSH BC BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,ResSelect1 CALL ResSelect2 OR A BIT FORMTABL.B_CLOSEWIN,(IX+FORMTABL.FLAGH) ; 09 RET Z WINDOWCLOSE RET Execute1 LD C,(IX+FORMTABL.FIRENOL) ; 0A ; запуск без огня LD B,(IX+FORMTABL.FIRENOH) ; 0B LD A,B OR C JR Z,NxtCrds1 BIT FORMTABL.B_EXECONLY,(IX+FORMTABL.FLAGL) ; 08 ; запуск без возврата JR Z,.L1 POP AF .L1 PUSH BC BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,ResSelect1 CALL ResSelect2 OR A BIT FORMTABL.B_EXECNOPRESS,(IX+FORMTABL.FLAGL) ; 08 RET Z WINDOWCLOSE RET Execute2 LD C,(IX+FORMTABL.FIRERIGHTL) ; 0E ; запуск по правой кнопке LD B,(IX+FORMTABL.FIRERIGHTH) ; 0F LD A,B OR C JR Z,NxtCrds1 BIT FORMTABL.B_EXECNORETRMB,(IX+FORMTABL.FLAGL) ; 08 ; запуск без возврата JR Z,.L1 POP AF .L1 PUSH BC BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,ResSelect1 CALL ResSelect2 OR A BIT FORMTABL.B_WORKBUTTON,(IX+FORMTABL.FLAGH) ; 09 RET Z WINDOWCLOSE RET NxtCrds LD C,A LD A,(MouseFlag) OR A LD A,C JR Z,NxtCrds0 BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,ResSelect1 NxtCrds0 BIT FORMTABL.B_STATICINV,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,SetSelect2 NxtCrds1 LD BC,FORMTABL.SIZE;0x0010 ADD IX,BC BIT FORMTABL.B_ENDTABL,(IX+FORMTABL.XMINH) ; конец таблицы? JP Z,CoordLp OR A RET ResMInvert PUSH IX PUSH HL PUSH DE PUSH AF LD BC,FORMTABL.SIZE;0x0010 ResCrds RES FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 RES 6,(IX+FORMTABL.FLAGH) ; 09 ADD IX,BC BIT FORMTABL.B_ENDTABL,(IX+FORMTABL.XMINH) JR Z,ResCrds POP AF POP DE POP HL POP IX RET SetSelect1 BIT FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 RET NZ SET FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 PUSH AF PUSH HL PUSH DE PUSH IX LD L,(IX+FORMTABL.XMINL) ; 00 LD H,(IX+FORMTABL.XMINH) ; 01 LD C,(IX+FORMTABL.YMINL) ; 04 LD B,(IX+FORMTABL.YMINH) ; 05 LD A,(IX+FORMTABL.XMAXL) ; 02 SUB (IX+FORMTABL.XMINL) ; 00 EX AF,AF' LD A,(IX+FORMTABL.YMAXL) ; 06 SUB (IX+FORMTABL.YMINL) ; 04 LD IXH,A EX AF,AF' SRL A LD IXL,A LD DE,(COLORP.HIGHGRAY + COLORI.BLACK) << 8 | (COLORP.BLUE + COLORI.WHITE);0x804F CALL InvertRectan POP IX PUSH IX NxCrds1 LD BC,FORMTABL.SIZE;0x0010 ADD IX,BC BIT FORMTABL.B_ENDTABL,(IX+FORMTABL.XMINH) ; 01 ; проверка конца таблицы? JR NZ,NxCrds2 BIT FORMTABL.B_INV1,(IX+FORMTABL.FLAGL) ; 08 CALL NZ,ResSelect1 JR NxCrds1 NxCrds2 POP IX POP DE POP HL POP AF RET ResSelect1 BIT FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 RET Z RES FORMTABL.B_FIRENOINV,(IX+FORMTABL.FLAGH) ; 09 PUSH IX PUSH HL PUSH DE LD L,(IX+FORMTABL.XMINL) ; 00 LD H,(IX+FORMTABL.XMINH) ; 01 LD C,(IX+FORMTABL.YMINL) ; 04 LD B,(IX+FORMTABL.YMINH) ; 05 LD A,(IX+FORMTABL.XMAXL) ; 02 SUB (IX+FORMTABL.XMINL) ; 00 EX AF,AF' LD A,(IX+FORMTABL.YMAXL) ; 06 SUB (IX+FORMTABL.YMINL) ; 04 LD IXH,A EX AF,AF' SRL A LD IXL,A LD DE,(COLORP.BLUE + COLORI.WHITE) << 8 | (COLORP.HIGHGRAY + COLORI.BLACK);0x4F80 CALL InvertRectan POP DE POP HL POP IX RET SetSelect2 BIT 6,(IX+FORMTABL.FLAGH) ; 09 RET NZ SET 6,(IX+FORMTABL.FLAGH) ; 09 PUSH IX PUSH HL PUSH DE PUSH AF LD L,(IX+FORMTABL.XMINL) ; 00 LD H,(IX+FORMTABL.XMINH) ; 01 LD C,(IX+FORMTABL.YMINL) ; 04 LD B,(IX+FORMTABL.YMINH) ; 05 LD A,(IX+FORMTABL.XMAXL) ; 02 SUB (IX+FORMTABL.XMINL) ; 00 EX AF,AF' LD A,(IX+FORMTABL.YMAXL) ; 06 SUB (IX+FORMTABL.YMINL) ; 04 LD IXH,A EX AF,AF' SRL A LD IXL,A LD DE,(COLORP.HIGHGRAY + COLORI.BLACK) << 8 | (COLORP.BLUE + COLORI.WHITE);0x804F CALL InvertRectan POP AF POP DE POP HL POP IX RET ResSelect2 PUSH HL PUSH DE PUSH IX LD IX,(TestCoords.PrvTabl) LD BC,FORMTABL.SIZE;0x0010 NxCrds3 BIT FORMTABL.B_STATICINV,(IX+FORMTABL.FLAGL) ; 08 JR NZ,ResSel22 ADD IX,BC BIT FORMTABL.B_ENDTABL,(IX+FORMTABL.XMINH) ; 01 ; проверка конца таблицы? JR NZ,ResSel2E JR NxCrds3 ResSel22 BIT 6,(IX+FORMTABL.FLAGH) ; 09 JR Z,ResSel2E RES 6,(IX+FORMTABL.FLAGH) ; 09 LD L,(IX+FORMTABL.XMINL) ; 00 LD H,(IX+FORMTABL.XMINH) ; 01 LD C,(IX+FORMTABL.YMINL) ; 04 LD B,(IX+FORMTABL.YMINH) ; 05 LD A,(IX+FORMTABL.XMAXL) ; 02 SUB (IX+FORMTABL.XMINL) ; 00 EX AF,AF' LD A,(IX+FORMTABL.YMAXL) ; 06 SUB (IX+FORMTABL.YMINL) ; 04 LD IXH,A EX AF,AF' SRL A LD IXL,A LD DE,(COLORP.BLUE + COLORI.WHITE) << 8 | (COLORP.HIGHGRAY + COLORI.BLACK);0x4F80 CALL InvertRectan ResSel2E POP IX POP DE POP HL RET PushButton PUSH HL PUSH DE LD L,(IX+FORMTABL.XMINL) ; 00 LD H,(IX+FORMTABL.XMINH) ; 01 LD E,(IX+FORMTABL.YMINL) ; 04 LD D,(IX+FORMTABL.YMINH) ; 05 LD A,(IX+FORMTABL.XMAXL) ; 02 SUB (IX+FORMTABL.XMINL) ; 00 LD C,A LD A,(IX+FORMTABL.YMAXL) ; 06 SUB (IX+FORMTABL.YMINL) ; 04 LD B,A PUSH HL PUSH DE PUSH BC CALL PutPushBut LD A,0x0A LD (PausePh+1),A PushLp PUSH IX CALL TestRun POP IX PushLp1 SPMOUSE MOUSEF.READ_STATE OR A JR Z,PushButtEx BIT 0,A JR Z,PushButtEx LD C,(IX+FORMTABL.XMINL) ; 00 LD B,(IX+FORMTABL.XMINH) ; 01 OR A SBC HL,BC ADD HL,BC JR C,PushButtEx LD C,(IX+FORMTABL.XMAXL) ; 02 LD B,(IX+FORMTABL.XMAXH) ; 03 SBC HL,BC ADD HL,BC CCF JR C,PushButtEx EX DE,HL LD C,(IX+FORMTABL.YMINL) ; 04 LD B,(IX+FORMTABL.YMINH) ; 05 OR A SBC HL,BC ADD HL,BC JR C,PushButtEx LD C,(IX+FORMTABL.YMAXL) ; 06 LD B,(IX+FORMTABL.YMAXH) ; 07 SBC HL,BC CCF JR C,PushButtEx PausePh LD A,0x00 OR A JR Z,PushLp DEC A LD (PausePh+1),A HALT JR PushLp1 PushButtEx POP BC POP DE POP HL PUSH AF CALL PutPopBut POP AF POP DE POP HL RET TestRun BIT FORMTABL.B_WORKBUTTON,(IX+FORMTABL.FLAGL) ; 08 RET Z LD C,(IX+FORMTABL.FIRELEFTL) ; 0C LD B,(IX+FORMTABL.FIRELEFTH) ; 0D PUSH BC RET PutPushBut LD A,COLORP.WHITE | COLORI.BLACKGRAY;0xF7 JR PutButt PutPopBut LD A,COLORP.BLACKGRAY | COLORI.WHITE;0x7F PutButt PUSH IY EX AF,AF' GETPORT WINSP.CPU1 PUSH AF SETPORT WINSP.CPU1,0x50 GETPORT WINSP.Y_PORT PUSH AF SRL H RR L SET 6,H LD IYL,E SRL C DEC C DEC C LD A,C LD (ButLen3),A LD A,B SUB 0x02 LD (ButLen1),A LD (ButLen2),A ADD A,IYL INC A LD IYH,A EX AF,AF' PUSH AF AND 0xF0 LD E,A RRCA RRCA RRCA RRCA OR E LD D,A POP AF AND 0x0F LD E,A RLCA RLCA RLCA RLCA OR E LD E,A DI LD A,IYL SETPORT WINSP.Y_PORT,,0 LD (HL),E INC A SETPORT WINSP.Y_PORT,,0 ACCEL ACCELCMD.SET_BUFFER LD A,0x00 ButLen1 EQU $-1 ACCEL ACCELCMD.FILL_VERT LD (HL),E ACCEL ACCELCMD.OFF LD (HL),E INC HL ACCEL ACCELCMD.SET_BUFFER LD A,0x00 ButLen3 EQU $-1 ACCEL ACCELCMD.OFF LD A,IYL SETPORT WINSP.Y_PORT,,0 ACCEL ACCELCMD.FILL LD (HL),E ACCEL ACCELCMD.OFF LD A,IYH SETPORT WINSP.Y_PORT,,0 ACCEL ACCELCMD.FILL LD (HL),D ACCEL ACCELCMD.OFF LD B,0x00 ADD HL,BC LD A,IYL SETPORT WINSP.Y_PORT,,0 LD (HL),D INC A SETPORT WINSP.Y_PORT,,0 ACCEL ACCELCMD.SET_BUFFER LD A,0x00 ButLen2 EQU $-1 ACCEL ACCELCMD.FILL_VERT LD (HL),D ACCEL ACCELCMD.OFF LD (HL),D EI POP AF SETPORT WINSP.Y_PORT,,0 POP AF SETPORT WINSP.CPU1,,0 POP IY RET