Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Fragen zu PASCAL » Themenansicht

Autor Thread - Seiten: -1-
000
16.01.2008, 20:07 Uhr
Rüdiger
Administrator
Avatar von Rüdiger

Wie bindet man .REL-Dateien (also binäre, ungelinkte Assemblerdateien) im 8-Bit-PASCAL ein und nutzt deren Prozeduren? Oder geht das gar nicht mit PASCAL?

Wie programmiert man im 8-Bit-PASCAL eine Einzelzeichen-Eingabe (also das, was man im 16-Bit-PASCAL mit der ReadKey-Funktion macht)?
--
Kernel panic: Out of swap space.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
16.01.2008, 22:19 Uhr
Volker

Avatar von Volker


Zitat:
Wie bindet man .REL-Dateien (also binäre, ungelinkte Assemblerdateien) im 8-Bit-PASCAL ein und nutzt deren Prozeduren? Oder geht das gar nicht mit PASCAL?

Seite 91


Zitat:
Wie programmiert man im 8-Bit-PASCAL eine Einzelzeichen-Eingabe (also das, was man im 16-Bit-PASCAL mit der ReadKey-Funktion macht)?

INCH typ char Tastaturabfrage
--
Das Gerät selbst ist ein kompli-
ziertes elektronisches Erzeugnis, zu des-
sen Reparatur neben vielfältigen Kenntnis-
sen zum gesamten Komplex der Elek-
tronik eine Vielzahl hochwertiger Meß-
und Prüftechnik notwendig ist. Von ei-
genhändigen Eingriffen wird abgeraten.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
17.01.2008, 07:36 Uhr
Gerhard




Zitat:
Rüdiger schrieb
Wie bindet man .REL-Dateien (also binäre, ungelinkte Assemblerdateien) im 8-Bit-PASCAL ein und nutzt deren Prozeduren? Oder geht das gar nicht mit PASCAL?

Geht erst ab Version 5.5. Bei den früheren (also allen 8Bit-) Versionen konnte man nur mit Include Quelltexte einbinden

Dieser Beitrag wurde am 17.01.2008 um 17:55 Uhr von Gerhard editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
17.01.2008, 08:09 Uhr
volkerp
Default Group and Edit
Avatar von volkerp


Zitat:
Wie bindet man .REL-Dateien (also binäre, ungelinkte Assemblerdateien) im 8-Bit-PASCAL ein und nutzt deren Prozeduren? Oder geht das gar nicht mit PASCAL?

Mit entsprechenden Zusatzprogrammen kann man das machen, z.b. hier: http://www.cirsovius.de/CPM/Projekte/TURBO-PASCAL/Inline/turbo-05.html
Direkt mit Pascal geht das leider nicht.


Zitat:
Wie programmiert man im 8-Bit-PASCAL eine Einzelzeichen-Eingabe (also das, was man im 16-Bit-PASCAL mit der ReadKey-Funktion macht)?

read(kbd, ch);
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
17.01.2008, 11:56 Uhr
Rüdiger
Administrator
Avatar von Rüdiger


Zitat:
volkerp schrieb
Mit entsprechenden Zusatzprogrammen kann man das machen, z.b. hier: http://www.cirsovius.de/CPM/Projekte/TURBO-PASCAL/Inline/turbo-05.html
Direkt mit Pascal geht das leider nicht.

Hast Du das schon mal praktisch probiert?
Beim Versuch, mit diesem Programm eine REL-Datei zu wandeln, bringt es eine "ITEM-Fehler"-Meldung.


Zitat:
read(kbd, ch);

Das funktioniert. Danke.
--
Kernel panic: Out of swap space.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
17.01.2008, 13:55 Uhr
volkerp
Default Group and Edit
Avatar von volkerp


Zitat:
Hast Du das schon mal praktisch probiert?

Dieses Programm nicht. Ich hatte meine Quellen per INLASS eingebunden.
Unter http://msx.retro8bits.com/msxpascal.html, "Pascal articles", gibt es noch Links zu einem anderen Programm:

