2010-06-13 7 views
1

Je possède ce code sur pdp-11de pdp-11 (simulateur)

tks = 177560 
tkb = 177562 
tps = 177564 
tpb = 177566 
lcs = 177546 
. = torg + 2000 

main: mov #main, sp 
     mov #kb_int, @#60 
     mov #200, @#62 
     mov #101, @#tks 
     mov #clock, @#100 
     mov #300, @#102 
     mov #100, @#lcs 

loop: mov @#tks,r2 
     aslb r2 
     bmi loop 
     halt 

clock: tst bufferg 
     beq clk_end 
     mov #msg,-(sp) 
     jsr pc, print_str 
     tst (sp)+ 
     clr bufferg 
     biC#100,@#tks 
     clr @#lcs 
clk_end:rti 

kb_int: mov r1,-(sp) 
     jsr pc, read_char 
     movb r1,@buff_ptr 
     inc buff_ptr 
     bis #1,@#tks 
     cmpb r1,#'q 
     bne next_if 
     mov #0, @#tks 
next_if:cmpb r1,#32. 
     bne end_kb_int 
     clrb @buff_ptr 
     mov #buffer,-(sp) 
     jsr pc, print_str 
     tst (sp)+ 
     mov #buffer,buff_ptr 
end_kb_int: 
     mov (sp)+,r1 
rti 


;############################# 
read_char: 
     tstb @#tks 
     bpl read_char 
     movb @#tkb, r1 
     rts pc 
;############################# 
print_char: 
     tstb @#tps 
     bpl print_char 
     movb r1, @#tpb 
     rts pc 
;############################# 
print_str: 
     mov r1,-(sp) 
     mov r2,-(sp) 
     mov 6(sp),r2 
str_loop: 
     movb (r2)+,r1 
     beq pr_str_end 
     jsr pc, print_char 
     br str_loop 
pr_str_end: 
     mov (sp)+,r2 
     mov (sp)+,r1 
     rts pc 

. = torg + 3000 
msg:.ascii<Something is wrong!> 
    .byte 0 
    .even 
buff_ptr: .word buffer 
buffer: .blkw 3 
bufferg: .word 0 

quelqu'un peut expliquer s'il vous plaît quelle partie du code peut changer bufferg (dernière ligne)? grâce à l'avance

+0

Avez-vous une question précise? –

+0

oui, j'ai changé la dernière partie de ma question – lego69

Répondre

1

I trouvé dans ce programme de trois blocs fonctionnels de base:

  1. lecture de caractères à partir du clavier dans la mémoire tampon (kb_int:, read_char:, etc.)
  2. impression de caractère (print_char:, print_str:)
  3. suivi de correction des opérations de lecture/écriture ci-dessus (clock:).

Je suppose que bufferg est mot de garde car il suit le segment où les données sont lues à partir du clavier (bufferg c'est un mot après 3 mots de tampon - les deux dernières lignes). Donc, si quelque chose ne va pas (trop de caractères d'entrée ou impression trop lente) le bufferg devient rempli avec une valeur non nulle. Ceci est pris dans l'horloge: (qui est apparemment un gestionnaire d'interruption de minuterie) - tst bufferg tests pour la valeur zéro et si ce n'est pas égal à zéro (c'est la valeur par défaut) le message (msg :) "Quelque chose ne va pas!" est imprimé et bufferg est remis à zéro clr bufferg. Donc, la réponse courte à la question sera: bufferg peut être changé en movb r1,@buff_ptr ou en clr bufferg.