Forum: PC-Programmierung Array mit Poke füllen geht nicht.


von Peter B. (funkheld)


Lesenswert?

Hallo, guten Tag.

Warum kann man bitte das Array nicht mit Poke füllen im PDS ?
Es werden zur Kontrolle nur "0" ausgegeben.
1
rem $dynamic 
2
DIM array%(1000)
3
4
FOR x% = 0 TO 999
5
  array%(x%) = 0
6
NEXT
7
8
segia%=varseg(array%(0))
9
ofsia%=varptr(array%(0))
10
11
def seg=segia%
12
for z%=0 to 50
13
  poke ofsia%+z%,z%
14
next
15
def seg
16
17
for a%=0 to 50
18
  print array%(a%)
19
next

Danke.

von PIClig (Gast)


Lesenswert?

Vermutlich fehlt dem poke die Segmentadresse.
Und nun stochert es im Trueben.

von Systemgewinner (Gast)


Lesenswert?

was ist das denn für eine beschissene programmiersprache.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

"poke" (und sein Bruder "peek") ist ein noch üblerer Befehl als "goto" 
und sollte mit mindestens einmal auf die Hand schlagen bestraft werden.

von Codo (Gast)


Lesenswert?

Systemgewinner schrieb:
> was ist das denn für eine beschissene programmiersprache.

Also erstens wird eine Frage mit einem Fragezeichen beendet und nicht 
mit einem Punkt.
Zweitens die Frage, wie du auf "beschissen" kommst.
Und drittens ist es von Vorteil, wenn man lesen kann.
Die Antwort lautet: "PDS Basic"

Beitrag #6237817 wurde von einem Moderator gelöscht.
von Michael M. (do7tla)


Lesenswert?

Wegstaben V. schrieb:
> "poke" (und sein Bruder "peek") ist ein noch üblerer Befehl als
> "goto"
> und sollte mit mindestens einmal auf die Hand schlagen bestraft werden.

Erinnert stark an Commodore C64 Basic.

von Joachim B. (jar)


Lesenswert?

Wegstaben V. schrieb:
> "poke" (und sein Bruder "peek") ist ein noch üblerer Befehl als "goto"
> und sollte mit mindestens einmal auf die Hand schlagen bestraft werden.

jeder nutzt zu jeder Zeit das Werkzeug welches er besitzt!
Peek & Poke sind nicht verwerflicher als BEGINN & END oder TAB 
Einrückungen.

Auch mit Peek & Poke konnte man tolle ASM Programme schreiben!
Beim CBM, beim PC1500 uvam.

von 2⁵ (Gast)


Lesenswert?

Peter B. schrieb:
> for z%=0 to 50
>   poke ofsia%+z%,z%
> next

POKE schreibt Bytes, dein Array sind WORDs. Probiere mal:

poke ofsia%+z%*2,z%

von Zeno (Gast)


Lesenswert?

Joachim B. schrieb:
> verwerflicher als BEGINN & END

Was sollte denn an BEGIN (nur ein N) und END denn verwerflich sein? 
Erschließt sich mir nicht wirklich? - Jetzt hab ich's ist für dieses 
Forum die falsche Programmiersprache.

von PIClig (Gast)


Lesenswert?

> BEGIN & END

sind viel zu ausschweifend. Wo doch schon { und } voellig reichen.
Im uebrigen scheint der TO
1
def seg=segia%
2
for z%=0 to 50
3
  poke ofsia%+z%,z%
4
next
5
def seg

nur zu definieren. Aber nicht aufzurufen.
Aber das mag taeuschen. Soll er gefaelligst selber ins Manual scheun.

von Codo (Gast)


Lesenswert?

PIClig schrieb:
>> BEGIN & END
>
> sind viel zu ausschweifend. Wo doch schon { und } voellig reichen.

Glückwunsch! Du hast die Neuigkeit herausgefunden, dass es Unterschiede 
zwischen verschiedenen Programmiersprachen gibt.

