; d‚marrage TOS

LANG = 0		; 0 FR, 1 EN

	if LANG=0
		OUTPUT "BILDHYPF.PRG"
	else
		OUTPUT "BILDHYPE.PRG"
	endif

XBIOS MACRO   ; fn,pile
   move #\1,-(sp)
   trap #14
   if \2<=8
      addq.l #\2,sp
   else
      add.w #\2,sp
   endif
   ENDM

BIOS MACRO   ; fn,pile
   move #\1,-(sp)
   trap #13
   if \2<=8
      addq.l #\2,sp
   else
      add.w #\2,sp
   endif
   ENDM

GEMDOS MACRO    ; fn,pile
   move #\1,-(sp)
   trap #1
   if \2<=8
      addq.l #\2,sp
   else
      add.w #\2,sp
   endif
   ENDM

	move.l 4(sp),a0
	move.l $18(a0),a1
	add.l $1c(a0),a1
	add.l #$200,a1
	move.l a1,sp
	sub.l a0,a1
	move.l a1,-(sp)
	move.l a0,-(sp)
	clr.w -(sp)
	GEMDOS $4a,12		; MSHRINK, r‚duit l'espace
	
	bsr loadhlp
	bsr convert
	bsr savestg

	clr -(sp)
	trap #1

loadhlp:
	clr -(sp)
	pea filehlp
	GEMDOS 61,8
	move d0,d7			; ouvre FORTH.HLP
	
	move #2,-(sp)
	move d7,-(sp)
	clr.l -(sp)
	GEMDOS 66,10		; fseek … la fin = taille
	move.l d0,d6
	
	clr -(sp)
	move d7,-(sp)
	clr.l -(sp)
	GEMDOS 66,10		; retour au d‚but
	
	pea in
	move.l d6,-(sp)
	move d7,-(sp)
	GEMDOS 63,12		; lit tout le fichier
	
close:
	move d7,-(sp)
	GEMDOS 62,4			; ferme
	rts
	
	; a6 pointeur de fin
	
savestg:
	clr -(sp)
	pea filestg
	GEMDOS 60,8			; cr‚e FORTH.STG
	move d0,d7
	
	lea out,a3
	sub.l a3,a6			; taille
	
	pea (a3)
	move.l a6,-(sp)
	move d7,-(sp)
	GEMDOS 64,12		; sauve
	
	bra.s close
	
convert:
	lea in,a5			; fichier HLP
	lea out,a6			; fichier STG
	lea header(pc),a0
	bsr .add
	lea 28(a5),a4		; table des offsets vers le contenu des pages
	move.l 2(a5),d0	; offset vers DATA
	lea 0(a4,d0.l),a3	; table des offsets vers noms des pages
	move.l a3,ref_table
	move.l a4,a5		; in+28 pour les offsets
	move.l a3,a2		
	move.l a4,a1
.loopMain:
	tst.l (a1)			; z‚ro si fin de table
	beq.s .finMain
	move.l a5,d0
	add.l d0,(a1)+		; reloge
	add.l d0,(a2)		; reloge
	lea ref1(pc),a0
	bsr .add
	move.l (a2),a0		; chaine de r‚f‚rence
.lb8:
	tst.b (a0)+
	bne.s .lb8			; avance jusqu'… la description
	bsr .add
	lea ref2(pc),a0
	bsr .add
	move.l (a2)+,a0	; puis la r‚f‚rence
	bsr .add
	lea ref3(pc),a0
	bsr .add
	lea cr(pc),a0
	bsr .add
	bra.s .loopMain
.finMain:
	lea endnode(pc),a0 ; +cr*2
	bsr .add
.loopPage:
	tst.l (a4)
	beq .finDoc
	lea node(pc),a0
	bsr .add
	move.l (a3),a0		; la r‚f‚rence
	bsr .add
	lea cr(pc),a0
	bsr .add
	move.l (a3)+,a0
	lea 35(a6),a1		; pour aligner les espaces sur 35 caractŠres
.lb9:
	tst.b (a0)+			; passe … la desciption
	bne.s .lb9
	bsr .add
.lb10:
	cmp.l a1,a6
	bpl.s .lb11
	move.b #32,(a6)+
	bra.s .lb10
