;:sys36864
	;.opt oo
; assembler-listing 'insert'
; einfuegen und anhaengen von programmzeilen
; nikolaus heusler, XXXXXXXXXXXX XX, X XXXXXXXX XX
; nh-181190-arr
;
	*= $cec5	;startadr. 52933
; konstanten
ibas	=776	;befehl ausfuehren
tload	=$93	;load-token
bload	=$e168	;load-befehl
chrget	=115	;zeichen lesen
chrgot	=121	;zeichen holen
inter	=$a7ae	;interpreterschleife
basic	=$a7e7	;befehl ausfuehren
strout	=$ab1e	;textausgabe
parget	=$e1d4	;parameter nach load holen
sa	=185	;sekundaeradresse
load	=$ffd5	;load-routine
loaderr	=$e19c	;load error
error	=57593	;fehlerbehandlung
basanf	=43	;startadresse programm
basend	=45	;endadresse programm
end1	=$e1a7	;load-befehl beenden
end2	=$e1ab	;load-befehl beenden
tmp	=2	;unbenutzt
latch	=160	;highbyte zwischenspeicher
takeline	=$a4a2	;zeile uebernehmen
loadvec	=$e455	;basic-vektoren laden
status	=144	;i/o status
dirvec	=770	;direktmodus-flag
konf	=1
integer	=20
buffer	=512
;hauptprogramm
	lda #<neubef
	ldy #>neubef
	sta ibas
	sty ibas+1	;neue befehle einbinden
	lda #<text
	ldy #>text
	jmp strout	;text ausgeben
;basic-befehl ausfuehren
neubef	jsr chrget
	cmp #tload
	beq laden
	jsr chrgot
	jmp basic	;load bearbeiten
;load-token erkannt
laden	jsr chrget
	cmp #"%"
	beq prozent
	cmp #"!"
	beq ausruf
;war normaler load-befehl
	jmp bload
;programm anhaengen
prozent	jsr chrget
	jsr getpar	;titel holen
	lda basanf
	pha
	lda basanf+1
	pha	;startadresse retten
	lda basend
	ldy basend+1
	sec
	sbc #2
	bcs noinc
	dey	;adr. minus 2
noinc	sta basanf
	sty basanf+1	;basanf = basend-2
	jsr loadfile	;file relativ laden
	pla
	sta basanf+1
	pla
	sta basanf	;parameter zurueckholen
	jsr end1	;linkpointer berechnen, fertig
;befehl ausgefuehrt
fertig	jsr chrget
	jmp inter	;naechsten befehl auswerten
;programm einfuegen
ausruf	jsr chrget
	jsr getpar	;pointer erhoehen
	ldy #latch
	sta tmp
	sty tmp+1	;tmp auf latch richten
	jsr loadfile	;datei relativ laden
	lda #<cont
	ldy #>cont
	sta dirvec
	sty dirvec+1
;neuer direktmodus-einsprung
cont	ldy #-1	;zeiger vor erstes programmbyte
loop	lda konf
	and #254
	sta konf	;ram unter basic einblenden
	iny
	lda (tmp),y	;naechste datei-byte lesen
	inc konf	;basic einschalten
	cpy #1
	bcc loop	;linkpointer low ueberlesen
	bne line	;zeilennummer oder basic-text
;linkpointer high pruefen
	tax
	bne loop	;programm endet nicht
;programmende
	ldx #3
	jsr loadvec	;direktmodus-vec. korrigieren
	jsr end2	;parameter korrigieren
	jmp fertig	;befehl beendet
;programm lesen
line	cpy #4
	bcs char	;keine zeilennummer
	sta integer-2,y	;nach 20/21 bringen
	bcc loop	;und weitermachen
;basiczeile uebertragen
char	sta buffer-4,y	;nach 512ff bringen
	tax
	bne loop	;wenn kein zeilenende, weitermachen
;zeilenende
	tya
	adc tmp
	sta tmp
	bcc noerh
	inc tmp+1	;tmp um y erhoehen
noerh	iny
	jmp takeline	;programmzeile speichern
;fileparameter holen
getpar	jsr parget
	lda #0
	sta sa	;sek.adr null
ret	rts	;zurueck
loadfile	tax	;ladeadresse in x/y
	lda konf
	and #254
	sta konf	;ram unter basic einblenden
	lda #0	;load-flag
	jsr load	;file laden
	inc konf	;basic einblenden
	bcc okay	;kein fehler
	jmp error	;zur fehlerbehandlung
okay	lda status
	and #191	;status okay
	beq ret	;ja, dann fertig
	jmp loaderr	;sonst load error
text	.byt 13
	.byte "insert/c 64"
	.byt 13
	.byte " load% -> programm anhaengen"
	.byt 13
	.byte " load! -> programm einfuegen"
	.byt 13
	.byte "nikolaus heusler, 18.11.90 (arr)"
	.byt 13,0