von Blub B. (googoo)


Lesenswert?

PIClig schrieb:
> Im uebrigen scheint der TO
>
> nur zu definieren. Aber nicht aufzurufen.
> Aber das mag taeuschen.

Das täuscht.
Def Seg legt das Segmentregister für die folgenden peek/poke fest. So 
alter 16bit-Krams ist das

von c-hater (Gast)


Lesenswert?

Joachim B. schrieb:

> Auch mit Peek & Poke konnte man tolle ASM Programme schreiben!

Nicht wirklich.

Man konnte allenfalls Poke benutzen, um ein paar Stücke Maschinencode in 
den Speicher zu befördern. Aber Assemblerprogrammierung ist eigentlich 
was anderes...

von Karl (Gast)


Lesenswert?

Zeno schrieb:
> Jetzt hab ich's ist für dieses Forum die falsche Programmiersprache.

Jetzt hast du es erfasst.

von Peter B. (funkheld)


Lesenswert?

Ich bin hier auch falsch.

Wusste nicht das hier die Elite dazwischen Schreibt bei meinem 
DOS-Programm , die das Programm für den VW-Diesel entwickelt hat. Wenn 
ihr POKE/PEEK und GOTO genommen hättet , dann wäre es aufgefallen das 
hinten falsche Werte raus kommen.

Na,dann...

von georg (Gast)


Lesenswert?

Peter B. schrieb:
> Wenn
> ihr POKE/PEEK und GOTO genommen hättet

Dann wäre der Dieselbetrug bis heute verborgen geblieben, weil bei den 
Prüfbehörden niemand mehr weiss was das überhaupt ist.

Georg

von cppbert (Gast)


Lesenswert?

Kannst du in ein einzelnen Integer mit poke schreiben?

von 2⁵ (Gast)


Lesenswert?

Peter B. schrieb:
> Ich bin hier auch falsch.

Hm... hast du das überhaupt mal probiert?

2⁵ schrieb:
> poke ofsia% + z% *2, z%

von Peter B. (funkheld)


Lesenswert?

Hallo, guten Tag.

Das funktioniert :
-----------------------
a%=123
segia%=varseg(a%)
ofsia%=varptr(a%)

def seg= segia%
print peek(ofsia%+0)
def seg
-----------------------

Das funktioniert auch nicht mit dem Array.
Das Array muss wohl eine andere Lage haben,
wo jetzt Segment und Offset nicht alleine ausreicht.
-----------------------
> poke ofsia% + z% *2, z%
------------------------

von TR.0LL (Gast)


Lesenswert?

Peter B. schrieb:
>
1
> rem $dynamic
2
[...]
3
> for a%=0 to 50
4
>   print array%(a%)
5
> next
6
>


Weleche Sprache ist das?

von Falstaff (Gast)


Lesenswert?

TR.0LL schrieb:
> Weleche Sprache ist das?

PDS-Basic

Peter B. schrieb:
> mit Poke füllen im PDS

von cppbert (Gast)


Lesenswert?

Peter B. schrieb:
> a%=123
> segia%=varseg(a%)
> ofsia%=varptr(a%)
>
> def seg= segia%
> print peek(ofsia%+0)
> def seg

Jetzt mach mal daraus ein Array mit genau einem Eintrag

Und so nebenbei: nutzt doch bitte die as int,long etc. Schreibweise 
diese % s postfixes sind nicht wirklich sprechend

von Peter B. (funkheld)


Lesenswert?

Danke.
Dieses funktioniert:
1
rem $dynamic
2
dim arraya(32000) as Integer
3
dim arrayb(32000) as Integer
4
5
dim segia as integer
6
dim ofsia as integer
7
8
dim segib as integer
9
dim ofsib as integer
10
11
segia=varseg(arraya(0))
12
ofsia=varptr(arraya(0))
13
14
segib=varseg(arrayb(0))
15
ofsib=varptr(arrayb(0))
16
17
arraya(30000)=105
18
arrayb(31000)=207
19
20
def seg= segia
21
print peek(ofsia+30000*2)
22
def seg
23
24
def seg= segib
25
print peek(ofsib+31000*2)
26
def seg

