home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / GXY-INF.LHA / infos / bigm-normload.s < prev    next >
Encoding:
Text File  |  1996-03-09  |  6.7 KB  |  368 lines

  1. ùúùúÿüoÿüoÿüoÿüoÿüoÿüoÿüoÿüoÿüo
  2.         incdir    sys:include/
  3.         include    hardware/custom.i
  4.  
  5. ReReads    = 4
  6. ReSeeks    = 2
  7.  
  8. CIAAOffset    = $F01
  9. ICR        = $1C01
  10. CRA        = $1D01
  11. TALO        = $1301
  12. TAHI        = $1401
  13.  
  14.         move.w    intenar+$dff000,-(sp)
  15.         move.w    #$7fff,intena+$dff000
  16.  
  17.         lea    dir,a0
  18.         lea    file,a1
  19.         lea    $c0000,a2
  20.         move.l    #$10000,d0
  21.         bsr.w    loadfile
  22.  
  23.         or.w    #$8000,(sp)
  24.         move.w    (sp)+,intena+$dff000
  25.         rts
  26.  
  27. dir    dc.b    4,"DEVS"
  28. file    dc.b    10,"ALF.DEVICE"
  29.  
  30.  
  31.         * ErrorCodes:
  32.         * D0 = 0 means error, else D0 = destination, D1 = size
  33.         * D1 = 0  : file error
  34.         * D1 = -1 : Error in header checksum
  35.         * D1 = -2 : Error in block checksum
  36.         * D1 = -3 : Track not found error
  37.         * D1 = -4 : Sector not found error
  38.         * D1 = -5 : Sync-word missing error
  39.  
  40. LoadFile:    movem.l    a5/a6,-(SP)
  41.         lea    $bfd100,a5
  42.         lea    $dff000+dsklen,a6
  43.         bsr.w    startmtr
  44.         move.w    #$7f00,adkcon-dsklen(a6)
  45.         move.w    #$8500,adkcon-dsklen(a6)
  46.         move.w    #$4489,dsksync-dsklen(a6)
  47.         lea    root(PC),A4
  48.         movem.l    d0/a0/a1/a2,(filesize-root)(a4)
  49.         tst.b    (rootvalid-root)(a4)
  50.         bne.b    rootok
  51.  
  52. ReadRoot:    clr.b    (trackvalid-root)(a4)
  53.         move.l    #880,D0
  54.         move.l    (A4),A0
  55.         bsr.w    loadsector
  56.         tst.l    D0
  57.         bmi.w    mainerror
  58.         st    (rootvalid-root)(a4)
  59.  
  60.         move.l    (A4),A0
  61.         move.l    drawer(PC),A1
  62.         tst.l    (drawer-root)(A4)
  63.         beq.b    .skipdrawer
  64.         bsr.w    seekhash
  65.         tst.l    D0
  66.         beq.w    mainerror
  67.         move.l    buffer(PC),A0
  68.         move.l    drawer(PC),A3
  69.         bsr.w    seekheader
  70.         tst.l    D0
  71.         beq.w    mainerror
  72. .SkipDrawer:    move.l    filename(PC),A1
  73.         bsr.w    seekhash
  74.         tst.l    D0
  75.         beq.w    mainerror
  76.         bra.b    seekfile
  77.  
  78. RootOk:        move.l    (A4),A0
  79.         move.l    drawer(PC),A1
  80.         tst.l    (drawer-root)(A4)
  81.         beq.b    .skipdrawer
  82.         bsr.w    seekhash
  83.         tst.l    D0
  84.         beq.b    readroot
  85.         move.l    buffer(PC),A0
  86.         move.l    drawer(PC),A3
  87.         bsr.b    seekheader
  88.         tst.l    D0
  89.         beq.b    readroot
  90. .SkipDrawer:    move.l    filename(PC),A1
  91.         bsr.w    seekhash
  92.         tst.l    D0
  93.         beq.b    readroot
  94.  
  95. SeekFile:    move.l    buffer(PC),A0
  96.         move.l    filename(PC),A3
  97.         bsr.b    seekheader
  98.         tst.l    D0
  99.         beq.w    mainerror
  100.  
  101.         move.l    324(A0),D0
  102.         cmp.l    filesize(PC),D0
  103.         blo.b    sizeok
  104.         moveq    #1,D0
  105.         bra.w    mainerror
  106. SizeOk:        move.l    D0,(filesize-root)(A4)
  107.         move.l    16(A0),D0
  108.         beq.w    mainerror
  109.         move.l    destination(PC),A3
  110.  
  111. LoadBlocks:    bsr.w    loadsector
  112.         tst.l    D0
  113.         bmi.w    mainerror
  114.         move.w    14(A0),D0
  115.         subq.w    #1,D0
  116.         lea    24(A0),A1
  117. CopyBlock:    move.b    (A1)+,(A3)+
  118.         dbf    D0,copyblock
  119.         move.l    16(A0),D0
  120.         bne.b    loadblocks
  121.         move.l    destination(PC),D0
  122.         move.l    filesize(PC),D1
  123.         bsr.w    stopmtr
  124.         movem.l    (SP)+,a5/a6
  125.         rts
  126.  
  127. SeekHeader:    bsr.w    loadsector    * filename in A3
  128.         tst.l    D0        * sectorbuffer in A0
  129.         bmi.b    mainerror
  130.         lea    432(A0),A1
  131.         move.l    A3,A2
  132.         move.b    (A1)+,D7
  133.         cmp.b    (A2)+,D7
  134.         beq.b    cmpname
  135. NotTheHeader:    move.l    496(A0),D0
  136.         bne.b    seekheader
  137.         rts
  138. CmpName:    move.b    (A1)+,D6
  139.         cmp.b    #"a",D6
  140.         blo.b    caseok
  141.         cmp.b    #"z",D6
  142.         bhi.b    caseok
  143.         sub.b    #32,D6
  144. CaseOk:        cmp.b    (A2)+,D6
  145.         bne.b    nottheheader
  146.         subq.b    #1,D7
  147.         bne.b    cmpname
  148.         moveq    #1,D0
  149.         rts
  150.  
  151. SeekHash:    moveq    #0,D1        * filename in A1
  152.         moveq    #0,D2        * sectorbuffer in A0
  153.         move.b    (A1)+,D1
  154.         move.w    D1,D7
  155.         subq.w    #1,D7
  156. CalcHash:    mulu    #13,D1
  157.         move.b    (A1)+,D2
  158.         add.w    D2,D1
  159.         and.w    #$7FF,D1
  160.         dbf    D7,calchash
  161.         divu    #72,D1
  162.         swap    D1
  163.         add.w    D1,D1
  164.         add.w    D1,D1
  165.         move.l    24(A0,D1.w),D0
  166.         rts
  167.  
  168. MainError:    move.l    D0,D1
  169.         moveq    #0,D0
  170.         bsr.w    stopmtr
  171.         movem.l    (SP)+,a5/a6
  172.         rts
  173.  
  174. Root:        dc.l    $80600
  175. Buffer:        dc.l    $80800
  176. TrackBuffer:    dc.l    $80A00
  177. FileSize:    dc.l    $0
  178. Drawer:        dc.l    $0
  179. FileName:    dc.l    $0
  180. Destination:    dc.l    $0
  181. Unit:        dc.w    3
  182. CurrentTrack:    dc.w    -1
  183. TrackValid:    dc.b    0
  184. RootValid:    dc.b    0
  185. ReReadCount:    dc.w    rereads
  186. ReSeekCount:    dc.w    reseeks
  187.  
  188. LoadSector:    movem.l    D0/A0/A3,-(SP)
  189.         move.w    #rereads,(rereadcount-root)(a4)
  190.         move.w    #reseeks,(reseekcount-root)(a4)
  191. Retry:        divu    #11,D0
  192.         tst.b    (trackvalid-root)(a0)
  193.         beq.b    reread
  194.         cmp.w    currenttrack(pc),D0
  195.         beq.b    sametrack
  196. ReRead:        bsr.w    loadtrack
  197. SameTrack:    swap    D0
  198.         move.l    #$55555555,D2
  199.         move.l    trackbuffer(PC),A1
  200.         lea    $3200(A1),A2
  201.         moveq    #10,D5
  202. SeekSync:    cmp.l    A2,A1
  203.         bhi.b    nosync
  204.         cmp.w    #$4489,(A1)+
  205.         bne.b    seeksync
  206.         cmp.w    #$4489,(A1)+
  207.         beq.b    dualsync
  208.         subq.l    #2,A1
  209. DualSync:    move.l    40(A1),D3
  210.         and.l    D2,D3
  211.         add.l    D3,D3
  212.         move.l    44(A1),D4
  213.         and.l    D2,D4
  214.         or.l    D3,D4
  215.         moveq    #9,D7
  216.         moveq    #0,D6
  217.         move.l    A1,A3
  218. CalcHeaderSum:    move.l    (A3)+,D3
  219.         eor.l    D3,D6
  220.         dbf    D7,calcheadersum
  221.         and.l    D2,D6
  222.         cmp.l    D4,D6
  223.         beq.b    headersumok
  224.         moveq    #-1,D0
  225.         bra.w    testretry
  226. NoSync:        moveq    #-5,D0
  227.         bra.w    testretry
  228.  
  229. HeaderSumOk:    move.b    1(A1),D3
  230.         and.b    D2,D3
  231.         add.b    D3,D3
  232.         move.b    5(A1),D4
  233.         and.b    D2,D4
  234.         or.b    D3,D4
  235.         cmp.b    (currenttrack+1)(PC),D4
  236.         beq.b    trackok
  237.         moveq    #-3,D0
  238.         bra.b    testretry
  239.  
  240. TrackOk:    move.b    2(A1),D3
  241.         and.b    D2,D3
  242.         add.b    D3,D3
  243.         move.b    6(A1),D4
  244.         and.b    D2,D4
  245.         or.b    D3,D4
  246.         cmp.b    D0,D4
  247.         beq.b    foundsector
  248.         lea    1080(A1),A1
  249.         dbf    D5,seeksync
  250.         moveq    #-4,D0
  251.         bra.b    testretry
  252.  
  253. FoundSector:    lea    48(A1),A1
  254.         move.l    (A1)+,D3
  255.         and.l    D2,D3
  256.         add.l    D3,D3
  257.         move.l    (A1)+,D4
  258.         and.l    D2,D4
  259.         or.l    D3,D4
  260.         move.w    #255,D7
  261.         moveq    #0,D6
  262.         move.l    A1,A3
  263. CalcBlockSum:    move.l    (A3)+,D3
  264.         eor.l    D3,D6
  265.         dbf    D7,calcblocksum
  266.         and.l    D2,D6
  267.         cmp.l    D4,D6
  268.         beq.b    blocksumok
  269.         moveq    #-2,D0
  270.         bra.b    testretry
  271.  
  272. BlockSumOk:    moveq    #127,D7
  273.         lea    512(A1),A3
  274. DecodeSector:    move.l    (A1)+,D3
  275.         and.l    D2,D3
  276.         add.l    D3,D3
  277.         move.l    (A3)+,D4
  278.         and.l    D2,D4
  279.         or.l    D3,D4
  280.         move.l    D4,(A0)+
  281.         dbf    D7,decodesector
  282.         moveq    #0,D0
  283. ExitSectorLoad:    movem.l    (SP)+,D7/A0/A3
  284.         rts
  285.  
  286. TestRetry:    subq.w    #1,(rereadcount-root)(a4)
  287.         bmi.b    testreseek
  288.         move.l    (sp),D0
  289.         bra.w    retry
  290. TestReSeek:    subq.w    #1,(reseekcount-root)(a4)
  291.         bmi.b    exitsectorload
  292.         move.l    (sp),D0
  293.         move.w    #rereads,(rereadcount-root)(a4)
  294.         move.w    #-1,(currenttrack-root)(a4)
  295.         bra.w    retry
  296.  
  297. LoadTrack:    move.w    currenttrack(PC),D1
  298.         bge.b    trackisknown
  299.         bset    #1,(A5)
  300.         clr.w    D1
  301. Cyl0Search:    btst    #4,ciaaoffset(A5)
  302.         beq.b    gotcyl0
  303.         bsr.w    step
  304.         bra.b    cyl0search
  305. GotCyl0:    bsr.w    delay
  306.         bsr.w    delay
  307. TrackIsKnown:    move.w    D0,(currenttrack-root)(A4)
  308.         st    (trackvalid-root)(a4)
  309.         lsr.w    #1,D0
  310.         bcc.b    gotoside0
  311.         bclr    #2,(A5)        * goto side 1
  312.         bra.b    sideok
  313. GotoSide0:    bset    #2,(A5)        * goto side 0
  314. SideOk:        lsr.w    #1,D1
  315.         sub.w    D1,D0
  316.         beq.b    readtrack
  317.         bgt.b    inwards
  318.         neg.w    D0
  319.         bset    #1,(A5)        * step out
  320.         bra.b    directionok
  321. Inwards:    bclr    #1,(A5)        * step in
  322. DirectionOk:    subq.w    #1,D0
  323. SeekTrack:    bsr.b    step
  324.         dbf    D0,seektrack
  325.         bsr.b    delay
  326.  
  327. ReadTrack:    bsr.b    delay
  328.         move.w    #$4000,(a6)
  329. TestReady:    btst    #5,ciaaoffset(A5)
  330.         bne.b    testready
  331.         move.l    trackbuffer(pc),dskpt-dsklen(a6)
  332.         move.w    #$9900,(a6)    load 6400 words
  333.         move.w    #$9900,(a6)
  334. WaitForBlock:    btst    #1,(intreqr+1)-dsklen(a6)
  335.         beq.b    waitforblock
  336.         move.w    #$2,intreq-dsklen(a6)
  337.         move.w    #$4000,(a6)
  338.         rts
  339.  
  340. StartMtr:    move.w    unit(pc),d4
  341.         bset    d4,(A5)
  342.         nop
  343.         bclr    #7,(A5)
  344.         nop
  345.         bclr    d4,(A5)
  346.         rts
  347.  
  348. StopMtr:    move.w    unit(pc),d4
  349.         bset    #7,(a5)
  350.         bset    d4,(A5)
  351.         nop
  352.         bclr    d4,(A5)
  353.         nop
  354.         bset    d4,(A5)
  355.         rts
  356.  
  357. Step:        bclr    #0,(A5)
  358.         nop
  359.         bset    #0,(A5)
  360. Delay:        move.b    #$01,icr(A5)
  361.         move.b    #$08,cra(A5)
  362.         move.b    #$80,talo(A5)
  363.         move.b    #$08,tahi(A5)
  364. WaitForDelay:    btst    #0,icr(A5)
  365.         beq.b    waitfordelay
  366.         rts
  367.  
  368.