OVH Cloud OVH Cloud

programmes UDG sur ZX81

3 réponses
Avatar
philippe-duhamel
Bonjour a tous en me promenant sur les sites ZX81 j'ai appris qu'il y aurait
le moyen de redefinir des caracteres sur ZX81 et ceci de facon logiciel
(UDG) mais j'ai beau chercher je n'ai trouver aucune informations sur la
maniere de proceder. m'etant moi meme et en toute modestie mis a programmer
en assembleur sur cette becane quelqu'un aurait il des docs sur cette
maniere de programmer ou a defaut aurait il une adresse web a me comuniquer
?

voila tout est dit merci de votre attention

3 réponses

Avatar
GzavSnap [ZX81]
Salut Philippe!

Étonnant la haute définition sur ZX81 ...
Moi même, à l'époque, je ne connaissait pas ce mode de programmation!
Et pour cause ...
Un Zx81 simple ne peut pas fonctionner en mode haute résolution.
Il faut avoir de la mémoire dans la zone basse 8-16k du micro.
Donc, avoir une carte spéciale, bricoler l'adressage memoire ou avoir une
carte Memotech 64K.

Pour les exemples, sites zx81.ordi5.free.fr "Train Rush" est un exemple en
UDG avec sources (64k).

Pour la programmation assembleur ... http://dskcenter.free.fr/zxtools
Téléchargez ZxUDG, des fichiers TXT explique le principe avec encore des
exemples.

Bon courage!

Cordialement.

"philippe-duhamel" a écrit dans le message de
news:45cda8a2$0$27398$
Bonjour a tous en me promenant sur les sites ZX81 j'ai appris qu'il y


aurait
le moyen de redefinir des caracteres sur ZX81 et ceci de facon logiciel
(UDG) mais j'ai beau chercher je n'ai trouver aucune informations sur la
maniere de proceder. m'etant moi meme et en toute modestie mis a


programmer
en assembleur sur cette becane quelqu'un aurait il des docs sur cette
maniere de programmer ou a defaut aurait il une adresse web a me


comuniquer
?

voila tout est dit merci de votre attention


Avatar
philippe-duhamel
merci pour le renseignement ca tombe bien j'ai justement une memotech 64ko
qui dormait dans un coin
Étonnant la haute définition sur ZX81 ...
Moi même, à l'époque, je ne connaissait pas ce mode de programmation!
Et pour cause ...
Un Zx81 simple ne peut pas fonctionner en mode haute résolution.
Il faut avoir de la mémoire dans la zone basse 8-16k du micro.
Donc, avoir une carte spéciale, bricoler l'adressage memoire ou avoir une
carte Memotech 64K.

Pour les exemples, sites zx81.ordi5.free.fr "Train Rush" est un exemple en
UDG avec sources (64k).

Pour la programmation assembleur ... http://dskcenter.free.fr/zxtools
Téléchargez ZxUDG, des fichiers TXT explique le principe avec encore des
exemples.

Bon courage!

Cordialement.
Avatar
GzavSnap [ZX81]
"philippe-duhamel" a écrit dans le message de
news:45cda8a2$0$27398$
Bonjour a tous en me promenant sur les sites ZX81 j'ai appris qu'il y
aurait le moyen de redefinir des caracteres sur ZX81 et ceci de facon
logiciel (UDG) mais j'ai beau chercher je n'ai trouver aucune
informations sur la maniere de proceder. m'etant moi meme et en toute
modestie mis a programmer en assembleur sur cette becane quelqu'un
aurait il des docs sur cette maniere de programmer ou a defaut aurait
il une adresse web a me comuniquer ?
voila tout est dit merci de votre attention



"Le Mystère de l'UDG sur ZX81."
(Mise à jour du fichier texte du logiciel ZxUDG.)

ZxUDG v.102
-----------

Logiciel permettant d'utiliser la haute définition sur Zx81.

Toutefois, il est nécessaire de changer la configuration du ZX81
car ce mode de programmation réoriente le registre IR (Interupt Request)
vers une zone d'adressage non utilisée par un ZX81 classique, la mémoire
basse de l'adressage &h2000 à &h3FFF (&h2000 00h en hexadécimal).

