mirror of
https://github.com/uffejakobsen/acme.git
synced 2024-12-01 16:50:46 +00:00
af1bd69455
Added "!symbollist" alias for "!sl" pseudo opcode. Change in undocumented ("illegal") opcodes: ANC #8 now generates 0x0b instead of 0x2b (both opcodes do the same thing). Added experimental support for generating a report listing. Thanks to Johann Klasek for writing this extension patch. git-svn-id: https://svn.code.sf.net/p/acme-crossass/code-0/trunk@40 4df02467-bbd4-4a76-a152-e7ce94205b78
1427 lines
30 KiB
Plaintext
1427 lines
30 KiB
Plaintext
;ACME 0.95
|
|
|
|
!zone
|
|
F_info ldx #hWindow_InfoBox
|
|
jmp xwindow
|
|
|
|
memfull ldx #hWindow_NoMemLeft
|
|
|
|
xwindow lda conreg ; Bank sichern
|
|
pha
|
|
+yram0io
|
|
stx menunr
|
|
jsr crsroff ; Cursor aus
|
|
jsr makewin ; Win bauen
|
|
jsr getchar ; Auf Taste warten
|
|
jsr pullscr ; Win weg
|
|
jsr crsron ; Cursor an
|
|
pla ; alte Bank
|
|
sta conreg
|
|
rts
|
|
|
|
F_sw lda wrapflag ; Toggle Flag
|
|
eor #$ff
|
|
sta wrapflag
|
|
lda #TRUE ; Update fordern
|
|
sta updatewbi
|
|
rts
|
|
|
|
F_lfeed jsr poslvek ; LineVek
|
|
jsr insert1 ; immer insert
|
|
lda #Char_RETURN ; 'CR' an Cursorpos
|
|
sta (lvek), y
|
|
sta nwfrm ; NewFrame fordern
|
|
sta changes ; Veraendert !
|
|
jsr posparw ; PARW ?
|
|
ldy posx ; Cursor am Rand ?
|
|
cpy llen
|
|
beq poswrap ; Nein: Wrap
|
|
lda posy ; Zeile in wrap
|
|
sta wrpy
|
|
lda posy + 1
|
|
sta wrpy + 1
|
|
jsr found ; und runterwrap
|
|
rts
|
|
|
|
; splittet VOLLE Wrap-Zeilen
|
|
linefull ldy llen ; Zeilenlaenge-1
|
|
dey
|
|
jmp found ; wrap
|
|
|
|
cancelwrp jmp memfull ; Zeilen alle
|
|
|
|
;multiwrap:
|
|
;jsr getlvek ; LineVek
|
|
;!by 44 ; Wrap (bit-Trick)
|
|
!zone
|
|
poswrap ldx #POS
|
|
stx xindex ; sichern
|
|
lda scry, x ; Zahl umkopieren
|
|
sta wrpy
|
|
lda scry + 1, x
|
|
sta wrpy + 1
|
|
jsr posparw ; PARW ?
|
|
bcs proofparw ; Dann kein WRAP
|
|
ldy llen ; LineEnd = Space ?
|
|
lda (lvek), y
|
|
cmp #" "
|
|
beq proofparw ; Ja = > PARW
|
|
- dey ; sonst zurueck bis zu
|
|
beq linefull ; Space, "-", CR oder
|
|
lda (lvek), y ; LineStart (bekommt
|
|
cmp #" " ; Sonderbehandlung)
|
|
beq found
|
|
cmp #"-"
|
|
beq found
|
|
cmp #Char_RETURN
|
|
bne -
|
|
|
|
!zone
|
|
found sty wrpx ; puffert Y und addiert
|
|
tya ; es zum Vektor, damit
|
|
clc ; gut geshiftet wird
|
|
adc lvek
|
|
sta tmp2
|
|
lda lvek + 1
|
|
adc #0
|
|
sta tmp2 + 1
|
|
lda llen ; errechnet Anzahl zu
|
|
sec ; shiftender Bytes
|
|
sbc wrpx ; als 'zahl'
|
|
sta zahl
|
|
jsr needline ; fordert Zeile
|
|
bcs cancelwrp ; ggfs Abbruch
|
|
jsr incwrp ; naechste Zeile holen
|
|
ldx #WRP ; neue Zeile in die
|
|
ldy #ZZB ; naechste
|
|
jsr rollfwd
|
|
ldy zahl ; Anzahl Bytes
|
|
ldx #" " ; Space
|
|
- lda (tmp2), y ; holt Byte und setzt
|
|
sta (lvek), y
|
|
txa ; loescht Quelle
|
|
sta (tmp2), y
|
|
dey
|
|
bne -
|
|
ldx xindex ; errechnet neue
|
|
lda scrx, x ; Variablenwerte
|
|
sec ; Sind nur relevant,
|
|
sbc wrpx ; wenn Location
|
|
beq proofparw ; mitgewrapped wurde.
|
|
bmi proofparw
|
|
sta scrx, x
|
|
+inc16x scry
|
|
|
|
!zone
|
|
proofparw ldx wrapflag ; Wrap erlaubt ?
|
|
beq + ; Nein = > Ende
|
|
.pl jsr incwrp ; naechste Zeile
|
|
ldx #WRP
|
|
jsr getlvek ; LineVek
|
|
jsr parw ; PARWen
|
|
bcs .pl ; ggfs Schleife
|
|
+ ldx xindex ; Restore LineVek
|
|
jsr getlvek
|
|
rts
|
|
|
|
!zone
|
|
incwrp +inc16 wrpy ; Y hoeher
|
|
rts
|
|
|
|
!zone
|
|
posparw clc
|
|
ldx #POS ; Cursor-Index
|
|
lda wrapflag ; Wrap erlaubt ?
|
|
beq + ; ggfs Ende
|
|
jsr parw ; PARWed
|
|
bcc + ; ggfs Variablen
|
|
jsr moveloc ; angleichen
|
|
+ php ; C sichern
|
|
ldx xindex ; Restore LineVek
|
|
jsr getlvek
|
|
plp ; C zurueck
|
|
rts
|
|
|
|
!zone
|
|
.no clc ; C = 0 < = > nix PARWed
|
|
rts
|
|
parw stx xindex ; Sichert Index
|
|
ldx #ZZB ; mit PARW-Zeile vergleichen
|
|
ldy xindex
|
|
jsr cmp16bit
|
|
bcc .no ; kleiner = > Abbruch
|
|
ldx xindex ; X zurueck
|
|
lda scry + 1, x ; holt Vektor und
|
|
ldy scry, x ; zaehlt runter
|
|
bne +
|
|
sec
|
|
sbc #1
|
|
+ sta prwy + 1 ; Hi speichern
|
|
dey ; Lo runter & speichern
|
|
sty prwy
|
|
ora prwy ; Vorige Zeile = 0 ?
|
|
beq .no ; Dann Ende !
|
|
lda lvek ; lvek in tmp2
|
|
sta tmp2
|
|
lda lvek + 1
|
|
sta tmp2 + 1
|
|
ldx #PRW ; lvek auf vorige Zeile
|
|
jsr getlvek
|
|
jsr findend ; sucht Zeilenende
|
|
bne + ; Zeile leer ?
|
|
jsr delline ; loescht Zeile und
|
|
lda llen ; stellt Werte ein,
|
|
sta zahl ; die die Location
|
|
lda #0 ; entsprechend
|
|
sta prwx ; verschieben
|
|
sec ; C = 1 < = > gePARWt
|
|
rts
|
|
+ cmp #Char_RETURN ; letztes Zeichen CR ?
|
|
beq .no ; Dann Ende !
|
|
cmp #"-"
|
|
beq + ; Dann kein Space
|
|
iny ; reservieren
|
|
+ sty prwx ; Y auf LastByte
|
|
lda llen ; errechnet Versatz,
|
|
sec ; bei dem Suche
|
|
sbc prwx ; gestartet wird
|
|
beq .no ; nix frei = > Ende
|
|
tay
|
|
lda prwx ; LineVek += Versatz, um
|
|
clc ; besser zu shiften
|
|
adc lvek
|
|
sta lvek
|
|
lda lvek + 1
|
|
adc #0
|
|
sta lvek + 1
|
|
lda (tmp2), y ; 1. Quellbyte holen
|
|
- cmp #" "
|
|
beq +
|
|
dey
|
|
beq .no ; LineStart = > Abbruch
|
|
lda (tmp2),y ; next Quellbyte
|
|
cmp #"-"
|
|
beq +
|
|
cmp #Char_RETURN
|
|
bne -
|
|
+ sty zahl ; Anzahl sichern
|
|
- sta (lvek), y ; Zielbyte setzen
|
|
dey
|
|
beq +
|
|
lda (tmp2), y ; Quellbyte holen
|
|
jmp - ; Schleife
|
|
+ lda llen ; Zeilenlaenge minus
|
|
sec ; 'zahl' Bytes muessen
|
|
sbc zahl ; noch shifted werden
|
|
sta .m
|
|
lda tmp2 ; Muss zum Schieben
|
|
clc ; wieder Vektor
|
|
adc zahl ; aendern
|
|
sta lvek
|
|
lda tmp2 + 1
|
|
adc #0
|
|
sta lvek + 1
|
|
; Y noch 0 !
|
|
- iny ; Y weiter
|
|
lda (lvek), y ; holt & setzt Byte
|
|
sta (tmp2), y
|
|
.m = * + 1: cpy #MODIFIED8 ; Anzahl Bytes
|
|
bne -
|
|
lda #" "
|
|
- iny ; new line damit
|
|
sta (tmp2), y ; auffuellen
|
|
cpy llen ; bis Ende
|
|
bne -
|
|
sec ; C = 1 < = > PARWed
|
|
rts
|
|
|
|
moveloc ldx xindex
|
|
lda zahl ; X-Pos vor PARWgrenze?
|
|
cmp scrx, x
|
|
bcc inline ; Dann Pos += Anzahl
|
|
clc
|
|
lda scrx, x
|
|
adc prwx
|
|
sta scrx, x
|
|
lda prwy ; verringerten Y-Wert
|
|
sta scry, x ; einkopieren
|
|
lda prwy + 1
|
|
sta scry + 1, x
|
|
sec ; C = 1
|
|
rts
|
|
|
|
inline lda scrx, x ; (C = 1)
|
|
sbc zahl ; setzt Cursor zurueck
|
|
adc #0 ; +Carry
|
|
sta scrx, x
|
|
rts ; (C = 0)
|
|
|
|
!zone
|
|
findend ldy llen ; Versatz auf Ende
|
|
- lda (lvek), y ; holt Zeichen bis
|
|
cmp #" " ; Zeilenstart oder
|
|
bne endfound ; nicht-Space
|
|
dey
|
|
bne -
|
|
endfound rts ; Z = 1 = > Zeile leer (fixme - save a byte)
|
|
|
|
; Menuevariablen
|
|
manywins !byte 0 ; Anzahl Wins
|
|
menunr !byte 0 ; Menunr
|
|
menupoint !word 0 ; Menupunkt+Puffer
|
|
|
|
changewin beq lp19 ; kein Nachbar = > Ende
|
|
pha ; neue Nr sichern
|
|
jsr pullscr ; altes Win weg
|
|
pla ; neue Nr holen
|
|
tax ; prueft ob Menupunkt
|
|
stx menunr ; beibehalten werden
|
|
lda menupoint ; kann. Ggfs auf 1
|
|
cmp winhe, x ; setzen
|
|
bcc menuloop
|
|
lda #1
|
|
sta menupoint
|
|
|
|
!zone
|
|
menuloop jsr makewin ; Window bauen
|
|
pointloop jsr calcpoint ; berechnet Adresse
|
|
lda clraktl ; holt Farbe
|
|
jsr changeflg ; aendert Flag
|
|
lp19 jsr getchar ; Auf Zeichen warten
|
|
ldx menunr ; Verkuerzt folgende
|
|
ldy menupoint ; Abfragen
|
|
cmp #Char_RETURN
|
|
beq menucom ; Ausfuehren
|
|
cmp #Char_ShiftRETURN
|
|
beq menucom ; Ausfuehren
|
|
;cmp #$80 ; Linke Maustaste ?
|
|
;beq mouselft ; =>
|
|
cmp #Char_CursorUp
|
|
bne +
|
|
dey ; Punkt hoch & wech
|
|
jmp prfpoint
|
|
+ cmp #Char_CursorDown
|
|
bne +
|
|
iny ; Punkt runter & wech
|
|
jmp prfpoint
|
|
+ cmp #Char_CursorLeft
|
|
bne +
|
|
lda lftwin, x ; Nachbar holen & wech
|
|
jmp changewin
|
|
+ cmp #Char_CursorRight
|
|
bne +
|
|
lda rgtwin, x ; Nachbar holen & wech
|
|
jmp changewin
|
|
+ cmp #Char_STOP
|
|
bne lp19 ; Nein = > Schleife
|
|
menuend jsr pullscr ; sonst restaurieren
|
|
rts ; und Ende (fixme - could save a byte here)
|
|
|
|
!zone
|
|
menucom pha ; CR/CS sichern, dazu
|
|
txa ; die aktuelle Menunr
|
|
pha ; und den Menupunkt
|
|
tya
|
|
pha
|
|
lda winadlo, x ; stellt Zeiger auf
|
|
sta tmp1 ; Menutexte
|
|
lda winadhi, x
|
|
sta tmp1 + 1
|
|
ldy #0 ; Versatz Null
|
|
jmp + ; in die Schleife
|
|
- iny ; naechstes Byte holen
|
|
lda (tmp1), y
|
|
bne - ; sucht Ende-Null
|
|
iny ; Versatz auf Command
|
|
+ lda (tmp1), y ; Command holen
|
|
dec menupoint ; richtiger Punkt ?
|
|
bne - ; Nein = > erneut
|
|
tax ; Ja = > Command !
|
|
jsr execom
|
|
jsr crsroff ; Sicherheitshalber...
|
|
pla ; Werte zurueck
|
|
sta menupoint
|
|
pla
|
|
sta menunr
|
|
jsr calcpoint ; Vektor stellen
|
|
pla ; Ausloesecode zurueck
|
|
cmp #Char_RETURN
|
|
beq menuend ; Dann Ende
|
|
jmp lp19 ; Sonst Schleife (ShiftRETURN)
|
|
;-----
|
|
;mouselft:
|
|
; jmp lp19 ; Linke Maustaste
|
|
;-----
|
|
|
|
!zone
|
|
prfpoint tya ; Wenn Punkt = 0,
|
|
bne ++ ; dann Punkt: = Letzter
|
|
ldy winhe, x
|
|
dey
|
|
jmp +
|
|
++ cmp winhe, x ; Wenn Punkt zu gross,
|
|
bcc + ; dann Punkt: = 1
|
|
ldy #1
|
|
+ sty menupoint + 1 ; neuen Punkt sichern
|
|
jsr calcpoint ; alten berechnen und
|
|
lda clrboxs ; mit WinFarbe faerben
|
|
jsr changeflg
|
|
ldy menupoint + 1 ; neuen Punkt holen,
|
|
sty menupoint ; wird aktueller
|
|
jmp pointloop
|
|
|
|
; errechnet Adresse des Menupunkts
|
|
!zone
|
|
calcpoint ldx menunr ; holt Nummer & damit
|
|
lda winhi, x ; Screen-Addy
|
|
sta tmp1 + 1 ; Hi setzen
|
|
lda winlo, x
|
|
ldx menupoint ; holt Punkt
|
|
sec ; +1 (Rand weg)
|
|
- adc #scrcols ; addiert Zeile
|
|
bcc + ; Page sichern
|
|
inc tmp1 + 1
|
|
clc
|
|
+ dex ; ggfs
|
|
bne - ; Schleife
|
|
sta tmp1 ; Lo setzen
|
|
sec ; Erledigt Arbeit fuer
|
|
ldx menunr ; aufrufende Routinen,
|
|
ldy winwi, x ; da X, Y, C richtig
|
|
dey ; belegt werden
|
|
rts
|
|
|
|
; Windowdaten:
|
|
hWindow_InfoBox = 0
|
|
; 1 bis 6 sind Menuleiste
|
|
hWindow_FirstAfterMenu = 7
|
|
hWindow_NoMemLeft = 7
|
|
hWindow_Filename = 8
|
|
hWindow_DCS = 9
|
|
hWindow_Load = 10
|
|
hWindow_Save = 11
|
|
|
|
winwi !byte 31, 16, 7, 13, 10, 14, 8, 25, 25, 32, 10, 15 ; Breite - 1
|
|
winhe !byte 8, 8, 5, 3, 5, 8, 2, 5, 5, 8, 2, 2 ; Hoehe - 1
|
|
|
|
; Vektoren auf Texte:
|
|
winadlo !byte <info, <datei, <edit, <block, <format,<switch
|
|
!byte <hilfe, <nomem, <namewin, <dcswin,<lwin, <swin
|
|
winadhi !byte >info, >datei, >edit, >block, >format,>switch
|
|
!byte >hilfe, >nomem, >namewin, >dcswin,>lwin, >swin
|
|
|
|
winclr !byte 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 1 ; FarbIndex
|
|
lftwin !byte 0, 6, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0 ; Linker Nachbar
|
|
rgtwin !byte 0, 2, 3, 4, 5, 6, 1, 0, 0, 0, 0, 0 ; Rechter Nachbar
|
|
|
|
; Menutexte
|
|
info !text 0,_,_,_,_,_,_,_,_, "---MacEdit---", 0
|
|
!text 0, "Version",_, "0.7",_,_,_,_,_,_,_,_, "vom",_, "19.4.97",0
|
|
!text 0, "geschrieben",_, "von:", 0
|
|
!text 0,_,_,_,_,_,_,_,_,_,_,_,_, "Mac",_, "Bacon/TekLords",0
|
|
!text 0,_,_,_,_,_, "Dies",_, "ist",_, "Freeware",_, "!",0
|
|
!byte 0, 0
|
|
!text 0,_,_,_, "Bitte",_, "eine",_, "Taste",_, "dr",ü, "cken", 0
|
|
datei !text $6f, "Neu", 0
|
|
!text $75, "Laden", 0
|
|
!text $76, "Nachladen", 0
|
|
!text $f5, "Speichern", 0
|
|
!text $f6, "Speichern",_, "unter", 0
|
|
!text $e1, "Basic", 0
|
|
!text $61, "Beenden", 0
|
|
edit !text $79, "Cut", 0
|
|
!text $7a, "Copy", 0
|
|
!text $7b, "Paste", 0
|
|
!text $14, "Delete", 0
|
|
block !text 0, "Laden", 0
|
|
!text 0, "Speichern", 0
|
|
format !text $f9, "Links", 0
|
|
!text $fa,_,_,_, "Rechts", 0
|
|
!text $fb, "Zentriert", 0
|
|
!text $fc, "Blocksatz", 0
|
|
switch !text $19, "WordWrap", 0
|
|
!text $07, "Beep", 0
|
|
!text 0, "AutoInsert", 0
|
|
!text $15, "Fett", 0
|
|
!text $16, "Kursiv", 0
|
|
!text $17, "Unterstrichen", 0
|
|
!text 0, "Revers", 0
|
|
hilfe !text $e4, "NochNix"
|
|
nomem !byte 0 ; Auch 'hilfe'-Ende
|
|
!text "---",_,_,_,_, "Achtung",_, "!",_,_,_, "---", 0
|
|
!text 0, "Der",_, "Speicher",_, "ist",_, "voll",_, "!", 0
|
|
!byte 0, 0
|
|
!text 0, "Bitte",_, "eine",_, "Taste",_, "dr", ü, "cken"
|
|
namewin !byte 0 ; Auch 'nomem'-Ende
|
|
!text "Bitte",_, "Filenamen",_, "eingeben", 0
|
|
!byte 0, 0
|
|
!text 0,_,_,_, ":",_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_, ":", 0
|
|
!byte 0 ; Rest unten
|
|
dcswin !byte 0, 0 ; Auch fuer 'namewin'
|
|
!byte 0 ; Auch fuer 'namewin'
|
|
!text _,_, "Ungespeicherte",_, Ä, "nderungen",_, "!",_,_, 0
|
|
!byte 0, 0
|
|
!byte 0, 0
|
|
!text 0,_, "[DEL]",_,_,_,_, "Verwerfen...", 0
|
|
!text 0,_, "[RETURN]",_, "Speichern...",_,_,_,_, "*", 0
|
|
!text 0,_, "[STOP]",_,_,_, "Aktion",_, "abbrechen...", 0
|
|
lwin !byte 0 ; Auch fuer 'dcswin'
|
|
!text _, "Lade..."
|
|
swin !byte 0 ; Auch fuer 'lwin'
|
|
!text _, "Speichere...", 0
|
|
|
|
;-----Screen-Routines (VDC-Version)-----
|
|
; V1 R1 rev4 vom 4.5.96
|
|
; labels
|
|
|
|
scrlo = $f0 ; screentextstart
|
|
scrhi = 0
|
|
attrhi = 8 ; colorRAM Hi
|
|
scrcols = 80 ; columns & lines
|
|
scrlins = 22 ; (screen)
|
|
preflen = 80 ; pref-linelength
|
|
bckgrnd = 26 ; screencolor-register
|
|
flnmpos = 87 ; filenameposition
|
|
wsstart = $0fd0 ; windowstack-start
|
|
!addr tcolor = $f2 ; attribute-buffer
|
|
|
|
; Subs:
|
|
!zone
|
|
init ldx repeatedtry ; first start ?
|
|
bne +
|
|
sta repeatedtry
|
|
+ tsx ; buffer stack, bank &
|
|
stx stck ; NMI for end
|
|
ldx conreg
|
|
stx bank
|
|
ldy nmivek
|
|
ldx nmivek + 1
|
|
sty nmibuf
|
|
stx nmibuf + 1
|
|
+xbank15
|
|
inx ; X = 1 => 2 MHz
|
|
stx takt
|
|
dex
|
|
stx fnbank ; filename-CR
|
|
dex
|
|
stx locks ; 'CBM-shift' off
|
|
stx addr($0ac5) ; 'ASC/DIN' off
|
|
stx basic ; 'Basic-IRQ' off
|
|
jsr crsrinit ; init crsr
|
|
ldx #$0b ; VIC off
|
|
stx addr($11e7)
|
|
lda mode ; which mode ?
|
|
bmi + ; if 40 then
|
|
jsr e_switchmode ; switch mode
|
|
+ lda #111 ; DIN on
|
|
sta D8502
|
|
lda #%..##..##
|
|
sta R8502
|
|
jsr e_copyfont
|
|
lda #47 ; DIN off
|
|
sta D8502
|
|
lda #<addfont1_start ; adjust font...
|
|
sta tmp1
|
|
lda #>addfont1_start
|
|
sta tmp1 + 1
|
|
lda #>addfont1_target ; Hi
|
|
ldx #<addfont1_target ; Lo
|
|
ldy #addfont1_end - addfont1_start - 1 ; length
|
|
jsr ram2vdc ; copy first part
|
|
lda #<addfont2_start
|
|
sta tmp1
|
|
lda #>addfont2_start
|
|
sta tmp1 + 1
|
|
lda #>addfont2_target ; Hi
|
|
ldx #<addfont2_target ; Lo
|
|
ldy #addfont2_end - addfont2_start - 1 ; length
|
|
jsr ram2vdc ; copy second part
|
|
lda clrmenu ; set attribute
|
|
sta color
|
|
jsr primm ; make menu
|
|
!byte Char_HOME, Char_HOME, Char_CLEAR
|
|
!text "Datei ", Char_CursorRight, Char_CursorRight
|
|
!text "Bearbeiten", Char_CursorRight, Char_CursorRight
|
|
!text "Block ", Char_CursorRight, Char_CursorRight
|
|
!text "Format ", Char_CursorRight, Char_CursorRight
|
|
!text "Schalter ", Char_CursorRight, Char_CursorRight
|
|
!text "Hilfe ", Char_RETURN, Char_NUL
|
|
lda #%#...###. ; set attribute
|
|
sta color
|
|
jsr primm ; make screen
|
|
!text "U:00"
|
|
!fill 51, " "
|
|
!text Char_Grey2, "escape WBI FKUR <=>", Char_BlueL
|
|
!fill 80, $a6 ; separatorline (TABs)
|
|
!byte Char_Grey3, Char_ESCAPE, Char_At, Char_NUL
|
|
!zone
|
|
lda #26 ; Backgroundcolor
|
|
sta vdc
|
|
lda clrback
|
|
+wait_for_vdc
|
|
sta reg
|
|
lda #<nmirtn ; new NMI
|
|
ldx #>nmirtn
|
|
sta nmivek
|
|
stx nmivek + 1
|
|
sta conreg + 1 ; full RAM
|
|
ldx #$0b ; loop for new
|
|
- lda keyb, x ; keyboard-tabs
|
|
sta addr($033e), x
|
|
dex
|
|
bpl -
|
|
jsr handleid ; old ID ?
|
|
bcc + ; then ok !
|
|
jsr fillmem ; else fill memory
|
|
jsr newtext ; defaults
|
|
jsr needline ; wanting line
|
|
ldx #FALSE
|
|
stx changes
|
|
+ jsr F_info ; credits
|
|
lda #TRUE ; update screen
|
|
sta nwfrm
|
|
sta updatewbi ; update flags
|
|
ldx repeatedtry ; first start ?
|
|
bne + ; then load defaulttext
|
|
dec repeatedtry
|
|
jsr load
|
|
+ jmp mainloop
|
|
|
|
addfont1_target = $35f1
|
|
addfont1_start
|
|
!byte %.#######
|
|
!byte %.#####.#
|
|
!byte %.##.##.#
|
|
!byte %.#.....#
|
|
!byte %.##.####
|
|
!byte %.#######
|
|
!fill 15, 0
|
|
!byte %.#.#.#.#
|
|
!fill 9, 0
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....####
|
|
!fill 11, 0
|
|
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %########
|
|
!fill 11, 0
|
|
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %#####...
|
|
!fill 11, 0
|
|
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....####
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
|
|
!fill 4, 0
|
|
!byte %########
|
|
!fill 11, 0
|
|
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %#####...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
|
|
!fill 4, 0
|
|
!byte %....####
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
|
|
!fill 4, 0
|
|
!byte %########
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
|
|
!fill 4, 0
|
|
!byte %#####...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %########
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
!byte %....#...
|
|
addfont1_end
|
|
addfont2_target = $3ff0
|
|
addfont2_start
|
|
!byte %........
|
|
!byte %........
|
|
!byte %........
|
|
!byte %....#...
|
|
!byte %........
|
|
!byte %........
|
|
!byte %........
|
|
!byte %........
|
|
addfont2_end
|
|
|
|
gonot rts ; fixme - could save a byte here
|
|
F_goout jsr willblost ; changes saved ?
|
|
beq gonot
|
|
F_gosys +bank15
|
|
jsr e_cls ; CLS
|
|
lda #0 ; '0' for
|
|
sta locks ; 'CBM-Shift' on
|
|
sta addr($0ac5) ; 'ASC/DIN' on
|
|
sta basic ; 'Basic-IRQ' on
|
|
lda nmibuf ; restore NMI
|
|
ldx nmibuf + 1
|
|
sta nmivek
|
|
stx nmivek + 1
|
|
ldx bank ; restore bank & stack
|
|
stx conreg
|
|
ldx stck
|
|
txs
|
|
rts
|
|
|
|
!zone
|
|
bigtext lda #0 ; no empty lines,
|
|
ldy #scrlins ; full text
|
|
jmp m61
|
|
|
|
newframe +ybank15
|
|
lda #scrhi ; textstart on screen
|
|
ldx #scrlo
|
|
jsr ramaccess ; set vdc
|
|
sty conreg + 1 ; full RAM
|
|
ldx #SCR
|
|
jsr getvvek ; set VekVek
|
|
stx nwfrm ; clear jobflag
|
|
lda zzbe ; Test: less text than
|
|
sec ; screen ?
|
|
sbc scry ; calculates both
|
|
tay ; numbers
|
|
lda zzbe + 1
|
|
sbc scry + 1
|
|
bne bigtext
|
|
cpy #scrlins - 1
|
|
bcs bigtext
|
|
iny ; Base 1
|
|
sty .m1
|
|
lda #scrlins
|
|
sec
|
|
.m1=*+1: sbc #MODIFIED8 ; errechnet Leerzeilen
|
|
; Parameter: A = Leerzeilen, Y = Textzeilen
|
|
|
|
!zone
|
|
m61 sta tmp2 ; Leerzeilen
|
|
sty line ; zu zeigende Zeilen
|
|
-- ldy #0 ; Low-Byte
|
|
lda (vvek), y ; holen
|
|
sta lvek ; & speichern
|
|
iny ; High-Byte
|
|
lda (vvek), y ; holen
|
|
sta lvek + 1 ; & speichern
|
|
lda #scrcols ; darzustellende
|
|
sta col ; Spalten
|
|
ldy scrx ; x-Versatz holen
|
|
- lda (lvek), y ; Zeichen holen
|
|
+xbank15
|
|
tax ; & in Screencode
|
|
lda atst,x ; konvertieren
|
|
+wait_for_vdc
|
|
sta reg ; in VDC
|
|
sta conreg + 1 ; full RAM
|
|
iny ; Versatz erhoehen
|
|
dec col ; naechste Spalte
|
|
bne - ; schon alle = >
|
|
inc vvek ; naechster Vektor (2 Byte !)
|
|
+inc16 vvek
|
|
dec line ; naechste Zeile
|
|
bne -- ; schon alle ? = >
|
|
+bank15
|
|
lda #" "
|
|
-- dec tmp2 ; Anzahl runter
|
|
bmi + ; ggfs Ende
|
|
ldy #scrcols ; Spaltenzahl
|
|
- +wait_for_vdc
|
|
sta reg ; Space setzen
|
|
dey ; alle Spalten ?
|
|
bne -
|
|
jmp --
|
|
+ sta conreg + 1 ; full RAM
|
|
rts
|
|
|
|
; Folgende Routine aendert ScreenFlag,
|
|
; z.B. esc, Menupunkte. Parameter:
|
|
;-A = Attribut-Code
|
|
; Einsprung setflagdata:
|
|
;-X = Flagnr (Routine holt Daten)
|
|
; Einsprung changeflg:
|
|
;-Y = Laenge
|
|
;-tmp1 = Vektor auf Position
|
|
setflagdata ldy flgadr, x ; Setzt Adresse (Lo)
|
|
sty tmp1
|
|
ldy #scrhi
|
|
sty tmp1 + 1
|
|
ldy flglen, x ; Holt Laenge
|
|
|
|
!zone
|
|
changeflg sta .m3 ; buffer color
|
|
sty .m2 ; buffer length
|
|
lda #attrhi - scrhi
|
|
clc ; bend vector to
|
|
adc tmp1 + 1 ; attributes
|
|
sta tmp1 + 1
|
|
ldy conreg ; buffer bank
|
|
sty .m1
|
|
+ybank15
|
|
jsr tmpaccess ; set vdc
|
|
.m3 = * + 1: lda #MODIFIED8 ; attribute
|
|
.m2 = * + 1: ldy #MODIFIED8 ; length
|
|
- +wait_for_vdc
|
|
sta reg ; set attributes
|
|
dey ; count
|
|
bne -
|
|
.m1 = * + 1: ldy #MODIFIED8 ; bank
|
|
sty conreg
|
|
rts
|
|
|
|
hFlag_Escape = 0
|
|
; 1-6 = datei, edit, block, format, switch, hilfe
|
|
hFlag_Wrap = 7
|
|
hFlag_Beep = 8
|
|
hFlag_Insert = 9
|
|
|
|
flgadr !byte 135, 0, 12, 24, 36, 48, 60, 144, 145, 146
|
|
!byte 150, 151, 152, 153, 157, 158, 159 ; f k u r < = >
|
|
flglen !byte 6, 10, 10, 10, 10, 10, 10, 1, 1, 1
|
|
!byte 1, 1, 1, 1, 1, 1, 1
|
|
|
|
!zone
|
|
showwbi lda clraktv ; Aktiv-Farbe
|
|
ldy wrapflag ; Flag pruefen
|
|
bne + ; ggfs andere Farbe
|
|
lda clrinak
|
|
+ ldx #hFlag_Wrap
|
|
jsr setflagdata ; Farbe setzen
|
|
lda clraktv ; Ab hier Wiederholung
|
|
ldy beep
|
|
beq +
|
|
lda clrinak
|
|
+ ldx #hFlag_Beep
|
|
jsr setflagdata
|
|
lda clraktv
|
|
ldy esca
|
|
bne +
|
|
lda clrinak
|
|
+ ldx #hFlag_Insert
|
|
jsr setflagdata
|
|
lda #>txtname ; set vector
|
|
sta tmp1 + 1
|
|
lda #<txtname
|
|
sta tmp1
|
|
lda #>flnmpos ; show filename
|
|
ldx #<flnmpos
|
|
ldy #$0f
|
|
jsr copystr
|
|
ldy #FALSE ; clear flag
|
|
sty updatewbi
|
|
rts
|
|
|
|
; X/A = VDC-Vector, Y = length, tmp1 = RAMpos
|
|
!zone
|
|
ram2vdc sta vimm4 ; buffer all
|
|
stx vimm5
|
|
sty .m2
|
|
ram2vdc1 lda conreg ; buffer bank
|
|
sta .m1
|
|
jsr vdcprep ; prepare vdc
|
|
- iny ; next
|
|
lda (tmp1), y ; get byte
|
|
+wait_for_vdc
|
|
sta reg ; set byte
|
|
.m2 = * + 1: cpy #MODIFIED8 ; length
|
|
bne -
|
|
.m1 = * + 1: lda #MODIFIED8 ; bank
|
|
sta conreg
|
|
rts
|
|
|
|
; X/A = VDC-Vector, Y = length, tmp1 = RAMpos
|
|
!zone
|
|
copystr sta vimm4 ; buffer all
|
|
stx vimm5
|
|
sty vimm6
|
|
copystr1 lda conreg ; buffer bank
|
|
sta .m1
|
|
jsr vdcprep ; prepare vdc
|
|
- iny ; next
|
|
lda (tmp1), y ; get byte
|
|
tax ; convert
|
|
lda atst, x
|
|
+wait_for_vdc
|
|
sta reg ; set byte
|
|
vimm6 = * + 1: cpy #MODIFIED8 ; length
|
|
bne -
|
|
.m1 = * + 1: lda #MODIFIED8 ; bank
|
|
sta conreg
|
|
rts
|
|
|
|
; preparations for ram2vdc & copystr
|
|
!zone
|
|
vdcprep +bank15
|
|
vimm4 = * + 1: lda #MODIFIED8 ; High
|
|
vimm5 = * + 1: ldx #MODIFIED8 ; Low
|
|
jsr ramaccess
|
|
ldy #$ff ; pre-index
|
|
rts
|
|
|
|
xpos !byte 0 ; rename-Var
|
|
|
|
F_rnmtxt
|
|
lda #$0f ; TEXTname !
|
|
|
|
!zone
|
|
rename pha ; sichert Namepointer
|
|
tay
|
|
ldx #$0f ; copy Filename
|
|
- lda txtname, y
|
|
sta dosname, x
|
|
dey
|
|
dex
|
|
bpl -
|
|
lda conreg ; Bank sichern
|
|
pha
|
|
+ram0io
|
|
ldx #0 ; Cursor an Start
|
|
stx xpos
|
|
jsr crsrnew ; new copy
|
|
ldx #hWindow_Filename ; Namensfenster bauen
|
|
stx menunr
|
|
jsr makewin
|
|
ldx #3 ; 3. "Menupunkt"
|
|
stx menupoint
|
|
jsr calcpoint ; Adresse berechnen
|
|
adc #3 ; +4 (C = 1)
|
|
sta vimm5 ; set Lo
|
|
bcc +
|
|
inc tmp1 + 1
|
|
+ lda tmp1 + 1
|
|
sta vimm4 ; set Hi
|
|
ldy #<dosname ; set rampointer
|
|
sty tmp1
|
|
ldy #>dosname
|
|
sty tmp1 + 1
|
|
ldy #$0f ; set length
|
|
sty vimm6
|
|
|
|
!zone
|
|
showname jsr copystr1 ; show name
|
|
-- ldy #9 ; Y- und X-Wert
|
|
lda xpos ; errechnen
|
|
clc
|
|
adc #$20
|
|
jsr crsrset ; Cursor setzen
|
|
- jsr getchar ; Byte holen und
|
|
tax ; sichern
|
|
and #%.##..... ; Command ?
|
|
beq + ; ggfs =>
|
|
eor #%.##.....
|
|
beq +
|
|
lda esca ; AutoInsert ?
|
|
beq ++ ; ggfs
|
|
jsr einf1 ; insert
|
|
++ txa ; Zeichen an Position
|
|
ldy xpos ; setzen
|
|
sta dosname, y
|
|
jsr rechts1 ; eins rechts
|
|
jmp showname
|
|
+ txa ; Byte holen
|
|
cmp #Char_CursorRight
|
|
beq rechts
|
|
cmp #Char_CursorLeft
|
|
beq links
|
|
cmp #Char_DEL
|
|
beq back
|
|
cmp #CharOwn_Delete
|
|
beq dele
|
|
cmp #Char_INST
|
|
beq einf
|
|
cmp #Char_RETURN
|
|
beq +
|
|
cmp #Char_STOP
|
|
bne - ; Nein = >
|
|
lda #0 ; Stop-
|
|
+ sta xpos ; Flag sichern
|
|
jsr pullscr ; Window weg
|
|
jsr crsrold ; old copy
|
|
pla ; alte Bank
|
|
sta conreg
|
|
pla ; Y: = Namepointer
|
|
tay
|
|
lda xpos ; STOP ?
|
|
beq .noname ; Nein: Namen kopieren
|
|
ldx #$0f
|
|
- lda dosname, x
|
|
sta txtname, y
|
|
dey
|
|
dex
|
|
bpl -
|
|
lda #TRUE ; und Update fordern
|
|
sta updatewbi
|
|
.noname rts ; Z = Stopflag
|
|
rechts jsr rechts1 ; Eins weiter
|
|
jmp --
|
|
links jsr links1 ; Eins zurück
|
|
jmp --
|
|
back jsr links1 ; Erst zurück, dann
|
|
dele jsr dele1 ; löschen
|
|
jmp showname
|
|
einf jsr einf1 ; Eins freimachen
|
|
jmp showname
|
|
|
|
!zone
|
|
rechts1 inc xpos ; Pos += 1 & pruefen
|
|
jmp +
|
|
|
|
links1 dec xpos ; Pos- = 1 & pruefen
|
|
+ lda xpos ; Negativ ?
|
|
bpl +
|
|
lda #0 ; Dann Pos 0
|
|
+ cmp #$0c ; Ende ?
|
|
bcc +
|
|
lda #$0b ; Dann zum Rand
|
|
+ sta xpos ; Pos setzen
|
|
rts
|
|
|
|
!zone
|
|
dele1 ldy xpos ; Start bei Cursor
|
|
- cpy #$0b ; schon am Rand ?
|
|
beq + ; Dann Ende !
|
|
lda dosname + 1, y ; Sonst shiften
|
|
sta dosname, y
|
|
iny
|
|
jmp -
|
|
|
|
+ lda #" " ; Space setzen
|
|
sta dosname, y
|
|
rts
|
|
|
|
!zone
|
|
einf1 ldy #$0b ; Start am Rand
|
|
- cpy xpos ; schon fertig ?
|
|
beq + ; Ja = >
|
|
lda dosname - 1, y ; Zeichen shiften
|
|
sta dosname, y
|
|
dey
|
|
jmp -
|
|
|
|
+ lda #" " ; Space an Pos
|
|
sta dosname, y
|
|
rts
|
|
|
|
!zone
|
|
; access for new window
|
|
wsnew +ldax wspntr
|
|
jmp +
|
|
|
|
; access for old window
|
|
wsold +ldax wsback
|
|
+ ldy #24 ; VDC (Vscroll)
|
|
sty vdc
|
|
ldy #$a0 ; 'block-copy'
|
|
+wait_for_vdc
|
|
sty reg ; set
|
|
jmp ramaccess
|
|
|
|
; sichert Screen & erzeugt Rahmen und BG fuer Window
|
|
; Windownr in menunr !
|
|
!zone
|
|
makewin inc manywins ; eins mehr !
|
|
lda conreg ; Bank sichern
|
|
pha
|
|
+ram0io
|
|
ldx menunr ; Holt Nummer
|
|
beq + ; Ist das Window ein
|
|
cpx #hWindow_FirstAfterMenu ; Menu-Window, wird
|
|
bcs + ; das Flag aktiviert
|
|
lda clrmenu1
|
|
jsr setflagdata
|
|
+ jsr wsnew ; macht VDC zum Stack
|
|
ldy wsback + 1 ; alter end-pointer
|
|
sta wsback + 1 ; wird zu neuem
|
|
lda wsback ; last-pointer
|
|
stx wsback
|
|
jsr stashbt ; buffer last pointer
|
|
tya
|
|
jsr stashbt ; (Hi)
|
|
ldx menunr ; get Win-Nr
|
|
txa
|
|
jsr stashbt ; wird gestacked
|
|
lda winlo, x ; Holt mit X die
|
|
sta tmp1 ; anderen Parameter
|
|
sta tmp2
|
|
lda winhi, x
|
|
sta tmp1 + 1
|
|
clc
|
|
adc #attrhi - scrhi
|
|
sta tmp2 + 1
|
|
ldy winwi, x ; get width
|
|
sty .m1 ; for colorate
|
|
iny ; convert
|
|
sty mWidth ; for push
|
|
lda winclr, x ; get colorcode
|
|
tay ; convert
|
|
lda clrboxs, y ; get color
|
|
sta .m2 ; in Immediate
|
|
jsr scrn2stck ; push chars
|
|
lda tmp2 ; attrib-vector
|
|
sta tmp1
|
|
lda tmp2 + 1
|
|
sta tmp1 + 1
|
|
jsr scrn2stck ; push attributes
|
|
ldy #18 ; VDC (access Hi)
|
|
sty vdc
|
|
jsr fetchbt ; get pointerHi
|
|
sta wspntr + 1 ; set pointerHi
|
|
iny ; VDC (access Lo)
|
|
sty vdc
|
|
jsr fetchbt ; get pointerLo
|
|
sta wspntr ; set pointerLo
|
|
; ab hier wird gefaerbt
|
|
ldy #24 ; VDC (Vscroll)
|
|
sty vdc
|
|
lda #$20 ; 'block-write'
|
|
jsr stashbt
|
|
lda winhe, x ; get height
|
|
sta line
|
|
- +ldax tmp2 ; get target
|
|
jsr ramaccess ; set vdc
|
|
.m2 = * + 1: lda #MODIFIED8 ; attribute
|
|
jsr stashbt ; set attribute
|
|
dey ; VDC (counter)
|
|
sty vdc
|
|
.m1 = * + 1: lda #MODIFIED8 ; width
|
|
jsr stashbt ; start write
|
|
lda #scrcols ; address for next row
|
|
clc
|
|
adc tmp2
|
|
sta tmp2
|
|
bcc +
|
|
inc tmp2 + 1
|
|
+ dec line ; alle Zeilen ?
|
|
bpl - ; Nein = >
|
|
; bisher Backup und Faerben, jetzt Win
|
|
ldx menunr ; get Win-Nr
|
|
lda winlo, x ; get location, width,
|
|
sta tmp1 ; heigth & textvector
|
|
lda winhi, x
|
|
sta tmp1 + 1
|
|
lda winwi, x
|
|
sta col
|
|
lda winhe, x
|
|
sta line
|
|
lda winadlo, x
|
|
sta tmp2
|
|
lda winadhi, x
|
|
sta tmp2 + 1
|
|
; hier oberer Rand
|
|
jsr tmpaccess ; set vdc
|
|
ldx col ; get width &
|
|
dex ; convert
|
|
lda #chrol ; 'Oben Links'
|
|
jsr stashbt ; set
|
|
lda #chroo ; 'Oben'
|
|
- jsr stashbt ; set
|
|
dex
|
|
bne -
|
|
lda #chror ; 'Oben Rechts'
|
|
jsr stashbt ; set
|
|
dec line ; naechste Zeile
|
|
; jetzt die Zeilen
|
|
.field lda #scrcols ; rechnet den
|
|
clc ; Vektor auf die
|
|
adc tmp1 ; naechste Zeile
|
|
sta tmp1 ; um
|
|
bcc +
|
|
inc tmp1 + 1
|
|
+ jsr tmpaccess ; set vdc
|
|
ldy #1 ; textindex 1
|
|
lda #chrll ; 'Links'
|
|
jsr stashbt ; set
|
|
- lda (tmp2), y ; get char
|
|
beq + ; end ? if not then
|
|
tax ; convert to screencode
|
|
lda atst, x
|
|
jsr stashbt ; output
|
|
iny ; next column
|
|
jmp -
|
|
+ tya ; if string has ended then
|
|
tax ; remember memory offset in x
|
|
- cpy col ; finished ?
|
|
beq + ; if not then
|
|
lda #chrmm ; output inner space
|
|
jsr stashbt
|
|
iny ; next column
|
|
jmp -
|
|
+ lda #chrrr ; when finished, output right border
|
|
jsr stashbt
|
|
txa ; calculate new memory pointer
|
|
sec
|
|
adc tmp2 ; line
|
|
sta tmp2
|
|
bcc +
|
|
inc tmp2 + 1
|
|
+ dec line ; schon alle Zeilen ?
|
|
bne .field ; ggfs Schleife
|
|
; jetzt der Unterrand
|
|
lda #scrcols ; calculate next line
|
|
clc
|
|
adc tmp1
|
|
sta tmp1
|
|
bcc +
|
|
inc tmp1 + 1
|
|
+ jsr tmpaccess ; set vdc
|
|
ldx col ; get width &
|
|
dex ; convert
|
|
lda #chrul ; 'Unten Links'
|
|
jsr stashbt ; set
|
|
lda #chruu ; 'Unten'
|
|
- jsr stashbt ; set
|
|
dex
|
|
bne -
|
|
lda #chrur ; 'Unten Rechts'
|
|
jsr stashbt ; set
|
|
pla ; alte Bank
|
|
sta conreg
|
|
rts
|
|
|
|
; Windowdaten:
|
|
; 0 = StartBox
|
|
; 1 bis 6 sind Menuleiste
|
|
; 7 = MemFull
|
|
; 8 = FileName
|
|
; 9 = SaveChanges?
|
|
; 10 = Load
|
|
; 11 = Save
|
|
; Addys (Ecke links oben):
|
|
winlo !byte 152, 80, 92, 104, 116, 128, 140, 235, 235, 151, 146, 144
|
|
winhi !byte 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 3
|
|
|
|
!zone
|
|
scrn2stck lda winhe, x ; get height
|
|
sta line
|
|
- ldy #32 ; VDC (source Hi)
|
|
sty vdc
|
|
lda tmp1 + 1
|
|
jsr stashbt ; set sourceHi
|
|
iny ; VDC (source Lo)
|
|
sty vdc
|
|
lda tmp1
|
|
jsr stashbt ; set sourceLo
|
|
ldy #30 ; VDC (counter)
|
|
sty vdc
|
|
mWidth = * + 1: lda #MODIFIED8 ; width
|
|
jsr stashbt ; start copy
|
|
lda #scrcols ; address for next row
|
|
clc
|
|
adc tmp1
|
|
sta tmp1
|
|
bcc +
|
|
inc tmp1 + 1
|
|
+ dec line ; alle Zeilen ?
|
|
bpl - ; Nein = >
|
|
rts
|
|
|
|
!zone
|
|
pullscr lda conreg ; Bank sichern
|
|
pha
|
|
+ram0io
|
|
jsr wsold ; init stack for read
|
|
sta wspntr + 1 ; new write-start
|
|
stx wspntr ; new write-start
|
|
jsr fetchbt ; get old laststart
|
|
sta wsback ; and use
|
|
jsr fetchbt
|
|
sta wsback + 1
|
|
jsr fetchbt ; get handle from stack
|
|
tax
|
|
lda winlo, x ; Holt mit X die
|
|
sta tmp1 ; anderen Parameter
|
|
sta tmp2
|
|
lda winhi, x
|
|
sta tmp1 + 1
|
|
clc
|
|
adc #attrhi - scrhi
|
|
sta tmp2 + 1
|
|
ldy winwi, x ; get width
|
|
iny ; convert
|
|
sty .m1
|
|
ldy #18 ; VDC (access Hi)
|
|
sty vdc
|
|
jsr fetchbt ; get Hi
|
|
ldy #32 ; VDC (source Hi)
|
|
sty vdc
|
|
jsr stashbt ; set Hi
|
|
ldy #19 ; VDC (access Lo)
|
|
sty vdc
|
|
jsr fetchbt ; get Lo
|
|
ldy #33 ; VDC (source Lo)
|
|
sty vdc
|
|
jsr stashbt ; set Lo
|
|
jsr stck2scrn ; pull chars
|
|
lda tmp2 ; attrib-vector
|
|
sta tmp1
|
|
lda tmp2 + 1
|
|
sta tmp1 + 1
|
|
jsr stck2scrn ; pull attributes
|
|
txa ; if menu-window,
|
|
beq + ; then deactivate flag
|
|
cmp #7
|
|
bcs +
|
|
lda clrmenu
|
|
jsr setflagdata
|
|
+ dec manywins ; minus one win
|
|
pla ; restore bank
|
|
sta conreg
|
|
rts
|
|
stck2scrn lda winhe, x ; get height
|
|
sta line
|
|
- ldy #18 ; VDC (access Hi)
|
|
sty vdc
|
|
lda tmp1 + 1
|
|
jsr stashbt ; set targetHi
|
|
iny ; VDC (access Lo)
|
|
sty vdc
|
|
lda tmp1
|
|
jsr stashbt ; set targetLo
|
|
ldy #30 ; VDC (counter)
|
|
sty vdc
|
|
.m1 = * + 1: lda #MODIFIED8 ; width
|
|
jsr stashbt ; start copy
|
|
lda #scrcols ; address for next row
|
|
clc
|
|
adc tmp1
|
|
sta tmp1
|
|
bcc +
|
|
inc tmp1 + 1
|
|
+ dec line ; alle Zeilen ?
|
|
bpl - ; Nein = >
|
|
rts
|
|
|
|
wspntr !word wsstart ; win-stackpointer
|
|
wsback !word wsstart ; last pointer
|
|
|
|
F_menu lda #<wsstart ; init win-stack
|
|
sta wspntr
|
|
lda #>wsstart
|
|
sta wspntr + 1
|
|
jsr crsrnew ; new copy
|
|
ldx #0 ; yet no windows
|
|
stx manywins
|
|
inx ; menu 1 & point 1
|
|
stx menunr
|
|
stx menupoint
|
|
jsr menuloop ; menu-routine
|
|
jsr crsrold ; old copy
|
|
rts ; fixme - could save one byte here
|
|
|
|
tmpaccess +ldax tmp1
|
|
|
|
; A = Highbyte, X = Lowbyte
|
|
!zone
|
|
ramaccess ldy #18 ; VDC (access Hi)
|
|
sty vdc
|
|
+wait_for_vdc
|
|
sta reg ; set Hi
|
|
iny ; VDC (access Lo)
|
|
sty vdc
|
|
+wait_for_vdc
|
|
stx reg ; set Lo
|
|
ldy #31 ; VDC (ram data)
|
|
sty vdc
|
|
rts
|
|
|
|
fetchbt +wait_for_vdc
|
|
lda reg ; fetch byte
|
|
rts
|
|
|
|
stashbt +wait_for_vdc
|
|
sta reg ; stash byte
|
|
rts
|