ZX4PAINT

Any discussions related to the creation of new hardware or software for the ZX80 or ZX81
User avatar
Forthretro.new.fr
Posts: 32
Joined: Thu Nov 19, 2009 9:34 pm

Re: ZX4PAINT

Post by Forthretro.new.fr »

Bonjour to all,
Version V5
After the G – Glass and K – Kls ;) command, I think it is time to give an end to the project.
I need to optimize all the command, but for it I need the full project ended.
Reason for what I did this 2 screens in French.
Could someone pls translate it in English ? – Thanks MOGGY for all your kind words.

FIXED :
- A problem with the LINE routine ( as someone informed me) in the V4.0. plus 2 or 3 bug I don’t remember.

NEW COMMAND
- Key ‘G’ for GLASS loupe – Hit ‘G’ again.
- Key ‘K’ for CLS
- Presentation of the program.

NEW STEP
- To compil the program with the English text – And to write it again with some optimized routine (I found the magnifying-GLASS routine too slow ! I need to rework it). – T o present and explain the program (it is to say all the routine ) in my site
http://forthretro.new.fr/

Thanks to all.

ZX4PAINT
http://forthretro.new.fr/download/ZX4PAINT.zip

Dominique
User avatar
Forthretro.new.fr
Posts: 32
Joined: Thu Nov 19, 2009 9:34 pm

Re: ZX4PAINT

Post by Forthretro.new.fr »

Hello,

Version 5.1 :)
ZX4PAINT
http://forthretro.new.fr/download/ZX4PAINT.zip

Just for fun, you can play with the FILL Routine while on the ‘Flash Dot’.

A - On the VB81 You can save your SCR
--> TOOLS -> Memory tools -> Save Memory Block - > OFFSET : 24376
Length : 6335
‘EXECUTE’ -> MyName.BIN -> CLOSE
Load it : --> TOOLS -> Memory tools -> File to Memory - > Memory OFFSET : 24376
‘EXECUTE’ -> MyName.BIN -> CLOSE

B - On the EO -> File -> Save memory Block -> Address : 24376 Size 6335
- Load it -> File -> Load memory Block -> Address : 24376

Try TestFile.bin in the ZIP file


Version 5.1
ZX4PAINT
http://forthretro.new.fr/download/ZX4PAINT.zip
sirmorris
Posts: 2811
Joined: Thu May 08, 2008 5:45 pm

Re: ZX4PAINT

Post by sirmorris »

You're a busy man!

I wish I had your enthusiasm!
:D


C
User avatar
Forthretro.new.fr
Posts: 32
Joined: Thu Nov 19, 2009 9:34 pm

Re: ZX4PAINT

Post by Forthretro.new.fr »

Hello friends,
This is the final of ZX4PAINT
http://forthretro.new.fr/download/ZX4PAINT.zip


I would like to thank again the support I received, and a particular thank to Moggy for the English translation.
Helas, I can’t save the program in *.P file, even with the following program :

CSAVE :
4724 LD HL, ( 5109) ; (5109) = Top of the program ZX4PAINT
4727 LD (4014), HL
472A CALL 52A4 ; SAVE BC – BC’ <-> BC
472D CALL 0F23
4730 CALL 02F5
4733 CALL 0F2B
4736 CALL 52A4 ; SAVE BC – BC’ <-> BC
4739 JMP 5279 ; FORTH RETURN

(On the prompt of the forth type : CSAVE <N/L>)
If I give to ($5109) <- $A402 or $8D7B
None of the two emulator accept it.

MAP OF THE MEMORY
$4410
............LANGUAGE MACHINE ROUTINES+
............SOME ZX4PAINT FORTH ROUTINE
$4950
............FREE
$5000
............FORTH COMPILER
$5F2C
............HGR SCREEN
$7807
.............ZX4PAINT FORTH ROUTINE
$8D7B -----------------------------------------------------------
.............FREE
$9C00
.............FORTH EDITOR
$A402
.............COPY OF THE HGR SCREEN
$BCE0
.............TEXT TO BE COMPILED
.............USED BY THE EDITOR
$C618

Could you help me ?

Merci

NB : Save your Master-Work

Vb81 XuR
--> TOOLS -> Memory tools -> Save Memory Block - > OFFSET : 24376 - Length : 6335
--> TOOLS -> Memory tools -> File to Memory - > Memory OFFSET : 24376