Organisation de la mémoire basse:
--------------------------------
Pour des facilités de conception, les ingénieurs Sinclair ont placé le
début d'adressage de la Ram (MEV ou Mémoire vivre) à l'adresse &h4000
(16384).
De 0 à &h1fff, nous avons l'interpréteur basic en ROM (MEM ou Mémoire morte)
et de &h2000 à &h3fff, une zone fantôme.
Cette zone fantôme est le miroir de la rom et ne peut être Pokée.
Ce n'est pas une mémoire Ram (ni d'ailleurs une Rom) mais une copie conforme
de la Rom Basic du ZX81. Donc sur un ZX81 classique, l'adressage dans cette
zone sera redirigée vers la Rom. Donc Peek en &h2000/8192 équivaux à un
Peek 0.
Résultat, cette zone est inexploitable.

Dans le cas d'un ajout de périphériques (ROM ou Ram), cet adressage peut
donc être assigné au matériel en lecture seule ou en lecture et écriture.
Il est à noter que cette partie de la mémoire n'est pas modifiée par un
chargement de programmes avec la fonction LOAD"", ce qui permet de charger
un programme en deux temps ou d'y placer des utiliaires tel que le Fast
Load, un assembleur etc...

L'UDG:
-----
La technique est basée sur la migration de la fonte de ROM en RAM.
Il suffit de copier la partie de la Rom contenant la police de
caractère, dans la mémoire "fantôme", juste après la Rom.

Cette partie de Ram héberge alors une copie de la Rom, mais est parfois
utilisée par certains périphériques (les désactiver).

Cette fonte est basée sur 64 caractères de base de 0 à 63.

Les autres caractères visibles sont les même caractères mais en vidéo
inversée de 128 à 191 (Bit07 à 1), donc l'inversion vidéo fonctionnera
aussi pour les caractères redéfinis.

L'impression sur l'imprimante est traitée indépendamment de l'affichage et
ne sera pas redéfinie.

Le Registre IR (Interrupt Request):
---------------------------------
C'est un registre spécial du Z80 qui permet de fixer l'adressage d'appel de
l'affichage des caractères ASCII du ZX.

La partie I en 8 bits détermine le début de la table des pixels qui forment
les caractères Ascii(*).

* : "Ascii" dans son sens purement général du terme, car cela veut dire
"American Standard Codes for International Interchange" ... et notre bon
vieux ZX81 n'a rien de standard au niveau de ses codes Ascii.
Ce terme s'applique plus au PC qu'au ZX, mais on prendra ce terme pour
nommer le numéro decaractère défini pour les Chr$()... c'est plus simple.


La partie R en 8 bits détermine l'incrémantation pour la lecture des blocs
de pixels (8bits=ligne de 8 pixels donc un caractère est égale a 8 lignes
de 8 pixels(8 octets; 64bits)).

La fonction assembleur LD I,1F est paramétrée au démarrage.
La table commence donc à &h1F00 et ce termine à &h1FFF.

Pour changer la valeur de pointage de I, il suffit de modifier I en &h20.
Donc, à chaque appel de l'interruption IR, elle pointera vers &h20xx hors
ROM.

Adressage de la ROM:
-------------------
Il est toutefois à noter que le bus d'adressage n'est pas complètement
connecté au bus de la ROM!
Pour la conception, le registre I ne nécessite d'un adressage allant de 0
à &h1FFF et non plus.

Donc, 13bits d'adressage. Mais les concepteurs ont prévus un bits de plus
en prévision d'une Rom de 16ko au lieu de 8ko.(d'où l'affiche du miroir de
la rom avec le bit 14 à 1)

Résultat, toutes bit d'adressage supérieur à 14 est tout bonnement ignoré
et mis à zéro!
Cela ne nous arrange pas, car I ne peut plus être réorienté vers la mémoire
utilisateur de 1 ou 16ko! Nous sommes dans l'obligation d'utiliser une ram
ou un rom physiquement implantée dans la zone de 8-16k du ZX81.

Donc, un Zx81 ne peut pas fonctionner en UDG sans ajout de mémoire!

