home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Games / WHDLoad / Extra / wwarp.lha / wwarp / src / cmdc.s next >
Text File  |  2000-08-06  |  12KB  |  660 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    cmdc.s
  3. ;  :Contents.    command c - create
  4. ;  :Author.    Bert Jahn
  5. ;  :EMail.    wepl@whdload.org
  6. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  7. ;  :Version    $Id: cmdc.s 1.3 2000/08/06 12:23:17 jah Exp jah $
  8. ;  :History.    12.06.00 separated from wwarp.asm
  9. ;        28.06.00 adapted for _cmdwork
  10. ;        06.08.00 inter sector gap check improved
  11. ;  :Requires.    OS V37+, MC68020+
  12. ;  :Copyright.    ©1998-2000 Bert Jahn, All Rights Reserved
  13. ;  :Language.    68020 Assembler
  14. ;  :Translator.    Barfly V2.9
  15. ;  :To Do.
  16. ;---------------------------------------------------------------------------*
  17.  
  18. _cmd_create
  19.  
  20.     ;print announcement
  21.         move.l    #MAXTRACKS-1,d0
  22.         moveq    #0,d1
  23. .pa_0        bftst    (gl_tabarg+wtt_tab,GL){d0:1}
  24.         beq    .pa_1
  25.         addq.l    #1,d1
  26. .pa_1        dbf    d0,.pa_0
  27.         move.l    d1,-(a7)
  28.         move.l    (gl_rd_unit,GL),-(a7)
  29.         pea    (gl_filename,GL)
  30.         lea    (_txt_create),a0
  31.         move.l    a7,a1
  32.         bsr    _PrintArgs
  33.         add.w    #12,a7
  34.  
  35.     ;open the device
  36.         move.l    #IOTDF_INDEXSYNC,d0
  37.         lea    (gl_ioi,GL),a0
  38.         bsr    _OpenDevice
  39.         tst.l    d0
  40.         beq    .nodevice
  41.  
  42.     ;set file header
  43.         lea    (gl_headout+wfh_ctime,GL),a0
  44.         move.l    a0,d1
  45.         move.l    (gl_dosbase,GL),a6
  46.         jsr    (_LVODateStamp,a6)
  47.         
  48.     ;main loop
  49.         move.l    #CMDF_OUT,d0        ;flags
  50.         sub.l    a0,a0            ;cbdata
  51.         lea    .tracktable,a1        ;cbtt
  52.         lea    .tracks,a2        ;cbt
  53.         bsr    _cmdwork
  54.  
  55.     ;close device
  56.         lea    (gl_ioi,GL),a0
  57.         bsr    _CloseDevice
  58. .nodevice
  59.         rts
  60.  
  61. .tracktable    lea    (gl_tabarg,GL),a0
  62.         lea    (gl_tabout,GL),a1
  63.         bsr    _copytt
  64.         moveq    #-1,d0
  65.         rts
  66.  
  67. .tracks        move.l    d0,d6                ;D6 = actual track
  68.  
  69.     ;progress output
  70.         lea    (_diskprogress),a0        ;output progress
  71.         move.l    d6,-(a7)
  72.         move.l    a7,a1
  73.         bsr    _PrintArgs
  74.         addq.l    #4,a7
  75.         bsr    _FlushOutput
  76.  
  77.     ;read track
  78.         move.l    (gl_rd_retry,GL),d7        ;D7 = read retries
  79.  
  80. .retryloop
  81.  
  82.     ;check CTRL-C pressed
  83.         bsr    _CheckBreak            ;check for CTRL-C
  84.         tst.l    d0
  85.         bne    .error
  86.  
  87.     ;read track
  88.         move.l    d6,d0
  89.         bsr    _cmdc_read
  90.         beq    .error
  91.         
  92.         tst.l    (gl_rd_nostd,GL)
  93.         bne    .nonstd
  94.     ;try to decode
  95.         move.l    (gl_rd_bpt,GL),d0
  96.         lsl.l    #3,d0
  97.         move.l    d6,d1
  98.         bsr    _cmdc_decode
  99.         move.w    d0,d4                ;D4 = type
  100.         beq    .nonstd
  101.         move.l    d1,d5                ;D5 = length
  102.         move.w    d2,d3                ;D3 = flags
  103.     ;progress output decoded
  104.         move.w    d4,(gl_trk+wth_type,GL)
  105.         bsr    _gettt
  106.         move.l    d0,-(a7)
  107.         move.l    a0,-(a7)
  108.         lea    (_decoded),a0
  109.         move.l    a7,a1
  110.         bsr    _PrintArgs
  111.         addq.l    #8,a7
  112.     ;write
  113.         bra    .write
  114.  
  115. .nonstd
  116.     ;try to calculate track length
  117.         move.l    (gl_rd_bpt,GL),d0
  118.         bsr    _cmdc_CalcTrackSize
  119.         move.l    d0,d5                ;D5 = length
  120.         beq    .nolen
  121.     ;progress output raw single
  122.         lea    (_trklens),a0
  123.         move.l    d5,d3
  124.         lsr.l    #3,d3                ;bytes
  125.         move.l    d5,d4
  126.         and.l    #7,d4                ;bits
  127.         movem.l    d3-d4,-(a7)
  128.         move.l    a7,a1
  129.         bsr    _PrintArgs
  130.         addq.l    #8,a7
  131.     ;write
  132.         bfclr    ([gl_fastbuf,GL]){d5:7}        ;alignment
  133.         move.w    #TT_RAW,d4            ;D4 = type
  134.         move.w    #TFF_INDEX|TFF_RAWSINGLE,d3    ;D3 = flags
  135.         bra    .write
  136.  
  137. .nolen        subq    #1,d7
  138.         bmi    .writefull
  139.         bsr    _cmdc_movehead
  140.         bra    .retryloop
  141.  
  142. .writefull
  143.     ;progress output raw
  144.         lea    (_trklen),a0
  145.         clr.l    -(a7)
  146.         move.l    (gl_rd_bpt,GL),d5
  147.         move.l    d5,-(a7)
  148.         lsl.l    #3,d5                ;D5 = length
  149.         move.l    a7,a1
  150.         bsr    _PrintArgs
  151.         add.w    #8,a7
  152.     ;write
  153.         move.w    #TT_RAW,d4            ;D4 = type
  154.         move.w    #TFF_INDEX,d3            ;D3 = flags
  155.  
  156.     ;write track
  157. .write        move    d6,(gl_trk+wth_num,GL)
  158.         move    d4,(gl_trk+wth_type,GL)
  159.         move    d3,(gl_trk+wth_flags,GL)
  160.         move.l    d5,(gl_trk+wth_len,GL)
  161.         clr.l    (gl_trk+wth_wlen,GL)
  162.         lea    (gl_trk+wth_sync,GL),a0
  163.         lea    (gl_trk+wth_mask,GL),a1
  164.         move.b    #SYNCLEN-1,d0
  165. .hc        clr.b    (a0)+
  166.         clr.b    (a1)+
  167.         dbf    d0,.hc
  168.         
  169.         moveq    #-1,d0
  170.         rts
  171.  
  172. .error        moveq    #0,d0
  173.         rts
  174.  
  175. ;----------------------------------------
  176. ; read raw mfm track
  177. ; IN:    D0 = UWORD track number
  178. ; OUT:    D0 = BOOL true on success
  179. ;    _fastbuf contains mfm data
  180.  
  181. _cmdc_read
  182.     ;read mfm
  183.         move.l    (gl_ioi,GL),a1
  184.         move.l    (gl_chipbuf,GL),(IO_DATA,a1)
  185.         move.l    d0,(IO_OFFSET,a1)
  186.         move.l    (gl_rd_bpt,GL),(IO_LENGTH,a1)
  187.         move.w    #ETD_RAWREAD,(IO_COMMAND,a1)
  188.         clr.b    (IO_ERROR,a1)
  189.         move.l    (gl_execbase,GL),a6
  190.         jsr    (_LVODoIO,a6)
  191.         move.l    (gl_ioi,GL),a1
  192.         move.b    (IO_ERROR,a1),d0
  193.         bne    .err
  194.     ;copy mfm data to fast mem for better performance
  195.         move.l    (gl_chipbuf,GL),a0
  196.         move.l    (gl_fastbuf,GL),a1
  197.         cmp.l    a0,a1
  198.         beq    .ok
  199.         move.l    (gl_rd_bpt,GL),d0
  200. .cp        move.l    (a0)+,(a1)+
  201.         subq.l    #4,d0
  202.         bcc    .cp
  203.  
  204. .ok        moveq    #-1,d0
  205.         rts
  206.  
  207. .err        lea    (_readdisk),a0
  208.         bsr    _PrintErrorTD
  209.         moveq    #0,d0
  210.         rts
  211.  
  212. ;----------------------------------------
  213. ; try to decode track as known format
  214. ; IN:    D0 = ULONG length of raw mfm-data in bits
  215. ;    D1 = UWORD track number
  216. ;    gl_fastbuf mfm data
  217. ; OUT:    D0 = ULONG track type identified
  218. ;    D1 = ULONG decoded data length in bits!
  219. ;    D2 = ULONG track flags
  220. ;    gl_fastbuf contains decoded data
  221.  
  222. _cmdc_decode    movem.l    d5-d7,-(a7)
  223.  
  224.         move.l    d0,d7
  225.         move.l    d1,d6
  226.         bsr    _cmdc_d_dos
  227.         tst.l    d0
  228.         bne    .std
  229.         move.l    d7,d0
  230.         move.l    d6,d1
  231.         bsr    _cmdc_d_grem
  232.         tst.l    d0
  233.         bne    .grem
  234.         bra    .no
  235.  
  236. .std        move.l    #TT_STD,d0        ;type
  237.         move.l    #$1600,d1        ;length
  238.         moveq    #0,d2            ;flags
  239.         bra    .pack
  240.  
  241. .grem        move.l    #TT_GREM,d0        ;type
  242.         move.l    #$1800,d1        ;length
  243.         moveq    #0,d2            ;flags
  244.  
  245. .pack
  246.     ;all lw's equal
  247.         move.l    (gl_fastbuf,GL),a0
  248.         move.l    d1,d6
  249.         lsr.l    #2,d6
  250.         move.l    (a0)+,d7
  251. .eq        cmp.l    (a0)+,d7
  252.         dbne    d6,.eq
  253.         bne    .neq
  254.         move.l    #4,d1
  255.         or.w    #TFF_LEQ,d2
  256.         bra    .end
  257. .neq
  258.  
  259.     ;each sector with lw's incremented
  260.         cmp.l    #$1600,d1
  261.         bne    .ninc
  262.         move.l    (gl_fastbuf,GL),a0
  263.         lea    ($1600,a0),a1
  264.         moveq    #11-1,d5
  265. .inc2        moveq    #$200/4-2,d6
  266.         move.l    (a0)+,d7
  267.         move.l    d7,(a1)+
  268. .inc        addq.l    #1,d7
  269.         cmp.l    (a0)+,d7
  270.         dbne    d6,.inc
  271.         dbne    d5,.inc2
  272.         bne    .ninc
  273.         moveq    #11-1,d5
  274. .inc3        move.l    -(a1),(-$1600,a1)
  275.         dbf    d5,.inc3
  276.         move.l    #4*11,d1
  277.         or.w    #TFF_SLINC,d2        ;sector long incremented
  278.         bra    .end
  279. .ninc
  280.  
  281. .end        lsl.l    #3,d1            ;length in bits
  282.         movem.l    (a7)+,d5-d7
  283.         rts
  284.  
  285. .no        moveq    #0,d0
  286.         bra    .end
  287.  
  288. ;----------------------------------------
  289. ; decode standard amigados track
  290. ; IN:    D0 = ULONG length of raw mfm-data in bits
  291. ;    D1 = UWORD track number
  292. ;    _fastbuf mfm data
  293. ; OUT:    D0 = BOOL true on success
  294. ;    _fastbuf contains decoded data
  295.  
  296.     NSTRUCTURE    locals,0
  297.         NWORD    lc1_trknum
  298.         NALIGNLONG
  299.         NLABEL    lc1_SIZEOF
  300.  
  301. _cmdc_d_dos    movem.l    d2-d7,-(a7)
  302.         link    LOC,#lc1_SIZEOF
  303.         
  304.         or.w    #$ff00,d1
  305.         move.w    d1,(lc1_trknum,LOC)
  306.  
  307.         move.l    d0,d5            ;D5 = mfm-length
  308.         moveq    #-1,d4            ;D4 = last sync offset
  309.  
  310.     ;search inter sector gap
  311. .search        move.l    d4,d0
  312.         addq.l    #1,d0            ;offset
  313.         move.l    d5,d1            ;buffer length
  314.         move.l    (gl_fastbuf,GL),a0
  315.         lea    (_syncstd),a1        ;44894489...
  316.         bsr    _searchsync
  317.         tst.l    d0
  318.         bmi    .no
  319.  
  320.         tst.l    d4
  321.         bmi    .sd4
  322.         move.l    d0,d1
  323.         sub.l    d4,d1
  324.         cmp.l    #$440*8,d1        ;$440 is standard sector length
  325.         bne    .gap
  326. .sd4        move.l    d0,d4
  327.         bra    .search
  328.  
  329. .gap
  330.     ;d4 = last sector before gap
  331.     ;d0 = first sector after gap
  332.         move.l    d0,d6            ;D6 = first sector
  333.     
  334.     ;check that inter sector gap is set to zeros
  335.         sub.l    d4,d0
  336.         sub.l    #($440-4)*8+33,d0    ;length of gap in bits to check
  337.         bmi    .no
  338.         move.l    #$aaaaaaaa,d3
  339.         move.l    (gl_fastbuf,GL),a0
  340.         bra    .cmpin
  341. .cmp        bfextu    (a0){d6:32},d1
  342.         cmp.l    d1,d3
  343.         bne    .no
  344. .cmpin        subq.l    #4,a0
  345.         sub.l    #32,d0
  346.         bcc    .cmp
  347.         bfextu    (a0){d6:32},d1
  348.         neg.l    d0
  349.         lsl.l    d0,d1
  350.         lsl.l    d0,d3
  351.         cmp.l    d1,d3
  352.         bne    .no
  353.  
  354.     ;check that remaining mfm data is sufficent
  355.         sub.l    d6,d5            ;in bits
  356.         cmp.l    #11*$440*8,d5
  357.         blo    .no
  358.  
  359.     ;decode track
  360.         move.l    #%11111111111,d4    ;D4 = sectors
  361.         move.l    #$55555555,d5        ;D5 = mfm decode
  362.         moveq    #11-1,d7        ;D7 = sector loop count
  363.         move.l    (gl_fastbuf,GL),a0    ;A0 = mfm buffer
  364.         subq.l    #4,a0            ;first $aaaaaaaa
  365.  
  366. .sector        bsr    .getlw
  367.         bclr    #31,d0
  368.         cmp.l    #$2aaaaaaa,d0
  369.         bne    .no
  370.         bsr    .getlw
  371.         cmp.l    #$44894489,d0
  372.         bne    .no
  373.         
  374.         moveq    #0,d3            ;D3 = chksum
  375.  
  376.         bsr    .getlwd            ;sector header
  377.         
  378.         subq.b    #1,d0            ;num sectors before gap
  379.         cmp.b    d7,d0
  380.         bne    .no
  381.         
  382.         lsr.l    #8,d0            ;sector number 0..10
  383.         cmp.b    #10,d0
  384.         bhi    .no
  385.         bclr    d0,d4
  386.         beq    .no            ;same sector again
  387.     ;    move.b    d0,($1600+gl_tmpbuf.w,GL,d7.w)
  388.         moveq    #0,d1
  389.         move.b    d0,d1
  390.         mulu    #$200,d1
  391.         lea    (gl_tmpbuf.w,GL,d1.l),a1
  392.         
  393.         lsr.l    #8,d0            ;track number
  394.         cmp.w    (lc1_trknum,LOC),d0
  395.         bne    .no
  396.  
  397.         moveq    #3,d2
  398. .label        bfextu    (a0){d6:32},d0
  399.         bfextu    (16,a0){d6:32},d1
  400.         eor.l    d0,d3
  401.         eor.l    d1,d3
  402.         and.l    d5,d0
  403.         bne    .no
  404.         and.l    d5,d1
  405.         bne    .no
  406.         addq.l    #4,a0
  407.         dbf    d2,.label
  408.         add.w    #16,a0
  409.  
  410.         move.l    d3,d2
  411.         and.l    d5,d2
  412.         bsr    .getlwd            ;header chksum
  413.         cmp.l    d2,d0
  414.         bne    .no
  415.         
  416.         bsr    .getlwd            ;data chksum
  417.         move.l    d0,d3
  418.  
  419.         moveq    #$200/4-1,d2
  420. .data        bfextu    (a0){d6:32},d0
  421.         bfextu    ($200,a0){d6:32},d1
  422.         eor.l    d0,d3
  423.         and.l    d5,d0
  424.         eor.l    d1,d3
  425.         and.l    d5,d1
  426.         add.l    d0,d0
  427.         addq.l    #4,a0
  428.         or.l    d0,d1
  429.         move.l    d1,(a1)+
  430.         dbf    d2,.data
  431.         add.w    #$200,a0
  432.         
  433.         and.l    d5,d3
  434.         bne    .no
  435.         
  436.         dbf    d7,.sector
  437.         
  438.     ;copy buffer
  439.         move.w    #$1600/4-1,d0
  440.         lea    (gl_tmpbuf,GL),a0
  441.         move.l    (gl_fastbuf,GL),a1
  442. .copy        move.l    (a0)+,(a1)+
  443.         dbf    d0,.copy
  444.         
  445.         moveq    #-1,d0
  446.         bra    .quit
  447.  
  448. .no        moveq    #0,d0
  449.  
  450. .quit        unlk    LOC
  451.         movem.l    (a7)+,d2-d7
  452.         rts
  453.  
  454. .getlw        bfextu    (a0){d6:32},d0
  455.         addq.l    #4,a0
  456.         eor.l    d0,d3
  457.         rts
  458.  
  459. .getlwd        bsr    .getlw
  460.         move.l    d0,d1
  461.         bsr    .getlw
  462.         and.l    d5,d1
  463.         and.l    d5,d0
  464.         add.l    d1,d1
  465.         or.l    d1,d0
  466.         rts
  467.  
  468. ;----------------------------------------
  469. ; decode gremlin track (lotus)
  470. ; IN:    D0 = ULONG length of raw mfm-data in bits
  471. ;    D1 = UWORD track number
  472. ;    _fastbuf mfm data
  473. ; OUT:    D0 = BOOL true on success
  474. ;    _fastbuf contains decoded data
  475.  
  476. _cmdc_d_grem    movem.l    d2-d7,-(a7)
  477.  
  478.         move.l    d0,d5            ;D5 = mfm-length
  479.         move.w    d1,d4            ;D4 = track number
  480.  
  481.     ;search sync
  482.         moveq    #0,d0            ;offset
  483.         move.l    d5,d1            ;buffer length
  484.         move.l    (gl_fastbuf,GL),a0
  485.         lea    (_syncgrem),a1
  486.         bsr    _searchsync
  487.         tst.l    d0
  488.         bmi    .no
  489.  
  490.     ;skip sync(448944894489) and unknown word(5555)
  491.         add.l    #4*16,d0
  492.         move.l    d0,d6            ;offset
  493.         
  494.     ;check that remaining mfm data is sufficent
  495.         sub.l    d6,d5            ;in bits
  496.         cmp.l    #(2*$1800+4)*8,d5
  497.         blo    .no
  498.  
  499.     ;decode track
  500.         move.l    (gl_fastbuf,GL),a0    ;A0 = mfm buffer
  501.         lea    (gl_tmpbuf,GL),a1    ;A1 = decoded
  502.         move.w    #$bff,d7
  503.         move.l    #$55555555,d2
  504.         moveq    #0,d3
  505.  
  506. .loop        bsr    .get
  507.         move.w    d1,(a1)+
  508.         add.w    d1,d3
  509.         dbf    d7,.loop
  510.         
  511.         bsr    .get
  512.         cmp.w    d1,d3
  513.         bne    .no
  514.  
  515.         bsr    .get
  516.         bchg    #0,d1
  517.         cmp.w    d1,d4
  518.         bne    .no
  519.  
  520.     ;copy buffer
  521.         move.w    #$1800/4-1,d0
  522.         lea    (gl_tmpbuf,GL),a0
  523.         move.l    (gl_fastbuf,GL),a1
  524. .copy        move.l    (a0)+,(a1)+
  525.         dbf    d0,.copy
  526.         
  527.         moveq    #-1,d0
  528.         bra    .quit
  529.  
  530. .no        moveq    #0,d0
  531.  
  532. .quit        movem.l    (a7)+,d2-d7
  533.         rts
  534.  
  535. .get        bfextu    (a0){d6:32},d0
  536.         addq.l    #4,a0
  537.         and.l    d2,d0
  538.         move.w    d0,d1
  539.         swap    d0
  540.         add.w    d1,d1
  541.         add.w    d0,d1
  542.         rts
  543.  
  544. ;----------------------------------------
  545. ; calculate track length if possible
  546. ; IN:    D0 = ULONG length of raw mfm-data in bytes
  547. ;    _fastbuf mfm data
  548. ; OUT:    D0 = ULONG size in bits if successful, otherwise 0
  549.  
  550. _cmdc_CalcTrackSize
  551.         movem.l    d2-d7/a2,-(a7)
  552.  
  553.         move.l    d0,d5            ;D5 = mfm-length
  554.         move.l    (gl_fastbuf,GL),a0    ;A0 = buffer start
  555.         move.l    #MINTRACKLEN*8,d0    ;D0 = actual offset (track size)
  556.  
  557. .s        move.l    a0,a1            ;A1 = actual p1
  558.         move.l    d0,d1
  559.         lsr.l    #5,d1            ;/32
  560.         lsl.l    #2,d1            ;*4
  561.         lea    (a1,d1.l),a2
  562.         
  563. .n        bfextu    (a1){d0:32},d7
  564.         cmp.l    (a1)+,d7
  565.         bne    .ne
  566.         cmp.l    a1,a2
  567.         bhi    .n
  568.         move.l    d0,d1
  569.         and.w    #31,d1            ;how many bits are left to compare ?
  570.         beq    .eq
  571.         bfextu    (a1){d0:d1},d7
  572.         bfextu    (a1){0:d1},d6
  573.         cmp.l    d6,d7
  574.         bne    .ne
  575. .eq        movem.l    (a7)+,_MOVEMREGS
  576.         rts
  577.  
  578. .ne        addq.l    #1,d0
  579.         move.l    d0,d1
  580.         add.l    d1,d1            ;track must fit two times in the raw buffer
  581.         add.l    #7,d1            ;round up
  582.         lsr.l    #3,d1            ;in bytes
  583.         cmp.l    d5,d1
  584.         bls    .s
  585.  
  586.         moveq    #0,d0
  587.         movem.l    (a7)+,_MOVEMREGS
  588.         rts
  589.  
  590. ;----------------------------------------
  591. ; move head
  592. ; IN:    D6 = ULONG actual track
  593. ; OUT:    -
  594.  
  595. _cmdc_movehead
  596.         move.l    d6,d0
  597.         lsr.l    #1,d0            ;cylinder
  598.  
  599.         lea    (.data),a0
  600.         cmp.w    (a0),d6
  601.         beq    .calc
  602. .init
  603.         move.w    d6,(a0)            ;set new track
  604.         clr.w    (2,a0)            ;offset
  605. .calc
  606.         move.w    (2,a0),d1        ;offset
  607.         addq.w    #2,(2,a0)
  608.         cmp.w    #.liste-.list,d1
  609.         beq    .init
  610.         
  611.         add.w    (4,a0,d1.w),d0
  612.         bpl    .1
  613.         moveq    #1,d0
  614. .1        cmp.w    #MAXTRACKS/2,d0
  615.         blo    .2
  616.         move.w    #MAXTRACKS/2-2,d0
  617. .2
  618.  
  619.         move.l    d0,-(a7)
  620.     IFD DEBUG
  621.         lea    .s,a0
  622.         move.l    a7,a1
  623.         bsr    _PrintArgs
  624.         bra    .ss
  625. .s        dc.b    "»%ld",0
  626.     EVEN
  627. .ss
  628.     ELSE
  629.         move.l    #"."<<24,-(a7)
  630.         move.l    a7,a0
  631.         bsr    _Print
  632.         addq.l    #4,a7
  633.     ENDC
  634.         bsr    _FlushOutput
  635.         move.l    (a7)+,d0
  636.  
  637.         mulu    #2*$1600,d0
  638.         add.l    #$1600,d0
  639.  
  640.         move.l    (gl_ioi,GL),a1
  641.         move.l    d0,(IO_OFFSET,a1)
  642.         move.w    #ETD_SEEK,(IO_COMMAND,a1)
  643.         clr.b    (IO_ERROR,a1)
  644.         move.l    (gl_execbase,GL),a6
  645.         jsr    (_LVODoIO,a6)
  646.         move.l    (gl_ioi,GL),a1
  647.         move.b    (IO_ERROR,a1),d0
  648.         bne    .err
  649.  
  650.         rts
  651.  
  652. .err        lea    (_readdisk),a0
  653.         bra    _PrintErrorTD
  654.  
  655. .data        dc.w    -1        ;actual cylinder
  656.         dc.w    0        ;offset in list
  657. .list        dc.w    0,0,1,0,0,0,-1,0
  658. .liste
  659.  
  660.