PC-DOS RASM-86 1.4a Source: CIO.A86 Page 1 = 0001 __RASM__ EQU 1 ; File : $CIO.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: $ ; CIO.A86 1.20 94/12/01 10:05:21 ; Made cooked_write and is_device aware of FCB writes; ; CIO.A86 1.19 94/06/28 12:21:07 ; Fix last_key_ext bug ; CIO.A86 1.18 94/05/12 14:06:22 ; The routine cooked_status now sets a flag last_key_ext if the keycode is 0 ; On entry, it checks this flag to see if the last one was 0, and if so does ; not do the checks for the control keys. In this way, Alt-R and Alt-Q can ; be distinguished from Ctrl-S and Ctrl-P. ; CIO.A86 1.17 93/12/21 17:58:15 ; Preserve BX round clock read ; Update char_error so DS:SI -> device driver header itself ; CIO.A86 1.10 93/05/06 19:28:03 ; Move int 23/28 support to CIO. ; Read the clock in idle_dev, not int 28 loop. ; CIO.A86 1.9 93/05/05 23:30:44 ; int 2A/84 is now only generated on input-and-wait functions ; CIO.A86 1.8 93/03/25 15:05:56 ; tweak console block output ; ENDLOG PC-DOS RASM-86 1.4a Source: CIO.A86 Page 2 ; ; This module contains all the Character I/O functions used by PCMODE ; ; 12 Nov 87 Disable Control-Break when the Console Output mode is RAW ; 24 Feb 88 Display Control characters correctly. ie "^X" ; 23 May 88 Support ^S to Pause screen output. ; 25 May 88 Support Control-P for Cooked_Write and remove Kanji Character ; check. ; 26 May 88 Check for CTLC on CON_DEV when character input is redirected. ; Correctly detect EOF on redirected input. ; 17 Aug 88 Call PRN device with Open/Close on ^P ; 30 Aug 88 Jump to correct exit when Open/Close is not supported by a ; device driver for ^P. ; 14 Sep 88 Break checking should only be carried out when the INDOS_FLAG ; is 1. (Novell and Cntrl-C). ; 03 Sep 88 Return the character output by INT21/04,05,06 in AL. ; 10 Nov 88 Preserve ES when calling any Device Driver (Revalation DEVDRVR) ; 15 Dec 88 Check STDERR for Control-C if it is a Device. ; 15 Mar 89 Check for CTLC during Cooked Write. ; 16 Mar 89 Explicitly allow INT 28 during char reads (SmartNotes bug) ; 25 Apr 89 Execute break_check after getting the console status INT21/0B ; 2 May 89 Save Device driver STRAT and INT address's on the stack ; 10 May 89 Now check keyboard more often during cooked write ; 25 May 89 Move INT28 flag to PCMIF.PCM ; 6 Sep 89 Enter/Exit critical region round device request ; 26 Oct 89 saving some bytes again... ; 25 Jan 90 Insert IDLE Detection Code ; 29 Jan 90 Int 2A critical section support added to device_callf ; 7 Mar 90 Convert to register preserved function calls ; 27 Mar 90 cooked_write checks STD_OUT for ctl-s ctl-p etc (STD_IN may ; have been redirected) ; 29 Mar 90 preserve BX round device_callf (3+Share CLOCK$ bug) ; 12 Jun 90 get_doshndl parameter BX not AX ; 15 Oct 90 Added support for Return Interim Character flag (see PSP_RIC). ; 26 Oct 90 handle PSP=0 (ie. FCB device I/O) ; 1 mar 91 break_check now goes to con_device, not STDERR ; 17 jun 91 ij fix to cooked_out to avoid status checks if STDOUT redirected = include pcmode.equ = ; File : $PCMODE.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. PC-DOS RASM-86 1.4a Source: CIO.A86 Page 3 = ; 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: CIO.A86 Page 4 = ; 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: CIO.A86 Page 5 = 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: CIO.A86 Page 6 = 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: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 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 7 = ; 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. = = = 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 = = include i:reqhdr.equ = ; File : $REQHDR.EQU$ = ; = ; Description : = ; PC-DOS RASM-86 1.4a Source: CIO.A86 Page 8 = ; 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 = 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 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 9 = = 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 = 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 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 10 = 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 = = 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 = PC-DOS RASM-86 1.4a Source: CIO.A86 Page 11 = 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: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 = ; 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 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 12 = 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 = 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 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 13 = 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 = 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:fdos.equ = ; File : $FDOS.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 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 14 = ; 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 = ; = ; Structure of Buffer Control Blocks = ; ---------------------------------- = ; These BCBs immediately preceed the data buffers. BCBs are = ; always shared for all drives and therefore must be big = ; enough for the largest drive. = ; = = 0000 BCB_NEXT equ word ptr 00h ; link to next buffer = 0002 BCB_PREV equ word ptr 02h ; link to previous buffer = 0004 BCB_DRV equ byte ptr 04h ; drive of this buffer or 0FFh = 0005 BCB_FLAGS equ byte ptr 05h ; buffer flags = 0006 BCB_REC equ word ptr 06h ; low 16 bits of sector address = 0008 BCB_REC2 equ byte ptr 08h ; top 8 bits of record address = 000A BCB_COPIES equ byte ptr 0Ah ; number of copies to write = 000B BCB_SEPARATION equ word ptr 0Bh ; # sectors copies are apart = 000D BCB_DDSC equ dword ptr 0Dh ; DWORD ptr to DDSC_ = 0011 BCB_REMOTE equ word ptr 11h ; remote in-use count = 0014 BCB_DATA equ byte ptr 14h ; buffer data = = 0002 BF_ISFAT equ 0002h ; buffer marked as FAT sector = 0004 BF_ISDIR equ 0004h ; buffer marked as Directory sector = 0008 BF_ISDAT equ 0008h ; buffer marked as Data sector = 0040 BF_DIRTY equ 0040h ; buffer marked as modified = 0080 BF_REMOTE equ 0080h ; buffer is remote = = 0FF6 MAX12 equ 0FF6h ; max. disk size w/ 12-bit media = = ; Structure of Hash Control Block = ; ------------------------------- = ; Each hash control block refers to the hash codes of one = ; disrectory cluster or a root directory. = = 0000 HCB_LINK equ word ptr 0 ; link to next control block = 0002 HCB_DRV equ byte ptr 2 ; drive for this entry or 0FFh PC-DOS RASM-86 1.4a Source: CIO.A86 Page 15 = 0004 HCB_CLU equ word ptr 4 ; cluster number or 0000 if root = 0006 HCB_CNT equ word ptr 6 ; number of hashed entries = 0008 HCB_DATA equ word ptr 8 ; hash buffer data = = = ; Structure of DOS FCB = ; -------------------- = ; This is hopefully consistent with what DOS stores in an = ; open file control block for DOS 1.x functions = = 0000 MSF_EXTFLG equ byte ptr 0 ; if this is 0xFF, skip 1st 7 byte = 0006 MSF_ATTRIB equ byte ptr 6 ; file attributes if MSF_EXTFLG = 0000 MSF_DRIVE equ byte ptr 0 ; 1st byte normally drive code = 0001 MSF_NAME equ byte ptr 1 ; 8-bit ASCII file name, 11 characters = 000C MSF_BLOCK equ word ptr 12 ; current block number = 000E MSF_RECSIZE equ word ptr 14 ; current logical record size = 0010 MSF_SIZE equ word ptr 16 ; 32-bit file size = 0014 MSF_DATE equ word ptr 20 ; last date stamp = 0016 MSF_TIME equ word ptr 22 ; last time stamp = 0018 MSF_IFN equ byte ptr 24 ;; internal file number = 0019 MSF_IOCTL equ byte ptr 25 ;; file status = 001A MSF_BLOCK1 equ word ptr 26 ;; 1st block of file = 001C MSF_DBLK equ word ptr 28 ;; directory block = 001C MSF_DEVPTR equ dword ptr 28 ;; address of device driver = 001E MSF_DCNT equ word ptr 30 ;; directory count = 0020 MSF_CR equ byte ptr 32 ; current sequential record = 0021 MSF_RR equ word ptr 33 ; random record address (3 or 4 byte) = 0023 MSF_RR2 equ byte ptr 35 ; random record overflow = = = ; Structure of DOS DPB = ; -------------------- = ; The layout of this structure is a guess based on = ; examples. It is returned by PC MODE on functions 1Fh and = ; 32h and is required by various disk-related utilities = ; like disk editors and CHKDSK. = = 0000 DDSC_UNIT equ byte ptr 0 ; absolute drive number = 0001 DDSC_RUNIT equ byte ptr 1 ; relative unit number = 0002 DDSC_SECSIZE equ word ptr 2 ; sector size in bytes = 0004 DDSC_CLMSK equ byte ptr 4 ; sectors/cluster - 1 = 0005 DDSC_CLSHF equ byte ptr 5 ; log2 (sectors/cluster) = 0006 DDSC_FATADDR equ word ptr 6 ; sector address of FAT = 0008 DDSC_NFATS equ byte ptr 8 ; # of FAT copies = 0009 DDSC_DIRENT equ word ptr 9 ; size of root directory = 000B DDSC_DATADDR equ word ptr 11 ; sector address of cluster #2 = 000D DDSC_NCLSTRS equ word ptr 13 ; # of clusters on disk = 000F DDSC_NFATRECS equ word ptr 15 ; # of sectors per FAT = 0011 DDSC_DIRADDR equ word ptr 17 ; sector address of root dir = 0013 DDSC_DEVHEAD equ dword ptr 19 ; device driver header = 0013 DDSC_DEVOFF equ word ptr 19 = 0015 DDSC_DEVSEG equ word ptr 21 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 16 = 0017 DDSC_MEDIA equ byte ptr 23 ; current media byte = 0018 DDSC_FIRST equ byte ptr 24 ; "drive never accessed" flag = 0019 DDSC_LINK equ dword ptr 25 ; next drive's DDSC = 001D DDSC_BLOCK equ word ptr 29 ; next block to allocate = 001F DDSC_FREE equ word ptr 31 ; total free clusters on drive = 0021 DDSC_LEN equ 33 = = = = ; DELWATCH hooks called by OS = = 0000 DELW_RDMASK equ 0 ; delete dir search mask = 0002 DELW_DELETE equ 2 ; delete this dir entry = 0003 DELW_FREECLU equ 3 ; free some clusters = 0004 DELW_FREERD equ 4 ; free root dir entry = 0005 DELW_SPACE equ 5 ; add "deletes" to free space = 0007 DELW_NEWDISK equ 7 ; new disk logged in = 000E DELW_PURGE equ 14 ; perge pd file = 000F DELW_UNDEL equ 15 ; undelete pd file = = ; SuperStore hook called by OS = = 0010 SSTOR_SPACE equ 10h ; enquire # physical free space = = ; Password hooks called by OS = = 0020 PASSWD_CREAT equ 20h ; initialise an entry = 0021 PASSWD_CHMOD equ 21h ; change an entry = 0022 PASSWD_CHECK equ 22h ; check an entry = = ; Share hooks in PCMODE data segment = ; = ; These point to a stub which does a "STC, RETF" = ; = = 000F NUM_SHARE_STUB_ENTRIES equ 15 = = 0000 S_LOCKS equ DWORD*0 ; share lock/unlock region = 0004 S_UPDATE equ DWORD*1 ; update DHNDL from share = 0008 S_RECORD equ DWORD*2 ; update share from DHNDL = 000C S_FDOSRW equ DWORD*3 ; validate proposed operation = 0010 S_DISCARD equ DWORD*4 ; discard all files on drive = 0014 S_OPEN equ DWORD*5 ; files is opening, remember it = 0018 S_CLOSE equ DWORD*6 ; files is closing, forget it = 001C S_OM_COMPAT equ DWORD*7 ; check open mode compatible = 0020 S_CLOSE_IF_OPEN equ DWORD*8 ; close if compat open, else deny = 0024 S_DENY_IF_OPEN equ DWORD*9 ; deny if open shared/by others = 0028 S_GET_LIST_ENTRY equ DWORD*10 ; get open file list entry = 002C S_CLOSE_FILES equ DWORD*11 ; close all files for given PSP/UID = = ; struct dirfcb = PC-DOS RASM-86 1.4a Source: CIO.A86 Page 17 = 0000 DNAME equ byte ptr 0 ;file name & type = 000B DATTS equ byte ptr 11 = 0001 DA_RO equ 01h ; 0x01 - read/only = 0002 DA_HIDDEN equ 02h ; 0x02 - hidden = 0004 DA_SYSTEM equ 04h ; 0x04 - system = 0008 DA_VOLUME equ 08h ; 0x08 - volume label = 0010 DA_DIR equ 10h ; 0x10 - sub-directory = 0020 DA_ARCHIVE equ 20h ; 0x20 - archive = 0080 DA_CLUSTER equ 80h ; 0x80 - return starting cluster from search (API ex tenti = 0080 DA_DELWATCH equ 80h ; 0x88 - return pending delete files = 00D8 DA_FIXED equ 11011000b ; can't CHMOD label, dir, unused bits = FF27 DA_CHANGE equ not DA_FIXED ; all others are changeable = = ;DATTS2 equ 12 ;CP/M attributes = ; ; 0x80 - f1' modify default open rules = ; ; 0x40 - f2' partial close default = ; ; 0x20 - f3' ignore close checksum errors = ; ; 0x10 - f4' disable checksums = ; ; 0x08 - (reserved) = ; ; 0x04 - DELETE password = ; ; 0x02 - WRITE password = ; ; 0x01 - READ password = 000D DUNDEL equ 13 ;1st letter of deleted file = 000E DPWD equ word ptr 14 ;16-bit password hash code = 0010 DMODTIME equ word ptr 16 ;delwatch time (hhhhhmmmmmmsssss) = 0012 DMODDATE equ word ptr 18 ;delwatch date (yyyyyyymmmmddddd) = ;DRECSIZE equ 16 ;FlexOS record size = ;DUSER equ 18 ;FlexOS user ID of creator = ;DGROUP equ 19 ;FlexOS group ID of creator = 0014 DPWM equ word ptr 20 ;FlexOS access rights = 0016 DTIME equ 22 ;time (hhhhhmmmmmmsssss) = 0018 DDATE equ 24 ;date (yyyyyyymmmmddddd) = 001A DBLOCK1 equ 26 ;first block in file = 001C DSIZE equ 28 ;current file size = = ; DOS Media Password Definitions = ; ------------------------------ = = 000F PWM_OWNER equ 000Fh ; PWD Owner mask = 00F0 PWM_GROUP equ 00F0h ; PWD Group mask = 0F00 PWM_WORLD equ 0F00h ; PWD World mask = 0888 PWM_R equ 0888h ; PWD required for reading = 0444 PWM_W equ 0444h ; PWD required for writing = 0222 PWM_E equ 0222h ; PWD req'd for executing = 0111 PWM_D equ 0111h ; PWD required for deleting = 0DDD PWM_ANY equ PWM_R+PWM_W+PWM_D ; PWD required for anything = = = ; literal constants = = 0FFF FAT12 equ 00fffh ; 12 bit fat PC-DOS RASM-86 1.4a Source: CIO.A86 Page 18 = FFFF FAT16 equ 0ffffh ; 16 bit fat = = FFFF ENDDIR equ 0ffffh ;end of directory = = include i:psp.def = ; File : $PSP.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 = ; = ; Program Segment Prefix = ; ---------------------- = ; This structure holds vital information for DOS programs = ; = ;****************************************************************************** = ;* = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 00 | int 20 | memory | *** | jmpf|longjmp off| = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 08 |longjmp seg| int22 Off | int22 Seg | int22 Off | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 10 | int22 Seg | int24 Off | int24 Seg | Parent | PC-DOS RASM-86 1.4a Source: CIO.A86 Page 19 = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 18 | Default Handle Table | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 20 | XFT (20 entries) | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 28 | XFT contd. | Environ | User SP | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 30 | User SS | xfnmax | xftoff | xftseg | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 38 | res1 | res2 | ric | *** | ********* | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 40 | version | ********* | ********* | ********* | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 48 | ********* | ********* | ********* | ********* | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 50 | int 21 | retf| *** | ********* | ********* | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = ;* 58 | ********* | ********* | PSP fcb 1 | = ;* +-----+-----+-----+-----+-----+-----+-----+-----+ = = 0000 PSP_INT20 equ es:word ptr .0000h = 0002 PSP_MEMORY equ es:word ptr .0002h = ;PSP_??? equ es:byte ptr .0004h = 0005 PSP_LONGCALL equ es:byte ptr .0005h = 0006 PSP_LONGOFF equ es:word ptr .0006h = 0008 PSP_LONGSEG equ es:word ptr .0008h = 000A PSP_TERM_IP equ es:word ptr .000Ah = 000C PSP_TERM_CS equ es:word ptr .000Ch = 000E PSP_BREAK_IP equ es:word ptr .000Eh = 0010 PSP_BREAK_CS equ es:word ptr .0010h = 0012 PSP_ERROR_IP equ es:word ptr .0012h = 0014 PSP_ERROR_CS equ es:word ptr .0014h = 0016 PSP_PARENT equ es:word ptr .0016h = 0018 PSP_XFT equ es:byte ptr .0018h = ; = ; The Default Handle Table is HERE !! = ; = 002C PSP_ENVIRON equ es:word ptr .002ch = 002E PSP_USERSP equ es:word ptr .002eh = 0030 PSP_USERSS equ es:word ptr .0030h = 0032 PSP_XFNMAX equ es:word ptr .0032h = 0034 PSP_XFTPTR equ es:dword ptr .0034h = 0034 PSP_XFTOFF equ es:word ptr .0034h = 0036 PSP_XFTSEG equ es:word ptr .0036h = 0038 PSP_RES1 equ es:word ptr .0038h ; DOS Reserved 0FFFFh = 003A PSP_RES2 equ es:word ptr .003Ah ; DOS Reserved 0FFFFh = 003C PSP_RIC equ es:byte ptr .003Ch ; Return Interim Character flag = 0040 PSP_VERSION equ es:word ptr .0040h ; DOS version number = = = 0050 PSP_DOSCALL equ es:word ptr .0050h = 0052 PSP_DOSRETF equ es:byte ptr .0052h PC-DOS RASM-86 1.4a Source: CIO.A86 Page 20 = = 005C PSP_FCB1 equ es:byte ptr .005Ch = 006C PSP_FCB2 equ es:byte ptr .006Ch = 0080 PSP_COMLEN equ es:byte ptr .0080h = 0081 PSP_COMLINE equ es:byte ptr .0081h = = 0014 XFNMAX equ 20 = = 0100 PSPLEN equ 100h = 0060 PSPILEN equ 60h = include i:mserror.equ = ; File : $MSERROR.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 = = FFFF ED_FUNCTION equ -01 ; invalid function number = FFFE ED_FILE equ -02 ; file not found = FFFD ED_PATH equ -03 ; path not found = FFFC ED_HANDLE equ -04 ; too many open files = FFFB ED_ACCESS equ -05 ; file access denied = FFFA ED_H_MATCH equ -06 ; invalid handle number PC-DOS RASM-86 1.4a Source: CIO.A86 Page 21 = FFF9 ED_DMD equ -07 ; memory descriptor destroyed = FFF8 ED_MEMORY equ -08 ; insufficient memory = FFF7 ED_BLOCK equ -09 ; invalid memory block addr = FFF6 ED_ENVIRON equ -10 ; invalid environment = FFF5 ED_FORMAT equ -11 ; invalid format = FFF4 ED_ACC_CODE equ -12 ; invalid access code = FFF3 ED_DATA equ -13 ; invalid data = FFF1 ED_DRIVE equ -15 ; invalid drive specified = FFF0 ED_DIR equ -16 ; can't remove current dir = FFEF ED_DEVICE equ -17 ; not same device = FFEE ED_ROOM equ -18 ; no more files = = FFED ED_PROTECT equ -19 ; disk write protected = FFEC ED_BADUNIT equ -20 ; invalid drive specified = FFEB ED_NOTREADY equ -21 ; drive doesn't respond = FFEA ED_BADCMD equ -22 ; invalid command to driver = FFE9 ED_BADDATA equ -23 ; data CRC error = FFE8 ED_BADRHLEN equ -24 ; (shouldn't happen) = FFE7 ED_BADSEEK equ -25 ; can't seek to track = FFE6 ED_BADMEDIA equ -26 ; unrecognizable medium = FFE5 ED_RNF equ -27 ; record/sector not found = FFE4 ED_NOPAPER equ -28 ; printer error = FFE3 ED_WRFAIL equ -29 ; write failed = FFE2 ED_RDFAIL equ -30 ; read failed = FFE1 ED_GENFAIL equ -31 ; anything failed = FFE0 ED_SHAREFAIL equ -32 ; sharing conflict = FFDF ED_LOCKFAIL equ -33 ; locking conflict = FFDE ED_DISKCHG equ -34 ; invalid disk change = FFDD ED_NOFCBS equ -35 ; FCB table exhausted = FFDC ED_NOLOCKS equ -36 ; lock list items exhausted = FFCE ED_NET equ -50 ; Network Request Not Supported = = FFBF ED_NETACCESS equ -65 ; file access denied = = FFB7 ED_NETPWD equ -73 ; Server Password Error = FFB6 ED_NETVER equ -74 ; Incorrect Server version = FFB5 ED_NETREQ equ -75 ; No Local Network Resources = FFB4 ED_NETTIME equ -76 ; Network Time Out Error = FFB3 ED_NETCOMM equ -77 ; Network Communications Error = FFB2 ED_NETSRVR equ -78 ; No Server Network Resources = FFB1 ED_NETLOG equ -79 ; Server Not Logged In = = FFB0 ED_EXISTS equ -80 ; file already exists = FFAE ED_MAKE equ -82 ; Cannot Make (Files ??) = FFAD ED_FAIL equ -83 ; FAIL code returned from INT 24 = FFAC ED_STRUCT equ -84 ; Out of Structures = FFAB ED_ASSIGN equ -85 ; Already Assigned = FFAA ED_PASSWORD equ -86 ; Invalid Password = FFA9 ED_PARAM equ -87 ; Invalid Parameter = FFA8 ED_NETWRITE equ -88 ; Network write fault = FFA7 ED_NETFUNC equ -89 ; Function not supported on network = FFA6 ED_COMPONENT equ -90 ; system component not installed PC-DOS RASM-86 1.4a Source: CIO.A86 Page 22 = FFA6 ED_LASTERROR equ -90 ; Last Error Number Used = = = 0001 CLASS_RESOURCE equ 1 ; Out of Resource = 0002 CLASS_TEMP equ 2 ; Temporary Situation = 0003 CLASS_AUTHOR equ 3 ; Authorization Error = 0004 CLASS_INTERNAL equ 4 ; Internal System Software Error = 0005 CLASS_HARDWARE equ 5 ; Hardware Failure = 0006 CLASS_SYSTEM equ 6 ; Serious System Failure = 0007 CLASS_APPLIC equ 7 ; Application Program Error = 0008 CLASS_LOST equ 8 ; File/Item Not Found = 0009 CLASS_FORMAT equ 9 ; File/Item Illegal Format = 000A CLASS_LOCKED equ 10 ; File/Item Locked = 000B CLASS_MEDIA equ 11 ; Media Failure = 000C CLASS_EXISTS equ 12 ; Item Already Exists = 000D CLASS_UNKNOWN equ 13 ; Unknown Classification = = 0001 ACT_RETRY equ 1 ; Retry a few times then prompt user = 0002 ACT_DELAY equ 2 ; Delay then as ACT_RETRY = 0003 ACT_USER equ 3 ; Prompt user to re-enter data = 0004 ACT_ABORT equ 4 ; Clean Up then ABORT the process = 0005 ACT_TERM equ 5 ; Terminate immeadiately NO CLEAN UP = 0006 ACT_IGNORE equ 6 ; Ignore the Error = 0007 ACT_URETRY equ 7 ; Retry the error after user intervention = = 0001 LOC_UNKNOWN equ 1 ; Unknown error location = 0002 LOC_BLOCK equ 2 ; Block Device Failure = 0003 LOC_NET equ 3 ; Network Failure = 0004 LOC_CHAR equ 4 ; Related to Serial/Character devices = 0005 LOC_MEMORY equ 5 ; Failure related to Memory = 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, PC-DOS RASM-86 1.4a Source: CIO.A86 Page 23 = ; 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 *; = ;* *; = ;************************************************; = = 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 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 24 = = 005E CTL equ '^' = include i:redir.equ = ; File : $REDIR.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 = ; Int 2F AH=11 msnet redirector hook equates = = 1100 I2F_PRESCENCE equ 1100h = 1101 I2F_RMDIR equ 1101h = 1103 I2F_MKDIR equ 1103h = 1105 I2F_CHDIR equ 1105h = 1106 I2F_CLOSE equ 1106h = 1107 I2F_COMMIT equ 1107h = 1108 I2F_READ equ 1108h = 1109 I2F_WRITE equ 1109h = 110A I2F_LOCK equ 110Ah = 110B I2F_UNLOCK equ 110Bh = 110C I2F_SPACE equ 110Ch = 110E I2F_SET_ATTR equ 110Eh = 110F I2F_GET_ATTR equ 110Fh PC-DOS RASM-86 1.4a Source: CIO.A86 Page 25 = 1111 I2F_REN equ 1111h = 1113 I2F_DEL equ 1113h = 1116 I2F_OPEN equ 1116h = 1117 I2F_CREATE equ 1117h = 1118 I2F_XCREATE equ 1118h = 1119 I2F_XSFIRST equ 1119h = 111B I2F_SFIRST equ 111Bh = 111C I2F_SNEXT equ 111Ch = 111D I2F_PCLOSE equ 111Dh = 111E I2F_REDIR_5F equ 111Eh = 111F I2F_REDIR_5E equ 111Fh = 1120 I2F_FLUSH equ 1120h = 1121 I2F_LSEEK equ 1121h = 1122 I2F_PTERM equ 1122h = 1123 I2F_PPATH equ 1123h = 1124 I2F_CTLP_ERR equ 1124h = 1125 I2F_REDIR_5D equ 1125h = 1126 I2F_CTLP equ 1126h = = include i:doshndl.def = ; File : $DOSHNDL.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$ PC-DOS RASM-86 1.4a Source: CIO.A86 Page 26 = ; = ; ENDLOG = = 0000 DCNTRL_DSADD equ dword ptr 0000h = 0000 DCNTRL_DSOFF equ word ptr 0000h = 0002 DCNTRL_DSSEG equ word ptr 0002h = 0004 DCNTRL_COUNT equ word ptr 0004h = 0006 DCNTRL_LEN equ 6 = = 0000 DHNDL_COUNT equ word ptr 00h ; 00 - Usage Count = 0002 DHNDL_MODE equ word ptr 02h ; 02 - File Mode = = 8000 DHM_FCB equ 8000h ; marks as FCB = 4000 DHM_COMMIT equ 4000h ; auto-commit file = 2000 DHM_NOCRIT equ 2000h ; no critical errors = 0080 DHM_LOCAL equ 10000000b ; file is not inherited = 0070 DHM_SHAREMSK equ 01110000b ; sharing bits = 0000 DHM_COMPAT equ 00000000b = 0010 DHM_DENY_ALL equ 00010000b ; exclusive - deny all = 0020 DHM_DENY_WRITE equ 00100000b = 0030 DHM_DENY_READ equ 00110000b = 0040 DHM_DENY_NONE equ 01000000b = 000F DHM_RWMSK equ 00001111b ; read write bits = 0002 DHM_RW equ 00000010b ; file opened read/write = 0001 DHM_WO equ 00000001b ; file opened write only = 0000 DHM_RO equ 00000000b ; file opened read only = = ; = ; 01h to 03h To be Determined = ; = 0004 DHNDL_DATRB equ byte ptr 04h ; Disk attribute byte = 0005 DHNDL_ATTR equ byte ptr 05h ; Attribute Byte = 0005 DHNDL_WATTR equ word ptr 05h ; Attribute Word = = 8000 DHAT_REMOTE equ 8000h ; set if file remote = 4000 DHAT_TIMEOK equ 4000h ; set if timestamp up to date = 1000 DHAT_LOCAL equ 1000h ; file is not inherited = 0800 DHAT_NETPRN equ 0800h ; device is networked printer = 0080 DHAT_DEV equ 0080h ; device/file bit = 0040 DHAT_READY equ 0040h ; ready/not ready bit = 0040 DHAT_CLEAN equ 0040h ; this bit CLEAR if dirty = 0020 DHAT_BIN equ 0020h ; raw/cooked bit = 001F DHAT_DRVMSK equ 001Fh ; drive in bottom bits = 0008 DHAT_CLK equ 0008h ; -reserved- = 0004 DHAT_NUL equ 0004h ; handle is null device = 0002 DHAT_COT equ 0002h ; handle is console output device = 0001 DHAT_CIN equ 0001h ; handle is console input device = = 0007 DHNDL_DEVPTR equ dword ptr 07h ; 07 - pointer to device = 0007 DHNDL_DEVOFF equ word ptr 07h ; 07 - offset of device = 0009 DHNDL_DEVSEG equ word ptr 09h ; 09 - segment of device = 000B DHNDL_BLK1 equ word ptr 0Bh ; 0B - first cluster in file PC-DOS RASM-86 1.4a Source: CIO.A86 Page 27 = 000D DHNDL_TIME equ word ptr 0Dh ; 0D - file time stamp = 000F DHNDL_DATE equ word ptr 0Fh ; 0F - file date stamp = 0011 DHNDL_SIZE equ dword ptr 11h ; 11 - file length = 0011 DHNDL_SIZELO equ word ptr 11h = 0013 DHNDL_SIZEHI equ word ptr 13h = 0015 DHNDL_POS equ dword ptr 15h ; 15 - current file position = 0015 DHNDL_POSLO equ word ptr 15h = 0017 DHNDL_POSHI equ word ptr 17h = 0019 DHNDL_IDX equ word ptr 19h ; 19 - relative cluster within file of last read = 001B DHNDL_DBLK equ word ptr 1Bh ; 1B - cluster # of dir entry = 001E DHNDL_DCNTHI equ byte ptr 1Eh ; 1E - dir offset # within cluster = 001F DHNDL_DCNTLO equ byte ptr 1Fh ; 1F - dir offset # within cluster = 0020 DHNDL_NAME equ byte ptr 20h ; 20 - File/Device Name = 0028 DHNDL_EXT equ byte ptr 28h ; 28 - File extension = 002B DHNDL_SFT equ dword ptr 2Bh ; 2B - pointer to previous SFT = 002F DHNDL_UID equ word ptr 2Fh ; 2F - Owning Machine ID = 0031 DHNDL_PSP equ word ptr 31h ; 31 - Owning PSP = 0033 DHNDL_SHARE equ word ptr 33h ; 33 - Offset of sharing record = 0035 DHNDL_BLK equ word ptr 35h ; 35 - absolute cluster of last read = ; 37 - dword reserved for IFS = 003B DHNDL_LEN equ 3Bh = = ; With DOS 3 structures _DBLK is a 16 bit = = = ; Logical Drive Table format = 0000 LDT_NAME equ byte ptr 00h ; 00 - Ascii Name field = 0043 LDT_FLAGS equ word ptr 43h ; 43 - Flag field = 0045 LDT_PDT equ dword ptr 45h ; 45 - PDT for this drive = 0049 LDT_BLK equ word ptr 49h ; 49 - directory sector = 004B LDT_ROOT equ word ptr 4bh ; 4B - virtual block root = 004D LDT_DRV equ byte ptr 4dh ; 4D - physical drive = 004F LDT_ROOTLEN equ word ptr 4fh ; 4F - Length of root portion = 0058 LDT_LEN equ 58h = = 8000 LFLG_NETWRKD equ 8000h = 4000 LFLG_PHYSICAL equ 4000h = 2000 LFLG_JOINED equ 2000h = 1000 LFLG_SUBST equ 1000h 0001 CIO_CTLP equ 0000$0001b ; Printer Echo State 0002 CIO_HANDLE equ 0000$0010b ; use handle rather than Int 29 0004 CIO_RAW equ 0000$0100b ; no "cooked_status" checks 0050 CHECK_EVERY equ 80 ; check keyboard every "n" characters PCM_CODE CSEG BYTE extrn char_error:near extrn device_driver:near extrn dos_entry:near PC-DOS RASM-86 1.4a Source: CIO.A86 Page 28 extrn get_dseg:near extrn ifn2dhndl:near extrn int21_entry:near extrn int21_func:near extrn read_line:near extrn ReadTimeAndDate:near extrn reload_registers:near ; ***************************** ; *** DOS Function 01 *** ; *** Keybd Input W/Echo *** ; ***************************** ; Public func01 func01: ; ; Entry: ; AH == 01h ; Exit: ; AL == char ; 0000 E85E00 0061 call func08 ; Read 1 character from Standard Input ; and check for Control-C 0003 92 xchg ax,dx ; echo using common code ; ***************************** ; *** DOS Function 02 *** ; *** Display Output *** ; ***************************** ; Public func02 func02: ; ; Entry: ; AH == 02h ; DL == char to display ; 0004 52 push dx ; char on stack 0005 1607 push ss ! pop es 0007 8BF4 mov si,sp ; ES:DX -> character 0009 B90100 mov cx,1 000C E8C801 01D7 call stdout_cooked_write ; write character 000F 58 pop ax ; recover char 0010 C3 ret ; ***************************** ; *** DOS Function 03 *** ; *** Auxiliary Input *** ; ***************************** ; Public func03 func03: PC-DOS RASM-86 1.4a Source: CIO.A86 Page 29 ; ; Entry: ; AH == 03h ; Exit: ; AL == Char ; 0011 BB0300 mov bx,STDAUX ; Read 1 character from Standard AUX f03_10: 0014 E99301 01AA jmp raw_read ; ***************************** ; *** DOS Function 04 *** ; *** Auxiliary Output *** ; ***************************** ; Public func04 func04: ; ; Entry: ; AH == 04h ; DL == Character to output ; 0017 BB0300 mov bx,STDAUX ; write the character passed in DL 001A EB03 001F jmps f456common ; to the STDAUX Handle ; ***************************** ; *** DOS Function 05 *** ; *** Printer Output *** ; ***************************** ; Public func05 func05: ; ; Entry: ; AH == 05h ; DL == character to output to printer ; 001C BB0400 mov bx,STDPRN ; write the character passed in DL ; jmp f456common ; to the STDPRN Handle f456common: 001F 92 xchg ax,dx ; character in AL ; jmp hndl_write hndl_write: ;---------- ; On Entry: ; AL = character to write ; BX = handle ; On Exit: ; AL preserved ; PC-DOS RASM-86 1.4a Source: CIO.A86 Page 30 0020 E8B203 03D5 call is_device ; Does this handle refer to a device 0023 720B 0030 jc hndl_w10 0025 26F744041000 test es:DH_ATTRIB[si],DA_SPECIAL 002B 7403 0030 jz hndl_w10 ; Fast Console Output Using Int 29? 002D CD29 int 29h ; This device supports FAST console 002F C3 ret ; output so write this using Int29 hndl_w10: 0030 50 push ax ; character on stack 0031 8BD4 mov dx,sp ; SS:DX -> char 0033 B90100 mov cx,1 ; do a single character 0036 7205 003D jc hndl_w20 ; was it a file ? 0038 E8AF02 02EA call device_write ; send to device driver 003B EB07 0044 jmps hndl_w30 hndl_w20: 003D 1607 push ss ! pop es ; ES:DX -> character 003F B440 mov ah,MS_X_WRITE ; otherwise call the FDOS to do all 0041 E80000 E call dos_entry ; the hard work hndl_w30: 0044 58 pop ax 0045 C3 ret ; ***************************** ; *** DOS Function 06 *** ; *** Direct Console I/O *** ; ***************************** ; Public func06 func06: ; ; Entry: ; AH == 06h ; DL == 0FFh or Output char ; Exit: ; AL == Input char, if DL was 0FFh on input ; 0046 BB0100 mov bx,STDOUT ; Assume output DL to console 0049 80FAFF cmp dl,0FFH ; or is it input ? 004C 75D1 001F jne f456common 004E 4B dec bx ; mov bx,STDIN ; is there a character ready 004F E8D302 0325 call char_check ; to be input 0052 7405 0059 jz func07 0054 B80004 mov ax,RHS_IC ; set AL=0 and also set ZF on 0057 EB0E 0067 jmps funcICexit ; exit as incomplete char ; ***************************** ; *** DOS Function 07 *** ; *** Raw Input w/o echo *** ; ***************************** PC-DOS RASM-86 1.4a Source: CIO.A86 Page 31 ; Public func07 func07: ; ; Entry: ; AH == 07h ; Exit: ; AL == character ; 0059 BB0000 mov bx,STDIN 005C E84B01 01AA call raw_read ; extra status call made 005F EB06 0067 jmps funcICexit ; set incomplete char ; ***************************** ; *** DOS Function 08 *** ; *** Input w/o echo *** ; ***************************** ; Public func08 func08: ; ; Entry: ; AH == 08h ; Exit: ; AL == character ; 0061 BB0000 mov bx,STDIN ; Read 1 character from Standard Input 0064 E84D01 01B4 call cooked_read funcICexit: ; exit point for incomplete character support ; On Entry: ; AL = character ; AH = request header status (RHS_IC as on return from device driver) ; On Exit: ; AL = character ; dos_FLAGS ZF set if incomplete character ; 0067 C43E0000 E les di,int21regs_ptr ; point to callers registers 006B 26816516BFFF and es:reg_FLAGS[di],not ZERO_FLAG ; clear ZF 0071 F6C404 test ah,RHS_IC/256 ; is it an incomplete char ? 0074 7406 007C jz funcIC10 ; no - exit 0076 26814D164000 or es:reg_FLAGS[di],ZERO_FLAG ; yes - set ZF funcIC10: 007C C3 ret ; ***************************** ; *** DOS Function 09 *** ; *** Print String *** ; ***************************** ; Public func09 func09: PC-DOS RASM-86 1.4a Source: CIO.A86 Page 32 ; ; Entry: ; AH == 09h ; DS:DX == address of character string ; 007D B024 mov al,'$' ; it's terminated with a '$' 007F 8BFA mov di,dx ; locate the end of the string 0081 B9FFFF mov cx,0FFFFh ; and calculate its length 0084 F2AE repnz scasb 0086 F7D1 not cx 0088 49 dec cx ; CX is the character count 0089 8BF2 mov si,dx 008B E84901 01D7 call stdout_cooked_write ; ES:SI -> character buffer 008E B024 mov al,'$' 0090 C3 ret ; ***************************** ; *** DOS Function 0A *** ; *** Read String *** ; ***************************** ; Public func0A func0A: ; ; Entry: ; AH == 0Ah ; DS:DX == pointer to input buffer ; 0091 BB0000 mov bx,STDIN ; Read the editted line from STDIN 0094 B90100 mov cx,STDOUT ; and display the results on STDOUT 0097 E90000 E jmp read_line ; Read the Line ; ***************************** ; *** DOS Function 0B *** ; *** Console Status *** ; ***************************** ; Public func0B func0B: ; ; Entry: ; AH == 0Bh ; Exit: ; AL == 0FFh if char available ; == 00h otherwise ; 009A BB0000 mov bx,STDIN 009D E8AD00 014D call cooked_status ; Get the current handle status 00A0 B0FF mov al,0FFh ; Assume that the handle is ready 00A2 7402 00A6 jz f0B_exit ; and return 0FFh in AL PC-DOS RASM-86 1.4a Source: CIO.A86 Page 33 00A4 B000 mov al,00 ; Not Ready f0B_exit: 00A6 EBBF 0067 jmps funcICexit ; exit thru incomplete char support ; ***************************** ; *** DOS Function 0C *** ; *** Flush and Execute *** ; ***************************** ; Public func0C func0C: ; ; Entry: ; AH == 0Ch ; AL == function to execute: 1,6,7,8 or A ; Exit: ; AL = 0 if function in AL is invalid ; 00A8 50 push ax ; save sub-function 00A9 BB0000 mov bx,STDIN ; Is this Standard Input Handle a 00AC E82603 03D5 call is_device ; file or device. Do not flush the 00AF 720A 00BB jc f0C_20 ; buffer contents for a FILE f0C_10: 00B1 E8DB02 038F call hndl_instat ; check if any characters are left 00B4 7505 00BB jnz f0C_20 ; and quit when buffer empty 00B6 E8F100 01AA call raw_read ; read the character 00B9 EBF6 00B1 jmps f0C_10 ; loop till the buffer is empty f0C_20: 00BB 58 pop ax 00BC 3C01740C 00CC cmp al,01h ! je al_ok ; is legal for this command 00C0 3C0A7408 00CC cmp al,0ah ! je al_ok 00C4 3C06720C 00D4 cmp al,06h ! jb al_nogo 00C8 3C087708 00D4 cmp al,08h ! ja al_nogo al_ok: ; Valid function so now execute 00CC E80000 E call reload_registers ; all register reloaded as per entry 00CF 8AE0 mov ah,al ; Get the requested sub-function in AH 00D1 E90000 E jmp int21_func ; execute the function al_nogo: ; Illegal command to execute 00D4 33C0 xor ax,ax ; from this function so return error 00D6 C3 ret PC-DOS RASM-86 1.4a Source: CIO.A86 Page 34 eject ; ; BREAK_CHECK checks for a CNTRL-C and is called by functions 01h to ; 0Ch. Or by the entry code if the break flag is non zero. ; Public break_check break_check: 00D7 803E000001 E cmp indos_flag,01 ; Skip the check if we are 00DC 7513 00F1 jnz break_c15 ; already in the emulator 00DE 50 push ax 00DF 06 push es 00E0 56 push si 00E1 C4360000 E les si,con_device 00E5 E8B502 039D call device_instat ; get the input status 00E8 5E pop si 00E9 07 pop es 00EA 7504 00F0 jnz break_c10 ; No Character Ready 00EC 3C03 cmp al,CTLC ; Is the character a Control-C 00EE 7402 00F2 jz break_c20 ; Yes break_c10: 00F0 58 pop ax break_c15: 00F1 C3 ret break_c20: ; The User has Typed Control-C so flush 00F2 BBFFFF mov bx,0FFFFh ; input buffer (FFFF=con_device) 00F5 E8C400 01BC call char_get go_int23: 00F8 0E07 push cs ! pop es ; ES:DX -> Character Buffer 00FA BE0000 R mov si,offset cntrl_c_msg ; Message Offset 00FD B90400 mov cx,length cntrl_c_msg ; Message Length 0100 E8D400 01D7 call stdout_cooked_write ; write the ^C String to console ; ; Prepare to execute an Interrupt 23 (Break Check) and process ; the return values. If the called routine returns with an IRET ; or with a RETF and the carry flag reset continue the function ; otherwise Abort. ; 0103 8E060000 E mov es,current_psp ; Get the Entry SS and SP 0107 26A12E00 mov ax,PSP_USERSP ; Get the Users Stack Pointer 010B 051000 add ax,18 - 2 ; Compensate for the User Registers 010E A30000 E mov break_sp,ax ; and save for RETF check 0111 FA cli 0112 FE0E0000 E dec indos_flag ; Exit the PCDOS emulator 0116 268E163000 mov ss,PSP_USERSS ; Switch to the Users Stack 011B 268B262E00 mov sp,PSP_USERSP ; and Restore the registers 0120 585B595A5E5F POP$DOS ; Update the registers then 5D1F07 ; set the flags and return ; to the user 0129 F8 clc ; Default to continue function PC-DOS RASM-86 1.4a Source: CIO.A86 Page 35 012A CD23 int 23h ; Call the Break Handler 012C FA cli ; Check the Flag State 012D 730D 013C jnc do23_10 ; If CARRY then Abort this process 012F E80000 E call get_dseg ; Get our data segment 0132 C606000001 E mov exit_type,TERM_BREAK ; Force EXIT_TYPE to TERM_BREAK 0137 B8004C mov ax,4C00h ; "Good-Bye Cruel World" 013A EB0B 0147 jmps do23_20 do23_10: 013C 1E push ds ; Otherwise restart the aborted func 013D E80000 E call get_dseg 0140 3B260000 E cmp sp,break_sp 0144 1F pop ds ; Restore the the USER DS correct 0145 7403 014A jz do23_30 ; Did we Use a RETF or Not do23_20: 0147 83C402 add sp,2 ; Yes so correct the stack pointer do23_30: ; and restart the aborted function 014A E90000 E jmp int21_entry ; re-start the function call PC-DOS RASM-86 1.4a Source: CIO.A86 Page 36 eject ; ; cooked_status is called on input or output and looks for live keys ^C,^P,^S. ; If any of these are found they are dealt with. ; If ^P is encountered it is swallowed. ; If ^C is encountered we always do an Int23. ; If ^S is pressed we swallow it, and the next character (checking for ^C, but ; not for ^P), then say a character is ready. ; Note that this can lead to status calls (func0B) hanging inside the OS, ; or the return of ^S characters from input calls (func01), but this is ; intentional. ; cooked_status: ;------------- ; check input ; On Entry: ; BX = handle to check ; On Exit: ; ZF set if character available ; AL = character ; AH = RHS_IC ; 014D E887FF 00D7 call break_check ; check for a ^C on console 0150 E8D201 0325 call char_check ; is there a character ready 0153 7542 0197 jnz cooked_s50 ; no so keep scanning 0155 803E000000 E cmp last_key_ext,0 ; was last char an zero ? 015A C606000000 E mov last_key_ext,0 ; (clear flag for next time) 015F 752B 018C jne cooked_s40 ; skip ^P,^S,^C checks if so 0161 3C10 cmp al,CTLP ; has the user typed ^P 0163 750F 0174 jne cooked_s10 ; flush the buffer and 0165 8036000001 E xor cio_state,CIO_CTLP ; toggle ^P flag 016A E84F00 01BC call char_get ; flush the character from buffer 016D E8A302 0413 call open_or_close_prn ; open/close printer device 0170 85C0 test ax,ax ; ZF clear, ie. no char available 0172 EB23 0197 jmps cooked_s50 cooked_s10: 0174 3C03 cmp al,CTLC 0176 7506 017E jnz cooked_s30 ; has the user typed ^C 0178 E84100 01BC call char_get ; so get the RAW character cooked_s20: 017B E97AFF 00F8 jmp go_int23 ; and terminate the function cooked_s30: 017E 3C13 cmp al,CTLS ; pause if the user has typed 0180 750A 018C jnz cooked_s40 ; a ^S 0182 E83700 01BC call char_get ; remove ^S and resume when 0185 E81F00 01A7 call raw_read_wait ; the next character is typed 0188 3C03 cmp al,CTLC PC-DOS RASM-86 1.4a Source: CIO.A86 Page 37 018A 74EF 017B je cooked_s20 ; has the user typed ^C cooked_s40: 018C 3C00 cmp al,0 018E 7505 0195 jne cooked_s45 0190 C606000001 E mov last_key_ext,1 cooked_s45: 0195 3BC0 cmp ax,ax ; ZF set, ie. char available cooked_s50: 0197 C3 ret PC-DOS RASM-86 1.4a Source: CIO.A86 Page 38 eject ; ; The COOKED, CMDLINE and RAW Read functions are basically the same ; except in their treatment of 'live' characters ^C,^P, and ^S. ; COOKED will look for and act upon all three live characters. ; CMDLINE will look for and act upon ^C and ^P, but ^S will be returned ; so we can use it as a line editing key. ; RAW will not check for any live keys. ; public cmdline_read, raw_read ; for CMDLINE.PCM cmdline_read_wait: ; Waiting for a device to become 0198 E81701 02B2 call idle_dev ; ready. So call IDLE routines to ; put the processor to sleep. cmdline_read: 019B E839FF 00D7 call break_check ; check for a ^C on console 019E E88401 0325 call char_check ; is there a character ready 01A1 75F5 0198 jnz cmdline_read_wait ; no so keep scanning 01A3 3C13 cmp al,CTLS ; if the user has typed ^S 01A5 750D 01B4 jne cooked_read ; we have to do a raw read ; jmps raw_read ; else we do a cooked read raw_read_wait: ; Waiting for a device to become 01A7 E80801 02B2 call idle_dev ; ready. So call IDLE routines to ; put the processor to sleep. raw_read: 01AA E87801 0325 call char_check ; Is there a character Ready 01AD 75F8 01A7 jnz raw_read_wait ; loop until character available 01AF EB0B 01BC jmps char_get cooked_read_wait: ; Waiting for a device to become 01B1 E8FE00 02B2 call idle_dev ; ready. So call IDLE routines to ; put the processor to sleep. cooked_read: 01B4 E820FF 00D7 call break_check ; check for a ^C on console 01B7 E893FF 014D call cooked_status ; check for a ^S,^P,^C on handle BX 01BA 75F5 01B1 jnz cooked_read_wait ; wait until char is available ; jmps char_get ; else get the character char_get: 01BC 0650 push es ! push ax ; Input one character and 01BE 8BD4 mov dx,sp ; return it in AL 01C0 E81202 03D5 call is_device ; Does this handle refer to a device 01C3 B90100 mov cx,1 01C6 7206 01CE jc char_get30 ; if it's a device then 01C8 E81B01 02E6 call device_read ; use device_read char_get20: 01CB 5807 pop ax ! pop es 01CD C3 ret char_get30: ; We are redirected, so call to the FDOS to get a character PC-DOS RASM-86 1.4a Source: CIO.A86 Page 39 01CE 1607 push ss ! pop es ; EX:DX -> character to read 01D0 B43F mov ah,MS_X_READ ; call the FDOS to do all 01D2 E80000 E call dos_entry ; the hard work 01D5 EBF4 01CB jmps char_get20 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 40 eject stdout_cooked_write: 01D7 BB0100 mov bx,STDOUT ; output to the console device ; jmp cooked_write ; ; The COOKED_WRITE routine will expand TABS etc in the string ; passed passed by the calling routine. ; ; On Entry: ; ES:SI Buffer Address ; CX Character Count ; BX Output Handle ; On Exit: ; AL = last char written ; Public cooked_write cooked_write: 01DA 06 push es 01DB 53 push bx 01DC 8A260000 E mov ah,cio_state ; get CIO_CTLP status 01E0 80CC06 or ah,CIO_RAW+CIO_HANDLE ; assume we will want raw handle output 01E3 8AC3 mov al,bl 01E5 F606010080 E test byte ptr remote_call+1,DHM_FCB/100h 01EA 7513 01FF jnz cook_w03 01EC 8E060000 E mov es,current_psp ; get our PSP 01F0 263B1E3200 cmp bx,PSP_XFNMAX ; range check our handle 01F5 7333 022A jae cook_w05 01F7 26C43E3400 les di,PSP_XFTPTR 01FC 268A01 mov al,es:byte ptr [bx+di] ; AL = Internal File Handle cook_w03: 01FF E80000 E call ifn2dhndl ; ES:BX -> DHNDL_ 0202 7226 022A jc cook_w05 ; skip if bad handle 0204 268B5705 mov dx,es:DHNDL_WATTR[bx] ; get handle attributes 0208 81E2A380 and dx,DHAT_DEV+DHAT_CIN+DHAT_COT+DHAT_BIN+DHAT_REMOTE 020C 81FAA300 cmp dx,DHAT_DEV+DHAT_CIN+DHAT_COT+DHAT_BIN 0210 7409 021B je cook_w04 ; accept binary console device 0212 81FA8300 cmp dx,DHAT_DEV+DHAT_CIN+DHAT_COT 0216 7512 022A jne cook_w05 ; skip if not cooked console device 0218 80E4FB and ah,not CIO_RAW ; we want cooked output cook_w04: 021B 26C45F07 les bx,es:DHNDL_DEVPTR[bx] ; its the console - but is it FAST ? 021F 26F747041000 test es:DH_ATTRIB[bx],DA_SPECIAL 0225 7403 022A jz cook_w05 ; skip if not 0227 80E4FD and ah,not CIO_HANDLE ; don't use handle functions cook_w05: 022A 5B pop bx 022B 07 pop es 022C E34F 027D jcxz cook_w80 cook_w10: 022E 26AC lods es:al ; Read the next character PC-DOS RASM-86 1.4a Source: CIO.A86 Page 41 0230 3C7F7444 0278 cmp al,DEL ! je cook_w60 ; DEL is a NON Printing Character 0234 3C20733C 0274 cmp al,' ' ! jae cook_w50 ; Space and Above are Normal 0238 3C0A743C 0278 cmp al,LF ! je cook_w60 ; Just print LineFeeds 023C 3C1B7438 0278 cmp al,ESC ! je cook_w60 ; Just print Escape 0240 3C077434 0278 cmp al,BELL! je cook_w60 ; Just ring the Bell 0244 3C0D750C 0254 cmp al,CR ! jne cook_w20 ; CR zeros the column number 0248 C606000000 E mov column,0 024D C606000001 E mov char_count,1 ; check for ^S etc NOW 0252 EB24 0278 jmps cook_w60 cook_w20: 0254 3C087506 025E cmp al,CTLH ! jne cook_w30 ; BackSpace decrements the 0258 FE0E0000 E dec column ; column count by one 025C EB1A 0278 jmps cook_w60 cook_w30: 025E 3C097516 0278 cmp al,TAB ! jne cook_w60 ; is it a TAB ? cook_w40: 0262 B020 mov al,' ' ; spaces 0264 E81700 027E call cooked_out ; output a space char 0267 FE060000 E inc column 026B F606000007 E test column,7 ; are we at a TAB stop yet ? 0270 75F0 0262 jnz cook_w40 0272 EB07 027B jmps cook_w70 cook_w50: 0274 FE060000 E inc column ; Update the column count and cook_w60: 0278 E80300 027E call cooked_out ; output the character cook_w70: 027B E2B1 022E loop cook_w10 ; onto the next character cook_w80: 027D C3 ret cooked_out: ; On Entry: ; AH = handle status ; AL = character ; BX = handle ; On Exit: ; AX, BX, CX, ES:SI preserved ; 027E FE0E0000 E dec char_count ; time to check keyboard input ? 0282 7408 028C jz cooked_o10 ; no, skip status check 0284 F6C403 test ah,CIO_HANDLE+CIO_CTLP ; is it complicated ? 0287 7503 028C jnz cooked_o10 0289 CD29 int 29h ; This device supports FAST console 028B C3 ret cooked_o10: 028C 06 push es 028D 50 push ax 028E 51 push cx 028F 56 push si 0290 E88DFD 0020 call hndl_write ; display the character PC-DOS RASM-86 1.4a Source: CIO.A86 Page 42 0293 F6C401 test ah,CIO_CTLP ; Check for Printer Echo 0296 7408 02A0 jz cooked_o20 ; Off so No Echo 0298 53 push bx ; Save Output Handle 0299 BB0400 mov bx,STDPRN ; and output the same data to the 029C E881FD 0020 call hndl_write ; to the Printer Handle 029F 5B pop bx cooked_o20: 02A0 F6C404 test ah,CIO_RAW ; is it a cooked console ? 02A3 7508 02AD jnz cooked_o30 ; skip check if not 02A5 E8A5FE 014D call cooked_status ; look for keyboard input 02A8 C606000050 E mov char_count,CHECK_EVERY ; look again in a while cooked_o30: 02AD 5E pop si 02AE 59 pop cx 02AF 58 pop ax 02B0 07 pop es 02B1 C3 ret PC-DOS RASM-86 1.4a Source: CIO.A86 Page 43 eject ; IDLE_DEV is called when the PCMODE is waiting for a character. ; This routine must determine if the request is for a device or not ; and call the IDLE interface for device requests to the system can be ; put to sleep until a character is ready. ; ; On Entry:- BX Handle Number ; idle_dev: 02B2 53 push bx ; preserve handle 02B3 B80084 mov ax,8400h 02B6 CD2A int 2ah ; Server hook for idle 02B8 FE0E0000 R dec clock_count 02BC 7503 02C1 jnz idle_dev10 ; Zero if NO skip delay and execute 02BE E80000 E call ReadTimeAndDate ; for PC BIOS's who must read every day idle_dev10: if IDLE_DETECT 02C1 F706000000C0 E test idle_flags,IDLE_DISABLE ; Has Idle Checking been enabled 02C7 751B 02E4 jnz idle_dev40 ; Skip if NO 02C9 0656 push es ! push si 02CB E80701 03D5 call is_device ; The requested handle a file or device 02CE 7212 02E2 jc idle_dev30 ; File Access skip IDLE 02D0 B80300 mov ax,PROC_KEYIN ; Assume this is the REAL Console 02D3 26F744040100 test es:DH_ATTRIB[si],DA_ISCIN; Test Attribute Bits 02D9 7503 02DE jnz idle_dev20 ; Yes this is Default Console Device 02DB B80400 mov ax,PROC_DEVIN ; Input from Another Device idle_dev20: 02DE FF1E0000 E callf idle_vec ; Call the IDLE Handler idle_dev30: 02E2 5E07 pop si ! pop es idle_dev40: endif 02E4 5B pop bx ; recover handle 02E5 C3 ret PC-DOS RASM-86 1.4a Source: CIO.A86 Page 44 eject ; The following routine reads CX bytes from the device whose address ; is held in the DWORD pointer passed by DS:SI. A Request Header ; is built on the stack and the command is executed. ; ; On Entry: ; ES:SI DWORD Pointer to Device Header ; SS:DX Buffer Address ; CX Character Count ; ; On Exit: ; AX Request Header Status ; Zero No Error ; Public device_read device_read: 02E6 B004 mov al,CMD_INPUT ; we want input 02E8 EB02 02EC jmps device_common ; now use common code PC-DOS RASM-86 1.4a Source: CIO.A86 Page 45 eject ; The following routine writes CX bytes to the device whose address ; is held in the DWORD pointer passed by DS:SI. A Request Header ; is built on the stack and the command is executed. ; ; On Entry: ; ES:SI DWORD Pointer to Device Header ; SS:DX Buffer Address ; CX Character Count ; ; On Exit: ; AX Request Header Status ; Zero No Error ; Public device_write device_write: 02EA B008 mov al,CMD_OUTPUT ; we want output device_common: 02EC 53 push bx 02ED 83EC1E sub sp,RH4_LEN ; reserve space on the stack 02F0 8BDC mov bx,sp ; request header offset 02F2 36C6071E mov ss:RH_LEN,RH4_LEN ; request header length 02F6 3689570E mov ss:RH4_BUFOFF,dx ; buffer offset 02FA 368C5710 mov ss:RH4_BUFSEG,ss ; buffer segment device_common10: 02FE 36894F12 mov ss:RH4_COUNT,cx ; character count 0302 E8B300 03B8 call device_req ; execute command 0305 7916 031D jns device_common20 ; if no errors return to the caller 0307 362B4F12 sub cx,ss:RH4_COUNT ; CX = chars remaining 030B 50 push ax ; save the error code 030C E80000 E call char_error ; ask int 24 what to do 030F 3C01 cmp al,ERR_RETRY ; should we retry the operation ? 0311 58 pop ax ; recover the error code 0312 7709 031D ja device_common20 ; Fail/Abort return error 0314 368A4702 mov al,ss:RH_CMD ; reload the command 0318 74E4 02FE je device_common10 ; Retry, re-issue the device request 031A B80001 mov ax,RHS_DONE ; Ignore, pretend no errors device_common20: 031D 83C41E add sp,RH4_LEN ; restore the stack to its normal 0320 A90080 test ax,RHS_ERROR ; state and return the status. 0323 5B pop bx 0324 C3 ret char_check: ; On Entry: ; BX = handle to check ; On Exit: ; ZF set if character ready ; AL = character (if device handle) ; AH = RIC status ; PC-DOS RASM-86 1.4a Source: CIO.A86 Page 46 0325 53 push bx ; Save the current handle status if IDLE_DETECT 0326 F706000000C0 E test idle_flags,IDLE_DISABLE ; Has Idle Checking been enabled 032C 7513 0341 jnz char_check10 ; Skip if NO 032E FF0E0000 E dec int28_delay ; Has the INT28 Loop count reached 0332 750D 0341 jnz char_check10 ; Zero if NO skip delay and execute 0334 A10000 E mov ax,int28_reload ; INT28. Otherwise DELAY/DISPATCH 0337 A30000 E mov int28_delay,ax 033A B80200 mov ax,PROC_INT28 ; Process is IDLE 033D FF1E0000 E callf idle_vec ; Call the IDLE Handler char_check10: endif 0341 803E000001 E cmp indos_flag,1 ; Only execute an INT 28 0346 7546 038E jnz char_check20 ; when the INDOS flag is 1 0348 803E0000FF E cmp int28_flag,TRUE ; Only generate INT 28s for the 034D 753F 038E jnz char_check20 ; selected functions 034F FF360000 E push remote_call 0353 FF360000 E push machine_id 0357 8E060000 E mov es,current_psp ; Get the PSP 035B 26FF362E00 push PSP_USERSP ; Save the SS:SP pointer to 0360 26FF363000 push PSP_USERSS ; the register image if IDLE_DETECT ; Set IDLE_INT28 so $IDLE$ knows 0365 810E00000400 E or idle_flags,IDLE_INT28 ; that we are nolonger inside DOS endif 036B CD28 int 28h ; Execute an INT 28 for SideKick and ; the PRINT utility. INDOS flag is 1 if IDLE_DETECT ; Reset IDLE_INT28 so $IDLE$ knows 036D 81260000FBFF E and idle_flags,not IDLE_INT28; that we are back DOS endif 0373 C6060000FF E mov int28_flag,TRUE ; Restore INT28_FLAG 0378 8E060000 E mov es,current_psp ; Get the PSP 037C 268F063000 pop PSP_USERSS ; Restore the SS:SP pointer to 0381 268F062E00 pop PSP_USERSP ; the register image 0386 8F060000 E pop machine_id 038A 8F060000 E pop remote_call char_check20: 038E 5B pop bx ; jmp hndl_instat ; Check Input Status. ZERO == Ready ; ; hndl_instat: 038F E84300 03D5 call is_device ; Does this handle refer to a device 0392 7309 039D jnc device_instat 0394 B80644 mov ax,(MS_X_IOCTL shl 8)+6 ; Get the file status 0397 E80000 E call dos_entry ; for the specified handle 039A 3CFF cmp al,0FFh ; and return ZERO until the EOF 039C C3 ret PC-DOS RASM-86 1.4a Source: CIO.A86 Page 47 ; The following routine executes the Non Destructive Input ; command to the device whose address passed in ES:SI. ; ; On Entry: ; ES:SI DWORD Pointer to Device Header ; ; On Exit: ; Zero Character Ready ; AH Top Byte Request Header Status ; AL Next Character if ZERO ; device_instat: 039D 53 push bx 039E 83EC0E sub sp,RH5_LEN ; Reserve Space on the Stack 03A1 8BDC mov bx,sp ; Request Header Offset 03A3 36C6070E mov ss:RH_LEN,RH5_LEN ; Set Request Header Length 03A7 B005 mov al,CMD_INPUT_NOWAIT ; Command Number 03A9 E80C00 03B8 call device_req ; Execute the Command 03AC 368A470D mov al,ss:RH5_CHAR ; Assume a character is ready 03B0 83C40E add sp,RH5_LEN ; Restore the Stack to its normal 03B3 A90002 test ax,RHS_BUSY ; state and return the status. 03B6 5B pop bx ; Zero if a Character is ready 03B7 C3 ret ; The following routine handles the low level device interface to ; the character device drivers. All the generic Request Header ; initialization is carried out here. ; ; On Entry: ; AL Command ; ES:SI Device Header ; SS:BX Current Request Header ; ; On Exit: ; AX Request Header Status ; device_req: ;---------- 03B8 36884702 mov ss:RH_CMD,al ; save the command 03BC 1E push ds 03BD 06 push es 03BE 061F push es ! pop ds ; DS:SI -> device driver 03C0 368E060000 E mov es,ss:current_psp ; es = current PSP 03C5 26A03C00 mov al,es:PSP_RIC ; al = Return Interim Character flag 03C9 3688470D mov ss:RH4_RIC,al ; Return Interim Char flag 03CD 1607 push ss ! pop es ; ES:BX -> RH_ 03CF E80000 E call device_driver 03D2 07 pop es 03D3 1F pop ds 03D4 C3 ret PC-DOS RASM-86 1.4a Source: CIO.A86 Page 48 PC-DOS RASM-86 1.4a Source: CIO.A86 Page 49 eject ; ; IS_DEVICE checks the internal handle structures to determine ; if the handle referenced in BX is a file or device. Invalid ; handles all map to the default console device. ; ; On Entry: ; BX Handle Number ; ; On Exit: ; CY set if handle is for a file ; CY clear if handle is for device at ES:SI ; is_device: 03D5 50 push ax 03D6 53 push bx ; Convert the Standard Handle number 03D7 8BC3 mov ax,bx ; get XFN in AL ; mov cx,current_psp ; into an internal handle number ; jcxz is_dev10 ; no PSP, we have IFN already ; mov es,cx 03D9 F606010080 E test byte ptr remote_call+1,DHM_FCB/100h; if FCB initiated access 03DE 7513 03F3 jnz is_dev10 ; we have IFN already 03E0 8E060000 E mov es,current_psp 03E4 263B1E3200 cmp bx,es:PSP_XFNMAX ; Check if the handle is in range for 03E9 7322 040D jae is_dev_bad ; this PSP. 03EB 26C4363400 les si,es:PSP_XFTPTR 03F0 268A00 mov al,es:byte ptr [bx+si] ; AL = Internal File Handle is_dev10: 03F3 E80000 E call ifn2dhndl ; ES:BX -> DHNDL_ 03F6 7215 040D jc is_dev_bad 03F8 268B4705 mov ax,es:DHNDL_WATTR[bx] ; get file attributes 03FC 258080 and ax,DHAT_REMOTE+DHAT_DEV 03FF 3D8000 cmp ax,DHAT_DEV ; is it a local device ? 0402 F9 stc ; assume it's a file 0403 7505 040A jne is_dev30 0405 26C47707 les si,es:DHNDL_DEVPTR[bx] ; its a device is_dev20: 0409 F8 clc is_dev30: 040A 5B pop bx 040B 58 pop ax 040C C3 ret is_dev_bad: 040D C4360000 E les si,con_device ; bad handles map to console 0411 EBF6 0409 jmps is_dev20 open_or_close_prn: ;----------------- ; called when CIO_CTLP toggled - call prn device with Open or Close as appropri ; 0413 1E5053 push ds ! push ax ! push bx PC-DOS RASM-86 1.4a Source: CIO.A86 Page 50 0416 B81000 mov ax,CTLP 0419 50 push ax ; ^P on stack 041A 8B0E0000 E mov cx,current_psp ; look in PSP 041E E36C 048C jcxz oc_prn30 ; no PSP, forget it 0420 8EC1 mov es,cx 0422 263B1E3200 cmp bx,PSP_XFNMAX ; Check if the handle is in range for 0427 7363 048C jae oc_prn30 ; this PSP. 0429 26C4363400 les si,es:PSP_XFTPTR ; for the internal handle number 042E 268A4404 mov al,es:byte ptr STDPRN[si] 0432 3CFF cmp al,0FFh ; AL = Internal File Handle 0434 7456 048C je oc_prn30 ; skip if invalid Handle Number 0436 E80000 E call ifn2dhndl ; ES:BX -> doshndl 0439 7251 048C jc oc_prn30 043B 26F747050008 test es:DHNDL_WATTR[bx],DHAT_NETPRN 0441 7413 0456 jz oc_prn10 0443 B82611 mov ax,I2F_CTLP ; turn on the network printer 0446 CD2F int 2fh ; with a magic INT 2F call 0448 730C 0456 jnc oc_prn10 044A 80260000FE E and cio_state,not CIO_CTLP ; make sure Printer Echo is off 044F B82411 mov ax,I2F_CTLP_ERR 0452 CD2F int 2fh 0454 EB36 048C jmps oc_prn30 oc_prn10: 0456 268B4705 mov ax,es:DHNDL_WATTR[bx] ; get file attributes 045A 258080 and ax,DHAT_REMOTE+DHAT_DEV 045D 3D8000 cmp ax,DHAT_DEV ; is it a local device ? 0460 752A 048C jne oc_prn30 0462 B00D mov al,CMD_DEVICE_OPEN ; assume we've just opened 0464 F606000001 E test cio_state,CIO_CTLP ; Check for Printer Echo 0469 7502 046D jnz oc_prn20 ; yes, skip next bit 046B B00E mov al,CMD_DEVICE_CLOSE ; no, we must close oc_prn20: 046D 26C47707 les si,es:DHNDL_DEVPTR[bx] ; get the device driver address 0471 26F744040008 test es:DH_ATTRIB[si],DA_REMOVE 0477 7413 048C jz oc_prn30 ; no, skip call if not supported 0479 83EC0D sub sp,RH13_LEN ; Reserve Space on the Stack 047C 8BDC mov bx,sp ; and point to it 047E 36C6070D mov ss:RH_LEN,RH13_LEN ; Set Request Header Length 0482 36884702 mov ss:RH_CMD,al ; Command Number 0486 E80000 E call device_driver ; issue the command 0489 83C40D add sp,RH13_LEN ; Restore the Stack to its normal oc_prn30: 048C 58 pop ax ; discard ^P from stack 048D 5B581F pop bx ! pop ax ! pop ds 0490 C3 ret PCM_RODATA CSEG WORD 0000 5E430D0A cntrl_c_msg db '^C', CR, LF ; Control-Break Message GLOBAL_DATA dseg PC-DOS RASM-86 1.4a Source: CIO.A86 Page 51 0000 00 clock_count db 0 PCMODE_DATA DSEG WORD extrn break_sp:word ; For Control-Break handler extrn char_count:byte extrn cio_state:byte ; Character I/O State extrn column:byte ; Console Cursor Location extrn con_device:dword ; Current Console Device extrn current_psp:word ; Current PSP Address extrn exit_type:byte extrn last_key_ext:byte extrn indos_flag:byte ; INDOS Count extrn int21regs_ptr:dword ; pointer to callers registers extrn machine_id:word extrn remote_call:word if IDLE_DETECT extrn idle_flags:word ; IDLE State Flags extrn idle_vec:dword ; IDLE routine Vector extrn int28_delay:word extrn int28_reload:word extrn int28_flag:byte endif end End of assembly. Number of errors: 0. Use factor: 37%  if IDLE_DETECT extrn idle_flags:word ; IDLE Sta