home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 2 / FFMCD02.bin / new / hard / drivr / zeusscsi / patchzeus.asm < prev    next >
Assembly Source File  |  1993-12-21  |  15KB  |  587 lines

  1. ;    PatchZeus.asm - resident module to patch PPI Zeus SCSI driver
  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    "exec/libraries.i"
  14.     include    "exec/io.i"
  15.     include    "exec/errors.i"
  16.     include    "devices/scsidisk.i"
  17.     include    "libraries/configvars.i"
  18.     include    "libraries/expansion.i"
  19.     include    "hardware/cia.i"
  20.     include    "hardware/custom.i"
  21.  
  22. ;    xref    _LVOOpenLibrary
  23. ;    xref    _LVOCloseLibrary
  24. ;    xref    _LVOFindConfigDev
  25.     xref    _LVOAllocSignal
  26.     xref    _LVOFreeSignal
  27.     xref    _LVOFindTask
  28.     xref    _LVOFindName
  29.     xref    _LVOSignal
  30.     xref    _LVOWait
  31.     xref    _LVOAllocMem
  32.     xref    _LVOSumKickData
  33.     xref    _LVOForbid
  34.     xref    _LVOPermit
  35.     xref    _LVODisable
  36.     xref    _LVOEnable
  37.     xref    _LVOSupervisor
  38.     xref    _ciaa
  39.     xref    _custom
  40.  
  41.     csect    text
  42. ;
  43. ; Program entry point
  44. ;
  45.     movem.l    d2-d3/a2/a5/a6,-(sp)
  46.     move.l    4,a6
  47. ;
  48. ; *** process command line arguments
  49. ;
  50.     jsr    AddResident(pc)        ; Add program to KickMemPtr list
  51. ;*** check status?
  52. ;
  53.     movem.l    (sp)+,d2-d3/a2/a5/a6
  54.     rts
  55. ;
  56. ;
  57. AddResident
  58.     move.l    KickMemPtr(a6),a0
  59. 1$:
  60.     move.l    a0,d0
  61.     beq.s    NewResident        ; Not found
  62.     move.l    LN_NAME(a0),a1        ; name of this entry
  63.     lea    TagName(pc),a2        ; my name
  64. 2$:
  65.     move.b    (a1)+,d0
  66.     cmp.b    (a2)+,d0
  67.     bne.s    3$
  68.     tst.b    d0
  69.     bne    2$
  70. ; found entry
  71.     moveq    #1,d0
  72.     rts
  73. 3$:
  74.     move.l    (a0),a0            ; Next entry
  75.     bra    1$
  76. ;
  77. ; Layout of memory block
  78. ;    ds.b    8        Overhead space for AllocAbs
  79. ;    ds.b    ML_SIZE        Memory entry list
  80. ;    ds.b    ME_SIZE        Memory entry
  81. ;    ds.b    8        RomTab pointer array
  82. ;    ds.b    nnn        Resident module
  83. ;
  84. KM_RTPTR equ    ML_SIZE+ME_SIZE        ; Location of RomTag pointer array
  85. KM_SIZE    equ    KM_RTPTR+8        ; Size of KickMem info header
  86. ;
  87. NewResident:
  88.     moveq    #KM_SIZE+8,d0        ; size of KickMem header + 8 byte overhead
  89.     add.l    RomTag+6(pc),d0
  90.     sub.l    RomTag+2(pc),d0        ; add length of resident module
  91.     move.l    #MEMF_24BITDMA!MEMF_CLEAR,d1
  92.     jsr    _LVOAllocMem(a6)    ; allocate memory
  93.     tst.l    d0
  94.     bne.s    1$
  95.     moveq    #KM_SIZE+8,d0        ; size of KickMem header + 8 byte overhead
  96.     add.l    RomTag+6(pc),d0
  97.     sub.l    RomTag+2(pc),d0        ; add length of resident module
  98.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1
  99.     jsr    _LVOAllocMem(a6)    ; allocate memory
  100.     tst.l    d0
  101.     bne.s    1$
  102.     moveq    #2,d0
  103.     rts
  104. 1$:
  105.     move.l    d0,a0            ; a0 = address of allocated memory
  106.     lea    8(a0),a2        ; a2 = address of MemList
  107.     move.b    #NT_MEMORY,LN_TYPE(a2)    ; initialize MemList
  108.     move.w    #1,ML_NUMENTRIES(a2)
  109.     move.l    a0,ML_ME(a2)
  110.     moveq    #KM_SIZE+8,d0        ; size of KickMem header + 8 byte overhead
  111.     move.l    d0,ML_ME+ME_LENGTH(a2)
  112.     move.l    RomTag+6(pc),d0
  113.     sub.l    RomTag+2(pc),d0        ; d0 = length of resident module
  114.     add.l    d0,ML_ME+ME_LENGTH(a2)
  115.     lea    KM_SIZE+8(a0),a0    ; point to RomTag structure
  116.     lea    RomTag(pc),a1
  117.     move.l    a0,d1
  118.     sub.l    a1,d1            ; relocation offset for RomTag addresses
  119.     move.l    a0,KM_RTPTR(a2)        ; RomTag Pointer
  120.     subq.l    #1,d0
  121. 2$:    move.b    (a1)+,(a0)+        ; copy resident module
  122.     dbra    d0,2$
  123.     move.l    KM_RTPTR(a2),a0        ; Point to RomTag structure
  124.     add.l    d1,RT_MATCHTAG(a0)    ; relocate absolute addresses
  125.     add.l    d1,RT_ENDSKIP(a0)
  126.     add.l    d1,RT_NAME(a0)
  127.     add.l    d1,RT_IDSTRING(a0)
  128.     add.l    d1,RT_INIT(a0)
  129.     move.l    RT_NAME(a0),LN_NAME(a2)    ; set MemList name same as RomTag name
  130. ;*** add to KickMemPtr & KickTagPtr
  131.     jsr    _LVOForbid(a6)
  132.     lea    KickMemPtr(a6),a0
  133. 3$:    move.l    (a0),d0
  134.     beq.s    4$
  135.     move.l    d0,a0
  136.     bra    3$
  137. 4$:    tst.l    KickMemPtr(a6)
  138.     beq.s    5$
  139.     move.l    a0,LN_PRED(a2)        ; is this really needed?
  140.     move.l    a2,(a0)
  141.     bra.s    6$
  142. 5$:    move.l    a2,KickMemPtr(a6)
  143. 6$:    move.l    KickTagPtr(a6),d0
  144.     beq.s    7$
  145.     bset    #31,d0
  146.     move.l    d0,KM_RTPTR+4(a2)    ; link to existing RomTag pointer array
  147. 7$:    lea    KM_RTPTR(a2),a0        ; address of our RomTag pointer array
  148.     move.l    a0,KickTagPtr(a6)
  149.     jsr    _LVOSumKickData(a6)
  150.     move.l    d0,KickCheckSum(a6)
  151.     jsr    _LVOPermit(a6)
  152. ;*** call resident initialization routine?
  153.     lea    myClearCache(pc),a5    ; clear caches before executing
  154.     jsr    _LVOSupervisor(a6)    ;    the initialization code
  155.     move.l    KM_RTPTR(a2),a0
  156.     move.l    RT_INIT(a0),a0
  157.     jsr    (a0)            ; Call initialization routine
  158.     moveq    #0,d0
  159.     rts
  160. ;
  161. myClearCache:
  162.     cpusha    bc            ; push and invalid both caches
  163.     rte
  164. ;
  165. ;
  166. ; The resident RomTag structure
  167. ;
  168. RomTag:    dc.w    RTC_MATCHWORD
  169.     dc.l    RomTag
  170.     dc.l    EndModule
  171.     dc.b    RTF_COLDSTART
  172.     dc.b    37
  173.     dc.b    NT_KICKMEM
  174.     dc.b    0
  175.     dc.l    TagName
  176.     dc.l    TagID
  177.     dc.l    TagInit
  178.  
  179. TagName: dc.b    "PatchZeus",0
  180.     dc.b    "$VER: "
  181. TagID:    dc.b    "PatchZeus 1.0 (19.10.93)",$0d,$0a,0
  182. ZeusName: dc.b    "PPSscsi2.device",0
  183. ExpName: EXPANSIONNAME
  184.     ds.w    0
  185.  
  186. PATCHLOC1 equ    $19b0            ; setup prior to starting 53C710 script
  187. PATCHLOC2 equ    $1a38            ; wait for 53C710 completion
  188. PATCHLOC3 equ    $1f88            ; Interrupt - signal completion
  189. PATCHLOC4 equ    $1ff8            ; Interrupt - phase mismatch
  190. PATCHLOC5 equ    $20ee            ; 53C170 setup - set SCNTL0
  191. PATCHLOC6 equ    $210c            ; 53C710 setup - set SIEN
  192. PATCHLOC7 equ    $1d32            ; Interrupt - received interrupt
  193. PATCHLOC8 equ    $28ae            ; SCSIcmd - adjust scsi_Actual
  194. PATCHLOC9 equ    $28a0            ; SCSIcmd - adjust scsi_SenseActual
  195. PATCHLOC10 equ    $0ef0            ; Compare partition name with BSTR name
  196. PATCHLOC11 equ    $1ec0            ; Interrupt - code $ff01
  197. PATCHLOC12 equ    $136c            ; Device Open - return HFERR_NoBoard
  198. PATCHLOC13 equ    $27fc            ; ScsiCmd - return HFERR_BadStatus
  199. PATCHLOC14 equ    $1b5a            ; Sync request period
  200.  
  201. ;
  202. ; Entry when resident module is initialized
  203. ;
  204. TagInit:
  205.     movem.l    d2/d3/a2/a4,-(sp)
  206.     lea    _custom,a0            ; Address of custom chip
  207.     move.w    potinp(a0),d0            ; Read register
  208.     ori.w    #$0c00,d0            ; Set output, data = 1
  209.     move.w    d0,potgo(a0)
  210.     move.w    potinp(a0),d0            ; Read data
  211.     andi.w    #$0400,d0            ; Test if Mouse right button pressed
  212.     beq.s    SkipMouse            ; Yes, don't check left button
  213.     lea    _ciaa,a0
  214.     btst    #6,ciapra(a0)            ; Test if Mouse left button pressed
  215.     beq.s    TagExit                ; Yes, skip it
  216. SkipMouse:
  217.     btst    #AFB_68040,AttnFlags+1(a6)    ; is it 68040?
  218.     bne.s    Is_68040
  219.     cmp.w    #36,LIB_VERSION(a6)        ; if version 2.0 or later
  220.     bge.s    TagExit                ; then AFB_68040 is valid
  221. ; *** 68040 not detected on WB1.3
  222.     moveq    #AFF_68030!AFF_68020,d0
  223.     and.w    AttnFlags(a6),d0        ; Kludge for WB1.3
  224.     bne.s    Is_68040
  225. TagExit:
  226.     moveq    #0,d0
  227.     movem.l    (sp)+,d2/d3/a2/a4
  228.     rts
  229.  
  230. Is_68040:
  231.     lea    DeviceList(a6),a0        ; get address of device list
  232.     lea    ZeusName(pc),a1            ; Device driver name
  233.     jsr    _LVOFindName(a6)        ; Find device driver
  234.     tst.l    d0
  235.     beq    TagExit                ; Didn't find it
  236.     move.l    d0,a2
  237. ;
  238. ; Found device driver;  make sure it's the correct version and validate
  239. ;    the places we are going to patch
  240. ;
  241.     bra.s    debug1            ; ** DEBUG ** nop to enable color changes
  242.     move.w    #$00ff,$00dff180    ; ** DEBUG ** set screen color = cyan
  243.     move.l    #$00800000,d0
  244. delay1:    subq.l    #1,d0
  245.     bgt    delay1
  246.     move.w    #$0888,$00dff180
  247. debug1:
  248.     cmp.w    #98,LIB_REVISION(a2)        ; Check if revision 98
  249.     bne    TagExit                ; Nope, skip it
  250.     move.l    LN_NAME(a2),a4
  251.     lea    -$521(a4),a4            ; Base relative to start of ROM
  252.     cmp.l    #$584f206d,PATCHLOC1(a4)    ; verify patch points
  253.     bne    TagExit
  254.     cmp.l    #$206d0008,PATCHLOC2(a4)
  255.     bne    TagExit
  256.     cmp.l    #$217c0000,PATCHLOC3(a4)
  257.     bne    TagExit
  258.     cmp.l    #$02800000,PATCHLOC4(a4)
  259.     bne    TagExit
  260.     cmp.l    #$117c00cc,PATCHLOC5(a4)
  261.     bne    TagExit
  262.     cmp.l    #$10bc00bf,PATCHLOC6(a4)
  263.     bne    TagExit
  264.     cmp.l    #$02800000,PATCHLOC7(a4)
  265.     bne    TagExit
  266.     cmp.l    #$23680004,PATCHLOC8(a4)
  267.     bne    TagExit
  268.     cmp.l    #$3368001a,PATCHLOC9(a4)
  269.     bne    TagExit
  270.     cmp.l    #$e5802b40,PATCHLOC10(a4)
  271.     bne    TagExit
  272.     cmp.l    #$20280030,PATCHLOC11(a4)
  273.     bne    TagExit
  274.     cmp.l    #$0cad0000,PATCHLOC12(a4)
  275.     bne    TagExit
  276.     cmp.l    #$2b7c0000,PATCHLOC13(a4)
  277.     bne    TagExit
  278.     cmp.l    #$001e0104,PATCHLOC14(a4)
  279.     bne    TagExit
  280.     bra.s    debug2            ; ** DEBUG ** nop to enable color changes
  281.     move.w    #$0f0f,$00dff180    ; ** DEBUG ** set screen color = magenta
  282.     move.l    #$00800000,d0
  283. delay2:    subq.l    #1,d0
  284.     bgt    delay2
  285.     move.w    #$0888,$00dff180
  286. debug2:
  287. ;
  288. ; install patches
  289. ;
  290. ; relocate jumps back into the driver
  291. ;
  292.     move.l    a4,d0
  293.     lea    Patch1end(pc),a0
  294.     move.l    (a0),-(a0)
  295.     add.l    d0,(a0)
  296.     lea    Patch2end(pc),a0
  297.     move.l    (a0),-(a0)
  298.     add.l    d0,(a0)
  299.     lea    Patch3end(pc),a0
  300.     move.l    (a0),-(a0)
  301.     add.l    d0,(a0)
  302.     lea    Patch4end(pc),a0
  303.     move.l    (a0),-(a0)
  304.     add.l    d0,(a0)
  305.     lea    Patch7end(pc),a0
  306.     move.l    (a0),-(a0)
  307.     add.l    d0,(a0)
  308.     lea    Patch8end(pc),a0
  309.     move.l    (a0),-(a0)
  310.     add.l    d0,(a0)
  311.     lea    Patch9end(pc),a0
  312.     move.l    (a0),-(a0)
  313.     add.l    d0,(a0)
  314.     lea    Patch10end(pc),a0
  315.     move.l    (a0),-(a0)
  316.     add.l    d0,(a0)
  317.     lea    Patch11end(pc),a0
  318.     move.l    (a0),-(a0)
  319.     add.l    d0,(a0)
  320.     lea    Patch11end2(pc),a0
  321.     move.l    (a0),-(a0)
  322.     add.l    d0,(a0)
  323.     lea    Patch12end(pc),a0
  324.     move.l    (a0),-(