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

1.1     ! root        1:        SECTION code
        !             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
        !             5: 
        !             6:        dc.l 16
        !             7: our_seglist:
        !             8:        dc.l 0 ;/* NextSeg */
        !             9: start:
        !            10:        bra filesys_mainloop
        !            11:        dc.l make_dev-start
        !            12:        dc.l filesys_init-start
        !            13:        dc.l exter_server-start
        !            14:        dc.l bootcode-start
        !            15: 
        !            16: bootcode:
        !            17:        lea.l doslibname(pc),a1
        !            18:        jsr.l -96(a6) ; FindResident
        !            19:        move.l d0,a0
        !            20:        move.l 22(a0),d0
        !            21:        move.l d0,a0
        !            22:        jsr (a0)
        !            23:        rts
        !            24: 
        !            25: exter_data:
        !            26: exter_server:
        !            27:        movem.l a2,-(sp)
        !            28:        moveq.l #0,d0
        !            29:        jsr.l $F0FF50
        !            30:        tst.l d0
        !            31:        beq.b exter_server_exit
        !            32:        ; This is the hard part - we have to send some messages.
        !            33:        move.l 4.w,a6
        !            34: EXTS_loop:
        !            35:        moveq.l #2,d0
        !            36:        jsr.l $F0FF50
        !            37:        tst.l d0
        !            38:        beq.b EXTS_done
        !            39:        move.l d0,a2
        !            40:        moveq.l #3,d0
        !            41:        jsr.l $F0FF50
        !            42:        move.l a2,a0
        !            43:        move.l d0,a1
        !            44:        jsr -366(a6) ; PutMsg
        !            45:        bra.b EXTS_loop
        !            46: 
        !            47: EXTS_done:
        !            48:        moveq.l #4,d0
        !            49:        jsr.l $F0FF50
        !            50:        moveq.l #1,d0 ; clear Z - it was for us.
        !            51: exter_server_exit:
        !            52:        movem.l (sp)+,a2
        !            53:        rts
        !            54: 
        !            55: filesys_init:
        !            56:        movem.l d0-d7/a0-a6,-(sp)
        !            57:        move.l 4.w,a6
        !            58:        move.l $F0FFFC,a5 ; filesys base
        !            59:        lea.l explibname(pc),a1 ; expansion lib name
        !            60:        moveq.l #36,d0
        !            61:        moveq.l #0,d5
        !            62:        jsr.l  -552(a6) ; OpenLibrary
        !            63:        tst.l d0
        !            64:        bne.b FSIN_explibok
        !            65:        lea.l explibname(pc),a1 ; expansion lib name
        !            66:        moveq.l #0,d0
        !            67:        moveq.l #1,d5
        !            68:        jsr.l  -552(a6) ; OpenLibrary
        !            69: FSIN_explibok:
        !            70:        move.l d0,a4
        !            71:        moveq.l #88,d0
        !            72:        moveq.l #1,d1 ; MEMF_PUBLIC
        !            73:        jsr.l -198(a6) ; AllocMem
        !            74:        move.l d0,a3  ; param packet
        !            75: 
        !            76:        moveq.l #84,d7 ; initialize it
        !            77: FSIN_loop:
        !            78:        move.l 0(a5,d7.l),0(a3,d7.l)
        !            79:        subq.l #4,d7
        !            80:        bcc.b FSIN_loop
        !            81: 
        !            82:        moveq.l #0,d6
        !            83: FSIN_init_units:
        !            84:        cmp.l  $10c(a5),d6
        !            85:        bcc.b FSIN_units_ok
        !            86:        move.l a3,a0
        !            87:        movem.l d6/a3,-(sp)
        !            88:        move.l  #1,d7
        !            89:        bsr.b   make_dev
        !            90:        movem.l (sp)+,d6/a3
        !            91:        addq.l #$1,d6
        !            92:        bra.b  FSIN_init_units
        !            93: 
        !            94: FSIN_units_ok:
        !            95:        move.l 4.w,a6
        !            96:        move.l a4,a1
        !            97:        jsr.l -414(a6) ; CloseLibrary
        !            98:        bsr.b setup_exter
        !            99:        move.l 4.w,a6
        !           100:        jsr.l $F0FF80
        !           101:        moveq.l #3,d1
        !           102:        moveq.l #-10,d2
        !           103:        move.l #$200000,a0
        !           104:        sub.l a0,d0
        !           105:        bcs.b FSIN_chip_done
        !           106:        beq.b FSIN_chip_done
        !           107:        moveq.l #0,d4
        !           108:        move.l d4,a1
        !           109:        jsr -618(a6)
        !           110: FSIN_chip_done
        !           111:        movem.l (sp)+,d0-d7/a0-a6
        !           112: general_ret:
        !           113:        rts
        !           114: 
        !           115: setup_exter:
        !           116:        move.l 4.w,a6
        !           117:        moveq.l #26,d0
        !           118:        move.l #$10001,d1
        !           119:        jsr -198(a6) ; AllocMem
        !           120:        move.l d0,a1
        !           121:        lea.l exter_name(pc),a0
        !           122:        move.l a0,10(a1)
        !           123:        lea.l exter_data(pc),a0
        !           124:        move.l a0,14(a1)
        !           125:        lea.l exter_server(pc),a0
        !           126:        move.l a0,18(a1)
        !           127:        moveq.l #13,d0
        !           128:        jmp.l -168(a6) ; AddIntServer
        !           129: 
        !           130: make_dev: ; IN: A0 param_packet, D6: unit_no, D7: boot, A4: expansionbase
        !           131:        move.l $F0FFFC,a5 ; filesys base
        !           132: 
        !           133:        jsr $F0FF28 ; fill in unit-dependent info, return 1 if hardfile.
        !           134:        move.l d0,d3
        !           135: 
        !           136:        ; Don't init hardfiles if < V36
        !           137:        and.l d5,d0
        !           138:        bne.b general_ret
        !           139: 
        !           140:        move.l a4,a6
        !           141:        jsr.l -144(a6) ; MakeDosNode()
        !           142:        move.l d0,a3 ; devicenode
        !           143:        jsr.l $F0FF20 ; record in ui.startup
        !           144:        moveq.l #0,d0
        !           145:        move.l d0,8(a3)          ; dn_Task
        !           146:        move.l d0,16(a3)         ; dn_Handler
        !           147:        move.l d0,32(a3)         ; dn_SegList
        !           148: 
        !           149:        tst.l d3
        !           150:        bne.b MKDV_doboot
        !           151: 
        !           152: MKDV_is_filesys:
        !           153:        move.l #4000,20(a3)     ; dn_StackSize
        !           154:        lea.l our_seglist(pc),a1
        !           155:        move.l a1,d0
        !           156:        lsr.l  #2,d0
        !           157:        move.l d0,32(a3)        ; dn_SegList
        !           158:        move.l #-1,36(a3)       ; dn_GlobalVec
        !           159: 
        !           160: MKDV_doboot:
        !           161:        tst.l d7
        !           162:        beq.b MKDV_noboot
        !           163: 
        !           164:        move.l 4.w,a6
        !           165:        moveq.l #20,d0
        !           166:        moveq.l #0,d1
        !           167:        jsr.l  -198(a6) ; AllocMem
        !           168:        move.l d0,a1 ; bootnode
        !           169:        moveq.l #0,d0
        !           170:        move.l d0,(a1)
        !           171:        move.l d0,4(a1)
        !           172:        move.w d0,14(a1)
        !           173:        move.w #$10FF,d0
        !           174:        sub.b  d6,d0
        !           175:        move.w d0,8(a1)
        !           176:        move.l $104(a5),10(a1) ; filesys_configdev
        !           177:        move.l a3,16(a1)        ; devicenode
        !           178:        lea.l  74(a4),a0 ; MountList
        !           179:        jmp.l  -270(a6) ; Enqueue()
        !           180: 
        !           181: MKDV_noboot:
        !           182:        move.l a3,a0
        !           183:        moveq.l #0,d1
        !           184:        move.l d1,a1
        !           185:        moveq.l #-1,d0
        !           186:        move.l a4,a6 ; expansion base
        !           187:        jmp.l  -150(a6) ; AddDosNode
        !           188: 
        !           189: filesys_mainloop:
        !           190:        move.l 4.w,a6
        !           191:        moveq.l #0,d0
        !           192:        move.l d0,a1
        !           193:        jsr -294(a6) ; FindTask
        !           194:        move.l d0,a0
        !           195:        lea.l $5c(a0),a5 ; pr_MsgPort
        !           196: 
        !           197:        ; Open DOS library
        !           198:        lea.l doslibname(pc),a1
        !           199:        moveq.l #0,d0
        !           200:        jsr -552(a6) ; OpenLibrary
        !           201:        move.l d0,a2
        !           202: 
        !           203:        ; Allocate some memory. Usage:
        !           204:        ; 0: lock chain
        !           205:        ; 4: command chain
        !           206:        ; 8: second thread's lock chain
        !           207:        ; 12: dummy message
        !           208:        ; 32: the volume (80+44+1 bytes)
        !           209:        move.l #80+44+1+20+12,d0
        !           210:        move.l #$10001,d1 ; MEMF_PUBLIC | MEMF_CLEAR
        !           211:        jsr.l -198(a6) ; AllocMem
        !           212:        move.l d0,a3
        !           213:        moveq.l #0,d6
        !           214:        move.l d6,(a3)
        !           215:        move.l d6,4(a3)
        !           216:        move.l d6,8(a3)
        !           217: 
        !           218:        moveq.l #0,d5 ; No commands queued.
        !           219: 
        !           220:        ; Fetch our startup packet
        !           221:        move.l a5,a0
        !           222:        jsr -384(a6) ; WaitPort
        !           223:        move.l a5,a0
        !           224:        jsr -372(a6) ; GetMsg
        !           225:        move.l d0,a4
        !           226:        move.l 10(a4),d3 ; ln_Name
        !           227:        moveq.l #0,d0
        !           228:        jsr.l $F0FF40
        !           229:        bra.b FSML_Reply
        !           230: 
        !           231:        ; We abuse some of the fields of the message we get. Offset 0 is
        !           232:        ; used for chaining unprocessed commands, and offset 1 is used for
        !           233:        ; indicating the status of a command. 0 means the command was handed
        !           234:        ; off to some UAE thread and did not complete yet, 1 means we didn't
        !           235:        ; even hand it over yet because we were afraid that might blow some
        !           236:        ; pipe limit, and -1 means the command was handed over and has completed
        !           237:        ; processing by now, so it's safe to reply to it.
        !           238: 
        !           239: FSML_loop:
        !           240:        move.l a5,a0
        !           241:        jsr -384(a6) ; WaitPort
        !           242:        move.l a5,a0
        !           243:        jsr -372(a6) ; GetMsg
        !           244:        move.l d0,a4
        !           245:        move.l 10(a4),d3 ; ln_Name
        !           246:        bne.b FSML_FromDOS
        !           247: 
        !           248:        ; It's a dummy packet indicating that some queued command finished.
        !           249:        moveq.l #1,d0
        !           250:        jsr.l $F0FF50
        !           251:        ; Go through the queue and reply all those that finished.
        !           252:        lea.l 4(a3),a2
        !           253:        move.l (a2),a0
        !           254: FSML_check_old:
        !           255:        move.l a0,d0
        !           256:        beq.b FSML_loop
        !           257:        move.l (a0),a1
        !           258:        move.l d0,a0
        !           259:        ; This field may be accessed concurrently by several UAE threads.
        !           260:        ; This _should_ be harmless on all reasonable machines.
        !           261:        move.l 4(a0),d0
        !           262:        bpl.b FSML_check_next
        !           263:        movem.l a0/a1,-(a7)
        !           264:        move.l 10(a0),a4
        !           265:        bsr.b ReplyOne
        !           266:        subq.l #1,d5  ; One command less in the queue
        !           267:        movem.l (a7)+,a0/a1
        !           268:        move.l a1,(a2)
        !           269:        move.l a1,a0
        !           270:        bra.b FSML_check_old
        !           271: FSML_check_next:
        !           272:        move.l a0,a2
        !           273:        move.l a1,a0
        !           274:        bra.b FSML_check_old
        !           275: 
        !           276: FSML_FromDOS:
        !           277:        ; Limit the number of outstanding started commands. We can handle an
        !           278:        ; unlimited number of unstarted commands.
        !           279:        cmp.l #20,d5
        !           280:        bcs  FSML_DoCommand
        !           281:        ; Too many commands queued.
        !           282:        moveq.l #1,d0
        !           283:        move.l d0,4(a4)
        !           284:        bra.b FSML_Enqueue
        !           285: 
        !           286: FSML_DoCommand:
        !           287:        bsr.b LockCheck  ; Make sure there are enough locks for the C code to grab.
        !           288:        jsr.l $F0FF30
        !           289:        tst.l d0
        !           290:        beq.b FSML_Reply
        !           291:        ; The command did not complete yet. Enqueue it and increase number of
        !           292:        ; queued commands
        !           293:        ; The C code already set 4(a4) to 0
        !           294:        addq.l #1,d5
        !           295: FSML_Enqueue:
        !           296:        move.l 4(a3),(a4)
        !           297:        move.l a4,4(a3)
        !           298:        bra.b FSML_loop
        !           299: 
        !           300: FSML_Reply:
        !           301:        move.l d3,a4
        !           302:        bsr.b ReplyOne
        !           303:        bra.b FSML_loop
        !           304: 
        !           305: ReplyOne:
        !           306:        move.l (a4),a1  ; dp_Link
        !           307:        move.l 4(a4),a0 ; dp_Port
        !           308:        move.l a5,4(a4)
        !           309:        jmp -366(a6) ; PutMsg
        !           310: 
        !           311: ; ugly code to avoid calling AllocMem / FreeMem from native C code.
        !           312: ; We keep a linked list of 3 locks. In theory, only one should ever
        !           313: ; be used. Before handling every packet, we check that the list has the
        !           314: ; right length.
        !           315: 
        !           316: LockCheck:
        !           317:        move.l d5,-(a7)
        !           318:        moveq.l #-4,d5  ; Keep three locks
        !           319:        move.l (a3),a2
        !           320:        move.l a2,d7
        !           321: LKCK_Loop:
        !           322:        move.l a2,d1
        !           323:        beq LKCK_ListEnd
        !           324:        addq.l #1,d5
        !           325:        beq.b LKCK_TooMany
        !           326:        move.l a2,a1
        !           327:        move.l (a2),a2
        !           328:        bra.b LKCK_Loop
        !           329: LKCK_ListEnd:
        !           330:        addq.l #1,d5
        !           331:        beq.b LKCK_ret
        !           332:        move.l d7,a2
        !           333:        moveq.l #24,d0 ; sizeof Lock is 20, 4 for chain
        !           334:        moveq.l #1,d1 ; MEMF_PUBLIC
        !           335:        jsr.l -198(a6) ; AllocMem
        !           336:        addq.w #1,d6
        !           337:        move.l d0,a2
        !           338:        move.l d7,(a2)
        !           339:        move.l a2,d7
        !           340:        bra.b LKCK_ListEnd
        !           341: LKCK_TooMany:
        !           342:        move.l (a2),d0 ; We have too many, but we tolerate that to some extent.
        !           343:        beq.b LKCK_ret
        !           344:        move.l d0,a0
        !           345:        move.l (a0),d0
        !           346:        beq.b LKCK_ret
        !           347:        move.l d0,a0
        !           348:        move.l (a0),d0
        !           349:        beq.b LKCK_ret
        !           350: 
        !           351:        moveq.l #0,d0 ; Now we are sure that we really have too many. Delete some.
        !           352:        move.l d0,(a1)
        !           353: LKCK_TooManyLoop:
        !           354:        move.l a2,a1
        !           355:        move.l (a1),a2
        !           356:        moveq.l #24,d0
        !           357:        jsr -210(a6) ; FreeMem
        !           358:        add.l #$10000,d6
        !           359:        move.l a2,d0
        !           360:        bne.b LKCK_TooManyLoop
        !           361: LKCK_ret:
        !           362:        move.l d7,(a3)
        !           363:        move.l (a7)+,d5
        !           364:        rts
        !           365: 
        !           366: exter_name: dc.b 'UAE filesystem',0
        !           367: doslibname: dc.b 'dos.library',0
        !           368: explibname: dc.b 'expansion.library',0
        !           369:        END

unix.superglobalmegacorp.com

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