;[BEGIN] ;//MODULE: INTMOUSE ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module PORT_MOUSE.Ctrl EQU Z84.SIO.Ch_B.Ctrl PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data ; MOUSE SOFTWARE SPECIFICATION ;--------------------------------------------- ; COMMAND 00h (INITIALIZATION) ; ; RETURN: NC - MOUSE PRESENT ; C - MOUSE ABSENT ;--------------------------------------------- ; COMMAND 01h (SHOW MOUSE CURSOR) ; ; RETURN: NC - DONE ; C - MOUSE ON SCREEN ;--------------------------------------------- ; COMMAND 02h (HIDE MOUSE CURSOR) ; ; RETURN: NC - DONE ; C - NONE MOUSE ;--------------------------------------------- ; COMMAND 03h (READ MOUSE STATE) ; ; RETURN: HL - X COORD ; DE - Y COORD ; A - BUTTONS D2-D0 (MIDDLE,RIGHT,LEFT) ;--------------------------------------------- ; COMMAND 04h (GOTO MOUSE CURSOR) ; ; INPUT: HL - X COORD ; DE - Y COORD ;--------------------------------------------- ; COMMAND 05h (RESERVED) ;--------------------------------------------- ; COMMAND 06h (RESERVED) ;--------------------------------------------- ; COMMAND 07h (SET VERT. BOUNDS) ; ; INPUT: HL - Y MIN ; DE - Y MAX ;--------------------------------------------- ; COMMAND 08h (SET HORZ. BOUNDS) ; ; INPUT: HL - X MIN ; DE - X MAX ;--------------------------------------------- ; COMMAND 09h (LOAD CURSOR) ; ; INPUT: IX - CURSOR IMAGE ; H - HEIGHT CURSOR ; L - WIDTH CURSOR ; D - Y HOT SPOT ; E - X HOT SPOT ; B = 0 ;--------------------------------------------- ; COMMAND 0Ah (SET CURSOR IN TEXT MODES) ; ; INPUT: H - AND SIMBOL MASK ; L - XOR SIMBOL MASK ; D - AND ATTRIBUT MASK ; E - XOR ATTRIBUT MASK ; B = 0 ;--------------------------------------------- ; COMMAND 0Bh (RETURN CURSOR) ; ; INPUT: IX - CURSOR IMAGE BUFFER ; OUTPUT: H - HEIGHT CURSOR ; L - WIDTH CURSOR ; D - Y HOT SPOT ; E - X HOT SPOT ;--------------------------------------------- ; COMMAND 0Ch (RESERVED) ;--------------------------------------------- ; COMMAND 0Dh (RESERVED) ;--------------------------------------------- ; COMMAND 0Eh (GET SENSITIVE) ; OUTPUT: H - VERTICAL SENSITIVE ; L - HORIZONTAL SENSITIVE ;--------------------------------------------- ; COMMAND 0Fh (SET SENSITIVE) ; INPUT: H - VERTICAL SENSITIVE ; L - HORIZONTAL SENSITIVE ;--------------------------------------------- ; COMMAND 80h (MOUSE HARDWARE INTERRUPT) ;--------------------------------------------- ; COMMAND 81h (CHANGE VIDEO MODE) ; INPUT: A - MODE ;--------------------------------------------- ; COMMAND 82h (RESERVED) ;--------------------------------------------- ; COMMAND 83h (MOUSE REFRESH) ;--------------------------------------------- ; ERRORS: 0 - NO ERROR ; 1 - COMMAND NOT PRESENT ; 2 - DEVICE ABSENT ; 3 - CURSOR ON (UZHE) ; 4 - CURSOR OFF (UZHE) ; 5 - CURSOR IMAGE VERY BIG INTMOUS BIT 7,C JR NZ,EMOUSE INC C DEC C JR Z,MS_INIT ; 0 DEC C JR Z,MS_SHOW ; 1 DEC C JP Z,MS_HIDD ; 2 DEC C JP Z,MS_READ ; 3 DEC C JP Z,MS_GOTO ; 4 DEC C JR Z,MS_RESR ; 5 DEC C JR Z,MS_RESR ; 6 DEC C JP Z,MS_VERT ; 7 DEC C JP Z,MS_HORZ ; 8 DEC C JP Z,MS_CURS ; 9 DEC C JP Z,MS_MASK ; 10 DEC C JP Z,MS_BCUR ; 11 DEC C JR Z,MS_RESR ; 12 DEC C JR Z,MS_RESR ; 13 DEC C JP Z,MS_GSEN ; 14 DEC C JP Z,MS_SENT ; 15 MS_RESR LD A,DSS_Error.mouse.INVALID_COMMAND SCF RET EMOUSE RES 7,C INC C DEC C JP Z,M_INT DEC C JP Z,M_MODE DEC C JR Z,M_RESR DEC C JP Z,M_REFR M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND SCF RET ;!TODO на биос. MS_INIT DI ;!TEST mouse ;LD A,85 ;OUT (#10),A ;LD A,45 ;OUT (#10),A ; XOR A ;LD A,0 OUT (PORT_MOUSE.Ctrl),A INC A ;LD A,1 OUT (PORT_MOUSE.Ctrl),A DEC A ;LD A,0 OUT (PORT_MOUSE.Ctrl),A LD A,3 OUT (PORT_MOUSE.Ctrl),A LD A,#41 OUT (PORT_MOUSE.Ctrl),A LD A,4 OUT (PORT_MOUSE.Ctrl),A ;!TEST mouse LD A,#47 ; первый множитель = 16 875000/Мн1*Мн2=1215 ;LD A,#44 ;LD A,#04 ; первый множитель = 1 875000/Мн1*Мн2=4807 OUT (PORT_MOUSE.Ctrl),A ; LD A,5 OUT (PORT_MOUSE.Ctrl),A ; [ ] для корректного инита Sega джойстика в порту кемпстон джойстика LD A,%1110'0000 ;LD A,%0110'0000 ; OUT (PORT_MOUSE.Ctrl),A ;!TEST mouse LD A,#55 OUT (Z84.CTC.Ch_0),A LD A,#2D ; второй множитель = 45 875000/Мн1*Мн2=1215 ;LD A,#B6 ; второй множитель = 182 875000/Мн1*Мн2=4807 OUT (Z84.CTC.Ch_0),A ; EI XOR A RET MS_SHOW PUSH IX PUSH HL PUSH DE EX AF,AF' PUSH AF LD HL,(PIX_X) LD DE,(PIX_Y) DI CALL MOUSE XOR A LD (REFRESH+1),A EI POP AF EX AF,AF' POP DE POP HL POP IX XOR A RET MS_HIDD PUSH IX PUSH HL PUSH DE EX AF,AF' PUSH AF DI LD A,1 LD (REFRESH+1),A CALL RESTORE EI POP AF EX AF,AF' POP DE POP HL POP IX XOR A RET MS_READ LD HL,(PIX_X) LD DE,(PIX_Y) LD A,(MB) AND A RET MS_GOTO PUSH IX PUSH HL PUSH DE LD (PIX_X),HL LD (PIX_Y),DE EX AF,AF' PUSH AF DI CALL REFRESH EI POP AF EX AF,AF' POP DE POP HL POP IX XOR A RET MS_CURS PUSH BC PUSH DE PUSH HL PUSH IX LD A,L LD (M_XSIZE),A LD A,H LD (M_YSIZE),A LD C,E LD B,0 LD (XHOT_SP),BC LD C,D LD B,0 LD (YHOT_SP),BC EXX LD A,(M_XSIZE) LD C,A LD B,0 LD A,(M_YSIZE) LD HL,0 MSCURS1 ADD HL,BC DEC A JR NZ,MSCURS1 PUSH HL LD BC,M_IMAGE.Size+1 AND A SBC HL,BC CCF EXX POP BC POP HL LD A,5 JR C,NOLOADM LD DE,M_IMAGE DI LDIR XOR A NOLOADM POP HL POP DE POP BC EI RET 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 DEC A JR NZ,MSBCUR1 PUSH HL LD BC,M_IMAGE.Size+1 AND A SBC HL,BC CCF EXX POP BC POP HL LD A,5 JR C,NOSAVEM LD DE,M_IMAGE EX DE,HL DI LDIR LD A,(M_XSIZE) LD L,A LD A,(M_YSIZE) LD H,A LD BC,(XHOT_SP) LD E,C LD BC,(YHOT_SP) LD D,C LD BC,0 XOR A NOSAVEM EI RET MS_HORZ LD (MIN_X),HL LD (MAX_X),DE XOR A RET MS_VERT LD (MIN_Y),HL LD (MAX_Y),DE XOR A RET MS_MASK LD (ANDXORS),HL LD (ANDXORA),DE XOR A RET ; H - VERTICAL SENSITIVE ; L - HORIZONTAL SENSITIVE MS_SENT LD (SENSEXY),HL XOR A RET MS_GSEN LD HL,(SENSEXY) XOR A RET MOUSET LD (REST_XT+1),HL LD (REST_YT+1),DE ;Y SRL D RR E SRL D RR E SRL D RR E LD D,E ;X SRL H RR L SRL H RR L SRL H RR L LD E,L IN A,(PORT_Y) LD XH,A IN A,(SLOT1) LD XL,A ; DI ; LD A,#54 ;!HARDCODE video page OUT (SLOT1),A ; LD A,D ADD A,A ADD A,A ;Y * 4 LD L,A LD H,#43 ;+ #4300 ; IN A,(RGMOD) RRCA AND #80 OR #01 ADD A,E OUT (PORT_Y),A INC L LD A,(HL) ;SIMBOL LD BC,(ANDXORS) AND B XOR C LD (HL),A INC L LD A,(HL) ;ATTRIBUT LD BC,(ANDXORA) AND B XOR C LD (HL),A ; LD A,XL OUT (SLOT1),A LD A,XH OUT (PORT_Y),A RET RESTORT: REST_XT: LD HL,#0000 REST_YT: LD DE,#0000 ;Y SRL D RR E SRL D RR E SRL D RR E LD D,E ;X SRL H RR L SRL H RR L SRL H RR L LD E,L IN A,(PORT_Y) LD XH,A IN A,(SLOT1) LD XL,A ; DI ; LD A,#50 OUT (SLOT1),A ; LD A,D ADD A,A ADD A,A ;Y * 4 LD L,A LD H,#43 ;+ #4300 ; IN A,(RGMOD) RRCA AND #80 OR #01 ADD A,E OUT (PORT_Y),A INC L LD A,(HL) ;SIMBOL LD (HL),A INC L LD A,(HL) ;ATTRIBUT LD (HL),A ; LD A,XL OUT (SLOT1),A LD A,XH OUT (PORT_Y),A RET RESTORE: .sw+1: LD A,#00 BIT 7,A JP Z,RESTORT RESTORG IN A,(SLOT3) LD B,A IN A,(PORT_Y) LD C,A PUSH BC LD A,#50 ;!HARDCODE videopage OUT (SLOT3),A REST_X LD HL,0 REST_Y LD DE,0 LD A,E EX AF,AF' REST_V LD A,#00 AND 1 LD DE,#C000 ;screen 0 JR Z,AA2 LD DE,#C000+320 ;screen 1 AA2 ADD HL,DE REST_A LD A,0 LD XH,A EX AF,AF' REST_H RS002 LD BC,10 OUT (PORT_Y),A EX AF,AF' LD (PUSH_HL),HL LD D,H LD E,L LDIR PUSH_HL+1: LD HL,#0000 ; POP HL EX AF,AF' INC A JR Z,RS003 DEC XH JR NZ,RS002 RS003 POP BC LD A,B OUT (SLOT3),A LD A,C OUT (PORT_Y),A XOR A RET ;HL/DE - X/Y MOUSE: LD A,(MODE_M) LD (RESTORE.sw),A BIT 7,A JP Z,MOUSET MOUSEG: CP #82 ;640x256x16 JR NZ,NOFX SRL H RR L NOFX: LD IX,M_IMAGE LD A,(M_XSIZE) LD C,A LD B,0 LD (REALXS),BC LD (REST_H+1),BC LD C,B LD (SKIPXF),BC LD A,(M_YSIZE) LD (REST_A+1),A LD C,A LD B,0 LD (REALYS),BC LD BC,(YHOT_SP) LD A,E SUB C LD E,A JR NC,GOODY NEG LD E,A LD A,(M_XSIZE) LD C,A LD B,0 LD A,(M_YSIZE) SUB E SKIPMY: ADD IX,BC DEC E JR NZ,SKIPMY LD C,A LD (REALYS),BC GOODY: LD BC,(XHOT_SP) AND A SBC HL,BC JR NC,GOODX LD B,H LD C,L LD HL,0 AND A SBC HL,BC LD (SKIPXF),HL LD A,(M_XSIZE) SUB L LD L,A LD (REALXS),HL LD HL,0 GOODX: LD (REST_X+1),HL LD (REST_Y+1),DE PUSH HL IN A,(SLOT3) LD H,A IN A,(PORT_Y) LD L,A EX (SP),HL LD A,#5C ;!HARDCODE videopage OUT (SLOT3),A LD A,E EX AF,AF' IN A,(RGMOD) LD (REST_V+1),A AND 1 LD DE,#C000 ;PAGE 0 JR Z,AA1 LD DE,#C000+320 ;PAGE 1 AA1 ADD HL,DE LD D,XH LD E,XL EX DE,HL ;HL - BITMAP LD BC,(REALYS) LD XH,C EX AF,AF' MS002 LD BC,(SKIPXF) ADD HL,BC LD BC,(REALXS) OUT (PORT_Y),A EX AF,AF' ;PUSH DE LD (PUSH_DE+1),DE LDIR PUSH_DE LD DE,#0000 ; POP DE EX AF,AF' INC A JR Z,MS003 DEC XH JR NZ,MS002 MS003 POP BC LD A,B OUT (SLOT3),A LD A,C OUT (PORT_Y),A XOR A RET READ_M: IN A,(PORT_MOUSE.Ctrl) RRCA RET NC IN A,(PORT_MOUSE.Data) LD L,A BIT 6,A CCF RET Z ;[x] mouse freeeeezzzz LD BC,#2000 ; TST_01: IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz JR C,.NXT DEC BC LD A,B OR C JR NZ,TST_01 RET ;JR NC,TST_01 ; .NXT: IN A,(PORT_MOUSE.Data) LD E,A BIT 6,A CCF RET NZ ;[x] mouse freeeeezzzz LD BC,#2000 ; TST_02: IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz JR C,.NXT DEC BC LD A,B OR C JR NZ,TST_02 RET ;JR NC,TST_02 ; .NXT: IN A,(PORT_MOUSE.Data) LD D,A BIT 6,A CCF RET NZ LD A,E AND #3F LD E,A LD A,L AND #03 RRCA RRCA OR E LD E,A LD A,D AND #3F LD D,A LD A,L AND #0C RRCA RRCA RRCA RRCA OR D LD D,A LD A,L RLCA RLCA RLCA RES 6,A JR NC,STBU SET 6,A STBU RLCA RLCA AND #03 LD (MB),A CALL SENSE LD A,E LD (MX),A LD A,D LD (MY),A SCF RET MCORECT LD HL,(PIX_X) LD DE,(MX) LD D,0 BIT 7,E 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 LD HL,(MAX_X) LD (PIX_X),HL JP YCOO DECX LD A,E NEG LD E,A AND A SBC HL,DE LD (PIX_X),HL JR C,YCOO2 LD DE,(MIN_X) SBC HL,DE JR NC,YCOO YCOO2 LD HL,(MIN_X) LD (PIX_X),HL YCOO LD HL,(PIX_Y) LD DE,(MY) LD D,0 BIT 7,E JR NZ,DECY ADD HL,DE LD (PIX_Y),HL EX DE,HL LD HL,(MAX_Y) AND A SBC HL,DE RET NC LD HL,(MAX_Y) LD (PIX_Y),HL RET DECY LD A,E NEG LD E,A AND A SBC HL,DE LD (PIX_Y),HL JR C,XCOO LD DE,(MIN_Y) SBC HL,DE RET NC XCOO LD HL,(MIN_Y) LD (PIX_Y),HL RET SENSE LD HL,(SENSEXY) LD A,L OR L RET Z DEC A RET Z LD A,E BIT 7,A LD B,#FF JR Z,SEN1 LD B,#7F NEG SEN1 INC B SUB L JR NC,SEN1 BIT 7,B JR Z,SEN2 LD A,B RES 7,A NEG LD B,A SEN2 LD E,B LD A,D BIT 7,A LD B,#FF JR Z,SEN3 LD B,#7F NEG SEN3 INC B SUB H JR NC,SEN3 BIT 7,B JR Z,SEN4 LD A,B RES 7,A NEG LD B,A SEN4 LD D,B RET M_MODE LD (MODE_M),A OR A JR Z,UNKMODE CP 1 JR Z,UNKMODE CP 2 JR Z,S320256 CP 3 JR Z,S640256 BIT 7,A JR Z,UNKMODE RES 7,A CP 1 JR Z,S320256 CP 2 JR Z,S640256 UNKMODE XOR A ; ????? может тут надо .INVALID_COMMAND ? SCF RET S320256 LD HL,0 ;MIN X LD DE,319 ;MAX X CALL MS_HORZ LD HL,0 ;MIN X LD DE,255 ;MAX X CALL MS_VERT XOR A RET S640256 LD HL,0 ;MIN X LD DE,639 ;MAX X CALL MS_HORZ LD HL,0 ;MIN X LD DE,255 ;MAX X CALL MS_VERT XOR A RET ;Mouse Interrupt M_INT IN A,(SLOT3) LD B,A IN A,(PORT_Y) LD C,A PUSH BC CALL REFRESH ;Refresh mouse CALL CONTROL POP BC LD A,B OUT (SLOT3),A LD A,C OUT (PORT_Y),A RET M_REFR CALL CONTROL AND A RET CONTROL CALL READ_M RET NC CALL MCORECT LD A,#00 LD (REDY),A RET REFRESH LD A,#01 OR A RET NZ REDY+1: LD A,#00 ;????? почему закомментированно в оригинале? ;OR A ;RET NZ ; CALL RESTORE LD HL,(PIX_X) LD DE,(PIX_Y) CALL MOUSE LD A,#FF LD (REDY),A RET MODE_M DB #03 PIX_X DW 160 PIX_Y DW 128 MX DB #00 MY DB #00 MB DB #00 MB_OLD DB #00 ; !FIXIT - не нужно? MIN_X DW 0 MAX_X DW 319 MIN_Y DW 0 MAX_Y DW 255 SENSEXY SENSE_X DB 0 SENSE_Y DB 0 XHOT_SP DW 0 YHOT_SP DW 0 ANDXORS DW #FF00 ANDXORA DW #FF77 M_XSIZE DB 10 M_YSIZE DB 14 SKIPXF DW 0 REALXS DW 0 REALYS DW 0 ; Xx EQU #00 ; Ww EQU #FE ; Nn EQU #FF ;MS_BMP M_IMAGE: DH "00 00 FF FF FF FF FF FF FF FF" DH "00 FE 00 FF FF FF FF FF FF FF" DH "00 FE FE 00 FF FF FF FF FF FF" DH "00 FE FE FE 00 FF FF FF FF FF" DH "00 FE FE FE FE 00 FF FF FF FF" DH "00 FE FE FE FE FE 00 FF FF FF" DH "00 FE FE FE FE FE FE 00 FF FF" DH "00 FE FE FE FE 00 00 00 00 FF" DH "00 FE FE 00 FE 00 FF FF FF FF" DH "00 FE 00 00 FE FE 00 FF FF FF" DH "00 00 FF FF 00 FE 00 FF FF FF" DH "00 FF FF FF 00 FE FE 00 FF FF" DH "FF FF FF FF FF 00 00 FF FF FF" DH "FF FF FF FF FF FF FF FF FF FF" BLOCK 256-($-M_IMAGE),0 .Size EQU $-M_IMAGE ;//MODULE: INTMOUSE ;[END]