Three programs to help write inline code for Turbo Pascal:
INLINE program by J.A.C.G. van der Valk to translate REL files to inline made with the M80 macro assembler: Pascal source and program
INLASS, a Z80 macro-assembler that generates inline code (also 8080, 8086 and 6502 cpu supported): Pascal source and program , documentation
PMLINE: Adaptation and enhancement of a MC program called PMLine, article by Werner Cirsovius and the program
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
17.01.2008, 18:52 Uhr
Rüdiger
Administrator
Avatar von Rüdiger


Zitat:
volkerp schrieb
Ich hatte meine Quellen per INLASS eingebunden.

Diese Möglichkeit habe ich nicht, denn für die Hardwaretreiber besitze ich keine Quelltexte.

Ich habe auch das INLINE-Programm ausprobiert. Scheint sich in meiner REL-Datei leider total zu verlaufen. Nur bei ganz kleinen REL-Dateien funktioniert das.
--
Kernel panic: Out of swap space.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
17.01.2008, 19:48 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

schade - mehr kenne ich leider auch nicht.
Alternativ musst du die REL-Datei auf eine feste Adresse linken, z.B. im Pascal-Programm ein genügend großes statisches ARRAY definieren und dann den Treiber an diese Stellen hineinpatchen. Oder klassisch den Binärdump als Inline oder Konstanten-Array übersetzen.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
15.11.2014, 19:53 Uhr
Lötspitze



Hallo,

ich versuche mit der TURBO-Version 3.02A am Z1013 die Programme der VIS3 zum Laufen zu bekommen. Da das Koppelprogramm TUVIS3 und der Pufferbereich für DMA bis knapp unter 3000h gehen, darf ein PASCAL-Programm erst ab 3000h stehen und starten. Weiß jemand, wie ich das dem Programm PTEST.PAS beibringen kann?

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
16.11.2014, 22:22 Uhr
Lötspitze



Hallo,

gibt es jemanden, der die TINIT-Datei für TurboPascal 3.x hat? Ich bräuchte die, um das TURBO richtig anzupassen.

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
17.11.2014, 08:19 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

das komplette Turbo Pascal findest Du z.B. hier: http://www.z80.eu/pas-compiler.html

Zum Thema TINST habe ich etwas zusammengetragen. Damit kannst Du Pascal auch direkt patchen: http://hc-ddr.hucki.net/wiki/doku.php/cpm:turbo_pascal:tinst
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
17.11.2014, 08:21 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

zu 008: Turbo Pascal compiliert immer nur ab Adresse 100h. Das lässt sich auch nicht ändern. Für Programme, die auf anderen Adressen laufen müssen, solltest Du einen anderen Pascal-Compiler nehmen, z.B. MT-Pascal. Dieser erzeugt REL-Dateien, die dann anders gelinkt werden können.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
17.11.2014, 11:42 Uhr
holm

Avatar von holm

Pascal-MT+ hat einen Linker Namens Linkmt der ERL Dateien (!) haben möchte. Vom Aufbau her sollten die zu den vom M80 erzeugten REL Dateien identischt sein.

Ich weiß das nur noch vom Buildvorgang von CP/A der Linkmt Lader wird dort benutzt, weil er im Gegensatz zum L80 nicht ungefragt Füllbytes erzeugt die dann das OS aufblasen würden.
der M80 Aufruf war wohl M80 BIOS.ERL=BIOS. Es wird also eine REL Datei mit nur anderer Erweiterung erzeugt.

Gruß,

Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
17.11.2014, 15:13 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

ERL=REL

REL kann noch ein wenig mehr, was beim Pascal-Compiler nicht benötigt wird. i.W. ist es dasselbe.
Linkmt kann Binärdateien mit einer beliebigen Startadresse linken, der L80 besteht immer auf 100h und würde den Bereich bis Startadresse mit 00h auffüllen.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
17.11.2014, 22:45 Uhr
Lötspitze



Danke, ich muß mir die Sachen jetzt erst einmal anschauen. TINST funktioniert bereits.

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
015
21.11.2014, 17:29 Uhr
Lötspitze




Zitat:
Lötspitze schrieb
...darf ein PASCAL-Programm erst ab 3000h stehen und starten. Weiß jemand, wie ich das dem Programm PTEST.PAS beibringen kann?



Eine Lösung habe ich gefunden: die Pascal-Datei im TURBO als COM compilieren. Da hat man die Möglichkeit, vorab die Start- und die maximale Endadresse für das Programm zu definieren.

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.

