PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   1


=  0001                   __RASM__        EQU     1

                          ;    File              : $CMDLINE.A86$
                          ;
                          ;    Description       :
                          ;
                          ;    Original Author   : DIGITAL RESEARCH
                          ;
                          ;    Last Edited By    : $CALDERA$
                          ;
                          ;-----------------------------------------------------------------------;
                          ;    Copyright Work of Caldera, Inc. All Rights Reserved.
                          ;      
                          ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
                          ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
                          ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
                          ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
                          ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
                          ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
                          ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
                          ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
                          ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
                          ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
                          ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
                          ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
                          ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
                          ;    CIVIL LIABILITY.
                          ;-----------------------------------------------------------------------;
                          ;
                          ;    *** Current Edit History ***
                          ;    *** End of Current Edit History ***
                          ;
                          ;    $Log$
                          ;    CMDLINE.A86 1.8 93/03/25 15:06:03
                          ;    tweak console block output
                          ;    ENDLOG
                          ;
                          ;       DOSPLUS Command Line Editor Routines
                          ;

=                                 include pcmode.equ
=                         ;    File              : $PCMODE.EQU$
=                         ;
=                         ;    Description       :
=                         ;
=                         ;    Original Author   : DIGITAL RESEARCH
=                         ;
=                         ;    Last Edited By    : $CALDERA$
=                         ;
=                         ;-----------------------------------------------------------------------;
=                         ;    Copyright Work of Caldera, Inc. All Rights Reserved.
=                         ;      
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   2


=                         ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
=                         ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
=                         ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
=                         ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
=                         ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
=                         ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
=                         ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
=                         ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
=                         ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
=                         ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
=                         ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
=                         ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
=                         ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
=                         ;    CIVIL LIABILITY.
=                         ;-----------------------------------------------------------------------;
=                         ;
=                         ;    *** Current Edit History ***
=                         ;    *** End of Current Edit History ***
=                         ;
=                         ;    $Log$
=                         ;
=                         ;    ENDLOG
=                         ;       This file contains all the general purpose definitions
=                         ;       and equates used by the PCMODE Module.
=                         ;
=
=  FFFF                   TRUE            equ     0FFFFh          ; value of TRUE
=  0000                   FALSE           equ     0               ; value of FALSE
=
=  0006                   TRUE_VERSION    equ     6
=
=  FFFF                   IDLE_DETECT     equ     TRUE            ; Check for IDLE Process's
=
=                         if IDLE_DETECT
=  0001                   IDLE_COMMAND    equ     0001h           ; Command Processor Active
=  0002                   IDLE_DOSFUNC    equ     0002h           ; DOS Function Called
=  0004                   IDLE_INT28      equ     0004h           ; INT 28 Called
=
=  4000                   IDLE_ON         equ     4000h           ; ReSet when Idle Checking Enabled
=  8000                   IDLE_INIT       equ     8000h           ; ReSet when $IDLE$ Loaded and Active
=  C000                   IDLE_DISABLE    equ     IDLE_INIT + IDLE_ON 
=
=  0001                   PROC_IDLE       equ     0001            ; Process is IDLE
=  0002                   PROC_INT28      equ     0002            ; INT28 Polling Loop
=  0003                   PROC_KEYIN      equ     0003            ; Keyboard Input
=  0004                   PROC_DEVIN      equ     0004            ; Device Input Routine
=                         endif
=
=
=  00C0                   STACK_SIZE      equ     192             ; Local Stack Size (Levels)
=  0050                   MAX_PATHLEN     equ     80              ; Maximum Path length
=  000D                   MAX_FILELEN     equ     13
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   3


=
=                         ;
=                         ;       DOS process termination Codes
=                         ;
=  0000                   TERM_NORMAL     equ     0               ; Normal Termination
=  0001                   TERM_BREAK      equ     1               ; Termination by Control Break
=  0002                   TERM_ERROR      equ     2               ; Termination by Critical Error
=  0003                   TERM_RESIDENT   equ     3               ; Terminate and Stay Resident
=
=                         ;
=                         ;       Critical Error responses from the default INT 24 handler and
=                         ;       the DO_INT24 routine.
=                         ;
=  0000                   ERR_IGNORE      equ     0               ; Ignore Error
=  0001                   ERR_RETRY       equ     1               ; Retry the Operation
=  0002                   ERR_ABORT       equ     2               ; Terminate the Process
=  0003                   ERR_FAIL        equ     3               ; Fail Function
=                         ;
=  0008                   OK_FAIL         equ     0000$1000b      ; Fail is a Valid Response
=  0010                   OK_RETRY        equ     0001$0000b      ; Retry is a Valid Response
=  0020                   OK_IGNORE       equ     0010$0000b      ; Ignore is a valid Response
=  0038                   OK_RIF          equ     0011$1000b      ; All Responsese are Valid
=  0030                   OK_RI           equ     0011$0000b      ; Retry and Ignore are Valid
=  0018                   OK_RF           equ     0001$1000b      ; Retry and Fail are Valid
=                         ;
=  0040                   NO_CRIT_ERRORS  equ     0100$0000b      ; critical error shouldn't be generated
=                                                                 ; warning - must match FDOS.A86
=                         ;
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   4


=                         eject
=                         ;       The following equates define the format in which the users registers
=                         ;       are saved on the stack. This format is also seen by an application
=                         ;       when a critical error occurs.
=                         ;
=                         CodeMacro       POP$DOS         ; Pop User Registers a la MS-DOS
=                                 db 058h ! db 05Bh       ; pop AX ! pop BX
=                                 db 059h ! db 05Ah       ; pop BX ! pop CX
=                                 db 05Eh ! db 05Fh       ; pop SI ! pop DI
=                                 db 05Dh                 ; pop BP
=                                 db 01Fh ! db 007h       ; pop DS ! pop ES
=                         EndM
=
=                         CodeMacro   PUSH$DOS    ; Push User Registers
=                                 db 006h ! db 01Eh       ; push ES ! push DS
=                                 db 055h                 ; push BP
=                                 db 057h ! db 056h       ; push DI ! push SI
=                                 db 052h ! db 051h       ; push DX ! push CX
=                                 db 053h ! db 050h       ; push BX ! push AX
=                         EndM
=
=  0000                   reg_AX          equ     word ptr .00
=  0000                   reg_AL          equ     byte ptr .00
=  0001                   reg_AH          equ     byte ptr .01
=
=  0002                   reg_BX          equ     word ptr .02
=  0002                   reg_BL          equ     byte ptr .02
=  0003                   reg_BH          equ     byte ptr .03
=
=  0004                   reg_CX          equ     word ptr .04
=  0004                   reg_CL          equ     byte ptr .04
=  0005                   reg_CH          equ     byte ptr .05
=
=  0006                   reg_DX          equ     word ptr .06
=  0006                   reg_DL          equ     byte ptr .06
=  0007                   reg_DH          equ     byte ptr .07
=
=  0008                   reg_SI          equ     word ptr .08
=  000A                   reg_DI          equ     word ptr .10
=  000C                   reg_BP          equ     word ptr .12
=
=  000E                   reg_DS          equ     word ptr .14
=  0010                   reg_ES          equ     word ptr .16
=
=  0012                   reg_IP          equ     word ptr .18
=  0014                   reg_CS          equ     word ptr .20
=  0016                   reg_FLAGS       equ     word ptr .22
=
=                         ; Processor Flags
=  0001                   CARRY_FLAG      equ     0001h           ; Carry Flag
=  0040                   ZERO_FLAG       equ     0040h           ; Zero Flag
=  0080                   SIGN_FLAG       equ     0080h           ; Sign Flag
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   5


=  0200                   INT_FLAG        equ     0200h           ; Interrupt Flag
=  0400                   DIR_FLAG        equ     0400h           ; Direction Flag
=  0800                   OFLW_FLAG       equ     0800h           ; OverFlow Flag
=
=  0000                   DMD_ID          equ     es:byte ptr .0  ; id code ('M' or 'Z')
=  0001                   DMD_PSP         equ     es:word ptr .1  ; owner of memory block
=  0003                   DMD_LEN         equ     es:word ptr .3  ; length of memory block
=  0006                   DMD_IDLE_FLAGS  equ es:word ptr .6  ; idle flags live here
=  0008                   DMD_NAME        equ     es:byte ptr .8  ; ASCIIZ name field
=  0008                   DMD_NAME_LEN    equ     8               ;  8 Bytes long
=  004D                   IDM             equ     'M'             ; not last id code
=  005A                   IDZ             equ     'Z'             ; last id code
=
=                         PCMCODE         GROUP   PCM_HEADER, PCM_CODE, BDOS_CODE, PCM_RODATA
=                         PCMCODE         GROUP   PCM_HISTORY, PCM_ICODE, PCM_CODEND
=
=                         PCM_HEADER      CSEG    PARA
=                         PCM_CODE        CSEG    BYTE
=                         PCM_RODATA      CSEG    WORD
=                         BDOS_CODE       CSEG    WORD
=                         PCM_HISTORY     CSEG    BYTE
=                         PCM_ICODE       CSEG    BYTE
=                         PCM_CODEND      CSEG    PARA
=
=
=                         PCMDATA         GROUP   PCMODE_DATA, FDOS_DSEG, FIXED_DOS_DATA
=                         PCMDATA         GROUP   PCMODE_CODE, GLOBAL_DATA, BDOS_DATA, PCMODE_DSIZE
=
=                         PCMODE_DATA     DSEG    WORD            ; DOS Data
=                         FDOS_DSEG       DSEG    WORD COMMON     ; FDOS Parameter Block  
=0000                     fdos_data       rw      7
=                         FIXED_DOS_DATA  CSEG    WORD    'DATA'  ; Fixed DOS Data Area
=                         PCMODE_CODE     CSEG    WORD    'DATA'  ; DATA relative CODE
=                         GLOBAL_DATA     DSEG    WORD            ; GLOBAL DOS DATA (Process Independant)
=                         BDOS_DATA       DSEG    WORD            ; BDOS Data Area
=                         PCMODE_DSIZE    DSEG    PARA            ; End of DOS Data Area

=                                 include i:msdos.equ
=                         ;    File              : $MSDOS.EQU$
=                         ;
=                         ;    Description       :
=                         ;
=                         ;    Original Author   : DIGITAL RESEARCH
=                         ;
=                         ;    Last Edited By    : $CALDERA$
=                         ;
=                         ;-----------------------------------------------------------------------;
=                         ;    Copyright Work of Caldera, Inc. All Rights Reserved.
=                         ;      
=                         ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
=                         ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
=                         ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   6