Seule solution, réutiliser la mémoire interne de 1ko du ZX81 (déconnectée si
l'on utilise une extension mémoire) et modifier son adressage à &h2000.
La modification est plutôt simple, mais interdit l'utilisation du ZX81 sans
extensions additionnelles. De plus, la modification est matérielle, il faut
donc ouvrir la machine et bricoler des pistes et ajouter quelques
composants sur la carte.


ZxUDG:
-----
L'UDG, Graphique redéfinissable par l'utilisateur, est simple à mettre en
oeuvre et peut être POKée directement en basic
(voir la nouvelle icône pour créer le programme Basic avec ZxBasic.)

ZxUDG est un utilitaire permettant de "patcher" la mémoire du Zx81 avec une
fonte déjà modifiée de la taille de 512 octets (Sans copier la ROM).

Grâce aux émulateurs, il est simple de charger un fichier binaire
directement en mémoire, juste après la ROM, à l'adresse 8192.

Il suffira alors d'ajouter un petit programme assembleur pour rerouter
l'affichage sur la partie de RAM modifiée.

Sans "patcher" la mémoire du Zx, il faut copier la Rom :

(Code disponibles dans PacMan)

(programme identique à l'exemple basic donné dans l'explication Anglaise,
mais en assembleur)
1 REM xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4000 REM 21;00;1E LD HL,$1E00 ; Copie de la Rom en Ram
4010 REM 11;00;20 LD DE,$2000 ; de l'adresse 7680 vers 8192
4020 REM 01;00;02 LD BC,$0200 ; Taille du bloc 512 octets
4030 REM ED;B0 LDIR ; inutile avec l'utilisation de ZxUDG
; Les informations sont chargées en 8192

Pour le reroutage de la fonte (avec et sans ZxUDG):
4040 REM 21;00;22 LD HL,$2200 ; Registre HL = 8704
4050 REM 36;3E LD (HL),$3E ; Placer 3E dans HL ( Poke 8704,62 )
4060 REM 23 INC HL ; Registre HL = 8705
4070 REM 36;20 LD (HL),$20 ; ...
4080 REM 23 INC HL ; Registre HL = 8706 |
4090 REM 36;ED LD (HL),$ED ; ... Programme ASM
ci-après.
4100 REM 23 INC HL ; Registre HL = 8707 |
4110 REM 36;47 LD (HL),$47 : ...
4120 REM 23 INC HL ; Registre HL = 8708
4130 REM 36;C9 LD (HL),$C9 ; ...
4140 REM C9 RET ; retour au Basic.

lancer le programme avec Rand Usr 16514

Initialisation après avoir changé la fonte en Ram:
8704 3E;20 LD A,$20 ; Registre A2
8706 ED;47 LD I,A ; Registre I = Registre A
8708 C9 RET ; retour au Basic.

Sans ZxUDG: (La RAM contient la police originale)
9101 LET OFFSET92+8*CODE " " ; Code de chr$(0)
9102 POKE OFFSET,255 ; "11111111" en 8192
9103 POKE OFFSET+1,129 ; "10000001" en 8193
9104 POKE OFFSET+2,129 ; "10000001" en 8194
9105 POKE OFFSET+3,129 ; "10000001" en 8195
9106 POKE OFFSET+4,129 ; "10000001" en 8196
9107 POKE OFFSET+5,129 ; "10000001" en 8197
9108 POKE OFFSET+6,129 ; "10000001" en 8198
9109 POKE OFFSET+7,255 ; "11111111" en 8199

Avec et sans ZxUDG initialisation de la routine d'affichage par:
Rand Usr 8704 et l'espace donne un carré pour tous les appels
de ce caractère!

Les émulateurs: (patch de la mémoire avec un fichier extérieur)

- SANS ZxUDG
Pour l'utilisation de l'UDG sans patcher la mémoire avec un fichier
extérieur voir l'exemple Pac-Man_Hrg.

- ZxUDG avec EO (désactiver les cartes graphiques ou son!)

1 rem Init UDG
10 POKE 8704,62
20 POKE 8705,32
30 POKE 8706,237
40 POKE 8707,71
50 POKE 8708,201

Menu "File", "Load memory bloc" à l'offset 8192

Et RAND USR 8704

- ZxUDG avec Xtender:
Programme identique mais avec un chargement avec la ligne
60 LOAD "*LOAD:C:CHAR:8192:" (où "Char" est le nom du fichier
"CHAR.C" -Code-)

- ZxUDG avec No$Cash Zx81 et VB81: (Je n'ai pas trouvé pour no$cash ... et
modifié VB81!)

Le Pré-chargement de la police de caractère:
Le fichier généré dans la version 1.02 (icône "REM..."), permet de charger
les 512 octets de l'adresse $2000 à $2200 et d'intégrer le commutateur
(rand usr 8704) pour activer la nouvelle police et (rand usr 8709) pour
la police originale.
Cette méthode permet d'utiliser un segment de mémoire qui ne sera pas effacé
par le chargement du programme suivant
(un peu comme le Ram_Top, mais en mémoire basse).

Donc, le programme chargé à l'aide de ce programme ne contient que les
"rand usr 8704/9709" et leurs tailles ne change pas excessivement.
(Nota: utiliser Rand Usr Val("8704") pour gagner de la place mémoire)

Avec cette méthode, les jeux basic les plus simples retrouvent de l' intérêt
et ... et même pour les Zx81 de 1Ko!

Bonne amusement!

XavSnap.