2 ; Programme qui lit une chaîne de caractère (et l'affiche deux fois)
7 BRGE afficher ; for(il=0;il<nblines;il++) {
10 CALL STRI ; X = STRI(cursor,size);
12 BREQ afficher ; if (X==0) break;
14 STX used,d ; used = X + 1;
16 STX cursor,d ; cursor += used;
19 STX size,d ; size -= used;
22 STA lines,x ; lines[il*2] = A; // old cursor
26 BR in_loop ; } // fin for il
30 aff_loop: BRLT fin ; for(X=(il-1)*2; X<=0; X-=2) {
34 CHARO '\n',i ; print(lines[X] + "\n");
36 BR aff_loop ; } // fin for
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
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'
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;
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();
69 BREQ striFin ; if(*X=='\n' || *X=='\x00') break;
71 BR striLoop ; } // fin boucle infinie
73 STBYTEA 0,x ; *X='\x00';
74 SUBX striPtr,d ; X = X-striPtr
75 LDA striPtr,d ; restaure A;
77 striErr: STRO striEMsg,d
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)