=                         ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
=                         ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
=                         ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
=                         ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
=                         ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
=                         ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
=                         ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
=                         ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
=                         ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
=                         ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
=                         ;    CIVIL LIABILITY.
=                         ;-----------------------------------------------------------------------;
=                         ;
=                         ;    *** Current Edit History ***
=                         ;    *** End of Current Edit History ***
=                         ;
=                         ;    $Log$
=                         ;
=                         ;    ENDLOG
=
=
=  0000                   MS_P_TERMCPM    equ     00H
=  0001                   MS_C_READ       equ     01H
=  0002                   MS_C_WRITE      equ     02H
=  0003                   MS_A_READ       equ     03H
=  0004                   MS_A_WRITE      equ     04H
=  0005                   MS_L_WRITE      equ     05H
=  0006                   MS_C_RAWIO      equ     06H
=  0007                   MS_C_RAWIN      equ     07H
=  0008                   MS_C_NOECHO     equ     08H
=  0009                   MS_C_WRITESTR   equ     09H
=  000A                   MS_C_READSTR    equ     0aH
=  000B                   MS_C_STAT       equ     0bH
=  000C                   MS_C_FLUSH      equ     0cH
=  000D                   MS_DRV_ALLRESET equ     0dH
=  000E                   MS_DRV_SET      equ     0eH
=  000F                   MS_F_OPEN       equ     0fH
=  0010                   MS_F_CLOSE      equ     10H
=  0011                   MS_F_SFIRST     equ     11H
=  0012                   MS_F_SNEXT      equ     12H
=  0013                   MS_F_DELETE     equ     13H
=  0014                   MS_F_READ       equ     14H
=  0015                   MS_F_WRITE      equ     15H
=  0016                   MS_F_MAKE       equ     16H
=  0017                   MS_F_RENAME     equ     17H
=  0019                   MS_DRV_GET      equ     19H
=  001A                   MS_F_DMAOFF     equ     1aH
=  001B                   MS_DRV_ALLOC    equ     1bH
=  001C                   MS_DRV_ALLOCSPEC equ    1cH
=  0021                   MS_F_READRAND   equ     21H
=  0022                   MS_F_WRITERAND  equ     22H
=  0023                   MS_F_SIZE       equ     23H
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   7


=  0024                   MS_F_RANDREC    equ     24H
=  0025                   MS_S_SETINT     equ     25H
=  0026                   MS_P_MKPSP      equ     26H
=  0027                   MS_F_READBLK    equ     27H
=  0028                   MS_F_WRITEBLK   equ     28H
=  0029                   MS_F_PARSE      equ     29H
=  002A                   MS_T_GETDATE    equ     2aH
=  002B                   MS_T_SETDATE    equ     2bH
=  002C                   MS_T_GETTIME    equ     2cH
=  002D                   MS_T_SETTIME    equ     2dH
=  002E                   MS_F_VERIFY     equ     2eH
=  002F                   MS_F_DMAGET     equ     2fH
=  0030                   MS_S_BDOSVER    equ     30H
=  0031                   MS_P_TERMKEEP   equ     31H
=  0033                   MS_S_BREAK      equ     33H
=  0035                   MS_S_GETINT     equ     35H
=  0036                   MS_DRV_SPACE    equ     36H
=  0038                   MS_S_COUNTRY    equ     38H
=  0039                   MS_X_MKDIR      equ     39H
=  003A                   MS_X_RMDIR      equ     3aH
=  003B                   MS_X_CHDIR      equ     3bH
=  003C                   MS_X_CREAT      equ     3cH
=  003D                   MS_X_OPEN       equ     3dH
=  003E                   MS_X_CLOSE      equ     3eH
=  003F                   MS_X_READ       equ     3fH
=  0040                   MS_X_WRITE      equ     40H
=  0041                   MS_X_UNLINK     equ     41H
=  0042                   MS_X_LSEEK      equ     42H
=  0043                   MS_X_CHMOD      equ     43H
=  0044                   MS_X_IOCTL      equ     44H
=  0045                   MS_X_DUP        equ     45H
=  0046                   MS_X_DUP2       equ     46H
=  0047                   MS_X_CURDIR     equ     47H
=  0048                   MS_M_ALLOC      equ     48H
=  0049                   MS_M_FREE       equ     49H
=  004A                   MS_M_SETBLOCK   equ     4aH
=  004B                   MS_X_EXEC       equ     4bH
=  004C                   MS_X_EXIT       equ     4cH
=  004D                   MS_X_WAIT       equ     4dH
=  004E                   MS_X_FIRST      equ     4eH
=  004F                   MS_X_NEXT       equ     4fH
=  0050                   MS_P_SETPSP     equ     50H
=  0054                   MS_F_GETVERIFY  equ     54H
=  0056                   MS_X_RENAME     equ     56H
=  0057                   MS_X_DATETIME   equ     57H
=  0058                   MS_M_STRATEGY   equ     58h
=  0059                   MS_F_ERROR      equ     59H
=  005A                   MS_X_MKTEMP     equ     5aH
=  005B                   MS_X_MKNEW      equ     5bH
=  005C                   MS_F_LOCK       equ     5cH
=  0060                   MS_X_EXPAND     equ     60H
=  0062                   MS_P_GETPSP     equ     62H
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   8


=  6601                   MS_X_GETCP      equ     6601h
=  6602                   MS_X_SETCP      equ     6602h
=  0067                   MS_X_SETHC      equ     67h
=  0068                   MS_X_COMMIT     equ     68h
=
=  0021                   DOS_INT     equ 21h ; DOS Entry Point
=                         ;
=  0000                   STDIN           equ     0       ; Standard Console Input Handle
=  0001                   STDOUT          equ     1       ; Standard Console Output Handle
=  0002                   STDERR          equ     2       ; Standard Error Output
=  0003                   STDAUX          equ     3       ; Auxilary Device Handle
=  0004                   STDPRN          equ     4       ; Printer Device Handle

=                                 include i:char.def
=                         ;    File              : $CHAR.DEF$
=                         ;
=                         ;    Description       :
=                         ;
=                         ;    Original Author   : DIGITAL RESEARCH
=                         ;
=                         ;    Last Edited By    : $CALDERA$
=                         ;
=                         ;-----------------------------------------------------------------------;
=                         ;    Copyright Work of Caldera, Inc. All Rights Reserved.
=                         ;      
=                         ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
=                         ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
=                         ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
=                         ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
=                         ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
=                         ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
=                         ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
=                         ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
=                         ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
=                         ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
=                         ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
=                         ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
=                         ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
=                         ;    CIVIL LIABILITY.
=                         ;-----------------------------------------------------------------------;
=                         ;
=                         ;    *** Current Edit History ***
=                         ;    *** End of Current Edit History ***
=                         ;
=                         ;    $Log$
=                         ;
=                         ;    ENDLOG
=                         ;************************************************;
=                         ;*                                              *;
=                         ;*            Character Definitions             *;
=                         ;*                                              *;
=                         ;************************************************;
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page   9


=
=  0001                   CTLA            equ     'A' - '@'
=  0002                   CTLB            equ     'B' - '@'
=  0003                   CTLC            equ     'C' - '@'
=  0004                   CTLD            equ     'D' - '@'
=  0005                   CTLE            equ     'E' - '@'
=  0006                   CTLF            equ     'F' - '@'
=  0007                   CTLG            equ     'G' - '@'
=  0007                   BELL            equ     'G' - '@'
=  0008                   CTLH            equ     'H' - '@'
=  0009                   CTLI            equ     'I' - '@'
=  0009                   TAB             equ     'I' - '@'
=  000A                   CTLJ            equ     'J' - '@'
=  000A                   LF              equ     'J' - '@'
=  000B                   CTLK            equ     'K' - '@'
=  000D                   CTLM            equ     'M' - '@'
=  000D                   CR              equ     'M' - '@'
=  0010                   CTLP            equ     'P' - '@'
=  0011                   CTLQ            equ     'Q' - '@'
=  0012                   CTLR            equ     'R' - '@'
=  0013                   CTLS            equ     'S' - '@'
=  0014                   CTLT            equ     'T' - '@'
=  0015                   CTLU            equ     'U' - '@'
=  0016                   CTLV            equ     'V' - '@'
=  0017                   CTLW            equ     'W' - '@'
=  0018                   CTLX            equ     'X' - '@'
=  0019                   CTLY            equ     'Y' - '@'
=  001A                   CTLZ            equ     'Z' - '@'
=  001B                   ESC             equ     '[' - '@'
=  001C                   CTLBS           equ     '\' - '@'
=  001F                   CTLUB           equ     '_' - '@'
=  001E                   CTLUP           equ     '^' - '@'
=  007F                   DEL             equ     07Fh
=  007F                   RUBOUT          equ     DEL
=
=  005E                   CTL             equ     '^'

=                                 include i:cmdline.equ
=                         ;    File              : $CMDLINE.EQU$
=                         ;
=                         ;    Description       :
=                         ;
=                         ;    Original Author   : DIGITAL RESEARCH
=                         ;
=                         ;    Last Edited By    : $CALDERA$
=                         ;
=                         ;-----------------------------------------------------------------------;
=                         ;    Copyright Work of Caldera, Inc. All Rights Reserved.
=                         ;      
=                         ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
=                         ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
=                         ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  10


=                         ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
=                         ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
=                         ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
=                         ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
=                         ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
=                         ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
=                         ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
=                         ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
=                         ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
=                         ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
=                         ;    CIVIL LIABILITY.
=                         ;-----------------------------------------------------------------------;
=                         ;
=                         ;    *** Current Edit History ***
=                         ;    *** End of Current Edit History ***
=                         ;
=                         ;    $Log$
=                         ;
=                         ;    ENDLOG
=
=  FFFE                   RL_INPUT        equ     word ptr -2[bp]         ; READ_LINE Input Handle
=  FFFC                   RL_OUTPUT       equ     word ptr -4[bp]         ; READ_LINE Output Handle
=  FFFA                   RL_BUFSEG       equ     word ptr -6[bp]         ; Retained line Segment
=  FFF8                   RL_BUFOFF       equ     word ptr -8[bp]         ; Retained line Offset
=  FFF8                   RL_BUFPTR       equ     dword ptr -8[bp]        ; Retained line Buffer
=  FFF6                   RL_INICOL       equ     word ptr -10[bp]        ; initial column
=  FFF4                   RL_FLAGS        equ     word ptr -12[bp]        ; Control Flags
=  FFF2                   RL_MAXLEN       equ     word ptr -14[bp]        ; Maximum Buffer Size
=  FFF0                   RL_KANJI        equ     word ptr -16[bp]                ; Kanji Character Buffer
=  FFEE                   RL_SAVMAX       equ     word ptr -18[bp]        ; Size of retained data
=  FFEC                   RL_SAVPOS       equ     word ptr -20[bp]        ; Current Position in data
=  FFEA                   RL_HIST_RECL    equ     word ptr -22[bp]        ; We recall from here
=  FFE8                   RL_HIST_SAVE    equ     word ptr -24[bp]        ; We save to here
=  FFE6                   RL_HIST_SIZE    equ     word ptr -26[bp]        ; buffer is this big
=  FFE4                   RL_HIST_SEG     equ     word ptr -28[bp]        ; buffer is at this segment
=  001C                   RL_LENGTH       equ     28
=
=  0001                   RLF_ENHANCED    equ     0000$0001b              ; Enhanced features are on
=  0002                   RLF_INS         equ     0000$0010b              ; Insert Flag
=  0004                   RLF_SEARCH      equ     0000$0100b              ; Search mode on
=  0008                   RLF_MATCH       equ     0000$1000b              ; We are matching a command
=  0010                   RLF_RECALLED    equ     0001$0000b              ; Line already recalled
=  0020                   RLF_DIRTY       equ     0010$0000b              ; Partial line needs saved
=  0040                   RLF_KANJI       equ     0100$0000b              ; RL_KANJI is valid
=  0080                   RLF_INROOT      equ     1000$0000b              ; In root
=
=  0001                   CHAR_SPACE      equ     0000$0001b      ; Space Character
=  0002                   CHAR_TAB        equ     0000$0010b      ; Tab Character
=  0004                   CHAR_CTL        equ     0000$0100b      ; Control Character expanded to "^X"
=  0008                   CHAR_KANJI      equ     0000$1000b      ; Japanese Kanji character
=  0010                   CHAR_ALPHAN     equ     0001$0000b      ; Alpha/Numeric
=  0020                   CHAR_OTHER      equ     0010$0000b      ; Non AlphaNumeric
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  11


