From 176cc04414d44b9eebdc9627c99f9b6e5e92ba98 Mon Sep 17 00:00:00 2001 From: Alex AUVOLAT Date: Tue, 7 Jan 2014 15:51:01 +0100 Subject: Document ; add hlt instruction ; make monitor faster. --- cpu/cpu.ml | 6 +++ monitor/mon.c | 16 +++++++- plan_micro.pdf | Bin 76886 -> 79404 bytes plan_micro.tm | 127 +++++++++++++++++++++++++-------------------------------- 4 files changed, 75 insertions(+), 74 deletions(-) diff --git a/cpu/cpu.ml b/cpu/cpu.ml index 94cc47c..b7e394b 100644 --- a/cpu/cpu.ml +++ b/cpu/cpu.ml @@ -203,6 +203,12 @@ let rl, rh, i, ex, exf, pc = let wr = mux instr_lra wr (const "101") in let rwd = mux instr_lra rwd (nadder 16 pc (sign_extend 11 16 i_jd)) in + (* instruction : hlt *) + let instr_hlt = exec ^& eq_c 5 i_i 0b01111 in + let halted, set_halted = loop 1 in + let halted = set_halted (instr_hlt ^| (reg 1 halted)) in + let exec_finished = mux halted exec_finished (const "0") in + (* instruction : lw/lwr/sw/swr *) let instr_lsw = eq_c 4 (i_i % (1, 4)) 0b1000 in let instr_lswr = eq_c 4 (i_i % (1, 4)) 0b1010 in diff --git a/monitor/mon.c b/monitor/mon.c index 19259a1..19055c7 100644 --- a/monitor/mon.c +++ b/monitor/mon.c @@ -80,6 +80,8 @@ void mon_loop(t_mon *mon) { time_t prev_time = time(NULL); int steps = 0; + int displayer_steps = 0; + while (mon->status != MS_FINISH) { handle_kbd(mon); if (mon->status == MS_AUTO) { @@ -92,6 +94,11 @@ void mon_loop(t_mon *mon) { steps = 0; prev_time = time(NULL); } + displayer_steps++; + if (displayer_steps >= mon->actual_freq / 100) { + disp_display(mon); + displayer_steps = 0; + } } else if (mon->status == MS_FREQ) { if (prev_time != time(NULL)) { mon->actual_freq = steps; @@ -111,6 +118,11 @@ void mon_loop(t_mon *mon) { } mon_step(mon); steps++; + displayer_steps++; + if (displayer_steps >= mon->actual_freq / 100) { + disp_display(mon); + displayer_steps = 0; + } int sleep = 1000000 / mon->target_freq - mon->calc_time_usec; if (sleep > 0) usleep(sleep); } else { @@ -122,6 +134,7 @@ void mon_loop(t_mon *mon) { void mon_handle_command(t_mon *mon, const char *c) { if (c[0] == 0) { // empty command : run step mon_step(mon); + disp_display(mon); } else if (!strcmp(c, "q")) { mon->status = MS_FINISH; } else if (!strcmp(c, "a")) { @@ -134,6 +147,7 @@ void mon_handle_command(t_mon *mon, const char *c) { while (isspace(*p)) p++; while (isdigit(*p)) mon->target_freq = 10 * mon->target_freq + (*(p++) - '0'); if (mon->target_freq == 0) mon->target_freq = 1000; + mon->actual_freq = mon->target_freq; mon->calc_time_usec = 1000; mon->status = MS_FREQ; } else if (c[0] == 'i') { @@ -270,7 +284,5 @@ void mon_step(t_mon *mon) { mon->ser_out_buf = mon->outputs[mon->ser_out].v_int; } - // Display mon->step++; - disp_display(mon); } diff --git a/plan_micro.pdf b/plan_micro.pdf index 14bf881..f1caa0f 100644 Binary files a/plan_micro.pdf and b/plan_micro.pdf differ diff --git a/plan_micro.tm b/plan_micro.tm index acfe710..4ef4bda 100644 --- a/plan_micro.tm +++ b/plan_micro.tm @@ -3,14 +3,16 @@ <\body> - > + ||>>> Nous proposons ici une spécification pour un processeur minimaliste 16 bit RISC. - La machine dispose de 8 registres \S généraux \T : + La machine dispose de 8 registres \S généraux \T, tous de taille 16 bits : \; @@ -36,64 +38,48 @@ par les instructions et - De plus, le processeur dispose d'un registre non manipulable, le registre - (program counter). + Ces 8 registres sont tous manipulables par les instructions prenant un + registre comme argument. De plus, le processeur dispose d'un registre + manipulable uniquement par certaines instructions spécifiques, le registre + (program counter : contient l'adresse de l'instruction + courante). Les numéros de registres sont donc codés sur 3 bits. - La mémoire est adressée sur 16 bits, il y a donc 64ko disponnibles. + La mémoire est adressée sur 16 bits et les mots mémoire font 8 bits, il y a + donc 64ko disponnibles. Le CPU est little-endian (le mot 0x1234 est codé 34 puis 12) - - On définit plusieurs zones de mémoire : |>||>||>>>>|Memory map> - - - - - - On définit plusieurs zones de mémoire : + quelques octets sont utilisés)>>||>>>>|Memory map> - |>||>||>||>||>>>>|Memory map> - - Les 0x3000 (12288) octets de mémoire pour le VGA correspondent à un - affichage bitmapé 336x288 noir et blanc (un octet représente 8 pixels), ce - qui fait avec une police d'écriture 8x8 un affichage texte possible en - 42x36. - - Les 0x0800 (2048) octets de RAM pour la fonte suffisent à définir 256 - caractères en résolution 8x8 (donc 8 octets par caractère). + Les bits suivants sont utilisés pour la MMIO : - Sur les 0x8000 octets alloués pour la MMIO, on en aura un pour l'entrée - série, un pour la sortie série, un pour l'horloge et c'est tout. - - Le reste est auto-explicite. + >>>>|>||>||>>>>|Addresses MMIO> Les instructions sont codées sur 16 bits. Les tableaux suivants montrent - les instructions avec les poids forts à gauche et les poids faibles à - droite. + les instructions avec les bits de poids forts à gauche et les bits de poids + faibles à droite (convention contraire à celle exprimée dans le + ). ||||||>|>|>|>>>>>> + bits>||>|>|>|>>>|||>>>> >|||||||||\R> then R>>|>|||||PC+d>>| - signé>>||||>||>||||>||>||||>||>|||||mem+d|)>> + signé>>||||>||>||||>||>||||||>|||||mem+d|)>> (16 bits)>|>|||||+d|)>\R> (16 bits)>|>|||||\mem+d|)> ; R\0> (8 bits)>|>|||||+d|)>\R> @@ -154,6 +141,9 @@ ; R\0>>|>||||>||>||||>||>||||>||>||||>|>>|>>>>|Instructions reconnues par le microproceseur> + L'assembleur propose également quelques instructions \S étendues \T + permettant de faciliter la programmation : + |>|>|>>|>|G-2 ;mem\R @@ -183,36 +173,37 @@ <\references> <\collection> > - > - > - > - > - > - > + > + > + > + > + > + > > + > > - > - > - > - > - > - > - > + > + > + > + > + > + > + > <\auxiliary> <\collection> <\associate|table> - > + > - > + > > + microproceseur|> > + l'assembleur)|> <\associate|toc> |math-font-series||Registres> @@ -223,45 +214,37 @@ |.>>>>|> - |Modèle simple - |.>>>>|> - > - - |Modèle avec affichage bitmapé - |.>>>>|> - > - |math-font-series||Jeu d'instruction> |.>>>>|> - + |Types d'instructions |.>>>>|> - > + > |Format de base |.>>>>|> - > + > |Format |R> |.>>>>|> - > + > |Format |I> |.>>>>|> - > + > |Format K |.>>>>|> - > + > |Format |J> |.>>>>|> - > + > |math-font-series||Tableau d'instructions> |.>>>>|> - + \ No newline at end of file -- cgit v1.2.3