; ; LoadIt (C)1987 Bryce Nesbitt. Revokable, free, non-exclusive licence ; hereby granted to any sentient being to use or abuse this code in any way ; whatsoever provided that this and any other copyright notices remain fully ; attached, and with the exception that, without prior written permission, ; it not be utilized by any entity that has been commonly referred to as ; Robert W. Skyles, Skyles Electric Works, Jim Drew, Regie Warren or any ; organization founded by, controlled, employing or profiting any such ; entity, it's offspring or spouses. FISH use ok. ; ; Author correspondence, bug or stupidity reports may be directed to: ; Bryce Nesbitt ;bryce@cogsci.Berkeley.EDU ; 1712 Marin Ave. ; Berkeley, Ca 96034-9412 ; ; USAGE: LoadIt ; ; FUNCTION: Loads a file into memory, and reports the address. The ; file remains at that address until a re-boot. ; ; EXAMPLES: LoadIt c:install ; LoadIt Read Me ;No parsing is done. Quotes not needed ; ; BUGS: If there is an error during the read the allocated memory will ; not be returned. ; ; Proper size when assembled with the Metacompost assembler ; and BLINK'ed is 424 bytes ; ; RETURN CODE CONVENTION: ; ; FAIL (20) - serious error, no DOS, memory etc. ; ERROR (10) - user caused error. (file not found, syntax) ; WARN (5) - technicality such as file not found on DELETE. ; ************************** NOLIST INCLUDE 'libraries/dosextens.i' ;INCLUDE 'lib/exec_lib.i' ;eliminates link with amiga.lib ;INCLUDE 'lib/dos_lib.i' ;non-standard, but very speedy! LIST jsrlib macro xref _LVO\1 jsr _LVO\1(a6) endm blink macro bchg.b #1, $bfe001 endm ************************** CODE ; reserved1 equr a7 reserved2 equr a6 lock equr a5 handle equr a4 block equr a3 reserved3 equr a2 returncode equr d7 resultcode equr d6 size equr d5 inline equr d4 reserved4 equr d3 reserved5 equr d2 ;-- "parse" the string -- clr.b -1(a0,d0) ;null terminate string move.l a0,inline ;the quick and dirty way. ;-- Set defaults -- suba.l lock,lock suba.l handle,handle moveq #10,returncode ;default ERROR code ;-- Open DOS -- move.l 4,a6 lea DOSName(pc),a1 jsrlib OldOpenLibrary ;1.0 compatible move.l d0,a6 ;Look Ma, no error check! ;-- Get a lock -- move.l inline,d1 moveq #ACCESS_READ,d2 jsrlib Lock move.l d0,d1 move.l d0,lock beq.s e_lock ;-- Examine locked object [d1-lock] -- suba.l #fib_SIZEOF,a7 move.l a7,d2 ;[lock in d1] jsrlib Examine tst.l d0 ;grrr beq.s e_examine move.l fib_Size(a7),d0 adda.l #fib_SIZEOF,a7 move.l d0,size beq e_nosize ;-- Get enough memory to fit [d0-size] -- move.l a6,-(a7) ;[size in d0] moveq #0,d1 ;Any type of memory move.l 4,a6 jsrlib AllocMem move.l (a7)+,a6 move.l d0,block tst.l d0 ;grrr beq.s e_memory ;-- Open object -- move.l inline,d1 move.l #MODE_OLDFILE,d2 jsrlib Open move.l d0,handle move.l d0,d1 beq.s e_open ;-- Read entire thing -- ;[handle in d1] move.l block,d2 move.l size,d3 jsrlib Read cmp.l d0,d3 bne.s e_read ;-- Play leapfrog with deallocation -- moveq #0,returncode ;OK e_read e_open e_examine e_lock e_stuff jsrlib IoErr move.l d0,resultcode errorentry move.l handle,d1 beq.s noclose jsrlib Close noclose move.l lock,d1 beq.s nounlock jsrlib UnLock nounlock tst.l returncode beq.s noerrors ;-- print error -- lea nocans(pc),a2 moveq #nocane-nocans,d3 bsr.s DOWRITE ;error handling? bra.s closeup ;-- print stats -- noerrors lea itsats(pc),a2 moveq #itsate-itsats,d3 bsr.s DOWRITE ;error handling? move.l block,d0 moveq #',',d3 bsr.s PRINTLONGHEX ;error handling? lea sizes(pc),a2 moveq #sizee-sizes,d3 bsr.s DOWRITE ;error handling? move.l size,d0 moveq #10,d3 bsr.s PRINTLONGHEX ;error handling? ;-- Close up -- closeup move.l a6,a1 ;a6 had DosBase move.l 4,a6 jsrlib CloseLibrary suba.l a1,a1 ;zero out a1 jsrlib FindTask ;Find THIS task move.l d0,a0 move.l resultcode,pr_Result2(a0) ;set WHY (or RESULT) code move.l returncode,d0 rts ;-- Handle out of memory -- e_memory moveq #20,returncode ;upgrade to FAIL moveq #ERROR_NO_FREE_STORE,resultcode bra.s errorentry ;-- Set misleading error message for zero byte length file -- e_nosize moveq #ERROR_FILE_NOT_OBJECT,resultcode bra.s errorentry ; ;error=DOWRITE(buffer,length),dos ; z a2 d3<>0 ; DOWRITE jsrlib Output move.l d0,d1 beq.s e_noout move.l a2,d2 ;[length in d3] jsrlib Write e_noout ;cmp.l d0,d3 ;check for mismatch rts ; ;PRINTLONGHEX(value,terminator),dos ; d0 d3.b ; PRINTLONGHEX ;movem.l d0-d3/a0-a1,-(a7) subq.l #5,a7 ;Take 10 bytes from stack subq.l #5,a7 ;(it's smaller...) move.l a7,a0 moveq #7,d2 1$ rol.l #4,d0 move.l d0,d1 andi.w #$f,d1 move.b hextab2(pc,d1.w),(a0)+ dbra d2,1$ move.b d3,(a0) jsrlib Output move.l d0,d1 beq.s er_output move.l a7,d2 moveq #9,d3 jsrlib Write addq.l #5,a7 addq.l #5,a7 er_output er_lib ;movem.l (a7)+,d0-d3/a0-a1 rts DOSName dc.b 'dos.library',0 nocans dc.b 'Can',39,'t load file',10 nocane itsats dc.b 'File loaded at address $' itsate sizes dc.b ' size $' sizee hextab2 dc.b '0123456789ABCDEF' dc.b '(C)1987 Bryce Nesbitt' dc.b 1 ;release 1 ;-- That's all folks --