ZX81 - Vidéos sur la programmation en langage machine
Modérateur : Politburo
ZX81 - Vidéos sur la programmation en langage machine
Bonjour à tous,
Suite à cette période de confinement, j'ai eu un peu de mal à trouver chez moi du silence pour enregistrer la partie n°2 consacrée à la programmation en langage machine du ZX81 mais voilà, c'est enfin en ligne !
ZX81 - Initiation au langage machine (partie 2)
J'y corrige l'exercice proposé dans la partie n°1 en donnant une version en BASIC et 4 versions en langage machine (ce qui permet de voir différentes instructions)
Ensuite je me lance dans la programmation en langage machine de l'algorithme de Syracuse (3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1) qui donnera les temps de vol (nombre de fois où l'on doit faire n/2 ou 3*n+1 avant d'arriver à 1) des nombres entre 1 et 30. Cela permet de voir comment on peut astucieusement faire une multiplication (par 3) ou une division (par 2) de registres doubles (genre HL) avec le processeur Z80A qui ne connait que les additions, soustractions et les rotations de bits.
J'ai essayé de tenir à peu près le même temps que la première vidéo...
N'hésitez pas à me faire des retours (sur YTube ou ici).
Question : J'ai mis un lien vers un émulateur de ZX81 pour MAC que je trouve bien (zxsp) avec possibilité de taper en LM et debugger, est-ce que vous avec un équivalent pour Windows ?
Suite à cette période de confinement, j'ai eu un peu de mal à trouver chez moi du silence pour enregistrer la partie n°2 consacrée à la programmation en langage machine du ZX81 mais voilà, c'est enfin en ligne !
ZX81 - Initiation au langage machine (partie 2)
J'y corrige l'exercice proposé dans la partie n°1 en donnant une version en BASIC et 4 versions en langage machine (ce qui permet de voir différentes instructions)
Ensuite je me lance dans la programmation en langage machine de l'algorithme de Syracuse (3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1) qui donnera les temps de vol (nombre de fois où l'on doit faire n/2 ou 3*n+1 avant d'arriver à 1) des nombres entre 1 et 30. Cela permet de voir comment on peut astucieusement faire une multiplication (par 3) ou une division (par 2) de registres doubles (genre HL) avec le processeur Z80A qui ne connait que les additions, soustractions et les rotations de bits.
J'ai essayé de tenir à peu près le même temps que la première vidéo...
N'hésitez pas à me faire des retours (sur YTube ou ici).
Question : J'ai mis un lien vers un émulateur de ZX81 pour MAC que je trouve bien (zxsp) avec possibilité de taper en LM et debugger, est-ce que vous avec un équivalent pour Windows ?
-
- Fonctionne à 300 bauds
- Messages : 99
- Enregistré le : 05 janv. 2009 21:02
- Localisation : BORDEAUX
Re: ZX81 - Vidéos sur la programmation en langage machine
merci schraf ...
excellent ... j attends la prochaine video ...
cool de faire ces videos sur la prog en LM sur le zx81
j utilise le zx assembleur d artic (sur mon zx81) ... ou autre option que j utilise le plus souvent c est la programmation en hexadecimal ... (plus long) ...
continue c est excellent
bien a toi schraf
didier
excellent ... j attends la prochaine video ...
cool de faire ces videos sur la prog en LM sur le zx81
j utilise le zx assembleur d artic (sur mon zx81) ... ou autre option que j utilise le plus souvent c est la programmation en hexadecimal ... (plus long) ...
continue c est excellent
bien a toi schraf
didier
UTILISATEUR du ZX81 depuis 1982 . j ai un lecteur de disquette mageco qui marche bien ... mon zx a ete modifie (prise joystick ... extension 16KO interne ...) ... j ai edite y a 5 an un journal appele micro sinclair ... le numero 6 est en cour
Re: ZX81 - Vidéos sur la programmation en langage machine
Effectivement, excellente vidéo, elle mérite bien le pouce bleu
L'approche de la programmation Z80 est vraiment différente du 6502. Le 6502 n'a que des registres 8 bits, par contre, il compense par un accès mémoire.
Avec les exemples que tu donnes, c'est bien d'avoir le nombre d'octets, mais ce serait bien de faire le compte de cycle du processeur pour effectuer le traitement.
Encore merci!
Ben
L'approche de la programmation Z80 est vraiment différente du 6502. Le 6502 n'a que des registres 8 bits, par contre, il compense par un accès mémoire.
Avec les exemples que tu donnes, c'est bien d'avoir le nombre d'octets, mais ce serait bien de faire le compte de cycle du processeur pour effectuer le traitement.
Encore merci!
Ben
Re: ZX81 - Vidéos sur la programmation en langage machine
Bonjour,
Merci pour ces retours !
J'étais un peu frustré de ne proposer que le temps de vol et pas le maximum atteint, je viens enfin d'y arriver...
A tester sur le site http://rullf2.xs4all.nl/jszeddy/jszeddy.html
Et le code en "clair"
Il faut que je me penche sur le 6502, d'autant que j'ai le commodore "THE C64" dans sa belle petite boite neuve
Merci pour ces retours !
J'étais un peu frustré de ne proposer que le temps de vol et pas le maximum atteint, je viens enfin d'y arriver...
A tester sur le site http://rullf2.xs4all.nl/jszeddy/jszeddy.html
Code : Tout sélectionner
1 rem [hex:00,00,00,00,3a,82,40,32,84,40,3e,00,32,85,40,2a,82,40,7c,fe,00,20,05,7d,fe,01,28,20,7d,e6,01,20,06,cb,3c,cb,1d,18,05,5d,54,29,19,23,ed,5b,84,40,b7,ed,52,19,da,94,40,22,84,40,18,d6,ed,4b,84,40,c9 ]
2 for n = 1 to 30
5 poke 16514, n
10 scroll
15 print n;"->";usr 16518
20 next n
Code : Tout sélectionner
org 16514
nop ; n sur 2 octets (je mets les variables ici plutôt qu'en utilisant RAMTOP pour plus de lisibilité)
nop
nop ; max = 0
nop
ld a, (16514) ; a = n
ld (16516),a ; max = n
ld a,0
ld (16517),a
ld hl,(16514)
loop: ld a,h ; test si n = 1
cp 0
jr nz, suite
ld a,l
cp 1
jr z, fin
suite: ld a,l ; test n impair
and 1
jr nz,impair
srl h ; n / 2
rr l
jr maxi
impair: ld e,l ; 3 * n + 1
ld d,h
add hl,hl
add hl,de
inc hl
maxi: ld de,(16516) ; de = max actuel
or a
sbc hl,de
add hl,de ; test si HL > DE
jp c, loop
ld (16516),hl ; si oui max = HL
jr loop
fin: ld bc, (16516) ; on renvoie le max dans BC
ret
-
- Fonctionne à 1200 bauds
- Messages : 484
- Enregistré le : 28 oct. 2018 17:28
- Localisation : Entre Lyon et St Etienne
- Contact :
Re: ZX81 - Vidéos sur la programmation en langage machine
Merci pour ces tutos, ça me ramène quelques années en arrière !
J'ai juste été surpris par l’utilisation du JP au Lieu d'un JR dans les 2 versions 3 ( ) du programme d'affichage de l'alphabet.
Tu aurais pu gagner un précieux octet de plus
J'ai juste été surpris par l’utilisation du JP au Lieu d'un JR dans les 2 versions 3 ( ) du programme d'affichage de l'alphabet.
Tu aurais pu gagner un précieux octet de plus
Re: ZX81 - Vidéos sur la programmation en langage machine
Merci @JCH ! Ouhlala oui, quel gâchis de perdre bêtement un octet !
Voici donc une version de l'alphabet en 9 octets :
Voici donc une version de l'alphabet en 9 octets :
Code : Tout sélectionner
1 rem [hex:3e,26,d7,3c,fe,40,20,fa,c9 ]
2 rand usr 16514
Code : Tout sélectionner
org 16514
ld a, 38
rst 16
inc a
cp 64
jr nz, -6
ret
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3419
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: ZX81 - Vidéos sur la programmation en langage machine
J'ai pris le temps de visionner ces vidéo avant de finir mon code pour MOS 6502/6510/8510. Je trouve cela fort instructif. Il y a des différences avec le Zylog Z80 mais aussi des similitudes. Notamment dans les mnémoniques utilisé et autres procédure de test.
Comme faire les calcul entre 0 et 255 n'a pas beaucoup d'intérêt et qu'il n'y a pas de registre fusionné, il faut faire les 'fusion' à la main. c'est très facile les 6502 possèdent pour cela deux registre d'indexage X et Y qui permettent des adressages étendus indexé rapide et pratique (tant que l'on ne charge pas à parcourir des matrice en deux dimension - les post et près- indexations ayant alors des limitations).
Mais traiter des entiers de plusieurs octets est assez pénible car il faut les coder et les résultats du calcul ne sont pas très visible, il faut décoder pour afficher.
Mon idée et de faire du calcul de la suite un jeu vidéo dont les chiffres s'animent en temps réel sur l'écran 40 Col (plus directement accessible au MOS 8502 de mon C128D).
Avantage, la saisie des donnée est facile car il suffit de taper les nombres directement dans l'écran 40Col (Les CBM-8bit de Commodore ont d'ailleurs un éditeur plein écran bien pratique ).
Les nombres et termes intermédiaire de la suite peuvent être grands (voirs très grands), je ne suis limité que par la taille de l'écran (25 lignes de 40 col font 1000 caractères).
L'inconvénient majeur est que les codes vidéo ne sont pas de simple nibbles mais des octets. Pour faire les calculs chiffre à chiffre et afficher au fur et à mesure , il faut constamment retirer et remettre les bits qui servent de 'masque d'affichage'. Ce n'est pas difficile et en utilisant des instruction AND #%00001111 et ORA #%0011000 , il est facile de décoder/recoder les chiffres dont les code caractère sont $30 $31 $32 … $39
Il faut alors aussi astucieusement jongler avec les addition binaire, décalage et surtout addition des retenues.
Et refaire ainsi chiffre à chiffre des milliers de fois les mêmes opérations arithmétiques, puis masqué/démasquer les chiffres.
J'ai préféré utiliser deux tables de pré-calcul. Avec l'adressage étendu des MOS 6502/6510/8510 il est facile d'obtenir le résultat de chaque opération directement à l'aide des codes d'affichage (ce n'est en fait qu'un offset de 48). Il suffit alors simplement de parcourir le nombre (dans le bon sens selon l'opération à réaliser) chiffre à chiffre.
Les tables ont deux entrées (deux parties en fait - pour illustrer, sur les capture ci-dessous j'ai mis chaque partie en vis à vis sur deux lignes) l'une donnant directement le code caractère à placer et la valeur binaire de la retenue (carry) à reporter sur le suivant.
Pour ne pas perdre de temps à balayer tout l'écran, la longueur de chaque nombre est donné par un pointeur mis à jour à la fin de chaque opération.
Les pointeurs entrent en jeu également pour les test de comparaison (X<?>N et X<?>M) un raccourci étant utilisé lorsque les pointeurs indiquent des nombres de tailles différentes. De même pour le test de fin.
La parité de nombre est déterminée comme le fait Eric en testant le bit0 du code caractère du chiffre0. Je fais en fait le test inverse, j'ai besoin de faire un saut si le nombre (à 240 chiffre) est pair. Au début du code je teste N (le nombre sisi par l'utilisateur) pour éviter la boucle déterminant la trajectoire en altitude et sur le nombre (à 240 chiffre) X dans lequel je vais faire soit la multiplication, soit la division.
Le code utilise deux boucles successives dans lesquels les termes de la suite de Syracuse sont calculés dans le nombre affiché X:
* la première n'est parcourue que pour N impair et détermine la trajectoire en altitude tanque X>N,
* la seconde est parcourue de la même manière mais cette fois le test de sortie est X='1'.
Dans les deux boucles, les mêmes sous-programme sont utilisés pour incrémenter le temps de vol T, recopier l'altitude maximale M, effectuer 3X+1 ou diviser X par deux. Les tests de sortie de boucle sont différents, mais le test X>N de sortie de la première boucle est le jumeau du test X>M qui permet de mettre à jour l'Altitude Maximale M.
Voici à quoi ressemble la procédure TstMaxX qui permet de comparer X et M puis de mettre à jour le maximum M:
Attention CPY ne signifie pas COPY mais est la contraction de ComPare with Y register.
Toutes les commande de comparaison du 8502 agisse sur le registre d'état composé des indicateurs N V B D I Z et C (respectivement Negative oVerflow Break Interupted Zero et Carry)
Les sauts JMP et JSR sont impérieux.
Les sauts conditionnels sont appelés branchements (respectivement BEQ BNE BMI BPL BCS BCC etc) et correspondent chacun à un état des bits indicateurs dans le registre d'état. Ainsi le branchement BNE $0923 n'est effectué que si l'indicateur N est à 1.
C'est un peu diffèrent, mais pas tant que cela avec le jeu d'instruction d'un Z80
Pour diviser, en utilisant la table de pré-calculs le code traitant des nombre immense est à peine plus long que celui pour faire sur deux octets :
Voir quelques captures d'écran, les tables de pré-calculs y sont clairement visibles.
P.S.: J'oubliaide préciser que ce code n'utilise aucune des instructions et procédure en ROM dans le Commodore C128; Il peut donc ête utilisé tel quel dans presque tous les CBM 8bits en adaptant uniquement les adresses des pointeurs et certainement sur d'autre machine (Apple, Oric, Acorn, etc...) en modifiant adresses, pointeurs et code écran.
Ah! Oui, je n'ai utlisé aucune des instructions non documentée ou étrange de la bestiole.
Comme faire les calcul entre 0 et 255 n'a pas beaucoup d'intérêt et qu'il n'y a pas de registre fusionné, il faut faire les 'fusion' à la main. c'est très facile les 6502 possèdent pour cela deux registre d'indexage X et Y qui permettent des adressages étendus indexé rapide et pratique (tant que l'on ne charge pas à parcourir des matrice en deux dimension - les post et près- indexations ayant alors des limitations).
Mais traiter des entiers de plusieurs octets est assez pénible car il faut les coder et les résultats du calcul ne sont pas très visible, il faut décoder pour afficher.
Mon idée et de faire du calcul de la suite un jeu vidéo dont les chiffres s'animent en temps réel sur l'écran 40 Col (plus directement accessible au MOS 8502 de mon C128D).
Avantage, la saisie des donnée est facile car il suffit de taper les nombres directement dans l'écran 40Col (Les CBM-8bit de Commodore ont d'ailleurs un éditeur plein écran bien pratique ).
Les nombres et termes intermédiaire de la suite peuvent être grands (voirs très grands), je ne suis limité que par la taille de l'écran (25 lignes de 40 col font 1000 caractères).
Code : Tout sélectionner
; OPERATIONS:
; -Effacer l'écran et saisir N en haut de l'écran 40 Col
; -lancer le programme G 800 (depuis le monitor) ou SYS 2048 (en BASIC)
; -voir s'agiter les calculs en direct (quelques fractions de secondes)
; -s'affiche dans l'ordre
; X termes successifs de la suite jusqu'à 1
; les pointers et deux tables de calculs (volontairement placées là pour être visibles)
; N saisi par l'utilisateur
; M l'altitude maximale
; A la durée de la trajectoire en altitude
; T le temps de vol total
; Chaque nombre ((ou table) occupe 2 ou 6 lignes d'écran afin de recevoir jusqu'à 240 chiffres
Il faut alors aussi astucieusement jongler avec les addition binaire, décalage et surtout addition des retenues.
Et refaire ainsi chiffre à chiffre des milliers de fois les mêmes opérations arithmétiques, puis masqué/démasquer les chiffres.
J'ai préféré utiliser deux tables de pré-calcul. Avec l'adressage étendu des MOS 6502/6510/8510 il est facile d'obtenir le résultat de chaque opération directement à l'aide des codes d'affichage (ce n'est en fait qu'un offset de 48). Il suffit alors simplement de parcourir le nombre (dans le bon sens selon l'opération à réaliser) chiffre à chiffre.
Les tables ont deux entrées (deux parties en fait - pour illustrer, sur les capture ci-dessous j'ai mis chaque partie en vis à vis sur deux lignes) l'une donnant directement le code caractère à placer et la valeur binaire de la retenue (carry) à reporter sur le suivant.
Pour ne pas perdre de temps à balayer tout l'écran, la longueur de chaque nombre est donné par un pointeur mis à jour à la fin de chaque opération.
Les pointeurs entrent en jeu également pour les test de comparaison (X<?>N et X<?>M) un raccourci étant utilisé lorsque les pointeurs indiquent des nombres de tailles différentes. De même pour le test de fin.
La parité de nombre est déterminée comme le fait Eric en testant le bit0 du code caractère du chiffre0. Je fais en fait le test inverse, j'ai besoin de faire un saut si le nombre (à 240 chiffre) est pair. Au début du code je teste N (le nombre sisi par l'utilisateur) pour éviter la boucle déterminant la trajectoire en altitude et sur le nombre (à 240 chiffre) X dans lequel je vais faire soit la multiplication, soit la division.
Code : Tout sélectionner
... ; Test de parité du nombre N placé en $0568-$0657
. 0080C A9 01 LDA #$01 ; charge mask %00000001 dans registre A
. 0080E 2C 57 06 BIT $0657 ; test de bit du dernier chiffre du nombre N en $0657 z ← ( A and ($0657) )
. 00811 F0 32 BEQ $0845 ; saut vers $0845 (début boucle LOOP→1 ) car nombre N pair (z=0)
Loop↑N: ; Boucle tant que X>N
. 00813 A9 01 LDA #$01 ; Test de parité du nombre X placé en $0400-$0517
. 00813 2C 17 05 BIT $0517 ; test de bit du dernier chiffre du nombre X en $0517
. 00816 F0 09 BEQ $0823 ; saut vers $0823 (début traitement nombre pair)
...
Le code utilise deux boucles successives dans lesquels les termes de la suite de Syracuse sont calculés dans le nombre affiché X:
* la première n'est parcourue que pour N impair et détermine la trajectoire en altitude tanque X>N,
* la seconde est parcourue de la même manière mais cette fois le test de sortie est X='1'.
Dans les deux boucles, les mêmes sous-programme sont utilisés pour incrémenter le temps de vol T, recopier l'altitude maximale M, effectuer 3X+1 ou diviser X par deux. Les tests de sortie de boucle sont différents, mais le test X>N de sortie de la première boucle est le jumeau du test X>M qui permet de mettre à jour l'Altitude Maximale M.
Voici à quoi ressemble la procédure TstMaxX qui permet de comparer X et M puis de mettre à jour le maximum M:
Code : Tout sélectionner
TestMaxX:
. 008F8 AC 19 05 LDY $0519 ; y = ^X Pointer premier chiffre de X
. 008FB AE 19 05 LDX $0519 ; x = ^X (cope pour usage ultérieur)
. 008FE CC 1A 05 CPY $051A ; 51A = ^M compare ^X ? ^M
. 00901 F0 02 BEQ $0905 ; ^X = ^M nombres x et M ont même taille → Test Long C à C
. 00903 10 1E BPL $0923 ; ^X > ^M sort ss-prg car X < M
LongTxtMaxX:
. 00905 B9 28 04 LDA $0428,Y ; a = X[y] $428 est adresse début région X
. 00908 D9 58 06 CMP $0658,Y ; compare a à M[y] $658 début de M
. 0090B 30 16 BMI $0923 ; X[y] < M[y] sort procédure car X>M
. 0090D D0 06 BNE $0915 ; X[y] > M[y] va copier X dans M
; X[y] = M[y] continuer test
. 0090F C8 INY ; y = y +1 on passe au chiffre suivant
. 00910 C0 F0 CPY #$F0 ; $F0 limite longueur nombre (240 chiffres)
. 00912 30 F1 BMI $0905 ; continue test long jusqu'au dernier chiffre
. 00914 60 RTS ; sort procèdure X et M sont identiques
CopyNtoM:
. 00915 B9 28 04 LDA $0428,Y ; charge code caractère chiffre X[y] ( X est mémorisé de $428 à $517 )
. 00918 99 58 06 STA $0658,Y ; remplace le chiffre M[y] ( M est mémorisé de $658 à $747 )
. 0091B C8 INY ; chiffre suivant
. 0091C C0 F0 CPY #$F0 ; $F0 limite longueur nombre (240 chiffres)
. 0091E D0 F5 BNE $0915 ; continue copie jusqu'au dernier chiffre
. 00920 8E 1A 05 STX $051A ; met à jour pointer ^M avec valeur du pointer ^X
EndTestMaxX:
. 00923 60 RTS
Toutes les commande de comparaison du 8502 agisse sur le registre d'état composé des indicateurs N V B D I Z et C (respectivement Negative oVerflow Break Interupted Zero et Carry)
Les sauts JMP et JSR sont impérieux.
Les sauts conditionnels sont appelés branchements (respectivement BEQ BNE BMI BPL BCS BCC etc) et correspondent chacun à un état des bits indicateurs dans le registre d'état. Ainsi le branchement BNE $0923 n'est effectué que si l'indicateur N est à 1.
C'est un peu diffèrent, mais pas tant que cela avec le jeu d'instruction d'un Z80
Pour diviser, en utilisant la table de pré-calculs le code traitant des nombre immense est à peine plus long que celui pour faire sur deux octets :
Code : Tout sélectionner
. 00924 AC 19 05 LDY $0519 ; y ← ^X pointer vers premier chiffre de X
. 00927 A9 00 LDA #$00 ; a ← 0 RAZ Retenue initiale
DivX.2:
. 00929 18 CLC
. 0092A 79 28 04 ADC $0428,Y ; a ← X[y] + r ajoute la retenue (reste) précèdant au code car X[y]
. 0092D AA TAX ; x ← a x est indice pour lecture dans table de calcul
. 0092E BD FC 04 LDA $04FC,X ; a ← x/2 $4FC origine table des codes car valant X/2
. 00931 99 28 04 STA $0428,Y ; affiche le chiffre résultat
. 00934 BD 24 05 LDA $0524,X ; a ← r(x) $524 origine table des restes (+0 ou +10 selon parité)
. 00937 C8 INY ; passe au suivant
. 00938 C0 F0 CPY #$F0
. 0093A D0 ED BNE $0929 ; Boucle sur tous les chiffres du nombre X (jusqu'à 240)
Voir quelques captures d'écran, les tables de pré-calculs y sont clairement visibles.
P.S.: J'oubliaide préciser que ce code n'utilise aucune des instructions et procédure en ROM dans le Commodore C128; Il peut donc ête utilisé tel quel dans presque tous les CBM 8bits en adaptant uniquement les adresses des pointeurs et certainement sur d'autre machine (Apple, Oric, Acorn, etc...) en modifiant adresses, pointeurs et code écran.
Ah! Oui, je n'ai utlisé aucune des instructions non documentée ou étrange de la bestiole.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
ZX81 - Partie 3 - Vidéos sur la programmation en langage machine
Bonjour à tous,
Je viens de mettre en ligne la partie 3 consacrée à la programmation en langage machine sur le ZX81. Cette fois j'explique l'utilisation des piles (pour sécuriser les registres et également la pile de calculs) et des routines (de la ROM ou personnelles).
J'avais un autre exemple amusant (avec l'affichage d'un texte en alphabet géant) mais la vidéo devenait vraiment trop longue (il parait que le temps idéal des vidéos est de 6 minutes, j'en suis loin ), bref peut-être une autre vidéo.
Je vous mets les codes ci-dessous :
Tracer la fonction y = 5 * racine(x)
Ce qui donne :
Automate cellulaire 1D :
Ce qui donne :
Je viens de mettre en ligne la partie 3 consacrée à la programmation en langage machine sur le ZX81. Cette fois j'explique l'utilisation des piles (pour sécuriser les registres et également la pile de calculs) et des routines (de la ROM ou personnelles).
J'avais un autre exemple amusant (avec l'affichage d'un texte en alphabet géant) mais la vidéo devenait vraiment trop longue (il parait que le temps idéal des vidéos est de 6 minutes, j'en suis loin ), bref peut-être une autre vidéo.
Je vous mets les codes ci-dessous :
Tracer la fonction y = 5 * racine(x)
Code : Tout sélectionner
org 16514
ld c,0
loop: push bc
call racine
call 0bb2h ; PLOT
pop bc
inc c
ld a,c
cp 64 ; c entre 0 et 63
jr nz, loop
ret
racine: ld a,c
call 151dh ; ajoute "a" à la pile de calcul
push af
ld a,5 ; ajoute 5
call 151dh
rst 28h
defb 1h ; échange "a" et 5
defb 25h ; sin
defb 04h ; multiplication
defb 34h ; fin
nop
call 0ea7h ; Dépile dans BC
ld b,c
pop af
ld c,a
ret
Code : Tout sélectionner
1 rem [hex:0e,00,c5,cd,93,40,cd,b2,0b,c1,0c,79,fe,40,20,f2,c9,79,cd,1d,15,f5,3e,05,cd,1d,15,ef,01,25,04,34,00,cd,a7,0e,41,f1,4f,c9 ]
2 rand usr 16514
Code : Tout sélectionner
org 16514
rule: nop
ld de,(16396)
inc de
ld l,0 ; boucle sur les lignes
ligne: ld c,0 ; boucle sur les colonnes
col: ld a,0
call ecran ; on recherche la configuration des 3 cases
sla a ; a = 2 * a (décalage vers la gauche)
call ecran
sla a
call ecran ; ce qui donne un chiffre binaire entre 0 et 7
dec de ; on place DE pour la future recherche
dec de
ld b,a
inc b
call sortie ; Faut-il mettre un carré noir en dessous ?
inc c
ld a,c
cp 30 ; fin de colonne ?
jr nz,col
inc de ; On positionne DE au début de la ligne suivante
inc de
inc de
inc l
ld a,l
cp 22 ; fin des lignes ?
jr nz, ligne
ret
ecran:push af
ld a,(de) ; on récupère 128d ou 0
rlca ; "a" devient 1 ou 0
inc de
ld h,a ; h = 1 ou 0
pop af
add a,h ; on ajoute h à l'ancien "a"
ret
noir: push hl
ld hl,33
add hl,de ; on se place à la ligne du dessous
ld (hl),80h ; Carré noir
pop hl
ret
sortie:ld a,(16514)
cherche:djnz next ; On cherche dans la règle
bit 0,a
jr nz, noir ; Si on obtient un 1, on met un carré noir
ret
next:srl a
jr cherche
Code : Tout sélectionner
1 rem [hex:00,ed,5b,0c,40,13,2e,00,0e,00,3e,00,cd,b2,40,cb,27,cd,b2,40,cb,27,cd,b2,40,1b,1b,47,04,cd,c3,40,0c,79,fe,1e,20,e4,13,13,13,2c,7d,fe,16,20,d9,c9,f5,1a,07,13,67,f1,84,c9,e5,21,21,00,19,36,80,e1,c9,3a,82,40,10,05,cb,47,20,ee,c9,cb,3f,18,f5 ]
2 print at 0,16;chr$ 128
3 poke 16514,182
5 rand usr 16515
- phm
- Fonctionne à 2400 bauds
- Messages : 1364
- Enregistré le : 08 avr. 2016 18:36
- Localisation : Est Parisien
Re: ZX81 - Vidéos sur la programmation en langage machine
Bonjour et ne te vexe pas de ma remarque mais autant je suis admiratif du contenu de ce tu proposes, autant je reste sur ma faim car je ne vois pas tourner un vrai ZX81 (ne serait-ce que de temps en temps pour le fun).
Evidement je fais partie de ceux qui ont acquis cette machine à sa sortie et je t’avoue que la manipulation faite sur l’émulateur n’a rien à voir avec l’utilisation d’une vraie machine (lenteur ZX et galère du clavier … )
Donc je suis gêné par le décalage entre le titre du poste et ce que je vois dans les vidéos.
Mais ce n’est que mon avis personnel, ce qui ne retire rien à ton travail.
Evidement je fais partie de ceux qui ont acquis cette machine à sa sortie et je t’avoue que la manipulation faite sur l’émulateur n’a rien à voir avec l’utilisation d’une vraie machine (lenteur ZX et galère du clavier … )
Donc je suis gêné par le décalage entre le titre du poste et ce que je vois dans les vidéos.
Mais ce n’est que mon avis personnel, ce qui ne retire rien à ton travail.
HEWLETT-PACKARD : The best
CANON X-07 X-730 X-711 XR-100 XM-101 XP-110F XP-120F XP-130F XP-140
AMSTRAD CPC-464 CPC-6128 ATARI STF DAI Indata
CANON X-07 X-730 X-711 XR-100 XM-101 XP-110F XP-120F XP-130F XP-140
AMSTRAD CPC-464 CPC-6128 ATARI STF DAI Indata
Re: ZX81 - Vidéos sur la programmation en langage machine
Bonjour,
En fait c'est la même sensation de mon côté car je n'arrive pas à brancher mon ZX81 sur un vrai téléviseur... je suis pourtant sur le canal 36 en UHF mais je ne sais pas si ça vient de la TV (en fait un mini écran) ou du ZX... Il faudrait que je trouve un vrai vieux poste en N&B mais j'ai cru comprendre que ce n'était pas le moment d'aller faire les magasins
Sinon, quand je vois le peu que je faisais avec cette machine à l'époque (à part taper pendant des heures des listings sans les comprendre) et ce que j'arrive aujourd'hui à comprendre, je me dis que finalement j'aurais bien profité de cette petite machine rigolote
Bref, dès que j'ai un visuel je le poste sur silicium.org ! Après, peut-être que des membres de ce forum peuvent taper un programme ou 2 pour le voir fonctionner en vrai !
Eric S
En fait c'est la même sensation de mon côté car je n'arrive pas à brancher mon ZX81 sur un vrai téléviseur... je suis pourtant sur le canal 36 en UHF mais je ne sais pas si ça vient de la TV (en fait un mini écran) ou du ZX... Il faudrait que je trouve un vrai vieux poste en N&B mais j'ai cru comprendre que ce n'était pas le moment d'aller faire les magasins
Sinon, quand je vois le peu que je faisais avec cette machine à l'époque (à part taper pendant des heures des listings sans les comprendre) et ce que j'arrive aujourd'hui à comprendre, je me dis que finalement j'aurais bien profité de cette petite machine rigolote
Bref, dès que j'ai un visuel je le poste sur silicium.org ! Après, peut-être que des membres de ce forum peuvent taper un programme ou 2 pour le voir fonctionner en vrai !
Eric S
- phm
- Fonctionne à 2400 bauds
- Messages : 1364
- Enregistré le : 08 avr. 2016 18:36
- Localisation : Est Parisien
Re: ZX81 - Vidéos sur la programmation en langage machine
Merci pour ton retour,
De mon côté j'en n'ai plus de ZX81.
Est-ce que l'on ne pourrais pas passer par un vieux lecteur VHS qui aurait une entrée UHF et une sortie peritel ?
Il y a peut être un membre qui possède un ZX81 opérationnel, cela serait bien
De mon côté j'en n'ai plus de ZX81.
Est-ce que l'on ne pourrais pas passer par un vieux lecteur VHS qui aurait une entrée UHF et une sortie peritel ?
Il y a peut être un membre qui possède un ZX81 opérationnel, cela serait bien
HEWLETT-PACKARD : The best
CANON X-07 X-730 X-711 XR-100 XM-101 XP-110F XP-120F XP-130F XP-140
AMSTRAD CPC-464 CPC-6128 ATARI STF DAI Indata
CANON X-07 X-730 X-711 XR-100 XM-101 XP-110F XP-120F XP-130F XP-140
AMSTRAD CPC-464 CPC-6128 ATARI STF DAI Indata
Re: ZX81 - Vidéos sur la programmation en langage machine
Bon, mon zx81 n'est pas mort... Je vais tenter le coup d'un branchement en passant par un magnétoscope VHS, merci pour le conseil...
- gleike
- Fonctionne à 300 bauds
- Messages : 218
- Enregistré le : 13 déc. 2014 19:06
- Localisation : Ludres (54710)
Re: ZX81 - Vidéos sur la programmation en langage machine
Une petite modification interne du ZX81 permet de sortir un signal vidéo composite donnant une très belle image.
Voir ici : https://youtu.be/1irH3KuGyl0
Lien du PDF : http://zx.zigg.net/misc-projects/ZX81_V ... ioning.pdf
J'ai réalisé le montage, celui a base de NE555, et l'image est encore plus belle que sur le vidéo YouTube
Voir ici : https://youtu.be/1irH3KuGyl0
Lien du PDF : http://zx.zigg.net/misc-projects/ZX81_V ... ioning.pdf
J'ai réalisé le montage, celui a base de NE555, et l'image est encore plus belle que sur le vidéo YouTube
Re: ZX81 - Vidéos sur la programmation en langage machine
J'adore le "Une petite modification interne du ZX81", perso ça me fait un peu flipper une manip comme ça !!
-
- Fonctionne à 300 bauds
- Messages : 99
- Enregistré le : 05 janv. 2009 21:02
- Localisation : BORDEAUX
Re: ZX81 - Vidéos sur la programmation en langage machine
HELLO eric
merci pour ces 3 videos ... j espere que tu vas continuer ...
j ai un petit probleme que je n arrive pas a resoudre
je suis en train d adapter en LM le jeu sorcery (qui tournait sur cpc 464 et c64) sur zx81 . .c est long ... tres long ...
je voudrais realiser un compteur qui part de 999 et qui decremente de 1 pour arriver a zero ...
en gros une adaptation de ceci qui est en basic :
10 let a = 999
20 Print at 21,20; a
30 let a = a-1
40 if a=0 then stop
50 goto 20
voila eric ... si tu as une idée pour une version en hexadecimal de ce petit programme en basic ... je suis preneur
merci beaucoup eric
didier
merci pour ces 3 videos ... j espere que tu vas continuer ...
j ai un petit probleme que je n arrive pas a resoudre
je suis en train d adapter en LM le jeu sorcery (qui tournait sur cpc 464 et c64) sur zx81 . .c est long ... tres long ...
je voudrais realiser un compteur qui part de 999 et qui decremente de 1 pour arriver a zero ...
en gros une adaptation de ceci qui est en basic :
10 let a = 999
20 Print at 21,20; a
30 let a = a-1
40 if a=0 then stop
50 goto 20
voila eric ... si tu as une idée pour une version en hexadecimal de ce petit programme en basic ... je suis preneur
merci beaucoup eric
didier
UTILISATEUR du ZX81 depuis 1982 . j ai un lecteur de disquette mageco qui marche bien ... mon zx a ete modifie (prise joystick ... extension 16KO interne ...) ... j ai edite y a 5 an un journal appele micro sinclair ... le numero 6 est en cour