
.MODEL    SMALL
 
.DATA
 
     EXTRN     SECTOR:BYTE
     EXTRN     DISK_DRIVE_NO:BYTE
     EXTRN     CURRENT_SECTOR_NO:WORD
 
.CODE
 
     PUBLIC    PREVIOUS_SECTOR
     EXTRN     INIT_SEC_DISP:PROC, WRITE_HEADER:PROC
     EXTRN     WRITE_PROMPT_LINE:PROC
.DATA
     EXTRN     CURRENT_SECTOR_NO:WORD, EDITOR_PROMPT:BYTE
.CODE
;-----------------------------------------------------------------------;
; Este procedimiento lee, si es posible, el sector anterior.            ;
;                                                                       ;
; Usa:    WRITE_HEADER, READ_SECTOR, INIT_SEC_DISP                      ;
;         WRITE_PROMPT_LINE                                             ;
; Lee:    CURRENT_SECTOR_NO, EDITOR_PROMPT                              ;
; Escribe:     CURRENT_SECTOR_NO                                        ;
;-----------------------------------------------------------------------;
PREVIOUS_SECTOR          PROC
     PUSH AX
     PUSH DX
     MOV  AX,CURRENT_SECTOR_NO     ;Obtiene el n£mero de sector en curso
     OR   AX,AX                    ;No decrementar si ya es 0
     JZ   DONT_DECREMENT_SECTOR
     DEC  AX
     MOV  CURRENT_SECTOR_NO,AX     ;Salva el nuevo n£mero de sector
     CALL WRITE_HEADER
     CALL READ_SECTOR
     CALL INIT_SEC_DISP            ;Visualiza el nuevo sector
     LEA  DX,EDITOR_PROMPT
     CALL WRITE_PROMPT_LINE
DONT_DECREMENT_SECTOR:
     POP  DX
     POP  AX
     RET
PREVIOUS_SECTOR          ENDP
 
 
     PUBLIC    NEXT_SECTOR
     EXTRN     INIT_SEC_DISP:PROC, WRITE_HEADER:PROC
     EXTRN     WRITE_PROMPT_LINE:PROC
.DATA
     EXTRN     CURRENT_SECTOR_NO:WORD, EDITOR_PROMPT:BYTE
.CODE
 
;-----------------------------------------------------------------------;
; Lee el sector siguiente.                                              ;
;                                                                       ;
; Usa:    WRITE_HEADER, READ_SECTOR, INIT_SEC_DISP                      ;
;         WRITE_PROMPT_LINE                                             ;
; Lee:    CURRENT_SECTOR_NO, EDITOR_PROMPT                              ;
; Escribe: CURRENT_SECTOR_NO                                            ;
;-----------------------------------------------------------------------;
NEXT_SECTOR    PROC
     PUSH AX
     PUSH DX
     MOV  AX,CURRENT_SECTOR_NO
     INC  AX                  ;Pasar al sector siguiente
     MOV  CURRENT_SECTOR_NO,AX
     CALL WRITE_HEADER
     CALL READ_SECTOR
     CALL INIT_SEC_DISP       ;Visualiza el nuevo sector
     LEA  DX,EDITOR_PROMPT
     CALL WRITE_PROMPT_LINE
     POP  DX
     POP  AX
     RET
NEXT_SECTOR    ENDP
 
 
     PUBLIC    READ_SECTOR
;-----------------------------------------------------------------------;
; Este procedimiento lee un sector (512 bytes) y lo almacena en SECTOR. ;
;                                                                       ;
; Lee:    CURRENT_SECTOR_NO, DISK_DRIVE_NO                              ;
; Escribe: SECTOR                                                       ;
;-----------------------------------------------------------------------;
READ_SECTOR    PROC
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     MOV  AL,DISK_DRIVE_NO     ;N£mero de la unidad de disco
     MOV  CX,1                 ;Lee s¢lo un sector
     MOV  DX,CURRENT_SECTOR_NO ;N£mero de sector l¢gico
     LEA  BX,SECTOR            ;Lugar donde almacena el sector
     INT  25h                  ;Lee el sector
     POPF                      ;Desecha los indicadores que el DOS ha puesto
     POP  DX                   ; en la pila
     POP  CX
     POP  BX
     POP  AX
     RET
READ_SECTOR    ENDP
 
 
     PUBLIC    WRITE_SECTOR
;-----------------------------------------------------------------------;
; Este procedimiento vuelve a escribir el sector en el disco.           ;
;                                                                       ;
; Lee:    DISK_DRIVE_NO, CURRENT_SECTOR_NO, SECTOR                      ;
;-----------------------------------------------------------------------;
WRITE_SECTOR   PROC
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     MOV  AL,DISK_DRIVE_NO     ;N£mero de unidad
     MOV  CX,1                 ;Escribe 1 sector
     MOV  DX,CURRENT_SECTOR_NO ;Sector l¢gico
     LEA  BX,SECTOR
     INT  26h                  ;Escribe el sector en el disco
     POPF                      ;Desecha la informaci¢n de los indicadores
     POP  DX
     POP  CX
     POP  BX
     POP  AX
     RET
WRITE_SECTOR   ENDP
 
 
     END

