Annotation of uae/src/filesys.asm, revision 1.1.1.4

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       root       10: 
                     11:        dc.l 16
                     12: our_seglist:
                     13:        dc.l 0 ;/* NextSeg */
                     14: start:
                     15:        bra filesys_mainloop
                     16:        dc.l make_dev-start
                     17:        dc.l filesys_init-start
                     18:        dc.l exter_server-start
                     19:        dc.l bootcode-start
1.1.1.3   root       20:        dc.l setup_exter-start
1.1.1.4 ! root       21:        dc.l 0 ; /* p96vsyncfix */
        !            22:        dc.l mousehack_x-start
1.1       root       23: 
                     24: bootcode:
                     25:        lea.l doslibname(pc),a1
1.1.1.2   root       26:        jsr -96(a6) ; FindResident
1.1       root       27:        move.l d0,a0
                     28:        move.l 22(a0),d0
                     29:        move.l d0,a0
                     30:        jsr (a0)
                     31:        rts
                     32: 
                     33: filesys_init:
                     34:        movem.l d0-d7/a0-a6,-(sp)
1.1.1.4 ! root       35:        move.l 4,a6
1.1.1.3   root       36:        move.w #$FFFC,d0 ; filesys base
                     37:        bsr getrtbase
                     38:        move.l (a0),a5
1.1       root       39:        lea.l explibname(pc),a1 ; expansion lib name
                     40:        moveq.l #36,d0
                     41:        moveq.l #0,d5
1.1.1.2   root       42:        jsr  -552(a6) ; OpenLibrary
1.1       root       43:        tst.l d0
                     44:        bne.b FSIN_explibok
                     45:        lea.l explibname(pc),a1 ; expansion lib name
                     46:        moveq.l #0,d0
                     47:        moveq.l #1,d5
1.1.1.2   root       48:        jsr  -552(a6) ; OpenLibrary
1.1       root       49: FSIN_explibok:
                     50:        move.l d0,a4
                     51:        moveq.l #88,d0
                     52:        moveq.l #1,d1 ; MEMF_PUBLIC
1.1.1.4 ! root       53:        jsr -198(a6); AllocMem
1.1       root       54:        move.l d0,a3  ; param packet
                     55: 
                     56:        moveq.l #84,d7 ; initialize it
                     57: FSIN_loop:
                     58:        move.l 0(a5,d7.l),0(a3,d7.l)
                     59:        subq.l #4,d7
                     60:        bcc.b FSIN_loop
                     61: 
                     62:        moveq.l #0,d6
                     63: FSIN_init_units:
                     64:        cmp.l  $10c(a5),d6
                     65:        bcc.b FSIN_units_ok
                     66:        move.l a3,a0
                     67:        movem.l d6/a3,-(sp)
                     68:        move.l  #1,d7
1.1.1.2   root       69:        bsr.w   make_dev
1.1       root       70:        movem.l (sp)+,d6/a3
                     71:        addq.l #$1,d6
                     72:        bra.b  FSIN_init_units
                     73: 
                     74: FSIN_units_ok:
1.1.1.4 ! root       75:        move.l 4,a6
1.1       root       76:        move.l a4,a1
1.1.1.2   root       77:        jsr -414(a6) ; CloseLibrary
1.1.1.3   root       78:        move.w #$FF80,d0
                     79:        bsr.w getrtbase
                     80:        jsr (a0)
1.1       root       81:        moveq.l #3,d1
                     82:        moveq.l #-10,d2
                     83:        move.l #$200000,a0
                     84:        sub.l a0,d0
                     85:        bcs.b FSIN_chip_done
                     86:        beq.b FSIN_chip_done
                     87:        moveq.l #0,d4
                     88:        move.l d4,a1
                     89:        jsr -618(a6)
                     90: FSIN_chip_done
                     91:        movem.l (sp)+,d0-d7/a0-a6
                     92: general_ret:
                     93:        rts
                     94: 
