home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / tools / misc / grabkick / grabkick.a next >
Encoding:
Text File  |  1998-04-07  |  6.9 KB  |  237 lines

  1. * Programmheader
  2. *
  3. *    Name:        GrabKick
  4. *    Author:        SDI
  5. *    Distribution:    PD
  6. *    Description:    read Kickstart out of ROM and write it to file
  7. *    Compileropts:    -
  8. *    Linkeropts:    -
  9. *    CLI-Parameter:    FILENAME
  10. *
  11. * vers    date   length
  12. * 1.1   23.12.92  10612    : ANSI-C-Version made by Ralf Gruner
  13. *
  14. *    I used name and idea of this program, but not the ANSI-C code,
  15. *    because Amiga-ROM functions need no program space: 10612 --> 880 byte
  16. *    My program makes no output to user! It can fail at some positions,
  17. *    but these fails are so seldom that error messages aren't neccessary!
  18. *    The only needed error message (disk full) is made by system function.
  19. * 1.2   07.08.95    880    : new calculation for Revisionnummer works around
  20. *    calculation-error of MaxonC++
  21. * 1.3   03.12.95    244    : made new with Maxon Assembler
  22. * 1.4   04.12.95    236    : made shorter
  23. * 1.5   10.12.95    228    : made shorter
  24. * 1.6   19.12.95    300    : now also working from WorkBench
  25. * 1.7   05.01.96    332    : included CLI parameter FILENAME, removed some bugs
  26. * 1.8   10.02.96    508 : Asl-Requester on Workbench-start, new Icon
  27. * 1.9   11.02.96    488 : made shorter, commented text
  28. * 1.10  12.02.96    484 : made shorter
  29. * 1.11  14.02.96    476 : CMPA.L #0,Ax replaced by MOVE.L Ax,D0
  30. * 1.12  17.02.96    476 : BUG: Open_Mode is .L and not .W !
  31. * 1.13  08.03.96    472 : a little bit shorter, tricky LibName method,
  32. *    translated source to english
  33. * 1.14  11.04.96    472 : overworked the source code, no new binary file
  34. * 1.15  11.06.96    496 : removed a .L / .W error in name-creation, removed
  35. *    libname trick, added version-string to ASL-Req. title
  36. * 1.16  21.11.96    504 : added correct Return codes (#20 on failing)
  37. * 1.17  07.01.97    508 : added second exe copying the ROM first to RAM,
  38. *    corrected WB start Enforcer hit
  39. * 1.18  01.10.97    512 : uses FindTask(0) instead of ThisTask(ExecBase)
  40. * 1.19  08.03.98    488 : removed relocs
  41. * 1.20  04.04.98    488 : oops, removed TAG_DONE in last release,
  42. *    added again, CurrentDir bug fix
  43. * 1.21  07.04.98    488 : fixes
  44.  
  45.     NOLIST
  46.     INCLUDE    AINCLUDE:IncDirs.i
  47.     INCLUDE    dos/dosextens.i
  48.     INCLUDE lvo.i
  49.     INCLUDE dos/dos.i
  50.     INCLUDE    exec/execbase.i
  51.     INCLUDE exec/memory.i
  52.     INCLUDE    workbench/startup.i
  53.     INCLUDE    workbench/workbench.i
  54.     INCLUDE    libraries/asl.i
  55.     LIST
  56.  
  57.     SECTION "GrabKick",CODE
  58.     MOVEA.L    A0,A2            ;store string
  59.     MOVE.L    D0,D6            ;store size
  60.     SUBA.L    A5,A5            ;A5 - clear (later StartupM)
  61.     MOVEA.L    4.W,A6
  62.     SUBA.L    A1,A1
  63.     JSR    _LVOFindTask(A6)
  64.     MOVEA.L    D0,A4
  65.     TST.L    pr_CLI(A4)        ;are we on WorkBench ?
  66.     BNE.B    .CLI
  67.     LEA    pr_MsgPort(A4),A0
  68.     JSR    _LVOWaitPort(A6)    ;wait for StartUp message
  69.     LEA    pr_MsgPort(A4),A0
  70.     JSR    _LVOGetMsg(A6)        ;get Message into A5
  71.     MOVEA.L    D0,A5            ;A5 - WBStartUp message
  72.     MOVEQ    #0,D6            ;no string arg
  73.     BRA.B    .start
  74. .CLI    SUBQ.W    #1,D6
  75.     BEQ.B    .start            ;only one char, no parameter is given
  76.     CLR.B    (A2,D6.W)        ;make C-string, last char is 0
  77. .start    LEA    KICKEND(PC),A1
  78.     LEA    $01000000,A3        ;Kick-ROM End is every time same!!!
  79.     MOVE.L    -20(A3),D3        ;D3 - RomSize
  80.     SUBA.L    D3,A3            ;A3 - Romstart
  81.  
  82.     TST.L    D6            ;a name already exists
  83.     BNE.B    .GoOn
  84.  
  85.     MOVE.W    12(A3),D4        ;D4 - Romvers
  86.     MULU    #1000,D4
  87.     ADD.W    14(A3),D4        ;D4 - Fullversion
  88. .LOOP                    ;calculate kick..... name
  89.     MOVE.L    D4,D2
  90.     DIVU    #10,D2            ;divide with ten
  91.     MOVEQ    #0,D4
  92.     MOVE.W    D2,D4            ;store in D4
  93.     SWAP    D2
  94.     ADD.B    D2,-(A1)        ;remainder into namefile
  95.     TST.W    D4
  96.     BNE.B    .LOOP
  97. ;end of loop                ;D4 - not used
  98.     LEA    KICKSTR(PC),A2        ;A2 - kick.....
  99. .GoOn    MOVEQ    #33,D0
  100.     LEA    DOSLIBN(PC),A1
  101.     JSR    _LVOOpenLibrary(A6)    ;open dos.library
  102.     MOVE.L    D0,D7            ;D7 - DosBase
  103.     BEQ.W    ENDE            ;double jump saves 2 byte
  104.  
  105.     MOVEQ    #0,D5            ;D5 - clear (later Lock)
  106.     MOVE.L    A5,D6            ;do we have a startup message
  107.     BEQ.B    Open            ;when not, D6 is cleared
  108.  
  109.     MOVEA.L    sm_ArgList(A5),A0    ;on WB-start get PROGDIR:
  110.     MOVE.L    A0,D1
  111.     BEQ.W    CLSDOS
  112.     MOVE.L    (A0),D1            ;set PROGDIR as current
  113.     MOVEA.L    D7,A6
  114.     JSR    _LVOCurrentDir(A6)
  115.     MOVE.L    D0,-(A7)        ;store CurrentDir
  116.  
  117.     MOVEA.L    4.W,A6
  118.     LEA    ASLLIBN(PC),A1
  119.     MOVEQ    #37,D0
  120.     JSR    _LVOOpenLibrary(A6)    ;open asl.library
  121.     MOVE.L    D0,D6            ;D6 - AslBase
  122.     BEQ.B    Open            ;failed ?, then like CLI
  123.     MOVEA.L    D6,A6
  124.     MOVEQ    #ASL_FileRequest,D0
  125.     SUBA.L    A0,A0            ;no tags
  126.     JSR    _LVOAllocAslRequest(A6)    ;create Request-struct
  127.     MOVEA.L    D0,A4            ;A4 - FileRequester
  128.     TST.L    D0
  129.     BEQ.B    Open            ;failed ?, then like CLI
  130.     MOVEA.L    A4,A0
  131.     CLR.L    -(A7)             ;end of taglist
  132.     PEA    (A2)            ;initial file
  133.     PEA    ASLFR_InitialFile    ;initial file tag
  134.     PEA    VERSION(PC)        ;title text
  135.     PEA    ASLFR_TitleText     ;title text tag
  136.     MOVE.L    A7,A1
  137.     JSR    _LVOAslRequest(A6)    ;call requester
  138.     LEA.L    5*4(A7),A7        ;restore stack
  139.     TST.W    D0
  140.     BEQ.B    CLEANUP            ;failed?, end!!!, it's user-abort
  141.     MOVE.L    fr_Drawer(A4),D1
  142.     MOVEQ    #SHARED_LOCK,D2        ;share the directory lock
  143.     MOVEA.L    D7,A6            ;set DosBase
  144.     JSR    _LVOLock(A6)        ;get lock on directory
  145.     MOVE.L    D0,D5            ;D5 - Lock
  146.     BEQ.B    CLEANUP            ;failed?, end!!!, else it makes shit
  147.     MOVE.L    D5,D1
  148.     JSR    _LVOCurrentDir(A6)    ;make selected directory current
  149.     MOVEA.L    fr_File(A4),A2        ;A2 - asl name
  150. Open
  151. ********
  152. *    MOVEA.L    4.W,A6
  153. *    MOVE.L    D3,D0            ;size of memory
  154. *    MOVEQ    #MEMF_PUBLIC,D1        ;memory type
  155. *    JSR    _LVOAllocMem(A6)    ;get memory
  156. *    MOVE.L    D0,D4
  157. *    BEQ.B    CLEANUP
  158. *    MOVEA.L    A3,A0            ;source buffer
  159. *    MOVEA.L    D4,A1            ;destination buffer
  160. *    MOVE.L    D3,D0            ;size
  161. *    JSR    _LVOCopyMemQuick(A6)    ;copy the memory
  162. *    MOVEA.L    D4,A3            ;new source is now RAM
  163. ********
  164.     MOVE.L    A2,D1            ;name parameter
  165.     MOVE.L    #MODE_NEWFILE,D2    ;mode parameter
  166.     MOVEA.L    D7,A6            ;set DosBase
  167.     JSR    _LVOOpen(A6)
  168.     MOVE.L    D0,D4            ;D4 - FileHandle
  169.     BEQ.B    CLEANUP2
  170.                 ;quantity parameter D3 has already it's value
  171.     MOVE.L    D4,D1            ;filehandle parameter
  172.     MOVE.L    A3,D2            ;buffer parameter
  173.     JSR    _LVOWrite(A6)
  174.     MOVE.L    D0,D2            ;D2 - returnstate of Write
  175.     MOVE.L    D4,D1            ;filehandle parameter
  176.     JSR    _LVOClose(A6)
  177.     CMP.L    D3,D2            ;D2 != D3, then delete File
  178.     BEQ.B    ALL_OK
  179.     MOVE.L    A2,D1
  180.     JSR    _LVODeleteFile(A6)
  181.     BRA.B    CLEANUP2
  182. ALL_OK    SUBA.L    A2,A2            ; all ok - clear return code
  183. CLEANUP2
  184. ********
  185. *    MOVEA.L    4.W,A6
  186. *    MOVEA.L    A3,A1            ;pointer to memory
  187. *    MOVE.L    D3,D0            ;size of memory
  188. *    JSR    _LVOFreeMem(A6)        ;free allocated memory
  189. ********
  190. CLEANUP
  191.     MOVE.L    D7,A6            ;get DosBase
  192.     MOVE.L    D5,D1
  193.     BEQ.B    .next
  194.     JSR    _LVOUnLock(A6)        ;free lock
  195. .next    MOVEA.L    A5,D0
  196.     BEQ.B    CLSDOS            ;no wb stuff (asl, ...)
  197.     MOVE.L    (A7)+,D1
  198.     JSR    _LVOCurrentDir(A6)    ;restore CurrentDir    
  199.  
  200.     TST.L    D6
  201.     BEQ.B    CLSDOS
  202.     MOVE.L    A4,D0
  203.     BEQ.B    .clsasl
  204.     MOVEA.L    D6,A6
  205.     MOVEA.L    A4,A0
  206.     JSR    _LVOFreeAslRequest(A6)    ;close filerequester
  207. .clsasl    MOVEA.L    4.W,A6            ;get ExecBase
  208.     MOVEA.L    D6,A1
  209.     JSR    _LVOCloseLibrary(A6)    ;close asl.library
  210. CLSDOS    MOVEA.L    4.W,A6
  211.     MOVEA.L    D7,A1
  212.     JSR    _LVOCloseLibrary(A6)    ;close dos.library
  213. ENDE
  214.     MOVE.L    A5,D0            ;come we from Workbench ?
  215.     BEQ.B    .exit            ;no - was CLI
  216.  
  217.     JSR    _LVOForbid(A6)        ;make ReplyMsg save
  218.     MOVEA.L    A5,A1            ;get Message into A1
  219.     JSR    _LVOReplyMsg(A6)    ;end program
  220.  
  221. .exit    MOVE.L    A2,D0            ;A2 == 0 --> all ok
  222.     BEQ.B    .end
  223.     MOVEQ    #RETURN_FAIL,D0
  224. .end    RTS    
  225. DOSLIBN    DC.B    'dos.library',0
  226. ASLLIBN    DC.B    'asl.library',0
  227. KICKSTR    DC.B    'kick00000'
  228. KICKEND    DC.B    0
  229.     DC.B    '$VER: '
  230. VERSION    DC.B    'GrabKick 1.21 (07.04.1998) (PD) by SDI'
  231. ********
  232. *    DC.B    ' (RAM Version)'
  233. ********
  234.     DC.B    0
  235.     END
  236.  
  237.