; Semaine 7 ; Programme qui lit une chaîne de caractère (et l'affiche deux fois) ; Jean Privat (c) 2010 LDA buffer,i LDX size,i CALL STRI ; STRI(buffer,size); STRO buffer,d CHARO '\n',i STRO buffer,d ; print(buffer + '\n' + buffer); STOP ; exit(); buffer: .BLOCK 20 ; Buffer for the string size: .EQUATE 20 ; Size of the buffer ; ; STRI: lit une ligne dans un tampon et place '\x00' à la fin ; In: A=Adresse du tampon ; X=Taille du tampon en octet ; Out: A=Adresse du tampon (inchangé) ; X=Nombre de caractères lu (ou offset du '\x00') ; Err: Avorte si le tampon n'est pas assez grand pour ; stocker la ligne et le '\0' final STRI: STA striPtr,d ; sauve A; ADDX striPtr,d STX striPtr2,d ; striPtr2 = A+X; LDX striPtr,d ; X = striPtr; striLoop:CPX striPtr2,d ; while(true) { BRGE striErr ; if(X>=striPtr2) throws new Error(); CHARI 0,x ; *X = getChar(); LDA 0,i LDBYTEA 0,x CPA '\n',i BREQ striFin CPA '\x00',i BREQ striFin ; if(*X=='\n' || *X=='\x00') break; ADDX 1,i ; X++; BR striLoop ; } // fin boucle infinie striFin: LDBYTEA 0,i STBYTEA 0,x ; *X='\x00'; SUBX striPtr,d ; X = X-striPtr LDBYTEA striPtr,d ; restaure A; RET0 ; return; striErr: STRO striEMsg,d STOP striEMsg:.ASCII "STRI erreur: débordement de capacité\n\x00" striPtr: .BLOCK 2 ; #2d adresse de début du tampon striPtr2:.BLOCK 2 ; #2d adresse de fin de tampon (à ne pas écrire) .END