1.1.1.2   root       95: exter_data:
                     96: exter_server:
                     97:        movem.l a2,-(sp)
1.1.1.3   root       98:        move.w #$FF50,d0
                     99:        bsr.w getrtbase
1.1.1.2   root      100:        moveq.l #0,d0
1.1.1.3   root      101:        jsr (a0)
1.1.1.2   root      102:        tst.l d0
                    103:        beq.b exter_server_exit
                    104:        ; This is the hard part - we have to send some messages.
1.1.1.4 ! root      105:        move.l 4,a6
1.1.1.2   root      106: EXTS_loop:
1.1.1.3   root      107:        move.w #$FF50,d0
                    108:        bsr.w getrtbase
1.1.1.2   root      109:        moveq.l #2,d0
1.1.1.3   root      110:        jsr (a0)
1.1.1.2   root      111:        cmp.l #1,d0
                    112:        blt.b EXTS_done
                    113:        bgt.b EXTS_signal_reply
                    114:        jsr -366(a6) ; PutMsg
                    115:        bra.b EXTS_loop
                    116: EXTS_signal_reply:
                    117:         cmp.l #2,d0
                    118:         bgt.b EXTS_reply
                    119:        move.l d1,d0
                    120:        jsr -$144(a6)   ; Signal
                    121:        bra.b EXTS_loop
                    122: EXTS_reply:
1.1.1.3   root      123:        cmp.l #3,d0
                    124:        bgt.b EXTS_cause
                    125:        jsr -$17a(a6)   ; ReplyMsg
                    126:        bra.b EXTS_loop
                    127: EXTS_cause:
                    128:        cmp.l #4,d0
                    129:        bgt.b EXTS_jump
                    130:        jsr -$b4(a6)    ; Cause
                    131:        bra.b EXTS_loop
                    132: EXTS_jump:
                    133:        movem.l a2/a5,-(sp)
                    134:        move.l a1,a2 ;CDXL structure
                    135:        move.l 20(a2),a1
                    136:        move.l 24(a2),a5
                    137:        move.l a2,-(sp)
                    138:        jsr (a5)        ; cd.device CD_READXL callback
                    139:        move.l (sp)+,d2
                    140:        clr.l 24(a2)  ; ugly sync-hack
                    141:        movem.l (sp)+,a2/a5
1.1.1.2   root      142: EXTS_done:
1.1.1.3   root      143:        move.w #$FF50,d0
                    144:        bsr.w getrtbase
1.1.1.2   root      145:        moveq.l #4,d0
1.1.1.3   root      146:        jsr (a0)        
1.1.1.2   root      147:        moveq.l #1,d0 ; clear Z - it was for us.
                    148: exter_server_exit:
                    149:        movem.l (sp)+,a2
                    150:        rts
                    151: 
1.1       root      152: setup_exter:
1.1.1.4 ! root      153:                ;       bsr.w mousehack_init
1.1       root      154:        moveq.l #26,d0
                    155:        move.l #$10001,d1
1.1.1.4 ! root      156:        jsr -198(a6); AllocMem
1.1       root      157:        move.l d0,a1
                    158:        lea.l exter_name(pc),a0
                    159:        move.l a0,10(a1)
                    160:        lea.l exter_data(pc),a0
                    161:        move.l a0,14(a1)
                    162:        lea.l exter_server(pc),a0
                    163:        move.l a0,18(a1)
1.1.1.3   root      164:        move.b #200,9(a1)
                    165:        move.b #2,8(a1)
1.1       root      166:        moveq.l #13,d0
1.1.1.2   root      167:        jmp -168(a6) ; AddIntServer
1.1       root      168: 
                    169: make_dev: ; IN: A0 param_packet, D6: unit_no, D7: boot, A4: expansionbase
                    170: 
