home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Assembly / DISPATCH.ASM < prev    next >
Assembly Source File  |  1986-10-07  |  4KB  |  126 lines

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