Dieser Beitrag wurde am 21.11.2014 um 17:29 Uhr von Lötspitze editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
016
29.06.2015, 09:32 Uhr
Lötspitze



Hallo,

ich bräuchte noch mal Unterstützung bzgl. der PASCAL-Programmierung, da ich gerade beim Demo-Programm für Heiko´s neuen VIS3-Treiber an der DMA-Routine scheitere.
Es soll ein Bildschirmbereich in einen anderen Bereich mittels DMA kopiert werden (jeweils in Gruppen zu 256 Byte). Der Ansatz war, für die Ablage der ausgelesenen Bytes ein Feld zu erstellen ("VAR buffer : array [0 ... 255] of byte"). Als Übergabe in Heikos Treiber zum Ein- und Auslesen wird nun der Integerwert der Anfangsadresse von diesem Puffer als Variable gebraucht. Hat jemand einen Tip, wie man das im Pascal definieren muß, damit man diesen Wert erhält?

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
017
29.06.2015, 10:24 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

addr(buffer) oder einfach @buffer
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 29.06.2015 um 10:24 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
018
29.06.2015, 10:29 Uhr
Daniel

Avatar von Daniel

Hallo Matthias,
ich bin mir nicht ganz sicher, ob ich überblicke was Du meinst. Dein Buffer besteht aus einem "array ... of byte". Wenn Du jetzt Integerwerte lesen oder schreiben willst wird das nicht klappen, weil die Wertebereich der beiden Variablentypen sich unterscheiden.

V-Typ (Bitanzahl) Wertebereich
BYTE (8) -128 .. 127
INTEGER (32) -2147483648 .. 2147483647

Aber vielleicht willst Du auf etwas anderes hinaus?

Gruß Daniel

Dieser Beitrag wurde am 29.06.2015 um 10:35 Uhr von Daniel editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
019
29.06.2015, 17:22 Uhr
Lötspitze



@Volker, da würde ich dann definieren: DPUF:=addr(buffer)

@Daniel, in den Puffer selbst müssen ausgelesene Bytes rein und die Pufferstartadresse brauche ich aber integer.

Danke Euch beiden - ich versuche es dann heute Abend mal mit:

VAR DPUF :integer;
..
VAR buffer :array [-128..127] of byte;
..
DPUF:=addr(buffer);
..
visdmatr(DPUF,DANZ,FN29);{DMA-Betrieb ausfuehren}


VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.

Dieser Beitrag wurde am 29.06.2015 um 21:00 Uhr von Lötspitze editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
020
30.06.2015, 21:29 Uhr
Lötspitze



Programm läuft inkl. DMA. So sieht´s dann aus:



Richtig war: "VAR buffer :array [0..255] of integer;"

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
021
01.07.2015, 15:11 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

ich gratuliere!
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
022
01.07.2015, 15:40 Uhr
Bert



Schön bunt :-)
Wie lange dauert es, bis das Bild fertig gemalt/aufgebaut ist?

Ich kenne mich jetzt mit der VIS3 nicht aus. Gibt es da irgendeine Unterstützung seitens der Hardware? Z.B. Skalierung der Buchstaben o.ä.? Oder muss man das alles zu Fuß machen?

Viele Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
023
01.07.2015, 19:08 Uhr
Lötspitze



Zwischen den einzelnen Demo-Routinen (Zeichenboxgröße, Schrift, Linien, Zoom, Rechtecke usw.) sind jeweils Pausen drin, damit man das in Ruhe genießen kann
Dann enthält das Programm noch ein horizontales und vertikales Bildrollen. Wenn man die Pausen, den Zoom und das Rollen wegläßt, dürfte das Bild in 2-3 Sekunden aufgebaut sein (kann ich ja mal testen).
EDIT: sind 6-7 Sekunden (Ursache: langer Schriftzug aus Einzelbuchstaben und Sinuskurve)

Der GDC unterstützt von Haus aus einiges (u.a. die Skalierung=Zeichenboxgröße, siehe Ziffern 1 bis 7), sodaß für die Routinen relativ wenige Parameter an den VIS3-Treiber übergeben werden müssen. Am besten Mal Heiko´s Link auf die AC1-Info-Seite folgen und die Beschreibung seines Treibers ansehen (unter Neuigkeiten).

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.

