From 2456c1fc4bd122a3badbcc15c40e6bbc4e5d4925 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sat, 17 Jul 2021 23:27:54 -0400 Subject: [PATCH] work in progress dump. mostly assembles. --- Makefile | 21 +++- loader.aii | 354 ++++++++++++++++++++++++++++++++++++++--------------- macros.aii | 16 ++- 3 files changed, 287 insertions(+), 104 deletions(-) diff --git a/Makefile b/Makefile index 9680deb..ad2386a 100644 --- a/Makefile +++ b/Makefile @@ -4,12 +4,18 @@ bootblock : bootblock.omf hfs.po mpw makebiniigs -s -org 2048 bootblock.omf -o bootblock dd bs=512 if=bootblock of=hfs.po conv=notrunc oseek=0 +loader : loader.omf + mpw makebiniigs -s -org 8192 loader.omf -o loader -bootblock.omf : bootblock.obj - mpw linkiigs bootblock.obj -o bootblock.omf + +# bootblock.omf : bootblock.obj +# mpw linkiigs bootblock.obj -o bootblock.omf bootblock.obj : bootblock.aii hfs.aii - mpw asmiigs bootblock.aii -o bootblock.obj +# mpw asmiigs bootblock.aii -o bootblock.obj + +loader.obj : loader.aii hfs.aii macros.aii + .PHONY: clean @@ -18,3 +24,12 @@ clean: hfs.po: mkfs-profuse --fst=hfs --size=800k --name="hfs boot" hfs.po + + + + +%.obj : %.aii + mpw asmiigs -l $< -o $@ + +%.omf : %.obj + mpw linkiigs $< -o $@ diff --git a/loader.aii b/loader.aii index f5bcc4f..1af24ea 100644 --- a/loader.aii +++ b/loader.aii @@ -7,6 +7,7 @@ include 'hfs.aii' include 'macros.aii' + include 'e16.gsos' string asis blanks on @@ -15,15 +16,20 @@ __smartport__ set 0 buffer equ $3000 -file_not_found equ $46 dp record 0 -_dp ds.w 1 -ptr ds.1 1 +ptr ds.l 1 path ds.l 1 + +r0 ds.w 1 +r1 ds.w 1 +r2 ds.w 1 +r3 ds.w 1 + ; readfile eof ds.l 1 +blocks ds.w 1 ; shouldn't exceed... ft ds.w 1 at ds.w 1 st ds.w 1 @@ -31,6 +37,33 @@ file_id ds.l 1 endr + + if __smartport__ then +sp record $20 +ReadBlock equ $01 +pcount ds.b 1 +unit ds.b 1 +buffer ds.w 1 +block ds.l 1 ; actually 24-bit + endr + + else + +pro record $42 +cmd ds.b 1 +unit ds.b 1 +buffer ds.b 2 +block ds.b 2 + endr + + endif + + + entry read_block, read_block_abs + entry prepare_path, cat_lookup + entry read_cat_block, read_file_block + + header proc import readfile, getbootname, getfstname, startup @@ -50,29 +83,30 @@ auxtype dc.w 0 data record ; store catalog info -slot ds.w 0 -unit ds.w 0 -vector ds.w 0 +slot dc.w 0 +unit dc.w 0 +vector dc.w 0 -block_offset ds.w 0 +block_offset dc.w 0 -cat_extents ds.w 6 -file_extents ds.w 6 +cat_extents dcb.w 6, 0 +file_extents dcb.w 6, 0 cat_root dc.w 0 system_id dc.l 0 fsts_id dc.l 0 -driver_id dc.l 0 +drivers_id dc.l 0 ; ctree lookup target_parent dc.l 0 + target_str_len dc.w 0 -target_str ds.b 32 +target_str dcb.b 32, 0 cat_str_len dc.w 0 -cat_str ds.b 32 +cat_str dcb.b 32, 0 endr @@ -82,10 +116,6 @@ getbootname proc with dp - tcd ; save - pea fakedp - pld - plx ; rts ply sty ptr @@ -93,8 +123,6 @@ getbootname proc sty ptr+2 phx - pha ; saved d - phb phk plb @@ -113,6 +141,7 @@ getbootname proc inc a lsr a tax ; count + dex ldy #2 @loop lda buffer+drVN-1,y @@ -127,7 +156,6 @@ getbootname proc exit plb - pld rts endp @@ -138,10 +166,6 @@ getfstname proc with dp - tcd ; save - pea fakedp - pld - plx ; rts ply sty ptr @@ -149,8 +173,6 @@ getfstname proc sty ptr+2 phx - pha ; save d - phb phk plb @@ -164,14 +186,12 @@ getfstname proc bpl @loop plb - pld clc lda #0 rts -name dc.w 7 - dc.b 'hfs.fst' - dc.b 0 +name str.w 'hfs.fst' + dcb.b 1,0 endp @@ -181,10 +201,6 @@ readfile proc ; (eof, aux type, file type) readfile(GSString *, void *) with dp - tcd ; save - pea fakedp - pld - plx ; rts ply sty ptr ; data buffer @@ -196,48 +212,84 @@ readfile proc sty path+2 phx - pha ; save d - phb phk plb - lda [path] - cmp #8 - blt notfound + jsr prepare_path + bcs exit + jsr cat_lookup + bcs exit + + ; now read file, one block at a time, + ; and copy to ptr. + lda blocks + beq rdone + stz r0 ; block + +@rloop + lda r0 + jsr read_file_block + bcs exit + + + ; copy to destination + pea buffer>>16 ; src + pea buffer + pei ptr+2 ; dest + pei ptr + pea 0 ; count + pea 512 + _BlockMove + + + lda ptr + clc + adc #512 + sta ptr + lda ptr+2 + adc #0 + sta ptr+2 + + inc r0 + dec blocks + bne @rloop + +rdone ; ... - ; stack: b, d, rts, + ; stack: b, rts, lda ft - sta 3+3,s + sta 4,s lda at - sta 5+3,s + sta 6,s lda eof - sta 7+3,s + sta 8,s lda eof+2 - sta 9+3,s + sta 10,s lda #0 clc exit plb - pld rts endp -find_parent proc +prepare_path proc - with dp + with dp, data ; optimism - stz offset + stz r0 ; offset into path lda system_id - sta parent_id + sta target_parent + sta system_id+2 + sta target_parent+2 lda [path] @@ -257,7 +309,7 @@ find_parent proc lda [path],y iny - sty offset + sty r0 cmp #'D:' beq d @@ -266,43 +318,42 @@ find_parent proc and #$ff cmp #':' - beq s -err lda #file_not_found + beq sys +err lda #fileNotFound sec rts -s - clc - rts +sys brl target ; check for more ':' ? d ; check for a driver folder. lda [path] cmp #16 - blt s + blt sys ldx #4 @loop lda [path],y cmp s2,y - bne s + bne sys iny iny dex bne @loop ; match! - sty offset - lda driver_id - sta parent_id - clc - rts + sty r0 + lda drivers_id + sta target_parent + lda drivers_id+2 + sta target_parent+2 + brl target f ; check for FSTs folder lda [path] cmp #13 - blt s + blt sys ldx #2 @loop lda [path],y cmp s3,y - bne s + bne sys iny iny dex @@ -310,14 +361,61 @@ f ; check for FSTs folder lda [path],y and #$ff cmp #':' - bne s + bne sys iny - sty offset + sty r0 lda fsts_id - sta parent_id + sta target_parent + lda fsts_id+2 + sta target_parent+2 + + ; drop through + +target +; now set target_str / len + lda [path] + sec + sbc r0 + beq fnf ; close enough + sta target_str_len + cmp #16 + bcs fnf + + ldx #30 +@zloop stz target_str,x + dex + dex + bpl @zloop + + short m + ldx #0 +@loop + lda [path],y + cmp #':' + beq fnf + cmp #'z'+1 + bge @next + cmp #'a' + blt @next + and #$ff xor $20 + +@next sta target_str_len,x + iny + inx + cpx target_str_len + blt @loop + + long m + lda #0 clc rts +fnf long m + lda #fileNotFound + sec + rts + + s1 dc.b 'xxSYSTEM:' s2 dc.b 'xxSYSTEM:DRIVERS:' s3 dc.b 'xxSYSTEM:FSTS:' @@ -378,6 +476,12 @@ vector dc.w $ffff cat_lookup proc + with data + +bnum equ dp.r0 +prev equ dp.r1 +count equ dp.r2 + ; search for a file and a parent directory. lda cat_root @@ -405,15 +509,15 @@ eloop xba cmp target_parent+2 beq @p2 - blt lt - bge gt + blt @lt + bge @gt @p2 lda data+HFSCatalogKey.parentID+2,y xba - cmp target_parent+2 + cmp target_parent beq @nm - blt lt - bge gt + blt @lt + bge @gt @gt ; if this is an index node, @@ -428,6 +532,7 @@ eloop ; now do a name check.... ; target_name is UPPER CASE +@nm jsr name_check cmp #0 beq @found @@ -468,7 +573,7 @@ advance bra ix nope - lda #file_not_found + lda #fileNotFound sec rts @@ -514,7 +619,7 @@ upper bge @next cmp #'a' blt @next - and #$20 + and #$ff xor $20 sta cat_str,y @next iny @@ -559,6 +664,10 @@ exit match ; a match! ; store the file type, aux type, eof, and extent pointers. ; a match! + + + with dp + lda buffer+HFSCatalogKey.keyLength,y and #$ff inc a ; doesn't include itself @@ -573,13 +682,14 @@ match ; a match! cmp #kHFSFileRecord beq file ; folder thread, file thread.... invalid for us. - lda #file_not_found + lda #fileNotFound sec rts folder with HFSCatalogFolder stz eof stz eof+2 + stz blocks stz at lda #$f sta ft @@ -614,6 +724,15 @@ file xba sta eof+2 + ; blocks + ; update if variable block size? + lda buffer+dataPhysicalSize+2,y +; xba + lsr a ; >>9 since already xba + and #%01111111 + sta blocks + + lda #1 sta st ; storage type @@ -658,16 +777,16 @@ file stz at lda data+userInfo+4,y cmp #'dp' - bne @noft + bne noft lda data+userInfo+4+2,y cmp #'so' - bne @noft + bne noft pdos lda data+userInfo,y tax and #$ff cmp #'p' - bne @noft + bne noft txa xba and #$ff @@ -675,7 +794,7 @@ pdos lda data+userInfo+2,y xba sta at -@noft +noft lda #0 clc @@ -685,6 +804,17 @@ pdos endp + macro +&lab ifc_fail &str +&lab bcc @ok + pha + pea @str>>16 + pea @str + _SysFailMgr + brk $ea +@str str.b &str +@ok + mend ; ; everything below here will be clobbered. @@ -707,8 +837,10 @@ startup proc sty vector sta unit - pea fakedp - pld + lda #0 + tcd + ldx #$1ff + txs with HFSMasterDirectoryBlock @@ -754,15 +886,15 @@ startup proc bpl @zloop ldx #14-2 -@sloop +sloop lda sys,x sta target_str_len,x dex dex - bpl @sloop + bpl sloop jsr cat_lookup - bcs bad + ifc_fail 'Unable to locate System folder. Error=$' ; also check if dir? @@ -776,15 +908,16 @@ startup proc ; lookup System:FSTs ldx #14-2 -@floop +floop lda fsts,x sta target_str_len,x dex dex - bpl @floop + bpl floop jsr cat_lookup - bcs bad + ifc_fail 'Unable to locate System:FSTs folder. Error=$' + ; also check if dir? lda file_id @@ -795,21 +928,22 @@ startup proc ; lookup System:Drivers ldx #14-2 -@dloop +dloop lda drv,x sta target_str_len,x dex dex - bpl @dloop + bpl dloop jsr cat_lookup - bcs bad + ifc_fail 'Unable to locate System:Drivers folder. Error=$' + ; also check if dir? lda file_id - sta driver_id + sta drivers_id lda file_id+2 - sta driver_id+2 + sta drivers_id+2 ; lookup System:Start.GS.OS @@ -822,19 +956,44 @@ startup proc bpl @gloop jsr cat_lookup - bcs bad + ifc_fail 'Unable to locate System:Start.GS.OS. Error=$' +read + stz r0 + lda blocks + beq bad + + lda #$6800 + sta pro.buffer + +@loop lda r0 + jsr read_file_block + bcs bad + lda pro.buffer +; clc + adc #512 + sta pro.buffer + inc r0 + dec blocks + bne @loop + + lda at sta auxtype -; lda #$1000 ; drivers:boot.driver support -; ldx #0 -; ldy #0 jmp $6800 +bad pha + pea @str>>16 + pea @str + _SysFailMgr + brk $ea +@str str.b 'Error reading Start.GS.OS. Error=$' + +; buffered out to same length. sys str.w 'SYSTEM' dcb.b 6,0 fsts str.w 'FSTS' @@ -845,9 +1004,4 @@ gsos str.w 'START.GS.OS' dcb.b 1,0 endp - - -fakedp proc - end - end diff --git a/macros.aii b/macros.aii index a01172f..c3bf441 100644 --- a/macros.aii +++ b/macros.aii @@ -75,4 +75,18 @@ sep #&bits ENDIF - MEND \ No newline at end of file + MEND + + + MACRO +&lab _BlockMove +&lab ldx #$2B02 + jsl $E10000 + MEND + + MACRO +&lab _SysFailMgr +&lab ldx #$1503 + jsl $E10000 + MEND +