1.1.1.3   root      171:        move.l a0,-(sp)
                    172:        move.w #$FFFC,d0 ; filesys base
                    173:        bsr.w getrtbase
                    174:        move.l (a0),a5
1.1.1.4 ! root      175:        move.w #$FF28,d0 ; fill in unit-dependent info (filesys_dev_storeinfo)
1.1.1.3   root      176:        bsr.w getrtbase
                    177:        move.l a0,a1
                    178:        move.l (sp)+,a0
                    179:        jsr (a1)
1.1       root      180:        move.l d0,d3
                    181: 
                    182:        ; Don't init hardfiles if < V36
                    183:        and.l d5,d0
1.1.1.2   root      184:        bne.w general_ret
1.1       root      185: 
                    186:        move.l a4,a6
1.1.1.4 ! root      187:        move.l a0,-(sp)
1.1.1.2   root      188:        jsr -144(a6) ; MakeDosNode()
1.1.1.4 ! root      189:        move.l (sp)+,a0         ;  parmpacket
        !           190:        move.l a0,a1
1.1       root      191:        move.l d0,a3 ; devicenode
1.1.1.4 ! root      192:        move.w #$FF20,d0 ; record in ui.startup (filesys_dev_remember)
1.1.1.3   root      193:        bsr.w getrtbase
                    194:        jsr (a0)
1.1       root      195:        moveq.l #0,d0
                    196:        move.l d0,8(a3)          ; dn_Task
                    197:        move.l d0,16(a3)         ; dn_Handler
                    198:        move.l d0,32(a3)         ; dn_SegList
                    199: 
1.1.1.4 ! root      200:        move.l d3,d0
        !           201:        move.b 79(a1),d3 ; bootpri
        !           202:        tst.l d0
1.1       root      203:        bne.b MKDV_doboot
                    204: 
                    205: MKDV_is_filesys:
                    206:        move.l #4000,20(a3)     ; dn_StackSize
                    207:        lea.l our_seglist(pc),a1
                    208:        move.l a1,d0
                    209:        lsr.l  #2,d0
                    210:        move.l d0,32(a3)        ; dn_SegList
1.1.1.4 ! root      211:        moveq.l #-1,d0
        !           212:        move.l d0,36(a3)       ; dn_GlobalVec
1.1       root      213: 
                    214: MKDV_doboot:
                    215:        tst.l d7
                    216:        beq.b MKDV_noboot
                    217: 
1.1.1.4 ! root      218:        move.l 4,a6
1.1       root      219:        moveq.l #20,d0
                    220:        moveq.l #0,d1
1.1.1.4 ! root      221:        jsr  -198(a6); AllocMem
1.1       root      222:        move.l d0,a1 ; bootnode
                    223:        moveq.l #0,d0
                    224:        move.l d0,(a1)
                    225:        move.l d0,4(a1)
                    226:        move.w d0,14(a1)
1.1.1.4 ! root      227:        move.w #$1000,d0
        !           228:        or.b d3,d0
1.1       root      229:        move.w d0,8(a1)
                    230:        move.l $104(a5),10(a1) ; filesys_configdev
                    231:        move.l a3,16(a1)        ; devicenode
                    232:        lea.l  74(a4),a0 ; MountList
1.1.1.2   root      233:        jmp  -270(a6) ; Enqueue()
1.1       root      234: 
                    235: MKDV_noboot:
                    236:        move.l a3,a0
                    237:        moveq.l #0,d1
                    238:        move.l d1,a1
                    239:        moveq.l #-1,d0
                    240:        move.l a4,a6 ; expansion base
1.1.1.2   root      241:        jmp  -150(a6) ; AddDosNode
1.1       root      242: 
                    243: filesys_mainloop:
