*B 4, Q-, G 0, S 12, R-, U-
;
; changes.gen
;
; Dit programma doorzoekt alle memman source files naar het ;@ teken.
; Deze regels worden op de printer gedumpt.
;
changes	in a,(90h)	;Lees de printer status poort
	and 2	;Kijk naar het BUSY signaal
	jr z,mainOpen	;Printer staat aan, begin

	ld de,mPrOffline	;Foutmelding: Printer is offline
	call print	;Druk die af
	jp 0	;Terug naar msxdos

mainOpen	call openFcb	;Open de eerste file
	sub a	;Nog niets geprint
	ld (didPrint),a	;Bij de eerste regel eerst de flname

mainLoop	call readLine	;Haal een regel binnen
	jr c,mainNext	;Einde van de file, volgende

	call chkLine	;Kijk of er ;@ of INCLUDE in staat
	call prtLine	;Druk de regel af als het nodig is
	jr mainLoop	;Meer regels doorlopen

mainNext	ld hl,(fcbPtr)	;Fcb's pointer
	ld de,37	;Naar het volgende fcb
	add hl,de	;Naar het volgende fcb
	ld (fcbPtr),hl	;Sla de nieuwe pointer op

	ld a,(hl)	;Drive uit het fcb ophalen
	inc a	;Einde van alle fcb's?
	jr nz,mainOpen	;Nee, volgende file openen

	ld de,mDone	;Klaar bericht
	call print	;Druk dat af
	jp 0	;Terug naar dos

; openFcb
;
; Open het fcb waar fcbPtr naartoe wijst.
;
openFcb	ld hl,(fcbPtr)	;Pointer naar dit fcb ophalen
	inc hl	;Drive teken overslaan
	ld de,mPutName	;Daar moet ie komen in de print tekst
	ld bc,8+3	;Zolang is ie
	ldir	;Kopieer de naam

	ld de,mSearch	;Aan het doorzoeken melding
	call print	;Druk die af

	ld de,(fcbPtr)	;Daar staat het fcb dus
	ld c,0fh	;bDos functie: Open file
	call 5	;Open de file

	ld hl,(fcbPtr)	;Actieve fcb
	ld bc,14	;Naar het de Record Lengte
	add hl,bc	;Bereken het adres
	ld (hl),1	;Record lengte = 1 invullen
	inc hl
	ld (hl),0

	ld hl,0	;=0
	ld (charCount),hl	;Wis het inlees buffer

	inc a	;Goed kunnen openen?
	ret nz	;Ja, ga lezen

	ld de,mBadOpen	;Niet goed kunnen openen
	call print	;Druk dat af
	jp 0	;Terug naar msxdos

; readLine
;
; Lees een regel uit het actieve fcb
;
; Uit: Regel in lineBuffer
;      Vlag Carry als het einde van de file bereikt is
;
readLine	ld hl,lineBuffer	;Daar de regel opslaan
	ld b,0	;Positie in de regel
readLineLus	push hl	;Bewaar de opslag pointer
	push bc	;Bewaar de positie teller
	call readChar	;Lees een teken uit het buffer
	pop bc	;Herstel de positie teller
	pop hl	;Herstel de opslag pointer
	ret c	;Einde van de file bereikt

	cp 9	;Is het een tab?
	jr nz,readLineSto	;Nee, sla hem maar op

	ld a,b	;Printer kop positie
	ld c,14	;Naar positie 15 toe
	cp 15	;Kleiner dan 15? Dan naar 15 toe
	jr c,readLineTab	;Verwerk de tab
	ld c,39	;Naar positie 40 toe
	cp 39
	jr nc,readLineSto	;Tab gewoon na pos 40

readLineTab	ld (hl)," "              ;Sla een spatie op
	inc hl	;Opslag pointer een verder
	inc b	;Een positie verder
	ld a,b	;Hoever zijn we?
	cp c	;Is die al op de juiste positie?
	jr nz,readLineTab	;Nee, nog een spatie toevoegen
	ld a," "                 ;Nog een spatie extra

readLineSto	ld (hl),a	;Sla het teken op in het lineBuffer
	inc hl	;Opslag pointer een verder
	inc b	;Een positie verder
	cp 10	;Einde van de regel?
	jr nz,readLineLus	;Meer tekens inlezen

	ret

; readChar
;
; Lees een teken uit het actieve fcb
;
; Uit: Teken in A
;      Vlag Carry als het einde van de file bereikt is
;
readChar	ld bc,(charCount)	;Aantal tekens nog in het buffer
	ld a,b	;Zitten er nog tekens in het buffer?
	or c
	jr nz,readChar2	;Ja, pak er maar een

	ld de,charBuffer	;Daar de tekens naartoe inlezen
	ld (charPtr),de	;Nieuwe buffer pointer neerzetten
	ld c,01ah	;bDos functie: Set DMA
	call 5	;Zet het DMA adres

	ld de,(fcbPtr)	;Daar staat het fcb
	ld hl,charBufLen	;Maximum tegelijk in te lezen
	ld c,27h	;bDos functie: Random read
	call 5	;Lees de tekens in
	ld (charCount),hl	;Sla het aantal ingelezen tekens op

	ld a,h	;Hebben we wel wat ingelezen?
	or l
	jr nz,readChar	;Ja, probeer het nu nog eens

	scf	;Foutvlag: Einde van de file
	ret

