home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Assembly / DISPAT19.ASM < prev    next >
Assembly Source File  |  1986-09-25  |  3KB  |  85 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
  9. ;-----------------------------------------------------------------------;
  10. ; This is the central dispatcher. During normal editing and viewing,    ;
  11. ; this procedure reads characters from the keybaord and, if the char    ;
  12. ; is a command key (such as a cursor key), DISPATCHER calls the        ;
  13. ; procedures that do the actual work.  This dispatching is done for    ;
  14. ; special keys listed in the table DISPATCH_TABLE, where the procedure    ;
  15. ; addresses are stored just after the key names.            ;
  16. ;   If the character is not a special key, then it should be placed    ;
  17. ; directly into the sector buffer--this is the editing mode.        ;
  18. ;                                    ;
  19. ; Uses:        READ_BYTE                        ;
  20. ;-----------------------------------------------------------------------;
  21. DISPATCHER    PROC    NEAR
  22.     PUSH    AX
  23.     PUSH    BX
  24. DISPATCH_LOOP:
  25.     CALL    READ_BYTE        ;Read character into AX
  26.     OR    AH,AH            ;AX = 0 if no character read, -1
  27.                     ; for an extended code.
  28.     JZ    DISPATCH_LOOP        ;No character read, try again
  29.     JS    SPECIAL_KEY        ;Read extended code
  30. ; do nothing with the character for now
  31.     JMP    DISPATCH_LOOP        ;Read another character
  32. SPECIAL_KEY:
  33.     CMP    AL,68            ;F10--exit?
  34.     JE    END_DISPATCH        ;Yes, leave
  35.                     ;Use BX to look through table
  36.     LEA    BX,DISPATCH_TABLE
  37. SPECIAL_LOOP:
  38.     CMP    BYTE PTR [BX],0        ;End of table?
  39.     JE    NOT_IN_TABLE        ;Yes, key was not in the table
  40.     CMP    AL,[BX]            ;Is it this table entry?
  41.     JE    DISPATCH        ;Yes, then dispatch
  42.     ADD    BX,3            ;No, try next entry
  43.     JMP    SPECIAL_LOOP        ;Check next table entry
  44.  
  45. DISPATCH:
  46.     INC    BX            ;Point to address of procedure
  47.     CALL    WORD PTR [BX]        ;Call procedure
  48.     JMP    DISPATCH_LOOP        ;Wait for another key
  49.  
  50. NOT_IN_TABLE:                ;Do nothing, just read next character
  51.     JMP    DISPATCH_LOOP
  52.  
  53. END_DISPATCH:
  54.     POP    BX
  55.     POP    AX
  56.     RET
  57. DISPATCHER    ENDP
  58.  
  59. CODE_SEG    ENDS
  60.  
  61.  
  62. DATA_SEG    SEGMENT PUBLIC
  63.  
  64.  
  65. CODE_SEG    SEGMENT PUBLIC
  66.     EXTRN    NEXT_SECTOR:NEAR            ;In DISK_IO.ASM
  67.     EXTRN    PREVIOUS_SECTOR:NEAR            ;In DISK_IO.ASM
  68. CODE_SEG    ENDS
  69. ;-----------------------------------------------------------------------;
  70. ; This table contains the legal extended ASCII keys and the addresses    ;
  71. ; of the procedures that should be called when each key is pressed.    ;
  72. ;    The format of the table is                    ;
  73. ;        DB    72        ;Extended code for cursor up    ;
  74. ;        DW    OFFSET CGROUP:PHANTOM_UP            ;
  75. ;-----------------------------------------------------------------------;
  76. DISPATCH_TABLE    LABEL    BYTE
  77.     DB    59                ;F1
  78.     DW    OFFSET CGROUP:PREVIOUS_SECTOR
  79.     DB    60                ;F2
  80.     DW    OFFSET CGROUP:NEXT_SECTOR
  81.     DB    0                ;End of the table
  82. DATA_SEG    ENDS
  83.  
  84.     END
  85.