=  0080                   CHAR_STD        equ     1000$0000b      ; Stored as a Byte displayed in 1 Col
=
=  008E                   CHAR_SIZE       equ     CHAR_STD or CHAR_KANJI or CHAR_TAB or CHAR_CTL
=  0031                   CHAR_ONECOL     equ     CHAR_SPACE or CHAR_OTHER or CHAR_ALPHAN

=                                 include i:reqhdr.equ
=                         ;    File              : $REQHDR.EQU$
=                         ;
=                         ;    Description       :
=                         ;
=                         ;    Original Author   : DIGITAL RESEARCH
=                         ;
=                         ;    Last Edited By    : $CALDERA$
=                         ;
=                         ;-----------------------------------------------------------------------;
=                         ;    Copyright Work of Caldera, Inc. All Rights Reserved.
=                         ;      
=                         ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
=                         ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
=                         ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
=                         ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
=                         ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
=                         ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
=                         ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
=                         ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
=                         ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
=                         ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
=                         ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
=                         ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
=                         ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
=                         ;    CIVIL LIABILITY.
=                         ;-----------------------------------------------------------------------;
=                         ;
=                         ;    *** Current Edit History ***
=                         ;    *** End of Current Edit History ***
=                         ;
=                         ;    $Log$
=                         ;
=                         ;    ENDLOG
=
=  0000                   CMD_INIT                equ      0      ; Initialize the Device Driver
=  0001                   CMD_MEDIA_CHECK         equ      1      ; Request Media Check
=  0002                   CMD_BUILD_BPB           equ      2      ; Build Drive BPB
=  0003                   CMD_INPUT_IOCTL         equ      3      ; IOCTL input
=  0004                   CMD_INPUT               equ      4      ; Input
=  0005                   CMD_INPUT_NOWAIT        equ      5      ; Non destructive input no wait
=  0006                   CMD_INPUT_STATUS        equ      6      ; Input status
=  0007                   CMD_INPUT_FLUSH         equ      7      ; Input flush
=  0008                   CMD_OUTPUT              equ      8      ; Output
=  0009                   CMD_OUTPUT_VERIFY       equ      9      ; Output with verify
=  000A                   CMD_OUTPUT_STATUS       equ     10      ; Output status
=  000B                   CMD_OUTPUT_FLUSH        equ     11      ; Output flush
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  12


=  000C                   CMD_OUTPUT_IOCTL        equ     12      ; IOCTL output
=  000D                   CMD_DEVICE_OPEN         equ     13      ; Device OPEN
=  000E                   CMD_DEVICE_CLOSE        equ     14      ; Device CLOSE
=  000F                   CMD_FIXED_MEDIA         equ     15      ; Removeable Media Check
=  0013                   CMD_GENERIC_IOCTL       equ     19      ; Generic IOCTL
=  0017                   CMD_GET_DEVICE          equ     23      ; Get the Logical Device
=  0018                   CMD_SET_DEVICE          equ     24      ; Set the Logical Device
=  0019                   CMD_QUERY_IOCTL         equ     25      ; query ioctl support
=
=                         ;       Generic Request Header Format
=
=  0000                   RH_LEN          equ     es:byte ptr 0[bx]
=  0001                   RH_UNIT         equ     es:byte ptr 1[bx]
=  0002                   RH_CMD          equ     es:byte ptr 2[bx]
=  0003                   RH_STATUS       equ     es:word ptr 3[bx]
=  0100                     RHS_DONE      equ     0100h
=  0200                     RHS_BUSY      equ     0200h
=  0400                     RHS_IC        equ     0400h                   ; Interim Character
=  0800                     RHS_RM        equ     0800h
=  8000                     RHS_ERROR     equ     8000h
=
=                         ;******
=                         ;* No longer safe to use - some device drivers trample on them....
=                         ;*
=                         ;* RH_STRATEGY  equ     es:dword ptr 5[bx]      ; Device Strategy Routine
=                         ;* RH_STRATOFF  equ     es:word ptr  5[bx]      ; Strategy Offset
=                         ;* RH_STRATSEG  equ     es:word ptr  7[bx]      ; Strategy Segment
=                         ;* RH_INTERRUPT equ     es:dword ptr 9[bx]      ; Device Interrupt Routine
=                         ;* RH_INTOFF    equ     es:word ptr  9[bx]      ; Intterupt Offset
=                         ;* RH_INTSEG    equ     es:word ptr 11[bx]      ; Interrupt Segment
=                         ;*****
=
=                         ;       Request header for initialization
=
=  000D                   RH0_NUNITS      equ     es:byte ptr 13[bx]
=  000E                   RH0_RESIDENT    equ     es:word ptr 14[bx]
=  0012                   RH0_BPBOFF      equ     es:word ptr 18[bx]
=  0014                   RH0_BPBSEG      equ     es:word ptr 20[bx]
=  0016                   RH0_DRIVE       equ     es:byte ptr 22[bx]
=  0016                   RH0_LEN         equ     22
=
=                         ;       Request header for media check
=
=  000D                   RH1_MEDIA       equ     es:byte ptr 13[bx]      ; BDOS: current media byte
=  000E                   RH1_RETURN      equ     es:byte ptr 14[bx]      ; driver: return code (00, 01, FF)
=  000F                   RH1_VOLID       equ     es:dword ptr 15[bx]     ; driver: volume label address
=  000F                   RH1_LEN         equ     15
=
=                         ;       Request header for "build BPB"
=
=  000D                   RH2_MEDIA       equ     es:byte ptr 13[bx]      ; BDOS or driver?
=  000E                   RH2_BUFFER      equ     es:dword ptr 14[bx]     ; BDOS: scratch buffer for driver use
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  13


=  0012                   RH2_BPB         equ     es:dword ptr 18[bx]     ; same as the following:
=  0012                   RH2_BPBOFF      equ     es:word ptr 18[bx]      ; driver: address of new BPB
=  0014                   RH2_BPBSEG      equ     es:word ptr 20[bx]
=  0018                   RH2_LEN         equ     24
=
=                         ;       Request header for input/output
=
=  000D                   RH4_MEDIA       equ     es:byte ptr 13[bx]      ; BDOS: current media byte
=  000D                   RH4_RIC         equ     es:byte ptr 13[bx]      ; BDOS: Return Interim Char flg
=  000E                   RH4_BUFFER      equ     es:dword ptr 14[bx]     ; BDOS: disk transfer address
=  000E                   RH4_BUFOFF      equ     es:word ptr 14[bx]      ; BDOS: Buffer Offset
=  0010                   RH4_BUFSEG      equ     es:word ptr 16[bx]      ; BDOS: Buffer Segment
=  0012                   RH4_COUNT       equ     es:word ptr 18[bx]      ; BDOS: sector count
=  0014                   RH4_SECTOR      equ     es:word ptr 20[bx]      ; BDOS: starting sector
=  0016                   RH4_VOLID       equ     es:dword ptr 22[bx]     ; driver: volume if illegal disk change
=  001A                   RH4_BIGSECTOR   equ es:dword ptr 26[bx] 
=  001A                   RH4_BIGSECTORLO equ     es:word ptr 26[bx]
=  001C                   RH4_BIGSECTORHI equ     es:word ptr 28[bx]
=
=  001E                   RH4_LEN         equ     30
=
=                         ;       Request Header for Non-Destructive Input
=
=  000D                   RH5_CHAR        equ     es:byte ptr 13[bx]      ; Character Read from Device
=  000D                   RH5_RIC         equ     es:byte ptr 13[bx]      ; BDOS: Return Interim Char flg
=  000E                   RH5_LEN         equ     14
=
=                         ;       Request Header for Device Open
=
=  000D                   RH13_LEN        equ     13
=
=                         ;       Request Header for Device Close
=
=  000D                   RH14_LEN        equ     13
=
=                         ;       Request header for generic IOCTL
=
=  000D                   RH19_CATEGORY   equ     es:word ptr 13[bx]      ; BDOS: major/minor function number
=  000D                   RH19_MAJOR      equ     es:byte ptr 13[bx]      ; BDOS: Major Function Number
=  000E                   RH19_MINOR      equ     es:byte ptr 14[bx]      ; BDOS: Minor Function Number
=  000F                   RH19_SI         equ     es:word ptr 15[bx]      ; BDOS: User SI 
=  0011                   RH19_DI         equ     es:word ptr 17[bx]      ; BDOS: User DI 
=  0013                   RH19_GENPB      equ     es:dword ptr 19[bx]     ; BDOS: extra parameters
=  0017                   RH19_LEN        equ     23
=
=  0040                   RQ19_SET        equ     40h             ; set device parameters
=  0060                   RQ19_GET        equ     60h             ; get device parameters
=  0041                   RQ19_WRITE      equ     41h             ; write tracks
=  0061                   RQ19_READ       equ     61h             ; read tracks
=  0042                   RQ19_FORMAT     equ     42h             ; format tracks
=  0062                   RQ19_VERIFY     equ     62h             ; verify tracks
=
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  14


=  004C                   RQ19_PRP_START  equ     4Ch             ; start of codepage prepare
=  004D                   RQ19_PRP_END    equ     4Dh             ; end of codepage prepare
=  004A                   RQ19_SELECT     equ     4Ah             ; select code page
=  006A                   RQ19_QRY_SEL    equ     6Ah             ; query selected code page
=  006B                   RQ19_QRY_PRP    equ     6Bh             ; query prepared code page(s)
=  005F                   RQ19_DSP_SET    equ     5Fh             ; set display information
=  007F                   RQ19_DSP_GET    equ     7Fh             ; get display information
=
=                         ;       Request header for get/set drive
=
=  000E                   RH24_CMD        equ     es:byte ptr 14[bx]      ; BDOS: Command Code
=  000F                   RH24_STATUS     equ     es:word ptr 15[bx]      ; BDOS: Status
=  0011                   RH24_RESVD      equ     es:dword ptr 17[bx]     ; BDOS: Reserved
=  0015                   RH24_LEN        equ     21
=
=  001E                   RH_SIZE         equ     30              ; maximum size of request header

=                                 include i:driver.equ
=                         ;    File              : $DRIVER.EQU$
=                         ;
=                         ;    Description       :
=                         ;
=                         ;    Original Author   : DIGITAL RESEARCH
=                         ;
=                         ;    Last Edited By    : $CALDERA$
=                         ;
=                         ;-----------------------------------------------------------------------;
=                         ;    Copyright Work of Caldera, Inc. All Rights Reserved.
=                         ;      
=                         ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
=                         ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
=                         ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
=                         ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
=                         ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
=                         ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
=                         ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
=                         ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
=                         ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
=                         ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
=                         ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
=                         ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
=                         ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
=                         ;    CIVIL LIABILITY.
=                         ;-----------------------------------------------------------------------;
=                         ;
=                         ;    *** Current Edit History ***
=                         ;    *** End of Current Edit History ***
=                         ;
=                         ;    $Log$
=                         ;
=                         ;    ENDLOG
=                         ; Device driver header offsets.
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  15


