#include    <xc.h>

            .global    printableCount
            .text
            .set       noreorder
            .align     2             # Align on 4-byte boundary
            .ent       printableCount
printableCount:
#   int printableCount(char S[], int n) ; 
#   $a0: char *S
#   $a1: int   n

    # int i ;
    # int count = 0 ;
    # for (i=0; i<size; ++i) {
    #     if ((V[i] >= ' ') && (V[i] <= '~') {
    #         ++count ;
    #     }
    # }
    # return count ;

    
    ### implemented as

    # char *a0 = S ;
    # int a1 = n
    # int v0 = 0 ;
    # while(a1 > 0) {
    #   if (' ' <= *a0 && *a0 <= '~') {
    #      v0 = v0 + 1 ;
    #   }
    #   a1 = a1 - 1 ;
    #   a0 = a0 + 1 ;
    # }
    # return v0 ;

    addi    $v0,$zero,0
    blez    $a1,returnNow
    j	    loopTest
    nop
loopStart:
    lbu     $t2,0($a0)
    addi    $t3,$t2,-31
    blez    $t3,skipIncr
    addi    $t4,$t2,-126
    bgtz    $t4,skipIncr
    nop
    addi    $v0,$v0,1
skipIncr:
    addi    $a1,$a1,-1
    addi    $a0,$a0,1
loopTest:
    bgtz    $a1,loopStart
    nop

#   $v0: return value, an int32_t
returnNow:
            jr      $ra
            nop
            .end    printableCount
            .size   printableCount,.-printableCount


