Merge: doc: fixed some typos and other misc. corrections
[nit.git] / contrib / pep8analysis / tests / privat / 07-stris.pep
1 ; Semaine 7
2 ; Programme qui lit une chaîne de caractère (et l'affiche deux fois)
3 ; Jean Privat (c) 2010
4          LDX     0,i
5          STX     il,d
6 in_loop:         CPX     nblines,i 
7          BRGE    afficher ; for(il=0;il<nblines;il++) {
8          LDA     cursor,d    
9          LDX     size,d      
10          CALL    STRI        ;   X = STRI(cursor,size);
11          CPX     0,i
12          BREQ    afficher    ;   if (X==0) break;
13          ADDX    1,i
14          STX     used,d      ;   used = X + 1; 
15          ADDX    cursor,d
16          STX     cursor,d    ;   cursor += used;
17          LDX     size,d
18          SUBX    used,d
19          STX     size,d      ;   size -= used;
20          LDX     il,d
21          ASLX
22          STA     lines,x     ;   lines[il*2] = A; // old cursor
23          ASRX
24          ADDX    1,i
25          STX     il,d        
26          BR in_loop          ; } // fin for il
27 afficher: LDX    il,d
28          SUBX 1,i
29          ASLX
30 aff_loop:         BRLT fin ; for(X=(il-1)*2; X<=0; X-=2) {
31          LDA lines,x
32          STA cursor,d
33          STRO cursor,n   
34          CHARO '\n',i ;   print(lines[X] + "\n");
35          SUBX 2,i 
36          BR aff_loop ; } // fin for 
37 fin: STOP ; exit();
38
39          STOP                ; exit();
40 ;
41 buffer:  .BLOCK  200         ; Tampon pour les chaînes
42 cursor:  .ADDRSS buffer      ; Pointeur vers la partie libre du tampon
43 size:    .WORD   200         ; Nombre d'octets libres dans le tampon
44 used:    .BLOCK  2           ; Nombre d'octets utilisés par la dernière lecture
45 ;
46 lines:   .BLOCK  20          ; Tableau de lignes
47 nblines: .EQUATE 20          ; Nombre maximum de lignes
48 il:      .BLOCK  2           ; #2d Index de boucle pour parcourir 'lines'
49 ;
50 ; STRI: lit une ligne dans un tampon et place '\x00' à la fin
51 ; In:  A=Adresse du tampon
52 ;      X=Taille du tampon en octet
53 ; Out: A=Adresse du tampon (inchangé)
54 ;      X=Nombre de caractères lu (ou offset du '\x00')
55 ; Err: Avorte si le tampon n'est pas assez grand pour
56 ;      stocker la ligne et le '\0' final
57 STRI:    STA     striPtr,d   ; sauve A;
58          ADDX    striPtr,d   
59          STX     striPtr2,d  ; striPtr2 = A+X;
60          LDX     striPtr,d   ; X = striPtr;
61 striLoop:CPX     striPtr2,d  ; while(true) {
62          BRGE    striErr     ;   if(X>=striPtr2) throws new Error();
63          CHARI   0,x         ;   *X = getChar();
64          LDA     0,i         
65          LDBYTEA 0,x         
66          CPA     '\n',i      
67          BREQ    striFin     
68          CPA     '\x00',i    
69          BREQ    striFin     ;   if(*X=='\n' || *X=='\x00') break;
70          ADDX    1,i         ;   X++;
71          BR      striLoop    ; } // fin boucle infinie
72 striFin: LDBYTEA 0,i         
73          STBYTEA 0,x         ; *X='\x00';
74          SUBX    striPtr,d   ; X = X-striPtr
75          LDA     striPtr,d   ; restaure A;
76          RET0                ; return;
77 striErr: STRO    striEMsg,d  
78          STOP                
79 striEMsg:.ASCII  "STRI erreur: débordement de capacité\n\x00"
80 striPtr: .BLOCK  2           ; #2d adresse de début du tampon
81 striPtr2:.BLOCK  2           ; #2d adresse de fin de tampon (à ne pas écrire)
82          .END