home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / util / boot / FastExec25.lha / fastexec.s < prev   
Encoding:
Text File  |  1997-01-18  |  74.3 KB  |  4,434 lines

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