Dieser Beitrag wurde am 01.07.2015 um 19:27 Uhr von Lötspitze editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
024
01.07.2015, 19:17 Uhr
Rolly2



Hallo Matthias, da hast Du dir viel Mühe gemacht. Danke fürs zeigen.

Andreas
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
025
01.07.2015, 19:34 Uhr
Lötspitze



Sobald Heiko das Signal gibt, daß bei seinem Treiber bis auf weiteres keine Änderungen an den Parametern und der Reihenfolge der Routinen mehr kommen, ergänze ich u.a. diese Datei inkl. Quelle bei Volker auf der Webseite unter Z1013/VIS3.

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.

Dieser Beitrag wurde am 01.07.2015 um 21:02 Uhr von Lötspitze editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
026
26.10.2015, 22:28 Uhr
Lötspitze



Hallo,

kann mir noch jemand einen Tip geben, wie man einen direkten Speicherzugriff auf ganz bestimmte Adressen unter TurboPascal realisiert (ähnlich PEEK und POKE im Basic)? Am wichtigsten wäre z.Z. das Auslesen der Zellen.

Die Unterlagen bzgl. [025] liegen übrigens unter http://hc-ddr.hucki.net/wiki/doku.php/z1013:module:vis3 .

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
027
27.10.2015, 07:43 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

na klar, das geht mit mem oder mit absolute:

var

iobyte: byte absolute $0003;

(* das kann man selbst definieren, aber mem ist bereits vordefiniert:
mem: Array[0..$FFFF] of Byte absolute 0;
*)

Zugriff mit

mem[$1000]
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
028
27.10.2015, 08:55 Uhr
Lötspitze



Danke Dir Volker - das werde ich heute Abend gleich mit ins Programm einbauen.

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
029
29.10.2015, 20:50 Uhr
Lötspitze



So, hier die Lösung:
...
adr:=mem[$33]+mem[$34]*256 ;
x:=mem[adr]+mem[adr+1]*256 ;
y:=mem[adr+2]+mem[adr+3]*256 ;
x1:=mem[adr+4]+mem[adr+5]*256 ;
y1:=mem[adr+6]+mem[adr+7]*256 ;
...

Auf 33h/34h wird eine variable Adresse ausgelesen, auf der eine Parametertabelle hinterlegt ist. Aus dieser Tabelle werden vier hintereinander folgende 16Bit-Werte ausgelesen und zugewiesen. Wichtig sind die eckigen Klammern!
"mem" ist von Haus aus schon im TP integriert und muß nicht extra definiert werden.
Vielen Dank noch mal an Volker für die Hilfe.

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.

Dieser Beitrag wurde am 29.10.2015 um 20:51 Uhr von Lötspitze editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
030
29.10.2015, 21:06 Uhr
Bert



Vielleicht gehen die Zugriffe noch eleganter zu lösen, wenn man das Ganze mit 16 Bit definiert:
mem_int: Array[0..$7FFF] of integer absolute 0;

Das ist ungetestet und hat den Nachteil, das der Datentyp vorzeichenbehaftet ist.
Ich bin in Pascal nicht mehr sattelfest. Vielleicht gibt es auch einen passenden Datentyp mit dem Wertebereich von 0..65535.

Viele Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
031
29.10.2015, 23:19 Uhr
Paulus



Word

Gruß V.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
032
30.10.2015, 07:53 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

@Bert
das ist unpraktisch. ein array of integer belegt immer 2 Byte pro index, also
mem_int[0] -> Adr. 0+1
mem_int[1] -> adr. 2+3
usw.

@Paulus: Turbo 3.0 kennt kein Word, nur vorzeichenbehaftete Integer und zur Eingabe noch vorzeichenlose Hexzahlen.


Besser ist ggf. eine Funktion

type
word = integer;


(* verstaendlicher *)
function memw(adr: word) : word;
begin
memw := mem[adr] + mem[adr+1]*256;
end;


(* effektiver *)
function memw2(adr: word): word;
var
adr2 : ^integer absolute adr;
begin
memw2 := adr2^;
end;
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
033
30.10.2015, 10:45 Uhr
Paulus



