home *** CD-ROM | disk | FTP | other *** search
/ Mikrobitti Virtuaalilehti 1997 / mbvirt1997d.iso / ohjelmat / fastex29.lha / FastExec / FastExec.s < prev    next >
Encoding:
Text File  |  1997-08-24  |  71.2 KB  |  4,370 lines

  1. ;------------------------------------------------------------------------------;
  2. ;------------------------------------------------------------------------------;
  3. ;------------------------------------------------------------------------------;
  4.  
  5. ;$VER: FastExec.s 2.9 (24.8.97)
  6. ;by Torbj÷rn A. Andersson.
  7. ;Public Domain.
  8. ;
  9. ;Assemble with PhxAss (version 4.34), use OPT 3
  10.  
  11. ;------------------------------------------------------------------------------;
  12.  
  13. ;Max number of memory blocks for ADDMEM option
  14. MAXADDMEM=10
  15.  
  16. ;------------------------------------------------------------------------------;
  17.  
  18. _ArpBase        = 0
  19. _DOSBase        = _ArpBase+4
  20. _ExpansionBase        = _DOSBase+4
  21. _UtilityBase        = _ExpansionBase+4
  22. Args            = _UtilityBase+4
  23. ArgArray        = Args+4
  24. ArgSYSINFO        = ArgArray
  25. ArgREMOVE        = ArgSYSINFO+4
  26. ArgREBOOT        = ArgREMOVE+4
  27. ArgNOEXEC        = ArgREBOOT+4
  28. ArgADDRESS        = ArgNOEXEC+4
  29. ArgPATCH        = ArgADDRESS+4
  30. ArgFASTSSP        = ArgPATCH+4
  31. ArgFASTVBR        = ArgFASTSSP+4
  32. ArgFASTEXP        = ArgFASTVBR+4
  33. ArgFASTMEM        = ArgFASTEXP+4
  34. ArgFASTINT        = ArgFASTMEM+4
  35. ArgCACHE        = ArgFASTINT+4
  36. ArgADDMEM        = ArgCACHE+4
  37. Address            = ArgADDMEM+4
  38. CacheBits        = Address+4
  39. AddMemData        = CacheBits+4
  40. ReturnCode        = AddMemData+MAXADDMEM*4*4
  41. my_SIZEOF        = ReturnCode+4
  42.  
  43. ;------------------------------------------------------------------------------;
  44. ;------------------------------------------------------------------------------;
  45. ;------------------------------------------------------------------------------;
  46.  
  47. Start:
  48.     move.l    (4).w,a6
  49.     move.l    a0,a2
  50.     move.l    d0,d2
  51.  
  52.     moveq    #my_SIZEOF/4-1,d1
  53.  
  54. .Clear
  55.     clr.l    -(sp)
  56.     dbf    d1,.Clear
  57.     move.l    sp,a5
  58.  
  59.     lea    dos_library(pc),a1    ; library
  60.     moveq    #0,d0            ; version
  61.     jsr    -$0228(a6)        ; _LVOOpenLibrary
  62.     move.l    d0,_DOSBase(a5)
  63.     lea    expansion_library(pc),a1; library
  64.     moveq    #0,d0            ; version
  65.     jsr    -$0228(a6)        ; _LVOOpenLibrary
  66.     move.l    d0,_ExpansionBase(a5)
  67.  
  68.     cmp    #36,$0014(a6)        ; lib_Version
  69.     bcs    .LibsOk
  70.     lea    utility_library(pc),a1    ; library
  71.     moveq    #0,d0            ; version
  72.     jsr    -$0228(a6)        ; _LVOOpenLibrary
  73.     move.l    d0,_UtilityBase(a5)
  74.  
  75. .LibsOk
  76.     subq.l    #1,d2
  77.     bls    .Ok
  78.     cmp.b    #'?',(a2)
  79.     beq    Usage
  80.  
  81.     bsr    InitArp
  82.     tst.l    d0
  83.     beq    QuitFail
  84.  
  85.     move.l    a2,a0
  86.     move.l    d2,d0
  87.     lea    Template(pc),a1
  88.     move.l    a1,d1            ; template
  89.     lea    ArgArray(a5),a1
  90.     move.l    a1,d2            ; array
  91.     moveq    #0,d3            ; args
  92.     bsr    OSReadArgs
  93.     move.l    d0,Args(a5)
  94.     beq    QuitFail
  95.  
  96.     move.l    ArgCACHE(a5),d0
  97.     beq    .ArgCACHEOk
  98.     move.l    d0,a0
  99.     bsr    XToI
  100.     move.l    d0,CacheBits(a5)
  101.  
  102. .ArgCACHEOk
  103.     move.l    ArgADDRESS(a5),d0
  104.     beq    .ArgADDRESSOk
  105.     move.l    d0,a0
  106.     bsr    XToI
  107.     move.l    d0,Address(a5)
  108.  
  109. .ArgADDRESSOk
  110.     tst.l    ArgREMOVE(a5)
  111.     beq    .ArgREMOVEOk
  112.     bsr    RemoveFE
  113.     bra    Quit
  114.  
  115. .ArgREMOVEOk
  116.     tst.l    ArgSYSINFO(a5)
  117.     beq    .ArgSYSINFOOk
  118.     bsr    SysInfo
  119.     bra    Quit
  120.  
  121. .ArgSYSINFOOk
  122.     movem.l    d2-d7/a2-a4,-(sp)
  123.     lea    AddMemData(a5),a4
  124.     move.l    ArgADDMEM(a5),a3
  125.     moveq    #MAXADDMEM-1,d3
  126.     move.l    a3,d0
  127.     beq    .AddMem2
  128.  
  129. .AddMemLoop2
  130.     move.l    (a3)+,d0
  131.     beq    .AddMem2
  132.     move.l    d0,a0
  133.     bsr    XToI
  134.     move.l    d0,d7            ; base
  135.     beq    .AddMemErr2
  136.     move.l    (a3)+,d0
  137.     beq    .AddMemErr2
  138.     move.l    d0,a0
  139.     bsr    XToI
  140.     move.l    d0,d4            ; size
  141.     beq    .AddMemErr2
  142.     move.l    (a3)+,d0
  143.     beq    .AddMemErr2
  144.     move.l    d0,a0
  145.     bsr    XToIS
  146.     move.l    d0,d5            ; attributes
  147.     beq    .AddMemErr2
  148.     move.l    (a3)+,d0
  149.     beq    .AddMemErr2
  150.     move.l    d0,a0
  151.     bsr    XToIS
  152.     move.l    d0,d6            ; priority
  153.  
  154.     movem.l    d4-d7,(a4)
  155.     lea    16(a4),a4
  156.     dbf    d3,.AddMemLoop2
  157.  
  158. ;haven't specified more than we can handle, right?
  159.     tst.l    (a3)
  160.     beq    .AddMem2
  161.  
  162. .AddMemErr2
  163.     movem.l    (sp)+,d2-d7/a2-a4
  164.     lea    TxtAddMem(pc),a0    ; string
  165.     bra    QuitPutS
  166.  
  167. .AddMem2
  168.     movem.l    (sp)+,d2-d7/a2-a4
  169.  
  170. .Ok
  171.     bsr    AddResident
  172.  
  173. ;FastExec already installed?
  174.     tst.l    d0
  175.     bgt    Quit
  176.  
  177. ;not enough memory?
  178.     lea    TxtAllocMem(pc),a0
  179.     beq    QuitPutS
  180.  
  181. ;FastExec installed
  182. ;if exec.library already is in fast memory, give a warning
  183. ;(except if NOEXEC option is used).
  184.  
  185.     tst.l    ArgNOEXEC(a5)
  186.     bne    Reboot
  187.  
  188.     move.l    a6,a1            ; address
  189.     bsr    MyTypeOfMem
  190.     tst    d0
  191.     bpl    Reboot
  192.  
  193.     lea    TxtExec(pc),a0
  194.     move.l    a0,d1            ; str
  195.     bsr    OSPutStr
  196.     moveq    #10,d0            ; RETURN_ERROR
  197.     bra    QuitCode
  198.  
  199. Reboot
  200.     tst.l    ArgREBOOT(a5)
  201.     beq    Quit
  202.     bra    OSColdReboot
  203.  
  204. QuitPutS
  205. ;    a0=string
  206.  
  207.     move.l    a0,d1            ; str
  208.     bsr    OSPutStr
  209.  
  210. QuitFail
  211.     moveq    #20,d0            ; RETURN_FAIL
  212.  
  213. QuitCode
  214. ;    d0=code
  215.  
  216.     move.l    d0,ReturnCode(a5)
  217.  
  218. Quit:
  219.     move.l    Args(a5),d1        ; args
  220.     bsr    OSFreeArgs
  221.  
  222.     moveq    #(_UtilityBase-_ArpBase)/4,d2
  223.     lea    _ArpBase(a5),a2
  224.  
  225. .CloseLibrary
  226.     move.l    (a2)+,a1        ; library
  227.     bsr    OSCloseLibrary
  228.     dbf    d2,.CloseLibrary
  229.  
  230.     move.l    ReturnCode(a5),d0
  231.     lea    my_SIZEOF(sp),sp
  232.     rts
  233.  
  234. ;------------------------------------------------------------------------------;
  235. ;------------------------------------------------------------------------------;
  236. ;------------------------------------------------------------------------------;
  237.  
  238.     cnop    0,4
  239.  
  240. Resident:
  241.     move.l    Arg2CACHE(pc),d0
  242.     beq    .Cache
  243.     move.l    CacheBits2(pc),d0    ; cacheBits
  244.     or    #$2000,d0        ; CACRF_WriteAllocate
  245.     moveq    #-1,d1            ; cacheMask
  246.     bsr    OSCacheControl
  247.  
  248. .Cache
  249.     bsr    PatchLower
  250. ;    bsr    PatchUpper
  251.  
  252.     jsr    -$0084(a6)        ; _LVOForbid
  253.     moveq    #0,d0            ; cacheBits
  254.     moveq    #-1,d1            ; cacheMask
  255.     bsr    OSCacheControl
  256.     move.l    d0,-(sp)
  257.  
  258. ;patch MakeLibrary() on KS 1.3 to longword align library bases.
  259.  
  260.     cmp    #36,$0014(a6)        ; lib_Version
  261.     bcc    .MakeLibraryOk
  262.     move.l    a6,a1            ; library
  263.     lea    MakeLibrary(pc),a0
  264.     move.l    a0,d0            ; newFunction
  265.     move    #-$0054,a0        ; funcOffset, _LVOMakeLibrary
  266.     jsr    -$01A4(a6)        ; _LVOSetFunction
  267.  
  268. .MakeLibraryOk
  269.     move.l    a6,a1            ; library
  270.     lea    AddMemList(pc),a0
  271.     move.l    a0,d0            ; newFunction
  272.     move    #-$026A,a0        ; funcOffset, _LVOAddMemList
  273.     jsr    -$01A4(a6)        ; _LVOSetFunction
  274.     lea    OldAddMemList(pc),a0
  275.     move.l    d0,(a0)
  276.  
  277.     bsr    OSCacheClearU
  278.     move.l    (sp)+,d0        ; cacheBits
  279.     moveq    #-1,d1            ; cacheMask
  280.     bsr    OSCacheControl
  281.     jsr    -$008A(a6)        ; _LVOPermit
  282.  
  283.     movem.l    d2/a2,-(sp)
  284.     lea    AddMemData2(pc),a2
  285.  
  286. .Mem
  287.     movem.l    (a2)+,d0-d2/a0        ; size/attributes/pri/base
  288.     tst.l    d0
  289.     beq    .MemOk
  290.     lea    FastExecName(pc),a1    ; name
  291.     jsr    -$026A(a6)        ; _LVOAddMemList
  292.     bra    .Mem
  293.  
  294. .MemOk
  295.     movem.l    (sp)+,d2/a2
  296.     rts
  297.  
  298. ;------------------------------------------------------------------------------;
  299.  
  300. AddLibrary:
  301.  
  302. ;first, add library with original function
  303.  
  304.     bsr    .AddLibrary
  305.  
  306. ;try to move expansion.library
  307.  
  308.     bsr    MoveExpansion
  309.     addq.l    #1,d0
  310.     beq    .Rts            ; not available, quit
  311.  
  312. ;expansion.library has been moved (possibly failed to move, but don't retry)
  313. ;restore old function
  314.  
  315.     move.l    a6,a1            ; library
  316.     move    #-$018C,a0        ; funcOffset, _LVOAddLibrary
  317.     move.l    OldAddLibrary(pc),d0    ; newFunction
  318.     jsr    -$01A4(a6)        ; _LVOSetFunction
  319.  
  320. .Rts
  321.     rts
  322.  
  323. .AddLibrary
  324.     move.l    OldAddLibrary(pc),-(sp)
  325.     rts
  326.  
  327. OldAddLibrary
  328.     dc.l    0
  329.  
  330. ;------------------------------------------------------------------------------;
  331.  
  332. AddMemList:
  333.  
  334. ;pretty useless checking
  335.  
  336.     cmp    #$0400,a0
  337.     bcs    .Rts
  338.     cmp.l    #$0028,d0        ; sizeof(MemHeader)+sizeof(MemChunk)
  339.     bcs    .Rts
  340.  
  341. ;if right (but not left) mouse button is held down, don't add any memory.
  342. ;this doesn't work for me when I use the original A1200 mouse...
  343. ;
  344. ;    btst    #6,$BFE001
  345. ;    beq    .LMB
  346. ;    btst    #10,$DFF016
  347. ;    beq    .Rts
  348. ;
  349. ;.LMB
  350.  
  351. ;check if memory has already been added
  352.  
  353.     movem.l    d0-d3/a0/a1,-(sp)
  354.     move.l    a0,d2            ; start of memory to add
  355.     move.l    a0,d3
  356.     add.l    d0,d3            ; end of memory to add
  357.     lea    $0142(a6),a0        ; MemList
  358.     jsr    -$0084(a6)        ; _LVOForbid
  359.  
  360. .Loop
  361.     move.l    (a0),a0
  362.     tst.l    (a0)
  363.     beq    .Add
  364.  
  365.     move.l    a0,d0
  366.     moveq    #$0020,d1        ; sizeof(MemHeader)
  367.     add.l    a0,d1
  368.     bsr    .Check
  369.     tst.l    d0
  370.     bne    .Err
  371.     movem.l    $0014(a0),d0/d1        ; mh_Lower/mh_Upper
  372.     bsr    .Check
  373.     tst.l    d0
  374.     beq    .Loop
  375.  
  376. .Err
  377.     jsr    -$008A(a6)        ; _LVOPermit
  378.     movem.l    (sp)+,d0-d3/a0/a1
  379.  
  380. .Rts
  381.     rts
  382.  
  383. .Check
  384. ;    d0=start
  385. ;    d1=end
  386. ;    d2=start
  387. ;    d3=end
  388. ; out    d0=collision
  389.  
  390.     cmp.l    d0,d2
  391.     bcs    .CheckCS
  392.     cmp.l    d1,d2
  393.     bcs    .CheckErr
  394.  
  395. .CheckOk
  396.     moveq    #0,d0
  397.     rts
  398.  
  399. .CheckCS
  400.     cmp.l    d0,d3
  401.     bls    .CheckOk
  402.  
  403. .CheckErr
  404.     moveq    #1,d0
  405.     rts
  406.  
  407. .Old
  408.     move.l    OldAddMemList(pc),-(sp)
  409.     rts
  410.  
  411. .Add
  412.     movem.l    (sp)+,d0-d3/a0/a1
  413.  
  414. ;see if this is the memory we want exec.library to be in
  415. ;if it isn't, we'll just add it and quit
  416. ;if it is, we'll add it and move things to it
  417. ;assume it has the highest priority at the moment,
  418. ;so we get it when we just ask for fast memory
  419.  
  420.     move.l    d0,-(sp)
  421.     move.l    Arg2ADDRESS(pc),d0
  422.     beq    .AddressOk
  423.     cmp.l    Address2(pc),a0
  424.     beq    .AddressOk
  425.     move.l    (sp)+,d0
  426.     bsr    .Old
  427.     jmp    -$008A(a6)        ; _LVOPermit
  428.  
  429. .AddressOk
  430.     move.l    (sp)+,d0
  431.  
  432. ;save attributes
  433.  
  434.     move.l    d1,-(sp)
  435.  
  436. ;add memory using the original function
  437.  
  438.     bsr    .Old
  439.  
  440. ;I'm no expert on how to handle these caches, but
  441. ;I disassembled 68040.library, and it works this way:
  442. ;Forbid()
  443. ;oldCache=CacheControl(0,-1)
  444. ;patch stuff...
  445. ;CacheControl(oldCache,-1)
  446. ;Permit()
  447.  
  448.     jsr    -$0078(a6)        ; _LVODisable
  449.     moveq    #0,d0            ; cacheBits
  450.     moveq    #-1,d1            ; cacheMask
  451.     bsr    OSCacheControl
  452.     move.l    d0,-(sp)
  453.  
  454.     move.l    Arg2FASTMEM(pc),d0
  455.     beq    .Chip
  456.     bsr    MoveChipHeader
  457.  
  458. .Chip
  459.     move.l    Arg2NOEXEC(pc),d0
  460.     bne    .Exec
  461.     bsr    MoveExec
  462.  
  463. .Exec
  464.     move.l    Arg2FASTEXP(pc),d0
  465.     beq    .Exp
  466.     bsr    MoveExpansion
  467.     addq.l    #1,d0
  468.     bne    .Exp
  469.  
  470. ;expansion.library hasn't been added yet
  471. ;patch AddLibrary() to do the job
  472.  
  473.     move.l    a6,a1            ; library
  474.     lea    AddLibrary(pc),a0
  475.     move.l    a0,d0            ; newFunction
  476.     move    #-$018C,a0        ; funcOffset, _LVOAddLibrary
  477.     jsr    -$01A4(a6)        ; _LVOSetFunction
  478.     lea    OldAddLibrary(pc),a0
  479.     move.l    d0,(a0)
  480.  
  481. .Exp
  482.     move.l    Arg2FASTSSP(pc),d0
  483.     beq    .SSP
  484.     bsr    MoveSSP
  485.  
  486. .SSP
  487.     move.l    Arg2FASTVBR(pc),d0
  488.     beq    .VBR
  489.     bsr    MoveVBR
  490.  
  491. .VBR
  492.     move.l    Arg2FASTINT(pc),d0
  493.     beq    .Int
  494.     bsr    MoveIntrMem
  495.  
  496. .Int
  497.     move.l    Arg2PATCH(pc),d0
  498.     beq    .Patch
  499.     bsr    PatchInterrupts
  500.  
  501. .Patch
  502.     bsr    OSCacheClearU
  503.     move.l    (sp)+,d0        ; cacheBits
  504.     moveq    #-1,d1            ; cacheMask
  505.     bsr    OSCacheControl
  506.     jsr    -$007E(a6)        ; _LVOEnable
  507.  
  508.     move.l    (sp)+,d1
  509. ;    and    #4,d1            ; MEMF_FAST
  510. ;    beq    .Quit
  511. ;
  512. ;fast memory has been added, replace our patch with the original AddMemList()
  513. ;
  514. ;    move.l    a6,a1            ; library
  515. ;    move    #-$026A,a0        ; funcOffset, _LVOAddMemList
  516. ;    move.l    OldAddMemList(pc),d0    ; newFunction
  517. ;    jsr    -$01A4(a6)        ; _LVOSetFunction
  518. ;
  519. ;.Quit
  520.     jmp    -$008A(a6)        ; _LVOPermit
  521.  
  522. ;------------------------------------------------------------------------------;
  523.  
  524. MakeLibrary:
  525.     movem.l    d2-d7/a2/a3,-(sp)
  526.     move.l    d0,d3
  527.     move.l    a0,d4
  528.     move.l    a1,d5
  529.     move.l    a2,d6
  530.     move.l    d1,d7
  531.  
  532.     move.l    a0,d2
  533.     beq    .NegOk
  534.  
  535.     move.l    a0,a3
  536.     moveq    #-1,d2
  537.     moveq    #-1,d1
  538.     cmp    (a3),d1
  539.     bne    .Abs
  540.     addq.l    #2,a3
  541.  
  542. .Rel
  543.     cmp    (a3)+,d1
  544.     dbeq    d2,.Rel
  545.     bra    .Neg
  546.  
  547. .Abs
  548.     cmp.l    (a3)+,d1
  549.     dbeq    d2,.Abs
  550.  
  551. .Neg
  552.     not    d2
  553.     mulu    #6,d2
  554.     addq.l    #3,d2
  555.     and    #-4,d2
  556.  
  557. .NegOk
  558.     move.l    d2,d0
  559.     add.l    d3,d0            ; byteSize
  560.     move.l    #$00010001,d1        ; requirements, MEMF_PUBLIC!MEMF_CLEAR
  561.     jsr    -$00C6(a6)        ; _LVOAllocMem
  562.     tst.l    d0
  563.     beq    .End
  564.  
  565.     add.l    d2,d0
  566.     move.l    d0,a3
  567.     movem    d2/d3,$0010(a3)        ; lib_NegSize/lib_PosSize
  568.  
  569.     move.l    a3,a0            ; target
  570.     sub.l    a2,a2            ; funcDispBase
  571.     move.l    d4,a1            ; funcArray
  572.  
  573.     cmp    #-1,(a1)
  574.     bne    .Make
  575.     addq.l    #2,a1
  576.     move.l    d4,a2
  577.  
  578. .Make
  579.     jsr    -$005A(a6)        ; _LVOMakeFunctions
  580.  
  581.     tst.l    d5
  582.     beq    .Str
  583.     move.l    a3,a2            ; memory
  584.     move.l    d5,a1            ; initTable
  585.     moveq    #0,d0            ; size
  586.     jsr    -$004E(a6)        ; _LVOInitStruct
  587.  
  588. .Str
  589.     move.l    a3,d0            ; libAddr
  590.     tst.l    d6
  591.     beq    .End
  592.     move.l    d6,a1            ; segList
  593.     move.l    d7,a0
  594.     jsr    (a1)
  595.  
  596. .End
  597.     movem.l    (sp)+,d2-d7/a2/a3
  598.     rts
  599.  
  600. ;------------------------------------------------------------------------------;
  601.  
  602. MoveChipHeader:
  603.     movem.l    a2/a3,-(sp)
  604.     jsr    -$0084(a6)        ; _LVOForbid
  605.  
  606. .Loop0
  607.     lea    $0142(a6),a2        ; MemList
  608.  
  609. .Loop1
  610.     move.l    (a2),a2
  611.     tst.l    (a2)
  612.     beq    .Quit
  613.  
  614.     move.l    a2,a1            ; address
  615.     bsr    MyTypeOfMem
  616.     tst    d0
  617.     bmi    .Loop1
  618.  
  619.     moveq    #$0020,d0        ; byteSize, sizeof(MemHeader)
  620.     moveq    #5,d1            ; requirements, MEMF_PUBLIC!MEMF_FAST
  621.     jsr    -$00C6(a6)        ; _LVOAllocMem
  622.     tst.l    d0
  623.     beq    .Quit
  624.     move.l    d0,a3
  625.  
  626.     lea    $0008(a2),a0        ; source, mh_Attributes
  627.     lea    $0008(a3),a1        ; dest, mh_Attributes
  628.     moveq    #$0018,d0        ; size, sizeof(MemHeader)-ln_Type
  629.     jsr    -$0270(a6)        ; _LVOCopyMem
  630.  
  631.     lea    $0020(a2),a0        ; sizeof(MemHeader)
  632.     cmp.l    $0014(a2),a0        ; mh_Lower
  633.     bne    .Ok
  634.     move.l    a2,$0014(a3)        ; mh_Lower
  635.  
  636. .Ok
  637.     move.l    a2,a1            ; node
  638.     jsr    -$00FC(a6)        ; _LVORemove
  639.     lea    $0142(a6),a0        ; list, MemList
  640.     move.l    a3,a1            ; node
  641.     jsr    -$010E(a6)        ; _LVOEnqueue
  642.  
  643.     cmp    #36,$0014(a6)        ; lib_Version
  644.     bcs    .Loop0
  645.  
  646.     move.l    a2,a1            ; memoryBlock
  647.     moveq    #$0020,d0        ; byteSize, sizeof(MemHeader)
  648.     bsr    FreeMemSafely
  649.     bra    .Loop0
  650.  
  651. .Quit
  652.     jsr    -$008A(a6)        ; _LVOPermit
  653.     movem.l    (sp)+,a2/a3
  654.     rts
  655.  
  656. ;------------------------------------------------------------------------------;
  657.  
  658. MoveExec:
  659.     movem.l    d2-d7/a2-a5,-(sp)
  660.     move.l    a6,a2
  661.  
  662.     move.l    a6,a1            ; address
  663.     bsr    MyTypeOfMem
  664.     tst    d0
  665.     bmi    .End
  666.  
  667.     moveq    #0,d2
  668.     moveq    #0,d3
  669.     movem    $0010(a6),d2/d3        ; lib_NegSize/lib_PosSize
  670.     addq.l    #3,d2
  671.     and    #-4,d2
  672.  
  673.     move.l    d2,d0
  674.     add.l    d3,d0            ; byteSize
  675.     move.l    #$00010005,d1        ; MEMF_PUBLIC!MEMF_FAST!MEMF_CLEAR
  676.     jsr    -$00C6(a6)        ; _LVOAllocMem
  677.     tst.l    d0
  678.     beq    .End
  679.     move.l    d0,a3
  680.  
  681.     move.l    a6,a1            ; node
  682.     jsr    -$00FC(a6)        ; _LVORemove
  683.  
  684.     move.l    a6,a0            ; source
  685.     move.l    a3,a1            ; dest
  686.     move.l    d2,d0            ; size
  687.     sub.l    d0,a0
  688.     add.l    d3,d0
  689.     jsr    -$0270(a6)        ; _LVOCopyMem
  690.     bsr    OSCacheClearU
  691.  
  692.     add.l    d2,a3
  693.     move    d2,$0010(a3)        ; lib_NegSize
  694.  
  695.     move.l    a3,a6
  696.     bsr    InitChkBase
  697.     bsr    InitChkSum
  698.  
  699.     lea    .ListTable(pc),a4
  700.  
  701. .ListLoop
  702.     move    (a4)+,d0
  703.     beq    .ListOk
  704.     bsr    InitList
  705.     bra    .ListLoop
  706.  
  707. .ListTable
  708.     dc.w    $0142            ; MemList
  709.     dc.w    $0150            ; ResourceList
  710.     dc.w    $015E            ; DeviceList
  711.     dc.w    $016C            ; IntrList
  712.     dc.w    $017A            ; LibList
  713.     dc.w    $0188            ; PortList
  714.     dc.w    $0196            ; TaskReady
  715.     dc.w    $01A4            ; TaskWait
  716.     dc.w    $01B2            ; SoftInts
  717.     dc.w    $01C2
  718.     dc.w    $01D2
  719.     dc.w    $01E2
  720.     dc.w    $01F2
  721.     dc.w    $0214            ; SemaphoreList
  722.     dc.w    0
  723.  
  724. .ListOk
  725.     cmp    #39,$0014(a6)        ; lib_Version
  726.     bcs    .List39
  727.     move    #$0268,d0        ; ex_MemHandlers
  728.     bsr    InitList
  729.  
  730. .List39
  731.  
  732. ;Replace _ExecBase-pointers on stack
  733.  
  734.     move.l    sp,a0
  735.     moveq    #127,d1
  736.  
  737. .Repl
  738.     addq.l    #2,a0
  739.     cmp.l    (a0),a2
  740.     dbeq    d1,.Repl
  741.     bne    .ReplOk
  742.     move.l    a6,(a0)
  743.     bra    .Repl
  744.  
  745. .ReplOk
  746.     bsr    .Exp
  747.  
  748.     move.l    a6,(4).w
  749.     move.l    a6,a1            ; library
  750.     or.b    #2,$000E(a1)        ; lib_Flags, LIBF_CHANGED
  751.     jsr    -$018C(a6)        ; _LVOAddLibrary
  752.  
  753.     move.l    a2,a1            ; memoryBlock
  754.     moveq    #0,d0            ; byteSize
  755.     move    $0010(a2),d0        ; lib_NegSize
  756.     sub.l    d0,a1
  757.     add    $0012(a2),d0        ; lib_PosSize
  758.  
  759.     cmp    #36,$0014(a6)        ; lib_Version
  760.     bcc    .Free
  761.     move.b    FlagEBExec(pc),d1
  762.     bne    .End
  763.     and    #-8,d0
  764.  
  765. .Free
  766.     bsr    FreeMemSafely
  767.  
  768. .End
  769.     movem.l    (sp)+,d2-d7/a2-a5
  770.     rts
  771.  
  772. ;Update eb_ExecBase
  773.  
  774. .Exp
  775.  
  776. ;expansion.library V36+ doesn't cache _SysBase
  777.  
  778.     cmp    #36,$0014(a6)        ; lib_Version
  779.     bcc    .ExpOk
  780.  
  781.     lea    expansion_library(pc),a1; libName
  782.     jsr    -$0198(a6)        ; _LVOOldOpenLibrary
  783.     tst.l    d0
  784.     beq    .ExpStack
  785.     move.l    d0,a1            ; library
  786.     move.l    a6,$0024(a1)        ; eb_ExecBase
  787.     jmp    -$019E(a6)        ; _LVOCloseLibrary
  788.  
  789. .ExpStack
  790.  
  791. ;expansion.library has not been added to library list
  792. ;get it from the stack, offset should be:
  793. ; 4 expansion jumps to addmemlist
  794. ; 4 addmemlist saves attributes
  795. ; 4 addmemlist saves cachebits
  796. ; 4 addmemlist jumps to MoveExec()
  797. ;40 MoveExec saves d2-d7/a2-a5
  798. ; 4 MoveExec jumps to .Exp()
  799. ;--
  800. ;60
  801.  
  802.     moveq    #$0024,d0        ; eb_ExecBase
  803.     add.l    60(sp),d0
  804.     btst    #0,d0
  805.     bne    .ExpErr
  806.     move.l    d0,a1            ; address
  807.     move.l    a1,-(sp)
  808.     jsr    -$0216(a6)        ; _LVOTypeOfMem
  809.     move.l    (sp)+,a1
  810.     tst.l    d0
  811.     beq    .ExpErr
  812.  
  813.     cmp.l    (a1),a2
  814.     bne    .ExpErr
  815.     move.l    a6,(a1)
  816.  
  817. .ExpOk
  818.     rts
  819.  
  820. .ExpErr
  821.     lea    FlagEBExec(pc),a0
  822.     st    (a0)
  823.     rts
  824.  
  825. ;------------------------------------------------------------------------------;
  826.  
  827. MoveExpansion:
  828. ; out    d0=-1:expansion.library not found
  829. ;        0:couldn't move library
  830. ;        1:everything fine
  831.  
  832. ;a2=old base
  833. ;a3=new base
  834.  
  835.     movem.l    d2/d3/a2-a4,-(sp)
  836.     jsr    -$0084(a6)        ; _LVOForbid
  837.  
  838.     lea    $017A(a6),a0        ; list, LibList
  839.     lea    expansion_library(pc),a1; name
  840.     jsr    -$0114(a6)        ; _LVOFindName
  841.     tst.l    d0
  842.     beq    .ErrLib
  843.     move.l    d0,a2
  844.  
  845.     move.l    a2,a1            ; address
  846.     bsr    MyTypeOfMem
  847.     tst    d0
  848.     bmi    .Err
  849.  
  850.     moveq    #0,d2
  851.     moveq    #0,d3
  852.     movem    $0010(a2),d2/d3        ; lib_NegSize/lib_PosSize
  853.     addq.l    #3,d2
  854.     and    #-4,d2
  855.  
  856.     move.l    d2,d0
  857.     add.l    d3,d0            ; byteSize
  858.     move.l    #$00010005,d1        ; MEMF_PUBLIC!MEMF_FAST!MEMF_CLEAR
  859.     jsr    -$00C6(a6)        ; _LVOAllocMem
  860.     tst.l    d0
  861.     beq    .Err
  862.     move.l    d0,a3
  863.  
  864.     move.l    a2,a1            ; node
  865.     jsr    -$00FC(a6)        ; _LVORemove
  866.  
  867.     move.l    a2,a0            ; source
  868.     move.l    a3,a1            ; dest
  869.     move.l    d2,d0            ; size
  870.     sub.l    d0,a0
  871.     add.l    d3,d0
  872.     jsr    -$0270(a6)        ; _LVOCopyMem
  873.     bsr    OSCacheClearU
  874.  
  875.     add.l    d2,a3
  876.     move    d2,$0010(a3)        ; lib_NegSize
  877.  
  878.     bsr    .Fix
  879.  
  880.     move.l    a3,a1            ; library
  881.     or.b    #2,$000E(a1)        ; lib_Flags, LIBF_CHANGED
  882.     jsr    -$018C(a6)        ; _LVOAddLibrary
  883.  
  884.     move.l    a2,a1            ; memoryBlock
  885.     moveq    #0,d0            ; byteSize
  886.     move    $0010(a2),d0        ; lib_NegSize
  887.     sub.l    d0,a1
  888.     add    $0012(a2),d0        ; lib_PosSize
  889.     bsr    FreeMemSafely
  890.  
  891.     move.l    a3,d0
  892.  
  893. .Quit
  894.     jsr    -$008A(a6)        ; _LVOPermit
  895.     movem.l    (sp)+,d2/d3/a2-a4
  896.     rts
  897.  
  898. .Err
  899.     moveq    #0,d0
  900.     bra    .Quit
  901.  
  902. .ErrLib
  903.     moveq    #-1,d0
  904.     bra    .Quit
  905.  
  906. .Fix
  907.     moveq    #$003C,d0        ; eb_ConfigDevList
  908.     bsr    InitList
  909.     moveq    #$004A,d0        ; eb_MountList
  910.     bsr    InitList
  911.     move    #$0168,d0        ; eb_BindSemaphore+ss_WaitQueue
  912.     bsr    InitList
  913.  
  914. ;just in case MoveExec() couldn't update eb_ExecBase
  915.  
  916.     cmp    #36,$0014(a6)        ; lib_Version
  917.     bcc    .Rts
  918.     move.l    a6,$0024(a3)        ; eb_ExecBase
  919.  
  920. .Rts
  921.     rts
  922.  
  923. ;------------------------------------------------------------------------------;
  924.  
  925. MoveIntrMem:
  926.     movem.l    d4/a2-a4,-(sp)
  927.     move.l    3*12+$0054(a6),a4
  928.     moveq    #$50,d4
  929.     cmp    #36,$0014(a6)        ; lib_Version
  930.     bcc    .SizeOk
  931.     moveq    #$6E,d4
  932.  
  933. .SizeOk
  934.     move.l    a4,a1            ; address
  935.     bsr    MyTypeOfMem
  936.     tst    d0
  937.     bmi    .End
  938.  
  939.     move.l    d4,d0            ; byteSize
  940.     move.l    #$00010005,d1        ; requirements, MEMF_PUBLIC!MEMF_FAST!MEMF_CLEAR
  941.     jsr    -$00C6(a6)        ; _LVOAllocMem
  942.     tst.l    d0
  943.     beq    .End
  944.  
  945.     move.l    d0,a2
  946.     lea    .Table(pc),a3
  947.     jsr    -$0078(a6)        ; _LVODisable
  948.  
  949. .Loop
  950.     move    (a3)+,d0
  951.     beq    .Quit
  952.     mulu    #12,d0
  953.     move.l    $54(a6,d0.l),a0
  954.     move.l    a2,a1
  955.     move.l    a2,$54(a6,d0.l)
  956.     lea    $000E(a2),a2
  957.     move    $000E(a0),(a2)+
  958.  
  959.     cmp    #36,$0014(a6)        ; lib_Version
  960.     bcc    .Copy
  961.     move    $0010(a0),(a2)+
  962.     move.l    $0012(a0),(a2)+
  963.  
  964. .Copy
  965.     bsr    CopyList
  966.     bra    .Loop
  967.  
  968. .Quit
  969.     jsr    -$007E(a6)        ; _LVOEnable
  970.  
  971.     move.l    a4,a1            ; memoryBlock
  972.     move.l    d4,d0            ; byteSize
  973.     bsr    FreeMemSafely
  974.  
  975. .End
  976.     movem.l    (sp)+,d4/a2-a4
  977.     rts
  978.  
  979. .Table
  980.     dc.w    3,5,4,13,15,0
  981.  
  982. ;------------------------------------------------------------------------------;
  983.  
  984. MoveSSP:
  985.     movem.l    d2/a2,-(sp)
  986.     jsr    -$0084(a6)        ; _LVOForbid
  987.     move.l    $003A(a6),a2        ; SysStkLower
  988.     move.l    $0036(a6),d2        ; SysStkUpper
  989.     sub.l    a2,d2
  990.  
  991.     move.l    a2,a1            ; address
  992.     bsr    MyTypeOfMem
  993.     tst    d0
  994.     bmi    .Err
  995.  
  996.     move.l    d2,d0            ; byteSize
  997.     moveq    #5,d1            ; requirements, MEMF_PUBLIC!MEMF_CLEAR
  998.     jsr    -$00C6(a6)        ; _LVOAllocMem
  999.     tst.l    d0
  1000.     beq    .Err
  1001.  
  1002.     bsr    SetSSP
  1003.     jsr    -$008A(a6)        ; _LVOPermit
  1004.  
  1005. ;Leave this memory, since it is at the top of MEMF_KICK memory.
  1006. ;Things that want to survive a reboot allocate memory with the
  1007. ;flags MEMF_KICK!MEMF_REVERSE. We don't want them to get a piece
  1008. ;of this old supervisor stack memory, because it is always more
  1009. ;or less overwritten when the machine boots.
  1010.  
  1011. ;    move.l    a2,a1            ; memoryBlock
  1012. ;    move.l    d2,d0            ; byteSize
  1013. ;    bsr    FreeMemSafely
  1014.  
  1015. .End
  1016.     movem.l    (sp)+,d2/a2
  1017.     rts
  1018.  
  1019. .Err
  1020.     jsr    -$008A(a6)        ; _LVOPermit
  1021.     bra    .End
  1022.  
  1023. ;------------------------------------------------------------------------------;
  1024.  
  1025. MoveVBR:
  1026.     move.l    a2,-(sp)
  1027.     btst    #0,$0129(a6)        ; AttnFlags+1, AFB_68010
  1028.     beq    .End
  1029.  
  1030.     moveq    #1,d0            ; byteSize
  1031.     ror    #6,d0            ; 1024
  1032.     moveq    #5,d1            ; requirements, MEMF_PUBLIC!MEMF_FAST
  1033.     jsr    -$00C6(a6)        ; _LVOAllocMem
  1034.     tst.l    d0
  1035.     beq    .End
  1036.     move.l    d0,a2
  1037.  
  1038.     jsr    -$0084(a6)        ; _LVOForbid
  1039.     bsr    GetVBR
  1040.     move.l    d0,a1            ; address
  1041.     move.l    a1,-(sp)
  1042.     bsr    MyTypeOfMem
  1043.     move.l    (sp)+,a1
  1044.     tst    d0
  1045.     bmi    .Err
  1046.  
  1047.     move.l    a2,a0
  1048.     move    #255,d0
  1049.  
  1050. .Loop
  1051.     move.l    (a1)+,(a0)+
  1052.     dbf    d0,.Loop
  1053.  
  1054.     move.l    a2,d0
  1055.     bsr    SetVBR
  1056.     jsr    -$008A(a6)        ; _LVOPermit
  1057.  
  1058. .End
  1059.     move.l    (sp)+,a2
  1060.     rts
  1061.  
  1062. .Err
  1063.     jsr    -$008A(a6)        ; _LVOPermit
  1064.     moveq    #1,d0            ; byteSize
  1065.     ror    #6,d0            ; 1024
  1066.     move.l    a2,a1            ; memoryBlock
  1067.     jsr    -$00D2(a6)        ; _LVOFreeMem
  1068.     bra    .End
  1069.  
  1070. ;------------------------------------------------------------------------------;
  1071.  
  1072. ;modify all
  1073. ;    lea    $4AFC4AFC,a6
  1074. ;to load SysBase instead of zero.
  1075. ;
  1076. ;use $4AFC4AFC and not 0 so assembler won't change to sub.l a6,a6
  1077.  
  1078. PatchA6:
  1079. ;    a0=buff
  1080. ;    d0=size
  1081.  
  1082.     move.l    a0,a1
  1083.     add.l    d0,a1
  1084.  
  1085. .Loop
  1086.     cmp.l    a1,a0
  1087.     bcc    .Rts
  1088.     cmp    #$4DF9,(a0)+        ; lea x,a6
  1089.     bne    .Loop
  1090.     cmp.l    #$4AFC4AFC,(a0)
  1091.     bne    .Loop
  1092.     move.l    a6,(a0)+
  1093.     bra    .Loop
  1094.  
  1095. .Rts
  1096.     rts
  1097.  
  1098. ;------------------------------------------------------------------------------;
  1099.  
  1100. PatchInterrupts:
  1101.     move.l    a2,-(sp)
  1102.  
  1103.     move.l    #.EndLabel-.Int1,d0    ; byteSize
  1104.     moveq    #5,d1            ; requirements, MEMF_PUBLIC!MEMF_FAST
  1105.     jsr    -$00C6(a6)        ; _LVOAllocMem
  1106.     tst.l    d0
  1107.     beq    .End
  1108.     move.l    d0,a2
  1109.  
  1110.     lea    .Int1(pc),a0        ; source
  1111.     move.l    d0,a1            ; dest
  1112.     move.l    #.EndLabel-.Int1,d0    ; size
  1113.     jsr    -$0276(a6)        ; _LVOCopyMemQuick
  1114.  
  1115.     bsr    .Fix
  1116.  
  1117.     move.l    a2,a0            ; buffer
  1118.     move.l    #.EndLabel-.Int1,d0    ; size
  1119.     bsr    PatchA6
  1120.  
  1121.     bsr    OSCacheClearU
  1122.     jsr    -$0084(a6)        ; _LVOForbid
  1123.     bsr    GetVBR
  1124.     move.l    d0,a1
  1125.  
  1126.     move.l    a2,$64(a1)
  1127.     lea    .Int2-.Int1(a2),a0
  1128.     move.l    a0,$68(a1)
  1129.     lea    .Int3-.Int1(a2),a0
  1130.     move.l    a0,$6C(a1)
  1131.     lea    .Int4-.Int1(a2),a0
  1132.     move.l    a0,$70(a1)
  1133.     lea    .Int5-.Int1(a2),a0
  1134.     move.l    a0,$74(a1)
  1135.     lea    .Int6-.Int1(a2),a0
  1136.     move.l    a0,$78(a1)
  1137.  
  1138.     bsr    OSCacheClearU
  1139.     jsr    -$008A(a6)        ; _LVOPermit
  1140.  
  1141. .End
  1142.     move.l    (sp)+,a2
  1143.     rts
  1144.  
  1145. .Fix
  1146.     cmp    #36,$0014(a6)        ; lib_Version
  1147.     bcc    .FixRts
  1148.  
  1149. ;kickstart V33/V34 doesn't save a6 on stack for ExitIntr()
  1150. ;overwrite it with the two instructions that follows
  1151. ;put a nop-instruction in the space left over
  1152.  
  1153.     move.l    a2,a0
  1154.     lea    .Int4-.Int1(a2),a1
  1155.  
  1156. .FixLoop
  1157.     cmp.l    a1,a0
  1158.     bcc    .FixNext
  1159.     cmp    #$2F0E,(a0)+        ; move.l a6,-(sp)
  1160.     bne    .FixLoop
  1161.     move.l    (a0),-2(a0)
  1162.     move    4(a0),2(a0)
  1163.     move    #$4E71,4(a0)        ; nop
  1164.     bra    .FixLoop
  1165.  
  1166. .FixNext
  1167.     lea    .Next4-.Int1(a2),a0
  1168.     cmp.l    a1,a0
  1169.     lea    .EndLabel-.Int1(a2),a1
  1170.     bcc    .FixLoop
  1171.  
  1172. .FixRts
  1173.     rts
  1174.  
  1175. ;basic changes from kickstart 39.106:
  1176. ;
  1177. ;1. SysBase is coded in lea-instructions
  1178. ;   - much faster than reading from location $4
  1179. ;2. changed order in "and $001E(a0),d1/move.l (4).w,a6"
  1180. ;   - second read from chip seems faster when done later
  1181. ;3. changed one "btst #7,d1/beq" to "tst.b d1/bpl"
  1182. ;   - shorter, faster
  1183. ;4. changed "add #12,sp" to "lea 12(sp),sp"
  1184. ;   - faster
  1185.  
  1186.     cnop    0,4
  1187.  
  1188. .Int1:
  1189.     movem.l    d0/d1/a0/a1/a5/a6,-(sp)
  1190.     lea    $DFF000,a0
  1191.     move    $001C(a0),d1
  1192.     btst    #14,d1
  1193.     beq    .Done1
  1194.     lea    $4AFC4AFC,a6
  1195.     and    $001E(a0),d1
  1196.  
  1197.     btst    #0,d1
  1198.     beq    .Next1a
  1199.     movem.l    $0054(a6),a1/a5
  1200.     move.l    a6,-(sp)
  1201.     pea    -$0024(a6)        ; _LVOExitIntr
  1202.     jmp    (a5)
  1203.  
  1204.     cnop    0,4
  1205.  
  1206. .Next1a
  1207.     btst    #1,d1
  1208.     beq    .Next1b
  1209.     movem.l    $0060(a6),a1/a5
  1210.     move.l    a6,-(sp)
  1211.     pea    -$0024(a6)        ; _LVOExitIntr
  1212.     jmp    (a5)
  1213.  
  1214.     cnop    0,4
  1215.  
  1216. .Next1b
  1217.     btst    #2,d1
  1218.     beq    .Quit1
  1219.     movem.l    $006C(a6),a1/a5
  1220.     move.l    a6,-(sp)
  1221.     pea    -$0024(a6)        ; _LVOExitIntr
  1222.     jmp    (a5)
  1223.  
  1224.     cnop    0,4
  1225.  
  1226. .Done1
  1227.     movem.l    (sp)+,d0/d1/a0
  1228.     lea    12(sp),sp
  1229.     rte
  1230.  
  1231.     cnop    0,4
  1232.  
  1233. .Quit1
  1234.     movem.l    (sp)+,d0/d1/a0/a1/a5/a6
  1235.     rte
  1236.  
  1237.     cnop    0,4
  1238.  
  1239. .Int2:
  1240.     movem.l    d0/d1/a0/a1/a5/a6,-(sp)
  1241.     lea    $DFF000,a0
  1242.     move    $001C(a0),d1
  1243.     btst    #14,d1
  1244.     beq    .Done1
  1245.     lea    $4AFC4AFC,a6
  1246.     and    $001E(a0),d1
  1247.  
  1248.     btst    #3,d1
  1249.     beq    .Quit1
  1250.     movem.l    $0078(a6),a1/a5
  1251.     move.l    a6,-(sp)
  1252.     pea    -$0024(a6)        ; _LVOExitIntr
  1253.     jmp    (a5)
  1254.  
  1255. .Int3:
  1256.     movem.l    d0/d1/a0/a1/a5/a6,-(sp)
  1257.     lea    $DFF000,a0
  1258.     move    $001C(a0),d1
  1259.     btst    #14,d1
  1260.     beq    .Done3
  1261.     lea    $4AFC4AFC,a6
  1262.     and    $001E(a0),d1
  1263.  
  1264.     btst    #6,d1
  1265.     beq    .Next3a
  1266.     movem.l    $009C(a6),a1/a5
  1267.     move.l    a6,-(sp)
  1268.     pea    -$0024(a6)        ; _LVOExitIntr
  1269.     jmp    (a5)
  1270.  
  1271.     cnop    0,4
  1272.  
  1273. .Next3a
  1274.     btst    #5,d1
  1275.     beq    .Next3b
  1276.     movem.l    $0090(a6),a1/a5
  1277.     move.l    a6,-(sp)
  1278.     pea    -$0024(a6)        ; _LVOExitIntr
  1279.     jmp    (a5)
  1280.  
  1281.     cnop    0,4
  1282.  
  1283. .Next3b
  1284.     btst    #4,d1
  1285.     beq    .Quit3
  1286.     movem.l    $0084(a6),a1/a5
  1287.     move.l    a6,-(sp)
  1288.     pea    -$0024(a6)        ; _LVOExitIntr
  1289.     jmp    (a5)
  1290.  
  1291.     cnop    0,4
  1292.  
  1293. .Quit3
  1294.     movem.l    (sp)+,d0/d1/a0/a1/a5/a6
  1295.     rte
  1296.  
  1297.     cnop    0,4
  1298.  
  1299. .Done3
  1300.     movem.l    (sp)+,d0/d1/a0
  1301.     lea    12(sp),sp
  1302.     rte
  1303.  
  1304.     cnop    0,4
  1305.  
  1306. .Int4:
  1307.     movem.l    d0/d1/a0/a1/a5/a6,-(sp)
  1308.     lea    $DFF000,a0
  1309.     move    $001C(a0),d1
  1310.     btst    #14,d1
  1311.     beq    .Done3
  1312.     lea    $4AFC4AFC,a6
  1313.     and    $001E(a0),d1
  1314.  
  1315. .Loop4
  1316.     btst    #8,d1
  1317.     beq    .Next4a
  1318.     movem.l    $00B4(a6),a1/a5
  1319.     move.l    a6,-(sp)
  1320.     pea    .Next4(pc)
  1321.     jmp    (a5)
  1322.  
  1323.     cnop    0,4
  1324.  
  1325. .Next4a
  1326.     btst    #10,d1
  1327.     beq    .Next4b
  1328.     movem.l    $00CC(a6),a1/a5
  1329.     move.l    a6,-(sp)
  1330.     pea    .Next4(pc)
  1331.     jmp    (a5)
  1332.  
  1333.     cnop    0,4
  1334.  
  1335. .Next4b
  1336.     tst.b    d1
  1337.     bpl    .Next4c
  1338.     movem.l    $00A8(a6),a1/a5
  1339.     move.l    a6,-(sp)
  1340.     pea    .Next4(pc)
  1341.     jmp    (a5)
  1342.  
  1343.     cnop    0,4
  1344.  
  1345. .Next4c
  1346.     btst    #9,d1
  1347.     beq    .Quit3
  1348.     movem.l    $00C0(a6),a1/a5
  1349.     move.l    a6,-(sp)
  1350.     pea    .Next4(pc)
  1351.     jmp    (a5)
  1352.  
  1353.     cnop    0,4
  1354.  
  1355. .Next4
  1356.     move.l    (sp)+,a6
  1357.     lea    $DFF000,a0
  1358.     move    #$0780,d1
  1359.     and    $001C(a0),d1
  1360.     and    $001E(a0),d1
  1361.     bne    .Loop4
  1362.     move.l    a6,-(sp)
  1363.     jmp    -$0024(a6)        ; _LVOExitIntr
  1364.     nop
  1365.  
  1366.     cnop    0,4
  1367.  
  1368. .Int5:
  1369.     movem.l    d0/d1/a0/a1/a5/a6,-(sp)
  1370.     lea    $DFF000,a0
  1371.     move    $001C(a0),d1
  1372.     btst    #14,d1
  1373.     beq    .Done5
  1374.     lea    $4AFC4AFC,a6
  1375.     and    $001E(a0),d1
  1376.  
  1377.     btst    #12,d1
  1378.     beq    .Next5a
  1379.     movem.l    $00E4(a6),a1/a5
  1380.     move.l    a6,-(sp)
  1381.     pea    -$0024(a6)        ; _LVOExitIntr
  1382.     jmp    (a5)
  1383.  
  1384.     cnop    0,4
  1385.  
  1386. .Next5a
  1387.     btst    #11,d1
  1388.     beq    .Quit5
  1389.     movem.l    $00D8(a6),a1/a5
  1390.     move.l    a6,-(sp)
  1391.     pea    -$0024(a6)        ; _LVOExitIntr
  1392.     jmp    (a5)
  1393.  
  1394.     cnop    0,4
  1395.  
  1396. .Quit5
  1397.     movem.l    (sp)+,d0/d1/a0/a1/a5/a6
  1398.     rte
  1399.  
  1400.     cnop    0,4
  1401.  
  1402. .Done5
  1403.     movem.l    (sp)+,d0/d1/a0
  1404.     lea    12(sp),sp
  1405.     rte
  1406.  
  1407.     cnop    0,4
  1408.  
  1409. .Int6:
  1410.     movem.l    d0/d1/a0/a1/a5/a6,-(sp)
  1411.     lea    $DFF000,a0
  1412.     move    $001C(a0),d1
  1413.     btst    #14,d1
  1414.     beq    .Done5
  1415.     lea    $4AFC4AFC,a6
  1416.     and    $001E(a0),d1
  1417.  
  1418.     btst    #14,d1
  1419.     beq    .Next6a
  1420.     movem.l    $00FC(a6),a1/a5
  1421.     move.l    a6,-(sp)
  1422.     pea    -$0024(a6)        ; _LVOExitIntr
  1423.     jmp    (a5)
  1424.  
  1425.     cnop    0,4
  1426.  
  1427. .Next6a
  1428.     btst    #13,d1
  1429.     beq    .Quit5
  1430.     movem.l    $00F0(a6),a1/a5
  1431.     move.l    a6,-(sp)
  1432.     pea    -$0024(a6)        ; _LVOExitIntr
  1433.     jmp    (a5)
  1434.  
  1435.     cnop    0,4
  1436.  
  1437. .EndLabel
  1438.  
  1439. ;------------------------------------------------------------------------------;
  1440.  
  1441. ;On KS 1.3 mh_Lower for chip mem points to memory after exec.library,
  1442. ;set it to $400 as in later kickstarts.
  1443.  
  1444. PatchLower:
  1445.     cmp    #36,$0014(a6)        ; lib_Version
  1446.     bcc    .Rts
  1447.  
  1448.     move.l    #$0427,d1
  1449.     add    $0010(a6),d1        ; lib_NegSize
  1450.     add    $0012(a6),d1        ; lib_PosSize
  1451.     and    #-8,d1
  1452.     lea    $0142(a6),a0        ; MemList
  1453.     jsr    -$0084(a6)        ; _LVOForbid
  1454.  
  1455. .Loop
  1456.     move.l    (a0),a0
  1457.     tst.l    (a0)
  1458.     beq    .Quit
  1459.     cmp.l    $0014(a0),d1        ; mh_Lower
  1460.     bne    .Loop
  1461.     move.l    #$0400,$0014(a0)    ; mh_Lower
  1462.  
  1463. .Quit
  1464.     jmp    -$008A(a6)        ; _LVOPermit
  1465.  
  1466. .Rts
  1467.     rts
  1468.  
  1469. ;------------------------------------------------------------------------------;
  1470.  
  1471. ;On KS 1.3 the supervisor stack comes right after mh_Upper.
  1472.  
  1473. ;Not necessary to fix if we don't intend to free the supervisor stack.
  1474. ;In fact, we should leave it the way it is; SetPatch tries to AllocAbs()
  1475. ;memory right before SysStkLower, for the "RAD use" patch with 1MB chip.
  1476.  
  1477. ;PatchUpper:
  1478. ;    cmp    #36,$0014(a6)        ; lib_Version
  1479. ;    bcc    .Rts
  1480. ;
  1481. ;    move.l    $003A(a6),d1        ; SysStkLower
  1482. ;    lea    $0142(a6),a0        ; MemList
  1483. ;    jsr    -$0084(a6)        ; _LVOForbid
  1484. ;
  1485. ;.Loop
  1486. ;    move.l    (a0),a0
  1487. ;    tst.l    (a0)
  1488. ;    beq    .Quit
  1489. ;    cmp.l    $0018(a0),d1        ; mh_Upper
  1490. ;    bne    .Loop
  1491. ;    move.l    $0036(a6),$0018(a0)    ; mh_Upper, SysStkUpper
  1492. ;
  1493. ;.Quit
  1494. ;    jmp    -$008A(a6)        ; _LVOPermit
  1495. ;
  1496. ;.Rts
  1497. ;    rts
  1498.  
  1499. ;------------------------------------------------------------------------------;
  1500.  
  1501. CmpMem:
  1502. ;    a0=address1
  1503. ;    a1=address2
  1504. ; out    d0=1 if addresses are within same mh_Lower/mh_Upper
  1505.  
  1506.     movem.l    a2/a3,-(sp)
  1507.     moveq    #0,d0
  1508.     lea    $0142(a6),a2        ; MemList
  1509.     jsr    -$0084(a6)        ; _LVOForbid
  1510.  
  1511. .Loop
  1512.     move.l    (a2),a2
  1513.     tst.l    (a2)
  1514.     beq    .Quit
  1515.  
  1516.     lea    $0020(a2),a3        ; sizeof(MemHeader)
  1517.     cmp.l    $0014(a2),a3        ; mh_Lower
  1518.     beq    .LowerOk
  1519.     move.l    $0014(a2),a3        ; mh_Lower
  1520.  
  1521. .LowerOk
  1522.     cmp.l    a3,a1
  1523.     bcs    .Loop
  1524.     cmp.l    $0018(a2),a1        ; mh_Upper
  1525.     bcc    .Loop
  1526.  
  1527.     cmp.l    a3,a0
  1528.     bcs    .Quit
  1529.     cmp.l    $0018(a2),a0        ; mh_Upper
  1530.     bcc    .Quit
  1531.  
  1532.     moveq    #1,d0
  1533.  
  1534. .Quit
  1535.     jsr    -$008A(a6)        ; _LVOPermit
  1536.     movem.l    (sp)+,a2/a3
  1537.     rts
  1538.  
  1539. ;------------------------------------------------------------------------------;
  1540.  
  1541. InitList:
  1542. ;    a2=old base
  1543. ;    a3=new base
  1544. ;    d0=offset
  1545.  
  1546.     lea    (a2,d0),a0
  1547.     lea    (a3,d0),a1
  1548. ;    bra    CopyList
  1549.  
  1550. ;------------------------------------------------------------------------------;
  1551.  
  1552. CopyList:
  1553.     move.l    a2,d1
  1554.     move.l    (a0),a2
  1555.     move.l    a2,(a1)
  1556.     move.l    a1,$0004(a2)
  1557.     move.l    $0008(a0),a2
  1558.     move.l    a2,$0008(a1)
  1559.     addq.l    #4,a1
  1560.     move.l    a1,(a2)
  1561.     move.l    d1,a2
  1562.     rts
  1563.  
  1564. ;------------------------------------------------------------------------------;
  1565.  
  1566. ;Only free memory if it is within any Lower/Upper bound
  1567. ;Called by functions like MoveExec().
  1568.  
  1569. FreeMemSafely:
  1570.     move.l    d0,d1
  1571.     beq    .Rts
  1572.     add.l    a1,d1
  1573.     lea    $0142(a6),a0        ; MemList
  1574.     jsr    -$0084(a6)        ; _LVOForbid
  1575.  
  1576. .Loop
  1577.     move.l    (a0),a0
  1578.     tst.l    (a0)
  1579.     beq    .Quit
  1580.  
  1581.     cmp.l    $0014(a0),a1        ; mh_Lower
  1582.     bcs    .Loop
  1583.     cmp.l    $0018(a0),a1        ; mh_Upper
  1584.     bcc    .Loop
  1585.     cmp.l    $0018(a0),d1        ; mh_Upper
  1586.     bhi    .Quit
  1587.     jsr    -$00D2(a6)        ; _LVOFreeMem
  1588.  
  1589. .Quit
  1590.     jmp    -$008A(a6)        ; _LVOPermit
  1591.  
  1592. .Rts
  1593.     rts
  1594.  
  1595. ;------------------------------------------------------------------------------;
  1596.  
  1597. GetVBR:
  1598. ; out    d0=vbr
  1599.  
  1600.     moveq    #0,d0
  1601.     btst    #0,$0129(a6)        ; AttnFlags+1, AFB_68010
  1602.     beq    .Rts
  1603.  
  1604.     move.l    a5,a0
  1605.     lea    .Ok(pc),a5        ; userFuntion
  1606.     jsr    -$001E(a6)        ; _LVOSupervisor
  1607.     move.l    a0,a5
  1608.  
  1609. .Rts
  1610.     rts
  1611.  
  1612. .Ok
  1613.     dc.l    $4E7A0801        ; movec vbr,d0
  1614.     rte
  1615.  
  1616. ;------------------------------------------------------------------------------;
  1617.  
  1618. InitChkBase:
  1619.     move.l    a6,d1
  1620.     not.l    d1
  1621.     move.l    $0026(a6),d0        ; ChkBase
  1622.     move.l    d1,$0026(a6)        ; ChkBase
  1623.     rts
  1624.  
  1625. ;------------------------------------------------------------------------------;
  1626.  
  1627. InitChkSum:
  1628.     moveq    #0,d1
  1629.     lea    $0022(a6),a0        ; SoftVer
  1630.     moveq    #23,d0
  1631.  
  1632. .Loop
  1633.     add    (a0)+,d1
  1634.     dbf    d0,.Loop
  1635.     not    d1
  1636.     move    (a0),d0
  1637.     move    d1,(a0)
  1638.     rts
  1639.  
  1640. ;------------------------------------------------------------------------------;
  1641.  
  1642. MyTypeOfMem:
  1643. ;    a1=address
  1644. ; out    d0=type
  1645. ;MEMB_SLOW=0
  1646. ;MEMB_CHIP=1
  1647. ;MEMB_FAST=2
  1648.  
  1649.     moveq    #2,d0            ; MEMF_CHIP
  1650.     cmp.l    #$00200000,a1        ; 0-2MB
  1651.     bcs    .Quit            ; lower than=>chip
  1652.  
  1653.     moveq    #1,d0            ; MEMF_SLOW
  1654.     cmp.l    #$00C00000,a1        ; start of ranger memory
  1655.     bcs    .Type
  1656.     cmp.l    #$00DC0000,a1        ; end of ranger memory
  1657.     bcs    .Quit
  1658.  
  1659. .Type
  1660.     move.l    a1,-(sp)
  1661.     jsr    -$0216(a6)        ; _LVOTypeOfMem
  1662.     move.l    (sp)+,a1
  1663.     moveq    #6,d1            ; MEMF_CHIP!MEMF_FAST
  1664.     and.l    d1,d0            ; wipe out our slow flag
  1665.     bne    .Quit
  1666.     moveq    #4,d0            ; MEMF_FAST
  1667.  
  1668. .Quit
  1669.     move.b    FlagArray2(pc),d1
  1670.     bne    .Tst2
  1671.     move.l    Address(a5),a0
  1672.     move.l    ArgADDRESS(a5),d1
  1673.     bra    .Tst
  1674.  
  1675. .Tst2
  1676.     move.l    Address2(pc),a0
  1677.     move.l    Arg2ADDRESS(pc),d1
  1678.  
  1679. .Tst
  1680.     tst.l    d1
  1681.     bne    .Cmp
  1682.     btst    #2,d0            ; MEMB_FAST
  1683.     bne    .Ok
  1684.     rts
  1685.  
  1686. .Ok
  1687.     or    #$8000,d0
  1688.     rts
  1689.  
  1690. .Cmp
  1691.     move.l    d0,-(sp)
  1692.     bsr    CmpMem
  1693.     move.l    d0,d1
  1694.     move.l    (sp)+,d0
  1695.     tst.l    d1
  1696.     bne    .Ok
  1697.     rts
  1698.  
  1699. ;------------------------------------------------------------------------------;
  1700.  
  1701. OSCacheClearE:
  1702.     cmp    #37,$0014(a6)        ; lib_Version
  1703.     bcs    .Old
  1704.     jmp    -$0282(a6)        ; _LVOCacheClearE
  1705.  
  1706. .Old
  1707.     btst    #1,$0129(a6)        ; AttnFlags+1, AFB_68020
  1708.     beq    .Rts
  1709.  
  1710.     and.l    #$00000808,d1        ; caches, CACRF_ClearI!CACRF_ClearD
  1711.     move.l    a5,a0
  1712.     lea    .F2(pc),a5        ; userFunction
  1713.     btst    #3,$0129(a6)        ; AttnFlags+1, AFB_68040
  1714.     beq    .Ok
  1715.     lea    .F4(pc),a5        ; userFunction
  1716.     btst    #3,d1            ; CACRB_ClearI
  1717.     beq    .Ok
  1718.     lea    .F4I(pc),a5
  1719.  
  1720. .Ok
  1721.     jsr    -$001E(a6)        ; _LVOSupervisor
  1722.     move.l    a0,a5
  1723.  
  1724. .Rts
  1725.     rts
  1726.  
  1727. .F2
  1728.     or    #$0700,sr
  1729.     dc.l    $4E7A0002        ; movec cacr,d0
  1730.     or.l    d1,d0
  1731.     dc.l    $4E7B0002        ; movec d0,cacr
  1732.     rte
  1733.  
  1734. .F4
  1735.     dc.w    $F478
  1736.     rte
  1737.  
  1738. .F4I
  1739.     dc.w    $F4F8
  1740.     rte
  1741.  
  1742. ;------------------------------------------------------------------------------;
  1743.  
  1744. OSCacheClearU:
  1745.     cmp    #37,$0014(a6)        ; lib_Version
  1746.     bcs    .Old
  1747.     jmp    -$027C(a6)        ; _LVOCacheClearU
  1748.  
  1749. .Old
  1750.     move.l    #$00000808,d1        ; caches, CACRF_ClearI!CACRF_ClearD
  1751.     bra    OSCacheClearE
  1752.  
  1753. ;------------------------------------------------------------------------------;
  1754.  
  1755. OSCacheControl:
  1756.     cmp    #37,$0014(a6)        ; lib_Version
  1757.     bcs    .Old
  1758.     jmp    -$0288(a6)        ; _LVOCacheControl
  1759.  
  1760. .Old
  1761.     movem.l    d2/a5,-(sp)
  1762.     move.l    d0,d2
  1763.  
  1764.     moveq    #0,d0
  1765.     btst    #1,$0129(a6)        ; AttnFlags+1, AFB_68020
  1766.     beq    .End
  1767.  
  1768.     and.l    d1,d2
  1769.     not.l    d1
  1770.     or    #$0808,d2        ; CACRF_ClearI!CACRF_ClearD
  1771.     lea    .F(pc),a5        ; userFunction
  1772.     jsr    -$001E(a6)        ; _LVOSupervisor
  1773.  
  1774. .End
  1775.     movem.l    (sp)+,d2/a5
  1776.     rts
  1777.  
  1778. .F
  1779.     or    #$0700,sr
  1780.     dc.l    $4E7A0002        ; movec cacr,d0
  1781.     and.l    d0,d1
  1782.     or.l    d2,d1
  1783.     nop
  1784.     dc.l    $4E7B1002        ; movec d1,cacr
  1785.     nop
  1786.     rte
  1787.  
  1788. ;------------------------------------------------------------------------------;
  1789.  
  1790. SetSSP:
  1791. ;    d0=ptr
  1792.  
  1793.     movem.l    d2/a5,-(sp)
  1794.     lea    .Ok(pc),a5        ; userFunction
  1795.     jsr    -$001E(a6)        ; _LVOSupervisor
  1796.     movem.l    (sp)+,d2/a5
  1797.     bra    InitChkSum
  1798.  
  1799. .Ok
  1800.     or    #$0700,sr
  1801.  
  1802.     move.l    $003A(a6),a0        ; SysStkLower
  1803.     move.l    d0,a1
  1804.  
  1805.     move.l    $0036(a6),d2        ; SysStkUpper
  1806.     sub.l    a0,d2
  1807.  
  1808.     move.l    d2,d1
  1809.     lsr.l    #2,d1
  1810.     subq.l    #1,d1
  1811.  
  1812. .Copy
  1813.     move.l    (a0)+,(a1)+
  1814.     dbf    d1,.Copy
  1815.  
  1816.     sub.l    $003A(a6),sp        ; SysStkLower
  1817.     add.l    d0,sp
  1818.  
  1819.     move.l    d0,$003A(a6)        ; SysStkLower
  1820.     add.l    d2,d0
  1821.     move.l    d0,$0036(a6)        ; SysStkUpper
  1822.  
  1823.     rte
  1824.  
  1825. ;------------------------------------------------------------------------------;
  1826.  
  1827. SetVBR:
  1828. ;    d0=vbr
  1829.  
  1830.     btst    #0,$0129(a6)        ; AttnFlags+1, AFB_68010
  1831.     beq    .Rts
  1832.  
  1833.     move.l    a5,a0
  1834.     lea    .Ok(pc),a5        ; userFuntion
  1835.     jsr    -$001E(a6)        ; _LVOSupervisor
  1836.     move.l    a0,a5
  1837.  
  1838. .Rts
  1839.     rts
  1840.  
  1841. .Ok
  1842.     dc.l    $4E7B0801        ; movec d0,vbr
  1843.     rte
  1844.  
  1845. ;------------------------------------------------------------------------------;
  1846.  
  1847. expansion_library    dc.b 'expansion.library',0
  1848.  
  1849. FastExecName        dc.b 'FastExec',0
  1850.             dc.b '$VER: '
  1851. FastExecId        dc.b 'FastExec 2.9 (24.8.97)',13,10,0
  1852.  
  1853.     cnop    0,4
  1854.  
  1855. Array2
  1856. Arg2NOEXEC        dc.l    0
  1857. Arg2ADDRESS        dc.l    0
  1858. Arg2PATCH        dc.l    0
  1859. Arg2FASTSSP        dc.l    0
  1860. Arg2FASTVBR        dc.l    0
  1861. Arg2FASTEXP        dc.l    0
  1862. Arg2FASTMEM        dc.l    0
  1863. Arg2FASTINT        dc.l    0
  1864. Arg2CACHE        dc.l    0
  1865. Arg2ADDMEM        dc.l    0
  1866. Address2        dc.l    0
  1867. CacheBits2        dc.l    0
  1868. AddMemData2        dcb.l    MAXADDMEM*4,0
  1869. Array2End
  1870. OldAddMemList        dc.l    0
  1871. FlagEBExec        dc.b    0
  1872. FlagArray2        dc.b    0
  1873.  
  1874.     cnop    0,4
  1875.  
  1876. ResEnd
  1877.  
  1878. ;------------------------------------------------------------------------------;
  1879. ;------------------------------------------------------------------------------;
  1880. ;------------------------------------------------------------------------------;
  1881.  
  1882. ibrd_next    = 0
  1883. ibrd_name    = ibrd_next+4
  1884. ibrd_addr    = ibrd_name+4
  1885. ibrd_boardaddr    = ibrd_addr+4
  1886. ibrd_boardsize    = ibrd_boardaddr+4
  1887. ibrd_ERmanufact    = ibrd_boardsize+4
  1888. ibrd_flags    = ibrd_ERmanufact+2
  1889. ibrd_ERtype    = ibrd_flags+1
  1890. ibrd_ERproduct    = ibrd_ERtype+1
  1891. ibrd_ERflags    = ibrd_ERproduct+1
  1892. ibrd_sizeof    = ibrd_ERflags+1
  1893.  
  1894. ilib_next    = 0
  1895. ilib_name    = ilib_next+4
  1896. ilib_addr    = ilib_name+4
  1897. ilib_neg    = ilib_addr+4
  1898. ilib_pos    = ilib_neg+2
  1899. ilib_ver    = ilib_pos+2
  1900. ilib_rev    = ilib_ver+2
  1901. ilib_opn    = ilib_rev+2
  1902. ilib_mem    = ilib_opn+2
  1903. ilib_pri    = ilib_mem+1
  1904. ilib_sizeof    = ilib_pri+1
  1905.  
  1906. imem_next    = 0
  1907. imem_name    = imem_next+4
  1908. imem_addr    = imem_name+4
  1909. imem_lower    = imem_addr+4
  1910. imem_upper    = imem_lower+4
  1911. imem_type    = imem_upper+4
  1912. imem_pri    = imem_type+2
  1913. imem_sizeof    = imem_pri+1
  1914.  
  1915. iintr_next    = 0
  1916. iintr_name    = iintr_next+4
  1917. iintr_addr    = iintr_name+4
  1918. iintr_type    = iintr_addr+4
  1919. iintr_data    = iintr_type+4
  1920. iintr_code    = iintr_data+4
  1921. iintr_num    = iintr_code+4
  1922. iintr_pri    = iintr_num+2
  1923. iintr_sizeof    = iintr_pri+1
  1924.  
  1925. ikickmem_next    = 0
  1926. ikickmem_name    = ikickmem_next+4
  1927. ikickmem_addr    = ikickmem_name+4
  1928. ikickmem_start    = ikickmem_addr+4
  1929. ikickmem_size    = ikickmem_start+4
  1930. ikickmem_num    = ikickmem_size+4
  1931. ikickmem_sizeof    = ikickmem_num+2
  1932.  
  1933. ;------------------------------------------------------------------------------;
  1934.  
  1935. SysInfo:
  1936.     movem.l    d2-d7/a2-a5,-(sp)
  1937.     move.l    sp,d7
  1938.     lea    -1024(sp),sp
  1939.     move.l    sp,a3
  1940.     lea    -20*4(sp),sp
  1941.     move.l    sp,a4
  1942.     move.l    a4,a2
  1943.  
  1944. ;Exec
  1945.     move.l    $0014(a6),(a2)+        ; lib_Version/lib_Revision
  1946.  
  1947. ;Kickstart
  1948.     bsr    GetKSVer
  1949.     move.l    d0,(a2)+
  1950.  
  1951. ;Workbench
  1952.     bsr    GetWBVer
  1953.     move.l    d0,(a2)+
  1954.  
  1955. ;SetPatch
  1956.     bsr    GetSPVer
  1957.     move.l    d0,(a2)+
  1958.  
  1959. ;ROM
  1960.     lea    $01000000,a0
  1961.     move.l    -$0014(a0),d0
  1962.     sub.l    d0,a0
  1963.     move.l    $000C(a0),(a2)+
  1964.  
  1965. ;CPU
  1966.     move    $0128(a6),d1        ; AttnFlags
  1967.     moveq    #6,d0
  1968.     tst.b    d1            ; AFB_68060=7
  1969.     bmi    .CPU
  1970.     moveq    #4,d0
  1971.     btst    #3,d1            ; AFB_68040
  1972.     bne    .CPU
  1973.     moveq    #3,d0
  1974.     btst    #2,d1            ; AFB_68030
  1975.     bne    .CPU
  1976.     moveq    #2,d0
  1977.     btst    #1,d1            ; AFB_68020
  1978.     bne    .CPU
  1979.     moveq    #1,d0
  1980.     btst    #0,d1            ; AFB_68010
  1981.     bne    .CPU
  1982.     moveq    #0,d0
  1983.  
  1984. .CPU
  1985.     move.l    d0,(a2)+
  1986.  
  1987. ;FPU
  1988.     btst    #3,d1            ; AFB_68040
  1989.     beq    .FPU40
  1990.     lea    StrFPU40(pc),a0
  1991.     btst    #6,d1
  1992.     bne    .FPU
  1993.  
  1994. .FPU40
  1995.     lea    Str68882(pc),a0
  1996.     btst    #5,d1
  1997.     bne    .FPU
  1998.     lea    Str68881(pc),a0
  1999.     btst    #4,d1
  2000.     bne    .FPU
  2001.     lea    StrNONE(pc),a0
  2002.  
  2003. .FPU
  2004.     move.l    a0,(a2)+
  2005.  
  2006. ;VBR
  2007.     bsr    GetVBR
  2008.     move.l    d0,(a2)+
  2009.  
  2010.     lea    $002A(a6),a0        ; ColdCapture
  2011.     moveq    #5,d0
  2012.  
  2013. .Init
  2014.     move.l    (a0)+,(a2)+
  2015.     dbf    d0,.Init
  2016.  
  2017. ;    move.l    $002A(a6),(a2)+        ; ColdCapture
  2018. ;    move.l    $002E(a6),(a2)+        ; CoolCapture
  2019. ;    move.l    $0032(a6),(a2)+        ; WarmCapture
  2020. ;    move.l    $0036(a6),(a2)+        ; SysStkUpper
  2021. ;    move.l    $003A(a6),(a2)+        ; SysStkLower
  2022. ;    move.l    $003E(a6),(a2)+        ; MaxLocMem
  2023.     move.l    $004E(a6),(a2)+        ; MaxExtMem
  2024.  
  2025.     lea    .FmtMisc(pc),a0        ; formatString
  2026.     move.l    a4,a1            ; dataStream
  2027.     lea    PutChProc(pc),a2    ; putChProc
  2028. ;    move.l    #0,a3            ; putChData
  2029.     jsr    -$020A(a6)        ; _LVORawDoFmt
  2030.  
  2031.     move.l    a3,a0            ; string
  2032.     bsr    Put
  2033.  
  2034.     move.l    d7,sp
  2035.     movem.l    (sp)+,d2-d7/a2-a5
  2036.  
  2037.     tst.l    d0
  2038.     beq    .Rts
  2039.     bsr    PutLF
  2040.     bsr    SysIBrd
  2041.  
  2042.     tst.l    d0
  2043.     beq    .Rts
  2044.     bsr    PutLF
  2045.     bsr    SysIMem
  2046.  
  2047.     tst.l    d0
  2048.     beq    .Rts
  2049.     bsr    PutLF
  2050.     move    #$017A,d0        ; LibList
  2051.     bsr    SysIList
  2052.  
  2053.     tst.l    d0
  2054.     beq    .Rts
  2055.     bsr    PutLF
  2056.     move    #$015E,d0        ; DeviceList
  2057.     bsr    SysIList
  2058.  
  2059.     tst.l    d0
  2060.     beq    .Rts
  2061.     bsr    PutLF
  2062.     move    #$0150,d0        ; ResourceList
  2063.     bsr    SysIList
  2064.  
  2065.     tst.l    d0
  2066.     beq    .Rts
  2067.     bsr    PutLF
  2068.     bsr    SysIIntr
  2069.  
  2070.     tst.l    d0
  2071.     beq    .Rts
  2072.     bsr    PutLF
  2073.     bsr    SysIKickMem
  2074.  
  2075.     tst.l    d0
  2076.     beq    .Rts
  2077.     bsr    PutLF
  2078.     bsr    SysIKickTag
  2079.  
  2080.     tst.l    d0
  2081.     beq    .Rts
  2082.     bsr    PutLF
  2083.     bsr    SysIRes
  2084.  
  2085. .Rts
  2086.     rts
  2087.  
  2088. .FmtMisc
  2089.  dc.b 'Exec:      %d.%d',10
  2090.  dc.b 'Kickstart: %d.%d',10
  2091.  dc.b 'Workbench: %d.%d',10
  2092.  dc.b 'SetPatch:  %d.%d',10
  2093.  dc.b 'ROM: %d.%d',10
  2094.  dc.b 'CPU: 680%ld0',10
  2095.  dc.b 'FPU: %s',10
  2096.  dc.b 'VBR: $%08lx',10
  2097.  dc.b 'ColdCapture: $%08lx',10
  2098.  dc.b 'CoolCapture: $%08lx',10
  2099.  dc.b 'WarmCapture: $%08lx',10
  2100.  dc.b 'SysStkUpper: $%08lx',10
  2101.  dc.b 'SysStkLower: $%08lx',10
  2102.  dc.b 'MaxLocMem:   $%08lx',10
  2103.  dc.b 'MaxExtMem:   $%08lx',10
  2104.  dc.b 0
  2105.  
  2106.     cnop    0,2
  2107.  
  2108. ;------------------------------------------------------------------------------;
  2109.  
  2110. SysIBrd:
  2111.     movem.l    d2-d4/a2-a4,-(sp)
  2112.     lea    -80(sp),sp
  2113.     move.l    sp,a3
  2114.  
  2115.     lea    .Str(pc),a0        ; string
  2116.     moveq    #1,d0
  2117.     bsr    PutS
  2118.     move.l    d0,d4
  2119.     beq    .Done
  2120.  
  2121.     bsr    GetIBrd
  2122.     move.l    d0,d2
  2123.     beq    .Done
  2124.     move.l    d0,d1
  2125.     addq.l    #1,d1
  2126.     beq    .Err
  2127.  
  2128. .Loop
  2129.     move.l    d0,a4
  2130.     move.l    sp,d3
  2131.  
  2132.     moveq    #0,d0
  2133.     move    ibrd_ERmanufact(a4),d0
  2134.     move.l    d0,-(sp)
  2135.     moveq    #0,d0
  2136.     move.b    ibrd_ERflags(a4),d0
  2137.     move.l    d0,-(sp)
  2138.     moveq    #0,d0
  2139.     move.b    ibrd_ERproduct(a4),d0
  2140.     move.l    d0,-(sp)
  2141.     moveq    #0,d0
  2142.     move.b    ibrd_ERtype(a4),d0
  2143.     move.l    d0,-(sp)
  2144.     move.l    ibrd_boardsize(a4),-(sp)
  2145.     move.l    ibrd_boardaddr(a4),-(sp)
  2146.     moveq    #0,d0
  2147.     move.b    ibrd_flags(a4),d0
  2148.     move.l    d0,-(sp)
  2149.     move.l    ibrd_addr(a4),-(sp)
  2150.  
  2151.     lea    .Fmt(pc),a0        ; formatString
  2152.     move.l    sp,a1            ; dataStream
  2153.     lea    PutChProc(pc),a2    ; putChProc
  2154. ;    lea    #0,a3            ; putChData
  2155.     jsr    -$020A(a6)        ; _LVORawDoFmt
  2156.  
  2157.     move.l    a3,a0            ; string
  2158.     moveq    #1,d0
  2159.     bsr    PutS
  2160.     move.l    d3,sp
  2161.     move.l    d0,d4
  2162.     beq    .Quit
  2163.  
  2164.     move.l    (a4),d0            ; ilib_next
  2165.     bne    .Loop
  2166.     moveq    #1,d4
  2167.  
  2168. .Quit
  2169.     move.l    d2,a0            ; info
  2170.     bsr    FreeInfo
  2171.  
  2172. .Done
  2173.     move.l    d4,d0
  2174.     lea    80(sp),sp
  2175.     movem.l    (sp)+,d2-d4/a2-a4
  2176.     rts
  2177.  
  2178. .Err
  2179.     lea    TxtAllocMem(pc),a0        ; string
  2180.     bsr    PutS
  2181.     moveq    #0,d4
  2182.     bra    .Done
  2183.  
  2184. .Str
  2185.  dc.b 'BOARDS:',10
  2186.  dc.b 'Address Flags BoardAddr BoardSize Type Product Flags Manufacturer',10,0
  2187. .Fmt
  2188.  dc.b '$%08lx $%02lx $%08lx $%08lx  $%02lx %7ld   $%02lx %12ld',10,0
  2189.  
  2190.     cnop    0,2
  2191.  
  2192. ;------------------------------------------------------------------------------;
  2193.  
  2194. SysIList:
  2195.     movem.l    d2-d5/a2-a4,-(sp)
  2196.     lea    -80(sp),sp
  2197.     move.l    sp,a3
  2198.     move.l    d0,d5
  2199.  
  2200.     lea    .Str150(pc),a0        ; string
  2201.     cmp    #$0150,d0
  2202.     beq    .Header
  2203.     lea    .Str15E(pc),a0        ; string
  2204.     cmp    #$015E,d0
  2205.     beq    .Header
  2206.     lea    .Str17A(pc),a0        ; string
  2207.  
  2208. .Header
  2209.     bsr    PutS
  2210.     move.l    d0,d4
  2211.     beq    .Done
  2212.  
  2213.     lea    .Str(pc),a0        ; string
  2214.     moveq    #1,d0
  2215.     bsr    PutS
  2216.     move.l    d0,d4
  2217.     beq    .Done
  2218.  
  2219.     move    d5,d0
  2220.     bsr    GetIList
  2221.     move.l    d0,d2
  2222.     beq    .Done
  2223.     move.l    d0,d1
  2224.     addq.l    #1,d1
  2225.     beq    .Err
  2226.  
  2227. .Loop
  2228.     move.l    d0,a4
  2229.     move.l    sp,d3
  2230.  
  2231.     moveq    #0,d0
  2232.     move    ilib_opn(a4),d0
  2233.     move.l    d0,-(sp)
  2234.     move    ilib_rev(a4),d0
  2235.     move.l    d0,-(sp)
  2236.     move    ilib_ver(a4),d0
  2237.     move.l    d0,-(sp)
  2238.     move    ilib_pos(a4),d0
  2239.     move.l    d0,-(sp)
  2240.     move    ilib_neg(a4),d0
  2241.     move.l    d0,-(sp)
  2242.     move.b    ilib_pri(a4),d0
  2243.     ext    d0
  2244.     ext.l    d0
  2245.     move.l    d0,-(sp)
  2246.     moveq    #0,d0
  2247.     move.b    ilib_mem(a4),d0
  2248.     bsr    GetMemStr
  2249.     move.l    d0,-(sp)
  2250.     move.l    ilib_name(a4),-(sp)
  2251.     move.l    ilib_addr(a4),-(sp)
  2252.  
  2253.     lea    .Fmt(pc),a0        ; formatString
  2254.     move.l    sp,a1            ; dataStream
  2255.     lea    PutChProc(pc),a2    ; putChProc
  2256. ;    lea    #0,a3            ; putChData
  2257.     jsr    -$020A(a6)        ; _LVORawDoFmt
  2258.  
  2259.     move.l    a3,a0            ; string
  2260.     moveq    #1,d0
  2261.     bsr    PutS
  2262.     move.l    d3,sp
  2263.     move.l    d0,d4
  2264.     beq    .Quit
  2265.  
  2266.     move.l    (a4),d0            ; ilib_next
  2267.     bne    .Loop
  2268.     moveq    #1,d4
  2269.  
  2270. .Quit
  2271.     move.l    d2,a0            ; info
  2272.     bsr    FreeInfo
  2273.  
  2274. .Done
  2275.     move.l    d4,d0
  2276.     lea    80(sp),sp
  2277.     movem.l    (sp)+,d2-d5/a2-a4
  2278.     rts
  2279.  
  2280. .Err
  2281.     lea    TxtAllocMem(pc),a0        ; string
  2282.     bsr    PutS
  2283.     moveq    #0,d4
  2284.     bra    .Done
  2285.  
  2286. .Str150
  2287.  dc.b 'RESOURCES:',10,0
  2288. .Str15E
  2289.  dc.b 'DEVICES:',10,0
  2290. .Str17A
  2291.  dc.b 'LIBRARIES:',10,0
  2292. .Str
  2293.  dc.b 'Address   Name              MemType  Pri   Neg   Pos   Version OpenCnt',10,0
  2294. .Fmt
  2295.  dc.b '$%08lx %-20.20s %.4s %4ld %5ld %5ld %5ld.%-5ld %5ld',10,0
  2296.     cnop    0,2
  2297.  
  2298. ;------------------------------------------------------------------------------;
  2299.  
  2300. SysIMem:
  2301.     movem.l    d2-d4/a2-a4,-(sp)
  2302.     lea    -80(sp),sp
  2303.     move.l    sp,a3
  2304.  
  2305.     lea    .Str(pc),a0        ; string
  2306.     moveq    #1,d0
  2307.     bsr    PutS
  2308.     move.l    d0,d4
  2309.     beq    .Done
  2310.  
  2311.     bsr    GetIMem
  2312.     move.l    d0,d2
  2313.     beq    .Done
  2314.     move.l    d0,d1
  2315.     addq.l    #1,d1
  2316.     beq    .Err
  2317.  
  2318. .Loop
  2319.     move.l    d0,a4
  2320.     move.l    sp,d3
  2321.  
  2322.     move.b    imem_pri(a4),d0
  2323.     ext    d0
  2324.     ext.l    d0
  2325.     move.l    d0,-(sp)
  2326.     moveq    #0,d0
  2327.     move    imem_type(a4),d0
  2328.     move.l    d0,-(sp)
  2329.     move.l    imem_upper(a4),-(sp)
  2330.     move.l    imem_lower(a4),-(sp)
  2331.     move.l    imem_name(a4),-(sp)
  2332.     move.l    imem_addr(a4),-(sp)
  2333.  
  2334.     lea    .Fmt(pc),a0        ; formatString
  2335.     move.l    sp,a1            ; dataStream
  2336.     lea    PutChProc(pc),a2    ; putChProc
  2337. ;    lea    #0,a3            ; putChData
  2338.     jsr    -$020A(a6)        ; _LVORawDoFmt
  2339.  
  2340.     move.l    a3,a0            ; string
  2341.     moveq    #1,d0
  2342.     bsr    PutS
  2343.     move.l    d3,sp
  2344.     move.l    d0,d4
  2345.     beq    .Quit
  2346.  
  2347.     move.l    (a4),d0            ; ilib_next
  2348.     bne    .Loop
  2349.     moveq    #1,d4
  2350.  
  2351. .Quit
  2352.     move.l    d2,a0            ; info
  2353.     bsr    FreeInfo
  2354.  
  2355. .Done
  2356.     move.l    d4,d0
  2357.     lea    80(sp),sp
  2358.     movem.l    (sp)+,d2-d4/a2-a4
  2359.     rts
  2360.  
  2361. .Err
  2362.     lea    TxtAllocMem(pc),a0        ; string
  2363.     bsr    PutS
  2364.     moveq    #0,d4
  2365.     bra    .Done
  2366.  
  2367. .Str
  2368.  dc.b 'MEMORY HEADERS:',10
  2369.  dc.b 'Address   Name                 Lower     Upper     Type   Pri',10,0
  2370. .Fmt
  2371.  dc.b '$%08lx %-20.20s $%08lx $%08lx $%04lx %4ld',10,0
  2372.  
  2373.     cnop    0,2
  2374.  
  2375. ;------------------------------------------------------------------------------;
  2376.  
  2377. SysIIntr:
  2378.     movem.l    d2-d4/a2-a4,-(sp)
  2379.     lea    -80(sp),sp
  2380.     move.l    sp,a3
  2381.  
  2382.     lea    .Str(pc),a0        ; string
  2383.     moveq    #1,d0
  2384.     bsr    PutS
  2385.     move.l    d0,d4
  2386.     beq    .Done
  2387.  
  2388.     bsr    GetIIntr
  2389.     move.l    d0,d2
  2390.     beq    .Done
  2391.     move.l    d0,d1
  2392.     addq.l    #1,d1
  2393.     beq    .Err
  2394.  
  2395. .Loop
  2396.     move.l    d0,a4
  2397.     move.l    sp,d3
  2398.  
  2399.     move.b    iintr_pri(a4),d0
  2400.     ext    d0
  2401.     ext.l    d0
  2402.     move.l    d0,-(sp)
  2403.     move.l    iintr_code(a4),-(sp)
  2404.     move.l    iintr_data(a4),-(sp)
  2405.     move.l    iintr_type(a4),-(sp)
  2406.     moveq    #0,d0
  2407.     move    iintr_num(a4),d0
  2408.     move.l    d0,-(sp)
  2409.     move.l    iintr_name(a4),-(sp)
  2410.     move.l    iintr_addr(a4),-(sp)
  2411.  
  2412.     lea    .Fmt(pc),a0        ; formatString
  2413.     move.l    sp,a1            ; dataStream
  2414.     lea    PutChProc(pc),a2    ; putChProc
  2415. ;    lea    #0,a3            ; putChData
  2416.     jsr    -$020A(a6)        ; _LVORawDoFmt
  2417.  
  2418.     move.l    a3,a0            ; string
  2419.     moveq    #1,d0
  2420.     bsr    PutS
  2421.     move.l    d3,sp
  2422.     move.l    d0,d4
  2423.     beq    .Quit
  2424.  
  2425.     move.l    (a4),d0            ; ilib_next
  2426.     bne    .Loop
  2427.     moveq    #1,d4
  2428.  
  2429. .Quit
  2430.     move.l    d2,a0            ; info
  2431.     bsr    FreeInfo
  2432.  
  2433. .Done
  2434.     move.l    d4,d0
  2435.     lea    80(sp),sp
  2436.     movem.l    (sp)+,d2-d4/a2-a4
  2437.     rts
  2438.  
  2439. .Err
  2440.     lea    TxtAllocMem(pc),a0        ; string
  2441.     bsr    PutS
  2442.     moveq    #0,d4
  2443.     bra    .Done
  2444.  
  2445. .Str
  2446.  dc.b 'INTERRUPTS:',10
  2447.  dc.b 'Address   Name                 Nr Type    Data      Code       Pri',10,0
  2448. .Fmt
  2449.  dc.b '$%08lx %-20.20s %2ld %-7.7s $%08lx $%08lx %4ld',10,0
  2450.  
  2451.     cnop    0,2
  2452.  
  2453. ;------------------------------------------------------------------------------;
  2454.  
  2455. SysIKickMem:
  2456.     movem.l    d2-d4/a2-a4,-(sp)
  2457.     lea    -80(sp),sp
  2458.     move.l    sp,a3
  2459.  
  2460.     lea    .Str(pc),a0        ; string
  2461.     moveq    #1,d0
  2462.     bsr    PutS
  2463.     move.l    d0,d4
  2464.     beq    .Done
  2465.  
  2466.     bsr    GetIKickMem
  2467.     move.l    d0,d2
  2468.     beq    .Done
  2469.     move.l    d0,d1
  2470.     addq.l    #1,d1
  2471.     beq    .Err
  2472.  
  2473. .Loop
  2474.     move.l    d0,a4
  2475.     move.l    sp,d3
  2476.  
  2477.     move.l    ikickmem_size(a4),-(sp)
  2478.     move.l    ikickmem_start(a4),-(sp)
  2479.  
  2480.     lea    .Fmt2(pc),a0        ; formatString
  2481.     tst.l    ikickmem_addr(a4)
  2482.     beq    .FmtOk
  2483.  
  2484.     moveq    #0,d0
  2485.     move    ikickmem_num(a4),d0
  2486.     move.l    d0,-(sp)
  2487.     move.l    ikickmem_name(a4),-(sp)
  2488.     move.l    ikickmem_addr(a4),-(sp)
  2489.  
  2490.     lea    .Fmt1(pc),a0        ; formatString
  2491.     tst.l    d0
  2492.     bne    .FmtOk
  2493.     lea    .Fmt0(pc),a0        ; formatString
  2494.  
  2495. .FmtOk
  2496.     move.l    sp,a1            ; dataStream
  2497.     lea    PutChProc(pc),a2    ; putChProc
  2498. ;    lea    #0,a3            ; putChData
  2499.     jsr    -$020A(a6)        ; _LVORawDoFmt
  2500.  
  2501.     move.l    a3,a0            ; string
  2502.     moveq    #1,d0
  2503.     bsr    PutS
  2504.     move.l    d3,sp
  2505.     move.l    d0,d4
  2506.     beq    .Quit
  2507.  
  2508.     move.l    (a4),d0            ; ilib_next
  2509.     bne    .Loop
  2510.     moveq    #1,d4
  2511.  
  2512. .Quit
  2513.     move.l    d2,a0            ; info
  2514.     bsr    FreeInfo
  2515.  
  2516. .Done
  2517.     move.l    d4,d0
  2518.     lea    80(sp),sp
  2519.     movem.l    (sp)+,d2-d4/a2-a4
  2520.     rts
  2521.  
  2522. .Err
  2523.     lea    TxtAllocMem(pc),a0        ; string
  2524.     bsr    PutS
  2525.     moveq    #0,d4
  2526.     bra    .Done
  2527.  
  2528. .Str
  2529.  dc.b 'KICKMEM:',10
  2530.  dc.b 'Address   Name            NumEntries Address   Length',10,0
  2531. .Fmt0
  2532.  dc.b '$%08lx %-20.20s %5ld',10,0
  2533. .Fmt1
  2534.  dc.b '$%08lx %-20.20s %5ld $%08lx $%08lx',10,0
  2535. .Fmt2
  2536.  dc.b '                                     $%08lx $%08lx',10,0
  2537.  
  2538.     cnop    0,2
  2539.  
  2540. ;------------------------------------------------------------------------------;
  2541.  
  2542. SysIKickTag:
  2543.     lea    .Str(pc),a0        ; string
  2544.     move.l    $0226(a6),a1        ; ptr, KickTagPtr
  2545.     bra    SysIModules
  2546.  
  2547. .Str
  2548.  dc.b 'KICKTAG:',10,0
  2549.     cnop    0,2
  2550.  
  2551. ;------------------------------------------------------------------------------;
  2552.  
  2553. SysIRes:
  2554.     lea    .Str(pc),a0        ; string
  2555.     move.l    $012C(a6),a1        ; ptr, ResModules
  2556.     bra    SysIModules
  2557.  
  2558. .Str
  2559.  dc.b 'RESIDENTS:',10,0
  2560.     cnop    0,2
  2561.  
  2562. ;------------------------------------------------------------------------------;
  2563.  
  2564. SysIModules:
  2565. ;    a0=string
  2566. ;    a1=ptr
  2567.  
  2568.     movem.l    d2-d4/a2-a4,-(sp)
  2569.     lea    -80(sp),sp
  2570.     move.l    sp,a3
  2571.     lea    -20(sp),sp
  2572.     move.l    sp,d4
  2573.     move.l    a1,a2
  2574.  
  2575. ;    move.l    #0,a0            ; string
  2576.     moveq    #1,d0
  2577.     bsr    PutS
  2578.     tst.l    d0
  2579.     beq    .End
  2580.  
  2581.     lea    .Str(pc),a0        ; string
  2582.     moveq    #1,d0
  2583.     bsr    PutS
  2584.     tst.l    d0
  2585.     beq    .End
  2586.  
  2587.     move.l    a2,d0
  2588.     beq    .Ok
  2589.  
  2590. .Loop
  2591.     move.l    (a2)+,d0
  2592.     beq    .Ok
  2593.     bgt    .Put
  2594.  
  2595.     bclr    #31,d0
  2596.     move.l    d0,a2
  2597.     bra    .Loop
  2598.  
  2599. .Put
  2600.     move.l    d0,a4
  2601.     move.l    sp,d3
  2602.  
  2603.     move.b    $000D(a4),d0        ; rt_Pri
  2604.     ext    d0
  2605.     ext.l    d0
  2606.     move.l    d0,-(sp)
  2607.     moveq    #0,d0
  2608.     move.b    $000C(a4),d0        ; rt_Type
  2609.     bsr    GetTypeString
  2610.     move.l    d0,-(sp)
  2611.     move.b    $000B(a4),d0        ; rt_Version
  2612.     ext    d0
  2613.     ext.l    d0
  2614.     move.l    d0,-(sp)
  2615.     moveq    #0,d0
  2616.     move.b    $000A(a4),d0        ; rt_Flags
  2617.     move.l    d0,-(sp)
  2618.  
  2619.     move.l    d4,a1
  2620.     move.l    $000E(a4),d0        ; rt_Name
  2621.     beq    .Ok2
  2622.     move.l    d0,a0
  2623.  
  2624. .Loop2
  2625.     move.b    (a0)+,d0
  2626.     beq    .Ok2
  2627.     cmp.b    #10,d0
  2628.     beq    .Ok2
  2629.     cmp.b    #13,d0
  2630.     beq    .Ok2
  2631.     move.b    d0,(a1)+
  2632.     bra    .Loop2
  2633.  
  2634. .Ok2
  2635.     clr.b    (a1)
  2636.     move.l    d4,-(sp)
  2637.     move.l    a4,-(sp)
  2638.  
  2639.     lea    .Fmt(pc),a0        ; formatString
  2640.     move.l    sp,a1            ; dataStream
  2641.     move.l    a2,-(sp)
  2642.     lea    PutChProc(pc),a2    ; putChProc
  2643. ;    lea    #0,a3            ; putChData
  2644.     jsr    -$020A(a6)        ; _LVORawDoFmt
  2645.     move.l    (sp)+,a2
  2646.  
  2647.     move.l    a3,a0            ; string
  2648.     moveq    #1,d0
  2649.     bsr    PutS
  2650.     move.l    d3,sp
  2651.     tst.l    d0
  2652.     bne    .Loop
  2653.     bra    .End
  2654.  
  2655. .Ok
  2656.     moveq    #1,d0
  2657.  
  2658. .End
  2659.     lea    100(sp),sp
  2660.     movem.l    (sp)+,d2-d4/a2-a4
  2661.     rts
  2662.  
  2663. .Str
  2664.  dc.b 'Address   Name               Flags Vers Type          Pri',10,0
  2665. .Fmt
  2666.  dc.b '$%08lx %-20.20s $%02lx %4ld %-12s %4ld',10,0
  2667.  
  2668.     cnop    0,2
  2669.  
  2670. ;------------------------------------------------------------------------------;
  2671.  
  2672. FreeInfo:
  2673. ;    a0=info
  2674.  
  2675.     move.l    a2,-(sp)
  2676.     move.l    a0,d0
  2677.     beq    .End
  2678.  
  2679. .Loop
  2680.     move.l    d0,a2
  2681.     move.l    4(a2),a1        ; memoryBlock
  2682.     bsr    OSFreeVec
  2683.     move.l    a2,a1            ; memoryBlock
  2684.     move.l    (a1),a2
  2685.     bsr    OSFreeVec
  2686.     move.l    a2,d0
  2687.     bne    .Loop
  2688.  
  2689. .End
  2690.     move.l    (sp)+,a2
  2691.     rts
  2692.  
  2693. ;------------------------------------------------------------------------------;
  2694.  
  2695. GetIBrd:
  2696.     movem.l    d2/a2/a3,-(sp)
  2697.     moveq    #0,d2
  2698.     sub.l    a2,a2
  2699.  
  2700. .Loop
  2701.     move.l    a2,a0            ; oldConfigDev
  2702.     moveq    #-1,d0            ; manufacturer
  2703.     moveq    #-1,d1            ; product
  2704.     move.l    a6,-(sp)
  2705.     move.l    _ExpansionBase(a5),a6
  2706.     jsr    -$0048(a6)        ; _LVOFindConfigDev
  2707.     move.l    (sp)+,a6
  2708.     tst.l    d0
  2709.     beq    .Ok
  2710.     move.l    d0,a2
  2711.  
  2712.     moveq    #ibrd_sizeof,d0        ; byteSize
  2713.     bsr    GetIAlloc
  2714.     beq    .Err
  2715.  
  2716.     clr.l    ibrd_name(a3)
  2717.     move.l    a2,ibrd_addr(a3)
  2718.     move.b    $000E(a2),ibrd_flags(a3); cd_Flags
  2719.     move.b    $0010(a2),ibrd_ERtype(a3); cd_Rom+er_Type
  2720.     move.b    $0011(a2),ibrd_ERproduct(a3); cd_Rom+er_Product
  2721.     move.b    $0012(a2),ibrd_ERflags(a3); cd_Rom+er_Flags
  2722.     move    $0014(a2),ibrd_ERmanufact(a3); cd_Rom+er_Manufacturer
  2723.     move.l    $0020(a2),ibrd_boardaddr(a3); cd_BoardAddr
  2724.     move.l    $0024(a2),ibrd_boardsize(a3); cd_BoardSize
  2725.     bra    .Loop
  2726.  
  2727. .Err
  2728.     move.l    d2,a0
  2729.     bsr    FreeInfo
  2730.     moveq    #-1,d2
  2731.  
  2732. .Ok
  2733.     move.l    d2,d0
  2734.     movem.l    (sp)+,d2/a2/a3
  2735.     rts
  2736.  
  2737. ;------------------------------------------------------------------------------;
  2738.  
  2739. GetIList:
  2740.     movem.l    d2/a2/a3,-(sp)
  2741.     moveq    #0,d2
  2742.     lea    (a6,d0),a2
  2743.     jsr    -$0084(a6)        ; _LVOForbid
  2744.  
  2745. .Loop
  2746.     move.l    (a2),a2
  2747.     tst.l    (a2)
  2748.     beq    .Ok
  2749.  
  2750.     moveq    #ilib_sizeof,d0        ; byteSize
  2751.     bsr    GetIAlloc
  2752.     beq    .Err
  2753.  
  2754.     move.l    a2,ilib_addr(a3)
  2755.     move.l    $0010(a2),ilib_neg(a3)    ; lib_NegSize/lib_PosSize
  2756.     move.l    $0014(a2),ilib_ver(a3)    ; lib_Revision/lib_Version
  2757.     move    $0020(a2),ilib_opn(a3)    ; lib_OpenCnt
  2758.     move.l    a2,a1            ; address
  2759.     bsr    MyTypeOfMem
  2760.     move.b    d0,ilib_mem(a3)
  2761.     move.b    $0009(a2),ilib_pri(a3)    ; ln_Pri
  2762.  
  2763.     move.l    a2,a0
  2764.     bsr    GetIName
  2765.     move.l    d0,ilib_name(a3)
  2766.     beq    .Loop
  2767.     addq.l    #1,d0
  2768.     bne    .Loop
  2769.  
  2770. .Err
  2771.     jsr    -$008A(a6)        ; _LVOPermit
  2772.     move.l    d2,a0
  2773.     bsr    FreeInfo
  2774.     moveq    #-1,d2
  2775.     bra    .Done
  2776.  
  2777. .Ok
  2778.     jsr    -$008A(a6)        ; _LVOPermit
  2779.  
  2780. .Done
  2781.     move.l    d2,d0
  2782.     movem.l    (sp)+,d2/a2/a3
  2783.     rts
  2784.  
  2785. ;------------------------------------------------------------------------------;
  2786.  
  2787. GetIMem:
  2788.     movem.l    d2/a2/a3,-(sp)
  2789.     moveq    #0,d2
  2790.     lea    $0142(a6),a2        ; MemList
  2791.     jsr    -$0084(a6)        ; _LVOForbid
  2792.  
  2793. .Loop
  2794.     move.l    (a2),a2
  2795.     tst.l    (a2)
  2796.     beq    .Ok
  2797.  
  2798.     moveq    #imem_sizeof,d0        ; byteSize
  2799.     bsr    GetIAlloc
  2800.     beq    .Err
  2801.  
  2802.     move.l    a2,imem_addr(a3)
  2803.     move.l    $0014(a2),imem_lower(a3); mh_Lower
  2804.     move.l    $0018(a2),imem_upper(a3); mh_Upper
  2805.     move    $000E(a2),imem_type(a3)    ; mh_Attributes
  2806.     move.b    $0009(a2),imem_pri(a3)    ; ln_Pri
  2807.  
  2808.     move.l    a2,a0
  2809.     bsr    GetIName
  2810.     move.l    d0,imem_name(a3)
  2811.     beq    .Loop
  2812.     addq.l    #1,d0
  2813.     bne    .Loop
  2814.  
  2815. .Err
  2816.     jsr    -$008A(a6)        ; _LVOPermit
  2817.     move.l    d2,a0
  2818.     bsr    FreeInfo
  2819.     moveq    #-1,d2
  2820.     bra    .Done
  2821.  
  2822. .Ok
  2823.     jsr    -$008A(a6)        ; _LVOPermit
  2824.  
  2825. .Done
  2826.     move.l    d2,d0
  2827.     movem.l    (sp)+,d2/a2/a3
  2828.     rts
  2829.  
  2830. ;------------------------------------------------------------------------------;
  2831.  
  2832. GetIIntr:
  2833.     movem.l    d2-d5/a2/a3,-(sp)
  2834.     moveq    #0,d2
  2835.     moveq    #0,d5
  2836.     lea    $0054(a6),a2        ; IntVects
  2837.     jsr    -$0084(a6)        ; _LVOForbid
  2838.  
  2839. .Loop1
  2840.     lea    .Table(pc),a0
  2841.  
  2842. .Loop2
  2843.     move.b    (a0)+,d0
  2844.     bmi    .Handler
  2845.     cmp.b    d0,d5
  2846.     bne    .Loop2
  2847.  
  2848.     move.l    a2,d4
  2849.     move.l    (a2),d0
  2850.     beq    .Next1
  2851.     move.l    d0,a2
  2852.  
  2853. .Loop3
  2854.     move.l    (a2),a2
  2855.     tst.l    (a2)
  2856.     beq    .Next1
  2857.  
  2858.     moveq    #iintr_sizeof,d0    ; byteSize
  2859.     bsr    GetIAlloc
  2860.  
  2861.     move.l    a2,iintr_addr(a3)
  2862.     move    d5,iintr_num(a3)
  2863.     move.l    $000E(a2),iintr_data(a3); is_Data
  2864.     move.l    $0012(a2),iintr_code(a3); is_Code
  2865.     lea    StrServer(pc),a1
  2866.     move.l    a1,iintr_type(a3)
  2867.     move.b    $0009(a2),iintr_pri(a3)    ; ln_Pri
  2868.  
  2869.     move.l    a2,a0
  2870.     bsr    GetIName
  2871.     moveq    #-1,d1
  2872.     cmp.l    d1,d0
  2873.     beq    .Err
  2874.     move.l    d0,iintr_name(a3)
  2875.     bra    .Loop3
  2876.  
  2877. .Handler
  2878.     move.l    a2,d4
  2879.     tst.l    $0008(a2)
  2880.     beq    .Next1
  2881.  
  2882.     moveq    #iintr_sizeof,d0    ; byteSize
  2883.     bsr    GetIAlloc
  2884.     beq    .Err
  2885.  
  2886.     move    d5,iintr_num(a3)
  2887.     lea    StrHandler(pc),a1
  2888.     move.l    a1,iintr_type(a3)
  2889.     move.l    (a2)+,iintr_data(a3)
  2890.     move.l    (a2)+,iintr_code(a3)
  2891.     move.l    (a2)+,a2
  2892.     move.l    a2,iintr_addr(a3)
  2893.     move.b    $0009(a2),iintr_pri(a3)    ; ln_Pri
  2894.  
  2895.     move.l    a2,a0
  2896.     bsr    GetIName
  2897.     moveq    #-1,d1
  2898.     cmp.l    d1,d0
  2899.     beq    .Err
  2900.     move.l    d0,iintr_name(a3)
  2901.  
  2902. .Next1
  2903.     move.l    d4,a2
  2904.     lea    $000C(a2),a2
  2905.     addq.l    #1,d5
  2906.     cmp    #16,d5
  2907.     bcs    .Loop1
  2908.  
  2909. .Ok
  2910.     jsr    -$008A(a6)        ; _LVOPermit
  2911.  
  2912. .Done
  2913.     move.l    d2,d0
  2914.     movem.l    (sp)+,d2-d5/a2/a3
  2915.     rts
  2916.  
  2917. .Err
  2918.     jsr    -$008A(a6)        ; _LVOPermit
  2919.     move.l    d2,a0
  2920.     bsr    FreeInfo
  2921.     moveq    #-1,d2
  2922.     bra    .Done
  2923.  
  2924. .Table
  2925.     dc.b    3,5,4,13,15,-1
  2926.  
  2927. StrHandler
  2928.     dc.b    'handler',0
  2929.  
  2930. StrServer
  2931.     dc.b    'server',0
  2932.  
  2933.     cnop    0,2
  2934.  
  2935. ;------------------------------------------------------------------------------;
  2936.  
  2937. GetIKickMem:
  2938.     movem.l    d2/d3/a2-a4,-(sp)
  2939.     moveq    #0,d2
  2940.     lea    $0222(a6),a2        ; KickMemPtr
  2941.     jsr    -$0084(a6)        ; _LVOForbid
  2942.  
  2943. .Loop
  2944.     move.l    (a2),d0
  2945.     beq    .Ok
  2946.     move.l    d0,a2
  2947.  
  2948.     moveq    #ikickmem_sizeof,d0    ; byteSize
  2949.     bsr    GetIAlloc
  2950.     beq    .Err
  2951.  
  2952.     move.l    a2,a0
  2953.     bsr    GetIName
  2954.     moveq    #-1,d1
  2955.     cmp.l    d1,d0
  2956.     beq    .Err
  2957.     move.l    d0,ikickmem_name(a3)
  2958.  
  2959.     move.l    a2,ikickmem_addr(a3)
  2960.     move    $000E(a2),d3        ; ml_NumEntries
  2961.     move    d3,ikickmem_num(a3)
  2962.     beq    .Loop
  2963.     lea    $0010(a2),a4        ; ml_ME
  2964.     move.l    (a4)+,ikickmem_start(a3)
  2965.     move.l    (a4)+,ikickmem_size(a3)
  2966.  
  2967. .Loop2
  2968.     subq    #1,d3
  2969.     beq    .Loop
  2970.  
  2971.     moveq    #ikickmem_sizeof,d0    ; byteSize
  2972.     bsr    GetIAlloc
  2973.     beq    .Err
  2974.  
  2975.     move.l    (a4)+,ikickmem_start(a3)
  2976.     move.l    (a4)+,ikickmem_size(a3)
  2977.     bra    .Loop2
  2978.  
  2979. .Err
  2980.     jsr    -$008A(a6)        ; _LVOPermit
  2981.     move.l    d2,a0
  2982.     bsr    FreeInfo
  2983.     moveq    #-1,d2
  2984.     bra    .Done
  2985.  
  2986. .Ok
  2987.     jsr    -$008A(a6)        ; _LVOPermit
  2988.  
  2989. .Done
  2990.     move.l    d2,d0
  2991.     movem.l    (sp)+,d2/d3/a2-a4
  2992.     rts
  2993.  
  2994. ;------------------------------------------------------------------------------;
  2995.  
  2996. GetIAlloc:
  2997. ;    d0=byteSize
  2998. ;    d2=first
  2999. ;    a3=prev
  3000. ; out    d0=success
  3001. ;    d2=first
  3002. ;    a3=prev
  3003.  
  3004. ;    move.l    #0,d0            ; byteSize
  3005.     moveq    #1,d1            ; requirements
  3006.     swap    d1            ; MEMF_CLEAR
  3007.     bsr    OSAllocVec
  3008.     tst.l    d0
  3009.     bne    .Insert
  3010.     rts
  3011.  
  3012. .Insert
  3013.     tst.l    d2
  3014.     beq    .InsertFirst
  3015.     move.l    d0,(a3)
  3016.  
  3017. .InsertOk
  3018.     move.l    d0,a3
  3019.     clr.l    (a3)
  3020.     moveq    #1,d0
  3021.     rts
  3022.  
  3023. .InsertFirst
  3024.     move.l    d0,d2
  3025.     bra    .InsertOk
  3026.  
  3027. ;------------------------------------------------------------------------------;
  3028.  
  3029. GetIName:
  3030. ;    a0=node
  3031.  
  3032.     move.l    a2,-(sp)
  3033.     move.l    a0,a2
  3034.  
  3035.     move.l    $000A(a2),d0        ; ln_Name
  3036.     beq    .Alloc
  3037.     move.l    d0,a0            ; string
  3038.     bsr    StrLen
  3039.  
  3040. .Alloc
  3041.     addq.l    #1,d0            ; byteSize
  3042.     moveq    #1,d1            ; requirements, MEMF_PUBLIC
  3043.     bsr    OSAllocVec
  3044.     tst.l    d0
  3045.     beq    .Err
  3046.  
  3047.     move.l    $000A(a2),a0        ; string, ln_Name
  3048.     move.l    d0,a1            ; dest
  3049.     clr.b    (a1)
  3050.     move.l    a0,d1
  3051.     beq    .End
  3052.     move.l    d0,a2
  3053.     bsr    StrCpy
  3054.  
  3055.     move.l    a2,a0
  3056.     bsr    .Strip
  3057.     move.l    a2,d0
  3058.  
  3059. .End
  3060.     move.l    (sp)+,a2
  3061.     rts
  3062.  
  3063. .Err
  3064.     moveq    #-1,d0
  3065.     bra    .End
  3066.  
  3067. .Strip
  3068.     move.b    (a0)+,d0
  3069.     beq    .StripRts
  3070.     cmp.b    #10,d0
  3071.     beq    .StripOk
  3072.     cmp.b    #13,d0
  3073.     bne    .Strip
  3074.  
  3075. .StripOk
  3076.     clr.b    -(a0)
  3077.  
  3078. .StripRts
  3079.     rts
  3080.  
  3081. ;------------------------------------------------------------------------------;
  3082.  
  3083. GetMemStr:
  3084. ;    d0=attributes
  3085.  
  3086.     lea    .fast(pc),a0
  3087.     btst    #2,d0            ; MEMB_FAST
  3088.     bne    .Ok
  3089.     lea    .chip(pc),a0
  3090.     btst    #1,d0            ; MEMB_CHIP
  3091.     bne    .Ok
  3092.     lea    .slow(pc),a0
  3093.     btst    #0,d0
  3094.     bne    .Ok
  3095.     lea    .chip(pc),a0
  3096.  
  3097. .Ok
  3098.     move.l    a0,d0
  3099.     rts
  3100.  
  3101. .chip            dc.b 'chip',0
  3102. .fast            dc.b 'fast',0
  3103. .slow            dc.b 'slow',0
  3104.     cnop    0,2
  3105.  
  3106. ;------------------------------------------------------------------------------;
  3107.  
  3108. GetKSVer:
  3109.     move    $0014(a6),d0        ; lib_Version
  3110.     move.l    d0,d1
  3111.     swap    d0
  3112.     move    $0022(a6),d0        ; SoftVer
  3113.  
  3114.     cmp    #36,d1
  3115.     bcc    .Rts
  3116.  
  3117. ;SoftVer is zero under KS 1.3
  3118. ;Use rom revision if rom version is same as exec,
  3119. ;else go on with zero.
  3120.  
  3121.     lea    $01000000,a0
  3122.     sub.l    -$0014(a0),a0
  3123.     lea    $000C(a0),a0
  3124.     cmp    (a0)+,d1
  3125.     bne    .Rts
  3126.     move    (a0),d0
  3127.  
  3128. .Rts
  3129.     rts
  3130.  
  3131. ;------------------------------------------------------------------------------;
  3132.  
  3133. ;SetPatchSemaphore:
  3134. ;sps_Sem    = $0000
  3135. ;sps_Private    = $002E
  3136. ;sps_Version    = $003A
  3137. ;sps_Revision    = $003C
  3138.  
  3139. GetSPVer:
  3140.     lea    .s(pc),a1        ; name
  3141.     jsr    -$0084(a6)        ; _LVOForbid
  3142.     jsr    -$0252(a6)        ; _LVOFindSemaphore
  3143.     jsr    -$008A(a6)        ; _LVOPermit
  3144.     tst.l    d0
  3145.     beq    .Rts
  3146.     move.l    d0,a0
  3147.     move.l    $003A(a0),d0        ; sps_Version/sps_Revision
  3148.  
  3149. .Rts
  3150.     rts
  3151.  
  3152. .s
  3153.     dc.b    '½ SetPatch ╗',0
  3154.     cnop    0,2
  3155.  
  3156. ;------------------------------------------------------------------------------;
  3157.  
  3158. GetWBVer:
  3159.     move.l    d2,-(sp)
  3160.  
  3161.     moveq    #-1,d0            ; ptr
  3162.     bsr    SetWindowPtr
  3163.     move.l    d0,d2
  3164.  
  3165.     lea    version_library(pc),a1    ; libName
  3166.     moveq    #0,d0            ; version
  3167.     jsr    -$0228(a6)        ; _LVOOpenLibrary
  3168.  
  3169.     exg.l    d0,d2
  3170.     bsr    SetWindowPtr
  3171.     move.l    d2,d0
  3172.     beq    .Done
  3173.  
  3174.     move.l    d0,a1            ; library
  3175.     move.l    $0014(a1),d2        ; lib_Version/lib_Revision
  3176.     jsr    -$019E(a6)        ; _LVOCloseLibrary
  3177.  
  3178. .Done
  3179.     move.l    d2,d0
  3180.     move.l    (sp)+,d2
  3181.     rts
  3182.  
  3183. ;------------------------------------------------------------------------------;
  3184.  
  3185. GetTypeString:
  3186. ;    d0=type
  3187.  
  3188.     moveq    #19,d1            ; NT_DEATHMESSAGE
  3189.     cmp.l    d1,d0
  3190.     bhi    .Err
  3191.     lea    .s(pc),a0
  3192.     bra    .Next
  3193.  
  3194. .Loop
  3195.     tst.b    (a0)+
  3196.     bne    .Loop
  3197.  
  3198. .Next
  3199.     dbf    d0,.Loop
  3200.     move.l    a0,d0
  3201.     rts
  3202.  
  3203. .Err
  3204.     moveq    #0,d0
  3205.     rts
  3206.  
  3207. .s
  3208.     dc.b    'unknown',0
  3209.     dc.b    'task',0
  3210.     dc.b    'interrupt',0
  3211.     dc.b    'device',0
  3212.     dc.b    'msgport',0
  3213.     dc.b    'message',0
  3214.     dc.b    'freemsg',0
  3215.     dc.b    'replymsg',0
  3216.     dc.b    'resource',0
  3217.     dc.b    'library',0
  3218.     dc.b    'memory',0
  3219.     dc.b    'softint',0
  3220.     dc.b    'font',0
  3221.     dc.b    'process',0
  3222.     dc.b    'semaphore',0
  3223.     dc.b    'signalsem',0
  3224.     dc.b    'bootnode',0
  3225.     dc.b    'kickmem',0
  3226.     dc.b    'graphics',0
  3227.     dc.b    'deathmessage',0
  3228.     cnop    0,2
  3229.  
  3230. ;------------------------------------------------------------------------------;
  3231. ;------------------------------------------------------------------------------;
  3232. ;------------------------------------------------------------------------------;
  3233.  
  3234. AddResident:
  3235. ; out    d0=output from MakeCodeResident()
  3236.  
  3237.     movem.l    d2-d4/a2/a3,-(sp)
  3238.     moveq    #127,d4
  3239.  
  3240.     lea    expansion_library(pc),a1; name
  3241.     jsr    -$0060(a6)        ; _LVOFindResident
  3242.     tst.l    d0
  3243.     beq    .PriOk
  3244.     move.l    d0,a0
  3245.     move.b    $000D(a0),d0        ; pri, rt_Pri
  3246.     ext    d0
  3247.     ext.l    d0
  3248.     addq.l    #2,d0
  3249.     cmp.l    d4,d0
  3250.     bgt    .PriOk
  3251.     move.l    d0,d4
  3252.  
  3253. .PriOk
  3254.     lea    Resident(pc),a0        ; code
  3255.     lea    FastExecName(pc),a1    ; name
  3256.     lea    FastExecId(pc),a2    ; idString
  3257.     lea    .Func(pc),a3        ; initFunc
  3258.     move.l    #ResEnd-Resident,d0    ; size
  3259.     moveq    #1,d1            ; flags, RTF_COLDSTART
  3260.     moveq    #2,d2            ; version
  3261.     moveq    #0,d3            ; type
  3262. ;    move.l    #0,d4            ; pri
  3263.     bsr    MakeCodeResident
  3264.  
  3265.     movem.l    (sp)+,d2-d4/a2/a3
  3266.     rts
  3267.  
  3268. .Func
  3269.     move.l    a2,a1
  3270.     moveq    #2,d0
  3271.     move.l    d0,-(a1)
  3272.     move.l    #'FE02',-(a1)
  3273.     st    FlagArray2-Resident(a4)
  3274.     lea    ArgNOEXEC(a5),a0    ; source
  3275.     lea    Arg2NOEXEC-Resident(a4),a1; dest
  3276.     move.l    #Array2End-Array2,d0    ; size
  3277.     jmp    -$0270(a6)        ; _LVOCopyMem
  3278.  
  3279. ;------------------------------------------------------------------------------;
  3280.  
  3281. RemoveFE:
  3282.     lea    FastExecName(pc),a0    ; name
  3283.     lea    .Func(pc),a1        ; func
  3284.     bsr    RemKickPtrs
  3285.     tst.l    d0
  3286.     beq    .None
  3287.  
  3288.     lea    TxtRemoved(pc),a0    ; string
  3289.     moveq    #0,d0
  3290.     bra    PutS
  3291.  
  3292. .None
  3293.     moveq    #5,d0            ; RETURN_WARN
  3294.     move.l    d0,ReturnCode(a5)
  3295.     lea    TxtNothing(pc),a0    ; string
  3296.     moveq    #0,d0
  3297.     bra    PutS
  3298.  
  3299. .Func
  3300. ;    a2=memlist
  3301. ;    a3=name
  3302.  
  3303. ;any name?
  3304.     move.l    $000A(a2),d0        ; ln_Name
  3305.     beq    .Err
  3306.     move.l    d0,a0
  3307.  
  3308. ;installed by FastExec?
  3309.     move.l    a2,a1
  3310.     move.l    -(a1),d0
  3311.     subq.l    #2,d0
  3312.     bne    .Err
  3313.     cmp.l    #'FE02',-(a1)
  3314.     bne    .Err
  3315.  
  3316. ;    move.l    #0,a0            ; string1
  3317.     move.l    a3,a1            ; string2
  3318.     bsr    StrCmp
  3319.     tst.l    d0
  3320.     bne    .Err
  3321.  
  3322.     moveq    #1,d0
  3323.     rts
  3324.  
  3325. .Err
  3326.     moveq    #0,d0
  3327.     rts
  3328.  
  3329. ;------------------------------------------------------------------------------;
  3330.  
  3331. Usage:
  3332.     lea    TxtUsage(pc),a0        ; string
  3333.     moveq    #0,d0
  3334.     bsr    PutS
  3335.     bra    Quit
  3336.  
  3337. ;------------------------------------------------------------------------------;
  3338. ;------------------------------------------------------------------------------;
  3339. ;------------------------------------------------------------------------------;
  3340.  
  3341. ;ASCII To Integer
  3342.  
  3343. AToI:
  3344.     move.l    d2,a1
  3345.     moveq    #0,d0
  3346.     moveq    #0,d1
  3347.  
  3348. .Loop
  3349.     move.b    (a0)+,d1
  3350.     sub.b    #'0',d1
  3351.     cmp.b    #9,d1
  3352.     bhi    .Quit
  3353.  
  3354.     add.l    d0,d0
  3355.     move.l    d0,d2
  3356.     lsl.l    #2,d0
  3357.     add.l    d2,d0
  3358.  
  3359.     add.l    d1,d0
  3360.     bra    .Loop
  3361.  
  3362. .Quit
  3363.     move.l    a1,d2
  3364.     rts
  3365.  
  3366. ;------------------------------------------------------------------------------;
  3367.  
  3368. FindKickMem:
  3369. ;    a0=name
  3370. ; out    d0=memlist
  3371.  
  3372.     movem.l    a2/a3,-(sp)
  3373.     move.l    a0,a3
  3374.     lea    $0222(a6),a2        ; KickMemPtr
  3375.     jsr    -$0084(a6)        ; _LVOForbid
  3376.  
  3377. .Loop
  3378.     move.l    (a2),d0
  3379.     beq    .Quit
  3380.     move.l    d0,a2
  3381.     move.l    $000A(a2),d0        ; ln_Name
  3382.     beq    .Loop
  3383.     move.l    d0,a0            ; string1
  3384.     move.l    a3,a1            ; string2
  3385.     bsr    StrCmp
  3386.     tst.l    d0
  3387.     bne    .Loop
  3388.     move.l    a2,d0
  3389.  
  3390. .Quit
  3391.     jsr    -$008A(a6)        ; _LVOPermit
  3392.     movem.l    (sp)+,a2/a3
  3393.     rts
  3394.  
  3395. ;------------------------------------------------------------------------------;
  3396.  
  3397. ;Hex To Integer
  3398.  
  3399. HToI:
  3400.     moveq    #0,d0
  3401.     moveq    #0,d1
  3402.  
  3403. .Loop
  3404.     move.b    (a0)+,d1
  3405.  
  3406.     cmp.b    #'0',d1
  3407.     bcs    .Rts
  3408.     cmp.b    #'9',d1
  3409.     bhi    .2
  3410.     sub.b    #'0',d1
  3411.     bra    .Next
  3412.  
  3413. .2
  3414.     cmp.b    #'A',d1
  3415.     bcs    .Rts
  3416.     cmp.b    #'F',d1
  3417.     bhi    .3
  3418.     sub.b    #$37,d1
  3419.     bra    .Next
  3420.  
  3421. .3
  3422.     cmp.b    #'a',d1
  3423.     bcs    .Rts
  3424.     cmp.b    #'f',d1
  3425.     bhi    .Rts
  3426.     sub.b    #$57,d1
  3427. ;    bra    .Next
  3428.  
  3429. .Next
  3430.     lsl.l    #4,d0
  3431.     add.l    d1,d0
  3432.     bra    .Loop
  3433.  
  3434. .Rts
  3435.     rts
  3436.  
  3437. ;------------------------------------------------------------------------------;
  3438.  
  3439. InitArp:
  3440.     cmp    #36,$0014(a6)        ; lib_Version
  3441.     bcc    .Ok
  3442.  
  3443.     lea    .Name(pc),a1        ; libName
  3444.     moveq    #33,d0            ; version
  3445.     jsr    -$0228(a6)        ; _LVOOpenLibrary
  3446.     move.l    d0,_ArpBase(a5)
  3447.     bne    .Ok
  3448.  
  3449.     lea    .Txt(pc),a0
  3450.     move.l    a0,d1            ; str
  3451.     bsr    OSPutStr
  3452.  
  3453.     moveq    #0,d0
  3454.     rts
  3455.  
  3456. .Ok
  3457.     moveq    #1,d0
  3458.     rts
  3459.  
  3460. .Name
  3461.     dc.b    'arp.library',0
  3462.  
  3463. .Txt
  3464.     dc.b    'need arp.library V33+',10,0
  3465.     cnop    0,2
  3466.  
  3467. ;------------------------------------------------------------------------------;
  3468.  
  3469. InitKickCheckSum:
  3470.     jsr    -$0264(a6)        ; _LVOSumKickData
  3471.     move.l    d0,$022A(a6)        ; KickCheckSum
  3472.     bra    OSCacheClearU        ; push data cache
  3473.  
  3474. ;------------------------------------------------------------------------------;
  3475.  
  3476. MakeCodeResident:
  3477. ;    a0=code
  3478. ;    a1=name
  3479. ;    a2=idString
  3480. ;    a3=initFunc
  3481. ;    d0=size
  3482. ;    d1=flags
  3483. ;    d2=version
  3484. ;    d3=type
  3485. ;    d4=pri
  3486. ; out    d0=-1:okay, 0:out of memory, >0:already installed module
  3487.  
  3488.     movem.l    d2-d7/a2-a4,-(sp)
  3489.     move.b    d1,d7
  3490.     lsl.l    #8,d7
  3491.     move.b    d2,d7
  3492.     lsl.l    #8,d7
  3493.     move.b    d3,d7
  3494.     lsl.l    #8,d7
  3495.     move.b    d4,d7
  3496.     move.l    a2,d4
  3497.     move.l    a1,d3
  3498.     move.l    a0,d2
  3499.     move.l    a3,d5
  3500.     move.l    d0,d6
  3501.  
  3502. ;resident tag already installed?
  3503.  
  3504.     move.l    a1,a0            ; name
  3505.     bsr    FindKickMem
  3506.     tst.l    d0
  3507.     bne    .End
  3508.  
  3509. ;allocate memory for resident tag
  3510. ;need to allocate sizeof(MemChunk) bytes extra before the tag
  3511. ;at boot time those bytes can be overwritten
  3512. ;allocate another 8 bytes extra for storing id info
  3513.  
  3514.     moveq    #$004E,d0        ; sizeof(MemChunk)+8+sizeof(MemList)+12+sizeof(Resident)
  3515.     add.l    d6,d0            ; byteSize
  3516.     move.l    #$00050401,d1        ; requirements, MEMF_PUBLIC!MEMF_KICK!MEMF_CLEAR!MEMF_REVERSE
  3517.     bsr    OSAllocMem
  3518.     tst.l    d0
  3519.     beq    .End
  3520.     move.l    d0,a2
  3521.     lea    $0010(a2),a2        ; sizeof(MemChunk)+8
  3522.     lea    $0024(a2),a3        ; sizeof(MemList)+12
  3523.     lea    $001A(a3),a4        ; sizeof(Resident)
  3524.  
  3525. ;copy resident module
  3526.  
  3527.     move.l    d2,a0            ; source
  3528.     move.l    a4,a1            ; dest
  3529.     move.l    d6,d0            ; size
  3530.     jsr    -$0276(a6)        ; _LVOCopyMemQuick
  3531.  
  3532. ;special initialization
  3533.  
  3534.     tst.l    d5
  3535.     beq    .InitOk
  3536.     move.l    d5,a1
  3537.     jsr    (a1)
  3538.  
  3539. .InitOk
  3540.     bsr    OSCacheClearU
  3541.  
  3542. ;init resident tag
  3543.  
  3544.     move    #$4AFC,(a3)        ; rt_MatchWord
  3545.     move.l    a3,$0002(a3)        ; rt_MatchTag
  3546.     lea    (a4,d6.l),a0
  3547.     move.l    a0,$0006(a3)        ; rt_EndSkip
  3548.     move.l    d7,$000A(a3)        ; rt_Flags/rt_Version/rt_Type/rt_Pri
  3549.  
  3550.     move.l    d3,d0
  3551.     beq    .Name
  3552.     sub.l    d2,d0
  3553.     add.l    a4,d0
  3554.  
  3555. .Name
  3556.     move.l    d0,$000A(a2)        ; ln_Name
  3557.     move.l    d0,$000E(a3)        ; rt_Name
  3558.  
  3559.     move.l    d4,d0
  3560.     beq    .ID
  3561.     sub.l    d2,d0
  3562.     add.l    a4,d0
  3563.  
  3564. .ID
  3565.     move.l    d0,$0012(a3)        ; rt_IdString
  3566.     move.l    a4,$0016(a3)        ; rt_Init
  3567.  
  3568. ;init MemList for KickMemPtr
  3569.  
  3570.     lea    $000E(a2),a1        ; ml_NumEntries
  3571.     move    #1,(a1)+        ; NumEntries
  3572.     moveq    #-16,d0            ; sizeof(MemChunk)+8
  3573.     add.l    a2,d0
  3574.     move.l    d0,(a1)+        ; Address
  3575.     moveq    #$004E,d0        ; sizeof(MemChunk)+8+sizeof(MemList)+12+sizeof(Resident)
  3576.     add.l    d6,d0
  3577.     move.l    d0,(a1)+        ; Length
  3578.  
  3579. ;init long-word arrary for KickTagPtr
  3580.  
  3581.     addq.l    #4,a1
  3582.     move.l    a3,(a1)+        ; Resident
  3583.  
  3584. ;set KickMemPtr and KickTagPtr
  3585.  
  3586.     move.l    a2,a0            ; ptr
  3587.     bsr    SetKickPtrs
  3588.     moveq    #-1,d0
  3589.  
  3590. .End
  3591.     movem.l    (sp)+,d2-d7/a2-a4
  3592.     rts
  3593.  
  3594. ;------------------------------------------------------------------------------;
  3595.  
  3596. OSAllocMem:
  3597.     cmp    #39,$0014(a6)        ; lib_Version
  3598.     bcs    .Old
  3599.  
  3600. .OS
  3601.     jmp    -$00C6(a6)        ; _LVOAllocMem
  3602.  
  3603. .Old
  3604.     bclr    #10,d1            ; MEMB_KICK
  3605.     beq    .KickOk
  3606.     or    #$0100,d1        ; MEMF_LOCAL
  3607.  
  3608. .KickOk
  3609.     cmp    #36,$0014(a6)        ; lib_Version
  3610.     bcc    .OS
  3611.  
  3612.     bclr    #8,d1            ; MEMB_LOCAL
  3613.     beq    .LocalOk
  3614.     or    #$0002,d1        ; MEMF_CHIP
  3615.  
  3616. .LocalOk
  3617.     btst    #18,d1            ; MEMB_REVERSE
  3618.     bne    .Reverse
  3619.     bsr    .OS
  3620.  
  3621. .Done
  3622.     tst.l    d0
  3623.     beq    .Error
  3624.  
  3625. .Rts
  3626.     rts
  3627.  
  3628. .Error
  3629.     move.l    $0114(a6),a0        ; ThisTask
  3630.     cmp.b    #13,$0008(a0)        ; ln_Type, NT_PROCESS
  3631.     bne    .Rts
  3632.     moveq    #103,d1            ; ERROR_NO_FREE_STORE
  3633.     move.l    d1,$0094(a0)        ; pr_Result2
  3634.     rts
  3635.  
  3636. .Reverse
  3637.     movem.l    d2/d3,-(sp)
  3638.     move.l    d0,d3
  3639.     beq    .End
  3640.  
  3641.     move.l    d1,d2
  3642.     lea    $0142(a6),a0        ; MemList
  3643.     jsr    -$0084(a6)        ; _LVOForbid
  3644.  
  3645. .Loop
  3646.     move.l    (a0),a0            ; mc_Next
  3647.     tst.l    (a0)            ; mc_Next
  3648.     beq    .Err
  3649.  
  3650.     move    $000E(a0),d0        ; mh_Attributes
  3651.     and    d2,d0
  3652.     cmp    d2,d0
  3653.     bne    .Loop
  3654.  
  3655.     cmp.l    $001C(a0),d3        ; mh_Free
  3656.     bhi    .Loop
  3657.  
  3658.     moveq    #0,d1
  3659.     move.l    $0010(a0),d0        ; mh_First
  3660.     beq    .Loop
  3661.  
  3662. .Loop2
  3663.     move.l    d0,a1
  3664.     cmp.l    $0004(a1),d3        ; mc_Next
  3665.     bhi    .Ok2
  3666.     move.l    a1,d1
  3667.  
  3668. .Ok2
  3669.     move.l    (a1),d0            ; mc_Next
  3670.     bne    .Loop2
  3671.     tst.l    d1
  3672.     beq    .Loop
  3673.  
  3674.     move.l    d1,a1
  3675.     move.l    $0004(a1),d0        ; mc_Bytes
  3676.     sub.l    d3,d0
  3677.     and    #-8,d0
  3678.     add.l    d0,a1            ; location
  3679.     move.l    d3,d0            ; byteSize
  3680.     jsr    -$00CC(a6)        ; _LVOAllocAbs
  3681.  
  3682. .Quit
  3683.     jsr    -$008A(a6)        ; _LVOPermit
  3684.     btst    #16,d2            ; MEMB_CLEAR
  3685.     beq    .End
  3686.  
  3687.     moveq    #0,d1
  3688.     move.l    d0,a0
  3689.     addq.l    #7,d3
  3690.     lsr.l    #3,d3
  3691.     move    d3,d2
  3692.     swap    d3
  3693.     bra    .Next
  3694.  
  3695. .Clear
  3696.     move.l    d1,(a0)+
  3697.     move.l    d1,(a0)+
  3698.  
  3699. .Next
  3700.     dbf    d2,.Clear
  3701.     dbf    d3,.Clear
  3702.  
  3703. .End
  3704.     movem.l    (sp)+,d2/d3
  3705.     bra    .Done
  3706.  
  3707. .Err
  3708.     jsr    -$008A(a6)        ; _LVOPermit
  3709.     moveq    #0,d0
  3710.     bra    .End
  3711.  
  3712. ;------------------------------------------------------------------------------;
  3713.  
  3714. OSAllocVec:
  3715.     cmp    #36,$0014(a6)        ; lib_Version
  3716.     bcs    .Old
  3717.     jmp    -$02AC(a6)        ; _LVOAllocVec
  3718.  
  3719. .Old
  3720.     tst.l    d0
  3721.     beq    .Rts
  3722.  
  3723.     addq.l    #4,d0            ; byteSize
  3724.     move.l    d0,-(sp)
  3725.     jsr    -$00C6(a6)        ; _LVOAllocMem
  3726.     move.l    (sp)+,d1
  3727.     tst.l    d0
  3728.     beq    .Rts
  3729.  
  3730.     move.l    d0,a0
  3731.     move.l    d1,(a0)+
  3732.     move.l    a0,d0
  3733.  
  3734. .Rts
  3735.     rts
  3736.  
  3737. ;------------------------------------------------------------------------------;
  3738.  
  3739. OSCheckSignal:
  3740.     cmp    #36,$0014(a6)        ; lib_Version
  3741.     bcs    .Old
  3742.  
  3743.     move.l    a6,-(sp)
  3744.     move.l    _DOSBase(a5),a6
  3745.     jsr    -$0318(a6)        ; _LVOCheckSignal
  3746.     move.l    (sp)+,a6
  3747.     rts
  3748.  
  3749. .Old
  3750.     move.l    d1,-(sp)
  3751.     moveq    #0,d0            ; newSignals
  3752.     jsr    -$0132(a6)        ; _LVOSetSignal
  3753.     and.l    (sp)+,d0
  3754.     rts
  3755.  
  3756. ;------------------------------------------------------------------------------;
  3757.  
  3758. OSCloseLibrary:
  3759.     move.l    a1,d0
  3760.     beq    .Rts
  3761.     jmp    -$019E(a6)        ; _LVOCloseLibrary
  3762.  
  3763. .Rts
  3764.     rts
  3765.  
  3766. ;------------------------------------------------------------------------------;
  3767.  
  3768. OSColdReboot:
  3769.     cmp    #36,$0014(a6)        ; lib_Version
  3770.     bcs    .Old
  3771.     jsr    -$02D6(a6)        ; _LVOColdReboot
  3772.  
  3773. .Old
  3774.     lea    .Func(pc),a5        ; userFunction
  3775.     jsr    -$001E(a6)        ; _LVOSupervisor
  3776.     cnop    0,4
  3777.  
  3778. .Func
  3779.     lea    $01000000,a0
  3780.     sub.l    -$0014(a0),a0
  3781.     move.l    $0004(a0),a0
  3782.     subq.l    #2,a0
  3783.     reset
  3784.     jmp    (a0)
  3785.  
  3786. ;------------------------------------------------------------------------------;
  3787.  
  3788. OSFreeArgs:
  3789.     cmp    #36,$0014(a6)        ; lib_Version
  3790.     bcs    .Rts
  3791.  
  3792.     move.l    a6,-(sp)
  3793.     move.l    _DOSBase(a5),a6
  3794.     jsr    -$035A(a6)        ; _LVOFreeArgs
  3795.     move.l    (sp)+,a6
  3796.  
  3797. .Rts
  3798.     rts
  3799.  
  3800. ;------------------------------------------------------------------------------;
  3801.  
  3802. OSFreeVec:
  3803.     cmp    #36,$0014(a6)        ; lib_Version
  3804.     bcs    .Old
  3805.     jmp    -$02B2(a6)        ; _LVOFreeVec
  3806.  
  3807. .Old
  3808.     move.l    a1,d0
  3809.     beq    .Rts
  3810.     move.l    -(a1),d0        ; byteSize
  3811.     jmp    -$00D2(a6)        ; _LVOFreeMem
  3812.  
  3813. .Rts
  3814.     rts
  3815.  
  3816. ;------------------------------------------------------------------------------;
  3817.  
  3818. OSPutStr:
  3819.     cmp    #36,$0014(a6)        ; lib_Version
  3820.     bcs    .Old
  3821.  
  3822.     move.l    a6,-(sp)
  3823.     move.l    _DOSBase(a5),a6
  3824.     jsr    -$03B4(a6)        ; _LVOPutStr
  3825.     move.l    (sp)+,a6
  3826.     rts
  3827.  
  3828. .Old
  3829.     movem.l    d2/d3/a6,-(sp)
  3830.     move.l    _DOSBase(a5),a6
  3831.     move.l    d1,d2            ; buffer
  3832.     move.l    d2,a0            ; string
  3833.     bsr    StrLen
  3834.     move.l    d0,d3            ; length
  3835.     beq    .Quit
  3836.     jsr    -$003C(a6)        ; _LVOOutput
  3837.     move.l    d0,d1            ; file
  3838.     beq    .Quit
  3839.     jsr    -$0030(a6)        ; _LVOWrite
  3840.  
  3841. .Quit
  3842.     moveq    #0,d0
  3843.     movem.l    (sp)+,d2/d3/a6
  3844.     rts
  3845.  
  3846. ;------------------------------------------------------------------------------;
  3847.  
  3848. OSReadArgs:
  3849.     cmp    #36,$0014(a6)        ; lib_Version
  3850.     bcs    .Old
  3851.  
  3852.     movem.l    d2/a6,-(sp)
  3853.     move.l    _DOSBase(a5),a6
  3854.     jsr    -$031E(a6)        ; _LVOReadArgs
  3855.     tst.l    d0
  3856.     bne    .End
  3857.     jsr    -$0084(a6)        ; _LVOIoErr
  3858.     move.l    d0,d1            ; code
  3859.     moveq    #0,d2            ; header
  3860.     jsr    -$01DA(a6)        ; _LVOPrintFault
  3861.     moveq    #0,d0
  3862.  
  3863. .End
  3864.     movem.l    (sp)+,d2/a6
  3865.     rts
  3866.  
  3867. .Old
  3868.     movem.l    d3/a2/a3/a6,-(sp)
  3869.     move.l    d1,a3
  3870.  
  3871.     movem.l    d0/a0,-(sp)
  3872.     move.l    d1,a0            ; s
  3873.     bsr    StrLen
  3874.     addq.l    #6,d0            ; '...'-'M'+NULL+pad(=3)
  3875.     and    #-4,d0
  3876.     move.l    d0,d3
  3877.     movem.l    (sp)+,d0/a0
  3878.     sub.l    d3,sp
  3879.     move.l    sp,a1
  3880.  
  3881. ;Arp uses /... instead of /M
  3882.  
  3883. .MLoop
  3884.     move.b    (a3)+,d1
  3885.     move.b    d1,(a1)+
  3886.     beq    .MDone
  3887.     cmp.b    #'/',d1
  3888.     bne    .MLoop
  3889.     cmp.b    #'M',(a3)
  3890.     bne    .MLoop
  3891.     addq.l    #1,a3
  3892.     move.b    #'.',(a1)+
  3893.     move.b    #'.',(a1)+
  3894.     move.b    #'.',(a1)+
  3895.     bra    .MLoop
  3896.  
  3897. .MDone
  3898. ;    move.l    #0,a0            ; line
  3899. ;    move.l    #0,d0            ; len
  3900.     sub.l    a1,a1            ; help
  3901.     move.l    d2,a2            ; args
  3902.     move.l    sp,a3            ; tplate
  3903.     move.l    _ArpBase(a5),a6
  3904.     jsr    -$00FC(a6)        ; _LVOGADS
  3905.     tst.l    d0
  3906.     blt    .Err
  3907.     moveq    #1,d0
  3908.  
  3909. .Done
  3910.     add.l    d3,sp
  3911.     movem.l    (sp)+,d3/a2/a3/a6
  3912.     rts
  3913.  
  3914. .Err
  3915.     move.l    (a2),a1            ; string
  3916.     jsr    -$00F0(a6)        ; _LVOPuts
  3917.     moveq    #0,d0
  3918.     bra    .Done
  3919.  
  3920. ;------------------------------------------------------------------------------;
  3921.  
  3922. OSStricmp:
  3923.     cmp    #37,$0014(a6)        ; lib_Version
  3924.     bcs    .Old
  3925.  
  3926.     move.l    a6,-(sp)
  3927.     move.l    _UtilityBase(a5),a6
  3928.     jsr    -$00A2(a6)        ; _LVOStricmp
  3929.     move.l    (sp)+,a6
  3930.     rts
  3931.  
  3932. .Old
  3933.     movem.l    d2/a2/a3,-(sp)
  3934.     move.l    a0,a2
  3935.     move.l    a1,a3
  3936.  
  3937. .Loop
  3938.     move.b    (a2)+,d0
  3939.     beq    .End0
  3940.  
  3941.     bsr    OSToUpper
  3942.     move.b    d0,d2
  3943.     move.b    (a3)+,d0
  3944.     beq    .End1
  3945.  
  3946.     bsr    OSToUpper
  3947.     cmp.b    d0,d2
  3948.     beq    .Loop
  3949.     bcc    .End1
  3950.  
  3951. .End2
  3952.     moveq    #-1,d0
  3953.     bra    .Quit
  3954.  
  3955. .End1
  3956.     moveq    #1,d0
  3957.     bra    .Quit
  3958.  
  3959. .End0
  3960.     tst.b    (a3)
  3961.     bne    .End2
  3962.     moveq    #0,d0
  3963.  
  3964. .Quit
  3965.     movem.l    (sp)+,d2/a2/a3
  3966.     rts
  3967.  
  3968. ;------------------------------------------------------------------------------;
  3969.  
  3970. OSToUpper:
  3971.     cmp    #37,$0014(a6)        ; lib_Version
  3972.     bcs    .Old
  3973.  
  3974.     move.l    a6,-(sp)
  3975.     move.l    _UtilityBase(a5),a6
  3976.     jsr    -$00AE(a6)        ; _LVOToUpper
  3977.     move.l    (sp)+,a6
  3978.     rts
  3979.  
  3980. .Old
  3981.     and.l    #$FF,d0
  3982.  
  3983.     cmp    #'a',d0
  3984.     bcs.s    .Rts
  3985.     cmp    #'z',d0
  3986.     bls.s    .Ok
  3987.  
  3988.     cmp    #'α',d0
  3989.     bcs.s    .Rts
  3990.     cmp    #'≈',d0
  3991.     beq.s    .Rts
  3992.     cmp    #'■',d0
  3993.     bhi.s    .Rts
  3994.  
  3995. .Ok
  3996.     sub    #32,d0
  3997.  
  3998. .Rts
  3999.     rts
  4000.  
  4001. ;------------------------------------------------------------------------------;
  4002.  
  4003. Put:
  4004. ;    a0=buffer
  4005.  
  4006.     movem.l    d2/a2,-(sp)
  4007.     move.l    a0,a2
  4008.  
  4009. .Loop
  4010.     move.l    a2,a0            ; string
  4011.  
  4012. .Loop2
  4013.     cmp.b    #10,(a2)+
  4014.     bne    .Loop2
  4015.     move.b    (a2),d2
  4016.     clr.b    (a2)
  4017.     moveq    #1,d0
  4018.     bsr    PutS
  4019.     move.b    d2,(a2)
  4020.     tst.l    d0
  4021.     beq    .End
  4022.     tst.b    d2
  4023.     bne    .Loop
  4024.     moveq    #1,d0
  4025.  
  4026. .End
  4027.     movem.l    (sp)+,d2/a2
  4028.     rts
  4029.  
  4030. ;------------------------------------------------------------------------------;
  4031.  
  4032. PutChProc:
  4033.     move.b    d0,(a3)+
  4034.     rts
  4035.  
  4036. ;------------------------------------------------------------------------------;
  4037.  
  4038. PutLF:
  4039.     pea    $0A000000
  4040.     move.l    sp,d1            ; str
  4041.     bsr    OSPutStr
  4042.     addq.l    #4,sp
  4043.     rts
  4044.  
  4045. ;------------------------------------------------------------------------------;
  4046.  
  4047. PutS:
  4048. ;    a0=string
  4049. ;    d0=check ctrl-c
  4050. ; out    d0=1:continue/0:break
  4051.  
  4052.     tst.l    d0
  4053.     beq    .Ok
  4054.  
  4055.     moveq    #1,d1            ; mask
  4056.     ror    #4,d1            ; SIGBREAKF_CTRL_C
  4057.     move.l    a0,-(sp)
  4058.     bsr    OSCheckSignal
  4059.     move.l    (sp)+,a0
  4060.     tst.l    d0
  4061.     bne    .Err
  4062.  
  4063. .Ok
  4064.     move.l    a0,d1            ; str
  4065.     bsr    OSPutStr
  4066.     moveq    #1,d0
  4067.     rts
  4068.  
  4069. .Err
  4070.     lea    .Str(pc),a0
  4071.     move.l    a0,d1            ; str
  4072.     bsr    OSPutStr
  4073.     moveq    #5,d0            ; RETURN_WARN
  4074.     move.l    d0,ReturnCode(a5)
  4075.     moveq    #0,d0
  4076.     rts
  4077.  
  4078. .Str
  4079.     dc.b    '***Break',10,0
  4080.     cnop    0,2
  4081.  
  4082. ;------------------------------------------------------------------------------;
  4083.  
  4084. RemKickPtrs:
  4085. ;    a0=name
  4086. ;    a1=func (a2=memlist/a0=name/out d0=remove)
  4087. ; out    d0=memlist
  4088.  
  4089.     movem.l    d2/a2-a4,-(sp)
  4090.     move.l    a1,a4
  4091.     move.l    a0,a3
  4092.     lea    $0222(a6),a2        ; KickMemPtr
  4093.     jsr    -$0084(a6)        ; _LVOForbid
  4094.  
  4095. .Loop
  4096.     move.l    a2,d2
  4097.     move.l    (a2),d0
  4098.     beq    .Quit
  4099.     move.l    d0,a2
  4100.     jsr    (a4)
  4101.     tst.l    d0
  4102.     beq    .Loop
  4103.  
  4104.     move.l    d2,a0
  4105.     move.l    (a2),(a0)        ; make previous point to next
  4106.     move.l    a2,d2
  4107.  
  4108. ;put pointer to end of our array in a2
  4109.  
  4110.     lea    $0010(a2),a2        ; sizeof(MemList)
  4111.  
  4112. .Loop2
  4113.     tst.l    (a2)+
  4114.     bne    .Loop2
  4115.  
  4116. .Loop3
  4117.     tst.l    (a2)+
  4118.     beq    .Ok2
  4119.     bpl    .Loop3
  4120.  
  4121. .Ok2
  4122.     subq.l    #4,a2
  4123.  
  4124. ;find end of our array in kicktagptr list
  4125.  
  4126.     move.l    $0226(a6),d0        ; KickTagPtr
  4127.     beq    .Err
  4128.     move.l    d0,a0
  4129.     sub.l    a1,a1
  4130.  
  4131. .Loop4
  4132.     cmp.l    a2,a0            ; end of our array?
  4133.     beq    .Rem            ; unlink it
  4134.     move.l    (a0)+,d0        ; find next array
  4135.     beq    .Err
  4136.     bpl    .Loop4
  4137.     subq.l    #4,a0
  4138.     move.l    a0,a1            ; save previous array
  4139.     bclr    #31,d0
  4140.     move.l    d0,a0
  4141.     bra    .Loop4
  4142.  
  4143. .Rem
  4144.     move.l    (a2),d0            ; next array
  4145.     move.l    a1,d1            ; were we the first one?
  4146.     beq    .Set            ; yes, set new KickTagPtr
  4147.     move.l    d0,(a1)            ; no, make previous point to next
  4148.     bra    .Ok
  4149.  
  4150. .Set
  4151.     bclr    #31,d0
  4152.     move.l    d0,$0226(a6)        ; KickTagPtr
  4153.  
  4154. .Ok
  4155.     bsr    InitKickCheckSum
  4156.     move.l    d2,d0
  4157.  
  4158. .Quit
  4159.     jsr    -$008A(a6)        ; _LVOPermit
  4160.     movem.l    (sp)+,d2/a2-a4
  4161.     rts
  4162.  
  4163. .Err
  4164.     bsr    InitKickCheckSum
  4165.     moveq    #0,d0
  4166.     bra    .Quit
  4167.  
  4168. ;------------------------------------------------------------------------------;
  4169.  
  4170. SetKickPtrs:
  4171. ;    a0=ptr
  4172. ;a0 points to MemEntry to be set in KickMemPtr
  4173. ;longword right after is zero
  4174. ;then comes long-word array to be set in KickTagPtr
  4175.  
  4176.     movem.l    a2-a4,-(sp)
  4177.  
  4178. ;MemEntry -> a2
  4179.  
  4180.     move.l    a0,a2
  4181.  
  4182. ;long-word array -> a3
  4183.  
  4184.     lea    $0010(a0),a3        ; sizeof(MemList)-8
  4185.  
  4186. .MemLoop
  4187.     tst.l    (a3)+
  4188.     bne    .MemLoop
  4189.  
  4190. ;end of long-word array -> a4
  4191.  
  4192.     move.l    a3,a4
  4193.  
  4194. .ArrayLoop
  4195.     move.l    (a4),d0
  4196.     beq    .ArrayEnd
  4197.     addq.l    #4,a4
  4198.     bclr    #31,d0
  4199.     beq    .ArrayLoop
  4200.     move.l    d0,a4
  4201.     bra    .ArrayLoop
  4202.  
  4203. .ArrayEnd
  4204.     jsr    -$0084(a6)        ; _LVOForbid
  4205.  
  4206. ;link with KickMemPtr
  4207.  
  4208.     move.l    $0222(a6),(a2)        ; KickMemPtr
  4209.     move.l    a2,$0222(a6)        ; KickMemPtr
  4210.  
  4211. ;link with KickTagPtr
  4212.  
  4213.     move.l    $0226(a6),d0        ; KickTagPtr
  4214.     beq    .Tag
  4215.     bset    #31,d0
  4216.     move.l    d0,(a4)
  4217.  
  4218. .Tag
  4219.     move.l    a3,$0226(a6)        ; KickTagPtr
  4220.     bsr    InitKickCheckSum
  4221.     jsr    -$008A(a6)        ; _LVOPermit
  4222.     movem.l    (sp)+,a2-a4
  4223.     rts
  4224.  
  4225. ;------------------------------------------------------------------------------;
  4226.  
  4227. SetWindowPtr:
  4228. ;    d0=ptr
  4229. ; out    d0=old ptr
  4230.  
  4231.     move.l    d0,-(sp)
  4232.     sub.l    a1,a1            ; name
  4233.     jsr    -$0126(a6)        ; _LVOFindTask
  4234.     move.l    d0,a0
  4235.     move.l    $00B8(a0),d0        ; pr_WindowPtr
  4236.     move.l    (sp)+,$00B8(a0)        ; pr_WindowPtr
  4237.     rts
  4238.  
  4239. ;------------------------------------------------------------------------------;
  4240.  
  4241. StrCpy:
  4242. ;    a0=string
  4243. ;    a1=dest
  4244.  
  4245.     move.b    (a0)+,(a1)+
  4246.     bne    StrCpy
  4247.     rts
  4248.  
  4249. ;------------------------------------------------------------------------------;
  4250.  
  4251. StrLen:
  4252. ;    a0=string
  4253. ; out    d0=length
  4254.  
  4255.     move.l    a0,d0
  4256.     addq.l    #1,d0
  4257.  
  4258. .Loop
  4259.     tst.b    (a0)+
  4260.     bne    .Loop
  4261.     sub.l    d0,a0
  4262.     move.l    a0,d0
  4263.     rts
  4264.  
  4265. ;------------------------------------------------------------------------------;
  4266.  
  4267. StrCmp:
  4268. ;    a0=string1
  4269. ;    a1=string2
  4270.  
  4271.     move.b    (a0)+,d0
  4272.     beq    .End0
  4273.     move.b    (a1)+,d1
  4274.     beq    .End1
  4275.     cmp.b    d0,d1
  4276.     beq    StrCmp
  4277.     bcc    .End1
  4278.  
  4279. .End2
  4280.     moveq    #-1,d0
  4281.     rts
  4282.  
  4283. .End1
  4284.     moveq    #1,d0
  4285.     rts
  4286.  
  4287. .End0
  4288.     tst.b    (a1)+
  4289.     bne    .End2
  4290.     moveq    #0,d0
  4291.     rts
  4292.  
  4293. ;------------------------------------------------------------------------------;
  4294.  
  4295. XToI:
  4296.     cmp.b    #'$',(a0)
  4297.     beq    .H
  4298. ;    cmp.b    #'%',(a0)
  4299. ;    beq    .B
  4300.     cmp.b    #'0',(a0)
  4301.     bne    AToI
  4302.     addq.l    #1,a0
  4303.     cmp.b    #'x',(a0)
  4304.     beq    .H
  4305.     cmp.b    #'X',(a0)
  4306.     bne    AToI
  4307.  
  4308. .H
  4309.     addq.l    #1,a0
  4310.     bra    HToI
  4311.  
  4312. ;.B
  4313. ;    addq.l    #1,a0
  4314. ;    bra    BToI
  4315.  
  4316. ;------------------------------------------------------------------------------;
  4317.  
  4318. XToIS:
  4319.     cmp.b    #'+',(a0)+
  4320.     beq    XToI
  4321.     cmp.b    #'-',-(a0)
  4322.     bne    XToI
  4323.     addq.l    #1,a0
  4324.     bsr    XToI
  4325.     neg.l    d0
  4326.     rts
  4327.  
  4328. ;------------------------------------------------------------------------------;
  4329. ;------------------------------------------------------------------------------;
  4330. ;------------------------------------------------------------------------------;
  4331.  
  4332. dos_library        dc.b 'dos.library',0
  4333. utility_library        dc.b 'utility.library',0
  4334. version_library        dc.b 'version.library',0
  4335.  
  4336. TxtAllocMem        dc.b 'Out of memory',10,0
  4337. TxtExec            dc.b 'Exec is already in fast memory',10,0
  4338. TxtAddMem        dc.b 'Bad arguments for ADDMEM option',10,0
  4339. TxtRemoved        dc.b 'Removed',10,0
  4340. TxtNothing        dc.b 'Nothing to remove',10,0
  4341.  
  4342. Str68881        dc.b '68881',0
  4343. Str68882        dc.b '68882',0
  4344. StrFPU40        dc.b '68040 FPU',0
  4345. StrNONE            dc.b 'none',0
  4346.  
  4347. Template
  4348.  dc.b 'SYSINFO/S,REMOVE/S,REBOOT/S,NOEXEC/S,ADDRESS/K,PATCH/S,FASTSSP/S,FASTVBR/S,FASTEXP/S,FASTMEM/S,FASTINT/S,CACHE/K,ADDMEM/K/M',0
  4349.  
  4350. TxtUsage
  4351.  dc.b 'FastExec 2.9 (24.8.97)',10
  4352.  dc.b 'Torbj÷rn A. Andersson.',10
  4353.  dc.b 'Public Domain.',10
  4354.  dc.b 10
  4355.  dc.b 'Usage: FastExec [SYSINFO] [REMOVE] [REBOOT] [NOEXEC] [PATCH]',10
  4356.  dc.b '                [FASTEXP] [FASTSSP] [FASTVBR] [FASTMEM] [FASTINT]',10
  4357.  dc.b '                [CACHE 0xhhhhhhhh] [ADDRESS 0xhhhhhhhh]',10
  4358.  dc.b '                [ADDMEM <base> <size> <attr> <pri> ...]',10
  4359.  dc.b 0
  4360.  
  4361. ;------------------------------------------------------------------------------;
  4362. ;------------------------------------------------------------------------------;
  4363. ;------------------------------------------------------------------------------;
  4364.  
  4365.     END
  4366.  
  4367. ;------------------------------------------------------------------------------;
  4368. ;------------------------------------------------------------------------------;
  4369. ;------------------------------------------------------------------------------;
  4370.