        xdef   _formatfile

        section code

; A0 ^ fil
; A1 ^ dato "00-00-00"
; D0 = Nyflag (BOOL)

_formatfile:
        movem.l d2-d7/a2-a6,-(sp)
        move.l  d0,d6
        tst.w   SplitInit
        bne.b   .iniok
        not.w   SplitInit
        lea     SplitMap,a2
        moveq   #0,d0
        subq.b  #1,d0
.inilp: clr.b   (a2)+
        dbra    d0,.inilp
        lea     SplitMap,a2
        st      (a2)
        st      ' '(a2)
        st      '.'(a2)
        st      '/'(a2)
        st      '!'(a2)

.iniok: lea     MyString,a6
        move.l   #32<<24+32<<16+32<<8+32,d7
        ; WRITE OUT THE NAME
        lea     18(a0),a2       ; a2 ^ name
        move.l  a2,d0           ; d0 ^ name
.lp:    move.b  (a2)+,(a6)+     ; copy name
        bne.b   .lp
        move.b  d7,-1(a6)
        sub.l   a2,d0
        neg.w   d0
        sub.w   #24,d0          ; this is the actual max length ± a few bytes :-)
        bgt.b   .toolong
        neg.w   d0
        subq.w  #1,d0
        blt.b   .ok
        ; TOO SHORT
.lp2:   move.b  d7,(a6)+
        dbra    d0,.lp2
        bra.b   .ok
        ; TOO LONG
.toolong:
        sub.w   d0,a6
        move.w  #'!'<<8+32,-2(a6)
.ok:
        move.b  d7,(a6)+
        ; WRITE OUT THE SIZE
        move.l  #$ffff,d0
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.l  8(a0),d2
        lsr.l   #8,d2
        lsr.l   #2,d2
        bne.b   .not0
        moveq   #1,d2
.not0:  move.b  #'K',d1
        cmp.l   #999,d2
        ble.b   .ok2
        divu    #102,d2
        ext.l   d2
        move.b  #'M',(a6)+
        divu    #10,d2
        swap    d2
        add.b   #'0',d2
        move.b  d2,-2(a6)
        move.b  #'.',-3(a6)
        swap    d2
        add.b   #'0',d2
        move.b  d2,-4(a6)
        bra.b   .skip
.ok2:   move.l  a6,a5
        move.b  d1,(a6)+
Loop:   divu	#10,d2
      	swap	d2
	      add.b	#'0',d2
      	move.b	d2,-(a5)
      	swap	d2
	      and.l	d0,d2
	      bne.S	Loop
.skip:  move.b  d7,(a6)+
        move.b  d7,(a6)+

        ; WRITE OUT THE DATE
        move.b  (a1)+,(a6)+
        move.b  (a1)+,(a6)+
        move.b  (a1)+,(a6)+
        move.b  (a1)+,(a6)+
        move.b  (a1)+,(a6)+
        move.b  (a1)+,(a6)+
        move.b  (a1)+,(a6)+
        move.b  (a1)+,(a6)+
        move.b  (a1)+,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        tst.b   d6
        beq.b   .old
        move.b  #'*',-2(a6)
.old:

        ; WRITE OUT THE DL COUNT
        move.l  12(a0),d0
        cmp.l   #100,d0
        blo.b   .nocut
        moveq   #99,d0                  ; gee, this BBS is popular.. >100 dl's of this file!!!
.nocut: divu    #10,d0
        add.l   #'0'*$10001,d0
        move.b  #'[',(a6)+
        move.b  d0,(a6)+
        swap    d0
        move.b  d0,(a6)+
        move.b  #']',(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+

        ; WRITE OUT THE DESCRIPTION
        lea     59(a0),a2
        lea     SplitMap,a4
        moveq   #0,d1
.lp4:   cmp.b   (a2),d7
        bne.b   .nospacefirst
        addq.l  #1,a2
        bra.b   .lp4
.nospacefirst:
        moveq   #27,d0
        sub.l   a3,a3
.lp3:   move.b  (a2)+,d1  ; AT THIS POINT TRY TO FIND A VALID CHAR TO OUTPUT
        beq.w   .done     ; TERMINATE AT NULL CHAR
        cmp.b   d7,d1     ; SKIP CHARS < ASCII 32
        blo.b   .lp3
        bne.b   .no2space
.morespace:
        cmp.b   (a2),d7   ; SKIP DUPLICATE CHARS <= ASCII 32
        bhs.b   .lp3
.no2space:        
        move.b  d1,(a6)+
        tst.b   (a4,d1.w) ; REMEMBER POSITION OF LAST SEPARATOR FOR WORD WRAP
        beq.b   .nope
        move.l  a2,a3
        move.l  a6,a5
.nope:  dbra    d0,.lp3   ; STOP AT THE MAXIMUM LENGTH OF LINE
        ; CHECK IF ALL THAT REMAINS IS SEPARATORS, IF SO DON'T LOOP--LOOKS UGLY!
        move.l  a2,a1
.clp:   move.b  (a1)+,d1
        beq.b   .done
        tst.b   (a4,d1.w)
        bne.b   .clp
        ; GO BACK TO LAST SEPARATOR, IF ANY, AND BREAK THE LINE THERE = WORD WRAPPING
        cmp.l   #0,a3
        beq.b   .hard
        move.l  a3,a2
        move.l  a5,a6
        ; MAKE NEWLING AND INDENT FOR NEXT LINE
.hard:  move.b  #10,(a6)+

        move.b  d7,(a6)+  ; I wonder what SAS meant by not making a REPT directive
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+
        move.b  d7,(a6)+

        bra.w   .lp4

.done:  move.b  #10,(a6)+
        clr.b   (a6)
        movem.l (sp)+,d2-d7/a2-a6
        move.l  #MyString,d0
        rts


MyString:       ds.b    300

SplitMap:       ds.b    256
SplitInit:      dc.w    0

                end