Aha.
Kann ich mir dann nicht type sparen?
so
function memw(adr: integer) : integer;

Gruß V.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
034
07.02.2016, 22:40 Uhr
Lötspitze



Brauche mal wieder etwas "Starthilfe":

hat jemand einen TP-Code zur Bildschirmausgabe eines Integerwertes als Hexadezimalzahl? Geht das ggf. auch so:

writeln('Ausgelesenes Farbbyte (dez.):',k) ;
writeln('Ausgelesenes Farbbyte (hex.):',hex(k)) ;

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
035
10.02.2016, 00:20 Uhr
Bert



Im Handbuch von TP3 finde ich nix zur Hex-Ausgabe.
Aber das ist ja im Prinzip auch schnell gemacht:

Quellcode:

  function hexdigit(c: byte): char;
  begin
    if c < 10 then
      hexdigit := char(c + $30)
    else
      hexdigit := char(c - 10 + $41);
  end;

...

    c := ...;
    write( hexdigit(c shr 4), hexdigit(c and $f));



oder so hier:

Quellcode:

function hex( value:word):string;
const hex_str='0123456789ABCDEF';
var s:string;
begin
s:='';
repeat
  s:=copy(hex_str,succ(value mod 16),1)+s;
  value:=value div 16;
until value=0;
hex:=s;
end;


Die letzte Routine stammt aus einer Datei von April 1992 ;-)
Das kann man bestimmt auch eleganter schreiben (ohne copy und div)...

Viele Grüße,
Bert

Dieser Beitrag wurde am 10.02.2016 um 00:20 Uhr von Bert editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
036
10.02.2016, 09:25 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

so ist es etwas schneller:


Quellcode:

(* Zahl in Hexzahl konvertieren *)
function hex(number,digits: Integer): hexstring;
const
  hexdigit: array[0..15] of char = '0123456789abcdef';
var
  d: Integer;
  h: string[4];
begin
  h[0]:=chr(digits);
  for d:=digits downto 1 do
  begin
    h[d]:=hexdigit[number and 15];
    number:=number shr 4;
  end;
  hex:=h;
end;