1.1.1.4 ! root      244:        move.l 4,a6
1.1       root      245:        moveq.l #0,d0
                    246:        move.l d0,a1
                    247:        jsr -294(a6) ; FindTask
                    248:        move.l d0,a0
                    249:        lea.l $5c(a0),a5 ; pr_MsgPort
                    250: 
                    251:        ; Open DOS library
                    252:        lea.l doslibname(pc),a1
                    253:        moveq.l #0,d0
                    254:        jsr -552(a6) ; OpenLibrary
                    255:        move.l d0,a2
                    256: 
                    257:        ; Allocate some memory. Usage:
                    258:        ; 0: lock chain
                    259:        ; 4: command chain
                    260:        ; 8: second thread's lock chain
                    261:        ; 12: dummy message
                    262:        ; 32: the volume (80+44+1 bytes)
1.1.1.4 ! root      263:        ; 157: mousehack started-flag
        !           264:        move.l #80+44+1+20+12+1,d0
1.1       root      265:        move.l #$10001,d1 ; MEMF_PUBLIC | MEMF_CLEAR
1.1.1.4 ! root      266:        jsr -198(a6); AllocMem
1.1       root      267:        move.l d0,a3
                    268:        moveq.l #0,d6
                    269:        move.l d6,(a3)
                    270:        move.l d6,4(a3)
                    271:        move.l d6,8(a3)
                    272: 
                    273:        moveq.l #0,d5 ; No commands queued.
                    274: 
                    275:        ; Fetch our startup packet
                    276:        move.l a5,a0
                    277:        jsr -384(a6) ; WaitPort
                    278:        move.l a5,a0
                    279:        jsr -372(a6) ; GetMsg
                    280:        move.l d0,a4
                    281:        move.l 10(a4),d3 ; ln_Name
1.1.1.3   root      282:        move.w #$FF40,d0
                    283:        bsr.w getrtbase
1.1       root      284:        moveq.l #0,d0
1.1.1.3   root      285:        jsr (a0)
1.1.1.4 ! root      286:        bra.w FSML_Reply
1.1       root      287: 
                    288:        ; We abuse some of the fields of the message we get. Offset 0 is
                    289:        ; used for chaining unprocessed commands, and offset 1 is used for
                    290:        ; indicating the status of a command. 0 means the command was handed
                    291:        ; off to some UAE thread and did not complete yet, 1 means we didn't
                    292:        ; even hand it over yet because we were afraid that might blow some
                    293:        ; pipe limit, and -1 means the command was handed over and has completed
                    294:        ; processing by now, so it's safe to reply to it.
                    295: 
                    296: FSML_loop:
                    297:        move.l a5,a0
                    298:        jsr -384(a6) ; WaitPort
                    299:        move.l a5,a0
                    300:        jsr -372(a6) ; GetMsg
                    301:        move.l d0,a4
                    302:        move.l 10(a4),d3 ; ln_Name
                    303:        bne.b FSML_FromDOS
                    304: 
                    305:        ; It's a dummy packet indicating that some queued command finished.
1.1.1.3   root      306:        move.w #$FF50,d0
                    307:        bsr.w getrtbase
1.1       root      308:        moveq.l #1,d0
1.1.1.3   root      309:        jsr (a0)
1.1       root      310:        ; Go through the queue and reply all those that finished.
                    311:        lea.l 4(a3),a2
                    312:        move.l (a2),a0
                    313: FSML_check_old:
                    314:        move.l a0,d0
                    315:        beq.b FSML_loop
                    316:        move.l (a0),a1
                    317:        move.l d0,a0
                    318:        ; This field may be accessed concurrently by several UAE threads.
                    319:        ; This _should_ be harmless on all reasonable machines.
                    320:        move.l 4(a0),d0
                    321:        bpl.b FSML_check_next
                    322:        movem.l a0/a1,-(a7)
                    323:        move.l 10(a0),a4
                    324:        bsr.b ReplyOne
                    325:        subq.l #1,d5  ; One command less in the queue
                    326:        movem.l (a7)+,a0/a1
                    327:        move.l a1,(a2)
                    328:        move.l a1,a0
                    329:        bra.b FSML_check_old
                    330: FSML_check_next:
                    331:        move.l a0,a2
                    332:        move.l a1,a0
                    333:        bra.b FSML_check_old
                    334: 
                    335: FSML_FromDOS:
                    336:        ; Limit the number of outstanding started commands. We can handle an
                    337:        ; unlimited number of unstarted commands.
                    338:        cmp.l #20,d5
                    339:        bcs  FSML_DoCommand
                    340:        ; Too many commands queued.
                    341:        moveq.l #1,d0
                    342:        move.l d0,4(a4)
                    343:        bra.b FSML_Enqueue
                    344: 
                    345: FSML_DoCommand:
                    346:        bsr.b LockCheck  ; Make sure there are enough locks for the C code to grab.