=
=
=  0000                   DH_NEXT         equ     es:dword ptr 0          ; Dword Pointer to Next DEV
=  0000                   DH_NEXTOFF      equ     es:word ptr 0           ; Offset of next device
=  0002                   DH_NEXTSEG      equ     es:word ptr 2           ; Segment of next device
=  0004                   DH_ATTRIB       equ     es:word ptr 4           ; device attribute bits
=  0006                   DH_STRATEGY     equ     es:word ptr 6           ; offset of strategy entry
=  0008                   DH_INTERRUPT    equ     es:word ptr 8           ; offset of interupt entry
=  000A                   DH_NAME         equ     es:byte ptr 10          ; 8-BYTE device name
=
=  8000                   DA_CHARDEV      equ     8000h           ; 1=character device, 0=block device
=  4000                   DA_IOCTL        equ     4000h           ; device supports IOCTL string I/O
=  2000                   DA_NONIBM       equ     2000h           ; dosen't require FAT for login
=  2000                   DA_OTILBSY      equ     2000h           ; supports "output until busy"
=  0800                   DA_REMOVE       equ     0800h           ; supports "removable media" check
=  0080                   DA_QUERY        equ     0080h           ; supports query ioctl
=  0040                   DA_GETSET       equ     0040h           ; supports 3.2 level functionality
=  0010                   DA_SPECIAL      equ     0010h           ; fast console ouput via INT 29h
=  0008                   DA_ISCLK        equ     0008h           ; device is current clock device
=  0004                   DA_ISNUL        equ     0004h           ; device is NUL device (reserved)
=  0002                   DA_BIGDRV       equ     0002h           ; supports > 65535 sector per drive
=  0002                   DA_ISCOT        equ     0002h           ; device is standard output device
=  0001                   DA_ISCIN        equ     0001h           ; device is standard input device
=
=  0029                   FASTCON_INT     equ     29h             ; fast console output interrupt
=



                          PCM_CODE        CSEG    BYTE
                                  public  read_line, edit_size

                                  extrn   dbcs_lead:near
                                  extrn   cmdline_read:near
                                  extrn   raw_read:near
                                  extrn   cooked_write:near
                                  extrn   get_dseg:near
                                  extrn   device_driver:near

                          ; WARNING - the following routines are to support history buffers
                          ; As these are optional we muset NEVER call these routines unless
                          ; the HISTORY_ON bit is set in @hist_flag.

                                  extrn   init_history:near
                                  extrn   save_history:near
                                  extrn   prev_cmd:near
                                  extrn   next_cmd:near
                                  extrn   match_cmd:near
                                  extrn   search_cmd:near
                                  extrn   match_word:near
                                  extrn   del_cur_history_buffer:near
                                  extrn   del_history_buffers:near
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  16


                                  extrn   goto_eol:near
                                  extrn   next_word:near
                                  extrn   prev_word:near
                                  extrn   del_bol:near
                                  extrn   deln_word:near

                          ; The following are public for HISTORY.PCM
                                  public  next_char, save_line
                                  public  space_out, bs_out, put_string
                                  public  goto_bol
                                  public  del_eol, del_line
                                  public  char_info
                                  public  prev_w20
                                  public  deln_w10


                          ;       READ_LINE will read an editted line from the handle passed in BX
                          ;       into a buffer with the following format:-
                          ;
                          ;       BYTE    Maximum String Length
                          ;       BYTE    Current String Length
                          ;       BYTE(s) String Buffer
                          ;
                          ;       On Entry:-
                          ;               BX              Input Handle
                          ;               CX              Output Handle
                          ;               ES:DX           Buffer Address
                          ;
                          ;       On Exit:-
                          ;               String input by user
                          ;
                          ;       The following conventions apply for the READ_LINE function
                          ;
                          ;       ES      Buffer segment
                          ;       SI      Current cursor location in buffer (Index)
                          ;       DX      Last Character in Buffer (Index)
                          ;
   0080                   DISABLE         equ     80h     ; Disable when advanced editing is off.
   8000                   DISABLE_MASK    equ     8000h
   0001                   ESC_CODE        equ     01h     ; Scan code must be preceeded by escape byte.
   0000                   NESC_CODE       equ     00h     ; No lead zero needed.

                          read_line:
 0000 55                          push    bp                      ; Save the Stack Frame Pointer
 0001 8BEC                        mov     bp,sp                   ; Intialise it to the top of the
 0003 83EC1C                      sub     sp,RL_LENGTH            ; READ_LINE control block and reserve
                                                                  ; control block
 0006 895EFE                      mov     RL_INPUT,bx             ; Initialize the INPUT Handle
 0009 894EFC                      mov     RL_OUTPUT,cx            ; the OUTPUT Handle
 000C 4242                        inc dx ! inc dx                 ; Skip max and Returned Length
 000E 8956F8                      mov     RL_BUFOFF,dx            ; and save the buffer offset
 0011 8C46FA                      mov     RL_BUFSEG,es            ;  and segment
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  17


 0014 33C0                        xor     ax,ax                   ; now we zero
 0016 8946EC                      mov     RL_SAVPOS,ax            ;  both position in it
 0019 8946EE                      mov     RL_SAVMAX,ax            ;  and it's size
 001C A00000       E              mov     al,column
 001F 8946F6                      mov     RL_INICOL,ax            ; save initial column
 0022 A10000       E              mov     ax,cle_state            ; use to set initial editing state
 0025 25C7FF                      and     ax,not (RLF_MATCH+RLF_DIRTY+RLF_RECALLED)
 0028 8946F4                      mov     RL_FLAGS,ax             ; save in flags
 002B A90100                      test    ax,RLF_ENHANCED
 002E 7405           0035          jz     read_line10
 0030 E80000       E              call    init_history            ;  setup the history buffers
 0033 EB05           003A         jmps    read_line20
                          read_line10:
 0035 8166F4FDFF                  and     RL_FLAGS,not RLF_INS    ; clear insert mode
                          read_line20:
 003A 8BFA                        mov     di,dx                   ; di -> buffer
 003C 33DB                        xor     bx,bx
 003E 260A5DFE                    or      bl,es:byte ptr -2[di]   ; Get the Maximum number of chars
 0042 895EF2                      mov     RL_MAXLEN,bx            ; and save for later
 0045 7528           006F          jnz    read_line30             ; make sure some chars are requested
 0047 EB22           006B         jmps    ret_string10            ; if no chars just return
                                  
                          ret_string:
 0049 58                          pop     ax                      ; Remove local return address
 004A 8B46F4                      mov     ax,RL_FLAGS             ; get command line editor state
 004D A30000       E              mov     cle_state,ax            ;  save state for next time
 0050 8B7EF8                      mov     di,RL_BUFOFF            ; Get the buffer Offset
 0053 268855FF                    mov     es:byte ptr -1[di],dl   ; Return the number of characters
 0057 52                          push    dx                      ; Save length of entry
 0058 03FA                        add     di,dx                   ; Point to the end of the buffer
 005A B00D                        mov     al,CR
 005C AA                          stosb                           ; Save CR
 005D E87C04         04DC         call    write_char              ; Print a CR and return to the user
 0060 5A                          pop     dx
 0061 F746F40100                  test    RL_FLAGS,RLF_ENHANCED   ; Do not add to history if in
 0066 7403           006B          jz     ret_string10            ; compatibility mode
 0068 E80000       E              call    save_history            ; Save state of history buffer
                          ret_string10:
 006B 8BE5                        mov     sp,bp                   ; Remove READ_LINE control Block
 006D 5D                          pop     bp                      ; Restore BP and return to the caller
 006E C3                          ret


                          read_line30:
 006F 33F6                        xor     si,si                   ; Currently at start of buffer
 0071 8BD6                        mov     dx,si                   ; with an empty buffer.

 0073 33DB                        xor     bx,bx
 0075 260A5DFF                    or      bl,es:byte ptr -1[di]   ; Check if the buffer contains any
 0079 7408           0083          jz     read_line40             ; data which is terminated by a CR
 007B 2680390D                    cmp     es:byte ptr [bx+di],CR
 007F 7502           0083          jnz    read_line40
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  18


 0081 8BD3                        mov     dx,bx
                          read_line40:
 0083 E84803         03CE         call    save_line               ; Update Save Buffer variables
 0086 8BD6                        mov     dx,si
                          ;
                          ; This is out main command loop - we get a character and try to match it
                          ; with a command in our edit_table. If History is on we look at commands
                          ; with the DISABLED bit set ie. enhanced commands.
                          ; It a match isn't found we insert the character in the buffer, and optionally
                          ; try to match with previous lines in the history buffer.
                          ;
                          read_line_loop:
 0088 8166F4BFFF                  and     RL_FLAGS,not RLF_KANJI  ; initial flags
 008D E86604         04F6         call    get_char                ; read the first character (AH Esc Flg)

 0090 2E8B0E0100   R              mov     cx,edit_size            ; now scan the control table looking
 0095 BB0300       R              mov     bx,offset edit_table    ;  for a match
                          read_ll_next_cmd:
 0098 25FF7F                      and     ax,not DISABLE_MASK     ; assume normal function
 009B F746F40100                  test    RL_FLAGS,RLF_ENHANCED   ; compatibilty required? then it
 00A0 740A           00AC          jz     read_ll10               ;  has to be a normal function
 00A2 2EF7070080                  test    EDIT_CNTRL,DISABLE_MASK ; history enabled, so we make
 00A7 7403           00AC          jz     read_ll10               ;  our code match DISABLE mask
 00A9 0D0080                      or      ax,DISABLE_MASK         ;  of table entry
                          read_ll10:
 00AC 2E3B07                      cmp     ax,EDIT_CNTRL           ; check for a match (Escape Flag
 00AF 7430           00E1          je     read_ll_found_cmd       ;  and the character)
 00B1 83C304                      add     bx,EDIT_LEN             ; Add the entry length
 00B4 E2E2           0098         loop    read_ll_next_cmd        ; and scan the whole table

                          ; We have failed to find a command so insert char in buffer

 00B6 F6C401                      test    ah,ESC_CODE             ; Ignore non-matched escaped keys
 00B9 75CD           0088          jnz    read_line_loop

 00BB E82C00         00EA         call    save_char               ; not an command so save the character
 00BE 814EF42000                  or      RL_FLAGS,RLF_DIRTY      ;  and remember we have something new

                          ; Are we in search mode ?

 00C3 F746F40100                  test    RL_FLAGS,RLF_ENHANCED   ; Compatibilty required?  
 00C8 74BE           0088          jz     read_line_loop
 00CA F746F40C00                  test    RL_FLAGS,RLF_SEARCH+RLF_MATCH
 00CF 74B7           0088          jz     read_line_loop          ; is searching/matching on ?
 00D1 56                          push    si                      ; save current offset
 00D2 E80000       E              call    search_cmd
 00D5 58                          pop     ax                      ; this is our target offset
                          read_ll20:
 00D6 3BC6                        cmp     ax,si                   ; are we there yet ?
 00D8 73AE           0088          jae    read_line_loop
 00DA 50                          push    ax                      ; no, keep rewinding cursor
 00DB E83B01         0219         call    prev_char               ;  until we reach position
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  19


 00DE 58                          pop     ax                      ;  before we tried to match
 00DF EBF5           00D6         jmps    read_ll20

                          read_ll_found_cmd:                      ; get the address of the corresponding
 00E1 2E8B4F02                    mov     cx,EDIT_FUNC            ;  function from the table      
 00E5 FFD1                        call    cx                      ;  execute the correct function
 00E7 EB9F           0088         jmps    read_line_loop          ;  and go back for next character

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  20


                          eject
                          ;
                          ;       the SAVE_CHAR routine will write the character in AL into 
                          ;       the buffer in memory and then update the screen image. The
                          ;       RLF_INS flag is used to determine if INSERT is active.
                          ;
                          save_c10:
 00E9 C3                          ret

                          save_char:
 00EA 80FCFF                      cmp     ah,TRUE                 ; Ignore any un-matched escape 
 00ED 74FA           00E9         jz      save_c10                ; sequences
 00EF E8BB00         01AD         call    save_kanji              ; Test if AL is a Kanji Character
                                                                  ; and setup up the parameter blocks
                                                                  ; for the INTSAVE_CHAR routine
                          ;
                          ;       INTSAVE_CHAR is the internal entry point to the Character Save
                          ;       routine. It assumes the following:-
                          ;
                          ;       On Entry:-      AX(AL)      Contains the character
                          ;                       CX          the new character length in bytes
                          ;                       RLF_KANJI   Flag is set for a Kanji Character
                          ;                       RL_KANJI    Contains the kanji charater
                          ;                       
                          intsave_char:
 00F2 8BD9                        mov     bx,cx
 00F4 F746F40200                  test    RL_FLAGS,RLF_INS        ; Overwrite the character in the
 00F9 7561           015C          jnz    save_c50                ; buffer currently
 00FB 03DE                        add     bx,si                   ; Add the current index to the character
 00FD 3B5EF2                      cmp     bx,RL_MAXLEN            ; size and compare against the buffer len
 0100 7355           0157          jae    bell_char               ; Full ? Yes Ring dat Bell !

 0102 3BD6                        cmp     dx,si                   ; Are we at the end of the line
 0104 7509           010F          jnz    intsave_c10             ; No so check character types
 0106 5051                        push ax ! push cx
 0108 E8CD01         02D8         call    skip_one_char           ; Skip the coresponding character in
 010B 5958                        pop cx ! pop ax                 ; the save buffer
 010D EB19           0128         jmps    simple_save

                          intsave_c10:
 010F 50                          push    ax                      ; Save the Input Character
 0110 E8FC02         040F         call    char_type               ; Get the character type
 0113 8BD8                        mov     bx,ax                   ; and save in BX
 0115 268A05                      mov     al,es:[di]              ; get the byte to be replaced
 0118 E8F402         040F         call    char_type               ; and get its type
 011B 80E48E                      and     ah,CHAR_SIZE            ; Mask the Character SIZE attributes
 011E 80E78E                      and     bh,CHAR_SIZE            ; and check both storage and display
                                                                  ; sizes are the same for old and new
 0121 3AE7                        cmp     ah,bh                   ; and do simple save if the character
 0123 58                          pop     ax                      ; Restore the input character to AX(AL)
 0124 7518           013E          jnz    save_c30                ; type match
 0126 2BD1                        sub     dx,cx                   ; Character overwritten so prevent
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  21


                                                                  ; Max Index being incremented

                          simple_save:
 0128 03F1                        add     si,cx                   ; Assume at the EOL
 012A 03D1                        add     dx,cx
 012C AA                          stosb                           ; Save the character typed
 012D F746F44000                  test    RL_FLAGS,RLF_KANJI      ; is this a Kanji character
 0132 7407           013B          jz     simple_s10              ; No so just output 1 character
 0134 E88C03         04C3         call    put_char                ; and echo it to the user
 0137 8A46F1                      mov     al,byte ptr RL_KANJI+1  ; Get the high byte of the Kanji
 013A AA                          stosb                           ; character save and then display it.
                          simple_s10:
 013B E98503         04C3         jmp     put_char
                          ;       ret

                          ;
                          ;       The SAVE_C30 function supports the Complex overwrite conditions
                          ;       where the size of the character in memory or on the display do not
                          ;       match with those of the present incumbent. eg a SPACE character
                          ;       overwriting a TAB or a KANJI character overwriting a SPACE.
                          ;
                          ;       To minimize the complexity of the code the character to be 
                          ;       overwritten is deleted and the new character then inserted.
                          ;       This is not an optimal solution but drastically reduces the
                          ;       amount of code required.
                          ;
                          save_c30:
 013E 5051                        push ax ! push cx
 0140 E82201         0265         call    deln_char
 0143 5958                        pop cx ! pop ax
 0145 3BD6                        cmp     dx,si
 0147 74DF           0128          jz     simple_save
 0149 814EF40200                  or      RL_FLAGS,RLF_INS
 014E E80B00         015C         call    save_c50
 0151 8166F4FDFF                  and     RL_FLAGS,not RLF_INS
 0156 C3                          ret

                          bell_char:
 0157 B007                        mov     al,BELL
 0159 E98003         04DC         jmp     write_char
                          ;
                          ;       This code is called when INSERT mode is active and a 
                          ;       character (possibly Kanji) is to be inserted in the buffer
                          ;
                          ;       On Entry:-      CX          the new character length in bytes
                          ;
                          save_c50:
 015C 8BD9                        mov     bx,cx                   ; Save new character length
 015E 03CA                        add     cx,dx                   ; Add the current max to the character
 0160 3B4EF2                      cmp     cx,RL_MAXLEN            ; size and compare against the buffer len
 0163 73F2           0157          jae    bell_char               ; Full ? Yes Ring dat Bell !
 0165 8BCB                        mov     cx,bx                   ; Restore Character Length
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  22


 0167 3BD6                        cmp     dx,si                   ; If we are at the end of the line
 0169 74BD           0128          je     simple_save             ; Use the simple save code
                          ;
                          ;       Create space in the current buffer for the new character
                          ;
 016B 1E                          push ds
 016C 5657                        push si ! push di
 016E 8BCA2BCE                    mov cx,dx ! sub cx,si           ; CX -> Number of bytes to move
 0172 8BFA037EF8                  mov di,dx ! add di,RL_BUFOFF    ; DI -> End of Destination Offset
 0177 03FB4F                      add di,bx ! dec di              ;    -> + Insert Char len - 1
 017A 8BF72BF3                    mov si,di ! sub si,bx           ; SI -> DI - Insert Char Len
 017E 061F                        push es ! pop ds                ; DS == ES
 0180 FD                          std                             ; Make the right amount of space in
 0181 F3A4                        rep     movsb                   ; the buffer    
 0183 FC                          cld
 0184 5F5E                        pop di ! pop si
 0186 1F                          pop     ds

 0187 03D3                        add     dx,bx                   ; Update the Buffer Length
 0189 AA                          stosb                           ; Save the New character
 018A F746F44000                  test    RL_FLAGS,RLF_KANJI      ; Check if this was a Kanji Character
 018F 7403           0194          jz     save_c60                ; No
 0191 86C4AA                      xchg al,ah ! stosb              ; Yes Save high byte

                          save_c60:
 0194 8BCA2BCE                    mov cx,dx ! sub cx,si           ; Display the updated string
 0198 03F356                      add si,bx ! push si             ; Save the Updated Index
 019B 8BF72BF3                    mov si,di ! sub si,bx           ; Get the offset of the new char
 019F E81103         04B3         call    put_string              ; in the buffer and display all
 01A2 5E                          pop     si                      ; Restore the new index
 01A3 87FA                        xchg    di,dx                   ; and calculate the number of BS
 01A5 E8D602         047E         call    calc_chars              ; characters required to get back
 01A8 87FA                        xchg    di,dx
 01AA E9FA02         04A7         jmp     bs_out
                          ;
                          ;       On Entry:       AL      First byte of Character
                          ;
                          ;       On Exit:        AX      Complete Character Code
                          ;                       CX      Character Size Bytes
                          ;                       RL_KANJI and RLF_KANJI set correctly
                          ;
                          save_kanji:
 01AD 8166F4BFFF                  and     RL_FLAGS,not RLF_KANJI
 01B2 8946F0                      mov     RL_KANJI,ax             ; Save the Character
 01B5 E85702         040F         call    char_type               ; Is this the first byte of a 
 01B8 F6C408                      test    ah,CHAR_KANJI           ; two byte Kanji character
 01BB B90100                      mov     cx,1                    ; Character size in bytes
 01BE 7411           01D1          jz     save_k10                ; No
 01C0 814EF44000                  or      RL_FLAGS,RLF_KANJI      ; Set internal Flag
 01C5 E82E03         04F6         call    get_char                ; Get the high byte and save
 01C8 8846F1                      mov     byte ptr RL_KANJI+1,al  ; in the local variable
 01CB 8B46F0                      mov     ax,RL_KANJI             ; Get the complete character
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  23


 01CE B90200                      mov     cx,2                    ; Character size in bytes
                          save_k10:
 01D1 C3                          ret

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  24


                          eject
                          ;
                          ;       The following group of functions modify the flags which control
                          ;       the command line editor.
                          ;
                          toggle_ins:
 01D2 8176F40200                  xor     RL_FLAGS,RLF_INS        ; Toggle the OverWrite/Insert
 01D7 C3                          ret                             ; Flag

                          toggle_search:
 01D8 8166F4F7FF                  and     RL_FLAGS,not RLF_MATCH  ; clear match bit
 01DD 8176F40400                  xor     RL_FLAGS,RLF_SEARCH     ; Toggle the Search on/off flag
 01E2 C3                          ret

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  25


                          eject
                          ;
                          ;       This group of functions moves the cursor along the display
                          ;       as well as updating the local variables.
                          ;
                          goto_bol:
 01E3 85F6                        test    si,si                   ; Move the cursor to the begining of
 01E5 740F           01F6          jz     goto_b10                ; the displayed line
 01E7 8BFE                        mov     di,si                   ; Set the buffer index to the
 01E9 33F6                        xor     si,si                   ; start of the line and the current 
 01EB E89002         047E         call    calc_chars              ; location
 01EE E8B602         04A7         call    bs_out
 01F1 33F6                        xor     si,si
 01F3 8B7EF8                      mov     di,RL_BUFOFF
                          goto_b10:
 01F6 C3                          ret

                          next_char:
 01F7 3BF2                        cmp     si,dx
 01F9 7503           01FE          jnz    next_c05                ; Treat this as "F1" when we at the
 01FB E92501         0323         jmp     copy_char               ; end of the line

                          next_c05:
 01FE 268A05                      mov     al,es:[di]              ; Get the Offset of the next character
 0201 B90100                      mov     cx,1                    ; the character itself and assume
 0204 E80802         040F         call    char_type               ; it is 1 byte long
 0207 F6C4087401     020D         test ah,CHAR_KANJI ! jz next_c10
 020C 41                          inc     cx
                          next_c10:
 020D 87F7                        xchg    si,di                   ; Get the string offset in SI
 020F E8A102         04B3         call    put_string              ; display the character and
 0212 87F7                        xchg    si,di                   ; restore the register contents
 0214 03F1                        add     si,cx
 0216 03F9                        add     di,cx
 0218 C3                          ret

                          prev_char:
 0219 85F6                        test    si,si                   ; begining of line ?
 021B 742B           0248          jz     prev_w30
 021D 525657                      push dx ! push si ! push di
 0220 8B76F8                      mov     si,RL_BUFOFF            ; Scan from the begining of the buffer
 0223 8BD6                        mov     dx,si                   ; keeping the last match in DX
                          prev_c10:
 0225 E82B02         0453         call    char_info               ; Get the character information
 0228 3BF7                        cmp     si,di                   ; Stop when we get to the current
 022A 7404           0230          je     prev_w20                ; character location
 022C 8BD6                        mov     dx,si                   ; Save current location
 022E EBF5           0225         jmps    prev_c10                ; and repeat

                          prev_w20:
 0230 2BF2                        sub     si,dx                   ; Calculate character length
 0232 56                          push    si                      ; save for update
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  26



 0233 2B7EF8                      sub     di,RL_BUFOFF            ; Convert Offset to Index
 0236 F7DE03F7                    neg si ! add si,di              ; Set the buffer index to the current
 023A E84102         047E         call    calc_chars              ; location and the previous character
 023D E86702         04A7         call    bs_out                  ; BackSpace over character
 0240 59                          pop     cx                      ; Restore the character size
 0241 5F5E5A                      pop di ! pop si ! pop dx
 0244 2BF1                        sub     si,cx                   ; Update the Index and Pointer
 0246 2BF9                        sub     di,cx                   ; variables.
                          prev_w30:
 0248 C3                          ret

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  27


                          eject
                          ;
                          ;       This group of functions deletes characters or groups of characters
                          ;       from the buffer.
                          ;

                          delf_char:              
 0249 3BF2                        cmp     si,dx                   ; any chars to our right ?
 024B 7218           0265          jb     deln_char               ;  yes, delete them first
 024D E98800         02D8     jmp skip_one_char      
                          ;       ret                             ;  discard next saved char

                          del_eol:
 0250 8BCA2BCE                    mov cx,dx ! sub cx,si           ; Calculate the number of bytes to 
 0254 E304           025A         jcxz    del_eol10               ; delete and jump to DELN_WORD if
 0256 03CF                        add     cx,di                   ; non zero. Convert to an offset
 0258 EB1E           0278         jmps    deln_w10                ; and jmp to common code.       
                          del_eol10:
 025A C3                          ret

                          delp_char:
 025B 0BF674FB       025A         or si,si ! jz del_eol10         ; Ignore if the user is at the start 
 025F E89900         02FB         call    back_one_char           ; of the line otherwise move back one
 0262 E8B4FF         0219         call    prev_char               ; character in the line buffer


                          deln_char:
 0265 3BD674F1       025A         cmp dx,si ! jz del_eol10
 0269 268A05                      mov     al,es:[di]              ; Get the Offset of the next character
 026C 8D4D01                      lea     cx,1[di]                ; the character itself and assume
 026F E89D01         040F         call    char_type               ; it is 1 byte long
 0272 F6C4087401     0278         test ah,CHAR_KANJI ! jz deln_w10
 0277 41                          inc     cx
                          ;       jmps    deln_w10

                          ;
                          ;       The 3 delete functions come together at this point with the standard
                          ;       register format Plus CX is the offset of the first character not to
                          ;       be deleted.
                          ;
                          deln_w10:
 0278 51                          push    cx                      ; Save Delete Offset
 0279 87FA                        xchg    di,dx                   ; Determine the no of characters
 027B E80002         047E         call    calc_chars              ; displayed to the end of the line
 027E 87FA                        xchg    di,dx
 0280 8BD9                        mov     bx,cx                   ; Save the Column count
 0282 58                          pop     ax                      ; restore the delete offset

 0283 5353                        push bx ! push bx               ; Save the count twice

 0285 5657                        push si ! push di
 0287 8BCA2BCE                    mov cx,dx ! sub cx,si           ; No of chars from old EOL
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  28


 028B 8BF0                        mov     si,ax                   ; Get the Source Offset
 028D 2BC7                        sub     ax,di                   ; calculate its length.
 028F 2BD0                        sub     dx,ax                   ; Update the string length

 0291 2BC8                        sub     cx,ax                   ; Number of chars to copy
 0293 1E                          push    ds                      ; Move the contents of the
 0294 061F                        push es ! pop ds                ; string down in memory and
 0296 F3A4                        rep     movsb                   ; then update the screen image
 0298 1F                          pop     ds
 0299 5E5F                        pop si ! pop di                 ; Get the current buffer offset
                                                                  ; Restore SWAPPED SI <-> DI

 029B 8BCA                        mov     cx,dx                   ; Calculate the length of the
 029D 2BCF                        sub     cx,di                   ; string and print it alll
 029F E81102         04B3         call    put_string
 02A2 87F7                        xchg    si,di                   ; Restore SI and DI

 02A4 E307           02AD          jcxz   deln_w20
 02A6 87FA                        xchg    di,dx                   ; Calculate the number of columns
 02A8 E8D301         047E         call    calc_chars              ; displayed
 02AB 87FA                        xchg    di,dx

                          deln_w20:
 02AD 5B                          pop     bx                      ; Restore the original line length
 02AE 2BD9                        sub     bx,cx                   ; and calculate the number of spaces
 02B0 8BCB                        mov     cx,bx                   ; required to overwrite the data
 02B2 E8EE01         04A3         call    space_out

 02B5 59                          pop     cx                      ; Finally move the cursor back to
 02B6 E9EE01         04A7         jmp     bs_out                  ; its correct place 




                          ;
                          ;       Delete the contents of the complete line
                          ;
                          del_line:
 02B9 C746EC0000                  mov     RL_SAVPOS,0             ; Reset the buffer index
 02BE 85D2                        test    dx,dx
 02C0 7415           02D7          jz     del_l10
 02C2 E81EFF         01E3         call    goto_bol                ; Jump to the begining of the line
 02C5 8BFA                        mov     di,dx                   ; calculate the number of display
 02C7 E8B401         047E         call    calc_chars              ; columns it currently takes up
 02CA E8D601         04A3         call    space_out               ; Overwrite with spaces
 02CD E8D701         04A7         call    bs_out                  ; Move back to the start of the line
 02D0 33F6                        xor     si,si                   ; and update all the initial variables
 02D2 8BD6                        mov     dx,si
 02D4 8B7EF8                      mov     di,RL_BUFOFF
                          del_l10:
 02D7 C3                          ret

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  29


                          eject
                          ;
                          ;       The following routines manipulate the SAVE Buffer data. Which
                          ;       is initialised on entry to this function.
                          ;
                          ;       SKIP_ONE_CHAR increments the Save Buffer control variables and
                          ;       returns the number of bytes skipped in CX.
                          ;
                          ;       On Entry:       Standard Registers
                          ;
                          ;       On Exit:        AX      Next Character in Buffer
                          ;                       CX      Character Size (Bytes)
                          ;
                          skip_one_char:
 02D8 33C9                        xor     cx,cx                   
 02DA 8B5EEC                      mov     bx,RL_SAVPOS            ; Update the Save Buffer variables
 02DD 3B5EEE                      cmp     bx,RL_SAVMAX            ; Check the current save buffer is
 02E0 7315           02F7          jae    soc_20                  ; valid and has not been exhausted.
                                                                  ; Otherwise increment the RL_SAVPOS
 02E2 BB0000       E              mov     bx,offset savbuf        ; pointer by one character. This 
 02E5 035EEC                      add     bx,RL_SAVPOS            ; means that the RL_SAVPOS can be 
 02E8 8A07                        mov     al,ds:[bx]              ; incremented by 1 or 2 depending on 
 02EA E82201         040F         call    char_type               ; the contents of the buffer
 02ED F6C408                      test    ah,CHAR_KANJI
 02F0 7404           02F6          jz     soc_10
 02F2 8A6701                      mov     ah,ds:1[bx]
 02F5 41                          inc     cx
                          soc_10:
 02F6 41                          inc     cx
                          soc_20:
 02F7 014EEC                      add     RL_SAVPOS,cx
 02FA C3                          ret
                          ;
                          ;
                          ;       BACK_ONE_CHAR decrements the Save Buffer control variables and
                          ;       returns the number of bytes skipped in CX.
                          ;
                          ;       On Entry:       Standard Registers
                          ;
                          ;       On Exit:        RL_SAVPOS       points to previous buffer char
                          ;                       AX,BX,CX,DX     Unknown
                          ;
                          back_one_char:
 02FB 52                          push    dx
 02FC BB0000       E              mov     bx,offset savbuf        ; Get the Buffer address
 02FF 8BCB034EEC                  mov cx,bx ! add cx,RL_SAVPOS    ; CX is the Current location
 0304 8BD3                        mov     dx,bx                   ; DX is last matching character 
                          boc_10:
 0306 3BD9                        cmp     bx,cx                   ; Have we reached the current Char
 0308 7410           031A          jz     boc_20                  ; Yes exit and update buffer
 030A 8BD3                        mov     dx,bx                   ; Update last character location
 030C 8A07                        mov     al,ds:[bx]              ; incremented by 1 or 2 depending on 
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  30


 030E E8FE00         040F         call    char_type               ; the contents of the buffer
 0311 43                          inc     bx
 0312 F6C408                      test    ah,CHAR_KANJI           ; Increment pointer by 2 for a Kanji
 0315 74EF           0306          jz     boc_10                  ; character
 0317 43                          inc     bx
 0318 EBEC           0306         jmps    boc_10

                          boc_20: 
 031A 81EA0000     E              sub     dx,offset savbuf        ; Calculate the character Index
 031E 8956EC                      mov     RL_SAVPOS,dx            ; and save in RL_SAVPOS
 0321 5A                          pop     dx
 0322 C3                          ret

                          copy_char:
 0323 3BD6                        cmp     dx,si           ; If at end of line copy characters 
 0325 7406           032D         jz      copy_c5
 0327 E8CDFE         01F7         call    next_char       ; Otherwise just move by 1
 032A E90A00         0337         jmp     copy_c10
                          copy_c5:
 032D E8A8FF         02D8         call    skip_one_char           ; Calculate Bytes to copy
 0330 E305           0337         jcxz    copy_c10                ; Skip Update in no characters skipped
 0332 294EEC                      sub     RL_SAVPOS,cx            ; Restore the Buffer Position
 0335 EB23           035A         jmps    copy_a10                ; and copy the data
                          copy_c10:
 0337 C3                          ret

                          copy_till_char:
 0338 3BD6                        cmp     dx,si                   ; Copy out if at end of line
 033A 7508           0344         jnz     move_till_char
 033C E84B00         038A         call    skip_till_char          ; Returns index to the next char
 033F 294EEC                      sub     RL_SAVPOS,cx
 0342 EB16           035A         jmps    copy_a10
                          move_till_char:
 0344 8976EC                      mov     RL_SAVPOS,si            ; Start search from the current
 0347 E84000         038A         call    skip_till_char          ; position
 034A E307           0353         jcxz    no_move                 ; CX=0 - dont move
                          move_along:
 034C 51                          push    cx
 034D E8A7FE         01F7         call    next_char               ; Shuttle along the line until
 0350 59                          pop     cx                      ; we reach the character
 0351 E2F9           034C         loop    move_along
                          no_move:
 0353 C3                          ret
                                  
                          copy_all:
 0354 8B4EEE                      mov     cx,RL_SAVMAX            ; Calculate the number of bytes to
 0357 2B4EEC                      sub     cx,RL_SAVPOS            ; copy from the buffer.
                          copy_a10:
 035A 83F900                      cmp     cx,0                    ; do we have nothing to copy
 035D 7E2A           0389          jle    copy_a30                ; (or less than nothing..)

 035F FF76F4                      push    RL_FLAGS                ; Save State flags and prevent
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  31


 0362 814EF40200                  or      RL_FLAGS,RLF_INS        ; SAVPOS being modified
                          copy_a20:
 0367 51                          push    cx
 0368 8166F4BFFF                  and     RL_FLAGS,not RLF_KANJI
 036D E868FF         02D8         call    skip_one_char           ; Return the next character and its 
 0370 83F901                      cmp     cx,1 
 0373 740B           0380         jz      copy_a25                ; size in bytes
 0375 8946F0                      mov     RL_KANJI,ax             ; Save the Kanji Character and
 0378 814EF44000                  or      RL_FLAGS,RLF_KANJI      ; set the control flag
 037D 5B                          pop     bx
 037E 4B                          dec     bx
 037F 53                          push    bx                      ; Decrement the Loop Count
                                  
                          copy_a25:
 0380 E86FFD         00F2         call    intsave_char            ; Save the character
 0383 59                          pop     cx                      ; and repeat till all bytes have
 0384 E2E1           0367         loop    copy_a20                ; been copied
 0386 8F46F4                      pop     RL_FLAGS                ; Restore State Flags
                          copy_a30:
 0389 C3                          ret

                          skip_till_char:
 038A E86901         04F6         call    get_char                ; Get the first character
 038D E81DFE         01AD         call    save_kanji              ; Setup RL_KANJI etc.
 0390 52                          push    dx
 0391 E844FF         02D8         call    skip_one_char           ; don't match on 1st char
 0394 8BD1                        mov     dx,cx                   ; remember we've skipped 1st char
 0396 E32F           03C7          jcxz   stc_40                  ; buffer exhausted
                          stc_10:
 0398 E83DFF         02D8         call    skip_one_char           ; Get the Next Character
 039B E32A           03C7         jcxz    stc_40                  ; Buffer exhausted
 039D 03D1                        add     dx,cx                   ; Update the Total Byte Count
 039F 83F902740E     03B2         cmp cx,2 ! jz stc_20            ; Was this a Kanji Character
 03A4 F746F44000                  test RL_FLAGS,RLF_KANJI         ; No but are we looking for one ?
 03A9 75ED           0398         jnz     stc_10                  ; Yes so get the next character
 03AB 3A46F0                      cmp     al,byte ptr RL_KANJI    ; Have we got a matching character ?
 03AE 75E8           0398         jnz     stc_10                  ; No so look again
 03B0 EB0C           03BE         jmps    stc_30                  ; Return Sucess 

                          stc_20:                                 ; Kanji Character in Buffer
 03B2 F746F44000                  test RL_FLAGS,RLF_KANJI         ; Are we looking for a Kanji Char
 03B7 74DF           0398         jz      stc_10                  ; No so try again
 03B9 3B46F0                      cmp     ax,RL_KANJI             ; Check the character and repeat
 03BC 75DA           0398         jnz     stc_10                  ; if they donot match

                          stc_30:                                 ; Character Match
 03BE 2BD1                        sub     dx,cx                   ; Correct the Total Byte Count
 03C0 294EEC                      sub     RL_SAVPOS,cx            ; point to the matching char
 03C3 87CA                        xchg    cx,dx                   ; and return the Match Count
 03C5 5A                          pop     dx
 03C6 C3                          ret

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  32


                          stc_40:                                 ; No Match
 03C7 2956EC                      sub     RL_SAVPOS,dx            ; Restore RL_SAVPOS to orginal value
 03CA 33C9                        xor     cx,cx                   ; and return 0000 characters skipped
 03CC 5A                          pop     dx
 03CD C3                          ret

                          ;
                          ;       Update the Save buffer with the contents of the users
                          ;       line buffer.
                          ;
                          ;       On Entry:       ES:DI -> Current location in Buffer
                          ;                       DX       No. of bytes in buffer
                          ;
                          ;       On Exit:        Update RL_SAVMAX, RL_SAVPOS, RL_SAVBUF
                          ;
                          save_line:
 03CE 33C0                        xor     ax,ax
 03D0 8946EC                      mov     RL_SAVPOS,ax
 03D3 8946EE                      mov     RL_SAVMAX,ax
 03D6 8BCA                        mov     cx,dx                   ; Current Line Length
 03D8 E31E           03F8          jcxz   save_l10
 03DA 81F98000                    cmp     cx,savbuf_size          ; clip the amount saved
 03DE 7203           03E3          jb     save_l5                 ; to be a maximum of
 03E0 B98000                      mov     cx,savbuf_size          ; the save buffer size
                          save_l5:
 03E3 894EEE                      mov     RL_SAVMAX,cx            ; Set the Save Data Length
 03E6 1E06                        push ds ! push es
 03E8 5657                        push si ! push di

 03EA 1E07                        push ds ! pop es
 03EC C576F8                      lds     si,RL_BUFPTR
 03EF BF0000       E              mov     di,offset savbuf
 03F2 F3A4                        rep     movsb                   ; save the data
 03F4 5F5E                        pop di ! pop si
 03F6 071F                        pop es ! pop ds
                          save_l10:
                          ;       ret

                          ignore_char:
 03F8 C3                          ret

                          mem_line:               ;; JFL save from beginning of line 
 03F9 E8D2FF         03CE         call    save_line
 03FC E9E4FD         01E3         jmp     goto_bol
                          ;       ret     


                          eof_char:               ;; JFL make F6 return a CTL Z
 03FF B01A                        mov     al,01Ah
 0401 B90100                      mov     cx,1
 0404 E9EBFC         00F2         jmp     intsave_char
                          ;       ret
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  33



                          ctlat_char:             ;; JFL make F7 return a CTL @
 0407 B000                        mov     al,0h
 0409 B90100                      mov     cx,1
 040C E9E3FC         00F2         jmp     intsave_char
                          ;       ret


PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  34


                          eject
                          ;
                          ;       CHAR_TYPE get the next character from the buffer ES:SI and returns
                          ;       its type in AH using the equates CHAR_????. The character is returned
                          ;       in AL.
                          ;
                          ;
                          ;       
                          char_type:
 040F B481                        mov ah,CHAR_SPACE or CHAR_STD   ; WhiteSpace
 0411 3C20743D       0452         cmp al,' ' ! jz char_t100
 0415 B402                        mov     ah,CHAR_TAB             ; Tab Character
 0417 3C097437       0452         cmp al,TAB ! jz char_t100
 041B B490                        mov ah,CHAR_ALPHAN or CHAR_STD  
 041D 3C157431       0452         cmp al,CTLU ! jz char_t100      ; Control-U and Control-T are treated
 0421 3C14742D       0452         cmp al,CTLT ! jz char_t100      ; as normal characters
 0425 B404                        mov     ah,CHAR_CTL             ; Control Character
 0427 3C207227       0452         cmp al,' ' ! jb char_t100

 042B B490                        mov ah,CHAR_ALPHAN or CHAR_STD  
 042D 3C30721F       0450         cmp al,'0' ! jb  char_t90       ; Return SYMBOL
 0431 3C39761D       0452         cmp al,'9' ! jbe char_t100      ; Return AlphaNumeric
 0435 3C417217       0450         cmp al,'A' ! jb  char_t90       ; Return Symbol
 0439 3C5A7615       0452         cmp al,'Z' ! jbe char_t100      ; Return AlphaNumeric
 043D 3C61720F       0450         cmp al,'a' ! jb  char_t90       ; Return Symbol
 0441 3C7A760D       0452         cmp al,'z' ! jbe char_t100      ; Return AlphaNumeric
 0445 3C807207       0450         cmp al,80h ! jb  char_t90       ; Return Symbol

 0449 B408                        mov     ah, CHAR_KANJI          ; assume character is 16 bits
 044B E80000       E              call    dbcs_lead               ; is byte a DBCS lead?
 044E 7402           0452         je      char_t100               ;  yes - done
                          char_t90:
 0450 B4A0                        mov     ah,CHAR_OTHER or CHAR_STD ; no - Normal Character Symbol

                          char_t100:
 0452 C3                          ret





                          ;
                          ;       CHAR_INFO will return various information about the character
                          ;       at ES:SI
                          ;
                          ;       On Entry:       ES:SI   Character Pointer
                          ;                       BX      Current Column No.
                          ;                       CX      Byte Scan Count
                          ;
                          ;       On Exit:        ES:SI   Points to the next Character
                          ;                       BX      Updates Column No.
                          ;                       CX      Updates Byte Scan Count
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  35


                          ;                       AH      Character type Flags
                          ;                       AL      First byte of Character
                          char_info:
 0453 26AC                        lods    es:al
 0455 E8B7FF         040F         call    char_type               ; Test the character type and assume
 0458 43                          inc     bx                      ; it will take 1 Screen location
 0459 F6C431                      test    ah,CHAR_ONECOL
 045C 751F           047D         jnz     char_i20

 045E 43                          inc     bx                      ; Now check for the Control Characters
 045F F6C404                      test    ah,CHAR_CTL             ; which take up 2 cols
 0462 7519           047D         jnz     char_i20

 0464 F6C408                      test    ah,CHAR_KANJI           ; If this was the first byte of a 
 0467 7404           046D         jz      char_i10                ; KANJI character then skip the
 0469 4649                        inc si ! dec cx                 ; next byte
 046B EB10           047D         jmps    char_i20

                          char_i10:
 046D 50                          push    ax                      ; Save AX and calculate the number
 046E 4B4B                        dec bx ! dec bx                 ; of screen locations that this TAB
 0470 8BC3                        mov     ax,bx                   ; character will use based on the fact
 0472 250700                      and     ax,7                    ; BX contains the current column
 0475 F7D8050800                  neg ax ! add ax,8
 047A 03D8                        add     bx,ax
 047C 58                          pop     ax

                          char_i20:
 047D C3                          ret

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  36


                          eject
                          ;
                          ;       CALC_CHARS calculates the number of character locations used
                          ;       on the screen to display a particular sub-string of the current
                          ;       buffer. This routine takes account of the Kanji, Control and TAB
                          ;       characters.
                          ;
                          ;       On Entry:       SI      Start Buffer Index
                          ;                       DI      End Buffer Index
                          ;
                          ;       On Exit:        CX      Count
                          ;
                          calc_chars:
 047E 53                          push    bx
 047F 5657                        push si ! push di
 0481 8B5EF6                      mov     bx,RL_INICOL            ; Get the initial Column
 0484 2BFE                        sub     di,si                   ; DI = Sub-string length bytes
 0486 8BCE                        mov     cx,si                   ; Use the Start Index for the
 0488 8B76F8                      mov     si,RL_BUFOFF            ; initial count and scan from the
 048B E305           0492         jcxz    calc_c20                ; start of the buffer

                          calc_c10:
 048D E8C3FF         0453         call    char_info
 0490 E2FB           048D         loop    calc_c10

                          calc_c20:
 0492 8BCF                        mov     cx,di                   ; Sub-String Length
 0494 8BFB                        mov     di,bx                   ; Current Column position

                          calc_c30:
 0496 E8BAFF         0453         call    char_info
 0499 E2FB           0496         loop    calc_c30

 049B 2BDF                        sub     bx,di
 049D 8BCB                        mov     cx,bx
 049F 5F5E                        pop di ! pop si
 04A1 5B                          pop     bx
 04A2 C3                          ret

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  37


                          eject
                          ;
                          ;       The following functions are purely Low level character output
                          ;       functions.
                          ;
                          space_out:                              ; Write CX Space characters to the
 04A3 B020                        mov     al,' '                  ; Output handle
 04A5 EB02           04A9         jmps    block_out
                                  
                          bs_out:
 04A7 B008                        mov     al,CTLH                 ; Write CX BackSpace characters to
                          ;;      jmps    block_out               ; Output Handle

                          block_out:
 04A9 E307           04B2          jcxz   block_o20
 04AB 51                          push    cx
                          block_o10:
 04AC E82D00         04DC         call    write_char              ; output this character
 04AF E2FB           04AC         loop    block_o10
 04B1 59                          pop     cx
                          block_o20:
 04B2 C3                          ret

                          ;
                          ;       Display CX characters from the string at ES:SI
                          ;
                          put_string:
 04B3 E30D           04C2         jcxz    puts_s20
 04B5 5156                        push cx ! push si
                          put_s10:
 04B7 51                          push    cx
 04B8 26AC                        lods    es:al
 04BA E80600         04C3         call    put_char
 04BD 59                          pop     cx
 04BE E2F7           04B7         loop    put_s10
 04C0 5E59                        pop si ! pop cx
                          puts_s20:
 04C2 C3                          ret

                          ;
                          ;       Display the character in AL
                          ;
                          put_char:
 04C3 3C207315       04DC         cmp al,' ' ! jae write_char     ; skip if it's printable
 04C7 3C147411       04DC         cmp al,CTLT! je write_char      ; Control-T and Control-U are treated
 04CB 3C15740D       04DC         cmp al,CTLU! je write_char      ; like normal Characters.
 04CF 3C097409       04DC         cmp al,TAB ! je write_char      ; skip if it's TAB
 04D3 0C40                        or      al,040h                 ; Convert Character to Uppercase
 04D5 50                          push    ax                      ; save it
 04D6 B05E                        mov     al,'^'                  ; display the character
 04D8 E80100         04DC         call    write_char              ;  in ^X format
 04DB 58                          pop     ax
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  38


                          write_char:
 04DC 06                          push    es
 04DD 52                          push    dx
 04DE 51                          push    cx
 04DF 56                          push    si
 04E0 57                          push    di
 04E1 50                          push    ax                      ; char on stack
 04E2 8B5EFC                      mov     bx,RL_OUTPUT            ; Output AL to the OUTPUT Handle
 04E5 1607                        push ss ! pop es                ; ES:DX -> Character Buffer
 04E7 8BF4                        mov     si,sp                   ; buffer offset
 04E9 B90100                      mov     cx,1                    ; character count
 04EC E80000       E              call    cooked_write            ; Write Character
 04EF 58                          pop     ax
 04F0 5F                          pop     di
 04F1 5E                          pop     si
 04F2 59                          pop     cx
 04F3 5A                          pop     dx
 04F4 07                          pop     es
 04F5 C3                          ret
                          ;
                          ;       Read 1 a character from RL_INPUT saving all the vital registers
                          ;       from corruption. If the first character is the ESCAPE character
                          ;       set AH to TRUE and read the next byte. Otherwise AH is FALSE
                          ;
                          get_char:
 04F6 1E                          push    ds
 04F7 06                          push    es
 04F8 52                          push    dx
 04F9 56                          push    si
 04FA 57                          push    di

 04FB E80000       E              call    get_dseg                ; point at pcmode data
 04FE C5360000     E              lds     si,con_device           ; DS:SI -> current console device
 0502 F744040040                  test    ds:DH_ATTRIB[si],DA_IOCTL ; test bit 14: IOCTL bit
 0507 7427           0530          jz     get_c05                 ; error if IOCTL not supported
 0509 83EC1E                      sub     sp,RH_SIZE              ; reserve this many words on the stack
 050C 8BDC                        mov     bx,sp                   ; SS:BX -> request packet
 050E 1607                        push ss ! pop es                ; ES:BX -> request packet
 0510 8D56F4                      lea     dx,RL_FLAGS             ; point at flags
 0513 26C647020C                  mov     es:RH_CMD[bx],CMD_OUTPUT_IOCTL
 0518 26C6071E                    mov     es:RH_LEN[bx],RH4_LEN
 051C 2689570E                    mov     es:RH4_BUFOFF[bx],dx    ; set up for a normal
 0520 268C5710                    mov     es:RH4_BUFSEG[bx],ss    ;  IOCTL read/write
 0524 26C747120200                mov     es:RH4_COUNT[bx],WORD
 052A E80000       E              call    device_driver           ; execute the command
 052D 83C41E                      add     sp,RH_SIZE              ; reclaim the stack
                          get_c05:

 0530 E80000       E              call    get_dseg                ; point at pcmode data
 0533 8B5EFE                      mov     bx,RL_INPUT             ; BX = input stream
 0536 E80000       E              call    cmdline_read            ; get a character

PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  39


 0539 B400                        mov     ah,FALSE                ; Assume this is NOT the Escape 
 053B 2E3A060000   R              cmp     al,esc_char             ; character and set high byte of the
 0540 7505           0547          jnz    get_c10                 ; match word to FALSE

 0542 E80000       E              call    raw_read                ; read the second byte of the escape
 0545 B401                        mov     ah,ESC_CODE             ;  sequence, setting high byte to ESC
                          get_c10:
 0547 5F                          pop     di
 0548 5E                          pop     si
 0549 5A                          pop     dx
 054A 07                          pop     es
 054B 1F                          pop     ds
 054C C3                          ret

                          PCM_RODATA      CSEG    WORD

   0000                   EDIT_CNTRL      equ     cs:word ptr 0[bx]       ; Character and Esc Flag
   0002                   EDIT_FUNC       equ     cs:word ptr 2[bx]       ; Edit Function Address
   0004                   EDIT_LEN        equ     4                       ; Edit Table Entry Size

 0000 00                  esc_char        db      0               ; Command Line Editor Escape Character
 0001 2D00                edit_size       dw      (offset edit_end - edit_table)/EDIT_LEN

 0003 0D004900     R      edit_table      db CR   ! db NESC_CODE ! dw ret_string
 0007 0A00F803     R              db LF   ! db NESC_CODE ! dw ignore_char
 000B 08005B02     R              db CTLH ! db NESC_CODE ! dw delp_char
 000F 7F004902     R              db DEL  ! db NESC_CODE ! dw delf_char

 0013 1B00B902     R              db ESC  ! db NESC_CODE ! dw del_line
 0017 3B012303     R              db ';'  ! db ESC_CODE  ! dw copy_char           ; Function 1
 001B 3C013803     R              db '<'  ! db ESC_CODE  ! dw copy_till_char      ; Function 2
 001F 3D015403     R              db '='  ! db ESC_CODE  ! dw copy_all            ; Function 3
 0023 3E018A03     R              db '>'  ! db ESC_CODE  ! dw skip_till_char      ; Function 4
 0027 3F01F903     R              db '?'  ! db ESC_CODE  ! dw mem_line            ; Function 5

 002B 4001FF03     R              db '@'  ! db ESC_CODE  ! dw eof_char            ; Function 6
 002F 41010704     R              db 'A'  ! db ESC_CODE  ! dw ctlat_char          ; Function 7
 0033 42810000     E              db 'B'  ! db ESC_CODE or DISABLE ! dw match_cmd ; Function 8

 0037 5201D201     R              db 'R'  ! db ESC_CODE  ! dw toggle_ins          ; Insert
 003B 53014902     R              db 'S'  ! db ESC_CODE  ! dw delf_char           ; Delete
 003F 4B811902     R              db 'K'  ! db ESC_CODE or DISABLE  ! dw prev_char ; Left Arrow 
 0043 4D81F701     R              db 'M'  ! db ESC_CODE or DISABLE  ! dw next_char        ; Right Arrow
                          ; When advanced editing is disabled the match for Left/Right arrows will fall
                          ; through to here
 0047 4B015B02     R              db 'K'  ! db ESC_CODE  ! dw delp_char           ; Left Arrow - compat
 004B 4D012303     R              db 'M'  ! db ESC_CODE  ! dw copy_char           ; Right Arrow - compat
                          ;
                          ; Extended functions from here on
                          ;
 004F 43810000     E              db 'C'  ! db ESC_CODE or DISABLE ! dw del_cur_history_buffer ; Func 9
 0053 44810000     E              db 'D'  ! db ESC_CODE or DISABLE ! dw del_history_buffers ; Func 10
