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

  1. ; magic - the fastest copy ever written
  2.  
  3. ; d0 = source drive
  4. ; d1 = target drive
  5. ; d2 = status for traget (0 = dos; 1 = knight hawks)
  6.  
  7. mfm_buffer    =    $40000
  8. codebuffer    =    $50000
  9.  
  10. start:
  11.     move.w    #$0000,$dff180
  12.     btst    #$0a,$dff016
  13.     beq.w    rout
  14.     btst    #$06,$bfe001
  15.     bne.b    start
  16.  
  17.     moveq    #$00,d0
  18.     moveq    #$00,d1
  19.     moveq    #$01,d2
  20.  
  21.     movem.l    d0-d7/a0-a6,-(a7)
  22.     lea    var(pc),a4
  23.     move.w    d0,source-var(a4)
  24.     move.w    d2,write_as-var(a4)
  25.     move.w    #$4000,$dff09a
  26.     bsr.b    zero        ; step both drives to track 0
  27.     bset    #2,$bfd100    ; select lower side (head 0)
  28.  
  29. main_loop:
  30.     bsr.w    choose_source    ; set source drive
  31.     bsr.w    read_track    ; read track and decode from mfm
  32.     bsr.b    code_track    ; code track back to mfm
  33.     bsr.w    write_track    ; write track
  34.  
  35. next:
  36.     bchg    #2,$bfd100    ; next side (head 1)
  37.     not.w    head-var(a4)
  38.     bne.b    nicht_weiter
  39.     addq.w    #1,actual_track-var(a4)
  40.     cmp.w    #80,actual_track-var(a4)
  41.     beq.b    end_of_copy
  42.     bsr.w    choose_source
  43.     bclr    #1,$bfd100
  44.     bsr.w    step_head
  45.  
  46. nicht_weiter:
  47.     bra.b    main_loop
  48.  
  49. end_of_copy:
  50.     move.w    source-var(a4),d1    ;source drive off
  51.     bsr.w    drive_off
  52.     move.w    #$c000,$dff09a        ;irq enable
  53.     movem.l    (a7)+,d0-d7/a0-a6
  54.     bra.w    start
  55.  
  56. rout:
  57.     rts
  58.  
  59. zero:
  60.     move.w    source-var(a4),d1
  61.     bsr.w    drive_on
  62.     bra.w    trackzero
  63.  
  64. code_track:
  65.     movem.l    d0-d3/a2/a3,-(a7)
  66.     lea    mfm_buffer,a2
  67.     move.w    #$3c00/4-1,d0
  68.  
  69. fill_loop:
  70.     move.l    #$aaaaaaaa,(a2)+
  71.     dbf    d0,fill_loop
  72.     lea    mfm_buffer+$680,a2
  73.     lea    codebuffer,a3
  74.     moveq    #11,d0
  75.     moveq    #0,d1
  76.     move.w    actual_track-var(a4),d2
  77.     lsl.w    #1,d2
  78.     tst.w    head-var(a4)
  79.     beq.b    code_loop
  80.     bset    #0,d2
  81.     
  82. code_loop:
  83.     move.w    #$ff00,d3
  84.     tst.w    write_as-var(a4)
  85.     beq.b    dos_format
  86.     move.w    #$4300,d3    ;fremdformatkennung : "c"
  87.  
  88. dos_format:
  89.     or.w    d2,d3
  90.     swap    d3
  91.     move.b    d1,d3
  92.     lsl.w    #8,d3
  93.     move.b    d0,d3
  94.     bsr.b    code_sector
  95.     lea    $440(a2),a2
  96.     lea    $200(a3),a3
  97.     addq.l    #1,d1
  98.     subq.l    #1,d0
  99.     bne.b    code_loop
  100.     movem.l    (a7)+,d0-d3/a2/a3
  101.     rts
  102.  
  103. code_sector:
  104.     movem.l    d0/d1/a0/a3/a5,-(a7)
  105.     moveq    #0,d0
  106.     move.l    a2,a0
  107.     bsr.w    to_mfm        ;nullwort schreiben
  108.     move.l    a2,a0
  109.     move.l    #$44894489,4(a0);sync schreiben
  110.     lea    8(a2),a0
  111.     move.l    d3,d0
  112.     bsr.b    to_mfm        ;sektorheader schreiben
  113.     lea    8(a2),a0
  114.     moveq    #40,d1
  115.     bsr.b    checksum    ;headerchecksum berechnen
  116.     lea    48(a2),a0
  117.     bsr.b    to_mfm        ;und schreiben
  118.     lea    buffer-var(a4),a0
  119.     lea    64(a2),a5
  120.     move.w    #$200/4-1,d1
  121.  
  122. mfm_loop:
  123.     move.l    (a3)+,d0
  124.     bsr.b    to_mfm
  125.     lea    buffer-var(a4),a0
  126.     move.l    (a0),(a5)
  127.     move.l    4(a0),$200(a5)
  128.     addq.l    #4,a5
  129.     dbf    d1,mfm_loop
  130.     lea    64(a2),a0
  131.     move.w    #$400/4-1,d1
  132.  
  133. check_loop:
  134.     bsr.b    check_next
  135.     addq.l    #4,a0
  136.     dbf    d1,check_loop
  137.     lea    64(a2),a0
  138.     move.w    #$400,d1
  139.     bsr.b    checksum
  140.     lea    56(a2),a0
  141.     bsr.b    to_mfm
  142.     movem.l    (a7)+,d0/d1/a0/a3/a5
  143.     rts
  144.  
  145. checksum:
  146.     move.l    d2,-(a7)
  147.     lsr.w    #2,d1
  148.     subq.w    #1,d1
  149.     moveq    #0,d0
  150.  
  151. checksum_loop:
  152.     move.l    (a0)+,d2
  153.     eor.l    d2,d0
  154.     dbf    d1,checksum_loop
  155.     and.l    #$55555555,d0
  156.     move.l    (a7)+,d2
  157.     rts
  158.  
  159. to_mfm:    movem.l    d0-d4,-(a7)
  160.     move.l    #$55555555,d4
  161.     move.l    d0,d3
  162.     lsr.l    #1,d0
  163.     bsr.b    get_taktbits
  164.     move.l    d3,d0
  165.     bsr.b    get_taktbits
  166.     movem.l    (a7)+,d0-d4
  167.     rts
  168.  
  169. get_taktbits:
  170.     and.l    d4,d0
  171.     move.l    d0,d2
  172.     eor.l    d4,d2
  173.     move.l    d2,d1
  174.     lsl.l    #1,d2
  175.     lsr.l    #1,d1
  176.     bset    #31,d1
  177.     and.l    d2,d1
  178.     or.l    d1,d0
  179.     btst    #0,-1(a0)
  180.     beq.b    its_a_zero
  181.     bclr    #31,d0
  182.  
  183. its_a_zero:
  184.     move.l    d0,(a0)+
  185.     rts
  186.  
  187. check_next:
  188.     move.b    (a0),d0
  189.     btst    #0,-1(a0)
  190.     bne.b    clear_7
  191.     btst    #6,d0
  192.     bne.b    ok
  193.     bset    #7,d0
  194.     bra.b    write_d0
  195.  
  196. clear_7:
  197.     bclr    #7,d0
  198.  
  199. write_d0:
  200.     move.b    d0,(a0)
  201. ok:
  202.     rts
  203.  
  204. read_track:
  205.     movem.l    d0-d7/a0-a6,-(a7)
  206.     lea    $dff000,a5
  207.     move.w    #$7f00,$9e(a5)
  208.     move.w    #$9500,$9e(a5)
  209.     move.w    #$4489,$7e(a5)
  210.     move.w    #$4000,$24(a5)
  211.     move.l    #mfm_buffer,$20(a5)
  212.     move.w    #$98c0,$24(a5)
  213.     move.w    #$98c0,$24(a5)
  214.     move.w    #2,$9c(a5)
  215.  
  216. wait_disk:
  217.     btst    #1,$1f(a5)
  218.     beq.b    wait_disk
  219.     move.w    #$4000,$24(a5)    
  220.     move.w    #$0400,$9e(a5)
  221.  
  222.     lea    mfm_buffer,a0
  223.     lea    codebuffer,a1
  224.     move.w    #$000a,d0
  225.  
  226. decode_loop1:
  227.     cmp.w    #$4489,(a0)+
  228.     bne.b    decode_loop1
  229.     cmp.w    #$4489,(a0)
  230.     bne.b    cont
  231.     addq.l    #2,a0
  232.  
  233. cont:
  234.     move.l    #$55555555,d4
  235.     move.l    (a0),d2
  236.     move.l    $0004(a0),d3
  237.     and.w    d4,d2
  238.     and.w    d4,d3
  239.     asl.w    #1,d2
  240.     or.w    d3,d2
  241.     move.w    d2,d3
  242.     and.w    #$ff00,d2
  243.     lsl.w    #1,d2
  244.     move.l    a1,a2
  245.     add.w    d2,a2
  246.     lea    $0038(a0),a0
  247.     moveq    #$7f,d1
  248.  
  249. decode_loop2:
  250.     move.l    $0200(a0),d3
  251.     move.l    (a0)+,d2
  252.     and.l    d4,d2
  253.     and.l    d4,d3
  254.     asl.l    #1,d2
  255.     or.l    d3,d2
  256.     move.l    d2,(a2)+
  257.     dbf    d1,decode_loop2
  258.     lea    $01f8(a0),a0
  259.     dbf    d0,decode_loop1
  260.     movem.l    (a7)+,d0-d7/a0-a6
  261.     rts
  262.  
  263. write_track:
  264.     movem.l    d0-d7/a0-a6,-(a7)
  265.     lea    $dff000,a5
  266.     move.w    #$8210,$96(a5)
  267.     move.w    #$7f00,$9e(a5)
  268.     move.w    #$9100,$9e(a5)
  269.     move.w    #$4000,$24(a5)
  270.     move.l    #mfm_buffer,$20(a5)
  271.     move.w    #$daa2,$24(a5)
  272.     move.w    #$daa2,$24(a5)
  273.     move.w    #2,$9c(a5)
  274.  
  275. wait_disk2:
  276.     btst    #1,$1f(a5)
  277.     beq.b    wait_disk2
  278.     move.w    #$4000,$24(a5)    
  279.     move.w    #$0400,$9e(a5)
  280.     movem.l    (a7)+,d0-d7/a0-a6
  281.     rts
  282.  
  283. drive_on:
  284.     moveq    #1,d0
  285.     bra.b    cont_drive
  286.  
  287. drive_off:
  288.     moveq    #0,d0
  289.  
  290. cont_drive:
  291.     addq.w    #3,d1
  292.     tst.w    d0
  293.     beq.b    drive_out
  294.     move.b    #%11111001,$bfd100
  295.     bclr    #7,$bfd100
  296.     bclr    d1,$bfd100
  297.     rts
  298.  
  299. drive_out:
  300.     bset    d1,$bfd100
  301.     bset    #7,$bfd100
  302.     bclr    d1,$bfd100
  303.     bset    d1,$bfd100
  304.     rts
  305.  
  306. trackzero:
  307.     bset    #1,$bfd100
  308.  
  309. test_zero:
  310.     btst    #4,$bfe001
  311.     beq.b    wait_disk_ready
  312.  
  313. pos_head:
  314.     bsr.b    step_head
  315.     bra.b    test_zero
  316.  
  317. choose_source:
  318.     move.w    d0,-(a7)
  319.     move.w    source-var(a4),d0
  320.  
  321. drive_select:
  322.     or.b    #%01111000,$bfd100
  323.     addq.w    #3,d0
  324.     bclr    d0,$bfd100
  325.     move.w    (a7)+,d0
  326.     rts
  327.  
  328. wait_disk_ready:
  329.     btst    #5,$bfe001
  330.     bne.b    wait_disk_ready
  331.     rts
  332.  
  333. step_head:
  334.     bclr    #0,$bfd100
  335.     bset    #0,$bfd100
  336.  
  337. delay:
  338.     move.w    #$2000,d0
  339.  
  340. delay_loop:
  341.     dbf    d0,delay_loop
  342.     rts
  343.  
  344. var:
  345. to_track:    dc.w 0
  346. drive:        dc.w 0
  347. write_as:    dc.w 0
  348. source:        dc.w 0
  349. target:        dc.w 1
  350. actual_track:    dc.w 0
  351. head:        dc.w 0
  352. buffer:        dc.l 0,0
  353.