-bug: некорректно работала функция обработки чувствительности мышки MS_SENT

This commit is contained in:
Anatoliy Belyanskiy 2024-03-15 00:38:21 +10:00
parent 00e9cb59f0
commit 63c527ace8
6 changed files with 239 additions and 111 deletions

View File

@ -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 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';

View File

@ -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

View File

@ -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 ; ¢â®à®© ¬­®¦¨â¥«ì
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

View File

@ -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 能恥丞<E681A5> <20> 砲鄍祚垠平言 <EFBD9E>
Receiver_Overrun:
;[x] 18/02/2024 能恥丞<E681A5> <20> 砲鄍祚垠平言 <EFBD9E>
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]

View File

@ -1 +1 @@
943
944

View File

@ -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 ; Š®áâë«ì­ë© â ©¬- ãâ ­  ®¦¨¤ ­¨¥ ¡ ©â  ®â ¬ë誨. <EFBFBD>à®áâ® ¥áâì ªà¨¢ë¥ ¯¥à¥å®¤­¨ª¨
DEFINE MOUSE_READ_PORT_TIMEOUT 3072 ; Š®áâë«ì­ë© â ©¬- ãâ ­  ®¦¨¤ ­¨¥ ¡ ©â  ®â ¬ë誨. <EFBFBD>à®áâ® ¥áâì ªà¨¢ë¥ ¯¥à¥å®¤­¨ª¨
;
DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A
;
;