oder du nutzt gleich die internen Funktionen zur Hex-Ausgabe mit Inline($cd/$48d) (V 2.0) beziehungsweise Inline($cd/$492) (V 3.0). Da funktioniert aber nur mit {$U-}. (s. dazu http://cirsovius.de/CPM/Projekte/Artikel/TP/Patches/Patch2-en.html)
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 10.02.2016 um 09:26 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
037
10.02.2016, 09:33 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

PS: Die Eingabe von Hex.-Zahlen geht über einen Trick mit val:


Quellcode:

readln(s);
val('$'+s,i,err);



durch das $ davor wird die Eingabe als Hex-Zahl gewertet
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
038
10.02.2016, 11:16 Uhr
Lötspitze



Danke schon mal an alle, die mir geholfen haben. Wie ich das bisher umgesetzt habe, ergänze ich mal heute Abend und werde noch den einen oder anderen Vorschlag hier ausprobieren.

Matthias

Edit

Quellcode:

...
var
   c,d         :integer ;
   zahl        :byte ;
   s1,s2       :string[1] ;
   hex         :string[2] ;
...
    writeln('Ausgelesenes Farbbyte (dez.): ',k) ;
     zahl:=k ;
     c:=zahl div 16 ;
     if c<10 then str(c,s1) else s1:=chr(c+55) ;
     d:=zahl mod 16;
     if d<10 then str(d,s2) else s2:=chr(d+55) ;
     hex:=s1+s2;
     writeln('Ausgelesenes Farbbyte (hex.): ',hex) ;
...


--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.

Dieser Beitrag wurde am 10.02.2016 um 18:13 Uhr von Lötspitze editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
039
29.02.2016, 22:59 Uhr
Lötspitze



Ich bin´s noch einmal. Habe folgendes Problem (TP 3.0):

Nachdem ein Puffer definiert wurde, um Daten aus einer Datei dort abzuspeichern, sollen auf bestimmten Positionen die Bytes geändert und danach die Datei wieder unter anderem Namen abgespeichert werden. Das Laden und Speichern der Dateien funktioniert, nur die Byteänderung bekomme ich im Moment nicht hin. So sieht das auszugsweise aus:

...
buffer :array [0..127] of byte ;
...
adr:=addr(buffer)+$0A;

Auf "adr" soll nun der Wert einer Variablen abgelegt werden. Ist so etwas möglich und falls ja, wie müßte das gemacht werden? Ich habe die TP-Anleitung schon hoch und runter studiert, finde aber keine Lösung.

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
040
01.03.2016, 08:16 Uhr
Lötspitze



Mir ist gerade etwas eingefallen:
Da der Puffer ja ganz normaler Speicher ist und auf definierten Adresse steht, kann man das ggf. auch darüber lösen:

mem[adr]:=wert ;

Das probiere ich heute Abend mal.

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
041
01.03.2016, 09:20 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

genau so macht man das in Pascal, keine Zeigerarithmetik ala C
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
042
01.03.2016, 23:07 Uhr
Lötspitze



funktioniert
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
043
01.11.2016, 23:13 Uhr
Lötspitze



Hallo,

mein TP3.0 ärgert mich mal wieder. Und zwar meckert es im unteren Teil (die drei Zeilen zwischen den Semikolon) eine fehlende Klammer mit " `(` expected " an. Ich weiß aber überhaupt nicht, wo die eigentlich hin soll.


Quellcode:

function ALLOUT(splr:byte):boolean;
begin
  if (countreserve(splr)+countsave(splr)) = 4 then
    allout:=true else allout:=false;
;
  gotoxy(1,29);
  if allout then write('ALLOUT       von Spieler ',splr,' ist aktuell WAHR')
  else write('ALLOUT       von Spieler ',splr,' ist aktuell FALSCH');
;
end;



Ich schreibe die Programme im WINDOWS-Editor. Kann es sein, daß da bestimmte Zeichen manchmal mit einem anderen Code hinterlegt werden, den das TP nicht erkennt?
Andererseits - hier meckert TP wieder nicht:


Quellcode:


;
  gotoxy(1,28);
  write('COUNTSAVE    von Spieler ',splr,' ist aktuell ',c);
;



Vielleicht bin ich schon programmierblind, aber ich kann da keinen Unterschied erkennen und die Abfrage IF ALLOUT THEN müßte auch in Ordnung sein.

Kann jemand einen Tip geben?

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
044
01.11.2016, 23:32 Uhr
TTL-Grab



allout hast du als Funktion definiert.
Wenn du schreibt "if allout then" will er die Funktion aufrufen und erwartet deshalb Klammern.
Nimm dir erstmal eine boolean-variable, mit der du intern arbeitest und benutze die als Rückgabewert erst am Ende der Funktionsdefinition.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
045
02.11.2016, 08:48 Uhr
Lötspitze



Ah, danke Dir. Ich hatte diesen zweiten Teil ergänzt, um den Programmablauf während des Spieles besser nachvollziehen zu können. Dabei habe ich übersehen, daß hier ALLOUT noch einmal als Funktion aufgerufen wird und der Rechner sich dann sowieso in dieser Schleife fangen würde. Wird heute Abend geändert :-)

Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
046
22.12.2016, 08:49 Uhr
Lötspitze



Moin,

wer eine funktionierende VIS3 (inklusive INTENS-Nutzung) sowie Heiko´s neuen Treiber besitzt und gern etwas spielen möchte, für den gibt es jetzt auf Volkers Seiten unter http://hc-ddr.hucki.net/wiki/doku.php/z1013:module:vis3 (ganz unten) das Spiel "Mensch-Ärgere-Dich-Nicht". Viel Spaß dabei.


Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.

Dieser Beitrag wurde am 22.12.2016 um 08:52 Uhr von Lötspitze editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
047
22.12.2016, 09:04 Uhr
Alwin

Avatar von Alwin

Super Spiel, macht Spaß
--
...Z1013, KC87, KC85/5, KC Compact, C64
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
048
22.12.2016, 11:37 Uhr
Klaus



Hallo Matthias,

vielen Dank für Dein cooles Programm, dass ich ja im Vorfeld schon testen durfte.
Mal eine schöne Anwendung für die VIS3, die ich Dank eines sehr netten Hobbyfreundes nun im System stecken habe.
Läuft auf meinem Bastel-K1520 unter CP/A und SCPX ... prima ;-)



