// File: /workspace/github_c_makefile_star2_O0/carlitosmarin[P]Sistema-Ficheros-SOII/./src/ficheros_basico.c
// Function: reservar_bloque
int reservar_bloque () { 
	struct superbloque sb; 
	if(bread(posSB,&sb) < 0) return -1; //Error BREADS
	if(sb.cantBloquesLibres <= 0) return -2; //Error NO_BLOQUES_LIBRES
	unsigned char bufferAux[tamBloque];
	memset(bufferAux,255,tamBloque);
	unsigned char mapaBits[tamBloque];
	int nMB = sb.posPrimerBloqueMB;
	
	if(bread(nMB, mapaBits) < 0) return -3; //Error BREADMB
	
	while(memcmp(bufferAux,mapaBits,tamBloque) == 0){   					
		nMB++;
		if(bread(nMB, mapaBits) < 0) return -3; //Error BREADMB    
	}
	
	unsigned char byte = 255;
	unsigned char mascara = 128;
	int posbyte = 0, posbit = 0, fin = 0;
	while(posbyte < tamBloque && !fin){ 
		byte = mapaBits[posbyte];
		if (byte < 255) { // hay bits a 0 en el byte
			while (byte & mascara) { // operador AND para bits
				byte <<= 1;	// desplazamiento de bits a la izquierda
				posbit++;
			}
            fin = 1;
		} else posbyte++; // si el byte no contiene 0s vamos al siguiente
	}
	int numbloque = ((nMB-sb.posPrimerBloqueMB)*tamBloque+posbyte)*8+posbit;
	if(escribir_bit(numbloque, 1) < 0) return -4; //Error ESCRIBIR_BIT
	sb.cantBloquesLibres--;
	if (bwrite(posSB, &sb) < 0) return -5; //Error BWRITE
		
	return numbloque; 
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc30, %rsp            # imm = 0xC30
xorl %edi, %edi
leaq -0x404(%rbp), %rsi
callq 0x1380
cmpl $0x0, %eax
jge 0x1bba
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x1db4
cmpl $0x0, -0x3e4(%rbp)
ja 0x1bcf
movl $0xfffffffe, -0x4(%rbp) # imm = 0xFFFFFFFE
jmp 0x1db4
leaq -0x810(%rbp), %rdi
movl $0xff, %esi
movl $0x400, %edx            # imm = 0x400
callq 0x10b0
movl -0x404(%rbp), %eax
movl %eax, -0xc14(%rbp)
movl -0xc14(%rbp), %edi
leaq -0xc10(%rbp), %rsi
callq 0x1380
cmpl $0x0, %eax
jge 0x1c14
movl $0xfffffffd, -0x4(%rbp) # imm = 0xFFFFFFFD
jmp 0x1db4
jmp 0x1c16
leaq -0x810(%rbp), %rdi
leaq -0xc10(%rbp), %rsi
movl $0x400, %edx            # imm = 0x400
callq 0x10f0
cmpl $0x0, %eax
jne 0x1c67
movl -0xc14(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc14(%rbp)
movl -0xc14(%rbp), %edi
leaq -0xc10(%rbp), %rsi
callq 0x1380
cmpl $0x0, %eax
jge 0x1c65
movl $0xfffffffd, -0x4(%rbp) # imm = 0xFFFFFFFD
jmp 0x1db4
jmp 0x1c16
movb $-0x1, -0xc15(%rbp)
movb $-0x80, -0xc16(%rbp)
movl $0x0, -0xc1c(%rbp)
movl $0x0, -0xc20(%rbp)
movl $0x0, -0xc24(%rbp)
xorl %eax, %eax
cmpl $0x400, -0xc1c(%rbp)    # imm = 0x400
movb %al, -0xc29(%rbp)
jge 0x1cb9
cmpl $0x0, -0xc24(%rbp)
setne %al
xorb $-0x1, %al
movb %al, -0xc29(%rbp)
movb -0xc29(%rbp), %al
testb $0x1, %al
jne 0x1cc5
jmp 0x1d3e
movslq -0xc1c(%rbp), %rax
movb -0xc10(%rbp,%rax), %al
movb %al, -0xc15(%rbp)
movzbl -0xc15(%rbp), %eax
cmpl $0xff, %eax
jge 0x1d2a
jmp 0x1ce9
movzbl -0xc15(%rbp), %eax
movzbl -0xc16(%rbp), %ecx
andl %ecx, %eax
cmpl $0x0, %eax
je 0x1d1e
movzbl -0xc15(%rbp), %eax
shll %eax
movb %al, -0xc15(%rbp)
movl -0xc20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc20(%rbp)
jmp 0x1ce9
movl $0x1, -0xc24(%rbp)
jmp 0x1d39
movl -0xc1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc1c(%rbp)
jmp 0x1c93
movl -0xc14(%rbp), %eax
subl -0x404(%rbp), %eax
shll $0xa, %eax
addl -0xc1c(%rbp), %eax
shll $0x3, %eax
addl -0xc20(%rbp), %eax
movl %eax, -0xc28(%rbp)
movl -0xc28(%rbp), %edi
movl $0x1, %esi
callq 0x16c0
cmpl $0x0, %eax
jge 0x1d80
movl $0xfffffffc, -0x4(%rbp) # imm = 0xFFFFFFFC
jmp 0x1db4
movl -0x3e4(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x3e4(%rbp)
xorl %edi, %edi
leaq -0x404(%rbp), %rsi
callq 0x1320
cmpl $0x0, %eax
jge 0x1dab
movl $0xfffffffb, -0x4(%rbp) # imm = 0xFFFFFFFB
jmp 0x1db4
movl -0xc28(%rbp), %eax
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0xc30, %rsp            # imm = 0xC30
popq %rbp
retq