home *** CD-ROM | disk | FTP | other *** search
- ; magic - the fastest copy ever written
-
- ; d0 = source drive
- ; d1 = target drive
- ; d2 = status for traget (0 = dos; 1 = knight hawks)
-
- mfm_buffer = $40000
- codebuffer = $50000
-
- start:
- move.w #$0000,$dff180
- btst #$0a,$dff016
- beq.w rout
- btst #$06,$bfe001
- bne.b start
-
- moveq #$00,d0
- moveq #$00,d1
- moveq #$01,d2
-
- movem.l d0-d7/a0-a6,-(a7)
- lea var(pc),a4
- move.w d0,source-var(a4)
- move.w d2,write_as-var(a4)
- move.w #$4000,$dff09a
- bsr.b zero ; step both drives to track 0
- bset #2,$bfd100 ; select lower side (head 0)
-
- main_loop:
- bsr.w choose_source ; set source drive
- bsr.w read_track ; read track and decode from mfm
- bsr.b code_track ; code track back to mfm
- bsr.w write_track ; write track
-
- next:
- bchg #2,$bfd100 ; next side (head 1)
- not.w head-var(a4)
- bne.b nicht_weiter
- addq.w #1,actual_track-var(a4)
- cmp.w #80,actual_track-var(a4)
- beq.b end_of_copy
- bsr.w choose_source
- bclr #1,$bfd100
- bsr.w step_head
-
- nicht_weiter:
- bra.b main_loop
-
- end_of_copy:
- move.w source-var(a4),d1 ;source drive off
- bsr.w drive_off
- move.w #$c000,$dff09a ;irq enable
- movem.l (a7)+,d0-d7/a0-a6
- bra.w start
-
- rout:
- rts
-
- zero:
- move.w source-var(a4),d1
- bsr.w drive_on
- bra.w trackzero
-
- code_track:
- movem.l d0-d3/a2/a3,-(a7)
- lea mfm_buffer,a2
- move.w #$3c00/4-1,d0
-
- fill_loop:
- move.l #$aaaaaaaa,(a2)+
- dbf d0,fill_loop
- lea mfm_buffer+$680,a2
- lea codebuffer,a3
- moveq #11,d0
- moveq #0,d1
- move.w actual_track-var(a4),d2
- lsl.w #1,d2
- tst.w head-var(a4)
- beq.b code_loop
- bset #0,d2
-
- code_loop:
- move.w #$ff00,d3
- tst.w write_as-var(a4)
- beq.b dos_format
- move.w #$4300,d3 ;fremdformatkennung : "c"
-
- dos_format:
- or.w d2,d3
- swap d3
- move.b d1,d3
- lsl.w #8,d3
- move.b d0,d3
- bsr.b code_sector
- lea $440(a2),a2
- lea $200(a3),a3
- addq.l #1,d1
- subq.l #1,d0
- bne.b code_loop
- movem.l (a7)+,d0-d3/a2/a3
- rts
-
- code_sector:
- movem.l d0/d1/a0/a3/a5,-(a7)
- moveq #0,d0
- move.l a2,a0
- bsr.w to_mfm ;nullwort schreiben
- move.l a2,a0
- move.l #$44894489,4(a0);sync schreiben
- lea 8(a2),a0
- move.l d3,d0
- bsr.b to_mfm ;sektorheader schreiben
- lea 8(a2),a0
- moveq #40,d1
- bsr.b checksum ;headerchecksum berechnen
- lea 48(a2),a0
- bsr.b to_mfm ;und schreiben
- lea buffer-var(a4),a0
- lea 64(a2),a5
- move.w #$200/4-1,d1
-
- mfm_loop:
- move.l (a3)+,d0
- bsr.b to_mfm
- lea buffer-var(a4),a0
- move.l (a0),(a5)
- move.l 4(a0),$200(a5)
- addq.l #4,a5
- dbf d1,mfm_loop
- lea 64(a2),a0
- move.w #$400/4-1,d1
-
- check_loop:
- bsr.b check_next
- addq.l #4,a0
- dbf d1,check_loop
- lea 64(a2),a0
- move.w #$400,d1
- bsr.b checksum
- lea 56(a2),a0
- bsr.b to_mfm
- movem.l (a7)+,d0/d1/a0/a3/a5
- rts
-
- checksum:
- move.l d2,-(a7)
- lsr.w #2,d1
- subq.w #1,d1
- moveq #0,d0
-
- checksum_loop:
- move.l (a0)+,d2
- eor.l d2,d0
- dbf d1,checksum_loop
- and.l #$55555555,d0
- move.l (a7)+,d2
- rts
-
- to_mfm: movem.l d0-d4,-(a7)
- move.l #$55555555,d4
- move.l d0,d3
- lsr.l #1,d0
- bsr.b get_taktbits
- move.l d3,d0
- bsr.b get_taktbits
- movem.l (a7)+,d0-d4
- rts
-
- get_taktbits:
- and.l d4,d0
- move.l d0,d2
- eor.l d4,d2
- move.l d2,d1
- lsl.l #1,d2
- lsr.l #1,d1
- bset #31,d1
- and.l d2,d1
- or.l d1,d0
- btst #0,-1(a0)
- beq.b its_a_zero
- bclr #31,d0
-
- its_a_zero:
- move.l d0,(a0)+
- rts
-
- check_next:
- move.b (a0),d0
- btst #0,-1(a0)
- bne.b clear_7
- btst #6,d0
- bne.b ok
- bset #7,d0
- bra.b write_d0
-
- clear_7:
- bclr #7,d0
-
- write_d0:
- move.b d0,(a0)
- ok:
- rts
-
- read_track:
- movem.l d0-d7/a0-a6,-(a7)
- lea $dff000,a5
- move.w #$7f00,$9e(a5)
- move.w #$9500,$9e(a5)
- move.w #$4489,$7e(a5)
- move.w #$4000,$24(a5)
- move.l #mfm_buffer,$20(a5)
- move.w #$98c0,$24(a5)
- move.w #$98c0,$24(a5)
- move.w #2,$9c(a5)
-
- wait_disk:
- btst #1,$1f(a5)
- beq.b wait_disk
- move.w #$4000,$24(a5)
- move.w #$0400,$9e(a5)
-
- lea mfm_buffer,a0
- lea codebuffer,a1
- move.w #$000a,d0
-
- decode_loop1:
- cmp.w #$4489,(a0)+
- bne.b decode_loop1
- cmp.w #$4489,(a0)
- bne.b cont
- addq.l #2,a0
-
- cont:
- move.l #$55555555,d4
- move.l (a0),d2
- move.l $0004(a0),d3
- and.w d4,d2
- and.w d4,d3
- asl.w #1,d2
- or.w d3,d2
- move.w d2,d3
- and.w #$ff00,d2
- lsl.w #1,d2
- move.l a1,a2
- add.w d2,a2
- lea $0038(a0),a0
- moveq #$7f,d1
-
- decode_loop2:
- move.l $0200(a0),d3
- move.l (a0)+,d2
- and.l d4,d2
- and.l d4,d3
- asl.l #1,d2
- or.l d3,d2
- move.l d2,(a2)+
- dbf d1,decode_loop2
- lea $01f8(a0),a0
- dbf d0,decode_loop1
- movem.l (a7)+,d0-d7/a0-a6
- rts
-
- write_track:
- movem.l d0-d7/a0-a6,-(a7)
- lea $dff000,a5
- move.w #$8210,$96(a5)
- move.w #$7f00,$9e(a5)
- move.w #$9100,$9e(a5)
- move.w #$4000,$24(a5)
- move.l #mfm_buffer,$20(a5)
- move.w #$daa2,$24(a5)
- move.w #$daa2,$24(a5)
- move.w #2,$9c(a5)
-
- wait_disk2:
- btst #1,$1f(a5)
- beq.b wait_disk2
- move.w #$4000,$24(a5)
- move.w #$0400,$9e(a5)
- movem.l (a7)+,d0-d7/a0-a6
- rts
-
- drive_on:
- moveq #1,d0
- bra.b cont_drive
-
- drive_off:
- moveq #0,d0
-
- cont_drive:
- addq.w #3,d1
- tst.w d0
- beq.b drive_out
- move.b #%11111001,$bfd100
- bclr #7,$bfd100
- bclr d1,$bfd100
- rts
-
- drive_out:
- bset d1,$bfd100
- bset #7,$bfd100
- bclr d1,$bfd100
- bset d1,$bfd100
- rts
-
- trackzero:
- bset #1,$bfd100
-
- test_zero:
- btst #4,$bfe001
- beq.b wait_disk_ready
-
- pos_head:
- bsr.b step_head
- bra.b test_zero
-
- choose_source:
- move.w d0,-(a7)
- move.w source-var(a4),d0
-
- drive_select:
- or.b #%01111000,$bfd100
- addq.w #3,d0
- bclr d0,$bfd100
- move.w (a7)+,d0
- rts
-
- wait_disk_ready:
- btst #5,$bfe001
- bne.b wait_disk_ready
- rts
-
- step_head:
- bclr #0,$bfd100
- bset #0,$bfd100
-
- delay:
- move.w #$2000,d0
-
- delay_loop:
- dbf d0,delay_loop
- rts
-
- var:
- to_track: dc.w 0
- drive: dc.w 0
- write_as: dc.w 0
- source: dc.w 0
- target: dc.w 1
- actual_track: dc.w 0
- head: dc.w 0
- buffer: dc.l 0,0
-