home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / hard / zeusscsi.lha / ZeusSCSI / ConfigMem.asm < prev    next >
Assembly Source File  |  1993-12-21  |  8KB  |  348 lines

  1. ;    ConfigMem.asm - resident module to configure PPI 32bit memory
  2. ;
  3. ;    Written by Michael L. Hitch
  4. ;        Montana State University
  5. ;        osymh@msu.oscs.montana.edu
  6. ;
  7.  
  8.     include    "exec/types.i"
  9.     include    "exec/nodes.i"
  10.     include    "exec/memory.i"
  11.     include    "exec/resident.i"
  12.     include    "exec/execbase.i"
  13.     include    "libraries/configvars.i"
  14.     include    "libraries/expansion.i"
  15.     include    "hardware/cia.i"
  16.     include    "hardware/custom.i"
  17.  
  18.     xref    _LVOAddMemList
  19.     xref    _LVOOpenLibrary
  20.     xref    _LVOCloseLibrary
  21.     xref    _LVOFindConfigDev
  22.     xref    _LVOAllocMem
  23.     xref    _LVOSumKickData
  24.     xref    _LVOForbid
  25.     xref    _LVOPermit
  26.     xref    _LVOSupervisor
  27.     xref    _LVOCacheControl
  28.     xref    _ciaa
  29.     xref    _custom
  30.  
  31.     csect    text
  32. ;
  33. ; Program entry point
  34. ;
  35.     movem.l    d2-d3/a2/a6,-(sp)
  36.     move.l    4,a6
  37. ;
  38. ; *** process command line arguments
  39. ;
  40.     jsr    AddResident(pc)        ; Add program to KickMemPtr list
  41. ;*** check status?
  42. ;
  43.     btst    #AFB_68040,AttnFlags+1(a6)    ; is it 68040?
  44.     bne.s    Init_68040
  45. ; *** 68040 not detected on WB1.3
  46.     cmp.w    #36,LIB_VERSION(a6)        ; check if 2.0 or later
  47.     bge.s    Skip_Init            ; AFB_68040 is valid
  48.     moveq    #AFF_68030!AFF_68020,d0
  49.     and.w    AttnFlags(a6),d0        ; Kludge for WB1.3
  50.     bne.s    Skip_Init
  51. Init_68040:
  52.     lea    myCacheClear(pc),a5
  53.     jsr    _LVOSupervisor(a6)
  54.     moveq    #0,d0
  55.     move.l    #CACRF_EnableD,d1
  56.     jsr    _LVOCacheControl(a6)
  57.     move.l    d0,-(sp)
  58.     jsr    TagInit(pc)
  59.     move.l    d0,d3
  60.     move.l    (sp)+,d0
  61.     move.l    #CACRF_EnableD,d1
  62.     jsr    _LVOCacheControl(a6)
  63.     move.l    d3,d0
  64. Skip_Init:
  65.     movem.l    (sp)+,d2-d3/a2/a6
  66.     rts
  67.  
  68. myCacheClear:
  69.     cpusha    bc
  70.     rte
  71. ;
  72. ;
  73. AddResident
  74.     move.l    KickMemPtr(a6),a0
  75. 1$:
  76.     move.l    a0,d0
  77.     beq.s    NewResident        ; Not found
  78.     move.l    LN_NAME(a0),a1        ; name of this entry
  79.     lea    TagName(pc),a2        ; my name
  80. 2$:
  81.     move.b    (a1)+,d0
  82.     cmp.b    (a2)+,d0
  83.     bne.s    3$
  84.     tst.b    d0
  85.     bne    2$
  86. ; found entry
  87.     moveq    #1,d0
  88.     rts
  89. 3$:
  90.     move.l    (a0),a0            ; Next entry
  91.     bra    1$
  92. ;
  93. ; Layout of memory block
  94. ;    ds.b    8        Overhead space for AllocAbs
  95. ;    ds.b    ML_SIZE        Memory entry list
  96. ;    ds.b    ME_SIZE        Memory entry
  97. ;    ds.b    8        RomTab pointer array
  98. ;    ds.b    nnn        Resident module
  99. ;
  100. KM_RTPTR equ    ML_SIZE+ME_SIZE        ; Location of RomTag pointer array
  101. KM_SIZE    equ    KM_RTPTR+8        ; Size of KickMem info header
  102. ;
  103. NewResident:
  104.     moveq    #KM_SIZE+8,d0        ; size of KickMem header + 8 byte overhead
  105.     add.l    RomTag+6(pc),d0
  106.     sub.l    RomTag+2(pc),d0        ; add length of resident module
  107.     move.l    #MEMF_24BITDMA!MEMF_CLEAR,d1
  108.     jsr    _LVOAllocMem(a6)    ; allocate memory
  109.     tst.l    d0
  110.     bne.s    1$
  111.     moveq    #KM_SIZE+8,d0        ; size of KickMem header + 8 byte overhead
  112.     add.l    RomTag+6(pc),d0
  113.     sub.l    RomTag+2(pc),d0        ; add length of resident module
  114.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  115.     jsr    _LVOAllocMem(a6)    ; allocate memory
  116.     tst.l    d0
  117.     bne.s    1$
  118.     moveq    #2,d0
  119.     rts
  120. 1$:
  121.     move.l    d0,a0            ; a0 = address of allocated memory
  122.     lea    8(a0),a2        ; a2 = address of MemList
  123.     move.b    #NT_MEMORY,LN_TYPE(a2)    ; initialize MemList
  124.     move.w    #1,ML_NUMENTRIES(a2)
  125.     move.l    a0,ML_ME(a2)
  126.     moveq    #KM_SIZE+8,d0        ; size of KickMem header + 8 byte overhead
  127.     move.l    d0,ML_ME+ME_LENGTH(a2)
  128.     move.l    RomTag+6(pc),d0
  129.     sub.l    RomTag+2(pc),d0        ; d0 = length of resident module
  130.     add.l    d0,ML_ME+ME_LENGTH(a2)
  131.     lea    KM_SIZE+8(a0),a0    ; point to RomTag structure
  132.     lea    RomTag(pc),a1
  133.     move.l    a0,d1
  134.     sub.l    a1,d1            ; relocation offset for RomTag addresses
  135.     move.l    a0,KM_RTPTR(a2)        ; RomTag Pointer
  136.     subq.l    #1,d0
  137. 2$:    move.b    (a1)+,(a0)+        ; copy resident module
  138.     dbra    d0,2$
  139.     move.l    KM_RTPTR(a2),a0        ; Point to RomTag structure
  140.     add.l    d1,RT_MATCHTAG(a0)    ; relocate absolute addresses
  141.     add.l    d1,RT_ENDSKIP(a0)
  142.     add.l    d1,RT_NAME(a0)
  143.     add.l    d1,RT_IDSTRING(a0)
  144.     add.l    d1,RT_INIT(a0)
  145.     move.l    RT_NAME(a0),LN_NAME(a2)    ; set MemList name same as RomTag name
  146. ;*** add to KickMemPtr & KickTagPtr
  147.     jsr    _LVOForbid(a6)
  148.     lea    KickMemPtr(a6),a0
  149. 3$:    move.l    (a0),d0
  150.     beq.s    4$
  151.     move.l    d0,a0
  152.     bra    3$
  153. 4$:    tst.l    KickMemPtr(a6)
  154.     beq.s    5$
  155.     move.l    a0,LN_PRED(a2)        ; is this really needed?
  156.     move.l    a2,(a0)
  157.     bra.s    6$
  158. 5$:    move.l    a2,KickMemPtr(a6)
  159. 6$:    move.l    KickTagPtr(a6),d0
  160.     beq.s    7$
  161.     bset    #31,d0
  162.     move.l    d0,KM_RTPTR+4(a2)    ; link to existing RomTag pointer array
  163. 7$:    lea    KM_RTPTR(a2),a0        ; address of our RomTag pointer array
  164.     move.l    a0,KickTagPtr(a6)
  165.     jsr    _LVOSumKickData(a6)
  166.     move.l    d0,KickCheckSum(a6)
  167.     jsr    _LVOPermit(a6)
  168. ;*** call resident initialization routine?
  169.     moveq    #0,d0
  170.     rts
  171. ;
  172.     dc.b    "$VER: ConfigMem 37.4 (19.10.93)",0
  173. ;
  174. ; The resident RomTag structure
  175. ;
  176. RomTag:    dc.w    RTC_MATCHWORD
  177.     dc.l    RomTag
  178.     dc.l    EndModule
  179.     dc.b    RTF_COLDSTART
  180.     dc.b    37
  181.     dc.b    NT_KICKMEM
  182.     dc.b    111
  183.     dc.l    TagName
  184.     dc.l    TagID
  185.     dc.l    TagInit
  186.  
  187. TagName: dc.b    "Config32",0
  188. TagID:    dc.b    "PPI ConfigMem32 37.4 (19.10.93)",$0d,$0a,0
  189. MemName: dc.b    "PPI 32Bit RAM",0
  190. ZeusName: dc.b    "ZEUS 32Bit RAM",0
  191. ;ZeusName2: dc.b    "ZEUS 32Bit RAM ][",0
  192. ExpName: EXPANSIONNAME
  193.     ds.w    0
  194. MemAttr: dc.l    MEMF_LOCAL!MEMF_FAST!MEMF_PUBLIC
  195.  
  196. TagInit:
  197.     movem.l    d2/d3/a2/a4,-(sp)
  198.     lea    _custom,a0            ; Address of custom chip
  199.     move.w    potinp(a0),d0            ; Read register
  200.     ori.w    #$0c00,d0            ; Set output, data = 1
  201.     move.w    d0,potgo(a0)
  202.     moveq    #127,d0
  203. 1$:    dbra    d0,1$
  204.     move.w    potinp(a0),d0            ; Read data
  205.     andi.w    #$0400,d0            ; Test if Mouse right button pressed
  206.     beq.s    SkipMouse            ; Yes, don't check left button
  207.     lea    _ciaa,a0
  208.     btst    #6,ciapra(a0)            ; Test if Mouse left button pressed
  209.     beq.s    TagExit                ; Yes, skip it
  210. SkipMouse:
  211.     btst    #AFB_68040,AttnFlags+1(a6)    ; is it 68040?
  212.     bne.s    Is_68040
  213.     cmp.w    #36,LIB_VERSION(a6)        ; if 2.0 or later
  214.     bge.s    TagExit                ; AFB_68040 is valid
  215. ; *** 68040 not detected on WB1.3
  216.     moveq    #AFF_68030!AFF_68020,d0
  217.     and.w    AttnFlags(a6),d0        ; Kludge for WB1.3
  218.     bne.s    Is_68040
  219. TagExit:
  220.     moveq    #0,d0
  221.     movem.l    (sp)+,d2/d3/a2/a4
  222.     rts
  223.  
  224. Is_68040:
  225.     lea    MemList(a6),a0            ; get address of memory list
  226. Chk_0:    move.l    (a0),d0                ; get next entry
  227.     beq.s    Chk_1                ; End of list
  228.     move.l    d0,a0
  229.     move.l    LN_NAME(a0),a1            ; memory node name
  230.     lea    MemName(pc),a2            ; Check PPI 040 memory
  231.     moveq    #13,d0
  232. 1$:    cmpm.b    (a1)+,(a2)+
  233.     dbne    d0,1$
  234.     beq.s    TagExit                ; matched: already configured
  235.     move.l    LN_NAME(a0),a1
  236.     lea    ZeusName(pc),a2            ; Check Zeus 040 memory
  237.     moveq    #14,d0
  238. 2$:    cmpm.b    (a1)+,(a2)+
  239.     dbne    d0,2$
  240.     beq.s    TagExit                ; matched: already configured
  241.     bra.s    Chk_0
  242. Chk_1:
  243.  
  244. ;
  245. ; Get PP&S board address, read configuration switches
  246. ;
  247.     lea    ExpName(pc),a1            ; open expansion library
  248.     moveq    #0,d0
  249.     jsr    _LVOOpenLibrary(a6)
  250.     tst.l    d0
  251.     beq    TagExit                ; couldn't open library
  252.     move.l    a6,-(sp)
  253.     move.l    d0,a6
  254.     move.l    #2026,d0            ; manufacturer code
  255. ;    move.l    #105,d1                ; product code = PPI 040
  256. ;    move.l    #150,d1                ; product code = Zeus 040
  257.     moveq    #-1,d1                ; product code = any
  258.     lea    0,a0
  259.     jsr    _LVOFindConfigDev(a6)
  260.     move.l    a6,a1
  261.     move.l    (sp)+,a6
  262.     move.l    d0,a2
  263.     jsr    _LVOCloseLibrary(a6)
  264.     move.l    a2,d0
  265.     beq    TagExit
  266.     cmpi.b    #150,cd_Rom+er_Product(a2)    ; product code = Zeus 040
  267.     bne    TagExit
  268.     move.l    cd_BoardAddr(a2),a0
  269. ;get flags & compute autoconfig setting
  270. ;**** turn off caching ****
  271.     
  272. ;
  273. ; Need to leave hole if autoconfiguring memory
  274. ;
  275.     lea    $08000000,a0            ; search 32 bit memory area for
  276. Next_32:                    ; installed memory
  277.     move.l    #$aaaaaaaa,d2
  278.     move.l    #$55555555,d3            ; patterns for test
  279. Find_Start:
  280.     move.l    (a0),d0                ; save contents
  281.     move.l    4(a0),d1
  282.     move.l    d2,(a0)                ; write pattern 1
  283.     move.l    d3,4(a0)            ; write pattern 2
  284.     nop
  285.     nop
  286.     cmp.l    (a0),d2                ; compare pattern 1
  287.     bne.s    1$                ; failed
  288.     cmp.l    4(a0),d3            ; compare pattern 2
  289.     beq.s    Found_Start            ; found start of memory
  290. 1$:
  291.     move.l    d0,(a0)
  292.     move.l    d1,4(a0)
  293.     add.l    #$00100000,a0            ; test on 1Meg boundary
  294.     cmp.l    #$0a000000,a0            ; at end of region?
  295.     blt    Find_Start
  296. No_More:
  297. ;*** turn caching back on ***
  298.     moveq    #1,d0
  299.     movem.l    (sp)+,d2/d3/a2/a4
  300.     rts
  301.  
  302. Found_Start:
  303.     move.l    d0,(a0)                ; restore original contents
  304.     move.l    d1,4(a0)
  305.     cmp.l    #$0c000000,a2    ;*** Kludge
  306.     beq.s    No_More
  307.     move.l    a0,a2                ; copy memory start
  308. Find_End:
  309.     cmp.l    #$0c000000,a2    ;*** Kludge
  310. ;    cmp.l    #$08100000,a2    ;*** Kludge
  311.     beq.s    Found_End    ;*** Kludge
  312.     move.l    (a2),d0                ; save contents
  313.     move.l    4(a2),d1
  314.     move.l    d2,(a2)                ; write pattern 1
  315.     move.l    d3,4(a2)            ; write pattern 2
  316.     nop
  317.     nop
  318.     cmp.l    (a2),d2                ; compare pattern 1
  319.     bne.s    Found_End            ; failed, at end of region
  320.     cmp.l    4(a2),d3            ; compare pattern 2
  321.     bne.s    Found_End
  322.     move.l    d0,(a2)                ; restore original contents
  323.     move.l    d1,4(a2)
  324.     add.l    #$00100000,a2
  325.     bra    Find_End
  326.  
  327. Found_End:
  328.     move.l    a2,d0                ; compute size
  329.     sub.l    a0,d0
  330.     move.l    MemAttr(pc),d1            ; attributes
  331.     moveq    #30,d2                ; priority
  332. ;    lea    MemName(pc),a1            ; name
  333.     lea    ZeusName(pc),a1            ; name
  334. ;    c