Vistas de página en total

martes, 28 de enero de 2014

EMULADOR 8051 (5/12) (DESENSAMBLADOR SOBRE BUFFER)

    Como deseamos tener una copia del programa en papel para analizarlo con tranquilidad, debemos tener la posibilidad de imprimir el programa desensamblado, o almacenarlo en un fichero.

    Esta es, pues, la versión de listado de programa sobre buffer. Básicamente es la misma que la de impresión de pantalla, con la salvedad de que aquí no se limitará a un número concreto de instrucciones, sino que realizará el programa completo. Pero ese control lo llevará el programa padre. Este versión de la instrucción se limita a cambiar la salida de impresión de la pantalla a un buffer de impresión llamado bufferprn, sobre el que se generará el listado y que posteriormente será lanzado sobre la impresora o a un fichero.

PRN_INST.ASM


; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/



include main.mac
include stdio.mac
include io.mac
include string.mac

.model compact,pascal

             public prn_inst
.data
extrn bufferprn:byte
dato dw 0,0
registro db "P0.",5 DUP (0)
         db "TCON.",3 DUP (0)
         db "P1.",5 DUP (0)
         db "SCON.",3 DUP (0)
         db "P2.",5 DUP (0)
         db "IE.",5 DUP (0)
         db "P3.",5 DUP (0)
         db "IP.",5 DUP (0)
         db "PSW.",4 DUP (0)
         db "ACC.",4 DUP (0)
         db "B.",6 DUP (0)
hprn dw 0
numero db 10 dup (0)
nlinea db 13,10,0
mas db "+",0
menos db  "-",0

code
        
       
        extrn interpreta:near
        extrn lee:near
prn_inst proc near  uses dx cx bx
        
        call interpreta
        mov bx,ax
        mov al,[bx]
        cmp al,0                        ;solo codigo instrucc. de 1 byte
        jnz decod1
        strcat bufferprn,bufferprn,[bx+3]
        jmp linea
decod1:
        cmp al,1                 ;1 codigo inst , 1 byte de dato
        jnz decod2
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea
decod2:
        cmp al,2                ;1codico + 2 byte
        jnz decod3
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        mov ch,al
        call lee
        inc dx
        mov cl,al
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea

decod3:
        cmp al,3                ;1 codigo + 1 byte + codigo
        jnz decod4
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        inc bx
        inc bx
busca1:
        inc bx
        cmp byte ptr [bx],0
        jnz busca1
        strcat bufferprn,bufferprn,[bx+1]
        jmp linea

decod4:                         ;1 codigo + 2 byte + codigo
        cmp al,4
        jnz decod5
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        mov cl,al
        call lee
        inc dx
        mov ch,al
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        inc bx
        inc bx
busca2:
        inc bx
        cmp byte ptr [bx],0
        jnz busca2
        strcat bufferprn,bufferprn,[bx+1]
        jmp linea
decod5:
        cmp al,5                ;1 codigo + 1 byte relativo + codigo + byte
        jz escod5
        jmp DECOD6
escod5:
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        cmp cl,0
        jz busc3
        test cx,80h
        jz positivo1
        strcat bufferprn,bufferprn,menos
        not cl
        inc cx
        jmp short negativo1
positivo1:
        strcat bufferprn,bufferprn,mas
negativo1:
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
busc3:
        inc bx
        inc bx
busca3:
        inc bx
        cmp byte ptr [bx],0
        jnz busca3
        strcat bufferprn,bufferprn,[bx+1]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea

decod6:
        cmp al,6                        ;SALTO RELATIVO
        jnz decod7
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        cbw
        add ax,dx
        mov cx,ax
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea

decod7:
        cmp al,7                ;1 codigo + 1 byte relativo + codigo
        jz ss1
        jmp caso8
ss1:
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        cmp cl,0
        jz busc7
        test cx,80h
        jz positivo
        strcat bufferprn,bufferprn,menos
        not cl
        inc cx
        jmp short negativo
positivo:
        strcat bufferprn,bufferprn,mas
negativo:
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
busc7:
        inc bx
        inc bx
busca7:
        inc bx
        cmp byte ptr [bx],0
        jnz busca7
        strcat bufferprn,bufferprn,[bx+1]
        jmp linea

caso8:
        cmp al,8
        jz ss2
        jmp caso9
ss2:
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        inc bx
        inc bx
busca8:
        inc bx
        cmp byte ptr [bx],0
        jnz busca8
        strcat bufferprn,bufferprn,[bx+1]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea
caso9:
        cmp al,9                ;texto + direc 8 bits + texto + dato 8 bits rel
        jnz alcaso9
        jmp caso10
alcaso9:
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        inc bx
        inc bx
busca9:
        inc bx
        cmp byte ptr [bx],0
        jnz busca9
        strcat bufferprn,bufferprn,[bx+1]
        call lee
        inc dx
        cbw
        add ax,dx
        mov dato,AX
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea

caso10:
        cmp al,10                ;texto + direcc 11 bits
        jnz alcaso10
        jmp caso11
alcaso10:
        strcat bufferprn,bufferprn,[bx+3]
        dec dx      ;releeo el codigo para obtener la parte alta de la direccion
        call lee
        inc dx
        mov cl,5
        shr al,cl
        mov ch,al
        call lee
        inc dx
        mov cl,al
        mov  dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea
caso11:
        cmp al,11                ;texto + bit
        jnz alcaso11
        jmp caso12
alcaso11:
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        cmp al,7fh
        jbe directo
        push bx
        sub al,80h
        mov ah,al
        and al,07h
        push ax
        and ah,0f8h
        mov bl,ah
        xor bh,bh
        mov si,offset registro
        strcat bufferprn,bufferprn,[bx+3]     ;envia nombre del registro
        pop ax
        pop bx
directo:
        mov cl,al
        mov  dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea
caso12:
        cmp al,12                ;texto + bit + texto
        jnz alcaso12
        jmp caso13
alcaso12:
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        cmp al,7fh
        jbe directo12
        push bx
        sub al,80h
        mov ah,al
        and al,07h
        push ax
        and ah,0f8h
        mov bl,ah
        xor bh,bh
        mov si,offset registro
        strcat bufferprn,bufferprn,[bx+si]   ;envia nombre del registro
        pop ax
        pop bx
directo12:
        mov cl,al
        mov  dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        inc bx
        inc bx
busca12:
        inc bx
        cmp byte ptr [bx],0
        jnz busca12
        strcat bufferprn,bufferprn,[bx+1]
        jmp linea
caso13:
        cmp al,13                ;texto + bit + texto
        jnz alcaso13
        jmp linea
alcaso13:
        strcat bufferprn,bufferprn,[bx+3]
        call lee
        inc dx
        cmp al,7fh
        jbe directo13
        push bx
        sub al,80h
        mov ah,al
        and al,07h
        push ax
        and ah,0f8h
        mov bl,ah
        xor bh,bh
        mov si,offset registro
        strcat bufferprn,bufferprn,[bx+si]   ;envia nombre del registro
        pop ax
        pop bx
directo13:
        mov cl,al
        mov  dato,cx
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero

        inc bx
        inc bx
busca13:
        inc bx
        cmp byte ptr [bx],0
        jnz busca13
        strcat bufferprn,bufferprn,[bx+1]
        call lee
        inc dx
        cbw
        add ax,dx
        mov dato,AX
        itoa numero,dato,@h
        strcat bufferprn,bufferprn,numero
        jmp linea

linea:
        strcat bufferprn,bufferprn,nlinea

        ret
prn_inst endp

end prn_inst

No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.