home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
nor_asm
/
dispat26.asm
< prev
next >
Wrap
Assembly Source File
|
1989-06-06
|
3KB
|
106 lines
.MODEL SMALL
.CODE
EXTRN NEXT_SECTOR:PROC ;In DISK_IO.ASM
EXTRN PREVIOUS_SECTOR:PROC ;In DISK_IO.ASM
EXTRN PHANTOM_UP:PROC, PHANTOM_DOWN:PROC ;In PHANTOM.ASM
EXTRN PHANTOM_LEFT:PROC, PHANTOM_RIGHT:PROC
EXTRN WRITE_SECTOR:PROC ;In DISK_IO.ASM
.DATA
;-----------------------------------------------------------------------;
; This table contains the legal extended ASCII keys and the addresses ;
; of the procedures that should be called when each key is pressed. ;
; ;
; The format of the table is ;
; DB 72 ;Extended code for cursor up ;
; DW OFFSET 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 up
DW OFFSET _TEXT:PHANTOM_UP
DB 80 ;Cursor down
DW OFFSET _TEXT:PHANTOM_DOWN
DB 75 ;Cursor left
DW OFFSET _TEXT:PHANTOM_LEFT
DB 77 ;Cursor right
DW OFFSET _TEXT:PHANTOM_RIGHT
DB 85 ;Shift F2
DW OFFSET _TEXT:WRITE_SECTOR
DB 0 ;End of the table
.CODE
PUBLIC DISPATCHER
EXTRN READ_BYTE:PROC, EDIT_BYTE:PROC
EXTRN WRITE_PROMPT_LINE:PROC
.DATA
EXTRN EDITOR_PROMPT:BYTE
.CODE
;-----------------------------------------------------------------------;
; This is the central dispatcher. During normal editing and viewing, ;
; this procedure reads characters from the keyboard and, if the char ;
; is a command key (such as a cursor key), DISPATCHER calls the ;
; procedures that do the actual work. This dispatching is done for ;
; special keys listed in the table DISPATCH_TABLE, where the procedure ;
; addresses are stored just after the key names. ;
; ;
; If the character is not a special key, then it should be placed ;
; directly into the sector buffer--this is the editing mode. ;
; ;
; Uses: READ_BYTE, EDIT_BYTE, WRITE_PROMPT_LINE ;
; Reads: EDITOR_PROMPT ;
;-----------------------------------------------------------------------;
DISPATCHER PROC
PUSH AX
PUSH BX
PUSH DX
DISPATCH_LOOP:
CALL READ_BYTE ;Read character into AX
OR AH,AH ;AX = -1 if no character read, 1
; for an extended code.
JS NO_CHARS_READ ;No character read, try again
JNZ SPECIAL_KEY ;Read extended code
MOV DL,AL
CALL EDIT_BYTE ;Was normal character, edit byte
JMP DISPATCH_LOOP ;Read another character
SPECIAL_KEY:
CMP AL,68 ;F10--exit?
JE END_DISPATCH ;Yes, leave
;Use BX to look through table
LEA BX,DISPATCH_TABLE
SPECIAL_LOOP:
CMP BYTE PTR [BX],0 ;End of table?
JE NOT_IN_TABLE ;Yes, key was not in the table
CMP AL,[BX] ;Is it this table entry?
JE DISPATCH ;Yes, then dispatch
ADD BX,3 ;No, try next entry
JMP SPECIAL_LOOP ;Check next table entry
DISPATCH:
INC BX ;Point to address of procedure
CALL WORD PTR [BX] ;Call procedure
JMP DISPATCH_LOOP ;Wait for another key
NOT_IN_TABLE: ;Do nothing, just read next character
JMP DISPATCH_LOOP
NO_CHARS_READ:
LEA DX,EDITOR_PROMPT
CALL WRITE_PROMPT_LINE ;Erase any invalid characters typed
JMP DISPATCH_LOOP ;Try again
END_DISPATCH:
POP DX
POP BX
POP AX
RET
DISPATCHER ENDP
END