home *** CD-ROM | disk | FTP | other *** search
- * Programmheader
- *
- * Name: GrabKick
- * Author: SDI
- * Distribution: PD
- * Description: read Kickstart out of ROM and write it to file
- * Compileropts: -
- * Linkeropts: -
- * CLI-Parameter: FILENAME
- *
- * vers date length
- * 1.1 23.12.92 10612 : ANSI-C-Version made by Ralf Gruner
- *
- * I used name and idea of this program, but not the ANSI-C code,
- * because Amiga-ROM functions need no program space: 10612 --> 880 byte
- * My program makes no output to user! It can fail at some positions,
- * but these fails are so seldom that error messages aren't neccessary!
- * The only needed error message (disk full) is made by system function.
- * 1.2 07.08.95 880 : new calculation for Revisionnummer works around
- * calculation-error of MaxonC++
- * 1.3 03.12.95 244 : made new with Maxon Assembler
- * 1.4 04.12.95 236 : made shorter
- * 1.5 10.12.95 228 : made shorter
- * 1.6 19.12.95 300 : now also working from WorkBench
- * 1.7 05.01.96 332 : included CLI parameter FILENAME, removed some bugs
- * 1.8 10.02.96 508 : Asl-Requester on Workbench-start, new Icon
- * 1.9 11.02.96 488 : made shorter, commented text
- * 1.10 12.02.96 484 : made shorter
- * 1.11 14.02.96 476 : CMPA.L #0,Ax replaced by MOVE.L Ax,D0
- * 1.12 17.02.96 476 : BUG: Open_Mode is .L and not .W !
- * 1.13 08.03.96 472 : a little bit shorter, tricky LibName method,
- * translated source to english
- * 1.14 11.04.96 472 : overworked the source code, no new binary file
- * 1.15 11.06.96 496 : removed a .L / .W error in name-creation, removed
- * libname trick, added version-string to ASL-Req. title
- * 1.16 21.11.96 504 : added correct Return codes (#20 on failing)
- * 1.17 07.01.97 508 : added second exe copying the ROM first to RAM,
- * corrected WB start Enforcer hit
- * 1.18 01.10.97 512 : uses FindTask(0) instead of ThisTask(ExecBase)
- * 1.19 08.03.98 488 : removed relocs
- * 1.20 04.04.98 488 : oops, removed TAG_DONE in last release,
- * added again, CurrentDir bug fix
- * 1.21 07.04.98 488 : fixes
-
- NOLIST
- INCLUDE AINCLUDE:IncDirs.i
- INCLUDE dos/dosextens.i
- INCLUDE lvo.i
- INCLUDE dos/dos.i
- INCLUDE exec/execbase.i
- INCLUDE exec/memory.i
- INCLUDE workbench/startup.i
- INCLUDE workbench/workbench.i
- INCLUDE libraries/asl.i
- LIST
-
- SECTION "GrabKick",CODE
- MOVEA.L A0,A2 ;store string
- MOVE.L D0,D6 ;store size
- SUBA.L A5,A5 ;A5 - clear (later StartupM)
- MOVEA.L 4.W,A6
- SUBA.L A1,A1
- JSR _LVOFindTask(A6)
- MOVEA.L D0,A4
- TST.L pr_CLI(A4) ;are we on WorkBench ?
- BNE.B .CLI
- LEA pr_MsgPort(A4),A0
- JSR _LVOWaitPort(A6) ;wait for StartUp message
- LEA pr_MsgPort(A4),A0
- JSR _LVOGetMsg(A6) ;get Message into A5
- MOVEA.L D0,A5 ;A5 - WBStartUp message
- MOVEQ #0,D6 ;no string arg
- BRA.B .start
- .CLI SUBQ.W #1,D6
- BEQ.B .start ;only one char, no parameter is given
- CLR.B (A2,D6.W) ;make C-string, last char is 0
- .start LEA KICKEND(PC),A1
- LEA $01000000,A3 ;Kick-ROM End is every time same!!!
- MOVE.L -20(A3),D3 ;D3 - RomSize
- SUBA.L D3,A3 ;A3 - Romstart
-
- TST.L D6 ;a name already exists
- BNE.B .GoOn
-
- MOVE.W 12(A3),D4 ;D4 - Romvers
- MULU #1000,D4
- ADD.W 14(A3),D4 ;D4 - Fullversion
- .LOOP ;calculate kick..... name
- MOVE.L D4,D2
- DIVU #10,D2 ;divide with ten
- MOVEQ #0,D4
- MOVE.W D2,D4 ;store in D4
- SWAP D2
- ADD.B D2,-(A1) ;remainder into namefile
- TST.W D4
- BNE.B .LOOP
- ;end of loop ;D4 - not used
- LEA KICKSTR(PC),A2 ;A2 - kick.....
- .GoOn MOVEQ #33,D0
- LEA DOSLIBN(PC),A1
- JSR _LVOOpenLibrary(A6) ;open dos.library
- MOVE.L D0,D7 ;D7 - DosBase
- BEQ.W ENDE ;double jump saves 2 byte
-
- MOVEQ #0,D5 ;D5 - clear (later Lock)
- MOVE.L A5,D6 ;do we have a startup message
- BEQ.B Open ;when not, D6 is cleared
-
- MOVEA.L sm_ArgList(A5),A0 ;on WB-start get PROGDIR:
- MOVE.L A0,D1
- BEQ.W CLSDOS
- MOVE.L (A0),D1 ;set PROGDIR as current
- MOVEA.L D7,A6
- JSR _LVOCurrentDir(A6)
- MOVE.L D0,-(A7) ;store CurrentDir
-
- MOVEA.L 4.W,A6
- LEA ASLLIBN(PC),A1
- MOVEQ #37,D0
- JSR _LVOOpenLibrary(A6) ;open asl.library
- MOVE.L D0,D6 ;D6 - AslBase
- BEQ.B Open ;failed ?, then like CLI
- MOVEA.L D6,A6
- MOVEQ #ASL_FileRequest,D0
- SUBA.L A0,A0 ;no tags
- JSR _LVOAllocAslRequest(A6) ;create Request-struct
- MOVEA.L D0,A4 ;A4 - FileRequester
- TST.L D0
- BEQ.B Open ;failed ?, then like CLI
- MOVEA.L A4,A0
- CLR.L -(A7) ;end of taglist
- PEA (A2) ;initial file
- PEA ASLFR_InitialFile ;initial file tag
- PEA VERSION(PC) ;title text
- PEA ASLFR_TitleText ;title text tag
- MOVE.L A7,A1
- JSR _LVOAslRequest(A6) ;call requester
- LEA.L 5*4(A7),A7 ;restore stack
- TST.W D0
- BEQ.B CLEANUP ;failed?, end!!!, it's user-abort
- MOVE.L fr_Drawer(A4),D1
- MOVEQ #SHARED_LOCK,D2 ;share the directory lock
- MOVEA.L D7,A6 ;set DosBase
- JSR _LVOLock(A6) ;get lock on directory
- MOVE.L D0,D5 ;D5 - Lock
- BEQ.B CLEANUP ;failed?, end!!!, else it makes shit
- MOVE.L D5,D1
- JSR _LVOCurrentDir(A6) ;make selected directory current
- MOVEA.L fr_File(A4),A2 ;A2 - asl name
- Open
- ********
- * MOVEA.L 4.W,A6
- * MOVE.L D3,D0 ;size of memory
- * MOVEQ #MEMF_PUBLIC,D1 ;memory type
- * JSR _LVOAllocMem(A6) ;get memory
- * MOVE.L D0,D4
- * BEQ.B CLEANUP
- * MOVEA.L A3,A0 ;source buffer
- * MOVEA.L D4,A1 ;destination buffer
- * MOVE.L D3,D0 ;size
- * JSR _LVOCopyMemQuick(A6) ;copy the memory
- * MOVEA.L D4,A3 ;new source is now RAM
- ********
- MOVE.L A2,D1 ;name parameter
- MOVE.L #MODE_NEWFILE,D2 ;mode parameter
- MOVEA.L D7,A6 ;set DosBase
- JSR _LVOOpen(A6)
- MOVE.L D0,D4 ;D4 - FileHandle
- BEQ.B CLEANUP2
- ;quantity parameter D3 has already it's value
- MOVE.L D4,D1 ;filehandle parameter
- MOVE.L A3,D2 ;buffer parameter
- JSR _LVOWrite(A6)
- MOVE.L D0,D2 ;D2 - returnstate of Write
- MOVE.L D4,D1 ;filehandle parameter
- JSR _LVOClose(A6)
- CMP.L D3,D2 ;D2 != D3, then delete File
- BEQ.B ALL_OK
- MOVE.L A2,D1
- JSR _LVODeleteFile(A6)
- BRA.B CLEANUP2
- ALL_OK SUBA.L A2,A2 ; all ok - clear return code
- CLEANUP2
- ********
- * MOVEA.L 4.W,A6
- * MOVEA.L A3,A1 ;pointer to memory
- * MOVE.L D3,D0 ;size of memory
- * JSR _LVOFreeMem(A6) ;free allocated memory
- ********
- CLEANUP
- MOVE.L D7,A6 ;get DosBase
- MOVE.L D5,D1
- BEQ.B .next
- JSR _LVOUnLock(A6) ;free lock
- .next MOVEA.L A5,D0
- BEQ.B CLSDOS ;no wb stuff (asl, ...)
- MOVE.L (A7)+,D1
- JSR _LVOCurrentDir(A6) ;restore CurrentDir
-
- TST.L D6
- BEQ.B CLSDOS
- MOVE.L A4,D0
- BEQ.B .clsasl
- MOVEA.L D6,A6
- MOVEA.L A4,A0
- JSR _LVOFreeAslRequest(A6) ;close filerequester
- .clsasl MOVEA.L 4.W,A6 ;get ExecBase
- MOVEA.L D6,A1
- JSR _LVOCloseLibrary(A6) ;close asl.library
- CLSDOS MOVEA.L 4.W,A6
- MOVEA.L D7,A1
- JSR _LVOCloseLibrary(A6) ;close dos.library
- ENDE
- MOVE.L A5,D0 ;come we from Workbench ?
- BEQ.B .exit ;no - was CLI
-
- JSR _LVOForbid(A6) ;make ReplyMsg save
- MOVEA.L A5,A1 ;get Message into A1
- JSR _LVOReplyMsg(A6) ;end program
-
- .exit MOVE.L A2,D0 ;A2 == 0 --> all ok
- BEQ.B .end
- MOVEQ #RETURN_FAIL,D0
- .end RTS
- DOSLIBN DC.B 'dos.library',0
- ASLLIBN DC.B 'asl.library',0
- KICKSTR DC.B 'kick00000'
- KICKEND DC.B 0
- DC.B '$VER: '
- VERSION DC.B 'GrabKick 1.21 (07.04.1998) (PD) by SDI'
- ********
- * DC.B ' (RAM Version)'
- ********
- DC.B 0
- END
-
-