// // ROM de boot pour la montre // // #define STARTED 400h // #define SEC1 401h // #define SEC10 402h // #define MIN1 403h // #define MIN10 404h // Le processeur reçoit un reset toutes les secondes // Si c'est la premiere fois, il faut le mettre à l'heure : @boot_start read r1 r0 400h // STARTED jump0 r0 r1 @init // si démarrage .. // sinon on incrémente add r2 r0 401h // SEC1 jump0 r30 r0 @cm60 // on incrémente les secondes add r2 r0 403h // MIN1 jump0 r30 r3 @cm60 // minutes si necessaire add r2 r0 405h // HOUR1 jump0 r30 r3 @cm24 // heures si necessaire @disp add r10 r0 0 @disp_loop sub r11 r10 6 jump0 r0 r11 @disp_end read r1 r10 401h add r2 r10 201h // sortie 1+r10 jump0 r31 r0 @seg7 // affichage add r10 r10 1 // incrémentation des adresses jump0 r0 r0 @disp_loop @disp_end @sleep add r1 r0 10b write r1 r0 200h // zzz... zzz... @init add r1 r0 -1 write r1 r0 400h // on signale que qu'on a démaré jump0 r0 r0 @disp // on affiche l'heure et dodo // compteur modulo r1 : // r2 contient l'adresse de la valeur à incrémenter // au retour, r3 = la nouvelle valeur du compteur // adresse de retour dans r31 // utilise r3, r4 @cm0 read r3 r2 0 // on lit la valeur courante add r3 r3 1 sub r4 r3 r1 jump0 r0 r4 @cm0_init jump0 r0 r0 @cm0_end @cm0_init //initialisation add r3 r0 0 @cm0_end write r3 r2 0 // on écrit la nouvelle valeur ajump0 r0 r0 r31 // retour // fin cm0 // compteur modulo 60 : // r2 : addresse des unités // r2 + 1 : adresse des dizaines // r30 : adresse de retour // au retour : // r3 : nouvelle valeur des dizaines // modifie r2, r1,r4 @cm60 add r1 r0 10 jump0 r31 r0 @cm0 // on incrémente les unités add r1 r0 6 // dizaines mod 6 add r2 r2 1 // adr. dizaines jump0 r31 r3 @cm0 // on incrémente si besoin est les dizaines ajump0 r0 r0 r30 // retour // fin cm60 // compteur modulo 24 // r2 : addresse des unités // r2 + 1 : adresse des dizaines // r30 : adresse de retour // au retour : // r3 : nouvelle valeur des dizaines // modifie r2, r1, r4 @cm24 read r1 r2 1 // on lit les dizaines sub r1 r1 2 // si c'est 2 il faut incrémenter les unités mod 4 jump0 r0 r1 @cm24_mod4 add r1 r0 10 // sinon modulo 10 jump0 r0 r0 @cm24_unit @cm24_mod4 add r1 r0 4 @cm24_unit jump0 r31 r0 @cm0 add r2 r2 1 // adr des dizaines add r1 r0 3 // dizaines modulo 3 jump0 r31 r3 @cm0 // incr dizaines si necessaire ajump0 r0 r0 r30 //retour // fin cm24 // décodeur 7 segments // r1 : chiffre à afficher // r2 : adresse où écrire l'entier codant l'affichage // r31 adresse de retoure de sous programme // utilise r3 et r4 // !!! modifie r1 // le bit de n°7 sert à signaler qu'il faut rafraichir l'affichage @seg7 sub r4 r1 10 // r4 = -1 si r1 < 10 and r4 r4 1000000000000000b jump0 r0 r4 @seg7_err add r4 r0 %seg7_zero @seg7_find ajump0 r0 r1 r4 add r4 r4 4 sub r1 r1 1 jump0 r0 r0 @seg7_find @seg7_err add r3 r0 11001111b // E jump0 r0 r0 @seg7_write @seg7_zero add r3 r0 11111101b // 0 jump0 r0 r0 @seg7_write add r3 r0 10110000b // 1 jump0 r0 r0 @seg7_write add r3 r0 11101110b // 2 jump0 r0 r0 @seg7_write add r3 r0 11111010b // 3 jump0 r0 r0 @seg7_write add r3 r0 10110011b // 4 jump0 r0 r0 @seg7_write add r3 r0 11011011b // 5 jump0 r0 r0 @seg7_write add r3 r0 11011111b // 6 jump0 r0 r0 @seg7_write add r3 r0 11110000b // 7 jump0 r0 r0 @seg7_write add r3 r0 11111111b // 8 jump0 r0 r0 @seg7_write add r3 r0 11111011b // 9 @seg7_write write r3 r0 r2 // écriture ajump0 r0 r0 r31 // retour