|
|
1.1.1.3 root 1: SECTION code,code
1.1 root 2: ; This file can be translated with A68k or PhxAss and then linked with BLink
3: ; to produce an Amiga executable. Make sure it does not contain any
4: ; relocations, then run it through the filesys.sh script
1.1.1.2 root 5: ;
6: ; Patrick: It also works with SAS/C asm+slink, but I had to remove
7: ; the .l from jsr.l and jmp.l.
1.1.1.3 root 8: ; Toni Wilen: modified SECTION, compiles now with AsmOne and clones(?)
9: ; Removed absolute RT_AREA references
1.1.1.5 ! root 10: ; 2002.08.06 RDB automount/autoboot support (Toni Wilen)
! 11: ; 2002.09.11 KS1.3 RDB support (TW)
! 12: ; 2006.18.07 FileSystem.resource find routine access fault fixed (TW)
! 13:
! 14: AllocMem = -198
! 15: FreeMem = -210
! 16:
! 17: ; don't forget filesys.c! */
! 18: PP_MAXSIZE = 4 * 96
! 19: PP_FSSIZE = 400
! 20: PP_FSPTR = 404
! 21: PP_FSRES = 408
! 22: PP_EXPLIB = 412
! 23: PP_FSHDSTART = 416
! 24: PP_TOTAL = (PP_FSHDSTART+140)
1.1 root 25:
26: dc.l 16
27: our_seglist:
28: dc.l 0 ;/* NextSeg */
29: start:
30: bra filesys_mainloop
31: dc.l make_dev-start
32: dc.l filesys_init-start
33: dc.l exter_server-start
34: dc.l bootcode-start
1.1.1.3 root 35: dc.l setup_exter-start
1.1.1.4 root 36: dc.l 0 ; /* p96vsyncfix */
37: dc.l mousehack_x-start
1.1 root 38:
39: bootcode:
40: lea.l doslibname(pc),a1
1.1.1.2 root 41: jsr -96(a6) ; FindResident
1.1 root 42: move.l d0,a0
43: move.l 22(a0),d0
44: move.l d0,a0
45: jsr (a0)
46: rts
47:
48: filesys_init:
49: movem.l d0-d7/a0-a6,-(sp)
1.1.1.4 root 50: move.l 4,a6
1.1.1.3 root 51: move.w #$FFFC,d0 ; filesys base
52: bsr getrtbase
53: move.l (a0),a5
1.1 root 54: lea.l explibname(pc),a1 ; expansion lib name
1.1.1.5 ! root 55: moveq #36,d0
! 56: moveq #0,d5
1.1.1.2 root 57: jsr -552(a6) ; OpenLibrary
1.1 root 58: tst.l d0
59: bne.b FSIN_explibok
60: lea.l explibname(pc),a1 ; expansion lib name
1.1.1.5 ! root 61: moveq #0,d0
! 62: moveq #1,d5
1.1.1.2 root 63: jsr -552(a6) ; OpenLibrary
1.1 root 64: FSIN_explibok:
65: move.l d0,a4
1.1.1.5 ! root 66: move.l #PP_TOTAL,d0
! 67: moveq #1,d1 ; MEMF_PUBLIC
! 68: jsr AllocMem(a6)
1.1 root 69: move.l d0,a3 ; param packet
70:
1.1.1.5 ! root 71: move.l #PP_TOTAL,d7 ; initialize it
! 72: subq.l #4,d7
1.1 root 73: FSIN_loop:
74: move.l 0(a5,d7.l),0(a3,d7.l)
75: subq.l #4,d7
76: bcc.b FSIN_loop
1.1.1.5 ! root 77: move.l a4,PP_EXPLIB(a3)
1.1 root 78:
1.1.1.5 ! root 79: moveq #0,d6
1.1 root 80: FSIN_init_units:
81: cmp.l $10c(a5),d6
82: bcc.b FSIN_units_ok
1.1.1.5 ! root 83: move.l d6,-(sp)
! 84: FSIN_nextsub:
! 85: moveq #1,d7
! 86: move.l a3,-(sp)
1.1 root 87: move.l a3,a0
1.1.1.5 ! root 88: bsr.w make_dev
! 89: move.l (sp)+,a3
! 90: cmp.l #-2,d3
! 91: beq.b FSIN_nomoresub
! 92: swap d6
! 93: addq.w #1,d6
! 94: swap d6
! 95: bra.b FSIN_nextsub
! 96: FSIN_nomoresub:
! 97: move.l (sp)+,d6
! 98: addq.w #1,d6
1.1 root 99: bra.b FSIN_init_units
100:
101: FSIN_units_ok:
1.1.1.4 root 102: move.l 4,a6
1.1 root 103: move.l a4,a1
1.1.1.2 root 104: jsr -414(a6) ; CloseLibrary
1.1.1.3 root 105: move.w #$FF80,d0
106: bsr.w getrtbase
107: jsr (a0)
1.1 root 108: moveq.l #3,d1
109: moveq.l #-10,d2
110: move.l #$200000,a0
111: sub.l a0,d0
112: bcs.b FSIN_chip_done
113: beq.b FSIN_chip_done
114: moveq.l #0,d4
115: move.l d4,a1
116: jsr -618(a6)
117: FSIN_chip_done
118: movem.l (sp)+,d0-d7/a0-a6
119: general_ret:
120: rts
121:
1.1.1.2 root 122: exter_data:
123: exter_server:
124: movem.l a2,-(sp)
1.1.1.3 root 125: move.w #$FF50,d0
126: bsr.w getrtbase
1.1.1.2 root 127: moveq.l #0,d0
1.1.1.3 root 128: jsr (a0)
1.1.1.2 root 129: tst.l d0
130: beq.b exter_server_exit
131: ; This is the hard part - we have to send some messages.
1.1.1.4 root 132: move.l 4,a6
1.1.1.2 root 133: EXTS_loop:
1.1.1.3 root 134: move.w #$FF50,d0
135: bsr.w getrtbase
1.1.1.2 root 136: moveq.l #2,d0
1.1.1.3 root 137: jsr (a0)
1.1.1.5 ! root 138: cmp.w #1,d0
1.1.1.2 root 139: blt.b EXTS_done
140: bgt.b EXTS_signal_reply
141: jsr -366(a6) ; PutMsg
142: bra.b EXTS_loop
143: EXTS_signal_reply:
1.1.1.5 ! root 144: cmp.w #2,d0
1.1.1.2 root 145: bgt.b EXTS_reply
146: move.l d1,d0
147: jsr -$144(a6) ; Signal
148: bra.b EXTS_loop
149: EXTS_reply:
1.1.1.5 ! root 150: cmp.w #3,d0
1.1.1.3 root 151: bgt.b EXTS_cause
152: jsr -$17a(a6) ; ReplyMsg
153: bra.b EXTS_loop
154: EXTS_cause:
1.1.1.5 ! root 155: cmp.w #4,d0
1.1.1.3 root 156: bgt.b EXTS_jump
157: jsr -$b4(a6) ; Cause
158: bra.b EXTS_loop
159: EXTS_jump:
160: movem.l a2/a5,-(sp)
161: move.l a1,a2 ;CDXL structure
162: move.l 20(a2),a1
163: move.l 24(a2),a5
164: move.l a2,-(sp)
165: jsr (a5) ; cd.device CD_READXL callback
166: move.l (sp)+,d2
167: clr.l 24(a2) ; ugly sync-hack
168: movem.l (sp)+,a2/a5
1.1.1.2 root 169: EXTS_done:
1.1.1.3 root 170: move.w #$FF50,d0
171: bsr.w getrtbase
1.1.1.2 root 172: moveq.l #4,d0
1.1.1.3 root 173: jsr (a0)
1.1.1.2 root 174: moveq.l #1,d0 ; clear Z - it was for us.
175: exter_server_exit:
176: movem.l (sp)+,a2
177: rts
178:
1.1 root 179: setup_exter:
1.1.1.4 root 180: ; bsr.w mousehack_init
1.1 root 181: moveq.l #26,d0
182: move.l #$10001,d1
1.1.1.5 ! root 183: jsr AllocMem(a6)
1.1 root 184: move.l d0,a1
185: lea.l exter_name(pc),a0
186: move.l a0,10(a1)
187: lea.l exter_data(pc),a0
188: move.l a0,14(a1)
189: lea.l exter_server(pc),a0
190: move.l a0,18(a1)
1.1.1.3 root 191: move.b #200,9(a1)
192: move.b #2,8(a1)
1.1 root 193: moveq.l #13,d0
1.1.1.2 root 194: jmp -168(a6) ; AddIntServer
1.1 root 195:
1.1.1.5 ! root 196: addfs: ; a0 = first hunk, a1 = parmpacket
! 197: movem.l d0-d1/a0-a3/a6,-(sp)
! 198: move.l 4,a6
! 199: move.l a0,a2
! 200: move.l a1,a3
! 201: move.l #62+128,d0 ; sizeof(FileSysEntry) + patchflags;
! 202: move.l #$10001,d1
! 203: jsr -198(a6)
! 204: move.l d0,a0
! 205: moveq #0,d0
! 206: lea PP_FSHDSTART(a3),a1
! 207: af1 move.b 0(a1,d0.w),14(a0,d0.w)
! 208: addq.w #1,d0
! 209: cmp.w #140,d0
! 210: bne.s af1
! 211: move.l a2,d0
! 212: lsr.l #2,d0
! 213: move.l d0,54(a0) ;seglist
! 214: move.l a0,a1
! 215: lea exter_name(pc),a0
! 216: move.l a0,10(a1) ; name
! 217: move.l PP_FSRES(a3),a0 ; FileSystem.resource
! 218: lea 18(a0),a0 ; fsr_FileSysEntries
! 219: jsr -$f0(a6) ;AddHead
! 220: movem.l (sp)+,d0-d1/a0-a3/a6
! 221: rts
1.1 root 222:
1.1.1.5 ! root 223: relocate: ;a0=pointer to executable, returns first segment in A0
! 224: movem.l d1-d7/a1-a6,-(sp)
! 225: move.l 4,a6
! 226: move.l a0,a2
! 227: cmp.l #$3f3,(a2)+
! 228: bne.w ree
! 229: addq.l #8,a2 ; skip name end and skip total hunks + 1
! 230: move.l 4(a2),d7 ; last hunk
! 231: sub.l (a2),d7 ; first hunk
! 232: addq.l #8,a2 ; skip hunk to load first and hunk to load last
! 233: addq.l #1,d7
! 234: move.l a2,a3
! 235: move.l d7,d0
! 236: add.l d0,d0
! 237: add.l d0,d0
! 238: add.l d0,a3
! 239: move.l a2,a4
! 240:
! 241: ; allocate hunks
! 242: sub.l a5,a5 ;prev segment
! 243: moveq #0,d6
! 244: r15 move.l (a2),d2 ; hunk size (header)
! 245: lsl.l #2,d2
! 246: moveq #1,d1
! 247: btst #30,d3 ; chip mem?
! 248: beq.s r2
! 249: bset #1,d1
! 250: r2 bset #16,d1
! 251: bclr #31,d3
! 252: bclr #30,d3
! 253: move.l d2,d0
! 254: bne.s r17
! 255: clr.l (a2)+ ; empty hunk
! 256: bra.s r18
! 257: r17 addq.l #8,d0 ; size + pointer to next hunk + hunk size
! 258: jsr AllocMem(a6)
! 259: tst.l d0
! 260: beq.w ree
! 261: move.l d0,a0
! 262: move.l d2,(a0)+ ; store size
! 263: move.l a0,(a2)+ ; store new pointer
! 264: move.l a5,d1
! 265: beq.s r10
! 266: move.l a0,d0
! 267: lsr.l #2,d0
! 268: move.l d0,(a5)
! 269: r10 move.l a0,a5
! 270: r18 addq.l #1,d6
! 271: cmp.l d6,d7
! 272: bne.s r15
! 273:
! 274: moveq #0,d6
! 275: r3 move.l d6,d1
! 276: add.l d1,d1
! 277: add.l d1,d1
! 278: move.l 0(a4,d1.l),a0
! 279: addq.l #4,a0
! 280: move.l (a3)+,d3 ; hunk type
! 281: move.l (a3)+,d4 ; hunk size
! 282: lsl.l #2,d4
! 283: cmp.l #$3e9,d3 ;code
! 284: beq.s r4
! 285: cmp.l #$3ea,d3 ;data
! 286: bne.s r5
! 287: r4
! 288: ; code and data
! 289: move.l d4,d0
! 290: r6 tst.l d0
! 291: beq.s r7
! 292: move.b (a3)+,(a0)+
! 293: subq.l #1,d0
! 294: bra.s r6
! 295: r5
! 296: cmp.l #$3eb,d3 ;bss
! 297: bne.s ree
! 298:
! 299: r7 ; scan for reloc32 or hunk_end
! 300: move.l (a3)+,d3
! 301: cmp.l #$3ec,d3 ;reloc32
! 302: bne.s r13
! 303:
! 304: ; relocate
! 305: move.l d6,d1
! 306: add.l d1,d1
! 307: add.l d1,d1
! 308: move.l 0(a4,d1.l),a0 ; current hunk
! 309: addq.l #4,a0
! 310: r11 move.l (a3)+,d0 ;number of relocs
! 311: beq.s r7
! 312: move.l (a3)+,d1 ;hunk
! 313: add.l d1,d1
! 314: add.l d1,d1
! 315: move.l 0(a4,d1.l),d3 ;hunk start address
! 316: addq.l #4,d3
! 317: r9 move.l (a3)+,d2 ;offset
! 318: add.l d3,0(a0,d2.l)
! 319: subq.l #1,d0
! 320: bne.s r9
! 321: bra.s r11
! 322: r13
! 323: cmp.l #$3f2,d3 ;end
! 324: bne.s ree
! 325:
! 326: addq.l #1,d6
! 327: cmp.l d6,d7
! 328: bne.w r3
! 329:
! 330: moveq #1,d7
! 331: move.l (a4),a0
! 332: r0 move.l d7,d0
! 333: movem.l (sp)+,d1-d7/a1-a6
! 334: rts
! 335: ree move.w #30000,d0
! 336: re1 move.w #$f00,$dff180
! 337: move.w #$00f,$dff180
! 338: move.w #$0f0,$dff180
! 339: dbf d0,re1
! 340: moveq #0,d7
! 341: bra.s r0
! 342:
! 343: fsres
! 344: movem.l d1/a0-a2/a6,-(sp)
! 345: move.l 4,a6
! 346: lea $150(a6),a0 ;ResourceList
! 347: move.l (a0),a0 ;lh_Head
! 348: fsres3
! 349: tst.l (a0) ;end of list?
! 350: beq.s fsres1
! 351: move.l 10(a0),a1 ;name
! 352: lea fsresname(pc),a2
! 353: fsres5
! 354: move.b (a1)+,d0
! 355: move.b (a2)+,d1
! 356: cmp.b d1,d0
! 357: bne.s fsres2
! 358: tst.b d0
! 359: beq.s fsres4
! 360: bra.s fsres5
! 361: fsres2
! 362: move.l (a0),a0
! 363: bra.s fsres3
! 364: ; FileSystem.resource does not exist -> create it
! 365: fsres1
! 366: moveq #32,d0 ; sizeof(FileSysResource)
! 367: move.l #$10001,d1
! 368: jsr AllocMem(a6)
! 369: move.l d0,a2
! 370: move.b #8,8(a2) ; NT_RESOURCE
! 371: lea fsresname(pc),a0
! 372: move.l a0,10(a2) ; node name
! 373: lea exter_name(pc),a0
! 374: move.l a0,14(a2) ; fsr_Creator
! 375: lea 18(a2),a0
! 376: move.l a0,(a0) ; NewList() fsr_FileSysEntries
! 377: addq.l #4,(a0)
! 378: move.l a0,8(a0)
! 379: lea $150(a6),a0 ; ResourceList
! 380: move.l a2,a1
! 381: jsr -$f6(a6) ; AddTail
! 382: move.l a2,a0
! 383: fsres4
! 384: move.l a0,d0
! 385: movem.l (sp)+,d1/a0-a2/a6
! 386: rts
! 387:
! 388: make_dev: ; IN: A0 param_packet, D6: unit_no, D7: boot, A4: expansionbase
! 389: bsr.w fsres
! 390: move.l d0,PP_FSRES(a0) ; pointer to FileSystem.resource
1.1.1.3 root 391: move.l a0,-(sp)
392: move.w #$FFFC,d0 ; filesys base
393: bsr.w getrtbase
394: move.l (a0),a5
1.1.1.4 root 395: move.w #$FF28,d0 ; fill in unit-dependent info (filesys_dev_storeinfo)
1.1.1.3 root 396: bsr.w getrtbase
397: move.l a0,a1
398: move.l (sp)+,a0
1.1.1.5 ! root 399: clr.l PP_FSSIZE(a0) ; filesystem size
! 400: clr.l PP_FSPTR(a0) ; filesystem memory
1.1.1.3 root 401: jsr (a1)
1.1.1.5 ! root 402: ; ret:0=virtual,1=hardfile,2=rdbhardfile,-1=hardfile-donotmount,-2=no more subunits
1.1 root 403: move.l d0,d3
1.1.1.5 ! root 404: cmp.l #-2,d3
! 405: beq.w general_ret
! 406: cmp.l #2,d3
! 407: beq.b MKDV_mountalways
1.1 root 408:
409: ; Don't init hardfiles if < V36
410: and.l d5,d0
1.1.1.5 ! root 411: beq.b MKDV_mountalways
! 412: tst.l PP_FSSIZE(a0)
! 413: beq.w general_ret ; no filesystem -> don't mount
! 414:
! 415: MKDV_mountalways:
! 416: ; allocate memory for loaded filesystem
! 417: move.l PP_FSSIZE(a0),d0
! 418: beq.b MKDV_nordbfs1
! 419: move.l a0,-(sp)
! 420: moveq #1,d1
! 421: move.l 4,a6
! 422: jsr AllocMem(a6)
! 423: move.l (sp)+,a0
! 424: move.l d0,PP_FSPTR(a0)
! 425:
! 426: MKDV_nordbfs1:
! 427: ; if negative, do not mount but we might need to load possible
! 428: ; custom filesystem(s)
! 429: tst.l d3
! 430: bmi.s MKDV_devremember
1.1 root 431:
432: move.l a4,a6
1.1.1.4 root 433: move.l a0,-(sp)
1.1.1.2 root 434: jsr -144(a6) ; MakeDosNode()
1.1.1.4 root 435: move.l (sp)+,a0 ; parmpacket
1.1 root 436: move.l d0,a3 ; devicenode
1.1.1.5 ! root 437: moveq #0,d0
1.1 root 438: move.l d0,8(a3) ; dn_Task
439: move.l d0,16(a3) ; dn_Handler
440: move.l d0,32(a3) ; dn_SegList
441:
1.1.1.5 ! root 442: MKDV_devremember:
! 443: move.l a0,a1
! 444: move.w #$FF20,d0 ; record in ui.startup (filesys_dev_remember)
! 445: bsr.w getrtbase
! 446: jsr (a0)
! 447:
! 448: tst.l PP_FSPTR(a1) ; filesystem?
! 449: beq.b MKDV_nordbfs2
! 450: move.l PP_FSPTR(a1),a0
! 451: move.l d3,-(sp)
! 452: bsr.w relocate
! 453: move.l (sp)+,d3
! 454: movem.l d0/a0-a1,-(sp)
! 455: move.l PP_FSSIZE(a1),d0
! 456: move.l PP_FSPTR(a1),a1
! 457: move.l 4,a6
! 458: jsr FreeMem(a6)
! 459: movem.l (sp)+,d0/a0-a1
1.1.1.4 root 460: tst.l d0
1.1.1.5 ! root 461: beq.b MKDV_nordbfs2
! 462: bsr.w addfs
! 463:
! 464: MKDV_nordbfs2:
! 465: tst.l d3
! 466: bmi.w general_ret
! 467:
! 468: move.w #$FF18,d0 ; update dn_SegList if needed (filesys_dev_bootfilesys)
! 469: bsr.w getrtbase
! 470: jsr (a0)
! 471:
! 472: move.b 79(a1),d4 ; bootpri
! 473: tst.l d3
1.1 root 474: bne.b MKDV_doboot
475:
476: move.l #4000,20(a3) ; dn_StackSize
477: lea.l our_seglist(pc),a1
478: move.l a1,d0
479: lsr.l #2,d0
480: move.l d0,32(a3) ; dn_SegList
1.1.1.5 ! root 481: moveq #-1,d0
1.1.1.4 root 482: move.l d0,36(a3) ; dn_GlobalVec
1.1 root 483:
484: MKDV_doboot:
485: tst.l d7
486: beq.b MKDV_noboot
487:
1.1.1.4 root 488: move.l 4,a6
1.1 root 489: moveq.l #20,d0
490: moveq.l #0,d1
1.1.1.5 ! root 491: jsr AllocMem(a6)
1.1 root 492: move.l d0,a1 ; bootnode
493: moveq.l #0,d0
494: move.l d0,(a1)
495: move.l d0,4(a1)
496: move.w d0,14(a1)
1.1.1.4 root 497: move.w #$1000,d0
1.1.1.5 ! root 498: or.b d4,d0
1.1 root 499: move.w d0,8(a1)
500: move.l $104(a5),10(a1) ; filesys_configdev
501: move.l a3,16(a1) ; devicenode
502: lea.l 74(a4),a0 ; MountList
1.1.1.2 root 503: jmp -270(a6) ; Enqueue()
1.1 root 504:
505: MKDV_noboot:
506: move.l a3,a0
1.1.1.5 ! root 507: moveq #0,d1
1.1 root 508: move.l d1,a1
1.1.1.5 ! root 509: moveq #-1,d0
1.1 root 510: move.l a4,a6 ; expansion base
1.1.1.2 root 511: jmp -150(a6) ; AddDosNode
1.1 root 512:
513: filesys_mainloop:
1.1.1.4 root 514: move.l 4,a6
1.1 root 515: moveq.l #0,d0
516: move.l d0,a1
517: jsr -294(a6) ; FindTask
518: move.l d0,a0
519: lea.l $5c(a0),a5 ; pr_MsgPort
520:
521: ; Open DOS library
522: lea.l doslibname(pc),a1
523: moveq.l #0,d0
524: jsr -552(a6) ; OpenLibrary
525: move.l d0,a2
526:
527: ; Allocate some memory. Usage:
528: ; 0: lock chain
529: ; 4: command chain
530: ; 8: second thread's lock chain
531: ; 12: dummy message
532: ; 32: the volume (80+44+1 bytes)
1.1.1.4 root 533: ; 157: mousehack started-flag
534: move.l #80+44+1+20+12+1,d0
1.1 root 535: move.l #$10001,d1 ; MEMF_PUBLIC | MEMF_CLEAR
1.1.1.5 ! root 536: jsr AllocMem(a6)
1.1 root 537: move.l d0,a3
538: moveq.l #0,d6
539: move.l d6,(a3)
540: move.l d6,4(a3)
541: move.l d6,8(a3)
542:
543: moveq.l #0,d5 ; No commands queued.
544:
545: ; Fetch our startup packet
546: move.l a5,a0
547: jsr -384(a6) ; WaitPort
548: move.l a5,a0
549: jsr -372(a6) ; GetMsg
550: move.l d0,a4
551: move.l 10(a4),d3 ; ln_Name
1.1.1.3 root 552: move.w #$FF40,d0
553: bsr.w getrtbase
1.1 root 554: moveq.l #0,d0
1.1.1.3 root 555: jsr (a0)
1.1.1.4 root 556: bra.w FSML_Reply
1.1 root 557:
558: ; We abuse some of the fields of the message we get. Offset 0 is
559: ; used for chaining unprocessed commands, and offset 1 is used for
560: ; indicating the status of a command. 0 means the command was handed
561: ; off to some UAE thread and did not complete yet, 1 means we didn't
562: ; even hand it over yet because we were afraid that might blow some
563: ; pipe limit, and -1 means the command was handed over and has completed
564: ; processing by now, so it's safe to reply to it.
565:
566: FSML_loop:
567: move.l a5,a0
568: jsr -384(a6) ; WaitPort
569: move.l a5,a0
570: jsr -372(a6) ; GetMsg
571: move.l d0,a4
572: move.l 10(a4),d3 ; ln_Name
573: bne.b FSML_FromDOS
574:
575: ; It's a dummy packet indicating that some queued command finished.
1.1.1.3 root 576: move.w #$FF50,d0
577: bsr.w getrtbase
1.1 root 578: moveq.l #1,d0
1.1.1.3 root 579: jsr (a0)
1.1 root 580: ; Go through the queue and reply all those that finished.
581: lea.l 4(a3),a2
582: move.l (a2),a0
583: FSML_check_old:
584: move.l a0,d0
585: beq.b FSML_loop
586: move.l (a0),a1
587: move.l d0,a0
588: ; This field may be accessed concurrently by several UAE threads.
589: ; This _should_ be harmless on all reasonable machines.
590: move.l 4(a0),d0
591: bpl.b FSML_check_next
592: movem.l a0/a1,-(a7)
593: move.l 10(a0),a4
594: bsr.b ReplyOne
595: subq.l #1,d5 ; One command less in the queue
596: movem.l (a7)+,a0/a1
597: move.l a1,(a2)
598: move.l a1,a0
599: bra.b FSML_check_old
600: FSML_check_next:
601: move.l a0,a2
602: move.l a1,a0
603: bra.b FSML_check_old
604:
605: FSML_FromDOS:
606: ; Limit the number of outstanding started commands. We can handle an
607: ; unlimited number of unstarted commands.
608: cmp.l #20,d5
609: bcs FSML_DoCommand
610: ; Too many commands queued.
611: moveq.l #1,d0
612: move.l d0,4(a4)
613: bra.b FSML_Enqueue
614:
615: FSML_DoCommand:
616: bsr.b LockCheck ; Make sure there are enough locks for the C code to grab.
1.1.1.3 root 617: move.w #$FF30,d0
618: bsr.w getrtbase
619: jsr (a0)
1.1 root 620: tst.l d0
621: beq.b FSML_Reply
622: ; The command did not complete yet. Enqueue it and increase number of
623: ; queued commands
624: ; The C code already set 4(a4) to 0
625: addq.l #1,d5
626: FSML_Enqueue:
627: move.l 4(a3),(a4)
628: move.l a4,4(a3)
629: bra.b FSML_loop
630:
631: FSML_Reply:
632: move.l d3,a4
633: bsr.b ReplyOne
1.1.1.3 root 634: bra.w FSML_loop
1.1 root 635:
636: ReplyOne:
637: move.l (a4),a1 ; dp_Link
638: move.l 4(a4),a0 ; dp_Port
639: move.l a5,4(a4)
640: jmp -366(a6) ; PutMsg
641:
642: ; ugly code to avoid calling AllocMem / FreeMem from native C code.
643: ; We keep a linked list of 3 locks. In theory, only one should ever
644: ; be used. Before handling every packet, we check that the list has the
645: ; right length.
646:
647: LockCheck:
648: move.l d5,-(a7)
649: moveq.l #-4,d5 ; Keep three locks
650: move.l (a3),a2
651: move.l a2,d7
652: LKCK_Loop:
653: move.l a2,d1
654: beq LKCK_ListEnd
655: addq.l #1,d5
656: beq.b LKCK_TooMany
657: move.l a2,a1
658: move.l (a2),a2
659: bra.b LKCK_Loop
660: LKCK_ListEnd:
661: addq.l #1,d5
662: beq.b LKCK_ret
663: move.l d7,a2
664: moveq.l #24,d0 ; sizeof Lock is 20, 4 for chain
665: moveq.l #1,d1 ; MEMF_PUBLIC
1.1.1.5 ! root 666: jsr AllocMem(a6)
1.1 root 667: addq.w #1,d6
668: move.l d0,a2
669: move.l d7,(a2)
670: move.l a2,d7
671: bra.b LKCK_ListEnd
672: LKCK_TooMany:
673: move.l (a2),d0 ; We have too many, but we tolerate that to some extent.
674: beq.b LKCK_ret
675: move.l d0,a0
676: move.l (a0),d0
677: beq.b LKCK_ret
678: move.l d0,a0
679: move.l (a0),d0
680: beq.b LKCK_ret
681:
682: moveq.l #0,d0 ; Now we are sure that we really have too many. Delete some.
683: move.l d0,(a1)
684: LKCK_TooManyLoop:
685: move.l a2,a1
686: move.l (a1),a2
687: moveq.l #24,d0
688: jsr -210(a6) ; FreeMem
689: add.l #$10000,d6
690: move.l a2,d0
691: bne.b LKCK_TooManyLoop
692: LKCK_ret:
693: move.l d7,(a3)
694: move.l (a7)+,d5
695: rts
696:
1.1.1.3 root 697: getrtbase:
698: lea start-8-4(pc),a0
699: and.l #$FFFF,d0
700: add.l d0,a0
701: rts
702:
1.1.1.4 root 703: ; mouse hack
704:
705: newlist:
706: move.l a0,(a0)
707: addq.l #4,(a0)
708: clr.l 4(a0)
709: move.l a0,8(a0)
710: rts
711:
712: createport:
713: movem.l d2/a2/a6,-(sp)
714: move.l 4,a6
715: moveq #-1,d0
716: jsr -$014a(a6) ;AllocSignal
717: sub.l a0,a0
718: move.l d0,d2
719: bmi.s cp_f
720: moveq #34,d0
721: move.l #65536+1,d1
1.1.1.5 ! root 722: jsr AllocMem(a6)
1.1.1.4 root 723: sub.l a0,a0
724: move.l d0,a2
725: tst.l d0
726: beq.s cp_f
727: move.b #4,8(a2) ;NT_MSGPORT
728: move.b d2,15(a2)
729: sub.l a1,a1
730: jsr -$0126(a6) ;FindTask
731: move.l d0,16(a2)
732: lea 20(a2),a0
733: bsr.w newlist
734: move.l a2,a0
735: cp_f: move.l a0,d0
736: movem.l (sp)+,d2/a2/a6
737: rts
738:
739: createio:
740: movem.l d2/a2/a6,-(sp)
741: move.l 4,a6
742: tst.l d0
743: beq.s cio_f
744: move.l d0,a2
745: moveq #48,d2
746: move.l d2,d0
747: move.l #65536+1,d1
1.1.1.5 ! root 748: jsr AllocMem(a6)
1.1.1.4 root 749: move.l d0,a0
750: move.b #10,8(a0) ;NT_MESSAGE
751: move.l d2,18(a0)
752: move.l a2,14(a0)
753: cio_f: movem.l (sp)+,d2/a2/a6
754: rts
755:
756: createtask:
757: movem.l d2/d3/a2/a3/a6,-(sp)
758: move.l 4,a6
759: move.l a0,d2
760: move.l a1,d3
761: move.l #92+2048,d0
762: move.l #65536+1,d1
1.1.1.5 ! root 763: jsr AllocMem(a6)
1.1.1.4 root 764: tst.l d0
765: beq.b ct_f
766: move.l d0,a2
767: move.b #1,8(a2) ;NT_TASK
768: move.l d2,10(a2)
769: lea 92(a2),a3
770: move.l a3,58(a2)
771: lea 2048(a3),a3
772: move.l a3,62(a2)
773: move.l a3,54(a2)
774: move.l a2,a1
775: move.l d3,a2
776: sub.l a3,a3
777: jsr -$011a(a6) ;AddTask
778: ct_f: movem.l (sp)+,d2/d3/a2/a3/a6
779: rts
780:
781: mousehack_e: dc.w 0
782: mousehack_x: dc.w 0
783: mousehack_y: dc.w 0
784:
785: MH_INT = 0
786: MH_FOO = (MH_INT+22)
787: MH_IEV = (MH_FOO+16)
788: MH_IO = (MH_IEV+22)
789: MH_TM = (MH_IO+4)
790: MH_END = (MH_TM+4)
791:
792: mousehack_init:
793: move.l a0,-(sp)
794: lea mhname(pc),a0
795: lea mousehack_task(pc),a1
796: bsr createtask
797: move.l (sp)+,a0
798: rts
799:
800: mousehack_task:
801: move.l 4,a6
802:
803: moveq #-1,d0
804: jsr -$014a(a6) ;AllocSignal
805: moveq #0,d2
806: bset d0,d2
807:
808: sub.l a1,a1
809: jsr -$0126(a6) ;FindTask
810: move.l d0,a4
811:
812: moveq #20,d0
813: move.l a4,a1
814: jsr -$012c(a6) ;SetTaskPri
815:
816: moveq #0,d0
817: move.w #MH_END,d0
818: move.l #65536+1,d1
1.1.1.5 ! root 819: jsr AllocMem(a6)
1.1.1.4 root 820: move.l d0,a5
821:
822: bsr.w createport
823: bsr.w createio
824: move.l d0,MH_IO(a5)
825: beq mht_f
826:
827: bsr.w createport
828: bsr.w createio
829: move.l d0,MH_TM(a5)
830: beq mht_f
831:
832: lea MH_FOO(a5),a3
833: move.l a4,12(a3);task
834: move.l d2,8(a3) ;sigmask
835: moveq #-1,d0
836: move.l d0,(a3) ;mx
837: move.l d0,4(a3) ;my
838:
839: lea MH_INT(a5),a1
840: move.b #2,8(a1) ;NT_INTERRUPT
841: move.b #5,9(a1) ;priority
842: lea mhname(pc),a0
843: move.l a0,10(a1)
844: lea mousehackint(pc),a0
845: move.l a0,18(a1)
846: move.l a3,14(a1)
847: moveq #5,d0 ;INTB_VERTB
848: jsr -$00a8(a6)
849: moveq #0,d7
850: moveq #0,d6
851: bra.s mhloop
852: mht_f: rts
853:
854: mhloop
855: move.l d2,d0
856: jsr -$013e(a6) ;Wait
857:
858: ; Since we're starting up early in the boot process,
859: ; it's not guaranteed that intuition or the devices are
860: ; available yet.
861: tst.l d7
862: bne.b mh_gotintuition
863:
864: moveq #0,d0
865: lea intlibname(pc),a1
866: jsr -$0228(a6)
867: move.l d0,d7
868: beq.b mhloop
869:
870: mh_gotintuition:
871: btst #1,d6
872: bne.b mh_gotinput
873: move.l MH_IO(a5),a1
874: lea inp_dev(pc),a0
875: moveq #0,d0
876: moveq #0,d1
877: jsr -$01bc(a6) ;OpenDevice
878: tst.l d0
879: bne mhloop
880: bset #1,d6
881:
882: mh_gotinput:
883: btst #2,d6
884: bne.b mh_gottimer
885: move.l MH_TM(a5),a1
886: lea tim_dev(pc),a0
887: moveq #0,d0
888: moveq #0,d1
889: jsr -$01bc(a6) ;OpenDevice
890: tst.l d0
891: bne mhloop
892: bset #2,d6
893:
894: mh_gottimer:
895: move.l MH_IO(a5),a1
896: lea MH_IEV(a5),a2
897: move.w #11,28(a1) ;IND_WRITEEVENT
898: move.l #22,36(a1) ;sizeof(struct InputEvent)
899: move.l a2,40(a1)
900: move.b #1,30(a1) ;IOF_QUICK
901:
902: move.b #4,4(a2) ;IECLASS_POINTERPOS
903: clr.b 5(a2) ;ie_SubClass
904: clr.w 6(a2) ;ie_Code
905: clr.w 8(a2) ;ie_Qualifier
906:
907: move.l d7,a0 ;intbase
908:
909: move.l MH_FOO+0(a5),d0
910: move.w 34+14(a0),d1
911: add.w d1,d1
912: sub.w d1,d0
913: move.w d0,10(a2)
914:
915: move.l MH_FOO+4(a5),d0
916: move.w 34+12(a0),d1
917: add.w d1,d1
918: sub.w d1,d0
919: ext.l d0
920: move.w d0,12(a2)
921:
922: move.l MH_TM(a5),a1
923: move.w #10,28(a1) ;TR_GETSYSTIME
924: move.b #1,30(a1) ;IOF_QUICK
925: jsr -$01c8(a6) ;DoIO
926: move.l MH_TM(a5),a1
927: move.l 32(a1),14(a2)
928: move.l 36(a1),18(a2)
929:
930: move.l MH_IO(a5),a1
931: jsr -$01c8(a6) ;DoIO
932:
933: bra.w mhloop
934:
935: mousehackint:
936: move.w mousehack_x(pc),d0
937: ext.l d0
938: move.w mousehack_y(pc),d1
939: ext.l d1
940: cmp.l (a1),d0
941: bne .l1
942: cmp.l 4(a1),d1
943: beq .l2
944: .l1 move.l d1,4(a1)
945: move.l d0,(a1)
946: move.l 8(a1),d0
947: move.l 12(a1),a1
948: move.l 4,a6
949: jsr -$0144(a6) ; Signal
950: .l2 lea $dff000,a0
951: moveq #0,d0
952: rts
953:
954: inp_dev: dc.b 'input.device',0
955: tim_dev: dc.b 'timer.device',0
956: mhname: dc.b 'UAE mouse hack',0
1.1 root 957: exter_name: dc.b 'UAE filesystem',0
958: doslibname: dc.b 'dos.library',0
1.1.1.4 root 959: intlibname: dc.b 'intuition.library',0
1.1 root 960: explibname: dc.b 'expansion.library',0
1.1.1.5 ! root 961: fsresname: dc.b 'FileSystem.resource',0
1.1 root 962: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.