PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tabelle über Variable aufrufen bzw. lesen



slavezero
01.02.2007, 10:13
Hallo,
um mein Problem zu schildern, hol ich etwas weit aus:

in BASCOM gibt es die Funktion LOOKUP. Damit besteht die Möglichkeit eine Variable aus einer bestimmten Position einer sog. Tabelle zu lesen.
ich verwende diese Funktion eigentlich sehr gern, um mehrere aufeinander folgende Byte aufzurufen und z.B. zu einem Videocontroller zu schicken.

Die BASCOM Syntax sieht so aus: var = LOOKUP ( value, label ).
in var "steht" der code von der Position (value) der Tabelle (label).

Um jetzt die Funktion für mehrere Tabellen nutzen zu können, muss ich diese über CASE oder IF auswählen:

if font = 0 then par = Lookup(G,Font_8x8)
if font = 2 then par = Lookup(G,Font_11x11)
if font = 3 then par = Lookup(G,Font_32x32)
if font = 4 then par = Lookup(G,Font_48x47)

bei 5 zeichensätzen ist das ja noch ok, aber nicht wirklich elegant.
Nun meine Frage: gibt es eine Möglichkeit LABEL irgendwie als Variable zu definieren?

PicNick
01.02.2007, 13:19
Ich kann's jetzt nicht kontrollieren, aber ich glaube nicht, dass das geht.
Du kannst aber die Berechnung auch recht einfach selbst machen und dann mit CPEEK(adr) das Byte dort lesen


DIM Font AS WORD
DIM Charadr AS WORD
DIM Pattern as Byte
Font = LOADLABEL ( font_8x8) ' address aktueller Font
charadr = Font + Offset ' row * column
pattern = CPEEK(charadr) '

Das sind zwar mehr Bascom-Zeilen, aber im Code entspricht das in etwa dem Lookup

Ich würde es so machen, denn da kann man auch ev. gleich die aktuelle Row (oder Column) als zusätzliches Offset dazunehmen und es geht dann sogar schneller.
Da kommt's aber auf dein Konzept an.

Hilft das ?

slavezero
01.02.2007, 14:17
Danke für die Antwort,
aber das ist wie du schon selber schreibst nur eine andere form von LOOKUP.
Das Problem, das ich diesen Programmteil für JEDEN Font bzw. jede Bitmap oder JEDES Pictogram usw. schreiben muss, hab ich damit nicht gelöst, oder?

aber trotzdem danke
tschüß SZ

PicNick
01.02.2007, 14:28
Moment. Wieso mehrfach schreiben ?
LOADLABEL mußt du nur machen, wenn du den Font wechselst. Is ja logisch.
SUmme Font + Offset und den Cpeek mußt du natürlich bei jedem Zeichen machen. Aber nur einmal (als subroutine für alle fonts und Maps)
Aber, je nach struktur, läßt der Cpeek auch lesen in der Schleife mit wählbarem Adress-Inkrement zu.
Das alles macht der Lookup in keiner Version

slavezero
01.02.2007, 16:06
8-[ kapier ich jetzt nicht. ich häng mal ein bsp. an.
Evt. hilft das um mein Problem zu verdeutlichen. Das ist jetzt nur für 2 Bitmap

'-------------------- bitmap die 2te -------------------------------------------
bmp:
x = x1: y = y1 ' pos für set cursor

select case bmp

case 1
HH = lookup(0,logoavr) ' byte horz.
VV = lookup(1,logoavr) ' byte vert.
case 2
HH = lookup(0,rahmen)
VV = lookup(1,rahmen)
end select

G = 2
for V = 1 to VV
gosub S1D_CSR_RW ' mit x, y startpos setzen
cmd = &H42 ' comando speicher schreiben
gosub s1d_send_cmd
for H = 1 to HH ' eine zeile schreiben

if bmp = 1 then par = lookup(G,logoavr)
if bmp = 2 then par = lookup(G,rahmen)
gosub S1D_SEND_PAR ' das G raus zum s1d
incr G ' nächstes G
next H '
x = x1
incr y
next V

return

PicNick
01.02.2007, 16:29
Ok, denk' ich mir durch.
ich muß jetzt nur grad einen Standortwechsel vornehmen und rühr mich dann.

slavezero
01.02.2007, 17:09
keine hektik...
ging heute sowiso schon zz. mir langt es für heute -> ich mach mal schluss.
tschüss sz

PicNick
01.02.2007, 19:08
So etwa würde das mit CPEEK aussehen.
Statt "g" ist nun ein WORD-Zeiger "posit".
Ich weiss nicht, ob du in der ausgaberoutine das "G" brauchst ?




Dim Fontadr As Word 'current font base
Dim Posit As Word 'sendout pointer

'-------------------- bitmap die 2te -------------------------------------------
bmp:
X = X1 : Y = Y1 ' pos für set cursor


' ---------- Set Font (nur, wenn geändert) -------------------
Select Case Bmp
Case 1
Fontadr = Loadlabel(logoavr)
Case 2
Fontadr = Loadlabel(rahmen)
End Select




' ---------- Sendout -------------------
Posit = Fontadr
Hh = Cpeek(posit) ' dimension horiz
Incr Posit
Vv = Cpeek(posit) ' dimension vertik
Incr Posit '
For V = 1 To Vv
Gosub S1d_csr_rw ' mit x, y startpos setzen
Cmd = &H42 ' comando speicher schreiben
gosub s1d_send_cmd
For H = 1 To Hh ' eine zeile schreiben
Par = Cpeek(posit) ' FlashMem lesen
Gosub S1d_send_par ' das G raus zum s1d
Incr Posit ' nächste position
Next H '
X = X1
Incr Y
Next V
return



Ich weiss nicht, wie du die Zeigenauswahl machst. Eigentlich wär besser, statt bmp = "0" oder "1" gleich direkt die fontadresse zu verwenden

also :


Dim Fontadr As Word 'current font base
Dim Posit As Word 'sendout pointer


'-------------------------------------------
Fontadr = Loadlabel(logoavr)
gosub send_bmp
'------------------ ODER EBEN ----------
Fontadr = Loadlabel(rahmen) ' oder "Rahmen"
gosub send_bmp


'-------------------- bitmap die 2te -------------------------------------------
send_bmp:
X = X1 : Y = Y1 ' pos für set cursor

' ---------- Sendout -------------------
Posit = Fontadr
Hh = Cpeek(posit) ' dimension horiz
Incr Posit ' next
Vv = Cpeek(posit) ' dimension vertik
Incr Posit ' next
For V = 1 To Vv
Gosub S1d_csr_rw ' mit x, y startpos setzen
Cmd = &H42 ' comando speicher schreiben
gosub s1d_send_cmd
For H = 1 To Hh ' eine zeile schreiben
Par = Cpeek(posit) ' FlashMem lesen
Gosub S1d_send_par ' das G raus zum s1d
Incr Posit ' nächste position
Next H ' schleife
X = X1
Incr Y
Next V
return


Was im Einzelnen besser ist, hängt vom Programm-konzept ab, logo


Die Schleifen schreien eigentlich nach Inline-Assembler, aber das kannst du immer noch machen.