Die VIS3 ist derzeit über einen Normwandler GBS8200 über VGA an einem LCD-TV angschlossen.
Direkt über RGB am Scart Eingang des LDC-TV hatte ich ein "Hüpfbild".
Vermutlich würde es über einen alten Röhrenmonitor (TV) über RGB noch besser aussehen.
Was hast Du für einen Monitor dran, Matthias?

Danke an Dich und natürlich auch an Heiko, ohne dessen Treiber es ja nicht gehen würde.

Viele Grüße,
Klaus
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
049
22.12.2016, 11:50 Uhr
Alwin

Avatar von Alwin

Super Klaus

Matthias hat nen 1084S dran. Ich habe auch den Normwandler GBS8220 und nen 8" LCD dran, zum Spielen habe ich die VIS3 am 15" LCD TV, sonst muss ich ja immer umschalten zw. VIS3 und CPM Die GBS8220 hat ja 2x VGA Ausgang.
--
...Z1013, KC87, KC85/5, KC Compact, C64
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
050
23.12.2016, 10:42 Uhr
Klaus



Danke Alwin.

Hattest Du mal den LCD-TV direkt über RGB an SCART angeschlossen?

Viele Grüße,
Klaus
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
051
21.03.2021, 11:58 Uhr
Lötspitze



Hallo,

ich bin seit einer Weile dabei, das CAD-Programm "CAD5V3" auf die VIS3 und den Treiber von Heiko umzuschreiben. Die Kompilierung des umfangreichen Programmes läuft seit gestern erstmalig fehlerfrei durch. Auf dem Bildschrim wird schon der Grafikcursor gesetzt und unten kommen die Koordinaten X: ... .Danach bricht das Programm mit "Run-time error 10, PC=0862 Program aborted" ab.

Gibt es eine Übersicht, was die einzelnen "Run-time errors" und z.B. "PC=0862" bedeuten?

Mein System ist das SCP2.2. Ich habe nur ein Heft SCP3.0, wo diese Fehler nicht beschrieben werden.
Den Quellcode ändere ich im Windows-Editor und kompiliere im alten, originalen TurboPascal 3.02A (um effektiver voranzukommen, meist im JKCEMU).
Als nächstes werde ich mal schauen, wie man im TP im Schrittmodus das Programm abarbeiten kann, um an die Fehlerstelle zu kommen.

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.

Dieser Beitrag wurde am 21.03.2021 um 12:08 Uhr von Lötspitze editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
052
21.03.2021, 12:11 Uhr
Heiko_P



Hallo Matthias,

irgendwo habe ich mal gelesen, dass man bei Turbo-Pascal den auf dem Zielrechner verfügbaren Hauptspeicher bei der Übersetzung beachten muss. Wenn du das Programm ohne geladenen VIS3-Treiber übersetzt und danach mit geladenem Treiber startest gibt es dort auf jeden Fall einen Unterschied. Ich weiß nicht ob das bei dir die Ursache ist, das könntest du aber mal probieren.

Gruß
Heiko
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
053
21.03.2021, 12:26 Uhr
Lötspitze



Hallo Heiko,

danke für den Tip. Dein Treiber zeigt "Ende TPA B300h" an. Das Pascal-Programm bzw. die erzeugte COM-Datei habe ich im TP aktuell von 3000-9FFFh eingegrenzt. Damit sind Überschneidungen ansich ausgeschlossen.
Aber im CAD-Programm wird u.a. direkt Programmcode generiert bzw. einzelne Zellen beschrieben. Die liegen im Original z.T. oberhalb von B300h und könnten die Ursache für das Problem sein. Werde ich gleich als nächstes umschreiben.

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
054
21.03.2021, 13:28 Uhr
Lötspitze



Die Änderung hat das Problem leider noch nicht gelöst. Es kommt die gleiche Fehlermeldung. Ich suche weiter...
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
055
21.03.2021, 13:41 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

Fehler 10 ist String Length Error.
S. Handbuch Turbo Pascal oder
https://hc-ddr.hucki.net/wiki/lib/exe/fetch.php/cpm/turbo.pdf
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
056
21.03.2021, 15:29 Uhr
Lötspitze



