DOSSEG
.MODEL    SMALL

.STACK

.DATA

SECTOR DB   16 DUP (10h)
       DB   16 DUP (11h)
       DB   16 DUP (12h)
       DB   16 DUP (13h)
       DB   16 DUP (14h)
       DB   16 DUP (15h)
       DB   16 DUP (16h)
       DB   16 DUP (17h)
       DB   16 DUP (18h)
       DB   16 DUP (19h)
       DB   16 DUP (1Ah)
       DB   16 DUP (1Bh)
       DB   16 DUP (1Ch)
       DB   16 DUP (1Dh)
       DB   16 DUP (1Eh)
       DB   16 DUP (1Fh)

.CODE

     PUBLIC    DISP_HALF_SECTOR
     EXTRN     SEND_CRLF:PROC
;-----------------------------------------------------------------------;
; Este procedimiento muestra medio sector (256 bytes)                   ;
;                                                                       ;
; Usa:         DISP_LINE, SEND_CRLF                                     ;
;-----------------------------------------------------------------------;
DISP_HALF_SECTOR    PROC
     MOV  AX,DGROUP           ;Pone el segmento de datos en AX
     MOV  DS,AX               ;Pone DS para que apunte a los datos

     XOR  DX,DX               ;Comienza al principio de SECTOR
     MOV  CX,16               ;Muestra 16 l¡neas
HALF_SECTOR:
     CALL DISP_LINE
     CALL SEND_CRLF
     ADD  DX,16
     LOOP HALF_SECTOR

     MOV  AH,4Ch              ;Retorno al DOS
     INT  21h
DISP_HALF_SECTOR    ENDP


     PUBLIC    DISP_LINE
     EXTRN     WRITE_HEX:PROC
     EXTRN     WRITE_CHAR:PROC
;-----------------------------------------------------------------------;
; Este procedimiento muestra una l¡nea de datos, o 16 bytes, primero en ;
; hex y despu‚s en ASCII.                                               ;
;                                                                       ;
; A la entrada:     DS:DX     Desplazamiento dentro del sector, en bytes;
;                                                                       ;
; Usa:         WRITE_CHAR, WRITE_HEX                                    ;
; Lee:         SECTOR                                                   ;
;-----------------------------------------------------------------------;
DISP_LINE PROC
     PUSH BX
     PUSH CX
     PUSH DX
     MOV  BX,DX               ;El desplazamiento es m s util en BX
     MOV  CX,16               ;Vuelca 16 bytes
     PUSH BX                  ;Salva el desplazamiento para ASCII_LOOP
HEX_LOOP:
     MOV  DL,SECTOR[BX]       ;Lee 1 byte
     CALL WRITE_HEX           ;Vuelca este byte en hex
     MOV  DL,' '              ;Escribe un espacio entre n£meros
     CALL WRITE_CHAR
     INC  BX
     LOOP HEX_LOOP

     MOV  DL,' '              ;A¤ade otro espacio delante de los caracteres
     CALL WRITE_CHAR
     MOV  CX,16
     POP  BX                  ;Desplazamiento de retorno a SECTOR
ASCII_LOOP:
     MOV  DL,SECTOR[BX]
     CALL WRITE_CHAR
     INC  BX
     LOOP ASCII_LOOP

     POP  DX
     POP  CX
     POP  BX
     RET
     MOV  AH,4Ch              ;Vuelve al DOS
     INT  21h
DISP_LINE ENDP


     END  DISP_HALF_SECTOR

