Sectores de Disquette
Soy nuevo programando en ass... y estaba tratando de hacer un programita que se ingrese el sector y la pista de un disquette para que lo lea en pantalla. Alguien tiene idea de como se convierten lo que ingresa para que se pueda usar
Pare leer del disco o disquete puedes ver un ejemplo en la lista de ensamblador e informática en www.arimao.com, también hay un módulo para vacear los datos en memoria, pues si lees un sector, su contenido se almacenará en memoria y de ahí lo mostrarás en pantalla, te envío el mostrador de datos...
CPU 8086
segment code
inicio
mov ax,0003h
int 10h
mov bx,final
add bx,32
mov [cs:Desplazamiento],bx
mov [cs:segmento],cs
mov ax,0201h
mov dx,0000h
mov cx,0001h
push cs
pop es
mov bx,[cs:Desplazamiento]
int 13h ; lee el primer sector del disquete de la pista cero cara cero
call muestra
mov ax,0003h
int 10h
mov ax,4c00h
int 21h
muestra:
mov si,00bah ;offset de la row donde begin a print b6h
mov cx,0010h
pos68: push cx
mov bx,0010h
xchg bx,cx
sub cx,bx
mov ax,cx
xchg ah,al
call hexaBYTE
pop cx
inc si
inc si
loop pos68
rastrear1:
cld
pos105:
posw2:
mov si,01e4h ;offset in pantalla de la first line q'
mov cx,0011h ;visualizare en esta y en CX la cant de lines
;a mostrar a partir de SI
mov ax,[cs:segmento]
mov es,ax
mov di,[cs:Desplazamiento]
CALL POS70
deNUEVO:
mov ax,deNUEVO
push ax
call getKEY
cmp al,00h
je cursorRASTREA
cmp al,1bh
jne jumpDEnuevo
pop ax
clc
jumpDEnuevo:
ret
cursorRASTREA:
cmp ah,48h
jz llamarmovUP
cmp ah,50h
jz llamarmovDOW
cmp ah,51h
jz PGDN
cmp ah,49h
jz PGUP
ret
llamarmovUP:
call movUP
mov cx,0001h
sub di,0120h ;(cant de filas q' caben in win +1)*10h
push di
mov si,01e4h ;offset del begin de la line a print
call POS70
pop di
add di,0110h ;cant de filas * 10h
ret
PGUP:
sub di,0220h ;cant de lineas imprimidas*10h*2
PGDN:
mov cx,0011h ;total de line a mostrar q' caben en pantalla
mov si,01e4h ;offset donde begin a print la first line
call POS70
ret
llamarmovDOW:
call movDOW
mov cx,0001h
mov si,0be4h ;0a0h * (cant de filas q' caben in win)
call POS70
ret
hexaBYTE:
mov cx,0002h
call hexa
RET
hexaWORD:
mov cx,0004h
call hexa
RET
hexa:
mov dx,0b800h
mov ds,dx
pos65: push cx
mov dx,ax
mov cl,4
and dx,0f000h
shr dh,cl
cmp dh,09h
jg suma
call print10
bucleHEXA:
shl ax,cl
pop cx
loop pos65
RET
suma:
add dh,37h
call print16
jmp bucleHEXA
print10:
add dh,30h
print16:
mov [si],dh
inc si
inc si
RET
; Verifica si se pulso una ,en caso + lee esa tecla(getKEY)
getKEY:
mov ah,00
int 16h
RET
llamar10:
int 10h
RET
;borra la primera linea de la pantalla al desplazar esta hacia
;arriba rellenando la ultima linea de espacios en blanco
movDOW:
mov ax,0601h
mov cx,0300h
mov dx,134fh
mov bh,17h
call llamar10
ret
;abajo y rellena la primera de espacios en blanco
movUP:
mov ax,0701h
mov cx,0300h
mov dx,134fh
mov bh,17h
call llamar10
ret
; Imprime CX veces lineas en la pantalla ,donde cada linea
; comienza con seg:offset , seguido del contenido de las primeras
; 16 posiciones a partir de ese offset ,seguido del contenido de
; cada posicion en decimal ,ademas en (SI) la posicion de la
; pantalla donde comenzara a imprimirse lo descrito anteriormente
; y en DI de donde leera a paritir de esa posicion indicando ES
;el segmento a rastrear y DS con B800h
POS70:
push cx
push si
mov ax,es
call hexaWORD
mov dh,3ah
call print16
mov ax,di
call hexaWORD
inc si
inc si
inc si
inc si
push di
mov cx,0010h
push cx
pos66:
push cx
mov ah,[es:di]
call hexaBYTE
pop cx
inc di
inc si
inc si
loop pos66
pop cx
pop di
inc si
inc si
pos67:
mov dh,[es:di]
call print16
inc di
loop pos67
pos67:
mov dh,[es:di]
call print16
inc di
loop pos67
pop si
add si,00a0h
pop cx
loop POS70
RET
segmento dw 0
Desplazamiento dw 0
final db 0
CPU 8086
segment code
inicio
mov ax,0003h
int 10h
mov bx,final
add bx,32
mov [cs:Desplazamiento],bx
mov [cs:segmento],cs
mov ax,0201h
mov dx,0000h
mov cx,0001h
push cs
pop es
mov bx,[cs:Desplazamiento]
int 13h ; lee el primer sector del disquete de la pista cero cara cero
call muestra
mov ax,0003h
int 10h
mov ax,4c00h
int 21h
muestra:
mov si,00bah ;offset de la row donde begin a print b6h
mov cx,0010h
pos68: push cx
mov bx,0010h
xchg bx,cx
sub cx,bx
mov ax,cx
xchg ah,al
call hexaBYTE
pop cx
inc si
inc si
loop pos68
rastrear1:
cld
pos105:
posw2:
mov si,01e4h ;offset in pantalla de la first line q'
mov cx,0011h ;visualizare en esta y en CX la cant de lines
;a mostrar a partir de SI
mov ax,[cs:segmento]
mov es,ax
mov di,[cs:Desplazamiento]
CALL POS70
deNUEVO:
mov ax,deNUEVO
push ax
call getKEY
cmp al,00h
je cursorRASTREA
cmp al,1bh
jne jumpDEnuevo
pop ax
clc
jumpDEnuevo:
ret
cursorRASTREA:
cmp ah,48h
jz llamarmovUP
cmp ah,50h
jz llamarmovDOW
cmp ah,51h
jz PGDN
cmp ah,49h
jz PGUP
ret
llamarmovUP:
call movUP
mov cx,0001h
sub di,0120h ;(cant de filas q' caben in win +1)*10h
push di
mov si,01e4h ;offset del begin de la line a print
call POS70
pop di
add di,0110h ;cant de filas * 10h
ret
PGUP:
sub di,0220h ;cant de lineas imprimidas*10h*2
PGDN:
mov cx,0011h ;total de line a mostrar q' caben en pantalla
mov si,01e4h ;offset donde begin a print la first line
call POS70
ret
llamarmovDOW:
call movDOW
mov cx,0001h
mov si,0be4h ;0a0h * (cant de filas q' caben in win)
call POS70
ret
hexaBYTE:
mov cx,0002h
call hexa
RET
hexaWORD:
mov cx,0004h
call hexa
RET
hexa:
mov dx,0b800h
mov ds,dx
pos65: push cx
mov dx,ax
mov cl,4
and dx,0f000h
shr dh,cl
cmp dh,09h
jg suma
call print10
bucleHEXA:
shl ax,cl
pop cx
loop pos65
RET
suma:
add dh,37h
call print16
jmp bucleHEXA
print10:
add dh,30h
print16:
mov [si],dh
inc si
inc si
RET
; Verifica si se pulso una ,en caso + lee esa tecla(getKEY)
getKEY:
mov ah,00
int 16h
RET
llamar10:
int 10h
RET
;borra la primera linea de la pantalla al desplazar esta hacia
;arriba rellenando la ultima linea de espacios en blanco
movDOW:
mov ax,0601h
mov cx,0300h
mov dx,134fh
mov bh,17h
call llamar10
ret
;abajo y rellena la primera de espacios en blanco
movUP:
mov ax,0701h
mov cx,0300h
mov dx,134fh
mov bh,17h
call llamar10
ret
; Imprime CX veces lineas en la pantalla ,donde cada linea
; comienza con seg:offset , seguido del contenido de las primeras
; 16 posiciones a partir de ese offset ,seguido del contenido de
; cada posicion en decimal ,ademas en (SI) la posicion de la
; pantalla donde comenzara a imprimirse lo descrito anteriormente
; y en DI de donde leera a paritir de esa posicion indicando ES
;el segmento a rastrear y DS con B800h
POS70:
push cx
push si
mov ax,es
call hexaWORD
mov dh,3ah
call print16
mov ax,di
call hexaWORD
inc si
inc si
inc si
inc si
push di
mov cx,0010h
push cx
pos66:
push cx
mov ah,[es:di]
call hexaBYTE
pop cx
inc di
inc si
inc si
loop pos66
pop cx
pop di
inc si
inc si
pos67:
mov dh,[es:di]
call print16
inc di
loop pos67
pos67:
mov dh,[es:di]
call print16
inc di
loop pos67
pop si
add si,00a0h
pop cx
loop POS70
RET
segmento dw 0
Desplazamiento dw 0
final db 0