von cppbert (Gast)


Lesenswert?

Peter B. schrieb:
> Dieses funktioniert:

D.h. dein print zeigt 105 und 207?

Dann muss poke so auch funktioniere, also gleicher offset,segment nur 
eben poke

Was mir noch nicht klar ist: du meintest PDS basic kann keine bytes, 
schreibt poke dann auch nur integer oder doch nur bytes, dann musst du 
ein int > 255 mit zwei pokes schreiben

von cppbert (Gast)


Lesenswert?

Du solltest mind Feldwerte 64 und 344 testen sonst merkst du es nicht 
wenn dein schreiben nur mit bytes funktionier (dein 105 und 207 sind bei 
in einem byte abbildbar)

von cppbert (Gast)


Lesenswert?


von blub (Gast)


Lesenswert?

poke x+(2*y)+1, z / 256
poke x+(2*y), z mod 256
so sollte es eigentlich gehen

von cppbert (Gast)


Lesenswert?

blub schrieb:
> poke x+(2*y)+1, z / 256
> poke x+(2*y), z mod 256

x = array offset aus varptr
y = array index

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
> blub schrieb:
>> poke x+(2*y)+1, z / 256
>> poke x+(2*y), z mod 256
>
> x = array offset aus varptr
> y = array index

Und z = integer wert

von Peter B. (funkheld)


Lesenswert?

Danke für die Info.
Poke und Peek geht nur Byte.
Darum habe ich auch nach einem Pokeword/Peekword gesucht und dieses 
funktioniert in PDS :
1
.Model Medium, Basic
2
.Code
3
4
public PeekWord 
5
PeekWord Proc Uses ES, SegAddr:DWord
6
  Les  BX,SegAddr     ;load the segment and address
7
  Mov  AX,ES:[BX]     ;read the word into AX
8
  Ret                 ;return to BASIC
9
PeekWord Endp
10
11
public PokeWord 
12
PokeWord Proc Uses ES, SegAddr:DWord, Value:Word
13
  Les  BX,SegAddr     ;load the segment and address
14
  Mov  AX,Value       ;and the new value to store there
15
  Mov  ES:[BX],AX     ;write the value into memory
16
  Ret                 ;return to BASIC
17
  
18
PokeWord Endp
19
End

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

geht auch in pure Basic mit
>> poke x+(2*y)+1, z / 256
>> poke x+(2*y), z mod 256

Jetzt mal wieder die grosse Frage:
Woran hat es denn gelegen wenn jetzt alles geht?

von Peter D. (peda)


Lesenswert?

Peter B. schrieb:
> Warum kann man bitte das Array nicht mit Poke füllen im PDS ?

Warum sollte man das überhaupt?
Es ist doch viel bequemer, schneller und sicherer, einfach über den 
Index auf das Array zuzugreifen.
Peek und Poke nimmt man nur dann als Krücke, wenn der Speicher einem 
nicht gehört, z.B. dem OS.

von Peter B. (funkheld)


Lesenswert?

Dieses habe ich:
DIM array%(32000)

umgewandelt in:
DIM array(32000) as integer

Danke.

1
rem $dynamic 
2
DIM array(32000) as integer
3
4
FOR x% = 0 TO 999
5
  array(x%) = 0
6
NEXT
7
8
segia%=varseg(array(0))
9
ofsia%=varptr(array(0))
10
11
def seg=segia%
12
for z%=0 to 50
13
  poke ofsia%+z%*2,z%
14
next
15
def seg
16
17
for a%=0 to 50
18
  print array(a%)
19
next

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.