PC-DOS RASM-86 1.4a  Source: CMDLINE.A86                                                                     Page  40


 0057 4781E301     R              db 'G'  ! db ESC_CODE or DISABLE  ! dw goto_bol         ; Home
 005B 4F810000     E              db 'O'  ! db ESC_CODE or DISABLE  ! dw goto_eol         ; End
 005F 74810000     E              db 't'  ! db ESC_CODE or DISABLE  ! dw next_word        ; Control Right Arrow
 0063 73810000     E              db 's'  ! db ESC_CODE or DISABLE  ! dw prev_word        ; Control Left Arrow


 0067 1680D201     R              db CTLV ! db NESC_CODE or DISABLE ! dw toggle_ins
 006B 1180E301     R              db CTLQ ! db NESC_CODE or DISABLE ! dw goto_bol
 006F 17800000     E              db CTLW ! db NESC_CODE or DISABLE ! dw goto_eol
 0073 12800000     E              db CTLR ! db NESC_CODE or DISABLE ! dw match_cmd
 0077 0480F701     R              db CTLD ! db NESC_CODE or DISABLE ! dw next_char
 007B 13801902     R              db CTLS ! db NESC_CODE or DISABLE ! dw prev_char
 007F 06800000     E              db CTLF ! db NESC_CODE or DISABLE ! dw next_word
 0083 01800000     E              db CTLA ! db NESC_CODE or DISABLE ! dw prev_word
 0087 07806502     R              db CTLG ! db NESC_CODE or DISABLE ! dw deln_char
 008B 14800000     E              db CTLT ! db NESC_CODE or DISABLE ! dw deln_word
 008F 1980B902     R              db CTLY ! db NESC_CODE or DISABLE ! dw del_line
 0093 02800000     E              db CTLB ! db NESC_CODE or DISABLE ! dw del_bol
 0097 0B805002     R              db CTLK ! db NESC_CODE or DISABLE ! dw del_eol

 009B 4981F803     R              db 'I'  ! db ESC_CODE or DISABLE  ! dw ignore_char      ; PageUP
 009F 5181F803     R              db 'Q'  ! db ESC_CODE or DISABLE  ! dw ignore_char      ; PageDown
 00A3 48810000     E              db 'H'  ! db ESC_CODE or DISABLE  ! dw prev_cmd         ; Up Arrow
 00A7 50810000     E              db 'P'  ! db ESC_CODE or DISABLE  ! dw next_cmd         ; Down Arrow
 00AB 05800000     E              db CTLE ! db NESC_CODE or DISABLE ! dw prev_cmd
 00AF 18800000     E              db CTLX ! db NESC_CODE or DISABLE ! dw next_cmd
 00B3 1F80D801     R              db CTLUB ! db NESC_CODE or DISABLE ! dw toggle_search   ; Default search mode
 00B7                     edit_end        rb      0


                          PCMODE_DATA     DSEG    WORD

                                  extrn   con_device:dword        ; Current Console Device
                                  extrn   column:byte             ; Console Cursor Location

   0080                           savbuf_size     equ     128

                                  extrn   savbuf:byte             ; fixed location in DOS data area

                                  extrn   cle_state:word          ; command line editing state

                                  end


End of assembly.  Number of errors:   0.  Use factor: 23%
n_device:dword        ; Current Console Device