E.One
-> File -> Save memory Block -> Address : 24376 Size 6335
-> File -> Load memory Block -> Address : 24376
RWAP
Posts: 1348
Joined: Thu May 08, 2008 8:42 am
Location: Stoke-on-Trent, UK
Contact:

Re: ZX4PAINT

Post by RWAP »

Well I have to admit it - what a great little utility and its a remarkable achievement as someone's first Forth program for the ZX81.

Looking back - I wonder if this is the first graphic drawing utility ever released for the ZX81?
User avatar
siggi
Posts: 988
Joined: Thu May 08, 2008 9:30 am
Location: Wetterau, Germany
Contact:

Re: ZX4PAINT

Post by siggi »

RWAP wrote: Looking back - I wonder if this is the first graphic drawing utility ever released for the ZX81?
Fred Nachbaur wrote some graphic programs using WRX, having the HIRES pricture stored in range 8-16K (enable ram there in EO), e. g. "ZXPAINT". It uses the grafic tool in "SHREB" (SRAM HR Ext. BASIC):

http://www.pictureviewerpro.com/hosting/zx81/fredn.htm

Siggi
My ZX81 web-server: online since 2007, running since dec. 2020 using ZeddyNet hardware
http://zx81.ddns.net/ZxTeaM
User avatar
Forthretro.new.fr
Posts: 32
Joined: Thu Nov 19, 2009 9:34 pm

Re: ZX4PAINT

Post by Forthretro.new.fr »

Hello

Thank you Rich.
I am more a Forth enthousiast than a specialist.