Hallo Volker,

ja, wird damit zusammenhängen. Im Turbo Pascal unter Optionen gibt es die Funktion "Find run-time error" (ist mir bisher gar nicht aufgefallen ). Wenn man da bei PC: den Wert 0862 eingibt, sucht das Programm und bleibt an folgender Stelle stehen:


Quellcode:
procedure Txtlesen(WarteZeit:Integer);
var i : integer;
begin
     inch:=''; {2x Hochkomma}
     i:=0;
     repeat i:=i+1;
       until (i>=wartezeit) or keypressed;
     if keypressed then read(kbd,inch);
end;



Habe das testweise mal in folgendes geändert:


Quellcode:
procedure Txtlesen(WarteZeit:Integer);
var i : integer;
begin
     inch:='';
     repeat
       read(kbd,inch);
     until (inch<>'');
end;



Funktioniert aber auch nicht (Programm stoppt an gleicher Stelle). Irgendetwas scheint mit dem INCH nicht zu stimmen. INCH ist mit "char" definiert. Definition sieht so aus:


Quellcode:
      InCh                         : Char;



Ich sehe da nirgends einen Fehler.


VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
057
21.03.2021, 20:43 Uhr
ambrosius



Versuche mal inch:="";
--
viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
058
21.03.2021, 21:34 Uhr
Lötspitze



"": Da ist dann schon beim Kompilieren Feierabend.

Ich werde wohl wieder Bildschirmausgaben im Programm ergänzen, mit denen ich dann ganz genau eingrenzen kann, wo es hängenbleibt.

VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
059
21.03.2021, 21:43 Uhr
Rüdiger
Administrator
Avatar von Rüdiger


Zitat:
Lötspitze schrieb
Funktioniert aber auch nicht (Programm stoppt an gleicher Stelle). Irgendetwas scheint mit dem INCH nicht zu stimmen. INCH ist mit "char" definiert. Definition sieht so aus:

Quellcode:
      InCh                         : Char;


Ich sehe da nirgends einen Fehler.



Char ist immer 1 Byte lang, kann also nicht leer sein.
Ändere den den Typ zu string.
--
Kernel panic: Out of swap space.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
060
21.03.2021, 22:19 Uhr
Lötspitze



Kann InCH dann leer sein, wenn ich InCH: String[1] definiere?
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
061
22.03.2021, 11:34 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

inch: char;

du brauchst es nicht zu initialisieren.
inch:=chr(0); würde ansonsten auch gehen. Doch inch := ''; macht eigentlich genau dasselbe.


read(kbd,inch) liest ein Zeichen von der Tastatur ein, inch ist danach <> 00h.
ggf. wartet read, bis eine Taste gedrückt wurde. Deshalb wird vorher mit keypressed getestet, ob das überhaupt der Fall ist.

if keypressed then read(kbd,inch);
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 22.03.2021 um 11:36 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
062
28.03.2021, 14:15 Uhr
Lötspitze



Hallo Volker,

mit inch:=chr(0) bin ich weitergekommen und habe auch alle weiteren Bedingungen im Programm so angepaßt.

Aktuell suche ich nach einer Möglichkeit, mit TP3 eine Integer-Zahl in einen String zu verwandeln (also z.B. 123 in '123'). Ich kann auf der VIS3 keine mehrstellige Zahl ausgeben, sondern muß die Ziffern als Char einzeln rüberschieben. Liegt an den zur Verfügung stehenden Routinen für die VIS3.


VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
063
29.03.2021, 10:07 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

das geht mit

Str(value, stringvariable);
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
064
29.03.2021, 22:03 Uhr
Lötspitze



Hallo Volker,

hat funktioniert. Hier mal ein Ausschnitt vom Programm, mit dem ich das getestet habe:

Quellcode:
      x:=123;
      str(x,xStrng);
      L:=length(xStrng);      
      J:=1;
      FOR I:=1 TO L DO begin
        z:=copy(xStrng,J,1);
        VISZA(z,FN24);
        J:=(J+1);
      end;



VG Matthias
--
___________________
...geboren, um zu löten.

Wer rennen soll, muß auch mal stolpern dürfen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek