ejercicio1

3
LIST P=16F877A #INCLUDE<P16F877A.INC> ORG 0X0000 goto inicio ORG 0X0005 inicio BCF STATUS,RP0 ;ubicación bank0 del registro 0x30h BCF STATUS,RP1 MOVLW .133 ;chequeo primer caso XORWF 0x30,0 ;comparación del contenido en 0x30h con lo que tiene w BTFSS STATUS,Z ;z=1? GOTO comparacion ;no z=0 ir a comparación con el siguiente codigo GOTO resta ;sí son iguales ir a resta comparacion BCF STATUS,RP0 ;bank0 del registro 0x30h BCF STATUS,RP1 MOVLW .65 ;chequeo segundo caso XORWF 0x30,0 ;comparación del contenido en 0x30h con lo que tiene w BTFSC STATUS,Z ;z=0? GOTO suma ;no z=1 son iguales ir a suma GOTO inicio ;sí son diferentes entonces me devuelvo suma BSF 0x0A,3 ;memoria room 08FA pagina1 BCF 0x0A,4 ;bits 3 y 4 del pclath GOTO suma_indirecta resta BSF 0x0A,3 ;memoria room 18AAh página3 BSF 0x0A,4 ;bits 3 y 4 del pclath GOTO resta_directa ORG 0x18AA resta_directa BSF STATUS,RP0 ;ubicacion bank1 BCF STATUS,RP1 MOVF 0xA1,0 ;contenido de num1l BSF STATUS,RP1 BCF STATUS,RP0 ;ubicacion bank2 SUBWF 0x121,0 ;num2l-num1l resto parte 1 de 16 bits f-w BCF STATUS,RP0 BCF STATUS,RP1 ;ubicacion bank0 para resultadol MOVWF 0x22 ;sí guardar contenido de w en resultado_bajo BSF STATUS,RP0 BCF STATUS,RP1 ;ubicacion bank1 MOVF 0xA0,0 ;contenido de num1h BTFSS STATUS,C ;c=1? ADDLW .1 ;no.resta(-) sumo 1 para seguir la resta BSF STATUS,RP1 ;si.resta(+) BCF STATUS,RP0 ;ubicacion bank2 SUBWF 0x120,0 ;num2h-num1h resto parte 2 de 16 bits f-w BCF STATUS,RP0 BCF STATUS,RP1 ;ubicacion bank0 para resultadol MOVWF 0x23 ;si guardar contenido de w en resultado_alto BTFSS STATUS,C ;c=1?

Transcript of ejercicio1

LIST P=16F877A#INCLUDE<P16F877A.INC>

ORG 0X0000goto inicioORG 0X0005inicio BCF STATUS,RP0 ;ubicación bank0 del registro 0x30h BCF STATUS,RP1 MOVLW .133 ;chequeo primer caso XORWF 0x30,0 ;comparación del contenido en 0x30h con lo que tiene w BTFSS STATUS,Z ;z=1? GOTO comparacion ;no z=0 ir a comparación con el siguiente codigo GOTO resta ;sí son iguales ir a resta

comparacion BCF STATUS,RP0 ;bank0 del registro 0x30h BCF STATUS,RP1 MOVLW .65 ;chequeo segundo caso XORWF 0x30,0 ;comparación del contenido en 0x30h con lo que tiene w BTFSC STATUS,Z ;z=0? GOTO suma ;no z=1 son iguales ir a suma GOTO inicio ;sí son diferentes entonces me devuelvo

suma BSF 0x0A,3 ;memoria room 08FA pagina1 BCF 0x0A,4 ;bits 3 y 4 del pclath GOTO suma_indirecta

resta BSF 0x0A,3 ;memoria room 18AAh página3 BSF 0x0A,4 ;bits 3 y 4 del pclath GOTO resta_directa ORG 0x18AAresta_directa BSF STATUS,RP0 ;ubicacion bank1 BCF STATUS,RP1 MOVF 0xA1,0 ;contenido de num1l BSF STATUS,RP1 BCF STATUS,RP0 ;ubicacion bank2 SUBWF 0x121,0 ;num2l-num1l resto parte 1 de 16 bits f-w BCF STATUS,RP0 BCF STATUS,RP1 ;ubicacion bank0 para resultadol MOVWF 0x22 ;sí guardar contenido de w en resultado_bajo BSF STATUS,RP0 BCF STATUS,RP1 ;ubicacion bank1 MOVF 0xA0,0 ;contenido de num1h BTFSS STATUS,C ;c=1? ADDLW .1 ;no.resta(-) sumo 1 para seguir la resta BSF STATUS,RP1 ;si.resta(+) BCF STATUS,RP0 ;ubicacion bank2 SUBWF 0x120,0 ;num2h-num1h resto parte 2 de 16 bits f-w BCF STATUS,RP0 BCF STATUS,RP1 ;ubicacion bank0 para resultadol MOVWF 0x23 ;si guardar contenido de w en resultado_alto BTFSS STATUS,C ;c=1?

GOTO negativo ;no.c=0 resta(-),ir a complementar a 2 para ver su verdadero valorpositivo

CLRF PCLATH ;si.resultado total (+), limpio pclath GOTO inicio ;salir

negativo BCF STATUS,RP0 ;complemento a 1 el resultado y le sumo 1= complem

ento a 2 BCF STATUS,RP1 COMF 0X22,F ;complemento a 1 INCF 0X22,F ;sumo 1 MOVF 0X23,W ;coloco el resultado BTFSS STATUS,C ;c=1? ADDLW .1 MOVWF 0X23 ;si.coloco el valor arrojado CLRF PCLATH ;limpio el pclath y vuelvo al inicio

goto inicio

ORG 0x08FAsuma_indirecta

MOVLW 0XA1 ;dir relativa a colocar en el FSR BCF STATUS,IRP ;irp=0 indirectamente en el bank0 y 1 MOVWF FSR ;puntero esta ubicado en la dir correspondiente MOVF INDF,W ;muevo su contenido a w BCF FSR,7 ;cambio el bit 7 del fsr aprovechando la dir relat

iva de 0xA1 BSF STATUS,IRP ;irp=1 indirectamente en el bank2 y 3 ADDWF INDF,W ;sumo la num2l+num1l BCF STATUS,IRP ;irp=0 indirectamente en el bank0 y 1 BSF FSR,1 ; BCF FSR,0 ;ubico la direccion relativa de 0x22 para deposita

r resultadol MOVWF INDF ;indf contiene el resultado de resultado_bajo

BTFSC STATUS,C ;c=0? CALL aca ;no. c=1 es decir, llevo 1 hay acarreo MOVLW 0XA0 ;si c=0 MOVWF FSR ;el fsr esta apuntando a la dir 0xA0, donde esta n

um1h MOVF INDF,W BCF FSR,7 ;aprovecho la dir relativa de 0xA0, modifico el bi

t 7 del FSR para ubicarme en la dir 0x120h BSF STATUS,IRP ;colocando el irp=1 indirectamente estoy en el ban

co2 y 3 ADDWF INDF,W ;sumo los valores de num2h+num1h BCF STATUS,IRP ;irp=0 indirectamente pase a los bancos 0 y 1 BSF FSR,1 ;aprovecho la direccion relatica que llevaba para

ubicarme en 0x23h BSF FSR,0

MOVWF INDF ;indf contiene el resultado de resultado_alto CLRF PCLATH ;limpio el pclath, regreso a inicio GOTO inicio

aca MOVLW 0XA0 ;aca sumo el acarreo que llevaba al num1h MOVWF FSR ;el fsr apunta a la dir.relativa 0xA0 INCF INDF,F ;incrementa el contenido de esta direccion a trave

s del indf RETURN ;retorna el valor para seguir sumando la parte alt

a

fin GOTO $ ;finaliza el programa

end