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

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

unix.superglobalmegacorp.com

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