readChar2	dec bc	;Zometeen zit er een teken minder in
	ld (charCount),bc	;Sla de nieuwe teller op

	ld hl,(charPtr)	;Daar staan ze,
	ld a,(hl)	;Haal het teken op
	inc hl	;Pointer een opschuiven
	ld (charPtr),hl	;Sla de nieuwe pointer op

	or a	;Geen carry
	ret

; chkLine
;
; Controleer de regel op ;@ tjes en zet de doPrint vlag als de regel
; afgedrukt moet worden
;
chkLine	ld hl,lineBuffer	;Start van de tekst
chkLineLus	ld a,(hl)	;Haal een teken uit de regel
	inc hl	;Alvast naar het volgende teken
	cp 10	;Einde van de regel?
	ret z	;Ja, keer terug

	cp ";"                   ;Eerste teken van de zoekstring?
	jr nz,chkLineLus	;Nee, verder zoeken
	ld a,"@"                 ;Tweede teken dat we zoeken
	cp (hl)	;Staat dat er ook?
	jr nz,chkLineLus	;Nee, verder zoeken

	ld a,-1	;NZ: Gevonden
	ld (doPrint),a	;Zet de afdruk vlag
	ret

; prtLine
;
; Druk een regel af op de printer als de doPrint vlag gezet is (NZ)
;
prtLine	ld hl,doPrint	;Vlag pointer
	ld a,(hl)	;Haal de vlag op
	and a	;Is ie gezet?
	ret z	;Nee, keer terug
	ld (hl),0	;Wis de vlag

	inc hl	;didPrint
	ld a,(hl)	;Haal de vlag op
	and a	;Is de naam al geprint?
	jr nz,prtNameDone	;Naam is al geprint
	inc (hl)	;Naam is afgedrukt

	call lprCrLf	;Naar de volgende regel op de printer

	ld hl,mPutName	;Daar staat de naam (13 tekens)
	ld b,8+3	;Zoveel tekens naar de printer
prtNameLus	ld a,(hl)	;Haal 1 teken van de naam op
	call lCharOut	;Druk het teken af op de printer
	inc hl	;Pointer naar het volgende teken
	djnz prtNameLus	;Meer tekens van de naam afdrukken

	call lprCrLf	;Naar de volgende regel
prtNameDone

	ld hl,lineBuffer	;Daar staat de regel gebuffert
prtLineLus	ld a,(hl)	;Haal een teken op uit het buffer

	call lCharOut	;Druk het teken af op de printer

	inc hl	;Buffer pointer naar het volgende teken
	cp 10	;Einde van de regel?
	jr nz,prtLineLus	;Nee, meer tekens afdrukken
	ret

doPrint	defb 0	;Regel moet afgedrukt worden vlag
didPrint	defb 0	;Filename al geprint (Z = False)

; print
;
; Druk een tekst af op het scherm
;
; In: DE = Tekst pointer
;
; Opm: De tekst moet zijn afgesloten door een dollar teken ($)
;
print	ld c,9	;bDos functie: Print string
	jp 5	;Druk de tekst af

; lprCrLf
;
; Ga naar de volgende regel op de printer
;
lprCrLf	ld a,13
	call lCharOut
	ld a,10

; lCharOut
;
; Druk een teken af op de printer
;
; In: Teken in A
;
; Wijzigt NIET: BC,HL,AF
;
lCharOut	push hl	;Deze register bewaren
	push af
	push bc
	ld e,a	;Teken naar E
	ld c,5	;Functie nummer: List Output
	call 5	;Druk het teken af
	pop bc	;Herstel de bewaarde registers
	pop af
	pop hl
	ret

; teksten
;
mSearch	defb 13,10,"Searching: "
mPutName	defb "XxxxxxxxXxx$"

mBadOpen	defb " - Error opening file",13,10,"$"

mDone	defb 13,10,"Ready",13,10,"$"

mPrOffline	defb "Printer is offline",13,10,"$"

; fcb's
;
fcbPtr	defw fcb	;Eerste fcb pointer

fcb	defb 0,"MEMMAN  GEN"     ;Eerste fcb naam om te openen
	defs 25,0	;Rest alvast wissen

	defb 0,"MEMSRCH GEN"
	defs 25,0

	defb 0,"MEMINST GEN"
	defs 25,0

	defb 0,"MEMNWEX GEN"
	defs 25,0

	defb 0,"MEMTSR  GEN"
	defs 25,0

	defb 0,"MEMCONN GEN"
	defs 25,0

	defb 0,"MEMEXTSRGEN"
	defs 25,0

	defb 0,"MEMUSED GEN"
	defs 25,0

	defb -1	;Einde van de fcb's

; lineBuffer
;
; Hierin wordt 1 regel gebuffert
;
; De regel wordt altijd afgesloten door een lineFeed (char 10)
;
lineBuffer	defs 256,0	;Regel buffer

; charBuffer
;
; Hierin wordt de inhoud van een tekstfile opgeslagen om er daarna
; een voor een 1 teken uit te halen.
;
charCount	defw 0	;Aantal tekens nog in het buffer
charPtr	defw 0	;Buffer pointer
charBufLen	equ 100h	;Maximaal zoveel tegelijk inlezen
charBuffer	equ $	;Hier begint het buffer

	end	;changes.gen