1.1.1.3   root      347:        move.w #$FF30,d0
                    348:        bsr.w getrtbase
                    349:        jsr (a0)
1.1       root      350:        tst.l d0
                    351:        beq.b FSML_Reply
                    352:        ; The command did not complete yet. Enqueue it and increase number of
                    353:        ; queued commands
                    354:        ; The C code already set 4(a4) to 0
                    355:        addq.l #1,d5
                    356: FSML_Enqueue:
                    357:        move.l 4(a3),(a4)
                    358:        move.l a4,4(a3)
                    359:        bra.b FSML_loop
                    360: 
                    361: FSML_Reply:
                    362:        move.l d3,a4
                    363:        bsr.b ReplyOne
1.1.1.3   root      364:        bra.w FSML_loop
1.1       root      365: 
                    366: ReplyOne:
                    367:        move.l (a4),a1  ; dp_Link
                    368:        move.l 4(a4),a0 ; dp_Port
                    369:        move.l a5,4(a4)
                    370:        jmp -366(a6) ; PutMsg
                    371: 
                    372: ; ugly code to avoid calling AllocMem / FreeMem from native C code.
                    373: ; We keep a linked list of 3 locks. In theory, only one should ever
                    374: ; be used. Before handling every packet, we check that the list has the
                    375: ; right length.
                    376: 
                    377: LockCheck:
                    378:        move.l d5,-(a7)
                    379:        moveq.l #-4,d5  ; Keep three locks
                    380:        move.l (a3),a2
                    381:        move.l a2,d7
                    382: LKCK_Loop:
                    383:        move.l a2,d1
                    384:        beq LKCK_ListEnd
                    385:        addq.l #1,d5
                    386:        beq.b LKCK_TooMany
                    387:        move.l a2,a1
                    388:        move.l (a2),a2
                    389:        bra.b LKCK_Loop
                    390: LKCK_ListEnd:
                    391:        addq.l #1,d5
                    392:        beq.b LKCK_ret
                    393:        move.l d7,a2
                    394:        moveq.l #24,d0 ; sizeof Lock is 20, 4 for chain
                    395:        moveq.l #1,d1 ; MEMF_PUBLIC
1.1.1.4 ! root      396:        jsr -198(a6); AllocMem
1.1       root      397:        addq.w #1,d6
                    398:        move.l d0,a2
                    399:        move.l d7,(a2)
                    400:        move.l a2,d7
                    401:        bra.b LKCK_ListEnd
                    402: LKCK_TooMany:
                    403:        move.l (a2),d0 ; We have too many, but we tolerate that to some extent.
                    404:        beq.b LKCK_ret
                    405:        move.l d0,a0
                    406:        move.l (a0),d0
                    407:        beq.b LKCK_ret
                    408:        move.l d0,a0
                    409:        move.l (a0),d0
                    410:        beq.b LKCK_ret
                    411: 
                    412:        moveq.l #0,d0 ; Now we are sure that we really have too many. Delete some.
                    413:        move.l d0,(a1)
                    414: LKCK_TooManyLoop:
                    415:        move.l a2,a1
                    416:        move.l (a1),a2
                    417:        moveq.l #24,d0
                    418:        jsr -210(a6) ; FreeMem
                    419:        add.l #$10000,d6
                    420:        move.l a2,d0
                    421:        bne.b LKCK_TooManyLoop
                    422: LKCK_ret:
                    423:        move.l d7,(a3)
                    424:        move.l (a7)+,d5
                    425:        rts
                    426: 
