.MODEL    SMALL

.CODE
     EXTRN     NEXT_SECTOR:PROC                   ;En DISK_IO.ASM
     EXTRN     PREVIOUS_SECTOR:PROC               ;En DISK_IO.ASM
     EXTRN     PHANTOM_UP:PROC, PHANTOM_DOWN:PROC ;En PHANTOM.ASM
     EXTRN     PHANTOM_LEFT:PROC, PHANTOM_RIGHT:PROC
     EXTRN     WRITE_SECTOR:PROC                  ;En DISK_IO.ASM
.DATA
;-----------------------------------------------------------------------;
; Esta tabla contiene las teclas ASCII ampliadas v lidas y las direccio-;
; nes de los procedimientos que deben llamarse cada vez que se pulsa    ;
; cada una de las teclas.                                               ;
;                                                                       ;
; El formato de la tabla es                                             ;
;         DB   72        ;C¢digo ampliado para subir el cursor          ;
;         DW   OFFSET _TEXT:PHANTOM_UP                                  ;
;-----------------------------------------------------------------------;
DISPATCH_TABLE LABEL   BYTE
     DB   61                  ;F3
     DW   OFFSET _TEXT:PREVIOUS_SECTOR
     DB   62                  ;F4
     DW   OFFSET _TEXT:NEXT_SECTOR
     DB   72                  ;Cursor arriba
     DW   OFFSET _TEXT:PHANTOM_UP
     DB   80                  ;Cursor abajo
     DW   OFFSET _TEXT:PHANTOM_DOWN
     DB   75                  ;Cursor a la izquierda
     DW   OFFSET _TEXT:PHANTOM_LEFT
     DB   77                  ;Cursor a la derecha
     DW   OFFSET _TEXT:PHANTOM_RIGHT
     DB   85                  ;May£sc. F2
     DW   OFFSET _TEXT:WRITE_SECTOR
     DB   0                   ;Fin de la tabla

.CODE

     PUBLIC    DISPATCHER
     EXTRN     READ_BYTE:PROC, EDIT_BYTE:PROC
     EXTRN     WRITE_PROMPT_LINE:PROC
.DATA
     EXTRN     EDITOR_PROMPT:BYTE
.CODE
;-----------------------------------------------------------------------;
; Este es el n£cleo de control central. Durante la edici¢n y visualiza- ;
; ci¢n normal, este procedimiento lee caracteres del teclado, y si el   ;
; car cter es una tecla de comando (tal como una tecla de flecha),      ;
; DISPATCHER llama a los procedimientos o procedimiento que lleva a ca- ;
; bo esa funci¢n. Este trabajo de control se efect£a por medio de te-   ;
; clas especiales que est n incluidas en la tabla DISPATCH_TABLE, donde ;
; las direcciones de los procedimientos est n almacenadas a continua-   ;
; ci¢n de los nombres de las teclas.                                    ;
;                                                                       ;
; Si el car cter no es una tecla especial, entonces se deber¡a poner    ;
; directamente en el buffer del sector. Este es el modo de edici¢n.     ;
;                                                                       ;
; Usa:    READ_BYTE, EDIT_BYTE, WRITE_PROMPT_LINE                       ;
; Lee:    EDITOR_PROMPT                                                 ;
;-----------------------------------------------------------------------;
DISPATCHER     PROC
     PUSH AX
     PUSH BX
     PUSH DX
DISPATCH_LOOP:

     CALL READ_BYTE           ;Lee el car cter y lo pone en AX
     OR   AH,AH               ;AX = -1 si no se ha leido ning£n car cter
                              ; 1 si es un c¢digo ampliado.
     JS   NO_CHARS_READ       ;No se ha le¡do ning£n car cter, intentarlo de nuevo
     JNZ  SPECIAL_KEY         ;Lee c¢digo ampliado
     MOV  DL,AL
     CALL EDIT_BYTE           ;Era un car cter normal, editar byte
     JMP  DISPATCH_LOOP       ;Lee otro car cter

SPECIAL_KEY:
     CMP  AL,68               ;¨F10--salir?
     JE   END_DISPATCH        ;S¡, salir
                              ;Usa BX para buscar en la tabla
     LEA  BX,DISPATCH_TABLE
SPECIAL_LOOP:
     CMP  BYTE PTR [BX],0     ;¨Fin de la tabla?
     JE   NOT_IN_TABLE        ;S¡, la tecla no est  en la tabla
     CMP  AL,[BX]             ;¨Es esta entrada de la tabla?
     JE   DISPATCH            ;S¡, entonces saltar a DISPATCH
     ADD  BX,3                ;No, intentar la entrada siguiente de la tabla
     JMP  SPECIAL_LOOP        ;Ver la entrada siguiente de la tabla

DISPATCH:
     INC  BX                  ;Apunta a la direcci¢n del procedimiento
     CALL WORD PTR [BX]       ;Llama al procedimiento
     JMP  DISPATCH_LOOP       ;Espera a que se pulse otra tecla

NOT_IN_TABLE:                 ;No hace nada, s¢lo leer el siguiente car cter
     JMP  DISPATCH_LOOP

NO_CHARS_READ:
     LEA  DX,EDITOR_PROMPT
     CALL WRITE_PROMPT_LINE   ;Borra los caracteres inv lidos introducidos
     JMP  DISPATCH_LOOP       ;Vuelve a intentarlo

END_DISPATCH:
     POP  DX
     POP  BX
     POP  AX
     RET
DISPATCHER     ENDP


     END
