--- uae/src/filesys.asm 2018/04/24 17:05:24 1.1.1.3 +++ uae/src/filesys.asm 2018/04/24 17:18:12 1.1.1.4 @@ -18,6 +18,8 @@ start: dc.l exter_server-start dc.l bootcode-start dc.l setup_exter-start + dc.l 0 ; /* p96vsyncfix */ + dc.l mousehack_x-start bootcode: lea.l doslibname(pc),a1 @@ -30,7 +32,7 @@ bootcode: filesys_init: movem.l d0-d7/a0-a6,-(sp) - move.l 4.w,a6 + move.l 4,a6 move.w #$FFFC,d0 ; filesys base bsr getrtbase move.l (a0),a5 @@ -48,7 +50,7 @@ FSIN_explibok: move.l d0,a4 moveq.l #88,d0 moveq.l #1,d1 ; MEMF_PUBLIC - jsr -198(a6) ; AllocMem + jsr -198(a6); AllocMem move.l d0,a3 ; param packet moveq.l #84,d7 ; initialize it @@ -70,7 +72,7 @@ FSIN_init_units: bra.b FSIN_init_units FSIN_units_ok: - move.l 4.w,a6 + move.l 4,a6 move.l a4,a1 jsr -414(a6) ; CloseLibrary move.w #$FF80,d0 @@ -100,7 +102,7 @@ exter_server: tst.l d0 beq.b exter_server_exit ; This is the hard part - we have to send some messages. - move.l 4.w,a6 + move.l 4,a6 EXTS_loop: move.w #$FF50,d0 bsr.w getrtbase @@ -148,9 +150,10 @@ exter_server_exit: rts setup_exter: + ; bsr.w mousehack_init moveq.l #26,d0 move.l #$10001,d1 - jsr -198(a6) ; AllocMem + jsr -198(a6); AllocMem move.l d0,a1 lea.l exter_name(pc),a0 move.l a0,10(a1) @@ -169,7 +172,7 @@ make_dev: ; IN: A0 param_packet, D6: uni move.w #$FFFC,d0 ; filesys base bsr.w getrtbase move.l (a0),a5 - move.w #$FF28,d0 ; fill in unit-dependent info, return 1 if hardfile. + move.w #$FF28,d0 ; fill in unit-dependent info (filesys_dev_storeinfo) bsr.w getrtbase move.l a0,a1 move.l (sp)+,a0 @@ -181,9 +184,12 @@ make_dev: ; IN: A0 param_packet, D6: uni bne.w general_ret move.l a4,a6 + move.l a0,-(sp) jsr -144(a6) ; MakeDosNode() + move.l (sp)+,a0 ; parmpacket + move.l a0,a1 move.l d0,a3 ; devicenode - move.w #$FF20,d0 ; record in ui.startup + move.w #$FF20,d0 ; record in ui.startup (filesys_dev_remember) bsr.w getrtbase jsr (a0) moveq.l #0,d0 @@ -191,7 +197,9 @@ make_dev: ; IN: A0 param_packet, D6: uni move.l d0,16(a3) ; dn_Handler move.l d0,32(a3) ; dn_SegList - tst.l d3 + move.l d3,d0 + move.b 79(a1),d3 ; bootpri + tst.l d0 bne.b MKDV_doboot MKDV_is_filesys: @@ -200,23 +208,24 @@ MKDV_is_filesys: move.l a1,d0 lsr.l #2,d0 move.l d0,32(a3) ; dn_SegList - move.l #-1,36(a3) ; dn_GlobalVec + moveq.l #-1,d0 + move.l d0,36(a3) ; dn_GlobalVec MKDV_doboot: tst.l d7 beq.b MKDV_noboot - move.l 4.w,a6 + move.l 4,a6 moveq.l #20,d0 moveq.l #0,d1 - jsr -198(a6) ; AllocMem + jsr -198(a6); AllocMem move.l d0,a1 ; bootnode moveq.l #0,d0 move.l d0,(a1) move.l d0,4(a1) move.w d0,14(a1) - move.w #$10FF,d0 - sub.b d6,d0 + move.w #$1000,d0 + or.b d3,d0 move.w d0,8(a1) move.l $104(a5),10(a1) ; filesys_configdev move.l a3,16(a1) ; devicenode @@ -232,7 +241,7 @@ MKDV_noboot: jmp -150(a6) ; AddDosNode filesys_mainloop: - move.l 4.w,a6 + move.l 4,a6 moveq.l #0,d0 move.l d0,a1 jsr -294(a6) ; FindTask @@ -251,9 +260,10 @@ filesys_mainloop: ; 8: second thread's lock chain ; 12: dummy message ; 32: the volume (80+44+1 bytes) - move.l #80+44+1+20+12,d0 + ; 157: mousehack started-flag + move.l #80+44+1+20+12+1,d0 move.l #$10001,d1 ; MEMF_PUBLIC | MEMF_CLEAR - jsr -198(a6) ; AllocMem + jsr -198(a6); AllocMem move.l d0,a3 moveq.l #0,d6 move.l d6,(a3) @@ -273,7 +283,7 @@ filesys_mainloop: bsr.w getrtbase moveq.l #0,d0 jsr (a0) - bra.b FSML_Reply + bra.w FSML_Reply ; We abuse some of the fields of the message we get. Offset 0 is ; used for chaining unprocessed commands, and offset 1 is used for @@ -383,7 +393,7 @@ LKCK_ListEnd: move.l d7,a2 moveq.l #24,d0 ; sizeof Lock is 20, 4 for chain moveq.l #1,d1 ; MEMF_PUBLIC - jsr -198(a6) ; AllocMem + jsr -198(a6); AllocMem addq.w #1,d6 move.l d0,a2 move.l d7,(a2) @@ -420,7 +430,262 @@ getrtbase: add.l d0,a0 rts +; mouse hack + +newlist: + move.l a0,(a0) + addq.l #4,(a0) + clr.l 4(a0) + move.l a0,8(a0) + rts + +createport: + movem.l d2/a2/a6,-(sp) + move.l 4,a6 + moveq #-1,d0 + jsr -$014a(a6) ;AllocSignal + sub.l a0,a0 + move.l d0,d2 + bmi.s cp_f + moveq #34,d0 + move.l #65536+1,d1 + jsr -198(a6); AllocMem + sub.l a0,a0 + move.l d0,a2 + tst.l d0 + beq.s cp_f + move.b #4,8(a2) ;NT_MSGPORT + move.b d2,15(a2) + sub.l a1,a1 + jsr -$0126(a6) ;FindTask + move.l d0,16(a2) + lea 20(a2),a0 + bsr.w newlist + move.l a2,a0 +cp_f: move.l a0,d0 + movem.l (sp)+,d2/a2/a6 + rts + +createio: + movem.l d2/a2/a6,-(sp) + move.l 4,a6 + tst.l d0 + beq.s cio_f + move.l d0,a2 + moveq #48,d2 + move.l d2,d0 + move.l #65536+1,d1 + jsr -198(a6); AllocMem + move.l d0,a0 + move.b #10,8(a0) ;NT_MESSAGE + move.l d2,18(a0) + move.l a2,14(a0) +cio_f: movem.l (sp)+,d2/a2/a6 + rts + +createtask: + movem.l d2/d3/a2/a3/a6,-(sp) + move.l 4,a6 + move.l a0,d2 + move.l a1,d3 + move.l #92+2048,d0 + move.l #65536+1,d1 + jsr -198(a6); AllocMem + tst.l d0 + beq.b ct_f + move.l d0,a2 + move.b #1,8(a2) ;NT_TASK + move.l d2,10(a2) + lea 92(a2),a3 + move.l a3,58(a2) + lea 2048(a3),a3 + move.l a3,62(a2) + move.l a3,54(a2) + move.l a2,a1 + move.l d3,a2 + sub.l a3,a3 + jsr -$011a(a6) ;AddTask +ct_f: movem.l (sp)+,d2/d3/a2/a3/a6 + rts + +mousehack_e: dc.w 0 +mousehack_x: dc.w 0 +mousehack_y: dc.w 0 + +MH_INT = 0 +MH_FOO = (MH_INT+22) +MH_IEV = (MH_FOO+16) +MH_IO = (MH_IEV+22) +MH_TM = (MH_IO+4) +MH_END = (MH_TM+4) + +mousehack_init: + move.l a0,-(sp) + lea mhname(pc),a0 + lea mousehack_task(pc),a1 + bsr createtask + move.l (sp)+,a0 + rts + +mousehack_task: + move.l 4,a6 + + moveq #-1,d0 + jsr -$014a(a6) ;AllocSignal + moveq #0,d2 + bset d0,d2 + + sub.l a1,a1 + jsr -$0126(a6) ;FindTask + move.l d0,a4 + + moveq #20,d0 + move.l a4,a1 + jsr -$012c(a6) ;SetTaskPri + + moveq #0,d0 + move.w #MH_END,d0 + move.l #65536+1,d1 + jsr -198(a6); AllocMem + move.l d0,a5 + + bsr.w createport + bsr.w createio + move.l d0,MH_IO(a5) + beq mht_f + + bsr.w createport + bsr.w createio + move.l d0,MH_TM(a5) + beq mht_f + + lea MH_FOO(a5),a3 + move.l a4,12(a3);task + move.l d2,8(a3) ;sigmask + moveq #-1,d0 + move.l d0,(a3) ;mx + move.l d0,4(a3) ;my + + lea MH_INT(a5),a1 + move.b #2,8(a1) ;NT_INTERRUPT + move.b #5,9(a1) ;priority + lea mhname(pc),a0 + move.l a0,10(a1) + lea mousehackint(pc),a0 + move.l a0,18(a1) + move.l a3,14(a1) + moveq #5,d0 ;INTB_VERTB + jsr -$00a8(a6) + moveq #0,d7 + moveq #0,d6 + bra.s mhloop +mht_f: rts + +mhloop + move.l d2,d0 + jsr -$013e(a6) ;Wait + + ; Since we're starting up early in the boot process, + ; it's not guaranteed that intuition or the devices are + ; available yet. + tst.l d7 + bne.b mh_gotintuition + + moveq #0,d0 + lea intlibname(pc),a1 + jsr -$0228(a6) + move.l d0,d7 + beq.b mhloop + +mh_gotintuition: + btst #1,d6 + bne.b mh_gotinput + move.l MH_IO(a5),a1 + lea inp_dev(pc),a0 + moveq #0,d0 + moveq #0,d1 + jsr -$01bc(a6) ;OpenDevice + tst.l d0 + bne mhloop + bset #1,d6 + +mh_gotinput: + btst #2,d6 + bne.b mh_gottimer + move.l MH_TM(a5),a1 + lea tim_dev(pc),a0 + moveq #0,d0 + moveq #0,d1 + jsr -$01bc(a6) ;OpenDevice + tst.l d0 + bne mhloop + bset #2,d6 + +mh_gottimer: + move.l MH_IO(a5),a1 + lea MH_IEV(a5),a2 + move.w #11,28(a1) ;IND_WRITEEVENT + move.l #22,36(a1) ;sizeof(struct InputEvent) + move.l a2,40(a1) + move.b #1,30(a1) ;IOF_QUICK + + move.b #4,4(a2) ;IECLASS_POINTERPOS + clr.b 5(a2) ;ie_SubClass + clr.w 6(a2) ;ie_Code + clr.w 8(a2) ;ie_Qualifier + + move.l d7,a0 ;intbase + + move.l MH_FOO+0(a5),d0 + move.w 34+14(a0),d1 + add.w d1,d1 + sub.w d1,d0 + move.w d0,10(a2) + + move.l MH_FOO+4(a5),d0 + move.w 34+12(a0),d1 + add.w d1,d1 + sub.w d1,d0 + ext.l d0 + move.w d0,12(a2) + + move.l MH_TM(a5),a1 + move.w #10,28(a1) ;TR_GETSYSTIME + move.b #1,30(a1) ;IOF_QUICK + jsr -$01c8(a6) ;DoIO + move.l MH_TM(a5),a1 + move.l 32(a1),14(a2) + move.l 36(a1),18(a2) + + move.l MH_IO(a5),a1 + jsr -$01c8(a6) ;DoIO + + bra.w mhloop + +mousehackint: + move.w mousehack_x(pc),d0 + ext.l d0 + move.w mousehack_y(pc),d1 + ext.l d1 + cmp.l (a1),d0 + bne .l1 + cmp.l 4(a1),d1 + beq .l2 +.l1 move.l d1,4(a1) + move.l d0,(a1) + move.l 8(a1),d0 + move.l 12(a1),a1 + move.l 4,a6 + jsr -$0144(a6) ; Signal +.l2 lea $dff000,a0 + moveq #0,d0 + rts + +inp_dev: dc.b 'input.device',0 +tim_dev: dc.b 'timer.device',0 +mhname: dc.b 'UAE mouse hack',0 exter_name: dc.b 'UAE filesystem',0 doslibname: dc.b 'dos.library',0 +intlibname: dc.b 'intuition.library',0 explibname: dc.b 'expansion.library',0 END