1.1.1.3   root      427: getrtbase:
                    428:        lea start-8-4(pc),a0
                    429:        and.l #$FFFF,d0
                    430:        add.l d0,a0
                    431:        rts
                    432: 
1.1.1.4 ! root      433: ; mouse hack
        !           434: 
        !           435: newlist:
        !           436:        move.l a0,(a0)
        !           437:        addq.l #4,(a0)
        !           438:        clr.l 4(a0)
        !           439:        move.l a0,8(a0)
        !           440:        rts
        !           441: 
        !           442: createport:
        !           443:        movem.l d2/a2/a6,-(sp)
        !           444:        move.l 4,a6
        !           445:        moveq #-1,d0
        !           446:        jsr -$014a(a6) ;AllocSignal
        !           447:        sub.l a0,a0
        !           448:        move.l d0,d2
        !           449:        bmi.s cp_f
        !           450:        moveq #34,d0
        !           451:        move.l #65536+1,d1
        !           452:        jsr -198(a6); AllocMem
        !           453:        sub.l a0,a0
        !           454:        move.l d0,a2
        !           455:        tst.l d0
        !           456:        beq.s cp_f
        !           457:        move.b #4,8(a2) ;NT_MSGPORT
        !           458:        move.b d2,15(a2)
        !           459:        sub.l a1,a1
        !           460:        jsr -$0126(a6) ;FindTask
        !           461:        move.l d0,16(a2)
        !           462:        lea 20(a2),a0
        !           463:        bsr.w newlist
        !           464:        move.l a2,a0
        !           465: cp_f:  move.l a0,d0
        !           466:        movem.l (sp)+,d2/a2/a6
        !           467:        rts
        !           468: 
        !           469: createio:
        !           470:        movem.l d2/a2/a6,-(sp)
        !           471:        move.l 4,a6
        !           472:        tst.l d0
        !           473:        beq.s cio_f
        !           474:        move.l d0,a2
        !           475:        moveq #48,d2
        !           476:        move.l d2,d0
        !           477:        move.l #65536+1,d1
        !           478:        jsr -198(a6); AllocMem
        !           479:        move.l d0,a0
        !           480:        move.b #10,8(a0) ;NT_MESSAGE
        !           481:        move.l d2,18(a0)
        !           482:        move.l a2,14(a0)
        !           483: cio_f: movem.l (sp)+,d2/a2/a6
        !           484:        rts
        !           485: 
        !           486: createtask:
        !           487:        movem.l d2/d3/a2/a3/a6,-(sp)
        !           488:        move.l 4,a6
        !           489:        move.l a0,d2
        !           490:        move.l a1,d3
        !           491:        move.l #92+2048,d0
        !           492:        move.l #65536+1,d1
        !           493:        jsr -198(a6); AllocMem
        !           494:        tst.l d0
        !           495:        beq.b ct_f
        !           496:        move.l d0,a2
        !           497:        move.b #1,8(a2) ;NT_TASK
        !           498:        move.l d2,10(a2)
        !           499:        lea 92(a2),a3
        !           500:        move.l a3,58(a2)
        !           501:        lea 2048(a3),a3
        !           502:        move.l a3,62(a2)
        !           503:        move.l a3,54(a2)
        !           504:        move.l a2,a1
        !           505:        move.l d3,a2
        !           506:        sub.l a3,a3
        !           507:        jsr -$011a(a6) ;AddTask
        !           508: ct_f:  movem.l (sp)+,d2/d3/a2/a3/a6
        !           509:        rts
        !           510: 
        !           511: mousehack_e: dc.w 0
        !           512: mousehack_x: dc.w 0
        !           513: mousehack_y: dc.w 0
        !           514: 
        !           515: MH_INT = 0
        !           516: MH_FOO = (MH_INT+22)
        !           517: MH_IEV = (MH_FOO+16)
        !           518: MH_IO = (MH_IEV+22)
        !           519: MH_TM = (MH_IO+4)
        !           520: MH_END = (MH_TM+4)
        !           521: 
        !           522: mousehack_init:
        !           523:        move.l a0,-(sp)
        !           524:        lea mhname(pc),a0
        !           525:        lea mousehack_task(pc),a1
        !           526:        bsr createtask
        !           527:        move.l (sp)+,a0
        !           528:        rts
        !           529: 
        !           530: mousehack_task:
        !           531:        move.l 4,a6
        !           532: 
        !           533:        moveq #-1,d0
        !           534:        jsr -$014a(a6) ;AllocSignal
        !           535:        moveq #0,d2
        !           536:        bset d0,d2
        !           537: 
        !           538:        sub.l a1,a1
        !           539:        jsr -$0126(a6) ;FindTask
        !           540:        move.l d0,a4
        !           541:        
        !           542:        moveq #20,d0
        !           543:        move.l a4,a1
        !           544:        jsr -$012c(a6) ;SetTaskPri
        !           545: 
        !           546:        moveq #0,d0
        !           547:        move.w #MH_END,d0
        !           548:        move.l #65536+1,d1
        !           549:        jsr -198(a6); AllocMem
        !           550:        move.l d0,a5
        !           551: 
        !           552:        bsr.w createport
        !           553:        bsr.w createio
        !           554:        move.l d0,MH_IO(a5)
        !           555:        beq mht_f
        !           556: 
        !           557:        bsr.w createport
        !           558:        bsr.w createio
        !           559:        move.l d0,MH_TM(a5)
        !           560:        beq mht_f
        !           561: 
        !           562:        lea MH_FOO(a5),a3
        !           563:        move.l a4,12(a3);task
        !           564:        move.l d2,8(a3) ;sigmask
        !           565:        moveq #-1,d0
        !           566:        move.l d0,(a3)  ;mx
        !           567:        move.l d0,4(a3) ;my
        !           568: 
        !           569:        lea MH_INT(a5),a1
        !           570:        move.b #2,8(a1) ;NT_INTERRUPT
        !           571:        move.b #5,9(a1) ;priority
        !           572:        lea mhname(pc),a0
        !           573:        move.l a0,10(a1)
        !           574:        lea mousehackint(pc),a0
        !           575:        move.l a0,18(a1)
        !           576:        move.l a3,14(a1)
        !           577:        moveq #5,d0 ;INTB_VERTB
        !           578:        jsr -$00a8(a6)
        !           579:        moveq #0,d7
        !           580:        moveq #0,d6
        !           581:        bra.s mhloop
        !           582: mht_f: rts
        !           583: 
        !           584: mhloop
        !           585:        move.l d2,d0
        !           586:        jsr -$013e(a6) ;Wait
        !           587: 
        !           588:        ;  Since we're starting up early in the boot process,
        !           589:        ;  it's not guaranteed that intuition or the devices are
        !           590:        ;  available yet.
        !           591:        tst.l d7
        !           592:        bne.b mh_gotintuition
        !           593: 
        !           594:        moveq #0,d0
        !           595:        lea intlibname(pc),a1
        !           596:        jsr -$0228(a6)
        !           597:        move.l d0,d7
        !           598:        beq.b mhloop
        !           599: 
        !           600: mh_gotintuition:
        !           601:        btst #1,d6
        !           602:        bne.b mh_gotinput
        !           603:        move.l MH_IO(a5),a1
        !           604:        lea inp_dev(pc),a0
        !           605:        moveq #0,d0
        !           606:        moveq #0,d1
        !           607:        jsr -$01bc(a6) ;OpenDevice
        !           608:        tst.l d0
        !           609:        bne mhloop
        !           610:        bset #1,d6
        !           611: 
        !           612: mh_gotinput:
        !           613:        btst #2,d6
        !           614:        bne.b mh_gottimer
        !           615:        move.l MH_TM(a5),a1
        !           616:        lea tim_dev(pc),a0
        !           617:        moveq #0,d0
        !           618:        moveq #0,d1
        !           619:        jsr -$01bc(a6) ;OpenDevice      
        !           620:        tst.l d0
        !           621:        bne mhloop
        !           622:        bset #2,d6
        !           623: 
        !           624: mh_gottimer:
        !           625:        move.l MH_IO(a5),a1
        !           626:        lea MH_IEV(a5),a2
        !           627:        move.w #11,28(a1) ;IND_WRITEEVENT
        !           628:        move.l #22,36(a1) ;sizeof(struct InputEvent)
        !           629:        move.l a2,40(a1)
        !           630:        move.b #1,30(a1) ;IOF_QUICK
        !           631: 
        !           632:        move.b #4,4(a2) ;IECLASS_POINTERPOS
        !           633:        clr.b 5(a2) ;ie_SubClass
        !           634:        clr.w 6(a2) ;ie_Code
        !           635:        clr.w 8(a2) ;ie_Qualifier
        !           636: 
        !           637:        move.l d7,a0 ;intbase
        !           638: 
        !           639:        move.l MH_FOO+0(a5),d0
        !           640:        move.w 34+14(a0),d1
        !           641:        add.w d1,d1
        !           642:        sub.w d1,d0
        !           643:        move.w d0,10(a2)
        !           644: 
        !           645:        move.l MH_FOO+4(a5),d0
        !           646:        move.w 34+12(a0),d1
        !           647:        add.w d1,d1
        !           648:        sub.w d1,d0
        !           649:        ext.l d0
        !           650:        move.w d0,12(a2)
        !           651: 
        !           652:        move.l MH_TM(a5),a1
        !           653:        move.w #10,28(a1) ;TR_GETSYSTIME
        !           654:        move.b #1,30(a1) ;IOF_QUICK
        !           655:        jsr -$01c8(a6) ;DoIO
        !           656:        move.l MH_TM(a5),a1
        !           657:        move.l 32(a1),14(a2)
        !           658:        move.l 36(a1),18(a2)
        !           659: 
        !           660:        move.l MH_IO(a5),a1
        !           661:        jsr -$01c8(a6) ;DoIO
        !           662:        
        !           663:        bra.w mhloop
        !           664: 
        !           665: mousehackint:
        !           666:        move.w mousehack_x(pc),d0
        !           667:        ext.l d0
        !           668:        move.w mousehack_y(pc),d1
        !           669:        ext.l d1
        !           670:        cmp.l (a1),d0
        !           671:        bne .l1
        !           672:        cmp.l 4(a1),d1
        !           673:        beq .l2
        !           674: .l1 move.l d1,4(a1)
        !           675:        move.l d0,(a1)
        !           676:        move.l 8(a1),d0
        !           677:        move.l 12(a1),a1
        !           678:        move.l 4,a6
        !           679:        jsr -$0144(a6) ; Signal
        !           680: .l2 lea $dff000,a0
        !           681:        moveq #0,d0
        !           682:        rts
        !           683: 
        !           684: inp_dev: dc.b 'input.device',0
        !           685: tim_dev: dc.b 'timer.device',0
        !           686: mhname: dc.b 'UAE mouse hack',0
1.1       root      687: exter_name: dc.b 'UAE filesystem',0
                    688: doslibname: dc.b 'dos.library',0
1.1.1.4 ! root      689: intlibname: dc.b 'intuition.library',0
1.1       root      690: explibname: dc.b 'expansion.library',0
                    691:        END

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.