home *** CD-ROM | disk | FTP | other *** search
- ;Code-MFM
- ;By duke/L4 for DISC #4
-
- jmp Start
- org $45000
- load $45000
- S:
- Start:
- code_track:
- movem.l d0-d7/a0-a5,-(a7)
- lea s(pc),a5
- move.l datapt(pc),a0
- lea trackbuff(pc),a1
- move.l #$55555555,d5 ;mask for even bits
- move.w #11,d7 ;code 11 sectors
- clr.w d6 ;sector-nummer
- code_loop:
- lea 8(a1),a2
- move.l a1,a3
- move.l #$ff000000,d0 ;format-sign
- moveq #0,d1
- move.w track(pc),d1
- swap d1
- or.l d1,d0 ;store track-nummer (0-159)
- move.w d6,d1
- asl.w #8,d1
- or.w d1,d0 ;store sector-nummer (0-10)
- or.w d7,d0 ;store no. of sectors until gap (11-1)
-
- clr.l (a1)+ ;store coded zeros
- move.l #$44894489,(a1)+;syncs
- bsr.l code_long ;code infoblock
- move.l d0,(a1)+ ;info (odd)
- move.l d1,(a1)+ ;info (even)
-
- move.w #8-1,d2
- store_label:
- clr.l (a1)+ ;store sector-label-field
- dbf d2,store_label
-
- moveq #0,d0
- move.w #10-1,d2 ;checksum over 40 bytes
- header_check:
- move.l (a2)+,d1
- eor.l d1,d0
- dbf d2,header_check
- bsr.l code_long ;code header-checksum
- move.l d0,(a1)+ ;store headercheck (odd)
- move.l d1,(a1)+ ;store headercheck (even)
-
- lea 16(a2),a2 ;buffer for odd data-bits
- lea 512(a2),a4 ;buffer for even data-bits
- move.w #128-1,d2
- code_data:
- move.l (a0)+,d0
- bsr.l code_long
- move.l d0,(a2)+ ;store odd bits
- move.l d1,(a4)+ ;store even bits
- dbf d2,code_data
-
- lea 8(a1),a2 ;skip space for data-checksum
- moveq #0,d0 ;clear checksum
- move.w #256-1,d2
- data_check:
- move.l (a2)+,d1
- eor.l d1,d0 ;calc sum
- dbf d2,data_check
- bsr.l code_long ;code data-checksum
- move.l d0,(a1)+
- move.l d1,(a1)+
-
- clr.w d4 ;set tact-bits for infoblock
- bsr.l settacts
-
- lea 4(a3),a3 ;skip syncs
- move.w #270-1,d4 ;set tact-bits for 270 longwords
- bsr.l settacts
- ;
- adda.w #1024,a1 ;skip coded data-bits
- addq.w #1,d6
- subq.w #1,d7
- bne.l code_loop ;code next sector
- addi.l #$1600,datapt-s(a5)
- movem.l (a7)+,d0-d7/a0-a5
- Rts
-
- settacts:
- move.b -1(a3),d3 ;byte from longword before
- not.b d3 ;invert byte
- andi.l #1,d3 ;mask bit 0
- ror.l #1,d3 ;shift bit 0 to bit 31
- move.l (a3),d0 ;fetch longword
- move.l d0,d1
- eor.l d5,d0
- move.l d0,d2
- lsl.l #1,d0
- lsr.l #1,d2
- or.l d3,d2 ;set bit 31 if necessary
- and.l d2,d0
- or.l d1,d0
- move.l d0,(a3)+
- dbf d4,settacts
- Rts
-
- code_long: ;code longword
- move.l d0,d1
- lsr.l #1,d0
- and.l d5,d0 ;odd
- and.l d5,d1 ;even
- Rts
-
- track: dc.w 2
- datapt: dc.l data
- trackgap: ;save data from trackgap on (if there're
- blk.b 800,$aa ;any errors try bigger gap)
- trackbuff:
- blk.b 13000,$aa
- data: ;store data which you want to code here
-