Aber dann würde er ja immer ALLE Einträge neu PRINTen, das stelle ich mir bei einem kompletten Bildschirm schwierig vor
Nein. Das Prinzip ist, einen Eintrag - den bisher aktivierten - nochmal, nicht-invertiert darzustellen und einen weiteren - den ab jetzt aktivierten - nochmal invertiert anzuzeigen - also zwei PRINT-Statements.
Hier mal ein BASIC-Unterprogramm für vertikale Menüs, dass ich in den Achtzigern geschrieben habe. Kurzes überfliegen sagt mir:
- gewünschte Position des Menüs in den Variablen X/Y ablegen, Anzahl der Menü-Einträge in UH, die Menü-Einträge selbst in AA$(1) bis AA$(UH).
- mit GOSUB 40 aufrufen. Menü wird Cursor-Tasten und Return bedient, STOP (oder CONTROL+C, wenn STOP nicht per POKE unschädlich gemacht wurde) bricht das Menü ab.
- Nach Aufruf des Menüs steht die Nummer des ausgewählten Menüpunkts in der Variable B. Ist diese Variable 0, wurde das Menü abgebrochen.
- Sonstige vom Unterprogramm (intern) benutzte Variablen: RR$, A$. Irgendwo im Programm sollte man natürlich noch AA$() auf die maximal mögliche Anzahl von Menü-Einträgen DIMensionieren.
Der von dir gewünschte Ansatz "über den Bildschirmspeicher" wird niemals schnell genug arbeiten.
Code
40 poke214,y:fora=1touh:poke211,x:sys58640:printaa$(a):next
41 b=1:rr$="{rvon}":gosub47
42 poke198,0:wait198,1:geta$:ifa$="{stop}"thenb=0:return
43 ifa$=chr$(13)thenreturn
44 ifa$="{down}"thenrr$="":gosub47:b=b+1+(b=uh)*uh:rr$="{rvon}":gosub47:goto42
45 ifa$="{up}"thenrr$="":gosub47:b=b-1-(b=1)*uh:rr$="{rvon}":gosub47:goto42
46 goto42
47 poke211,x:poke214,y+b-1:sys58640:printrr$;aa$(b):return