schnelle Hilfe für Textausgabe in Assembler gesucht


schnelle Hilfe für Textausgabe in Assembler gesucht

von Heaven_tqa » So 23. Jul 2006, 17:23
Hallo!

ich brauche relativ schnell eure hilfe, wie kann ich systemroutine für die textausgabe benutzen?

ich will direkt eine routine im rom aufrufen, welche über die systemvariablen cursorx,y ($54ff.) einen text ausgibt. ich möchte aber nur bedingt einen "richtigen" handler etc öffnen.

in einem von RMTs beispielsourcen wird die routine:

ldx #<text>text
jsr $c642

verwendet, was auch bei mir klappt, aber ich kann nicht einen zweiten text dahinter printen, daher meine frage:

a) wie setze ich den cursor wieder auf die gleiche zeile, da ja $9b am ende des textstrings den cursor runter bewegt? ein manuelles verändern von $54ff hat nicht geholfen...

b) gibt es auch ein anderes steuerzeichen als $9b? wie muss der textstring enden, um das EOL zu verhindern?

von Heaven_tqa » So 23. Jul 2006, 17:33
eins geklärt, ich sollte "curscol" und "cursrow" nicht verwechseln... ;)

von HiassofT » So 23. Jul 2006, 18:29
Gibt's einen tieferen Grund, wieso Du nicht die normalen Handler-Funktionen nehmen willst?

Standardmäßig ist Kanal 0 als Editor geöffnet. Um einen Text auszugeben kannst Du zB auch die "block put" Funktion verwenden. Du musst dann natürlich die String-Länge setzen, dafür benötigst Du kein EOL am Ende des Strings.
Code: Alles auswählen
LDX #0
LDA #11
STA ICCOM,X
LDA #TEXT&255
STA ICBAL,X
LDA #TEXT/256
STA ICBAH,X
LDA #LEN&255
STA ICBLL,X
LDA #LEN/256
STA ICBLH,X
JSR CIOV

Diese Methode hat den Vorteil, daß sie mit jedem OS funktioniert. Direkte Einsprünge ins OS ("jsr $c642") sind keine so gute Idee...

so long,

Hias

von Heaven_tqa » So 23. Jul 2006, 19:07
ich dachte, ich müsste erst einen handler öffnen usw...

ich habe aber variable text längen...

wie würde der OS aufruf lauten, der auch ein textende überprüft? und welchen ich mit entsprechenden variablen positionieren kann?

von HiassofT » So 23. Jul 2006, 20:26
Heaven_tqa hat geschrieben:ich habe aber variable text längen...

wie würde der OS aufruf lauten, der auch ein textende überprüft? und welchen ich mit entsprechenden variablen positionieren kann?

Also das Äquivalent zum "Print" Befehl in Basic (mit EOL) ist das "Put Record" Kommando der CIO. ICCOM muß dazu auf 9 gesetzt werden.
ICBLL und ICBLH enthalten die maximale Länge des Textes. Enthält der Text kein EOL, wird automatisch eines angehängt. Ist in den ersten Zeichen (bis zur Maximallänge) ein EOL vorhanden, wird der Text bis zum (und inklusive) EOL ausgegeben.

Wenn Du zusätzlich den Cursor positionieren möchtest, setze einfach vorher $54 und $55 und gebe dann den Text aus. Wenn Du nur den Cursor positionieren möchtest, gib einfach ein "Cursor Right" und ein "Cursor Left" aus.

Wegen der variablen Textlänge: Wenn der Puffer eine fixe Länge hat und der Rest mit Leerzeichen gefüllt ist, kannst Du natürlich immer den ganzen Puffer ausgeben. Damit wird dann evtl. noch da stehender Text automatisch gelöscht. Oder Du berechnest die Länge des Textes und legst sie dann in ICBLL/H ab. Für Menüs (oder längere Texte mit EOLs drin) nehme ich immer das "Put Block" (11) Kommando. Der Code sieht dann in etwa so aus (BPUT ist ein Makro das einfach Kanalnummer, Länge und Adresse als Parameter nimmt und dann den Code, den ich gepostet habe, entsprechend aufruft:
Code: Alles auswählen
BPUT 0, MENULEN, MENU
...
MENU .BYTE "bla bla bla", 155, "bla bla"
MENULEN = * - MENU


so long,

Hias

von HiassofT » So 23. Jul 2006, 20:59
Noch ein Nachtrag: Wenn Du mehr Beispiel-Code suchst, schaue zB mal in den Source des MyPicoDos Initializers, File "myinit.src" http://www.horus.com/~hias/tmp/mypdos-060219.zip.

Suche mal nach "GOTOXY", in dem Code gebe ich an verschiedenen Stellen einen Text aus, der als Default für die folgende Eingabe dient. Das mache ich so, daß ich mir die Cursorposition merke, den Text ausgebe, die Cursorposition wieder auf die vorherigen Werte setze und dann ein "Cursor Right + Cursor Left" ausgebe, danach starte ich den Input.

so long,

Hias

von Heaven_tqa » So 23. Jul 2006, 21:15
ich habe das so gelöst, scheint aber ein bug im rest vom code zu sein, weil der text im spiel nicht ausgegeben wird...

[/code]
;print weapon into status line3
print_armor_weapon lda #0
sta cursorx
sta cursorx+1
sta cursory
ldx pl_ac_id
lda item_normal_texttabl,x
ldy item_normal_texttabh,x
tax
jsr print

lda #20
sta cursorx
lda #0
sta cursory
sta cursorx+1
; lda 53770
; and #7
; tax
ldx pl_weapon_id
lda item_normal_texttabl,x
ldy item_normal_texttabh,x
tax
print stx icbal
sty icbah
lda #9 ;put record
STA ICCOM
lda #255
sta ICBLL
sta ICBLH
ldx #0 ;editor = iocb0
jmp CIOV
[/code]

tja... ich suche seit 2 stunden nach dem bug, aber ich geh davon aus, dass es im code "darum" ein bug ist....

gibt es kein putrecord befehl, welcher den $9b ignoriert, d.h. den cursor nicht nach unten schiebt in die nächste zeile?

von HiassofT » So 23. Jul 2006, 21:54
Auf den ersten Blick sieht der Code gut aus. Ich würde aber ICBLL/H auf einen niedrigeren Wert setzen, in meinen Macros verwende ich 127. Das ist auch angenehm beim Testen, wenn man versehentlich eine falsche Buffer-Adresse gesetzt hat, dann wird nicht ganz so viel Schrott ausgegeben.

Heaven_tqa hat geschrieben:gibt es kein putrecord befehl, welcher den $9b ignoriert, d.h. den cursor nicht nach unten schiebt in die nächste zeile?

Leider nein. Hier ist also selber-Programmieren angesagt. Ich persönlich würde da eher zur Variante "block put" tendieren und die Länge des Textes irgendwo vorher mitspeichern. Meist hat man die Info eh schon irgendwo mal beim Erstellen des Textes.

Eine ganz andere Lösung wäre natürlich alles "zu Fuß" zu machen und direkt den Bildschirmspeicher zu beschreiben. Ist von der Performance her sicher deutlich besser, evtl. aber auch aufwändiger. Ich hatte das vor etlichen Jahren mal in meinem Terminal-Programm so gemacht, die OS-Routinen sind etwa bei 1200-2400 bit/sec ausgestiegen. Besonders das Scrolling hat ewig gebraucht.

so long,

Hias