home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 1 / Mecomp-CD.iso / amiga / tools / wb / fastexec / fastexec.s < prev    next >
Text File  |  1997-06-23  |  67KB  |  4,029 lines

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