From 63c527ace86d110eddc81d643d562654dfa83427 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 15 Mar 2024 00:38:21 +1000 Subject: [PATCH] =?UTF-8?q?-bug:=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=87=D1=83=D0=B2=D1=81=D1=82=D0=B2=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BC=D1=8B=D1=88=D0=BA?= =?UTF-8?q?=D0=B8=20MS=5FSENT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/DRV-MAIN.ASM | 32 ++++++ DSS/DSS-MAIN.ASM | 2 - DSS/INTMOUSE.ASM | 253 ++++++++++++++++++++++++++++++----------------- DSS/KEYINTER.ASM | 57 ++++++++--- DSS/build.txt | 2 +- DSS/defines.inc | 4 +- 6 files changed, 239 insertions(+), 111 deletions(-) diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 1f9355b..54a491d 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -154,6 +154,38 @@ A0038: ; ; POP AF ; ; EX AF,AF' ; ; POP AF ; + ;!TEST SIO INT + ; reg 0 - error reset + IF KEYBOARD_INT_ENABLED && MOUSE_INT_ENABLED == 0 + PUSH AF + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 0 - return from int + LD A,%0011'1000 + OUT (Z84.SIO.Ch_A.Ctrl),A + POP AF + ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED == 0 + PUSH AF + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_B.Ctrl),A + ; reg 0 - return from int + LD A,%0011'1000 + OUT (Z84.SIO.Ch_B.Ctrl),A + POP AF + ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED + PUSH AF + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_A.Ctrl),A + OUT (Z84.SIO.Ch_B.Ctrl),A + ; reg 0 - return from int + LD A,%0011'1000 + OUT (Z84.SIO.Ch_A.Ctrl),A + OUT (Z84.SIO.Ch_B.Ctrl),A + POP AF + ENDIF EI ; RETI ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index fdef6fc..19841df 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -151,8 +151,6 @@ INT_: PUSH AF PUSH IX PUSH IY CALL KEYSCAN - ; LD C,Dss.Mouse.GetPackets - ; RST ToDSS.Mouse CALL M_INT IFN CLASSIC_CURSOR CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 7b4978c..2568a00 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -102,7 +102,8 @@ PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data ; 4 - CURSOR OFF (UZHE) ; 5 - CURSOR IMAGE VERY BIG -INTMOUS BIT 7,C +INTMOUS: + BIT 7,C JR NZ,EMOUSE INC C DEC C @@ -116,9 +117,9 @@ INTMOUS BIT 7,C DEC C JP Z,MS_GOTO ; 4 DEC C - JR Z,MS_RESR ; 5 + JR Z,.RESERVED ; 5 DEC C - JR Z,MS_RESR ; 6 + JR Z,.RESERVED ; 6 DEC C JP Z,MS_VERT ; 7 DEC C @@ -130,28 +131,30 @@ INTMOUS BIT 7,C DEC C JP Z,MS_BCUR ; 11 DEC C - JR Z,MS_RESR ; 12 + JR Z,.RESERVED ; 12 DEC C - JR Z,MS_RESR ; 13 + JR Z,.RESERVED ; 13 DEC C JP Z,MS_GSEN ; 14 DEC C JP Z,MS_SENT ; 15 -MS_RESR LD A,DSS_Error.mouse.INVALID_COMMAND +.RESERVED: + LD A,DSS_Error.mouse.INVALID_COMMAND SCF RET -EMOUSE RES 7,C +EMOUSE: RES 7,C INC C DEC C JP Z,M_INT DEC C JP Z,M_MODE DEC C - JR Z,M_RESR + JR Z,.RESERVED DEC C JP Z,M_REFR -M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND +.RESERVED: + LD A,DSS_Error.mouse.INVALID_COMMAND SCF RET @@ -159,12 +162,12 @@ M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND MS_INIT: DI ; reg 0 - XOR A ;LD A,0 + XOR A OUT (PORT_MOUSE.Ctrl),A - ; reg 4 + ; reg 4 - скорость порта первый множитель LD A,4 OUT (PORT_MOUSE.Ctrl),A - LD A,+(7 | MOUSE_BAUD.multiplier_1) ; первый множитель + LD A,+(7 | MOUSE_BAUD.multiplier_1) OUT (PORT_MOUSE.Ctrl),A ; reg 3 LD A,3 @@ -176,7 +179,6 @@ MS_INIT: OUT (PORT_MOUSE.Ctrl),A LD A,%1110'0000 ; bit7 для корректного инита Sega джойстика в порту кемпстон джойстика OUT (PORT_MOUSE.Ctrl),A - ; ; reg 1 LD A,1 OUT (PORT_MOUSE.Ctrl),A @@ -186,17 +188,18 @@ MS_INIT: XOR A ENDIF OUT (PORT_MOUSE.Ctrl),A - ;!TEST mouse - LD A,#55 - OUT (Z84.CTC.Ch_0),A - LD A,MOUSE_BAUD.multiplier_2 ; второй множитель - OUT (Z84.CTC.Ch_0),A + ; скорость порта - второй множитель + LD A,#55 + OUT (Z84.CTC.Ch_0),A + LD A,MOUSE_BAUD.multiplier_2 + OUT (Z84.CTC.Ch_0),A ; EI XOR A RET -MS_SHOW PUSH IX +MS_SHOW: + PUSH IX PUSH HL PUSH DE EX AF,AF' @@ -216,7 +219,8 @@ MS_SHOW PUSH IX XOR A RET -MS_HIDD PUSH IX +MS_HIDD: + PUSH IX PUSH HL PUSH DE EX AF,AF' @@ -234,13 +238,15 @@ MS_HIDD PUSH IX XOR A RET -MS_READ LD HL,(PIX_X) +MS_READ: + LD HL,(PIX_X) LD DE,(PIX_Y) - LD A,(MB) + LD A,(MOUSE_BUTTONS) AND A RET -MS_GOTO PUSH IX +MS_GOTO: + PUSH IX PUSH HL PUSH DE LD (PIX_X),HL @@ -258,7 +264,8 @@ MS_GOTO PUSH IX XOR A RET -MS_CURS PUSH BC +MS_CURS: + PUSH BC PUSH DE PUSH HL PUSH IX @@ -278,9 +285,9 @@ MS_CURS PUSH BC LD B,0 LD A,(M_YSIZE) LD HL,0 -MSCURS1 ADD HL,BC +.loop: ADD HL,BC DEC A - JR NZ,MSCURS1 + JR NZ,.loop PUSH HL LD BC,M_IMAGE.Size+1 AND A @@ -290,27 +297,29 @@ MSCURS1 ADD HL,BC POP BC POP HL LD A,5 - JR C,NOLOADM + JR C,.NOLOADM LD DE,M_IMAGE DI LDIR XOR A -NOLOADM POP HL +.NOLOADM: + POP HL POP DE POP BC EI RET -MS_BCUR PUSH IX +MS_BCUR: + PUSH IX EXX LD A,(M_XSIZE) LD C,A LD B,0 LD A,(M_YSIZE) LD HL,0 -MSBCUR1 ADD HL,BC +.loop: ADD HL,BC DEC A - JR NZ,MSBCUR1 + JR NZ,.loop PUSH HL LD BC,M_IMAGE.Size+1 AND A @@ -335,22 +344,23 @@ MSBCUR1 ADD HL,BC LD D,C LD BC,0 XOR A -NOSAVEM EI +NOSAVEM: + EI RET -MS_HORZ +MS_HORZ: LD (MIN_X),HL LD (MAX_X),DE XOR A RET -MS_VERT +MS_VERT: LD (MIN_Y),HL LD (MAX_Y),DE XOR A RET -MS_MASK +MS_MASK: LD (ANDXORS),HL LD (ANDXORA),DE XOR A @@ -358,13 +368,12 @@ MS_MASK ; H - VERTICAL SENSITIVE ; L - HORIZONTAL SENSITIVE - -MS_SENT +MS_SENT: LD (SENSEXY),HL XOR A RET -MS_GSEN +MS_GSEN: LD HL,(SENSEXY) XOR A RET @@ -616,13 +625,30 @@ MOUSE: LD A,(MODE_M) ;----------------------------------------------------------------------; -READ_M: IN A,(PORT_MOUSE.Ctrl) +READ_M: + ;[ ] 18/02/2024 проверка на переполнение буфера + ; reg 1 + LD A,1 + OUT (PORT_MOUSE.Ctrl),A + IN A,(PORT_MOUSE.Ctrl) + AND %0010'0000 ; check receiver overrun error + ; JP NZ,.Receiver_Overrun + JR Z,.NEXT + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_B.Ctrl),A +.NEXT: ; + IN A,(PORT_MOUSE.Ctrl) RRCA RET NC + ; AND 1 + ; RET Z + IN A,(PORT_MOUSE.Data) LD L,A - BIT 6,A - CCF + AND %0100'0000 + ;BIT 6,A + ;CCF RET Z ;[x] mouse freeeeezzzz @@ -632,7 +658,7 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz - JR C,.NXT + JR C,.NXT_1 DEC BC LD A,B OR C @@ -641,7 +667,7 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) ;JR NC,TST_01 ; -.NXT: IN A,(PORT_MOUSE.Data) +.NXT_1: IN A,(PORT_MOUSE.Data) LD E,A BIT 6,A CCF @@ -650,18 +676,19 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) ;[x] mouse freeeeezzzz LD BC,MOUSE_READ_PORT_TIMEOUT ; -TST_02: IN A,(PORT_MOUSE.Ctrl) +.TST_02: + IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz - JR C,.NXT + JR C,.NXT_2 DEC BC LD A,B OR C - JR NZ,TST_02 + JR NZ,.TST_02 RET ;JR NC,TST_02 ; -.NXT: IN A,(PORT_MOUSE.Data) +.NXT_2: IN A,(PORT_MOUSE.Data) LD D,A BIT 6,A CCF @@ -696,45 +723,66 @@ TST_02: IN A,(PORT_MOUSE.Ctrl) .STBU: RLCA RLCA AND #03 - LD (MB),A + LD (MOUSE_BUTTONS),A CALL SENSE - LD A,E - LD (MX),A - LD A,D - LD (MY),A + LD (MOUSE_COORDINATES),DE + ; LD A,E + ; LD (MX),A + ; LD A,D + ; LD (MY),A SCF RET +;[ ] 14/03/2024 проверка на переполнение буфера +/* +.Receiver_Overrun: + ; empty the buffer + IN A,(Z84.SIO.Ch_B.Data) + IN A,(Z84.SIO.Ch_B.Ctrl) + RRCA + JR C,.Receiver_Overrun + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_B.Ctrl),A + ;!TEST + ; reg 0 - return from int + ; LD A,%0011'1000 + ; OUT (Z84.SIO.Ch_B.Ctrl),A + ; + RET +*/ -MCORECT LD HL,(PIX_X) - LD DE,(MX) + +MCORECT: + LD HL,(PIX_X) + LD DE,(MOUSE_COORDINATES) LD D,0 BIT 7,E - JR NZ,DECX + 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 + JR NC,.YCOO LD HL,(MAX_X) LD (PIX_X),HL - JP YCOO -DECX LD A,E + JP .YCOO +.DECX: LD A,E NEG LD E,A AND A SBC HL,DE LD (PIX_X),HL - JR C,YCOO2 + JR C,.YCOO2 LD DE,(MIN_X) SBC HL,DE - JR NC,YCOO -YCOO2 LD HL,(MIN_X) + JR NC,.YCOO +.YCOO2: LD HL,(MIN_X) LD (PIX_X),HL -YCOO LD HL,(PIX_Y) - LD DE,(MY) +.YCOO: LD HL,(PIX_Y) + LD DE,(MOUSE_COORDINATES.Y) LD D,0 BIT 7,E JR NZ,DECY @@ -750,77 +798,90 @@ YCOO LD HL,(PIX_Y) LD (PIX_Y),HL RET -DECY LD A,E +DECY: LD A,E NEG LD E,A AND A SBC HL,DE LD (PIX_Y),HL - JR C,XCOO + JR C,.XCOO LD DE,(MIN_Y) SBC HL,DE RET NC -XCOO LD HL,(MIN_Y) +.XCOO: LD HL,(MIN_Y) LD (PIX_Y),HL RET -SENSE LD HL,(SENSEXY) +SENSE: LD HL,(SENSEXY) LD A,L - OR L - RET Z - DEC A - RET Z + ;!TEST + ;OR L + ;RET Z + ;DEC A + ;RET Z + CP 2 + CCF + JR NC,.check_Y + ; LD A,E BIT 7,A LD B,#FF - JR Z,SEN1 + JR Z,.loop LD B,#7F NEG -SEN1 INC B +.loop: INC B SUB L - JR NC,SEN1 + JR NC,.loop BIT 7,B - JR Z,SEN2 + JR Z,.next LD A,B RES 7,A NEG LD B,A -SEN2 LD E,B + ; +.next: LD E,B + ; !TEST +.check_Y: + LD A,H + CP 2 + CCF + RET NC + ; LD A,D BIT 7,A LD B,#FF - JR Z,SEN3 + JR Z,.loop2 LD B,#7F NEG -SEN3 INC B +.loop2: INC B SUB H - JR NC,SEN3 + JR NC,.loop2 BIT 7,B - JR Z,SEN4 + JR Z,.skip2 LD A,B RES 7,A NEG LD B,A -SEN4 LD D,B +.skip2: LD D,B RET -M_MODE LD (MODE_M),A +M_MODE: LD (MODE_M),A OR A - JR Z,UNKMODE + JR Z,.UNKMODE CP 1 - JR Z,UNKMODE + JR Z,.UNKMODE CP 2 JR Z,S320256 CP 3 JR Z,S640256 BIT 7,A - JR Z,UNKMODE + JR Z,.UNKMODE RES 7,A CP 1 JR Z,S320256 CP 2 JR Z,S640256 -UNKMODE: +.UNKMODE: XOR A ; ????? может тут надо .INVALID_COMMAND ? SCF RET @@ -858,13 +919,19 @@ M_INT: IN A,(SLOT3) OUT (SLOT3),A LD A,C OUT (PORT_Y),A + ;!TEST SIO INT + IF MOUSE_INT_ENABLED + LD A,%0011'1000 ; return from int + OUT (Z84.SIO.Ch_B.Ctrl),A + ENDIF RET -M_REFR CALL CONTROL +M_REFR: CALL CONTROL AND A RET -CONTROL CALL READ_M +CONTROL: + CALL READ_M RET NC CALL MCORECT ;LD A,#00 @@ -894,9 +961,11 @@ MODE_M: DB #03 PIX_X: DW 160 PIX_Y: DW 128 -MX: DB #00 -MY: DB #00 -MB: DB #00 +MOUSE_COORDINATES: +.X: DB #00 +.Y: DB #00 +MOUSE_BUTTONS: DB #00 + ;MB_OLD DB #00 ; !FIXIT - не нужно? MIN_X: DW 0 MAX_X: DW 319 @@ -904,7 +973,7 @@ MIN_Y: DW 0 MAX_Y: DW 255 SENSEXY: .X: DB 0 -.Y: DB 0 +.Y: DB 2 XHOT_SP: DW 0 YHOT_SP: DW 0 diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 802e4c8..fdaf57b 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -433,6 +433,14 @@ FULL_BF: KEYSCAN: LD IX,KEYFLAG + ;!TEST SIO INT + IF KEYBOARD_INT_ENABLED + CALL .RESCAN + LD A,%0011'1000 ; return from int + OUT (Z84.SIO.Ch_A.Ctrl),A + RET + ENDIF + ; .RESCAN: IN A,(Z84.SIO.Ch_A.Ctrl) AND 1 @@ -443,7 +451,7 @@ KEYSCAN: OUT (Z84.SIO.Ch_A.Ctrl),A IN A,(Z84.SIO.Ch_A.Ctrl) AND %0010'0000 ; check receiver overrun error - JP NZ,Receiver_Overrun + JP NZ,KBD_Receiver_Overrun ; IN A,(Z84.SIO.Ch_A.Data) CP #F0 @@ -963,36 +971,55 @@ BEEP: LD A,#10 RET KEYBOARD_INIT: - XOR A ;LD A,0 - OUT (Z84.SIO.Ch_A.Ctrl),A - INC A ;LD A,1 - OUT (Z84.SIO.Ch_A.Ctrl),A - XOR A ;LD A,0 ;#18 - OUT (Z84.SIO.Ch_A.Ctrl),A - LD A,3 - OUT (Z84.SIO.Ch_A.Ctrl),A - LD A,#C1 + DI + ; reg 0 + XOR A OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 4 LD A,4 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#07 ;#05 OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 3 + LD A,3 + OUT (Z84.SIO.Ch_A.Ctrl),A + LD A,#C1 + OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 5 LD A,5 OUT (Z84.SIO.Ch_A.Ctrl),A LD A,#62 OUT (Z84.SIO.Ch_A.Ctrl),A + ; reg 1 + LD A,1 + OUT (Z84.SIO.Ch_A.Ctrl),A + IF KEYBOARD_INT_ENABLED + LD A,%0001'1001 + ELSE + XOR A ;#18 + ENDIF + OUT (Z84.SIO.Ch_A.Ctrl),A + ; + EI RET -;[ ] 18/02/2024 проверка на переполнение буфера -Receiver_Overrun: +;[x] 18/02/2024 проверка на переполнение буфера +KBD_Receiver_Overrun: ; empty the buffer IN A,(Z84.SIO.Ch_A.Data) IN A,(Z84.SIO.Ch_A.Ctrl) RRCA - JR C,Receiver_Overrun - ; reg 0 - reset errors + JR C,KBD_Receiver_Overrun + ; reg 0 - error reset LD A,%0011'0000 OUT (Z84.SIO.Ch_A.Ctrl),A + ;!TEST SIO INT + ; reg 0 - return from int + IF KEYBOARD_INT_ENABLED + LD A,%0011'1000 + OUT (Z84.SIO.Ch_A.Ctrl),A + ENDIF + ; ;!TODO при детекте переполнения буфера проца снять клавиши из порта #FE спектрума ; LD (IX+K_SHIFT),0 @@ -1001,7 +1028,7 @@ Receiver_Overrun: ; LD A,(HOST) ; LD (HEAD),A ; - AND A + ;AND A RET ;//MODULE: KEYINTER ;[END] \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index c353035..5f97bf2 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -943 \ No newline at end of file +944 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f0ea1b5..a948e8d 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -10,7 +10,9 @@ ; DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B - DEFINE MOUSE_READ_PORT_TIMEOUT 1280 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники + DEFINE MOUSE_READ_PORT_TIMEOUT 3072 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники +; + DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A ; ;