Files
DR-DOS-OpenDOS/IBMDOS/BIN/CMDLINE.LST
2020-11-04 23:59:28 +01:00

1922 lines
116 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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