home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Assembly / DISPAT26.ASM < prev    next >
Assembly Source File  |  1986-09-25  |  3KB  |  111 lines

  1. CGROUP    GROUP    CODE_SEG, DATA_SEG
  2.     ASSUME    CS:CGROUP, DS:CGROUP
  3.  
  4.  
  5. CODE_SEG    SEGMENT PUBLIC
  6.  
  7.     PUBLIC    DISPATCHER
  8.     EXTRN    READ_BYTE:NEAR, EDIT_BYTE:NEAR
  9.     EXTRN    WRITE_PROMPT_LINE:NEAR
  10. DATA_SEG    SEGMENT PUBLIC
  11.     EXTRN    EDITOR_PROMPT:BYTE
  12. DATA_SEG    ENDS
  13. ;-----------------------------------------------------------------------;
  14. ; This is the central dispatcher. During normal editing and viewing,    ;
  15. ; this procedure reads characters from the keybaord and, if the char    ;
  16. ; is a command key (such as a cursor key), DISPATCHER calls the        ;
  17. ; procedures that do the actual work.  This dispatching is done for    ;
  18. ; special keys listed in the table DISPATCH_TABLE, where the procedure    ;
  19. ; addresses are stored just after the key names.            ;
  20. ;   If the character is not a special key, then it should be placed    ;
  21. ; directly into the sector buffer--this is the editing mode.        ;
  22. ;                                    ;
  23. ; Uses:        READ_BYTE, EDIT_BYTE, WRITE_PROMPT_LINE            ;
  24. ; Reads:    EDITOR_PROMPT                        ;
  25. ;-----------------------------------------------------------------------;
  26. DISPATCHER    PROC    NEAR
  27.     PUSH    AX
  28.     PUSH    BX
  29.     PUSH    DX
  30. DISPATCH_LOOP:
  31.     CALL    READ_BYTE        ;Read character into AX
  32.     OR    AH,AH            ;AX = 0 if no character read, -1
  33.                     ; for an extended code.
  34.     JZ    NO_CHARS_READ        ;No character read, try again
  35.     JS    SPECIAL_KEY        ;Read extended code
  36.     MOV    DL,AL
  37.     CALL    EDIT_BYTE        ;Was normal character, edit byte
  38.     JMP    DISPATCH_LOOP        ;Read another character
  39. SPECIAL_KEY:
  40.     CMP    AL,68            ;F10--exit?
  41.     JE    END_DISPATCH        ;Yes, leave
  42.                     ;Use BX to look through table
  43.     LEA    BX,DISPATCH_TABLE
  44. SPECIAL_LOOP:
  45.     CMP    BYTE PTR [BX],0        ;End of table?
  46.     JE    NOT_IN_TABLE        ;Yes, key was not in the table
  47.     CMP    AL,[BX]            ;Is it this table entry?
  48.     JE    DISPATCH        ;Yes, then dispatch
  49.     ADD    BX,3            ;No, try next entry
  50.     JMP    SPECIAL_LOOP        ;Check next table entry
  51.  
  52. DISPATCH:
  53.     INC    BX            ;Point to address of procedure
  54.     CALL    WORD PTR [BX]        ;Call procedure
  55.     JMP    DISPATCH_LOOP        ;Wait for another key
  56.  
  57. NOT_IN_TABLE:                ;Do nothing, just read next character
  58.     JMP    DISPATCH_LOOP
  59.  
  60. NO_CHARS_READ:
  61.     LEA    DX,EDITOR_PROMPT
  62.     CALL    WRITE_PROMPT_LINE    ;Erase any invalid characters typed
  63.     JMP    DISPATCH_LOOP        ;Try again
  64.  
  65. END_DISPATCH:
  66.     POP    DX
  67.     POP    BX
  68.     POP    AX
  69.     RET
  70. DISPATCHER    ENDP
  71.  
  72. CODE_SEG    ENDS
  73.  
  74.  
  75. DATA_SEG    SEGMENT PUBLIC
  76.  
  77.  
  78. CODE_SEG    SEGMENT PUBLIC
  79.     EXTRN    NEXT_SECTOR:NEAR            ;In DISK_IO.ASM
  80.     EXTRN    PREVIOUS_SECTOR:NEAR            ;In DISK_IO.ASM
  81.     EXTRN    PHANTOM_UP:NEAR, PHANTOM_DOWN:NEAR    ;In PHANTOM.ASM
  82.     EXTRN    PHANTOM_LEFT:NEAR, PHANTOM_RIGHT:NEAR
  83.     EXTRN    WRITE_SECTOR:NEAR            ;In DISK_IO.ASM
  84. CODE_SEG    ENDS
  85. ;-----------------------------------------------------------------------;
  86. ; This table contains the legal extended ASCII keys and the addresses    ;
  87. ; of the procedures that should be called when each key is pressed.    ;
  88. ;    The format of the table is                    ;
  89. ;        DB    72        ;Extended code for cursor up    ;
  90. ;        DW    OFFSET CGROUP:PHANTOM_UP            ;
  91. ;-----------------------------------------------------------------------;
  92. DISPATCH_TABLE    LABEL    BYTE
  93.     DB    59                ;F1
  94.     DW    OFFSET CGROUP:PREVIOUS_SECTOR
  95.     DB    60                ;F2
  96.     DW    OFFSET CGROUP:NEXT_SECTOR
  97.     DB    72                ;Cursor up
  98.     DW    OFFSET CGROUP:PHANTOM_UP
  99.     DB    80                ;Cursor down
  100.     DW    OFFSET CGROUP:PHANTOM_DOWN
  101.     DB    75                ;Cursor left
  102.     DW    OFFSET CGROUP:PHANTOM_LEFT
  103.     DB    77                ;Cursor right
  104.     DW    OFFSET CGROUP:PHANTOM_RIGHT
  105.     DB    88                ;Shift F5
  106.     DW    OFFSET CGROUP:WRITE_SECTOR
  107.     DB    0                ;End of the table
  108. DATA_SEG    ENDS
  109.  
  110.     END
  111.