.lb11:
	lea entete(pc),a0
	bsr .add
	move.l (a4)+,a2	; d‚but de la page
	moveq #0,d5			; pour le gras
.contenu:
	move.b (a2)+,d0
	bne.s .lb0
	lea cr(pc),a0		; si z‚ro, saut de ligne
	bsr .add
	bra.s .contenu
.lb0:
	cmp.b #255,d0
	bne.s .lb1
	lea endnode(pc),a0	; si fin de page + cr*2
	bsr .add
	bra.s .loopPage
.lb1:
	cmp.b #222,d0			; passage gras/normal?
	bne.s .lb2
	lea bold(pc),a0
	not.b d5
	bne.s .lb3
	lea norm(pc),a0
.lb3:
	bsr .add
	bra.s .contenu
.lb2:
	cmp.b #64,d0			; arobace?
	bne.s .lb4
	move.b d0,(a6)+		; l'arobace est doubl‚ @@
;	lea arobace(pc),a0
;	bra.s .lb3
.lb4:
	cmp.b #'®',d0			; une r‚f‚rence ?
	bne.s .lb5
	bsr.s .reference
	bra.s .contenu
.lb5:
	move.b d0,(a6)+		; caractŠre normal
	bra.s .contenu
.finDoc:
	rts	
.add:
	move.b (a0)+,(a6)+
	bne.s .add
	subq.l #1,a6
	rts	
.reference:
	cmp.b #"-",(a2)+
	bne.s .reference		; cherche le -, d‚but du nombre
	lea ref1(pc),a0
	bsr.s .add
	moveq #0,d7
	moveq #0,d0
.rr0:
	move.b (a2)+,d0   ; ici lit le numero de page dans D7
	sub.w #'0',d0
	bmi.s .rr1
	cmp #9,d0
	bgt.s .rr1
	muls #10,d7
	add.l d0,d7
	bra.s .rr0
.rr1:
	cmp.b #'¯',(a2)+	; avance jusqu'… la fin de << >>
	bne.s .rr1
.rr2:
	cmp.b #32,(a2)+	; saute les ‚ventuels espaces
	beq.s .rr2
	lea -1(a2),a0		; copie le texte de la r‚f‚rence
	bsr.s .add
	lea ref2(pc),a0	; ajoute link
	bsr.s .add
	move.l ref_table(pc),a0
	lsl.l #2,d7
	move.l 0(a0,d7.l),a0
	bsr.s .add			; ajoute le nom du lien
	lea ref3(pc),a0	; finit la ligne
	bsr.s .add	
.rr3:	
	tst.b (a2)+
	bne.s .rr3
	subq.l #1,a2		; s'arrete sur le z‚ro final pour le saut de ligne
	rts
	
	
	data
node: dc.b "@node ",0
entete: dc.b "FORTH",13,10,"@line 1 40 0",13,10,10,0
endnode: dc.b "@endnode",13,10,10,0
cr: dc.b 13,10,0
bold: dc.b "@{B}",0
norm: dc.b "@{0}",0
ref1: dc.b "@{",34,0
ref2: dc.b 34," link ",0
ref3: dc.b "}",0
;arobace: dc.b "@{",34,64,34," ignore}",0
header: 	dc.b "@database ",34,"Forth Quick Reference",34,13,10
			dc.b "@subject ",34,"Programming",34,13,10
			dc.b "@author ",34,"Guillaume Tello",34,13,10,10

	if LANG=0
			dc.b "@node Main ",34,"Table des matiŠres",34,13,10,0
filehlp: dc.b "F:\FORTH\HELP\FORTH.HLP",0
filestg: dc.b "F:\FORTH\HELP\FORTH.STG",0

	else

			dc.b "@node Main ",34,"Table of Contents",34,13,10,0
filehlp: dc.b "F:\FORTH\ENGLISH\FORTH.HLP",0
filestg: dc.b "F:\FORTH\ENGLISH\FORTH.STG",0
	
	endif	


	even
		
	bss 
ref_table: ds.l 1
in: ds.b 100000
out: ds.b 200000

	ds.l 1000
	
	end	    