Siggi : I am doing something wrong, since I cant run the ZXpaint.
It is said "Enable SCRAM Bord then Press A"
I suppose it is what EO call " Enable RamPack Wobble".
I also checked several options ( Enable RAM in 8K 16 K and all the Hi-Res options
from disabled to Memotech, but when I press A I have "4/9000"
Could you help me with the correct configuration;

Thanks.

Dominique
User avatar
siggi
Posts: 988
Joined: Thu May 08, 2008 9:30 am
Location: Wetterau, Germany
Contact:

Re: ZX4PAINT

Post by siggi »

Hi Dominique
Forthretro.new.fr wrote: Siggi : I am doing something wrong, since I cant run the ZXpaint.
It is said "Enable SCRAM Bord then Press A"
That means, to enable an additional static ram board in memory range 8-16K. You already "enabled" it with your EO setting (see below).
I suppose it is what EO call " Enable RamPack Wobble".
Of course not :lol:
I also checked several options ( Enable RAM in 8K 16 K and all the Hi-Res options
from disabled to Memotech, but when I press A I have "4/9000"
Error 4 is "out of memory", because after start ZXPAINT wants to allocate a new big variable to store a complete picture (approx. 6 KB). So you need more than 16KB ram (set "ram pack" to 48K).
After the zeddy booted in EO, then enter
POKE 16389,255
NEW

Then the BASIC has 48K ram available. Then load ZXPAINT and run it (without ram pack wobble :lol: )

HTH Siggi
My ZX81 web-server: online since 2007, running since dec. 2020 using ZeddyNet hardware
http://zx81.ddns.net/ZxTeaM
User avatar
siggi
Posts: 988
Joined: Thu May 08, 2008 9:30 am
Location: Wetterau, Germany
Contact:

Re: ZX4PAINT

Post by siggi »

Addendum: some years ago I wrote a short introduction to ZXPAINT (in German). I will look for it and post it here ...

Siggi
My ZX81 web-server: online since 2007, running since dec. 2020 using ZeddyNet hardware
http://zx81.ddns.net/ZxTeaM
User avatar
siggi
Posts: 988
Joined: Thu May 08, 2008 9:30 am
Location: Wetterau, Germany
Contact:

Re: ZX4PAINT

Post by siggi »

Here is it: (you could try http://de.babelfish.yahoo.com/ to translate it into something like English ;) )

---------------------------------------------------------------------------------------------------------------------------------------------
ZX-PAINT

Hallo liebe Zeddy Gemeinde.
Beim letzten ZX-TEAM-Treffen in Dietges hatte ich auf meinem Zeddy zeitweilig mal das HRG-Progrämmchen "ZX-PAINT" laufen, was bei dem Einen oder Anderen Verwunderung über die darin realisierten HRG-Möglichkeiten wie Pull-Down-Menüs oder die Darstellung von 64 Zeichen/Zeile auslöste.
Da ich bisher leider keine Bedienungsanleitung für ZX-PAINT finden konnte, wollte ich meine Erkenntnisse dazu hier mal kund tun.

ZX-PAINT ist, zusammen mit vielen anderen netten Dingen für den Zeddy, erhältlich per Download von "Fred Nachbaur's ZX81 Page":

http://www.btinternet.com/~techworlde/fredn.htm

Auf Wunsch kann ich es Euch aber auch per I-Mehl oder ZX-BOX zukommen lassen.

Hardwareanforderungen

ZX-PAINT nutzt die von Wilf Rigter entwickelten HRG-Routinen "WRX16K", die ein für HRG geeignetes RAM (also beim Refresh auslesbar) im Bereich 8-16K erfordern. Siehe dazu auch Wilf's Page: http://www.user.dccnet.com/wrigter/

Da das HIRES-Bild also dort unten liegt, bleibt der BASIC-Bereich komplett frei für das Programm selbst.
ZX-PAINT nutzt Programmroutinen aus dem HRG-Paket "SHREB" ("SRAM Hi-Res Extended BASIC" liegt samt DEMO auf der gleichen Page) und nutzt den Standard-16K-Speicher komplett für das Programm aus. Da aber ZX-PAINT noch einen zweiten. HRG-Bildschirm in einer BASIC-Variablen verwaltet, die erst nach Programmstart mit DIM angelegt wird, muß mindestens noch ca. 8 kB weiterer Speicher für Basic verfügbar sein. Also ist die Memory Map dann:
8-16K: HRG-Screen (WRX16K HIRES-Screen und SHREB Systemvariablen)
16-40K: BASIC-Programm und Variablen

Vor Start von ZX-PAINT muß also RAMTOP auf ca. 192 "hochgepoked" worden sein, und bei 8-16K muß RAM eingeblendet sein (nach hinreichend viel Pokerei hatte Kai in Dietges dann ZX-PAINT auch auf dem ZX2000 zum Laufen gekriegt).
Lediglich direkt nach Laden (also vor DIM für den 2. Bildschirm) und direkt vor dem programmgesteuerten Abspeichern (dort wird 2. Bildschirm wieder vernichtet) kommt ZX-PAINT nur mit 16K aus (Beachten z.B. bei MEFISFOS-Abspeicherung: 16 KB-Größenbeschränkung!).

Ist also RAMTOP hochgepoked und das HRG-RAM bei 8k eingeblendet, kann ZX-PAINT geladen werden. Nach Bestätigung der Auforderung zum Aktiveren des "SCRAM-Boards" (haben wir ja schon getan) wird in HRG umgeschaltet und es erscheint das ZX-PAINT "MAIN"-Menü und ein undefiniert gefüllter HRG-Screen.

Bedienung
Wer nun ZX-PAINT erfolgreich zum Laufen kriegte, kann damit nun nach Herzenslust durch die Pulldown-Menüs arbeiten und dabei Kreise, Ellipsen, Rechtecke zeichnen/löschen/ausfüllen, mit Sinclair- oder eigenen Zeichensätzen mit 32 oder 64 Zeichen/Zeile beschriften, mit anderen Bildern bitweise AND, OR, oder XOR verknüpfen und so weiter. Da aber einiges nicht so einfach selbsterklärend ist, wollte ich dies nun besser tun.
Fast alle Routinen im "PAINTBOX"-Menü nutzen eine Grundfunktionalität der SHREB-Hires-Routinen aus ("TRACE"-Funktion): durch Cursorsteuerung (Taste 5-8 für horizontal/vertikal, Tasten 1-4 für diagonal - wie durch die Blöckchengraphiksymbole der Tasten gegeben) kann man einen Cursor durch das Hires-Bild steuern. Dies wird eigentlich in der "FREEHAND"-Funktion zum "freihändigen" Bildzeichnen benutzt, funktioniert aber auch in vielen anderen Menüs z. B. für Kreise, Rechtecke, Strahlen....

Wird in diesem Zeichenmodus die Taste "D" (Draw) gedrückt, wird danach jedes überstrichene Pixel gesetzt hinterlassen und damit eine Kurve gezeichnet. Mit der Taste "E" (Erase) kann man in den Löschmodus umschalten und überfahrene Pixel wieder löschen. Mit "C" (Cursor Move?) kommt man aus diesen Modi wieder zurück in der "Nichtzeichen"-Modus. Beendet wird der Modus durch "ENTER".

Eine Besonderheit ist die Taste "R" (Return), da dabei die aktuelle Cursorposition ans aufrufende Programm übergeben wird. Und über diesen Mechanismus werden den komplexeren Menüs dann die Koordinaten/Dimensionen für ihre Zeichenobjekte übergeben.

Will man Beispielsweise ein Rechteck ("RECTANGLE"-Funktion) zeichnen, müssen im Rechteck-Menü 2 Punkte des Rechtecks (2 diagonal gegenüberliegende Ecken) mittels der "R"-Taste ausgewählt werden: also im "C"-Modus (frei bewegen) zur linken unteren Ecke des zu zeichnenden Rechtecks fahren und "R" drücken, dann zur rechten oberen Ecke fahren und "R" drücken, und das Rechteck wird (in aktuellem Muster!) gezeichnet.

Will man einen Kreis (eigentlich Ellipse!) zeichnen ("CIRCLE"-Funktion), muß man 3 Punkte an-"R"-en: zuerst den Mittelpunkt, dann waagrecht nach rechts (-> Radius horizontal, Cursor hüpft dann zum Mittelpunkt zurück), dann senkrecht nach oben (-> Radius vertikal) - > Kreis wird gezeichnet.

Ähnlich beim Zeichen von "Strahlen" ("RAY"-Funktion) : erst "Strahlenquelle" an-"R"-en, dann Endpunkt eines Strahls (->Linie zur Quelle wird gezeichnet, Cursor springt zur Quelle zurück), dann weitere Endpunkte der Strahlen.

Beim Ausfüllen von Figuren ("PAINT"-Funktion) fährt man in die zu füllende Figur und drückt "R". Damit wird die durch Pixel/Linien begrenzte Fläche oberhalb der gewählten Position mit dem aktuellen Muster gefüllt.

Will man sich im "MAGNIFY"-Modus sein Bild in Vergrößerung angucken und die einzelnen Pixels überarbeiten, dann fährt man mit dem Cursor zur interessanten Stelle und drückt "R", und schon werden die Pixels ganz schön fett. So kann man dann einfach Korrekturen auf Pixelebene ausführen. Dabei schaltet jedes Drücken von "R" zwischen normaler HRG-Ansicht und vergrößerten Ansicht hin und her.

Und vertikale/horizontale Linien werden ebenso mittels der "R"-Taste erzeugt.


Und wenn dies alles nicht so klappt?

dann ist man einfach zu "fingerlahm", und man hat die Taste "R" unbemerkt gleich mehrfach gedrückt, was dann im Malen von unsichtbaren Kreisen/Rechtecken mit Flächeninhalt 0 resultiert!

Dies fällt besonders bei Betrieb von ZX-PAINT auf Emulatoren auf, die halt oft schneller als unsere "realen" Zeddys sind. Und es fällt hat auch beim realen Zeddy in Europa auf, der wegen der 50 Hertz Bildwechselfrequenz schneller als sein amerikanischer Zeddy-Kollege ist, auf dem ZX-PAINT seinerzeit entwickelt wurde.

Aber es gibt Abhilfe: Im "TOOL"-Menü kann man über Punkt E "SPEED" die Geschwindigkeit einstellen, mit der der Cursor über den Bildschirm bewegt wird. Glücklicherweise wird damit aber anscheinend auch die Wiederholrate der Tastaturabfrage (zumindest in diesem Kontext) herabgesetzt, sodaß man dann auch hierzulande die Chance hat, ein einzelnes "R" abzusetzen. Ich stelle Speed auf Werte >= 2 (je höher desto langsamer) und kann so problemlos Kreise und Rechtecke zeichnen.

Leider funktioniert diese "Tastenbremse" aber nicht bei Auswahl der Füllmusters (Menüpunkt "SELECT" im Paintbox-Menü), sodaß man dort sehr flinke Finger haben muß, wenn man gezielt ein Muster auswählen will!


Zweiter Bildschirm
Wie zuvor schon erwähnt verwaltet ZX-PAINT einen 2. HRG-Bildschirm, der in der Variablen S$ nur während der Laufzeit von ZX-PAINT existiert und nicht abgespeichert werden kann. Auf diesen Bildschirm kann im "Tool"-Menü zugegriffen werden:
Punkt 4 "STORE" kopiert den aktuellen HRG-Screen in die Variable S$
Punkt 5 "TRANSFER" kopiert S$ zurück auf HRG-Screen
Punkt 6 "SWAP" tausch Inhalte von S$ und HRG-Screen aus
Punkte 7-9 "MERGE.." verknüpfen die Pixel in S$ (per AND, OR, oder XOR) mit denen im HRG-Screen und das Ergebnis erscheint im HRG-Screen.

Text
Im Text-Menü kann man sich zwischen mehreren Modi (Sinclair-Zeichensatz oder eigene, 64-Zeichen-Modus) entscheiden. Die Texteingabe selbst läuft dann so:
Grundzustand ist ein rechteckiger Cursor, der mit den Tasten 5-8 über den HRG-Screen bewegt werden kann. Drückt man "0", dann wechselt der Cursor in ein großes "C" und man kann Text eingeben. "ENTER" beendet die Eingabe, und man ist wieder im Grundzustand.
Während der Eingabe kann man über die "SHIFT"-Taste Groß/Klein- bzw. Normal/Invers-Schrift eingeben (hängt vom Zeichensatz ab). Will man Gaphik- oder andere Symbole eingeben, dann drückt man "SHIFT-ENTER" und der Cursor wechselt in ein großes "S". Beendet wird diese "Symboleingabe" wieder durch "ENTER" und man ist wieder zurück im Text-Eingabemodus.






Abspeichern
ZX-PAINT hat eigene HIGH-SPEED Tape Routinen zum Abspeichern/Laden des Programmes/Bildes und der Soft-Zeichensätze (alles im Bereich 8-16K) eingebaut. Diese habe ich aber nie benutzt, da ich statt dessen mittels MEFISDOS auf MMC abspeichere und kann dazu also keine Tipps geben. Aber zur MEFISDOS-Abspeicherung schon:

Programm
Da MEFISDOS von Programmgrößen <= 16K ausgeht, kann ZX-PAINT nicht zu jedem beliebigen Programmzustand abspeichert werden, da normalerweise ja ein 2. Bildschirminhalt im Variablenbereich (Variable S$: DIM S$(192,32) in Zeile 9000) gehalten wird und damit die 16K-Grenze überschritten wird.
Das Abspeichern mittels MEFISDOS muß also an einer Programmstelle erfolgen, wo die Größe von S$ minimal ist: in Zeile 9100 passiert das (DIM S$(1,1)), und danach ist Programmgröße wieder für MEFISDOS passend.

TIPP: dort kann man auch gleich POKEs zum Aktivieren des RAMs im Bereich 8-16K einbringen, damit bei Autostart ZX-PAINT gleich richtig los läuft . Zudem habe ich dort noch Befehle zu Hochsetzen von RAMTOP eingebaut. Und wer da auch noch vorsichtshalber HRG aus/einschalten möchte, kann dies durch
IF USR H THEN RETURN (HRG aus)
und
IF USR H THEN RUN (HRG ein)
tun.

Bild, Zeichensätze
Da das HRG-Bild und die Soft-Zeichensätze im Speicherbereich ab 8K liegen und damit parallel zum MEFISDOS-Programm (zumindest bei mir), kann man diesen Bereich nicht direkt abspeichern. Man müßte ihn erst verschieben (z. B. hinter RAMTOP), damit er dann mit dem inzwischen eingeblendeten MEFISDOS abgespeichert werden kann

Zum Abspeichern des Bildes (nicht der Zeichensätze) gibt es aber ein kleines Progrämmchen "Graphics Archiver" (ARCHIVE.P) auch auf Fred's Homepage: dieses Archive-Programm dient zum Abspeichern/Wiederherstellen von HRG-Bildern, die dazu in einer REM-Zeile des Programms gehalten werden: UPLOAD kopiert Bild aus Ram-Bereich 8-16K in die REM-Zeile im Programm und DOWNLOAD kopiert Bild aus REM-Zeile wieder in den Bildspeicher ab 8K zurück.
Somit können "upgeloadete" Bilder zusammen mit dem ARCHIVE-Programm (unter neuem Namen) auf Band oder mit MEFISDOS abgespeichert werden.


So, das waren nun meine Tipps zu ZX-PAINT.

Happy ZX-PAINTing wünscht

Siggi

PS: Ein vor mir mit zusätzlichen Kommentaren versehenes Programmlisting ist für weitere Forschungen beigefügt.
My ZX81 web-server: online since 2007, running since dec. 2020 using ZeddyNet hardware
http://zx81.ddns.net/ZxTeaM
Post Reply