1;ACME 0.95
2
3!zone
4F_info		ldx #hWindow_InfoBox
5		jmp xwindow
6
7memfull		ldx #hWindow_NoMemLeft
8
9xwindow		lda conreg	; Bank sichern
10		pha
11		+yram0io
12		stx menunr
13		jsr crsroff	; Cursor aus
14		jsr makewin	; Win bauen
15		jsr getchar	; Auf Taste warten
16		jsr pullscr	; Win weg
17		jsr crsron	; Cursor an
18		pla		; alte Bank
19		sta conreg
20		rts
21
22F_sw		lda wrapflag	; Toggle Flag
23		eor #$ff
24		sta wrapflag
25		lda #TRUE	; Update fordern
26		sta updatewbi
27		rts
28
29F_lfeed		jsr poslvek	; LineVek
30		jsr insert1	; immer insert
31		lda #Char_RETURN	; 'CR' an Cursorpos
32		sta (lvek), y
33		sta nwfrm	; NewFrame fordern
34		sta changes	; Veraendert !
35		jsr posparw	; PARW ?
36		ldy posx	; Cursor am Rand ?
37		cpy llen
38		beq poswrap	; Nein: Wrap
39		lda posy	; Zeile in wrap
40		sta wrpy
41		lda posy + 1
42		sta wrpy + 1
43		jsr found	; und runterwrap
44		rts
45
46; splittet VOLLE Wrap-Zeilen
47linefull	ldy llen	; Zeilenlaenge-1
48		dey
49		jmp found	; wrap
50
51cancelwrp	jmp memfull	; Zeilen alle
52
53;multiwrap:
54		;jsr getlvek	; LineVek
55		;!by 44		; Wrap (bit-Trick)
56!zone
57poswrap		ldx #POS
58		stx xindex	; sichern
59		lda scry, x	; Zahl umkopieren
60		sta wrpy
61		lda scry + 1, x
62		sta wrpy + 1
63		jsr posparw	; PARW ?
64		bcs proofparw	; Dann kein WRAP
65		ldy llen	; LineEnd = Space ?
66		lda (lvek), y
67		cmp #" "
68		beq proofparw	; Ja = > PARW
69-			dey		; sonst zurueck bis zu
70			beq linefull	; Space, "-", CR oder
71			lda (lvek), y	; LineStart (bekommt
72			cmp #" "	; Sonderbehandlung)
73			beq found
74			cmp #"-"
75			beq found
76			cmp #Char_RETURN
77			bne -
78
79!zone
80found		sty wrpx	; puffert Y und addiert
81		tya		; es zum Vektor, damit
82		clc		; gut geshiftet wird
83		adc lvek
84		sta tmp2
85		lda lvek + 1
86		adc #0
87		sta tmp2 + 1
88		lda llen	; errechnet Anzahl zu
89		sec		; shiftender Bytes
90		sbc wrpx	; als 'zahl'
91		sta zahl
92		jsr needline	; fordert Zeile
93		bcs cancelwrp	; ggfs Abbruch
94		jsr incwrp	; naechste Zeile holen
95		ldx #WRP	; neue Zeile in die
96		ldy #ZZB	; naechste
97		jsr rollfwd
98		ldy zahl	; Anzahl Bytes
99		ldx #" "	; Space
100-			lda (tmp2), y	; holt Byte und setzt
101			sta (lvek), y
102			txa		; loescht Quelle
103			sta (tmp2), y
104			dey
105			bne -
106		ldx xindex	; errechnet neue
107		lda scrx, x	; Variablenwerte
108		sec		; Sind nur relevant,
109		sbc wrpx	; wenn Location
110		beq proofparw	; mitgewrapped wurde.
111		bmi proofparw
112		sta scrx, x
113		+inc16x scry
114
115!zone
116proofparw	ldx wrapflag	; Wrap erlaubt ?
117		beq +		; Nein = > Ende
118.pl			jsr incwrp	; naechste Zeile
119			ldx #WRP
120			jsr getlvek	; LineVek
121			jsr parw	; PARWen
122			bcs .pl		; ggfs Schleife
123+		ldx xindex	; Restore LineVek
124		jsr getlvek
125		rts
126
127!zone
128incwrp		+inc16 wrpy	; Y hoeher
129		rts
130
131!zone
132posparw		clc
133		ldx #POS	; Cursor-Index
134		lda wrapflag	; Wrap erlaubt ?
135		beq +		; ggfs Ende
136			jsr parw	; PARWed
137			bcc +		; ggfs Variablen
138				jsr moveloc	; angleichen
139+		php		; C sichern
140		ldx xindex	; Restore LineVek
141		jsr getlvek
142		plp		; C zurueck
143		rts
144
145!zone
146.no		clc		; C = 0 < = > nix PARWed
147		rts
148parw		stx xindex	; Sichert Index
149		ldx #ZZB	; mit PARW-Zeile vergleichen
150		ldy xindex
151		jsr cmp16bit
152		bcc .no		; kleiner = > Abbruch
153		ldx xindex	; X zurueck
154		lda scry + 1, x	; holt Vektor und
155		ldy scry, x	; zaehlt runter
156		bne +
157			sec
158			sbc #1
159+		sta prwy + 1	; Hi speichern
160		dey		; Lo runter & speichern
161		sty prwy
162		ora prwy	; Vorige Zeile = 0 ?
163		beq .no		; Dann Ende !
164		lda lvek	; lvek in tmp2
165		sta tmp2
166		lda lvek + 1
167		sta tmp2 + 1
168		ldx #PRW	; lvek auf vorige Zeile
169		jsr getlvek
170		jsr findend	; sucht Zeilenende
171		bne +		; Zeile leer ?
172			jsr delline	; loescht Zeile und
173			lda llen	; stellt Werte ein,
174			sta zahl	; die die Location
175			lda #0		; entsprechend
176			sta prwx	; verschieben
177			sec		; C = 1 < = > gePARWt
178			rts
179+		cmp #Char_RETURN	; letztes Zeichen CR ?
180		beq .no		; Dann Ende !
181		cmp #"-"
182		beq +		; Dann kein Space
183			iny		; reservieren
184+		sty prwx	; Y auf LastByte
185		lda llen	; errechnet Versatz,
186		sec		; bei dem Suche
187		sbc prwx	; gestartet wird
188		beq .no		; nix frei = > Ende
189		tay
190		lda prwx	; LineVek += Versatz, um
191		clc		; besser zu shiften
192		adc lvek
193		sta lvek
194		lda lvek + 1
195		adc #0
196		sta lvek + 1
197		lda (tmp2), y	; 1. Quellbyte holen
198-			cmp #" "
199			beq +
200				dey
201				beq .no		; LineStart = > Abbruch
202				lda (tmp2),y	; next Quellbyte
203				cmp #"-"
204				beq +
205					cmp #Char_RETURN
206					bne -
207+		sty zahl	; Anzahl sichern
208-			sta (lvek), y	; Zielbyte setzen
209			dey
210			beq +
211			lda (tmp2), y	; Quellbyte holen
212			jmp -		; Schleife
213+		lda llen	; Zeilenlaenge minus
214		sec		; 'zahl' Bytes muessen
215		sbc zahl	; noch shifted werden
216		sta .m
217		lda tmp2	; Muss zum Schieben
218		clc		; wieder Vektor
219		adc zahl	; aendern
220		sta lvek
221		lda tmp2 + 1
222		adc #0
223		sta lvek + 1
224; Y noch 0 !
225-			iny		; Y weiter
226			lda (lvek), y	; holt & setzt Byte
227			sta (tmp2), y
228.m = * + 1:		cpy #MODIFIED8	; Anzahl Bytes
229			bne -
230		lda #" "
231-			iny		; new line damit
232			sta (tmp2), y	; auffuellen
233			cpy llen	; bis Ende
234			bne -
235		sec		; C = 1 < = > PARWed
236		rts
237
238moveloc		ldx xindex
239		lda zahl	; X-Pos vor PARWgrenze?
240		cmp scrx, x
241		bcc inline	; Dann Pos += Anzahl
242		clc
243		lda scrx, x
244		adc prwx
245		sta scrx, x
246		lda prwy	; verringerten Y-Wert
247		sta scry, x	; einkopieren
248		lda prwy + 1
249		sta scry + 1, x
250		sec		; C = 1
251		rts
252
253inline		lda scrx, x	; (C = 1)
254		sbc zahl	; setzt Cursor zurueck
255		adc #0		; +Carry
256		sta scrx, x
257		rts		; (C = 0)
258
259!zone
260findend		ldy llen	; Versatz auf Ende
261-			lda (lvek), y	; holt Zeichen bis
262			cmp #" "	; Zeilenstart oder
263			bne endfound	; nicht-Space
264			dey
265			bne -
266endfound	rts		; Z = 1 = > Zeile leer (fixme - save a byte)
267
268; Menuevariablen
269manywins	!byte 0	; Anzahl Wins
270menunr		!byte 0	; Menunr
271menupoint	!word 0	; Menupunkt+Puffer
272
273changewin	beq lp19	; kein Nachbar = > Ende
274		pha		; neue Nr sichern
275		jsr pullscr	; altes Win weg
276		pla		; neue Nr holen
277		tax		; prueft ob Menupunkt
278		stx menunr	; beibehalten werden
279		lda menupoint	; kann. Ggfs auf 1
280		cmp winhe, x	; setzen
281		bcc menuloop
282		lda #1
283		sta menupoint
284
285!zone
286menuloop	jsr makewin	; Window bauen
287pointloop	jsr calcpoint	; berechnet Adresse
288		lda clraktl	; holt Farbe
289		jsr changeflg	; aendert Flag
290lp19		jsr getchar	; Auf Zeichen warten
291		ldx menunr	; Verkuerzt folgende
292		ldy menupoint	; Abfragen
293		cmp #Char_RETURN
294		beq menucom	; Ausfuehren
295		cmp #Char_ShiftRETURN
296		beq menucom	; Ausfuehren
297		;cmp #$80	; Linke Maustaste ?
298		;beq mouselft	; =>
299		cmp #Char_CursorUp
300		bne +
301			dey		; Punkt hoch & wech
302			jmp prfpoint
303+		cmp #Char_CursorDown
304		bne +
305			iny		; Punkt runter & wech
306			jmp prfpoint
307+		cmp #Char_CursorLeft
308		bne +
309			lda lftwin, x	; Nachbar holen & wech
310			jmp changewin
311+		cmp #Char_CursorRight
312		bne +
313			lda rgtwin, x	; Nachbar holen & wech
314			jmp changewin
315+		cmp #Char_STOP
316		bne lp19	; Nein = > Schleife
317menuend		jsr pullscr	; sonst restaurieren
318		rts		; und Ende (fixme - could save a byte here)
319
320!zone
321menucom		pha		; CR/CS sichern, dazu
322		txa		; die aktuelle Menunr
323		pha		; und den Menupunkt
324		tya
325		pha
326		lda winadlo, x	; stellt Zeiger auf
327		sta tmp1	; Menutexte
328		lda winadhi, x
329		sta tmp1 + 1
330		ldy #0		; Versatz Null
331		jmp +		; in die Schleife
332-			iny		; naechstes Byte holen
333			lda (tmp1), y
334			bne -		; sucht Ende-Null
335			iny		; Versatz auf Command
336+			lda (tmp1), y	; Command holen
337			dec menupoint	; richtiger Punkt ?
338			bne -		; Nein = > erneut
339		tax		; Ja = > Command !
340		jsr execom
341		jsr crsroff	; Sicherheitshalber...
342		pla		; Werte zurueck
343		sta menupoint
344		pla
345		sta menunr
346		jsr calcpoint	; Vektor stellen
347		pla		; Ausloesecode zurueck
348		cmp #Char_RETURN
349		beq menuend	; Dann Ende
350		jmp lp19	; Sonst Schleife (ShiftRETURN)
351;-----
352;mouselft:
353;		jmp lp19	; Linke Maustaste
354;-----
355
356!zone
357prfpoint	tya		; Wenn Punkt = 0,
358		bne ++		; dann Punkt: = Letzter
359			ldy winhe, x
360			dey
361			jmp +
362++		cmp winhe, x	; Wenn Punkt zu gross,
363		bcc +		; dann Punkt: = 1
364			ldy #1
365+		sty menupoint + 1	; neuen Punkt sichern
366		jsr calcpoint		; alten berechnen und
367		lda clrboxs		; mit WinFarbe faerben
368		jsr changeflg
369		ldy menupoint + 1	; neuen Punkt holen,
370		sty menupoint		; wird aktueller
371		jmp pointloop
372
373; errechnet Adresse des Menupunkts
374!zone
375calcpoint	ldx menunr	; holt Nummer & damit
376		lda winhi, x	; Screen-Addy
377		sta tmp1 + 1	; Hi setzen
378		lda winlo, x
379		ldx menupoint	; holt Punkt
380		sec		; +1 (Rand weg)
381-			adc #scrcols	; addiert Zeile
382			bcc +		; Page sichern
383				inc tmp1 + 1
384				clc
385+			dex		; ggfs
386			bne -		; Schleife
387		sta tmp1	; Lo setzen
388		sec		; Erledigt Arbeit fuer
389		ldx menunr	; aufrufende Routinen,
390		ldy winwi, x	; da X, Y, C richtig
391		dey		; belegt werden
392		rts
393
394; Windowdaten:
395hWindow_InfoBox		= 0
396; 1 bis 6 sind Menuleiste
397hWindow_FirstAfterMenu	= 7
398hWindow_NoMemLeft	= 7
399hWindow_Filename	= 8
400hWindow_DCS		= 9
401hWindow_Load		= 10
402hWindow_Save		= 11
403
404winwi	!byte 31, 16, 7, 13, 10, 14, 8, 25, 25, 32, 10, 15	; Breite - 1
405winhe	!byte  8,  8, 5,  3,  5,  8, 2,  5,  5,  8,  2,  2	; Hoehe  - 1
406
407; Vektoren auf Texte:
408winadlo	!byte <info,	<datei,	<edit,		<block,	<format,<switch
409	!byte <hilfe,	<nomem,	<namewin,	<dcswin,<lwin,	<swin
410winadhi	!byte >info,	>datei,	>edit,		>block,	>format,>switch
411	!byte >hilfe,	>nomem,	>namewin,	>dcswin,>lwin,	>swin
412
413winclr	!byte 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 1	; FarbIndex
414lftwin	!byte 0, 6, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0	; Linker Nachbar
415rgtwin	!byte 0, 2, 3, 4, 5, 6, 1, 0, 0, 0, 0, 0	; Rechter Nachbar
416
417; Menutexte
418info	!text 0,_,_,_,_,_,_,_,_, "---MacEdit---", 0
419	!text 0, "Version",_, "0.7",_,_,_,_,_,_,_,_, "vom",_, "19.4.97",0
420	!text 0, "geschrieben",_, "von:", 0
421	!text 0,_,_,_,_,_,_,_,_,_,_,_,_, "Mac",_, "Bacon/TekLords",0
422	!text 0,_,_,_,_,_, "Dies",_, "ist",_, "Freeware",_, "!",0
423	!byte 0, 0
424	!text 0,_,_,_, "Bitte",_, "eine",_, "Taste",_, "dr",ü, "cken", 0
425datei	!text $6f, "Neu", 0
426	!text $75, "Laden", 0
427	!text $76, "Nachladen", 0
428	!text $f5, "Speichern", 0
429	!text $f6, "Speichern",_, "unter", 0
430	!text $e1, "Basic", 0
431	!text $61, "Beenden", 0
432edit	!text $79, "Cut", 0
433	!text $7a, "Copy", 0
434	!text $7b, "Paste", 0
435	!text $14, "Delete", 0
436block	!text   0, "Laden", 0
437	!text   0, "Speichern", 0
438format	!text $f9, "Links", 0
439	!text $fa,_,_,_, "Rechts", 0
440	!text $fb, "Zentriert", 0
441	!text $fc, "Blocksatz", 0
442switch	!text $19, "WordWrap", 0
443	!text $07, "Beep", 0
444	!text   0, "AutoInsert", 0
445	!text $15, "Fett", 0
446	!text $16, "Kursiv", 0
447	!text $17, "Unterstrichen", 0
448	!text   0, "Revers", 0
449hilfe	!text $e4, "NochNix"
450nomem	!byte 0	; Auch 'hilfe'-Ende
451	!text "---",_,_,_,_, "Achtung",_, "!",_,_,_, "---", 0
452	!text 0, "Der",_, "Speicher",_, "ist",_, "voll",_, "!", 0
453	!byte 0, 0
454	!text 0, "Bitte",_, "eine",_, "Taste",_, "dr", ü, "cken"
455namewin	!byte 0	; Auch 'nomem'-Ende
456	!text "Bitte",_, "Filenamen",_, "eingeben", 0
457	!byte 0, 0
458	!text 0,_,_,_, ":",_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, ":", 0
459	!byte 0	; Rest unten
460dcswin	!byte 0, 0	; Auch fuer 'namewin'
461	!byte 0	; Auch fuer 'namewin'
462	!text _,_, "Ungespeicherte",_, Ä, "nderungen",_, "!",_,_, 0
463	!byte 0, 0
464	!byte 0, 0
465	!text 0,_, "[DEL]",_,_,_,_, "Verwerfen...", 0
466	!text 0,_, "[RETURN]",_, "Speichern...",_,_,_,_, "*", 0
467	!text 0,_, "[STOP]",_,_,_, "Aktion",_, "abbrechen...", 0
468lwin	!byte 0	; Auch fuer 'dcswin'
469	!text _, "Lade..."
470swin	!byte 0	; Auch fuer 'lwin'
471	!text _, "Speichere...", 0
472
473;-----Screen-Routines (VDC-Version)-----
474; V1 R1 rev4 vom 4.5.96
475; labels
476
477	scrlo	= $f0	; screentextstart
478	scrhi	= 0
479	attrhi	= 8	; colorRAM Hi
480	scrcols	= 80	; columns & lines
481	scrlins	= 22	; (screen)
482	preflen	= 80	; pref-linelength
483	bckgrnd	= 26	; screencolor-register
484	flnmpos	= 87	; filenameposition
485	wsstart	= $0fd0	; windowstack-start
486!addr	tcolor	= $f2	; attribute-buffer
487
488; Subs:
489!zone
490init		ldx repeatedtry	; first start ?
491		bne +
492			sta repeatedtry
493+		tsx		; buffer stack, bank &
494		stx stck	; NMI for end
495		ldx conreg
496		stx bank
497		ldy nmivek
498		ldx nmivek + 1
499		sty nmibuf
500		stx nmibuf + 1
501		+xbank15
502		inx		; X = 1 => 2 MHz
503		stx takt
504		dex
505		stx fnbank	; filename-CR
506		dex
507		stx locks	; 'CBM-shift' off
508		stx addr($0ac5)	; 'ASC/DIN' off
509		stx basic	; 'Basic-IRQ' off
510		jsr crsrinit	; init crsr
511		ldx #$0b	; VIC off
512		stx addr($11e7)
513		lda mode	; which mode ?
514		bmi +		; if 40 then
515			jsr e_switchmode	; switch mode
516+		lda #111	; DIN on
517		sta D8502
518		lda #%..##..##
519		sta R8502
520		jsr e_copyfont
521		lda #47		; DIN off
522		sta D8502
523		lda #<addfont1_start	; adjust font...
524		sta tmp1
525		lda #>addfont1_start
526		sta tmp1 + 1
527		lda #>addfont1_target	; Hi
528		ldx #<addfont1_target	; Lo
529		ldy #addfont1_end - addfont1_start - 1	; length
530		jsr ram2vdc	; copy first part
531		lda #<addfont2_start
532		sta tmp1
533		lda #>addfont2_start
534		sta tmp1 + 1
535		lda #>addfont2_target	; Hi
536		ldx #<addfont2_target	; Lo
537		ldy #addfont2_end - addfont2_start - 1	; length
538		jsr ram2vdc	; copy second part
539		lda clrmenu	; set attribute
540		sta color
541		jsr primm	; make menu
542		!byte Char_HOME, Char_HOME, Char_CLEAR
543		!text "Datei     ", Char_CursorRight, Char_CursorRight
544		!text "Bearbeiten", Char_CursorRight, Char_CursorRight
545		!text "Block     ", Char_CursorRight, Char_CursorRight
546		!text "Format    ", Char_CursorRight, Char_CursorRight
547		!text "Schalter  ", Char_CursorRight, Char_CursorRight
548		!text "Hilfe     ", Char_RETURN, Char_NUL
549		lda #%#...###.	; set attribute
550		sta color
551		jsr primm	; make screen
552		!text "U:00"
553		!fill 51, " "
554		!text Char_Grey2, "escape   WBI   FKUR   <=>", Char_BlueL
555		!fill 80, $a6	; separatorline (TABs)
556		!byte Char_Grey3, Char_ESCAPE, Char_At, Char_NUL
557!zone
558		lda #26		; Backgroundcolor
559		sta vdc
560		lda clrback
561		+wait_for_vdc
562		sta reg
563		lda #<nmirtn	; new NMI
564		ldx #>nmirtn
565		sta nmivek
566		stx nmivek + 1
567		sta conreg + 1	; full RAM
568		ldx #$0b	; loop for new
569-			lda keyb, x	; keyboard-tabs
570			sta addr($033e), x
571			dex
572			bpl -
573		jsr handleid	; old ID ?
574		bcc +		; then ok !
575			jsr fillmem	; else fill memory
576			jsr newtext	; defaults
577			jsr needline	; wanting line
578			ldx #FALSE
579			stx changes
580+		jsr F_info	; credits
581		lda #TRUE	; update screen
582		sta nwfrm
583		sta updatewbi	; update flags
584		ldx repeatedtry	; first start ?
585		bne +		; then load defaulttext
586			dec repeatedtry
587			jsr load
588+		jmp mainloop
589
590addfont1_target = $35f1
591addfont1_start
592	!byte %.#######
593	!byte %.#####.#
594	!byte %.##.##.#
595	!byte %.#.....#
596	!byte %.##.####
597	!byte %.#######
598	!fill 15, 0
599	!byte %.#.#.#.#
600	!fill  9, 0
601	!byte %....#...
602	!byte %....#...
603	!byte %....#...
604	!byte %....#...
605	!byte %....#...
606	!byte %....#...
607	!byte %....#...
608	!byte %....#...
609	!byte %....#...
610	!byte %....#...
611	!byte %....#...
612	!byte %....#...
613	!byte %....#...
614	!byte %....#...
615	!byte %....#...
616	!byte %....#...
617
618	!byte %....#...
619	!byte %....#...
620	!byte %....#...
621	!byte %....#...
622	!byte %....####
623	!fill 11, 0
624
625	!byte %....#...
626	!byte %....#...
627	!byte %....#...
628	!byte %....#...
629	!byte %########
630	!fill 11, 0
631
632	!byte %....#...
633	!byte %....#...
634	!byte %....#...
635	!byte %....#...
636	!byte %#####...
637	!fill 11, 0
638
639	!byte %....#...
640	!byte %....#...
641	!byte %....#...
642	!byte %....#...
643	!byte %....####
644	!byte %....#...
645	!byte %....#...
646	!byte %....#...
647	!byte %....#...
648	!byte %....#...
649	!byte %....#...
650	!byte %....#...
651	!byte %....#...
652	!byte %....#...
653	!byte %....#...
654	!byte %....#...
655
656	!fill  4, 0
657	!byte %########
658	!fill 11, 0
659
660	!byte %....#...
661	!byte %....#...
662	!byte %....#...
663	!byte %....#...
664	!byte %#####...
665	!byte %....#...
666	!byte %....#...
667	!byte %....#...
668	!byte %....#...
669	!byte %....#...
670	!byte %....#...
671	!byte %....#...
672	!byte %....#...
673	!byte %....#...
674	!byte %....#...
675	!byte %....#...
676
677	!fill  4, 0
678	!byte %....####
679	!byte %....#...
680	!byte %....#...
681	!byte %....#...
682	!byte %....#...
683	!byte %....#...
684	!byte %....#...
685	!byte %....#...
686	!byte %....#...
687	!byte %....#...
688	!byte %....#...
689	!byte %....#...
690
691	!fill  4, 0
692	!byte %########
693	!byte %....#...
694	!byte %....#...
695	!byte %....#...
696	!byte %....#...
697	!byte %....#...
698	!byte %....#...
699	!byte %....#...
700	!byte %....#...
701	!byte %....#...
702	!byte %....#...
703	!byte %....#...
704
705	!fill  4, 0
706	!byte %#####...
707	!byte %....#...
708	!byte %....#...
709	!byte %....#...
710	!byte %....#...
711	!byte %....#...
712	!byte %....#...
713	!byte %....#...
714	!byte %....#...
715	!byte %....#...
716	!byte %....#...
717	!byte %....#...
718
719	!byte %....#...
720	!byte %....#...
721	!byte %....#...
722	!byte %....#...
723	!byte %########
724	!byte %....#...
725	!byte %....#...
726	!byte %....#...
727	!byte %....#...
728	!byte %....#...
729	!byte %....#...
730addfont1_end
731addfont2_target = $3ff0
732addfont2_start
733	!byte %........
734	!byte %........
735	!byte %........
736	!byte %....#...
737	!byte %........
738	!byte %........
739	!byte %........
740	!byte %........
741addfont2_end
742
743gonot		rts		; fixme - could save a byte here
744F_goout		jsr willblost	; changes saved ?
745		beq gonot
746F_gosys		+bank15
747		jsr e_cls	; CLS
748		lda #0		; '0' for
749		sta locks	; 'CBM-Shift' on
750		sta addr($0ac5)	; 'ASC/DIN' on
751		sta basic	; 'Basic-IRQ' on
752		lda nmibuf	; restore NMI
753		ldx nmibuf + 1
754		sta nmivek
755		stx nmivek + 1
756		ldx bank	; restore bank & stack
757		stx conreg
758		ldx stck
759		txs
760		rts
761
762!zone
763bigtext		lda #0		; no empty lines,
764		ldy #scrlins	; full text
765		jmp m61
766
767newframe	+ybank15
768		lda #scrhi	; textstart on screen
769		ldx #scrlo
770		jsr ramaccess	; set vdc
771		sty conreg + 1	; full RAM
772		ldx #SCR
773		jsr getvvek	; set VekVek
774		stx nwfrm	; clear jobflag
775		lda zzbe	; Test: less text than
776		sec		; screen ?
777		sbc scry	; calculates both
778		tay		; numbers
779		lda zzbe + 1
780		sbc scry + 1
781		bne bigtext
782		cpy #scrlins - 1
783		bcs bigtext
784		iny		; Base 1
785		sty .m1
786		lda #scrlins
787		sec
788.m1=*+1:	sbc #MODIFIED8	; errechnet Leerzeilen
789; Parameter: A = Leerzeilen, Y = Textzeilen
790
791!zone
792m61		sta tmp2	; Leerzeilen
793		sty line	; zu zeigende Zeilen
794--			ldy #0		; Low-Byte
795			lda (vvek), y	; holen
796			sta lvek	; & speichern
797			iny		; High-Byte
798			lda (vvek), y	; holen
799			sta lvek + 1	; & speichern
800			lda #scrcols	; darzustellende
801			sta col		; Spalten
802			ldy scrx	; x-Versatz holen
803-				lda (lvek), y	; Zeichen holen
804				+xbank15
805				tax		; & in Screencode
806				lda atst,x	; konvertieren
807				+wait_for_vdc
808				sta reg		; in VDC
809				sta conreg + 1	; full RAM
810				iny		; Versatz erhoehen
811				dec col		; naechste Spalte
812				bne -		; schon alle = >
813			inc vvek	; naechster Vektor (2 Byte !)
814			+inc16 vvek
815			dec line	; naechste Zeile
816			bne --		; schon alle ? = >
817		+bank15
818		lda #" "
819--			dec tmp2	; Anzahl runter
820			bmi +		; ggfs Ende
821			ldy #scrcols	; Spaltenzahl
822-				+wait_for_vdc
823				sta reg		; Space setzen
824				dey		; alle Spalten ?
825				bne -
826			jmp --
827+		sta conreg + 1	; full RAM
828		rts
829
830; Folgende Routine aendert ScreenFlag,
831; z.B. esc, Menupunkte. Parameter:
832;-A = Attribut-Code
833; Einsprung setflagdata:
834;-X = Flagnr (Routine holt Daten)
835; Einsprung changeflg:
836;-Y = Laenge
837;-tmp1 = Vektor auf Position
838setflagdata	ldy flgadr, x	; Setzt Adresse (Lo)
839		sty tmp1
840		ldy #scrhi
841		sty tmp1 + 1
842		ldy flglen, x	; Holt Laenge
843
844!zone
845changeflg	sta .m3		; buffer color
846		sty .m2		; buffer length
847		lda #attrhi - scrhi
848		clc		; bend vector to
849		adc tmp1 + 1	; attributes
850		sta tmp1 + 1
851		ldy conreg	; buffer bank
852		sty .m1
853		+ybank15
854		jsr tmpaccess	; set vdc
855.m3 = * + 1:	lda #MODIFIED8	; attribute
856.m2 = * + 1:	ldy #MODIFIED8	; length
857-			+wait_for_vdc
858			sta reg		; set attributes
859			dey		; count
860			bne -
861.m1 = * + 1:	ldy #MODIFIED8	; bank
862		sty conreg
863		rts
864
865hFlag_Escape	= 0
866; 1-6 = datei, edit, block, format, switch, hilfe
867hFlag_Wrap	= 7
868hFlag_Beep	= 8
869hFlag_Insert	= 9
870
871flgadr	!byte 135,   0,  12,  24,  36,  48,  60, 144, 145, 146
872	!byte 150, 151, 152, 153, 157, 158, 159	; f k u r < = >
873flglen	!byte   6,  10,  10,  10,  10,  10,  10,   1,   1,   1
874	!byte   1,   1,   1,   1,   1,   1,   1
875
876!zone
877showwbi		lda clraktv	; Aktiv-Farbe
878		ldy wrapflag	; Flag pruefen
879		bne +		; ggfs andere Farbe
880			lda clrinak
881+		ldx #hFlag_Wrap
882		jsr setflagdata	; Farbe setzen
883		lda clraktv	; Ab hier Wiederholung
884		ldy beep
885		beq +
886			lda clrinak
887+		ldx #hFlag_Beep
888		jsr setflagdata
889		lda clraktv
890		ldy esca
891		bne +
892			lda clrinak
893+		ldx #hFlag_Insert
894		jsr setflagdata
895		lda #>txtname	; set vector
896		sta tmp1 + 1
897		lda #<txtname
898		sta tmp1
899		lda #>flnmpos	; show filename
900		ldx #<flnmpos
901		ldy #$0f
902		jsr copystr
903		ldy #FALSE	; clear flag
904		sty updatewbi
905		rts
906
907; X/A = VDC-Vector, Y = length, tmp1 = RAMpos
908!zone
909ram2vdc		sta vimm4	; buffer all
910		stx vimm5
911		sty .m2
912ram2vdc1	lda conreg	; buffer bank
913		sta .m1
914		jsr vdcprep	; prepare vdc
915-			iny		; next
916			lda (tmp1), y	; get byte
917			+wait_for_vdc
918			sta reg		; set byte
919.m2 = * + 1:		cpy #MODIFIED8	; length
920			bne -
921.m1 = * + 1:	lda #MODIFIED8	; bank
922		sta conreg
923		rts
924
925; X/A = VDC-Vector, Y = length, tmp1 = RAMpos
926!zone
927copystr		sta vimm4	; buffer all
928		stx vimm5
929		sty vimm6
930copystr1	lda conreg	; buffer bank
931		sta .m1
932		jsr vdcprep	; prepare vdc
933-			iny		; next
934			lda (tmp1), y	; get byte
935			tax		; convert
936			lda atst, x
937			+wait_for_vdc
938			sta reg		; set byte
939vimm6 = * + 1:		cpy #MODIFIED8	; length
940			bne -
941.m1 = * + 1:	lda #MODIFIED8	; bank
942		sta conreg
943		rts
944
945; preparations for ram2vdc & copystr
946!zone
947vdcprep		+bank15
948vimm4 = * + 1:	lda #MODIFIED8	; High
949vimm5 = * + 1:	ldx #MODIFIED8	; Low
950		jsr ramaccess
951		ldy #$ff	; pre-index
952		rts
953
954xpos	!byte 0	; rename-Var
955
956F_rnmtxt
957		lda #$0f	; TEXTname !
958
959!zone
960rename		pha		; sichert Namepointer
961		tay
962		ldx #$0f	; copy Filename
963-			lda txtname, y
964			sta dosname, x
965			dey
966			dex
967			bpl -
968		lda conreg	; Bank sichern
969		pha
970		+ram0io
971		ldx #0		; Cursor an Start
972		stx xpos
973		jsr crsrnew	; new copy
974		ldx #hWindow_Filename	; Namensfenster bauen
975		stx menunr
976		jsr makewin
977		ldx #3		; 3. "Menupunkt"
978		stx menupoint
979		jsr calcpoint	; Adresse berechnen
980		adc #3		; +4 (C = 1)
981		sta vimm5	; set Lo
982		bcc +
983			inc tmp1 + 1
984+		lda tmp1 + 1
985		sta vimm4	; set Hi
986		ldy #<dosname	; set rampointer
987		sty tmp1
988		ldy #>dosname
989		sty tmp1 + 1
990		ldy #$0f	; set length
991		sty vimm6
992
993!zone
994showname	jsr copystr1	; show name
995--			ldy #9		; Y- und X-Wert
996			lda xpos	; errechnen
997			clc
998			adc #$20
999			jsr crsrset	; Cursor setzen
1000-			jsr getchar	; Byte holen und
1001			tax		; sichern
1002			and #%.##.....	; Command ?
1003			beq +		; ggfs =>
1004				eor #%.##.....
1005				beq +
1006					lda esca	; AutoInsert ?
1007					beq ++		; ggfs
1008						jsr einf1	; insert
1009++					txa		; Zeichen an Position
1010					ldy xpos	; setzen
1011					sta dosname, y
1012					jsr rechts1	; eins rechts
1013					jmp showname
1014+			txa		; Byte holen
1015			cmp #Char_CursorRight
1016			beq rechts
1017			cmp #Char_CursorLeft
1018			beq links
1019			cmp #Char_DEL
1020			beq back
1021			cmp #CharOwn_Delete
1022			beq dele
1023			cmp #Char_INST
1024			beq einf
1025			cmp #Char_RETURN
1026			beq +
1027				cmp #Char_STOP
1028				bne -		; Nein = >
1029				lda #0		; Stop-
1030+			sta xpos	; Flag sichern
1031			jsr pullscr	; Window weg
1032			jsr crsrold	; old copy
1033			pla		; alte Bank
1034			sta conreg
1035			pla		; Y: = Namepointer
1036			tay
1037			lda xpos	; STOP ?
1038			beq .noname	; Nein: Namen kopieren
1039			ldx #$0f
1040-				lda dosname, x
1041				sta txtname, y
1042				dey
1043				dex
1044				bpl -
1045			lda #TRUE	; und Update fordern
1046			sta updatewbi
1047.noname			rts		; Z = Stopflag
1048rechts			jsr rechts1	; Eins weiter
1049			jmp --
1050links			jsr links1	; Eins zurück
1051			jmp --
1052back		jsr links1	; Erst zurück, dann
1053dele		jsr dele1	; löschen
1054		jmp showname
1055einf		jsr einf1	; Eins freimachen
1056		jmp showname
1057
1058!zone
1059rechts1		inc xpos	; Pos += 1 & pruefen
1060		jmp +
1061
1062links1			dec xpos	; Pos- = 1 & pruefen
1063+		lda xpos		; Negativ ?
1064		bpl +
1065			lda #0		; Dann Pos 0
1066+		cmp #$0c		; Ende ?
1067		bcc +
1068			lda #$0b	; Dann zum Rand
1069+		sta xpos		; Pos setzen
1070		rts
1071
1072!zone
1073dele1		ldy xpos	; Start bei Cursor
1074-			cpy #$0b	; schon am Rand ?
1075			beq +		; Dann Ende !
1076			lda dosname + 1, y	; Sonst shiften
1077			sta dosname, y
1078			iny
1079			jmp -
1080
1081+		lda #" "	; Space setzen
1082		sta dosname, y
1083		rts
1084
1085!zone
1086einf1		ldy #$0b	; Start am Rand
1087-			cpy xpos	; schon fertig ?
1088			beq +		; Ja = >
1089			lda dosname - 1, y	; Zeichen shiften
1090			sta dosname, y
1091			dey
1092			jmp -
1093
1094+		lda #" "	; Space an Pos
1095		sta dosname, y
1096		rts
1097
1098!zone
1099; access for new window
1100wsnew		+ldax wspntr
1101		jmp +
1102
1103; access for old window
1104wsold		+ldax wsback
1105+		ldy #24		; VDC (Vscroll)
1106		sty vdc
1107		ldy #$a0	; 'block-copy'
1108		+wait_for_vdc
1109		sty reg		; set
1110		jmp ramaccess
1111
1112; sichert Screen & erzeugt Rahmen und BG fuer Window
1113; Windownr in menunr !
1114!zone
1115makewin		inc manywins	; eins mehr !
1116		lda conreg	; Bank sichern
1117		pha
1118		+ram0io
1119		ldx menunr	; Holt Nummer
1120		beq +		; Ist das Window ein
1121			cpx #hWindow_FirstAfterMenu	; Menu-Window, wird
1122			bcs +		; das Flag aktiviert
1123				lda clrmenu1
1124				jsr setflagdata
1125+		jsr wsnew	; macht VDC zum Stack
1126		ldy wsback + 1	; alter end-pointer
1127		sta wsback + 1	; wird zu neuem
1128		lda wsback	; last-pointer
1129		stx wsback
1130		jsr stashbt	; buffer last pointer
1131		tya
1132		jsr stashbt	; (Hi)
1133		ldx menunr	; get Win-Nr
1134		txa
1135		jsr stashbt	; wird gestacked
1136		lda winlo, x	; Holt mit X die
1137		sta tmp1	; anderen Parameter
1138		sta tmp2
1139		lda winhi, x
1140		sta tmp1 + 1
1141		clc
1142		adc #attrhi - scrhi
1143		sta tmp2 + 1
1144		ldy winwi, x	; get width
1145		sty .m1		; for colorate
1146		iny		; convert
1147		sty mWidth	; for push
1148		lda winclr, x	; get colorcode
1149		tay		; convert
1150		lda clrboxs, y	; get color
1151		sta .m2		; in Immediate
1152		jsr scrn2stck	; push chars
1153		lda tmp2	; attrib-vector
1154		sta tmp1
1155		lda tmp2 + 1
1156		sta tmp1 + 1
1157		jsr scrn2stck	; push attributes
1158		ldy #18		; VDC (access Hi)
1159		sty vdc
1160		jsr fetchbt	; get pointerHi
1161		sta wspntr + 1	; set pointerHi
1162		iny		; VDC (access Lo)
1163		sty vdc
1164		jsr fetchbt	; get pointerLo
1165		sta wspntr	; set pointerLo
1166; ab hier wird gefaerbt
1167		ldy #24		; VDC (Vscroll)
1168		sty vdc
1169		lda #$20	; 'block-write'
1170		jsr stashbt
1171		lda winhe, x	; get height
1172		sta line
1173-			+ldax tmp2	; get target
1174			jsr ramaccess	; set vdc
1175.m2 = * + 1:		lda #MODIFIED8	; attribute
1176			jsr stashbt	; set attribute
1177			dey		; VDC (counter)
1178			sty vdc
1179.m1 = * + 1:		lda #MODIFIED8	; width
1180			jsr stashbt	; start write
1181			lda #scrcols	; address for next row
1182			clc
1183			adc tmp2
1184			sta tmp2
1185			bcc +
1186				inc tmp2 + 1
1187+			dec line	; alle Zeilen ?
1188			bpl -		; Nein = >
1189; bisher Backup und Faerben, jetzt Win
1190		ldx menunr	; get Win-Nr
1191		lda winlo, x	; get location, width,
1192		sta tmp1	; heigth & textvector
1193		lda winhi, x
1194		sta tmp1 + 1
1195		lda winwi, x
1196		sta col
1197		lda winhe, x
1198		sta line
1199		lda winadlo, x
1200		sta tmp2
1201		lda winadhi, x
1202		sta tmp2 + 1
1203; hier oberer Rand
1204		jsr tmpaccess	; set vdc
1205		ldx col		; get width &
1206		dex		; convert
1207		lda #chrol	; 'Oben Links'
1208		jsr stashbt	; set
1209		lda #chroo	; 'Oben'
1210-			jsr stashbt	; set
1211			dex
1212			bne -
1213		lda #chror	; 'Oben Rechts'
1214		jsr stashbt	; set
1215		dec line	; naechste Zeile
1216; jetzt die Zeilen
1217.field		lda #scrcols	; rechnet den
1218		clc		; Vektor auf die
1219		adc tmp1	; naechste Zeile
1220		sta tmp1	; um
1221		bcc +
1222			inc tmp1 + 1
1223+		jsr tmpaccess	; set vdc
1224		ldy #1		; textindex 1
1225		lda #chrll	; 'Links'
1226		jsr stashbt	; set
1227-			lda (tmp2), y	; get char
1228			beq +		; end ? if not then
1229			tax		; convert to screencode
1230			lda atst, x
1231			jsr stashbt	; output
1232			iny		; next column
1233			jmp -
1234+		tya		; if string has ended then
1235		tax		; remember memory offset in x
1236-			cpy col		; finished ?
1237			beq +		; if not then
1238			lda #chrmm	; output inner space
1239			jsr stashbt
1240			iny		; next column
1241			jmp -
1242+		lda #chrrr	; when finished, output right border
1243		jsr stashbt
1244		txa		; calculate new memory pointer
1245		sec
1246		adc tmp2	; line
1247		sta tmp2
1248		bcc +
1249			inc tmp2 + 1
1250+		dec line	; schon alle Zeilen ?
1251		bne .field	; ggfs Schleife
1252; jetzt der Unterrand
1253		lda #scrcols	; calculate next line
1254		clc
1255		adc tmp1
1256		sta tmp1
1257		bcc +
1258			inc tmp1 + 1
1259+		jsr tmpaccess	; set vdc
1260		ldx col		; get width &
1261		dex		; convert
1262		lda #chrul	; 'Unten Links'
1263		jsr stashbt	; set
1264		lda #chruu	; 'Unten'
1265-			jsr stashbt	; set
1266			dex
1267			bne -
1268		lda #chrur	; 'Unten Rechts'
1269		jsr stashbt	; set
1270		pla		; alte Bank
1271		sta conreg
1272		rts
1273
1274; Windowdaten:
1275; 0 = StartBox
1276; 1 bis 6 sind Menuleiste
1277; 7 = MemFull
1278; 8 = FileName
1279; 9 = SaveChanges?
1280; 10 = Load
1281; 11 = Save
1282; Addys (Ecke links oben):
1283winlo	!byte 152, 80, 92, 104, 116, 128, 140, 235, 235, 151, 146, 144
1284winhi	!byte   2,  0,  0,   0,   0,   0,   0,   2,   2,   2,   3,   3
1285
1286!zone
1287scrn2stck	lda winhe, x	; get height
1288		sta line
1289-			ldy #32		; VDC (source Hi)
1290			sty vdc
1291			lda tmp1 + 1
1292			jsr stashbt	; set sourceHi
1293			iny		; VDC (source Lo)
1294			sty vdc
1295			lda tmp1
1296			jsr stashbt	; set sourceLo
1297			ldy #30		; VDC (counter)
1298			sty vdc
1299mWidth = * + 1:		lda #MODIFIED8	; width
1300			jsr stashbt	; start copy
1301			lda #scrcols	; address for next row
1302			clc
1303			adc tmp1
1304			sta tmp1
1305			bcc +
1306				inc tmp1 + 1
1307+			dec line	; alle Zeilen ?
1308			bpl -		; Nein = >
1309		rts
1310
1311!zone
1312pullscr		lda conreg	; Bank sichern
1313		pha
1314		+ram0io
1315		jsr wsold	; init stack for read
1316		sta wspntr + 1	; new write-start
1317		stx wspntr	; new write-start
1318		jsr fetchbt	; get old laststart
1319		sta wsback	; and use
1320		jsr fetchbt
1321		sta wsback + 1
1322		jsr fetchbt	; get handle from stack
1323		tax
1324		lda winlo, x	; Holt mit X die
1325		sta tmp1	; anderen Parameter
1326		sta tmp2
1327		lda winhi, x
1328		sta tmp1 + 1
1329		clc
1330		adc #attrhi - scrhi
1331		sta tmp2 + 1
1332		ldy winwi, x	; get width
1333		iny		; convert
1334		sty .m1
1335		ldy #18		; VDC (access Hi)
1336		sty vdc
1337		jsr fetchbt	; get Hi
1338		ldy #32		; VDC (source Hi)
1339		sty vdc
1340		jsr stashbt	; set Hi
1341		ldy #19		; VDC (access Lo)
1342		sty vdc
1343		jsr fetchbt	; get Lo
1344		ldy #33		; VDC (source Lo)
1345		sty vdc
1346		jsr stashbt	; set Lo
1347		jsr stck2scrn	; pull chars
1348		lda tmp2	; attrib-vector
1349		sta tmp1
1350		lda tmp2 + 1
1351		sta tmp1 + 1
1352		jsr stck2scrn	; pull attributes
1353		txa		; if menu-window,
1354		beq +		; then deactivate flag
1355			cmp #7
1356			bcs +
1357				lda clrmenu
1358				jsr setflagdata
1359+		dec manywins	; minus one win
1360		pla		; restore bank
1361		sta conreg
1362		rts
1363stck2scrn	lda winhe, x	; get height
1364		sta line
1365-			ldy #18		; VDC (access Hi)
1366			sty vdc
1367			lda tmp1 + 1
1368			jsr stashbt	; set targetHi
1369			iny		; VDC (access Lo)
1370			sty vdc
1371			lda tmp1
1372			jsr stashbt	; set targetLo
1373			ldy #30		; VDC (counter)
1374			sty vdc
1375.m1 = * + 1:		lda #MODIFIED8	; width
1376			jsr stashbt	; start copy
1377			lda #scrcols	; address for next row
1378			clc
1379			adc tmp1
1380			sta tmp1
1381			bcc +
1382				inc tmp1 + 1
1383+			dec line	; alle Zeilen ?
1384			bpl -		; Nein = >
1385		rts
1386
1387wspntr	!word wsstart		; win-stackpointer
1388wsback	!word wsstart		; last pointer
1389
1390F_menu		lda #<wsstart	; init win-stack
1391		sta wspntr
1392		lda #>wsstart
1393		sta wspntr + 1
1394		jsr crsrnew	; new copy
1395		ldx #0		; yet no windows
1396		stx manywins
1397		inx		; menu 1 & point 1
1398		stx menunr
1399		stx menupoint
1400		jsr menuloop	; menu-routine
1401		jsr crsrold	; old copy
1402		rts		; fixme - could save one byte here
1403
1404tmpaccess	+ldax tmp1
1405
1406; A = Highbyte, X = Lowbyte
1407!zone
1408ramaccess	ldy #18		; VDC (access Hi)
1409		sty vdc
1410		+wait_for_vdc
1411		sta reg		; set Hi
1412		iny		; VDC (access Lo)
1413		sty vdc
1414		+wait_for_vdc
1415		stx reg		; set Lo
1416		ldy #31		; VDC (ram data)
1417		sty vdc
1418		rts
1419
1420fetchbt		+wait_for_vdc
1421		lda reg		; fetch byte
1422		rts
1423
1424stashbt		+wait_for_vdc
1425		sta reg		; stash byte
1426		rts
1427