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