--- uae/src/filesys.asm 2018/04/24 17:18:12 1.1.1.4 +++ uae/src/filesys.asm 2018/04/24 17:21:39 1.1.1.5 @@ -7,6 +7,21 @@ ; the .l from jsr.l and jmp.l. ; Toni Wilen: modified SECTION, compiles now with AsmOne and clones(?) ; Removed absolute RT_AREA references +; 2002.08.06 RDB automount/autoboot support (Toni Wilen) +; 2002.09.11 KS1.3 RDB support (TW) +; 2006.18.07 FileSystem.resource find routine access fault fixed (TW) + +AllocMem = -198 +FreeMem = -210 + +; don't forget filesys.c! */ +PP_MAXSIZE = 4 * 96 +PP_FSSIZE = 400 +PP_FSPTR = 404 +PP_FSRES = 408 +PP_EXPLIB = 412 +PP_FSHDSTART = 416 +PP_TOTAL = (PP_FSHDSTART+140) dc.l 16 our_seglist: @@ -37,38 +52,50 @@ filesys_init: bsr getrtbase move.l (a0),a5 lea.l explibname(pc),a1 ; expansion lib name - moveq.l #36,d0 - moveq.l #0,d5 + moveq #36,d0 + moveq #0,d5 jsr -552(a6) ; OpenLibrary tst.l d0 bne.b FSIN_explibok lea.l explibname(pc),a1 ; expansion lib name - moveq.l #0,d0 - moveq.l #1,d5 + moveq #0,d0 + moveq #1,d5 jsr -552(a6) ; OpenLibrary FSIN_explibok: move.l d0,a4 - moveq.l #88,d0 - moveq.l #1,d1 ; MEMF_PUBLIC - jsr -198(a6); AllocMem + move.l #PP_TOTAL,d0 + moveq #1,d1 ; MEMF_PUBLIC + jsr AllocMem(a6) move.l d0,a3 ; param packet - moveq.l #84,d7 ; initialize it + move.l #PP_TOTAL,d7 ; initialize it + subq.l #4,d7 FSIN_loop: move.l 0(a5,d7.l),0(a3,d7.l) subq.l #4,d7 bcc.b FSIN_loop + move.l a4,PP_EXPLIB(a3) - moveq.l #0,d6 + moveq #0,d6 FSIN_init_units: cmp.l $10c(a5),d6 bcc.b FSIN_units_ok + move.l d6,-(sp) +FSIN_nextsub: + moveq #1,d7 + move.l a3,-(sp) move.l a3,a0 - movem.l d6/a3,-(sp) - move.l #1,d7 - bsr.w make_dev - movem.l (sp)+,d6/a3 - addq.l #$1,d6 + bsr.w make_dev + move.l (sp)+,a3 + cmp.l #-2,d3 + beq.b FSIN_nomoresub + swap d6 + addq.w #1,d6 + swap d6 + bra.b FSIN_nextsub +FSIN_nomoresub: + move.l (sp)+,d6 + addq.w #1,d6 bra.b FSIN_init_units FSIN_units_ok: @@ -108,24 +135,24 @@ EXTS_loop: bsr.w getrtbase moveq.l #2,d0 jsr (a0) - cmp.l #1,d0 + cmp.w #1,d0 blt.b EXTS_done bgt.b EXTS_signal_reply jsr -366(a6) ; PutMsg bra.b EXTS_loop EXTS_signal_reply: - cmp.l #2,d0 + cmp.w #2,d0 bgt.b EXTS_reply move.l d1,d0 jsr -$144(a6) ; Signal bra.b EXTS_loop EXTS_reply: - cmp.l #3,d0 + cmp.w #3,d0 bgt.b EXTS_cause jsr -$17a(a6) ; ReplyMsg bra.b EXTS_loop EXTS_cause: - cmp.l #4,d0 + cmp.w #4,d0 bgt.b EXTS_jump jsr -$b4(a6) ; Cause bra.b EXTS_loop @@ -153,7 +180,7 @@ setup_exter: ; bsr.w mousehack_init moveq.l #26,d0 move.l #$10001,d1 - jsr -198(a6); AllocMem + jsr AllocMem(a6) move.l d0,a1 lea.l exter_name(pc),a0 move.l a0,10(a1) @@ -166,8 +193,201 @@ setup_exter: moveq.l #13,d0 jmp -168(a6) ; AddIntServer -make_dev: ; IN: A0 param_packet, D6: unit_no, D7: boot, A4: expansionbase +addfs: ; a0 = first hunk, a1 = parmpacket + movem.l d0-d1/a0-a3/a6,-(sp) + move.l 4,a6 + move.l a0,a2 + move.l a1,a3 + move.l #62+128,d0 ; sizeof(FileSysEntry) + patchflags; + move.l #$10001,d1 + jsr -198(a6) + move.l d0,a0 + moveq #0,d0 + lea PP_FSHDSTART(a3),a1 +af1 move.b 0(a1,d0.w),14(a0,d0.w) + addq.w #1,d0 + cmp.w #140,d0 + bne.s af1 + move.l a2,d0 + lsr.l #2,d0 + move.l d0,54(a0) ;seglist + move.l a0,a1 + lea exter_name(pc),a0 + move.l a0,10(a1) ; name + move.l PP_FSRES(a3),a0 ; FileSystem.resource + lea 18(a0),a0 ; fsr_FileSysEntries + jsr -$f0(a6) ;AddHead + movem.l (sp)+,d0-d1/a0-a3/a6 + rts +relocate: ;a0=pointer to executable, returns first segment in A0 + movem.l d1-d7/a1-a6,-(sp) + move.l 4,a6 + move.l a0,a2 + cmp.l #$3f3,(a2)+ + bne.w ree + addq.l #8,a2 ; skip name end and skip total hunks + 1 + move.l 4(a2),d7 ; last hunk + sub.l (a2),d7 ; first hunk + addq.l #8,a2 ; skip hunk to load first and hunk to load last + addq.l #1,d7 + move.l a2,a3 + move.l d7,d0 + add.l d0,d0 + add.l d0,d0 + add.l d0,a3 + move.l a2,a4 + + ; allocate hunks + sub.l a5,a5 ;prev segment + moveq #0,d6 +r15 move.l (a2),d2 ; hunk size (header) + lsl.l #2,d2 + moveq #1,d1 + btst #30,d3 ; chip mem? + beq.s r2 + bset #1,d1 +r2 bset #16,d1 + bclr #31,d3 + bclr #30,d3 + move.l d2,d0 + bne.s r17 + clr.l (a2)+ ; empty hunk + bra.s r18 +r17 addq.l #8,d0 ; size + pointer to next hunk + hunk size + jsr AllocMem(a6) + tst.l d0 + beq.w ree + move.l d0,a0 + move.l d2,(a0)+ ; store size + move.l a0,(a2)+ ; store new pointer + move.l a5,d1 + beq.s r10 + move.l a0,d0 + lsr.l #2,d0 + move.l d0,(a5) +r10 move.l a0,a5 +r18 addq.l #1,d6 + cmp.l d6,d7 + bne.s r15 + + moveq #0,d6 +r3 move.l d6,d1 + add.l d1,d1 + add.l d1,d1 + move.l 0(a4,d1.l),a0 + addq.l #4,a0 + move.l (a3)+,d3 ; hunk type + move.l (a3)+,d4 ; hunk size + lsl.l #2,d4 + cmp.l #$3e9,d3 ;code + beq.s r4 + cmp.l #$3ea,d3 ;data + bne.s r5 +r4 + ; code and data + move.l d4,d0 +r6 tst.l d0 + beq.s r7 + move.b (a3)+,(a0)+ + subq.l #1,d0 + bra.s r6 +r5 + cmp.l #$3eb,d3 ;bss + bne.s ree + +r7 ; scan for reloc32 or hunk_end + move.l (a3)+,d3 + cmp.l #$3ec,d3 ;reloc32 + bne.s r13 + + ; relocate + move.l d6,d1 + add.l d1,d1 + add.l d1,d1 + move.l 0(a4,d1.l),a0 ; current hunk + addq.l #4,a0 +r11 move.l (a3)+,d0 ;number of relocs + beq.s r7 + move.l (a3)+,d1 ;hunk + add.l d1,d1 + add.l d1,d1 + move.l 0(a4,d1.l),d3 ;hunk start address + addq.l #4,d3 +r9 move.l (a3)+,d2 ;offset + add.l d3,0(a0,d2.l) + subq.l #1,d0 + bne.s r9 + bra.s r11 +r13 + cmp.l #$3f2,d3 ;end + bne.s ree + + addq.l #1,d6 + cmp.l d6,d7 + bne.w r3 + + moveq #1,d7 + move.l (a4),a0 +r0 move.l d7,d0 + movem.l (sp)+,d1-d7/a1-a6 + rts +ree move.w #30000,d0 +re1 move.w #$f00,$dff180 + move.w #$00f,$dff180 + move.w #$0f0,$dff180 + dbf d0,re1 + moveq #0,d7 + bra.s r0 + +fsres + movem.l d1/a0-a2/a6,-(sp) + move.l 4,a6 + lea $150(a6),a0 ;ResourceList + move.l (a0),a0 ;lh_Head +fsres3 + tst.l (a0) ;end of list? + beq.s fsres1 + move.l 10(a0),a1 ;name + lea fsresname(pc),a2 +fsres5 + move.b (a1)+,d0 + move.b (a2)+,d1 + cmp.b d1,d0 + bne.s fsres2 + tst.b d0 + beq.s fsres4 + bra.s fsres5 +fsres2 + move.l (a0),a0 + bra.s fsres3 + ; FileSystem.resource does not exist -> create it +fsres1 + moveq #32,d0 ; sizeof(FileSysResource) + move.l #$10001,d1 + jsr AllocMem(a6) + move.l d0,a2 + move.b #8,8(a2) ; NT_RESOURCE + lea fsresname(pc),a0 + move.l a0,10(a2) ; node name + lea exter_name(pc),a0 + move.l a0,14(a2) ; fsr_Creator + lea 18(a2),a0 + move.l a0,(a0) ; NewList() fsr_FileSysEntries + addq.l #4,(a0) + move.l a0,8(a0) + lea $150(a6),a0 ; ResourceList + move.l a2,a1 + jsr -$f6(a6) ; AddTail + move.l a2,a0 +fsres4 + move.l a0,d0 + movem.l (sp)+,d1/a0-a2/a6 + rts + +make_dev: ; IN: A0 param_packet, D6: unit_no, D7: boot, A4: expansionbase + bsr.w fsres + move.l d0,PP_FSRES(a0) ; pointer to FileSystem.resource move.l a0,-(sp) move.w #$FFFC,d0 ; filesys base bsr.w getrtbase @@ -176,39 +396,89 @@ make_dev: ; IN: A0 param_packet, D6: uni bsr.w getrtbase move.l a0,a1 move.l (sp)+,a0 + clr.l PP_FSSIZE(a0) ; filesystem size + clr.l PP_FSPTR(a0) ; filesystem memory jsr (a1) + ; ret:0=virtual,1=hardfile,2=rdbhardfile,-1=hardfile-donotmount,-2=no more subunits move.l d0,d3 + cmp.l #-2,d3 + beq.w general_ret + cmp.l #2,d3 + beq.b MKDV_mountalways ; Don't init hardfiles if < V36 and.l d5,d0 - bne.w general_ret + beq.b MKDV_mountalways + tst.l PP_FSSIZE(a0) + beq.w general_ret ; no filesystem -> don't mount + +MKDV_mountalways: + ; allocate memory for loaded filesystem + move.l PP_FSSIZE(a0),d0 + beq.b MKDV_nordbfs1 + move.l a0,-(sp) + moveq #1,d1 + move.l 4,a6 + jsr AllocMem(a6) + move.l (sp)+,a0 + move.l d0,PP_FSPTR(a0) + +MKDV_nordbfs1: + ; if negative, do not mount but we might need to load possible + ; custom filesystem(s) + tst.l d3 + bmi.s MKDV_devremember move.l a4,a6 move.l a0,-(sp) jsr -144(a6) ; MakeDosNode() move.l (sp)+,a0 ; parmpacket - move.l a0,a1 move.l d0,a3 ; devicenode - move.w #$FF20,d0 ; record in ui.startup (filesys_dev_remember) - bsr.w getrtbase - jsr (a0) - moveq.l #0,d0 + moveq #0,d0 move.l d0,8(a3) ; dn_Task move.l d0,16(a3) ; dn_Handler move.l d0,32(a3) ; dn_SegList - move.l d3,d0 - move.b 79(a1),d3 ; bootpri +MKDV_devremember: + move.l a0,a1 + move.w #$FF20,d0 ; record in ui.startup (filesys_dev_remember) + bsr.w getrtbase + jsr (a0) + + tst.l PP_FSPTR(a1) ; filesystem? + beq.b MKDV_nordbfs2 + move.l PP_FSPTR(a1),a0 + move.l d3,-(sp) + bsr.w relocate + move.l (sp)+,d3 + movem.l d0/a0-a1,-(sp) + move.l PP_FSSIZE(a1),d0 + move.l PP_FSPTR(a1),a1 + move.l 4,a6 + jsr FreeMem(a6) + movem.l (sp)+,d0/a0-a1 tst.l d0 + beq.b MKDV_nordbfs2 + bsr.w addfs + +MKDV_nordbfs2: + tst.l d3 + bmi.w general_ret + + move.w #$FF18,d0 ; update dn_SegList if needed (filesys_dev_bootfilesys) + bsr.w getrtbase + jsr (a0) + + move.b 79(a1),d4 ; bootpri + tst.l d3 bne.b MKDV_doboot -MKDV_is_filesys: move.l #4000,20(a3) ; dn_StackSize lea.l our_seglist(pc),a1 move.l a1,d0 lsr.l #2,d0 move.l d0,32(a3) ; dn_SegList - moveq.l #-1,d0 + moveq #-1,d0 move.l d0,36(a3) ; dn_GlobalVec MKDV_doboot: @@ -218,14 +488,14 @@ MKDV_doboot: move.l 4,a6 moveq.l #20,d0 moveq.l #0,d1 - jsr -198(a6); AllocMem + jsr AllocMem(a6) move.l d0,a1 ; bootnode moveq.l #0,d0 move.l d0,(a1) move.l d0,4(a1) move.w d0,14(a1) move.w #$1000,d0 - or.b d3,d0 + or.b d4,d0 move.w d0,8(a1) move.l $104(a5),10(a1) ; filesys_configdev move.l a3,16(a1) ; devicenode @@ -234,9 +504,9 @@ MKDV_doboot: MKDV_noboot: move.l a3,a0 - moveq.l #0,d1 + moveq #0,d1 move.l d1,a1 - moveq.l #-1,d0 + moveq #-1,d0 move.l a4,a6 ; expansion base jmp -150(a6) ; AddDosNode @@ -263,7 +533,7 @@ filesys_mainloop: ; 157: mousehack started-flag move.l #80+44+1+20+12+1,d0 move.l #$10001,d1 ; MEMF_PUBLIC | MEMF_CLEAR - jsr -198(a6); AllocMem + jsr AllocMem(a6) move.l d0,a3 moveq.l #0,d6 move.l d6,(a3) @@ -393,7 +663,7 @@ LKCK_ListEnd: move.l d7,a2 moveq.l #24,d0 ; sizeof Lock is 20, 4 for chain moveq.l #1,d1 ; MEMF_PUBLIC - jsr -198(a6); AllocMem + jsr AllocMem(a6) addq.w #1,d6 move.l d0,a2 move.l d7,(a2) @@ -449,7 +719,7 @@ createport: bmi.s cp_f moveq #34,d0 move.l #65536+1,d1 - jsr -198(a6); AllocMem + jsr AllocMem(a6) sub.l a0,a0 move.l d0,a2 tst.l d0 @@ -475,7 +745,7 @@ createio: moveq #48,d2 move.l d2,d0 move.l #65536+1,d1 - jsr -198(a6); AllocMem + jsr AllocMem(a6) move.l d0,a0 move.b #10,8(a0) ;NT_MESSAGE move.l d2,18(a0) @@ -490,7 +760,7 @@ createtask: move.l a1,d3 move.l #92+2048,d0 move.l #65536+1,d1 - jsr -198(a6); AllocMem + jsr AllocMem(a6) tst.l d0 beq.b ct_f move.l d0,a2 @@ -546,7 +816,7 @@ mousehack_task: moveq #0,d0 move.w #MH_END,d0 move.l #65536+1,d1 - jsr -198(a6); AllocMem + jsr AllocMem(a6) move.l d0,a5 bsr.w createport @@ -688,4 +958,5 @@ exter_name: dc.b 'UAE filesystem',0 doslibname: dc.b 'dos.library',0 intlibname: dc.b 'intuition.library',0 explibname: dc.b 'expansion.library',0 +fsresname: dc.b 'FileSystem.resource',0 END