     1                                  ; ****************************************************************************
     2                                  ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Last Update: 16/01/2017
     5                                  ; ----------------------------------------------------------------------------
     6                                  ; Beginning: 04/01/2016
     7                                  ; ----------------------------------------------------------------------------
     8                                  ; Assembler: NASM version 2.11 (trdos386.s)
     9                                  ; ----------------------------------------------------------------------------
    10                                  ; Turkish Rational DOS
    11                                  ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                                  ;
    13                                  ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                                  ; unix386.s (03/01/2016)
    15                                  ;
    16                                  ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    17                                  ; TRDOS2.ASM (09/11/2011)
    18                                  ; 
    19                                  ; Derived from 'IBM PC-XT-286' BIOS source code (1986) 
    20                                  ; ****************************************************************************
    21                                  
    22                                  KLOAD	equ 10000h ; Kernel loading address
    23                                  	; NOTE: Retro UNIX 8086 v1 /boot code loads kernel at 1000h:0000h 
    24                                  KCODE	equ 08h	; Code segment descriptor (ring 0)
    25                                  KDATA	equ 10h	; Data segment descriptor (ring 0)
    26                                  ; 19/03/2015
    27                                  UCODE	equ 1Bh ; 18h + 3h  (ring 3)
    28                                  UDATA	equ 23h ; 20h + 3h  (ring 3)
    29                                  ; 24/03/2015
    30                                  TSS	equ 28h	; Task state segment descriptor (ring 0)
    31                                  ; 19/03/2015
    32                                  CORE	equ 400000h  ; Start of USER's virtual/linear address space 
    33                                  		     ; (at the end of the 1st 4MB)
    34                                  ECORE	equ 0FFC00000h ; End of USER's virtual address space (4GB - 4MB)
    35                                  		     ; ULIMIT = (ECORE/4096) - 1 = 0FFBFFh (in GDT)
    36                                  
    37                                  ;; 27/12/2013
    38                                  ;KEND    equ KLOAD + 65536 ; (28/12/2013) (end of kernel space)
    39                                  ; 04/07/2016
    40                                  KEND    equ KERNELFSIZE + KLOAD
    41                                  
    42                                  
    43                                  
    44                                  ; IBM PC/AT BIOS ----- 10/06/85 (postequ.inc)
    45                                  ;--------- CMOS TABLE LOCATION ADDRESS'S -------------------------------------
    46                                  CMOS_SECONDS	EQU	00H		; SECONDS (BCD)
    47                                  CMOS_SEC_ALARM	EQU	01H		; SECONDS ALARM (BCD)
    48                                  CMOS_MINUTES	EQU	02H		; MINUTES (BCD)
    49                                  CMOS_MIN_ALARM	EQU	03H		; MINUTES ALARM (BCD) 	
    50                                  CMOS_HOURS	EQU	04H		; HOURS (BCD
    51                                  CMOS_HR_ALARM	EQU	005H		; HOURS ALARM   (BCD)
    52                                  CMOS_DAY_WEEK	EQU	06H		; DAY OF THE WEEK  (BCD)
    53                                  CMOS_DAY_MONTH	EQU	07H		; DAY OF THE MONTH (BCD) 
    54                                  CMOS_MONTH	EQU	08H		; MONTH (BCD)
    55                                  CMOS_YEAR	EQU	09H		; YEAR (TWO DIGITS) (BCD)
    56                                  CMOS_CENTURY	EQU	32H		; DATE CENTURY BYTE (BCD)
    57                                  CMOS_REG_A	EQU	0AH		; STATUS REGISTER A
    58                                  CMOS_REG_B	EQU	00BH		; STATUS REGISTER B  ALARM
    59                                  CMOS_REG_C	EQU	00CH		; STATUS REGISTER C  FLAGS
    60                                  CMOS_REG_D	EQU	0DH		; STATUS REGISTER D  BATTERY
    61                                  CMOS_SHUT_DOWN	EQU	0FH		; SHUTDOWN STATUS COMMAND BYTE
    62                                  ;----------------------------------------
    63                                  ;	CMOS EQUATES FOR THIS SYSTEM	;
    64                                  ;-----------------------------------------------------------------------------
    65                                  CMOS_PORT	EQU	070H		; I/O ADDRESS OF CMOS ADDRESS PORT
    66                                  CMOS_DATA	EQU	071H		; I/O ADDRESS OF CMOS DATA PORT
    67                                  NMI		EQU	10000000B	; DISABLE NMI INTERRUPTS MASK -
    68                                  					; HIGH BIT OF CMOS LOCATION ADDRESS
    69                                  
    70                                  ; Memory Allocation Table Address
    71                                  ; 05/11/2014
    72                                  ; 31/10/2014
    73                                  MEM_ALLOC_TBL	equ	100000h		; Memory Allocation Table at the end of
    74                                  					; the 1st 1 MB memory space.
    75                                  					; (This address must be aligned
    76                                  					;  on 128 KB boundary, if it will be
    77                                  					;  changed later.)
    78                                  					; ((lower 17 bits of 32 bit M.A.T.
    79                                  					;   address must be ZERO)).
    80                                  					; ((((Reason: 32 bit allocation 
    81                                  					;     instructions, dword steps)))
    82                                  					; (((byte >> 12 --> page >> 5)))  
    83                                  ;04/11/2014	
    84                                  PDE_A_PRESENT	equ	1		; Present flag for PDE
    85                                  PDE_A_WRITE	equ 	2		; Writable (write permission) flag
    86                                  PDE_A_USER	equ	4		; User (non-system/kernel) page flag
    87                                  ;
    88                                  PTE_A_PRESENT	equ	1		; Present flag for PTE (bit 0)
    89                                  PTE_A_WRITE	equ 	2		; Writable (write permission) flag (bit 1)
    90                                  PTE_A_USER	equ	4		; User (non-system/kernel) page flag (bit 2)
    91                                  PTE_A_ACCESS    equ	32		; Accessed flag (bit 5) ; 09/03/2015
    92                                  
    93                                  ; 17/02/2015 (unix386.s)
    94                                  ; 10/12/2014 - 30/12/2014 (0B000h -> 9000h) (dsectrm2.s)
    95                                  DPT_SEGM equ 09000h  ; FDPT segment (EDD v1.1, EDD v3)
    96                                  ;
    97                                  HD0_DPT	 equ 0	    ; Disk parameter table address for hd0
    98                                  HD1_DPT	 equ 32	    ; Disk parameter table address for hd1
    99                                  HD2_DPT	 equ 64	    ; Disk parameter table address for hd2
   100                                  HD3_DPT	 equ 96	    ; Disk parameter table address for hd3
   101                                  
   102                                  
   103                                  ; FDPT (Phoenix, Enhanced Disk Drive Specification v1.1, v3.0)
   104                                  ;      (HDPT: Programmer's Guide to the AMIBIOS, 1993)
   105                                  ;
   106                                  FDPT_CYLS	equ 0 ; 1 word, number of cylinders
   107                                  FDPT_HDS	equ 2 ; 1 byte, number of heads
   108                                  FDPT_TT		equ 3 ; 1 byte, A0h = translated FDPT with logical values
   109                                  		      ; otherwise it is standard FDPT with physical values 	
   110                                  FDPT_PCMP	equ 5 ; 1 word, starting write precompensation cylinder
   111                                  		      ; (obsolete for IDE/ATA drives)
   112                                  FDPT_CB		equ 8 ; 1 byte, drive control byte
   113                                  			; Bits 7-6 : Enable or disable retries (00h = enable)
   114                                  			; Bit 5	: 1 = Defect map is located at last cyl. + 1
   115                                  			; Bit 4 : Reserved. Always 0
   116                                  			; Bit 3 : Set to 1 if more than 8 heads
   117                                  			; Bit 2-0 : Reserved. Alsways 0
   118                                  FDPT_LZ		equ 12 ; 1 word, landing zone (obsolete for IDE/ATA drives)
   119                                  FDPT_SPT	equ 14 ; 1 byte, sectors per track
   120                                  
   121                                  ; Floppy Drive Parameters Table (Programmer's Guide to the AMIBIOS, 1993)
   122                                  ; (11 bytes long) will be used by diskette handler/bios
   123                                  ; which is derived from IBM PC-AT BIOS (DISKETTE.ASM, 21/04/1986).
   124                                  
   125                                  ; 01/02/2016
   126                                  Logical_DOSDisks equ 90000h + 100h ; 26*256 = 6656 bytes
   127                                  Directory_Buffer equ 80000h ; max = 64K Bytes
   128                                  FAT_Buffer	 equ 91C00h ; 1536 bytes (3 sectors)
   129                                  ; 15/02/2016
   130                                  Cluster_Buffer	 equ 70000h ; max = 64K Bytes ; buffer for file read & write
   131                                  ; 11/04/2016
   132                                  Env_Page:	 equ 93000h ; 512 bytes (4096 bytes)
   133                                  Env_Page_Size	 equ 512    ; (4096 bytes)
   134                                  ; 30/07/2016
   135                                  Video_Pg_Backup	 equ 98000h ; Mode 3h, video page backup (32K, 8 pages)				 	  		 	  
   136                                  
   137                                  [BITS 16]       ; We need 16-bit intructions for Real mode
   138                                  
   139                                  [ORG 0] 
   140                                  	; 12/11/2014
   141                                  	; Save boot drive number (that is default root drive)
   142 00000000 8816[00FC]              	mov	[boot_drv], dl ; physical drv number
   143                                  
   144                                  	; Determine installed memory
   145                                  	; 31/10/2014
   146                                  	;
   147 00000004 B801E8                  	mov	ax, 0E801h ; Get memory size 
   148 00000007 CD15                    	int	15h	   ; for large configurations
   149 00000009 7308                    	jnc	short chk_ms
   150 0000000B B488                    	mov	ah, 88h    ; Get extended memory size 
   151 0000000D CD15                    	int	15h
   152                                  	;	   
   153                                  	;mov	al, 17h	; Extended memory (1K blocks) low byte
   154                                  	;out	70h, al ; select CMOS register
   155                                  	;in	al, 71h ; read data (1 byte)
   156                                  	;mov	cl, al
   157                                  	;mov	al, 18h ; Extended memory (1K blocks) high byte
   158                                  	;out	70h, al ; select CMOS register
   159                                  	;in	al, 71h ; read data (1 byte)
   160                                  	;mov	ch, al
   161                                   	;      
   162 0000000F 89C1                    	mov	cx, ax
   163 00000011 31D2                    	xor	dx, dx
   164                                  chk_ms:
   165 00000013 890E[FCFB]              	mov	[mem_1m_1k], cx
   166 00000017 8916[FEFB]              	mov	[mem_16m_64k], dx
   167                                  	; 05/11/2014
   168                                  	;and	dx, dx
   169                                  	;jz	short L2
   170 0000001B 81F90004                        cmp     cx, 1024
   171 0000001F 7315                    	jnb	short L0
   172                                  		 ; insufficient memory_error	
   173                                  		 ; Minimum 2 MB memory is needed... 
   174                                  	; 05/11/2014
   175                                  	; (real mode error printing)
   176 00000021 FB                      	sti
   177 00000022 BE[CFFE]                	mov	si, msg_out_of_memory
   178 00000025 BB0700                  	mov	bx, 7
   179 00000028 B40E                    	mov	ah, 0Eh	; write tty
   180                                  oom_1:
   181 0000002A AC                      	lodsb
   182 0000002B 08C0                    	or	al, al
   183 0000002D 7404                    	jz	short oom_2
   184 0000002F CD10                    	int	10h
   185 00000031 EBF7                    	jmp	short oom_1
   186                                  oom_2:
   187 00000033 F4                              hlt
   188 00000034 EBFD                    	jmp	short oom_2
   189                                  
   190                                  L0:
   191                                  %include 'diskinit.s' ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - diskinit.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 09/07/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; diskinit.inc (10/07/2015)
    15                              <1> ;
    16                              <1> ; Derived from 'IBM PC-XT-286' BIOS source code (1986) 
    17                              <1> ; ****************************************************************************
    18                              <1> 
    19                              <1> ; Retro UNIX 386 v1 Kernel - DISKINIT.INC
    20                              <1> ; Last Modification: 10/07/2015
    21                              <1> 
    22                              <1> ; DISK I/O SYSTEM INITIALIZATION - Erdogan Tan (Retro UNIX 386 v1 project)
    23                              <1> 
    24                              <1> ; ///////// DISK I/O SYSTEM STRUCTURE INITIALIZATION ///////////////
    25                              <1> 
    26                              <1> 	; 10/12/2014 - 02/02/2015 - dsectrm2.s
    27                              <1> ;L0:
    28                              <1> 	; 12/11/2014 (Retro UNIX 386 v1 - beginning)
    29                              <1> 	; Detecting disk drives... (by help of ROM-BIOS)
    30 00000036 BA7F00              <1> 	mov	dx, 7Fh
    31                              <1> L1:	
    32 00000039 FEC2                <1> 	inc	dl
    33 0000003B B441                <1> 	mov	ah, 41h ; Check extensions present
    34                              <1> 			; Phoenix EDD v1.1 - EDD v3
    35 0000003D BBAA55              <1> 	mov	bx, 55AAh
    36 00000040 CD13                <1> 	int 	13h
    37 00000042 721A                <1> 	jc	short L2
    38                              <1> 
    39 00000044 81FB55AA            <1> 	cmp	bx, 0AA55h
    40 00000048 7514                <1> 	jne	short L2
    41 0000004A FE06[03FC]          <1> 	inc	byte [hdc]	; count of hard disks (EDD present)
    42 0000004E 8816[02FC]          <1>         mov     [last_drv], dl  ; last hard disk number
    43 00000052 BB[86FB]            <1> 	mov	bx, hd0_type - 80h
    44 00000055 01D3                <1> 	add	bx, dx	 
    45 00000057 880F                <1> 	mov	[bx], cl ; Interface support bit map in CX
    46                              <1> 			 ; Bit 0 - 1, Fixed disk access subset ready
    47                              <1> 			 ; Bit 1 - 1, Drv locking and ejecting ready
    48                              <1> 			 ; Bit 2 - 1, Enhanced Disk Drive Support
    49                              <1>                          ;            (EDD) ready (DPTE ready)
    50                              <1> 			 ; Bit 3 - 1, 64bit extensions are present
    51                              <1>                          ;            (EDD-3)
    52                              <1> 			 ; Bit 4 to 15 - 0, Reserved
    53 00000059 80FA83              <1> 	cmp	dl, 83h	 ; drive number < 83h
    54 0000005C 72DB                <1> 	jb	short L1
    55                              <1> L2:
    56                              <1> 	; 23/11/2014
    57                              <1> 	; 19/11/2014
    58 0000005E 30D2                <1> 	xor	dl, dl  ; 0
    59                              <1> 	; 04/02/2016 (esi -> si)
    60 00000060 BE[04FC]            <1> 	mov	si, fd0_type
    61                              <1> L3:
    62                              <1> 	; 14/01/2015
    63 00000063 8816[01FC]          <1> 	mov	[drv], dl
    64                              <1> 	;
    65 00000067 B408                <1> 	mov 	ah, 08h ; Return drive parameters
    66 00000069 CD13                <1> 	int	13h	
    67 0000006B 7210                <1> 	jc	short L4
    68                              <1> 		; BL = drive type (for floppy drives)
    69                              <1> 		; DL = number of floppy drives
    70                              <1> 		;		
    71                              <1> 		; ES:DI = Address of DPT from BIOS
    72                              <1> 		;
    73 0000006D 881C                <1> 	mov	[si], bl ;  Drive type
    74                              <1> 			; 4 = 1.44 MB, 80 track, 3 1/2"
    75                              <1> 	; 14/01/2015
    76 0000006F E8BC01              <1> 	call	set_disk_parms
    77                              <1> 	; 10/12/2014
    78 00000072 81FE[04FC]          <1> 	cmp	si, fd0_type
    79 00000076 7705                <1> 	ja	short L4
    80 00000078 46                  <1> 	inc	si ; fd1_type
    81 00000079 B201                <1> 	mov	dl, 1
    82 0000007B EBE6                <1> 	jmp	short L3
    83                              <1> L4:
    84                              <1> 	; Older BIOS (INT 13h, AH = 48h is not available)
    85 0000007D B27F                <1> 	mov	dl, 7Fh
    86                              <1> 	; 24/12/2014 (Temporary)
    87 0000007F 803E[03FC]00        <1> 	cmp	byte [hdc], 0 ; EDD present or not ?	
    88 00000084 0F879000            <1>         ja      L10       ; yes, all fixed disk operations
    89                              <1> 			  ; will be performed according to
    90                              <1> 			  ; present EDD specification
    91                              <1> L6:
    92 00000088 FEC2                <1> 	inc 	dl
    93 0000008A 8816[01FC]          <1>         mov     [drv], dl
    94 0000008E 8816[02FC]          <1>         mov     [last_drv], dl ; 14/01/2015
    95 00000092 B408                <1> 	mov 	ah, 08h ; Return drive parameters
    96 00000094 CD13                <1> 	int	13h	; (conventional function)
    97 00000096 0F828601            <1>         jc      L13	; fixed disk drive not ready
    98 0000009A 8816[03FC]          <1>         mov     [hdc], dl ; number of drives
    99                              <1> 	;; 14/01/2013
   100                              <1> 	;;push	cx
   101 0000009E E88D01              <1> 	call	set_disk_parms
   102                              <1> 	;;pop	cx
   103                              <1> 	;
   104                              <1> 	;;and	cl, 3Fh	 ; sectors per track (bits 0-6)
   105 000000A1 8A16[01FC]          <1>         mov     dl, [drv]
   106 000000A5 BB0401              <1> 	mov	bx, 65*4 ; hd0 parameters table (INT 41h)	
   107 000000A8 80FA80              <1> 	cmp	dl, 80h
   108 000000AB 7603                <1> 	jna	short L7
   109 000000AD 83C314              <1> 	add	bx, 5*4	 ; hd1 parameters table (INT 46h)
   110                              <1> L7:	
   111 000000B0 31C0                <1> 	xor	ax, ax
   112 000000B2 8ED8                <1> 	mov	ds, ax
   113 000000B4 8B37                <1>         mov     si, [bx]
   114 000000B6 8B4702              <1>         mov     ax, [bx+2] 
   115 000000B9 8ED8                <1> 	mov	ds, ax
   116 000000BB 3A4C0E              <1>         cmp     cl, [si+FDPT_SPT] ; sectors per track 
   117 000000BE 0F855A01            <1>         jne     L12 ; invalid FDPT
   118 000000C2 BF0000              <1> 	mov	di, HD0_DPT
   119 000000C5 80FA80              <1> 	cmp	dl, 80h
   120 000000C8 7603                <1> 	jna	short L8
   121 000000CA BF2000              <1> 	mov	di, HD1_DPT 
   122                              <1> L8:
   123                              <1> 	; 30/12/2014
   124 000000CD B80090              <1> 	mov	ax, DPT_SEGM
   125 000000D0 8EC0                <1> 	mov	es, ax
   126                              <1> 	; 24/12/2014
   127 000000D2 B90800              <1> 	mov	cx, 8
   128 000000D5 F3A5                <1> 	rep	movsw  ; copy 16 bytes to the kernel's DPT location
   129 000000D7 8CC8                <1> 	mov	ax, cs
   130 000000D9 8ED8                <1> 	mov	ds, ax
   131                              <1> 	; 02/02/2015
   132 000000DB 8A0E[01FC]          <1>         mov     cl, [drv]
   133 000000DF 88CB                <1> 	mov	bl, cl
   134 000000E1 B8F001              <1> 	mov	ax, 1F0h
   135 000000E4 80E301              <1> 	and	bl, 1
   136 000000E7 7406                <1> 	jz	short L9
   137 000000E9 C0E304              <1> 	shl	bl, 4
   138 000000EC 2D8000              <1> 	sub	ax, 1F0h-170h
   139                              <1> L9:
   140 000000EF AB                  <1> 	stosw	; I/O PORT Base Address (1F0h, 170h)
   141 000000F0 050602              <1> 	add	ax, 206h
   142 000000F3 AB                  <1> 	stosw	; CONTROL PORT Address (3F6h, 376h)	
   143 000000F4 88D8                <1> 	mov	al, bl
   144 000000F6 04A0                <1> 	add	al, 0A0h
   145 000000F8 AA                  <1> 	stosb	; Device/Head Register upper nibble
   146                              <1> 	;
   147 000000F9 FE06[01FC]          <1> 	inc	byte [drv]
   148 000000FD BB[86FB]            <1> 	mov	bx, hd0_type - 80h
   149 00000100 01CB                <1> 	add	bx, cx
   150 00000102 800F80              <1>         or      byte [bx], 80h  ; present sign (when lower nibble is 0)
   151 00000105 A0[03FC]            <1> 	mov	al, [hdc]
   152 00000108 FEC8                <1> 	dec	al
   153 0000010A 0F841201            <1>         jz      L13
   154 0000010E 80FA80              <1> 	cmp	dl, 80h
   155 00000111 0F8673FF            <1>         jna     L6
   156 00000115 E90801              <1>         jmp     L13
   157                              <1> L10:
   158 00000118 FEC2                <1> 	inc 	dl
   159                              <1> 	; 25/12/2014
   160 0000011A 8816[01FC]          <1> 	mov	[drv], dl
   161 0000011E B408                <1> 	mov 	ah, 08h ; Return drive parameters
   162 00000120 CD13                <1> 	int	13h	; (conventional function)
   163 00000122 0F82FA00            <1>         jc      L13
   164                              <1> 	; 14/01/2015
   165 00000126 8A16[01FC]          <1> 	mov	dl, [drv]
   166 0000012A 52                  <1> 	push	dx
   167 0000012B 51                  <1> 	push	cx
   168 0000012C E8FF00              <1> 	call	set_disk_parms
   169 0000012F 59                  <1> 	pop	cx
   170 00000130 5A                  <1> 	pop	dx
   171                              <1> 	; 06/07/2016 (BugFix for >64K kernel files)
   172                              <1> 	; 04/02/2016 (esi -> si)
   173                              <1> 	;mov	si, _end ; 30 byte temporary buffer address 	
   174                              <1> 	;		 ; at the '_end' of kernel.
   175                              <1> 	;mov	word [si], 30
   176                              <1> 	; 06/07/2016
   177 00000131 BE[E9FE]            <1> 	mov	si, _int13h_48h_buffer
   178                              <1> 	; 09/07/2016
   179 00000134 B81E00              <1> 	mov	ax, 001Eh
   180 00000137 8824                <1> 	mov	[si], ah ; 0
   181 00000139 46                  <1> 	inc	si
   182 0000013A 8904                <1> 	mov	word [si], ax
   183                              <1>  	; word [si] = 30
   184                              <1> 	;
   185 0000013C B448                <1> 	mov	ah, 48h	 ; Get drive parameters (EDD function)
   186 0000013E CD13                <1> 	int	13h
   187 00000140 0F82DC00            <1>         jc      L13
   188                              <1> 	; 04/02/2016 (ebx -> bx)
   189                              <1> 	; 14/01/2015
   190 00000144 28FF                <1> 	sub	bh, bh
   191 00000146 88D3                <1> 	mov	bl, dl
   192 00000148 80EB80              <1> 	sub	bl, 80h
   193 0000014B 81C3[06FC]          <1> 	add	bx, hd0_type
   194 0000014F 8A07                <1> 	mov 	al, [bx]
   195 00000151 0C80                <1> 	or	al, 80h
   196 00000153 8807                <1> 	mov 	[bx], al	
   197 00000155 81EB[04FC]          <1> 	sub	bx, hd0_type - 2 ; 15/01/2015
   198 00000159 81C3[50FC]          <1> 	add	bx, drv.status
   199 0000015D 8807                <1> 	mov	[bx], al
   200                              <1> 	; 04/02/2016 (eax -> ax)
   201 0000015F 8B4410              <1> 	mov	ax, [si+16]
   202 00000162 854412              <1> 	test	ax, [si+18]
   203 00000165 7412                <1> 	jz	short L10_A0h 
   204                              <1> 			; 'CHS only' disks on EDD system 
   205                              <1> 			;  are reported with ZERO disk size
   206 00000167 81EB[50FC]          <1> 	sub	bx, drv.status
   207 0000016B C1E302              <1> 	shl	bx, 2
   208 0000016E 81C3[34FC]          <1> 	add	bx, drv.size ; disk size (in sectors)
   209 00000172 8907                <1> 	mov	[bx], ax
   210 00000174 8B4412              <1> 	mov	ax, [si+18]
   211 00000177 8907                <1> 	mov	[bx], ax
   212                              <1> 
   213                              <1> L10_A0h: ; Jump here to fix a ZERO (LBA) disk size problem 
   214                              <1> 	 ; for CHS disks (28/02/2015)
   215                              <1> 	; 30/12/2014
   216 00000179 BF0000              <1> 	mov	di, HD0_DPT
   217 0000017C 88D0                <1> 	mov	al, dl
   218 0000017E 83E003              <1> 	and 	ax, 3
   219 00000181 C0E005              <1> 	shl	al, 5 ; *32
   220 00000184 01C7                <1> 	add 	di, ax
   221 00000186 B80090              <1> 	mov	ax, DPT_SEGM
   222 00000189 8EC0                <1> 	mov	es, ax
   223                              <1> 	;
   224 0000018B 88E8                <1> 	mov	al, ch	; max. cylinder number (bits 0-7)
   225 0000018D 88CC                <1> 	mov	ah, cl	
   226 0000018F C0EC06              <1> 	shr	ah, 6	; max. cylinder number (bits 8-9)
   227 00000192 40                  <1>  	inc	ax	; logical cylinders (limit 1024)
   228 00000193 AB                  <1> 	stosw		
   229 00000194 88F0                <1> 	mov	al, dh	; max. head number
   230 00000196 FEC0                <1> 	inc	al
   231 00000198 AA                  <1> 	stosb		; logical heads (limits 256)
   232 00000199 B0A0                <1> 	mov	al, 0A0h ; Indicates translated table
   233 0000019B AA                  <1> 	stosb
   234 0000019C 8A440C              <1> 	mov	al, [si+12]
   235 0000019F AA                  <1> 	stosb		 ; physical sectors per track
   236 000001A0 31C0                <1>  	xor	ax, ax
   237                              <1> 	;dec	ax	 ; 02/01/2015 
   238 000001A2 AB                  <1> 	stosw		 ; precompensation (obsolete)
   239                              <1> 	;xor	al, al	 ; 02/01/2015	
   240 000001A3 AA                  <1> 	stosb		 ; reserved
   241 000001A4 B008                <1> 	mov	al, 8	 ; drive control byte
   242                              <1> 		         ; (do not disable retries, 
   243                              <1> 			 ; more than 8 heads)
   244 000001A6 AA                  <1> 	stosb
   245 000001A7 8B4404              <1> 	mov	ax, [si+4]
   246 000001AA AB                  <1> 	stosw		 ; physical number of cylinders	
   247                              <1> 	;push	ax	 ; 02/01/2015
   248 000001AB 8A4408              <1> 	mov	al, [si+8]
   249 000001AE AA                  <1> 	stosb		 ; physical num. of heads (limit 16)
   250 000001AF 29C0                <1> 	sub 	ax, ax
   251                              <1> 	;pop	ax	 ; 02/01/2015	
   252 000001B1 AB                  <1> 	stosw		 ; landing zone (obsolete)
   253 000001B2 88C8                <1> 	mov	al, cl	 ; logical sectors per track (limit 63)
   254 000001B4 243F                <1> 	and 	al, 3Fh	
   255 000001B6 AA                  <1> 	stosb
   256                              <1> 	;sub	al, al	 ; checksum
   257                              <1> 	;stosb
   258                              <1> 	;
   259 000001B7 83C61A              <1> 	add	si, 26   ; (BIOS) DPTE address pointer
   260 000001BA AD                  <1> 	lodsw
   261 000001BB 50                  <1> 	push	ax	 ; (BIOS) DPTE offset
   262 000001BC AD                  <1> 	lodsw
   263 000001BD 50                  <1> 	push	ax	 ; (BIOS) DPTE segment
   264                              <1> 	;
   265                              <1> 	; checksum calculation
   266 000001BE 89FE                <1> 	mov	si, di
   267 000001C0 06                  <1> 	push	es
   268 000001C1 1F                  <1> 	pop	ds
   269                              <1> 	;mov	cx, 16
   270 000001C2 B90F00              <1> 	mov 	cx, 15
   271 000001C5 29CE                <1> 	sub	si, cx
   272 000001C7 30E4                <1> 	xor	ah, ah
   273                              <1> 	;del	cl
   274                              <1> L11:		
   275 000001C9 AC                  <1> 	lodsb
   276 000001CA 00C4                <1> 	add	ah, al
   277 000001CC E2FB                <1> 	loop	L11
   278                              <1> 	;
   279 000001CE 88E0                <1> 	mov	al, ah
   280 000001D0 F6D8                <1> 	neg	al	; -x+x = 0
   281 000001D2 AA                  <1> 	stosb		; put checksum in byte 15 of the tbl
   282                              <1> 	;
   283 000001D3 1F                  <1> 	pop	ds	; (BIOS) DPTE segment
   284 000001D4 5E                  <1> 	pop	si	; (BIOS) DPTE offset	
   285                              <1> 	;
   286                              <1> 	; 23/02/2015
   287 000001D5 57                  <1> 	push	di
   288                              <1> 	; ES:DI points to DPTE (FDPTE) location
   289                              <1> 	;mov	cx, 8
   290 000001D6 B108                <1> 	mov	cl, 8
   291 000001D8 F3A5                <1> 	rep	movsw	
   292                              <1> 	;
   293                              <1> 	; 23/02/2015
   294                              <1> 	; (P)ATA drive and LBA validation
   295                              <1> 	; (invalidating SATA drives and setting
   296                              <1> 	; CHS type I/O for old type fixed disks)
   297 000001DA 5B                  <1> 	pop	bx
   298 000001DB 8CC8                <1> 	mov	ax, cs
   299 000001DD 8ED8                <1> 	mov	ds, ax
   300 000001DF 268B07              <1> 	mov	ax, [es:bx]
   301 000001E2 3DF001              <1> 	cmp	ax, 1F0h
   302 000001E5 7418                <1> 	je	short L11a
   303 000001E7 3D7001              <1> 	cmp	ax, 170h
   304 000001EA 7413                <1> 	je	short L11a
   305                              <1> 	; invalidation 
   306                              <1> 	; (because base port address is not 1F0h or 170h)
   307 000001EC 30FF                <1> 	xor	bh, bh
   308 000001EE 88D3                <1> 	mov	bl, dl
   309 000001F0 80EB80              <1> 	sub	bl, 80h
   310 000001F3 C687[06FC]00        <1> 	mov	byte [bx+hd0_type], 0 ; not a valid disk drive !		
   311 000001F8 808F[52FC]F0        <1>         or      byte [bx+drv.status+2], 0F0h ; (failure sign)
   312 000001FD EB14                <1> 	jmp	short L11b
   313                              <1> L11a:	
   314                              <1> 	; LBA validation
   315 000001FF 268A4704            <1> 	mov	al, [es:bx+4] ; Head register upper nibble
   316 00000203 A840                <1> 	test	al, 40h ; LBA bit (bit 6)
   317 00000205 750C                <1> 	jnz	short L11b ; LBA type I/O is OK! (E0h or F0h)
   318                              <1> 	; force CHS type I/O for this drive (A0h or B0h)
   319 00000207 28FF                <1> 	sub	bh, bh
   320 00000209 88D3                <1> 	mov	bl, dl
   321 0000020B 80EB80              <1> 	sub	bl, 80h ; 26/02/2015
   322 0000020E 80A7[52FC]FE        <1>         and     byte [bx+drv.status+2], 0FEh ; clear bit 0
   323                              <1> 				; bit 0 = LBA ready bit
   324                              <1> 	; 'diskio' procedure will check this bit !
   325                              <1> L11b:
   326 00000213 3A16[02FC]          <1> 	cmp	dl, [last_drv] ; 25/12/2014
   327 00000217 7307                <1>         jnb     short L13
   328 00000219 E9FCFE              <1>         jmp     L10
   329                              <1> L12:
   330                              <1> 	; Restore data registers
   331 0000021C 8CC8                <1> 	mov	ax, cs
   332 0000021E 8ED8                <1> 	mov	ds, ax	
   333                              <1> L13:
   334                              <1> 	; 13/12/2014
   335 00000220 0E                  <1> 	push	cs
   336 00000221 07                  <1> 	pop	es
   337                              <1> L14:
   338 00000222 B411                <1> 	mov 	ah, 11h
   339 00000224 CD16                <1> 	int 	16h
   340 00000226 7466                <1> 	jz 	short L16 ; no keys in keyboard buffer
   341 00000228 B010                <1> 	mov	al, 10h
   342 0000022A CD16                <1> 	int 	16h
   343 0000022C EBF4                <1> 	jmp 	short L14
   344                              <1> 
   345                              <1> set_disk_parms:
   346                              <1> 	; 04/02/2016 (ebx -> bx)
   347                              <1> 	; 10/07/2015
   348                              <1> 	; 14/01/2015
   349                              <1> 	;push	bx
   350 0000022E 28FF                <1> 	sub	bh, bh
   351 00000230 8A1E[01FC]          <1> 	mov	bl, [drv]
   352 00000234 80FB80              <1> 	cmp	bl, 80h
   353 00000237 7203                <1> 	jb	short sdp0
   354 00000239 80EB7E              <1> 	sub	bl, 7Eh
   355                              <1> sdp0:	
   356 0000023C 81C3[50FC]          <1> 	add	bx, drv.status
   357 00000240 C60780              <1>   	mov	byte [bx], 80h ; 'Present' flag
   358                              <1> 	;
   359 00000243 88E8                <1> 	mov	al, ch ; last cylinder (bits 0-7)
   360 00000245 88CC                <1> 	mov	ah, cl ; 
   361 00000247 C0EC06              <1> 	shr	ah, 6  ; last cylinder (bits 8-9)
   362 0000024A 81EB[50FC]          <1> 	sub	bx, drv.status
   363 0000024E D0E3                <1> 	shl	bl, 1
   364 00000250 81C3[0AFC]          <1> 	add	bx, drv.cylinders
   365 00000254 40                  <1> 	inc	ax  ; convert max. cyl number to cyl count		
   366 00000255 8907                <1> 	mov	[bx], ax
   367 00000257 50                  <1> 	push	ax ; ** cylinders
   368 00000258 81EB[0AFC]          <1> 	sub	bx, drv.cylinders
   369 0000025C 81C3[18FC]          <1> 	add	bx, drv.heads
   370 00000260 30E4                <1> 	xor	ah, ah
   371 00000262 88F0                <1> 	mov	al, dh ; heads
   372 00000264 40                  <1> 	inc	ax
   373 00000265 8907                <1> 	mov	[bx], ax
   374 00000267 81EB[18FC]          <1>         sub     bx, drv.heads
   375 0000026B 81C3[26FC]          <1>         add     bx, drv.spt
   376 0000026F 30ED                <1> 	xor	ch, ch
   377 00000271 80E13F              <1> 	and	cl, 3Fh	; sectors (bits 0-6)
   378 00000274 890F                <1> 	mov	[bx], cx
   379 00000276 81EB[26FC]          <1>         sub     bx, drv.spt
   380 0000027A D1E3                <1> 	shl	bx, 1
   381 0000027C 81C3[34FC]          <1> 	add	bx, drv.size ; disk size (in sectors)
   382                              <1> 	; LBA size = cylinders * heads * secpertrack
   383 00000280 F7E1                <1> 	mul	cx 
   384 00000282 89C2                <1> 	mov	dx, ax	; heads*spt					
   385 00000284 58                  <1> 	pop	ax ; ** cylinders
   386 00000285 48                  <1> 	dec	ax ; 1 cylinder reserved (!?)
   387 00000286 F7E2                <1> 	mul	dx ; cylinders * (heads*spt)		
   388 00000288 8907                <1> 	mov	[bx], ax
   389 0000028A 895702              <1> 	mov	[bx+2], dx
   390                              <1> 	;
   391                              <1> 	;pop	bx
   392 0000028D C3                  <1> 	retn
   393                              <1> 
   394                              <1> L16:	; 28/05/2016
   192                                  
   193                                  	; 10/11/2014
   194 0000028E FA                           	cli	; Disable interrupts (clear interrupt flag)
   195                                  		; Reset Interrupt MASK Registers (Master&Slave)
   196                                  	;mov	al, 0FFh	; mask off all interrupts
   197                                  	;out	21h, al		; on master PIC (8259)
   198                                  	;jmp 	$+2  ; (delay)
   199                                  	;out	0A1h, al	; on slave PIC (8259)
   200                                  	;
   201                                  	; Disable NMI 
   202 0000028F B080                    	mov   	al, 80h 
   203 00000291 E670                    	out   	70h, al		; set bit 7 to 1 for disabling NMI
   204                                  	;23/02/2015
   205                                  	;nop			;
   206                                  	;in	al, 71h		; read in 71h just after writing out to 70h
   207                                  				; for preventing unknown state (!?)
   208                                  	;
   209                                   	; 20/08/2014
   210                                  	; Moving the kernel 64 KB back (to physical address 0)
   211                                  	; DS = CS = 1000h
   212                                  	; 05/11/2014
   213 00000293 31C0                    	xor	ax, ax
   214 00000295 8EC0                    	mov	es, ax ; ES = 0
   215                                  	;
   216                                  	; 04/07/2016 -  TRDOS 386 (64K - 128K kernel)
   217 00000297 31F6                          	xor	si, si
   218 00000299 31FF                    	xor	di, di
   219 0000029B B90040                  	mov	cx, 16384
   220 0000029E F366A5                  	rep	movsd
   221                                  	;
   222 000002A1 06                      	push	es ; 0
   223 000002A2 68[A602]                	push	L17
   224 000002A5 CB                      	retf
   225                                  L17:
   226 000002A6 B90010                  	mov	cx, 1000h
   227 000002A9 8EC1                    	mov	es, cx  ; 1000h 
   228 000002AB 01C9                    	add	cx, cx
   229 000002AD 8ED9                    	mov	ds, cx  ; 2000h
   230 000002AF 29F6                    	sub	si, si
   231 000002B1 29FF                    	sub	di, di
   232 000002B3 B90040                  	mov	cx, 16384
   233 000002B6 F366A5                  	rep	movsd
   234                                  	
   235                                  	; Turn off the floppy drive motor
   236 000002B9 BAF203                          mov     dx, 3F2h
   237 000002BC EE                              out     dx, al ; 0 ; 31/12/2013
   238                                  
   239                                  	; Enable access to memory above one megabyte
   240                                  L18:
   241 000002BD E464                    	in	al, 64h
   242 000002BF A802                    	test	al, 2
   243 000002C1 75FA                            jnz     short L18
   244 000002C3 B0D1                    	mov	al, 0D1h	; Write output port
   245 000002C5 E664                    	out	64h, al
   246                                  L19:
   247 000002C7 E464                    	in	al, 64h
   248 000002C9 A802                    	test	al, 2
   249 000002CB 75FA                            jnz     short L19
   250 000002CD B0DF                    	mov	al, 0DFh	; Enable A20 line
   251 000002CF E660                    	out	60h, al
   252                                  ;L20:
   253                                  	;
   254                                  	; Load global descriptor table register
   255                                  
   256                                          ;mov     ax, cs
   257                                          ;mov     ds, ax
   258                                  
   259 000002D1 2E0F0116[70F6]                  lgdt    [cs:gdtd]
   260                                  
   261 000002D7 0F20C0                          mov     eax, cr0
   262                                  	; or 	eax, 1
   263 000002DA 40                      	inc     ax
   264 000002DB 0F22C0                  	mov     cr0, eax
   265                                  
   266                                  	; Jump to 32 bit code
   267                                  	
   268 000002DE 66                      	db 66h 			; Prefix for 32-bit
   269 000002DF EA                      	db 0EAh 		; Opcode for far jump
   270 000002E0 [E6020000]              	dd StartPM 		; Offset to start, 32-bit
   271                                  				; (1000h:StartPM = StartPM + 10000h)
   272 000002E4 0800                    	dw KCODE		; This is the selector for CODE32_DESCRIPTOR,
   273                                  				; assuming that StartPM resides in code32
   274                                  
   275                                  [BITS 32] 
   276                                  
   277                                  StartPM:
   278                                  	; Kernel Base Address = 0 ; 30/12/2013
   279 000002E6 66B81000                	mov ax, KDATA           ; Save data segment identifier
   280 000002EA 8ED8                            mov ds, ax              ; Move a valid data segment into DS register
   281 000002EC 8EC0                           	mov es, ax              ; Move data segment into ES register
   282 000002EE 8EE0                           	mov fs, ax              ; Move data segment into FS register
   283 000002F0 8EE8                          	mov gs, ax              ; Move data segment into GS register
   284 000002F2 8ED0                            mov ss, ax              ; Move data segment into SS register
   285 000002F4 BC00000900                      mov esp, 90000h         ; Move the stack pointer to 090000h
   286                                  
   287                                  clear_bss: ; Clear uninitialized data area
   288                                  	; 11/03/2015
   289 000002F9 31C0                    	xor  eax, eax ; 0
   290 000002FB B9BF090000              	mov  ecx, (bss_end - bss_start)/4
   291                                  	;shr  ecx, 2 ; bss section is already aligned for double words
   292 00000300 BF[F42D0100]            	mov  edi, bss_start	
   293 00000305 F3AB                    	rep  stosd  		
   294                                  
   295                                  memory_init:
   296                                  	; Initialize memory allocation table and page tables
   297                                  	; 16/11/2014
   298                                  	; 15/11/2014
   299                                  	; 07/11/2014
   300                                  	; 06/11/2014
   301                                  	; 05/11/2014
   302                                  	; 04/11/2014
   303                                  	; 31/10/2014 (Retro UNIX 386 v1 - Beginning) 
   304                                  	;
   305                                  ;	xor	eax, eax
   306                                  ;	xor 	ecx, ecx
   307 00000307 B108                    	mov	cl, 8
   308 00000309 BF00001000              	mov	edi, MEM_ALLOC_TBL	
   309 0000030E F3AB                    	rep	stosd		   ; clear Memory Allocation Table
   310                                  				   ; for the first 1 MB memory
   311                                  	;
   312 00000310 668B0D[FCFB0000]        	mov	cx, [mem_1m_1k]	   ; Number of contiguous KB between
   313                                  				   ; 1 and 16 MB, max. 3C00h = 15 MB.
   314 00000317 66C1E902                	shr	cx, 2		   ; convert 1 KB count to 4 KB count
   315 0000031B 890D[E8300100]          	mov	[free_pages], ecx
   316 00000321 668B15[FEFB0000]        	mov	dx, [mem_16m_64k]  ; Number of contiguous 64 KB blocks
   317                                  				   ; between 16 MB and 4 GB.	
   318 00000328 6609D2                  	or	dx, dx
   319 0000032B 7413                    	jz	short mi_0
   320                                  	;
   321 0000032D 6689D0                  	mov	ax, dx
   322 00000330 C1E004                  	shl	eax, 4		   ; 64 KB -> 4 KB (page count)
   323 00000333 0105[E8300100]          	add	[free_pages], eax
   324 00000339 0500100000              	add	eax, 4096	   ; 16 MB = 4096 pages
   325 0000033E EB07                    	jmp	short mi_1
   326                                  mi_0:
   327 00000340 6689C8                  	mov	ax, cx
   328 00000343 66050001                	add	ax, 256		   ; add 256 pages for the first 1 MB		 
   329                                  mi_1:
   330 00000347 A3[E4300100]            	mov	[memory_size], eax ; Total available memory in pages
   331                                  				   ; 1 alloc. tbl. bit = 1 memory page
   332                                  				   ; 32 allocation bits = 32 mem. pages   
   333                                  	;
   334 0000034C 05FF7F0000              	add	eax, 32767	   ; 32768 memory pages per 1 M.A.T. page 	
   335 00000351 C1E80F                  	shr	eax, 15		   ; ((32768 * x) + y) pages (y < 32768)
   336                                  				   ;  --> x + 1 M.A.T. pages, if y > 0
   337                                  				   ;  --> x M.A.T. pages, if y = 0
   338 00000354 66A3[F8300100]          	mov	[mat_size], ax	   ; Memory Alloc. Table Size in pages		
   339 0000035A C1E00C                  	shl	eax, 12		   ; 1 M.A.T. page = 4096 bytes
   340                                  	;			   ; Max. 32 M.A.T. pages (4 GB memory)
   341 0000035D 89C3                    	mov	ebx, eax	   ; M.A.T. size in bytes
   342                                  	; Set/Calculate Kernel's Page Directory Address
   343 0000035F 81C300001000            	add	ebx, MEM_ALLOC_TBL
   344 00000365 891D[E0300100]          	mov	[k_page_dir], ebx  ; Kernel's Page Directory address
   345                                  				   ; just after the last M.A.T. page
   346                                  	;
   347 0000036B 83E804                  	sub	eax, 4		   ; convert M.A.T. size to offset value
   348 0000036E A3[F0300100]            	mov	[last_page], eax   ; last page ofset in the M.A.T.
   349                                  	;			   ; (allocation status search must be 
   350                                  				   ; stopped after here)	
   351 00000373 31C0                    	xor	eax, eax
   352 00000375 48                      	dec	eax		   ; FFFFFFFFh (set all bits to 1)	
   353 00000376 6651                    	push	cx
   354 00000378 C1E905                  	shr	ecx, 5		   ; convert 1 - 16 MB page count to 
   355                                  				   ; count of 32 allocation bits
   356 0000037B F3AB                    	rep	stosd
   357 0000037D 6659                    	pop	cx
   358 0000037F 40                      	inc	eax		   ; 0	
   359 00000380 80E11F                  	and	cl, 31		   ; remain bits
   360 00000383 7412                    	jz	short mi_4
   361 00000385 8907                    	mov	[edi], eax	   ; reset	
   362                                  mi_2:
   363 00000387 0FAB07                  	bts	[edi], eax	   ; 06/11/2014		
   364 0000038A FEC9                    	dec	cl
   365 0000038C 7404                    	jz	short mi_3
   366 0000038E FEC0                    	inc	al
   367 00000390 EBF5                    	jmp	short mi_2
   368                                  mi_3:
   369 00000392 28C0                    	sub	al, al	   	   ; 0
   370 00000394 83C704                  	add	edi, 4		   ; 15/11/2014
   371                                  mi_4:
   372 00000397 6609D2                  	or	dx, dx		  ; check 16M to 4G memory space	
   373 0000039A 7421                    	jz	short mi_6	  ; max. 16 MB memory, no more...
   374                                  	;	
   375 0000039C B900021000              	mov	ecx, MEM_ALLOC_TBL + 512 ; End of first 16 MB memory
   376                                  	;	
   377 000003A1 29F9                    	sub	ecx, edi	  ; displacement (to end of 16 MB)
   378 000003A3 7406                    	jz	short mi_5	  ; jump if EDI points to 
   379                                  				  ;         end of first 16 MB	
   380 000003A5 D1E9                    	shr	ecx, 1		  ; convert to dword count
   381 000003A7 D1E9                    	shr	ecx, 1		  ; (shift 2 bits right) 
   382 000003A9 F3AB                    	rep 	stosd		  ; reset all bits for reserved pages
   383                                  				  ; (memory hole under 16 MB)
   384                                  mi_5:
   385 000003AB 6689D1                  	mov	cx, dx		  ; count of 64 KB memory blocks
   386 000003AE D1E9                    	shr	ecx, 1		  ; 1 alloc. dword per 128 KB memory
   387 000003B0 9C                      	pushf			  ; 16/11/2014		
   388 000003B1 48                      	dec	eax		  ; FFFFFFFFh (set all bits to 1)
   389 000003B2 F3AB                    	rep	stosd
   390 000003B4 40                      	inc	eax		  ; 0
   391 000003B5 9D                      	popf			  ; 16/11/2014
   392 000003B6 7305                    	jnc	short mi_6
   393 000003B8 6648                    	dec	ax		  ; eax = 0000FFFFh
   394 000003BA AB                      	stosd
   395 000003BB 6640                    	inc	ax		  ; 0		
   396                                  mi_6:
   397 000003BD 39DF                    	cmp	edi, ebx	  ; check if EDI points to 	
   398 000003BF 730A                    	jnb	short mi_7	  ; end of memory allocation table
   399                                  	;			  ; (>= MEM_ALLOC_TBL + 4906) 
   400 000003C1 89D9                    	mov	ecx, ebx	  ; end of memory allocation table
   401 000003C3 29F9                    	sub	ecx, edi	  ; convert displacement/offset
   402 000003C5 D1E9                    	shr	ecx, 1		  ; to dword count 	 		
   403 000003C7 D1E9                    	shr	ecx, 1		  ; (shift 2 bits right) 
   404 000003C9 F3AB                    	rep 	stosd		  ; reset all remain M.A.T. bits
   405                                  mi_7:
   406                                  	; Reset M.A.T. bits in M.A.T. (allocate M.A.T. pages)
   407 000003CB BA00001000              	mov	edx, MEM_ALLOC_TBL
   408                                  	;sub	ebx, edx	  ; Mem. Alloc. Tbl. size in bytes
   409                                  	;shr	ebx, 12		  ; Mem. Alloc. Tbl. size in pages	
   410 000003D0 668B0D[F8300100]        	mov	cx, [mat_size]	  ; Mem. Alloc. Tbl. size in pages
   411 000003D7 89D7                    	mov	edi, edx
   412 000003D9 C1EF0F                  	shr	edi, 15		  ; convert M.A.T. address to
   413                                  				  ; byte offset in M.A.T.
   414                                  				  ; (1 M.A.T. byte points to 
   415                                  				  ;	      32768 bytes)
   416                                  				  ; Note: MEM_ALLOC_TBL address 
   417                                  				  ; must be aligned on 128 KB 
   418                                  				  ; boundary!
   419 000003DC 01D7                    	add	edi, edx	  ; points to M.A.T.'s itself	
   420                                  	; eax = 0
   421 000003DE 290D[E8300100]          	sub	[free_pages], ecx ; 07/11/2014
   422                                  mi_8:
   423 000003E4 0FB307                  	btr	[edi], eax	  ; clear bit 0 to bit x (1 to 31)
   424                                  	;dec	bl
   425 000003E7 FEC9                    	dec	cl
   426 000003E9 7404                    	jz	short mi_9
   427 000003EB FEC0                    	inc	al
   428 000003ED EBF5                    	jmp	short mi_8
   429                                  mi_9:
   430                                  	;
   431                                  	; Reset Kernel's Page Dir. and Page Table bits in M.A.T.
   432                                  	;		(allocate pages for system page tables)
   433                                  
   434                                  	; edx = MEM_ALLOC_TBL
   435 000003EF 8B0D[E4300100]          	mov	ecx, [memory_size] ; memory size in pages (PTEs)
   436 000003F5 81C1FF030000            	add	ecx, 1023	 ; round up (1024 PTEs per table)	 	
   437 000003FB C1E90A                  	shr	ecx, 10		 ; convert memory page count to 
   438                                  				 ; page table count (PDE count)
   439                                  	;
   440 000003FE 51                      	push	ecx		 ; (**) PDE count (<= 1024)
   441                                  	;
   442 000003FF 41                      	inc	ecx		 ; +1 for kernel page directory	
   443                                  	;
   444 00000400 290D[E8300100]          	sub	[free_pages], ecx ; 07/11/2014
   445                                  	;
   446 00000406 8B35[E0300100]          	mov	esi, [k_page_dir] ; Kernel's Page Directory address
   447 0000040C C1EE0C                  	shr	esi, 12		 ; convert to page number
   448                                  mi_10:
   449 0000040F 89F0                    	mov	eax, esi	 ; allocation bit offset		 
   450 00000411 89C3                    	mov	ebx, eax
   451 00000413 C1EB03                  	shr	ebx, 3		 ; convert to alloc. byte offset
   452 00000416 80E3FC                  	and	bl,  0FCh	 ; clear bit 0 and bit 1
   453                                  				 ;   to align on dword boundary
   454 00000419 83E01F                  	and	eax, 31		 ; set allocation bit position 
   455                                  				 ;  (bit 0 to bit 31)
   456                                  	;
   457 0000041C 01D3                    	add	ebx, edx	 ; offset in M.A.T. + M.A.T. address 
   458                                  	;
   459 0000041E 0FB303                  	btr 	[ebx], eax	 ; reset relevant bit (0 to 31)
   460                                  	;
   461 00000421 46                      	inc	esi		 ; next page table
   462 00000422 E2EB                    	loop	mi_10		 ; allocate next kernel page table 
   463                                  				 ; (ecx = page table count + 1)		
   464                                  	;
   465 00000424 59                      	pop	ecx		 ; (**) PDE count (= pg. tbl. count)
   466                                  	;
   467                                  	; Initialize Kernel Page Directory and Kernel Page Tables
   468                                  	;
   469                                  	; Initialize Kernel's Page Directory
   470 00000425 8B3D[E0300100]          	mov	edi, [k_page_dir]
   471 0000042B 89F8                    	mov	eax, edi
   472 0000042D 0C03                    	or	al, PDE_A_PRESENT + PDE_A_WRITE
   473                                  		     	      ; supervisor + read&write + present
   474 0000042F 89CA                    	mov	edx, ecx 	; (**) PDE count (= pg. tbl. count)	
   475                                  mi_11:
   476 00000431 0500100000              	add	eax, 4096	; Add page size (PGSZ)
   477                                  			        ; EAX points to next page table
   478 00000436 AB                      	stosd
   479 00000437 E2F8                    	loop	mi_11
   480 00000439 29C0                    	sub	eax, eax	; Empty PDE
   481 0000043B 66B90004                	mov	cx, 1024	; Entry count (PGSZ/4)
   482 0000043F 29D1                    	sub	ecx, edx
   483 00000441 7402                    	jz	short mi_12
   484 00000443 F3AB                    	rep	stosd 		; clear remain (empty) PDEs
   485                                  	;
   486                                  	; Initialization of Kernel's Page Directory is OK, here.
   487                                  mi_12:
   488                                  	; Initialize Kernel's Page Tables
   489                                  	;
   490                                  	; (EDI points to address of page table 0)
   491                                  	; eax = 0
   492 00000445 8B0D[E4300100]          	mov	ecx, [memory_size] ; memory size in pages
   493 0000044B 89CA                    	mov	edx, ecx	; (***)
   494 0000044D B003                    	mov	al, PTE_A_PRESENT + PTE_A_WRITE
   495                                  			     ; supervisor + read&write + present 	
   496                                  mi_13:
   497 0000044F AB                      	stosd
   498 00000450 0500100000              	add	eax, 4096	
   499 00000455 E2F8                    	loop	mi_13	
   500 00000457 6681E2FF03              	and	dx, 1023	; (***)
   501 0000045C 740B                    	jz	short mi_14
   502 0000045E 66B90004                	mov	cx, 1024	
   503 00000462 6629D1                  	sub	cx, dx		; from dx (<= 1023) to 1024
   504 00000465 31C0                    	xor	eax, eax
   505 00000467 F3AB                    	rep	stosd		; clear remain (empty) PTEs 
   506                                  				; of the last page table
   507                                  mi_14:
   508                                  	;  Initialization of Kernel's Page Tables is OK, here.
   509                                  	;
   510 00000469 89F8                    	mov	eax, edi	; end of the last page table page
   511                                  			        ; (beginging of user space pages)
   512 0000046B C1E80F                  	shr	eax, 15		; convert to M.A.T. byte offset
   513 0000046E 24FC                    	and	al, 0FCh	; clear bit 0 and bit 1 for
   514                                  				; aligning on dword boundary	
   515                                  	 
   516 00000470 A3[F4300100]            	mov	[first_page], eax
   517 00000475 A3[EC300100]            	mov	[next_page], eax ; The first free page pointer
   518                                  				 ; for user programs
   519                                  				 ; (Offset in Mem. Alloc. Tbl.)	
   520                                  	;
   521                                  	; Linear/FLAT (1 to 1) memory paging for the kernel is OK, here.
   522                                  	;
   523                                  	
   524                                  	; Enable paging
   525                                  	;
   526 0000047A A1[E0300100]                    mov     eax, [k_page_dir]
   527 0000047F 0F22D8                  	mov	cr3, eax
   528 00000482 0F20C0                  	mov	eax, cr0
   529 00000485 0D00000080              	or	eax, 80000000h	; set paging bit (bit 31)
   530 0000048A 0F22C0                  	mov	cr0, eax
   531                                          ;jmp    KCODE:StartPMP
   532                                  
   533 0000048D EA                      	db 0EAh 		; Opcode for far jump
   534 0000048E [94040000]                      dd StartPMP		; 32 bit offset
   535 00000492 0800                    	dw KCODE		; kernel code segment descriptor
   536                                  
   537                                  
   538                                  StartPMP:
   539                                  	; 06/11//2014
   540                                  	; Clear video page 0
   541                                  	;
   542                                  	; Temporary Code
   543                                  	;
   544 00000494 B9E8030000              	mov	ecx, 80*25/2
   545 00000499 BF00800B00              	mov	edi, 0B8000h
   546                                  	; 30/01/2016
   547                                  	;xor	eax, eax	; black background, black fore color
   548 0000049E B800070007              	mov	eax, 07000700h  ; black background, light gray fore color
   549 000004A3 F3AB                    	rep	stosd
   550                                  	
   551                                  	; 19/08/2014
   552                                  	; Kernel Base Address = 0
   553                                  	; It is mapped to (physically) 0 in the page table.
   554                                  	; So, here is exactly 'StartPMP' address.
   555                                  
   556                                   	; 29/01/2016 (TRDOS 386 = TRDOS v2.0)
   557 000004A5 BE[E1FF0000]            	mov	esi, starting_msg
   558                                  	;; 14/08/2015 (kernel version message will appear
   559                                  	;;	       when protected mode and paging is enabled)
   560 000004AA BF00800B00              	mov	edi, 0B8000h ; 27/08/2014
   561 000004AF B40A                    	mov	ah, 0Ah ; Black background, light green forecolor
   562                                  	; 20/08/2014
   563 000004B1 E889010000              	call	printk
   564                                  
   565                                  	; 'UNIX v7/x86' source code by Robert Nordier (1999)
   566                                  	; // Set IRQ offsets
   567                                  	;
   568                                  	;  Linux (v0.12) source code by Linus Torvalds (1991)
   569                                  	;
   570                                  					;; ICW1
   571 000004B6 B011                    	mov	al, 11h			; Initialization sequence
   572 000004B8 E620                    	out	20h, al			; 	8259A-1
   573                                  	; jmp 	$+2
   574 000004BA E6A0                    	out	0A0h, al		; 	8259A-2
   575                                  					;; ICW2
   576 000004BC B020                    	mov	al, 20h			; Start of hardware ints (20h)
   577 000004BE E621                    	out	21h, al			;	for 8259A-1
   578                                  	; jmp 	$+2
   579 000004C0 B028                    	mov	al, 28h			; Start of hardware ints (28h)
   580 000004C2 E6A1                    	out	0A1h, al		; 	for 8259A-2
   581                                  					;
   582 000004C4 B004                    	mov	al, 04h			;; ICW3
   583 000004C6 E621                    	out	21h, al			; 	IRQ2 of 8259A-1 (master)
   584                                  	; jmp 	$+2
   585 000004C8 B002                    	mov	al, 02h			; 	is 8259A-2 (slave)
   586 000004CA E6A1                    	out	0A1h, al		;
   587                                  					;; ICW4
   588 000004CC B001                    	mov	al, 01h	 		;
   589 000004CE E621                    	out	21h, al			; 	8086 mode, normal EOI	
   590                                  	; jmp 	$+2
   591 000004D0 E6A1                    	out	0A1h, al		;	for both chips.
   592                                  
   593                                  	;mov	al, 0FFh	; mask off all interrupts for now
   594                                  	;out	21h, al
   595                                  	;; jmp 	$+2
   596                                  	;out	0A1h, al
   597                                  
   598                                  	; 02/04/2015
   599                                  	; 26/03/2015 System call (INT 30h) modification
   600                                  	;  DPL = 3 (Interrupt service routine can be called from user mode)			
   601                                  	;
   602                                  	;; Linux (v0.12) source code by Linus Torvalds (1991)
   603                                  	;  setup_idt:
   604                                  	;
   605                                          ;; 16/02/2015
   606                                  	;;mov     dword [DISKETTE_INT], fdc_int ; IRQ 6 handler
   607                                  	; 21/08/2014 (timer_int)
   608 000004D2 BE[68FC0000]            	mov	esi, ilist
   609 000004D7 8D3D[F82D0100]          	lea	edi, [idt]
   610                                  	; 26/03/2015
   611 000004DD B930000000              	mov	ecx, 48		; 48 hardware interrupts (INT 0 to INT 2Fh)
   612                                  	; 02/04/2015
   613 000004E2 BB00000800              	mov	ebx,  80000h
   614                                  rp_sidt1:
   615 000004E7 AD                      	lodsd
   616 000004E8 89C2                    	mov	edx, eax
   617 000004EA 66BA008E                	mov	dx, 8E00h
   618 000004EE 6689C3                  	mov	bx, ax
   619 000004F1 89D8                    	mov	eax, ebx	; /* selector = 0x0008 = cs */
   620                                         			        ; /* interrupt gate - dpl=0, present */
   621 000004F3 AB                      	stosd	; selector & offset bits 0-15 	
   622 000004F4 89D0                    	mov	eax, edx
   623 000004F6 AB                      	stosd	; attributes & offset bits 16-23
   624 000004F7 E2EE                    	loop	rp_sidt1
   625                                  	; 15/04/2016
   626                                  	; TRDOS 386 (TRDOS v2.0) /// 32 sofware interrupts ///
   627                                  	;mov	cl, 16        ; 16 software interrupts (INT 30h to INT 3Fh)
   628 000004F9 B120                    	mov	cl, 32	      ; 32 software interrupts (INT 30h to INT 4Fh)	
   629                                  rp_sidt2:
   630 000004FB AD                      	lodsd
   631 000004FC 21C0                    	and	eax, eax
   632 000004FE 7413                    	jz	short rp_sidt3
   633 00000500 89C2                    	mov	edx, eax
   634 00000502 66BA00EE                	mov	dx, 0EE00h	; P=1b/DPL=11b/01110b
   635 00000506 6689C3                  	mov	bx, ax
   636 00000509 89D8                    	mov	eax, ebx	; selector & offset bits 0-15 	
   637 0000050B AB                      	stosd
   638 0000050C 89D0                    	mov	eax, edx
   639 0000050E AB                      	stosd
   640 0000050F E2EA                    	loop	rp_sidt2
   641 00000511 EB16                    	jmp	short sidt_OK
   642                                  rp_sidt3:
   643 00000513 B8[2C0A0000]            	mov	eax, ignore_int
   644 00000518 89C2                    	mov	edx, eax
   645 0000051A 66BA00EE                	mov	dx, 0EE00h	; P=1b/DPL=11b/01110b
   646 0000051E 6689C3                  	mov	bx, ax
   647 00000521 89D8                    	mov	eax, ebx	; selector & offset bits 0-15 	
   648                                  rp_sidt4:
   649 00000523 AB                      	stosd
   650 00000524 92                      	xchg	eax, edx
   651 00000525 AB                      	stosd
   652 00000526 92                      	xchg	edx, eax
   653 00000527 E2FA                    	loop	rp_sidt4
   654                                  sidt_OK: 
   655 00000529 0F011D[76F60000]        	lidt 	[idtd]
   656                                  	;
   657                                  	; TSS descriptor setup ; 24/03/2015
   658 00000530 B8[78300100]            	mov	eax, task_state_segment
   659 00000535 66A3[6AF60000]          	mov	[gdt_tss0], ax
   660 0000053B C1C010                  	rol	eax, 16
   661 0000053E A2[6CF60000]            	mov	[gdt_tss1], al
   662 00000543 8825[6FF60000]          	mov	[gdt_tss2], ah
   663 00000549 66C705[DE300100]68-     	mov	word [tss.IOPB], tss_end - task_state_segment
   663 00000551 00                 
   664                                  		; 
   665                                  		; IO Map Base address (When this address points
   666                                  		; to end of the TSS, CPU does not use IO port 
   667                                  		; permission bit map for RING 3 IO permissions, 
   668                                  		; access to any IO ports in ring 3 will be forbidden.)
   669                                   		;
   670                                  	;mov	[tss.esp0], esp ; TSS offset 4
   671                                  	;mov	word [tss.ss0], KDATA ; TSS offset 8 (SS)
   672 00000552 66B82800                   	mov	ax, TSS  ; It is needed when an interrupt 
   673                                  			 ; occurs (or a system call -software INT- is requested)
   674                                  			 ; while cpu running in ring 3 (in user mode).				
   675                                  			 ; (Kernel stack pointer and segment will be loaded
   676                                  			 ; from offset 4 and 8 of the TSS, by the CPU.)	 
   677 00000556 0F00D8                  	ltr	ax  ; Load task register
   678                                  	;
   679                                  esp0_set0:
   680                                  	; 30/07/2015
   681 00000559 8B0D[E4300100]          	mov 	ecx, [memory_size] ; memory size in pages
   682 0000055F C1E10C                  	shl 	ecx, 12 ; convert page count to byte count
   683 00000562 81F900004000            	cmp	ecx, CORE ; beginning of user's memory space (400000h)
   684                                  			  ; (kernel mode virtual address)
   685 00000568 7605                    	jna	short esp0_set1
   686                                  	;
   687                                  	; If available memory > CORE (end of the 1st 4 MB)
   688                                  	; set stack pointer to CORE
   689                                  	;(Because, PDE 0 is reserved for kernel space in user's page directory)
   690                                  	;(PDE 0 points to page table of the 1st 4 MB virtual address space)
   691 0000056A B900004000              	mov	ecx, CORE
   692                                  esp0_set1:
   693 0000056F 89CC                    	mov	esp, ecx ; top of kernel stack (**tss.esp0**)
   694                                  esp0_set_ok:
   695                                  	; 30/07/2015 (**tss.esp0**) 
   696 00000571 8925[7C300100]          	mov	[tss.esp0], esp
   697 00000577 66C705[80300100]10-             mov     word [tss.ss0], KDATA
   697 0000057F 00                 
   698                                  	; 14/08/2015
   699                                  	; 10/11/2014 (Retro UNIX 386 v1 - Erdogan Tan)
   700                                  	;
   701                                  	;cli	; Disable interrupts (for CPU)
   702                                  	;    (CPU will not handle hardware interrupts, except NMI!)
   703                                  	;
   704 00000580 30C0                    	xor	al, al		; Enable all hardware interrupts!
   705 00000582 E621                    	out	21h, al		; (IBM PC-AT compatibility)
   706 00000584 EB00                    	jmp 	$+2		; (All conventional PC-AT hardware
   707 00000586 E6A1                    	out	0A1h, al	;  interrupts will be in use.)	
   708                                  				; (Even if related hardware component
   709                                  				;  does not exist!)
   710                                  	; Enable NMI 
   711 00000588 B07F                    	mov	al, 7Fh		; Clear bit 7 to enable NMI (again)
   712 0000058A E670                    	out  	70h, al
   713                                  	; 23/02/2015
   714 0000058C 90                      	nop
   715 0000058D E471                    	in	al, 71h		; read in 71h just after writing out to 70h
   716                                  				; for preventing unknown state (!?)
   717                                  	;
   718                                  	; Only a NMI can occur here... (Before a 'STI' instruction)
   719                                  	;
   720                                  	; 02/09/2014
   721 0000058F 6631DB                  	xor	bx, bx
   722 00000592 66BA0002                	mov	dx, 0200h	; Row 2, column 0  ; 07/03/2015
   723 00000596 E833170000              	call	_set_cpos	; 24/01/2016
   724                                  	;
   725                                  	; 06/11/2014
   726 0000059B E83A2C0000              	call	memory_info
   727                                  	; 14/08/2015
   728                                  	;call getch ; 28/02/2015
   729                                  drv_init:
   730 000005A0 FB                      	sti	; Enable Interrupts 
   731                                  	; 06/02/2015
   732 000005A1 8B15[06FC0000]          	mov	edx, [hd0_type] ; hd0, hd1, hd2, hd3
   733 000005A7 668B1D[04FC0000]        	mov	bx, [fd0_type] ; fd0, fd1
   734                                  	; 22/02/2015
   735 000005AE 6621DB                  	and	bx, bx
   736 000005B1 751C                    	jnz	short di1
   737                                  	;
   738 000005B3 09D2                    	or 	edx, edx
   739 000005B5 752A                    	jnz	short di2
   740                                  	;
   741                                  setup_error:
   742 000005B7 BE[0BFF0000]            	mov 	esi, setup_error_msg
   743                                  psem:	
   744 000005BC AC                      	lodsb
   745 000005BD 08C0                    	or	al, al
   746                                  	;jz	short haltx ; 22/02/2015
   747 000005BF 7427                    	jz	short di3
   748 000005C1 56                      	push	esi
   749                                  	; 13/05/2016
   750 000005C2 BB07000000              	mov	ebx, 7	; Black background, 
   751                                  			; light gray forecolor
   752                                  			; Video page 0 (BH=0)
   753 000005C7 E86C160000              	call	_write_tty
   754 000005CC 5E                      	pop	esi
   755 000005CD EBED                    	jmp	short psem
   756                                  
   757                                  di1:
   758                                  	; supress 'jmp short T6'
   759                                  	;  (activate fdc motor control code)
   760 000005CF 66C705[A9060000]90-     	mov	word [T5], 9090h ; nop
   760 000005D7 90                 
   761                                  	;
   762                                  	;mov	ax, int_0Eh	; IRQ 6 handler
   763                                  	;mov	di, 0Eh*4	; IRQ 6 vector
   764                                  	;stosw
   765                                  	;mov 	ax, cs
   766                                  	;stosw
   767                                  	;; 16/02/2015
   768                                          ;;mov     dword [DISKETTE_INT], fdc_int ; IRQ 6 handler
   769                                  	;
   770 000005D8 E8713B0000              	CALL	DSKETTE_SETUP	; Initialize Floppy Disks
   771                                  	;
   772 000005DD 09D2                    	or	edx, edx
   773 000005DF 7407                            jz      short di3
   774                                  di2:
   775 000005E1 E8AE3B0000              	call   	DISK_SETUP	; Initialize Fixed Disks
   776 000005E6 72CF                            jc      short setup_error
   777                                  di3:
   778 000005E8 E8C12B0000              	call	setup_rtc_int	; 22/05/2015 (dsectrpm.s)
   779                                  	;
   780 000005ED E812F80000              	call	display_disks ; 07/03/2015  (Temporary)
   781                                  ;haltx:
   782                                  	; 14/08/2015
   783                                  	;call	getch ; 22/02/2015
   784                                  	;sti	; Enable interrupts (for CPU)
   785                                  ;	; 29/01/2016
   786                                  ;	sub	ah, ah ;  read time count
   787                                  ;	call	int1Ah
   788                                  ;	mov	edx, ecx ; 18.2 * seconds
   789                                  ;md_info_msg_wait1:
   790                                  ;	; 29/01/2016
   791                                  ;	mov	ah, 1
   792                                  ;	call	int16h
   793                                  ;	jz	short md_info_msg_wait2
   794                                  ;	xor	ah, ah ; 0
   795                                  ;       call    int16h
   796                                  ;	jmp 	short md_info_msg_ok
   797                                  ;md_info_msg_wait2:
   798                                  ;	sub	ah, ah  ; read time count
   799                                  ;	call	int1Ah
   800                                  ;	cmp	edx, ecx ; ; 18.2 * seconds
   801                                  ;	jna	short md_info_msg_wait3
   802                                  ;	xchg 	edx, ecx	
   803                                  ;md_info_msg_wait3:
   804                                  ;	sub	ecx, edx
   805                                  ;	cmp	ecx, 127 ; 7 seconds (18.2 * 7)
   806                                  ;	jb	short md_info_msg_wait1		
   807                                  ;md_info_msg_ok:
   808                                  	; 08/09/2016
   809 000005F2 0F20C0                  	mov	eax, cr0
   810 000005F5 A810                    	test	al, 10h  ; Bit 4, ET (Extension Type)
   811 000005F7 7402                    	jz	short sysinit
   812                                  	; 80387 (FPU) is ready
   813 000005F9 DBE3                    	fninit ; Initialize Floating-Point Unit
   814                                  sysinit:
   815                                  	; 30/06/2015
   816 000005FB E865530000              	call	sys_init
   817                                  	;
   818                                  	;jmp 	cpu_reset ; 22/02/2015
   819                                  hang:  
   820                                  	; 23/02/2015
   821                                  	;sti			; Enable interrupts
   822 00000600 F4                      	hlt
   823                                  	;
   824                                  	;nop
   825                                  	;; 03/12/2014
   826                                  	;; 28/08/2014
   827                                  	;mov	ah, 11h
   828                                  	;call	getc
   829                                  	;jz      _c8
   830                                  	;
   831                                  	; 23/02/2015
   832                                  	; 06/02/2015
   833                                  	; 07/09/2014
   834 00000601 31DB                    	xor	ebx, ebx
   835 00000603 8A1D[0E310100]          	mov	bl, [ptty]	; active_page
   836 00000609 89DE                    	mov	esi, ebx
   837 0000060B 66D1E6                  	shl 	si, 1
   838 0000060E 81C6[10310100]          	add	esi, ttychr
   839 00000614 668B06                  	mov	ax, [esi]
   840 00000617 6621C0                  	and	ax, ax
   841                                  	;jz	short _c8
   842 0000061A 74E4                    	jz	short hang
   843 0000061C 66C7060000              	mov	word [esi], 0
   844 00000621 80FB03                  	cmp	bl, 3		; Video page 3
   845                                  	;jb	short _c8
   846 00000624 72DA                    	jb	short hang
   847                                  	;	
   848                                  	; 13/05/2016
   849                                  	; 07/09/2014
   850                                  nxtl:
   851 00000626 6653                    	push	bx
   852 00000628 66BB0E00                	mov	bx, 0Eh 	; Yellow character 
   853                                  				; on black background
   854                                  				; bh = 0 (video page 0)
   855                                  				; Retro UNIX 386 v1 - Video Mode 0
   856                                  				; (PC/AT Video Mode 3 - 80x25 Alpha.)
   857 0000062C 6650                    	push	ax
   858 0000062E E805160000              	call 	_write_tty
   859 00000633 6658                    	pop	ax
   860 00000635 665B                    	pop	bx
   861 00000637 3C0D                    	cmp	al, 0Dh		; carriage return (enter)
   862                                  	;jne	short _c8
   863 00000639 75C5                    	jne	short hang
   864 0000063B B00A                    	mov	al, 0Ah		; next line
   865 0000063D EBE7                    	jmp	short nxtl
   866                                  	
   867                                  ;_c8:
   868                                  ;	; 25/08/2014
   869                                  ;	cli				; Disable interrupts
   870                                  ;	mov	al, [scounter + 1]
   871                                  ;	and	al, al
   872                                  ;	jnz	hang
   873                                  ;	call	rtc_p
   874                                  ;	jmp     hang
   875                                  
   876                                  
   877                                  	; 27/08/2014
   878                                  	; 20/08/2014
   879                                  printk:
   880                                          ;mov    edi, [scr_row]
   881                                  pkl:
   882 0000063F AC                      	lodsb
   883 00000640 08C0                    	or 	al, al
   884 00000642 7404                    	jz	short pkr
   885 00000644 66AB                    	stosw
   886 00000646 EBF7                    	jmp	short pkl
   887                                  pkr:
   888 00000648 C3                      	retn
   889                                  
   890                                  ; 15/01/2017
   891                                  ; 14/01/2017
   892                                  ; 02/01/2017
   893                                  ; 25/12/2016
   894                                  ; 19/12/2016
   895                                  ; 10/12/2016 (callback)
   896                                  ; 06/06/2016
   897                                  ; 23/05/2016
   898                                  ; 22/05/2016 - TRDOS 386 (TRDOS v2.0) Timer Event Modifications
   899                                  ; 25/07/2015
   900                                  ; 14/05/2015 (multi tasking -time sharing- 'clock', x_timer)
   901                                  ; 17/02/2015
   902                                  ; 06/02/2015 (unix386.s)
   903                                  ; 11/12/2014 - 22/12/2014 (dsectrm2.s) 
   904                                  ;
   905                                  ; IBM PC-XT Model 286 Source Code - BIOS2.ASM (06/10/85)
   906                                  ;
   907                                  ;-- HARDWARE INT  08 H - ( IRQ LEVEL 0 ) ---------------------------------------
   908                                  ;	THIS ROUTINE HANDLES THE TIMER INTERRUPT FROM FROM CHANNEL 0 OF        :
   909                                  ;	THE 8254 TIMER.  INPUT FREQUENCY IS 1.19318 MHZ AND THE DIVISOR        :
   910                                  ;	IS 65536, RESULTING IN APPROXIMATELY 18.2 INTERRUPTS EVERY SECOND.     :
   911                                  ;									       :
   912                                  ;	THE INTERRUPT HANDLER MAINTAINS A COUNT (40:6C) OF INTERRUPTS SINCE    :
   913                                  ;	POWER ON TIME, WHICH MAY BE USED TO ESTABLISH TIME OF DAY.	       :
   914                                  ;	THE INTERRUPT HANDLER ALSO DECREMENTS THE MOTOR CONTROL COUNT (40:40)  :
   915                                  ;	OF THE DISKETTE, AND WHEN IT EXPIRES, WILL TURN OFF THE 	       :
   916                                  ;	DISKETTE MOTOR(s), AND RESET THE MOTOR RUNNING FLAGS.		       :
   917                                  ;	THE INTERRUPT HANDLER WILL ALSO INVOKE A USER ROUTINE THROUGH	       :
   918                                  ;	INTERRUPT 1CH AT EVERY TIME TICK.  THE USER MUST CODE A 	       :
   919                                  ;	ROUTINE AND PLACE THE CORRECT ADDRESS IN THE VECTOR TABLE.	       :
   920                                  ;-------------------------------------------------------------------------------
   921                                  ;
   922                                  
   923                                  timer_int:	; IRQ 0
   924                                  ;int_08h:	; Timer
   925                                  	; 14/10/2015
   926                                  	; Here, we are simulating system call entry (for task switch)
   927                                  	; (If multitasking is enabled, 
   928                                  	; 'clock' procedure may jump to 'sysrelease')
   929                                  
   930 00000649 1E                      	push	ds
   931 0000064A 06                      	push	es
   932 0000064B 0FA0                    	push	fs
   933 0000064D 0FA8                    	push	gs
   934                                  
   935 0000064F 60                      	pushad	; eax, ecx, edx, ebx, esp -before pushad-, ebp, esi, edi
   936 00000650 66B91000                	mov     cx, KDATA
   937 00000654 8ED9                            mov     ds, cx
   938 00000656 8EC1                            mov     es, cx
   939 00000658 8EE1                            mov     fs, cx
   940 0000065A 8EE9                            mov     gs, cx
   941                                  
   942 0000065C 0F20D9                  	mov	ecx, cr3
   943 0000065F 890D[B0470100]          	mov	[cr3reg], ecx ; save current cr3 register value/content
   944                                  
   945                                  	; 14/01/2017
   946 00000665 3B0D[E0300100]          	cmp 	ecx, [k_page_dir]
   947 0000066B 7409                    	je	short T3
   948                                  
   949 0000066D 8B0D[E0300100]          	mov	ecx, [k_page_dir]
   950 00000673 0F22D9                  	mov	cr3, ecx
   951                                  T3:
   952                                  	;sti				; INTERRUPTS BACK ON
   953 00000676 66FF05[60310100]        	INC	word [TIMER_LOW]	; INCREMENT TIME
   954 0000067D 7507                    	JNZ	short T4		; GO TO TEST_DAY
   955 0000067F 66FF05[62310100]        	INC	word [TIMER_HIGH]	; INCREMENT HIGH WORD OF TIME
   956                                  T4:					; TEST_DAY
   957 00000686 66833D[62310100]18      	CMP	word [TIMER_HIGH],018H	; TEST FOR COUNT EQUALING 24 HOURS
   958 0000068E 7519                    	JNZ	short T5		; GO TO DISKETTE_CTL
   959 00000690 66813D[60310100]B0-     	CMP	word [TIMER_LOW],0B0H
   959 00000698 00                 
   960 00000699 750E                    	JNZ	short T5		; GO TO DISKETTE_CTL
   961                                  
   962                                  ;-----	TIMER HAS GONE 24 HOURS
   963                                  	;;SUB	AX,AX
   964                                  	;MOV	[TIMER_HIGH],AX
   965                                  	;MOV	[TIMER_LOW],AX
   966 0000069B 29C0                    	sub	eax, eax
   967 0000069D A3[60310100]            	mov	[TIMER_LH], eax
   968                                  	;	
   969 000006A2 C605[64310100]01        	MOV	byte [TIMER_OFL],1
   970                                  
   971                                  ;-----	TEST FOR DISKETTE TIME OUT
   972                                  
   973                                  T5:
   974                                  	; 23/12/2014
   975 000006A9 EB1D                    	jmp	short T6		; will be replaced with nop, nop
   976                                  					; (9090h) if a floppy disk
   977                                  					; is detected.
   978                                  	;mov	al,[CS:MOTOR_COUNT]
   979 000006AB A0[67310100]            	mov	al, [MOTOR_COUNT]
   980 000006B0 FEC8                    	dec	al
   981                                  	;mov	[CS:MOTOR_COUNT], al	; DECREMENT DISKETTE MOTOR CONTROL
   982 000006B2 A2[67310100]            	mov	[MOTOR_COUNT], al
   983                                  	;mov	[ORG_MOTOR_COUNT], al
   984 000006B7 750F                    	JNZ	short T6		; RETURN IF COUNT NOT OUT
   985 000006B9 B0F0                    	mov 	al,0F0h
   986                                  	;AND	[CS:MOTOR_STATUS],al 	; TURN OFF MOTOR RUNNING BITS
   987 000006BB 2005[66310100]          	and	[MOTOR_STATUS], al
   988                                  	;and	[ORG_MOTOR_STATUS], al
   989 000006C1 B00C                    	MOV	AL,0CH			; bit 3 = enable IRQ & DMA, 
   990                                  					; bit 2 = enable controller
   991                                  					;	1 = normal operation
   992                                  					;	0 = reset	
   993                                  					; bit 0, 1 = drive select
   994                                  					; bit 4-7 = motor running bits 
   995 000006C3 66BAF203                	MOV	DX,03F2H		; FDC CTL PORT
   996 000006C7 EE                      	OUT	DX,AL			; TURN OFF THE MOTOR
   997                                  T6:	
   998                                  	;inc	word [CS:wait_count]	; 22/12/2014 (byte -> word)
   999                                  					; TIMER TICK INTERRUPT
  1000                                  	;;inc	word [wait_count] ;;27/02/2015
  1001                                  	;INT	1CH			; TRANSFER CONTROL TO A USER ROUTINE
  1002                                  	;cli
  1003 000006C8 E81F040000              	call 	u_timer			; TRANSFER CONTROL TO A USER ROUTINE
  1004                                  	; 23/05/2016
  1005 000006CD E8FEE00000              	call	clock			; Multi Tasking control procedure
  1006                                  T7:
  1007                                  	; 14/10/2015
  1008 000006D2 B020                    	MOV	AL,EOI			; GET END OF INTERRUPT MASK
  1009 000006D4 FA                      	CLI				; DISABLE INTERRUPTS TILL STACK CLEARED
  1010 000006D5 E620                    	OUT	INTA00,AL		; END OF INTERRUPT TO 8259 - 1	
  1011                                  	;
  1012                                  rtc_int_2:
  1013                                  	; 26/12/2016
  1014                                  	;mov	ecx, [cr3reg]
  1015                                  	; 13/01/2017
  1016 000006D7 803D[8C470100]00        	cmp	byte [u.t_lock], 0  	; T_LOCK
  1017 000006DE 7727                    	ja	short timer_int_return  ; Timer Lock : 'sysrele' is needed !
  1018                                  	; 15/01/2017
  1019 000006E0 803D[743E0100]02        	cmp	byte [priority], 2
  1020 000006E7 733A                    	jnb	short T8  ; current process has a timer event (15/01/2017)
  1021                                  	; 22/05/2016
  1022 000006E9 803D[753E0100]00        	cmp	byte [p_change], 0 ; in 'set_run_sequence', in 'rtc_p'
  1023 000006F0 7615                    	jna	short timer_int_return ; 23/05/2016
  1024                                  
  1025                                  	; 15/01/2017
  1026                                  	
  1027                                  	; present process must be changed with high priority process	
  1028                                  	;xor	al, al
  1029 000006F2 31C0                    	xor	eax, eax ; 26/12/2016
  1030 000006F4 A2[753E0100]            	mov	[p_change], al ; 0
  1031                                  	;mov	byte [priority], 2 ; 15/01/2017 (there is a timer event)
  1032                                  
  1033 000006F9 803D[13470100]FF        	cmp     byte [sysflg], 0FFh ; user or system space ?
  1034 00000700 7416                    	je	short rtc_int_3     ; user space ([sysflg]= 0FFh)
  1035                                  
  1036                                  	; system space, wait for 'sysret'
  1037                                  	; to change running process 	
  1038                                  	; with high priority (event) process
  1039                                  
  1040 00000702 A2[60470100]            	mov	[u.quant], al ; 0
  1041                                  
  1042                                  timer_int_return: ; 23/05/2016 - jump from 'rtc_int' ('rtc_int_2')
  1043 00000707 8B0D[B0470100]          	mov 	ecx, [cr3reg] 	; previous value/content of cr3 register
  1044 0000070D 0F22D9                   	mov	cr3, ecx	; restore cr3 register content
  1045                                  	;
  1046 00000710 61                      	popad ; edi, esi, ebp, temp (icrement esp by 4), ebx, edx, ecx, eax
  1047                                  	;
  1048 00000711 0FA9                    	pop	gs
  1049 00000713 0FA1                    	pop	fs
  1050 00000715 07                      	pop	es
  1051 00000716 1F                      	pop	ds
  1052                                  	;
  1053 00000717 CF                      	iretd	; return from interrupt
  1054                                  
  1055                                  rtc_int_3:
  1056 00000718 FE05[13470100]          	inc	byte [sysflg] 	; now, we are in system space
  1057                                  	;
  1058 0000071E E9ABB40000                      jmp     sysrelease ; change running process immediatelly 
  1059                                  
  1060                                  T8:
  1061                                  	; 13/01/2017 (eax -> ebx)
  1062                                  	; callback checking... (19/12/2016)
  1063 00000723 31DB                    	xor	ebx, ebx
  1064 00000725 871D[88470100]          	xchg	ebx, [u.tcb] ; callback address (0 = normal return)
  1065 0000072B 09DB                    	or	ebx, ebx
  1066 0000072D 74D8                    	jz	short timer_int_return
  1067                                  
  1068                                  	; Set user's callback routine as return address from this interrupt
  1069                                  	; and set normal return address as return address from callback
  1070                                  	; routine!!! (19/12/2016)
  1071                                  	
  1072                                  	; 14/01/2017
  1073                                  	; 13/01/2017 - Timer Lock (T_LOCK)
  1074 0000072F FE05[8C470100]          	inc	byte [u.t_lock]
  1075 00000735 8A0D[13470100]          	mov	cl, [sysflg]
  1076 0000073B 880D[8D470100]          	mov	[u.t_mode], cl 
  1077                                  
  1078 00000741 8B2D[7C300100]          	mov	ebp, [tss.esp0] ; kernel stack address (for ring 0)
  1079 00000747 83ED14                  	sub	ebp, 20		; eip, cs, eflags, esp, ss
  1080 0000074A 892D[14470100]           	mov	[u.sp], ebp
  1081 00000750 8925[18470100]          	mov	[u.usp], esp
  1082                                  
  1083 00000756 8B44241C                	mov	eax, [esp+28] ; pushed eax
  1084 0000075A A3[1C470100]            	mov	[u.r0], eax
  1085                                  
  1086 0000075F E8D9D50000              	call	wswap ; save user's registers & status
  1087                                  
  1088                                  	; software int is in ring 0 but timer int must return to ring 3
  1089                                  	; so, ring 3 return address and stack registers
  1090                                  	; (eip, cs, eflags, esp, ss) 
  1091                                  	; must be copied to timer int return
  1092                                  	; eip will be replaced by callback service routine address
  1093                                  
  1094 00000764 C605[13470100]FF        	mov	byte [sysflg], 0FFh ; user mode
  1095                                  
  1096                                  	; system mode (system call)
  1097                                  	;mov	ebp, [u.sp] ; EIP (u), CS (UCODE), EFLAGS (u),
  1098                                  			    ; ESP (u), SS (UDATA)
  1099                                  
  1100 0000076B 8B4510                  	mov	eax, [ebp+16]	; SS (UDATA
  1101 0000076E 89E6                    	mov	esi, esp
  1102 00000770 50                      	push	eax
  1103 00000771 50                      	push	eax
  1104 00000772 89E7                    	mov	edi, esp
  1105 00000774 893D[18470100]          	mov	[u.usp], edi
  1106 0000077A B908000000              	mov	ecx, ((ESPACE/4) - 4) ; except DS, ES, FS, GS
  1107 0000077F F3A5                    	rep	movsd
  1108 00000781 B104                    	mov	cl, 4	
  1109 00000783 F3AB                    	rep	stosd
  1110 00000785 893D[14470100]          	mov	[u.sp], edi
  1111 0000078B 89EE                    	mov	esi, ebp
  1112 0000078D B105                    	mov	cl, 5 ; EIP (u), CS (UCODE), EFLAGS (u), ESP (u), SS (UDATA)
  1113 0000078F F3A5                    	rep	movsd
  1114                                  
  1115 00000791 8B0D[70470100]          	mov	ecx, [u.pgdir]
  1116 00000797 890D[B0470100]          	mov	[cr3reg], ecx
  1117                                  
  1118                                  	; 13/01/207 (eax -> ebx)
  1119                                  	; EBX = callback routine address (virtual, not physical address!)
  1120                                  
  1121                                  	; 09/01/2017
  1122                                  	; !!! CALLBACK ROUTINE MUST BE ENDED/RETURNED WITH 'sysrele'
  1123                                  	;     system call !!!	
  1124                                  	; 25/12/2016
  1125                                  	; Callback Note: (19/12/2016)
  1126                                  	; !!! CALLBACK ROUTINE MUST BE ENDED/RETURNED WITH 'RETN' !!!
  1127                                  	;	pushf ; save flags	
  1128                                  	; 	<callback service code>
  1129                                  	; 	popf  ; restore flags
  1130                                  	; 	retn ; return to normal running address
  1131                                  	;
  1132                                  
  1133                                  	; 15/01/2017
  1134                                  	; 14/01/2017
  1135                                  	; 13/01/207 (eax -> ebx)
  1136                                  	; 10/01/2017
  1137                                  set_callback_addr:
  1138                                  	; 09/01/2017 (**)
  1139                                  	; 02/01/2017 (*)
  1140                                  	; 25/12/2016 (*)
  1141                                  	; 19/12/2016 (TRDOS 386 feature only!)
  1142                                  	;
  1143                                  	; This routine sets return address
  1144                                  	; to start of user's interrupt
  1145                                  	; service (callback) address
  1146                                  	;; and sets callback 'retn' address to normal
  1147                                  	;; return address of user's running code! 
  1148                                  	;
  1149                                  	; INPUT:
  1150                                  	;	EBX = callback routine/service address
  1151                                  	;	      (virtual, not physical address!)	
  1152                                  	;	[u.sp] = kernel stack, points to
  1153                                  	;		 user's EIP,CS,EFLAGS,ESP,SS
  1154                                  	;		 registers.
  1155                                  	; OUTPUT:
  1156                                  	;	EIP (user) = callback (service) address
  1157                                  	;	CS (user) = UCODE
  1158                                  	;	EFLAGS (user) = flags before callback 	 
  1159                                  	;       ESP (user) = ESP-4 (user, before callback) 
  1160                                  	;	[ESP](user) = EIP (user) before callback
  1161                                  	;
  1162                                  	; Note: If CPU was in user mode while entering 
  1163                                  	;	the timer interrupt service routine,
  1164                                  	;	'IRET' will get return to callback routine
  1165                                  	;	immediately. If CPU was in system/kernel mode  
  1166                                  	;	'iret' will get return to system call and
  1167                                  	;	then, callback routine will be return address
  1168                                  	;	from system call. (User's callback/service code
  1169                                  	;	will be able to return to normal return address
  1170                                  	;	via an 'retn' at the end.) 
  1171                                  	;
  1172                                  	; Note(**): User's callback service code must be ended
  1173                                  	;	with a 'sysrele' sytstem call ! (09/01/2017)
  1174                                  	;
  1175                                  	;	For example:
  1176                                  	;
  1177                                  	;	timer_callback:
  1178                                  	;	    ...	 
  1179                                    	;	    inc	dword [time_counter]
  1180                                  	;	    ...
  1181                                  	;	    mov eax, 39 ; 'sysrele'
  1182                                  	;	    int 40h ; TRDOS 386 system call (interrupt)		
  1183                                  	;
  1184                                  	;
  1185                                  	;; Note(*): User's callback service code must preserve cpu 
  1186                                  	;;	flags if it has any instructions which changes
  1187                                  	;;	flags in the service code. (25/12/2016)
  1188                                  	;;
  1189                                  	;;	For example:
  1190                                  	;;
  1191                                  	;;	timer_callback:
  1192                                  	;;	    pushf ; save flags
  1193                                  	;;	    ; this instruction changes zero flag
  1194                                    	;;	    inc	dword [time_counter]
  1195                                  	;;	    popf ; restore flags
  1196                                  	;;	    retn ; return to normal user code
  1197                                  	;;		  (which is interrupted by the 
  1198                                  	;;		   timer interput) 	
  1199                                  	;;
  1200                                  
  1201                                  	; 15/01/2017
  1202 0000079D 8B2D[14470100]          	mov	ebp, [u.sp]; kernel's stack, points to EIP (user)
  1203 000007A3 895D00                  	mov	[ebp], ebx
  1204 000007A6 E95CFFFFFF              	jmp	timer_int_return
  1205                                  
  1206                                  	; 15/01/2017
  1207                                  	; 13/01/2017
  1208                                  	; 19/12/2016
  1209                                  	; 06/06/2016
  1210                                  	; 23/05/2016
  1211                                  	; 22/05/2016
  1212                                  	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  1213                                  	; 26/02/2015
  1214                                  	; 07/09/2014
  1215                                  	; 25/08/2014
  1216                                  rtc_int:       ; Real Time Clock Interrupt (IRQ 8)
  1217                                  	; 22/05/2016
  1218 000007AB 1E                      	push	ds ; ** ; 23/05/2016
  1219 000007AC 50                      	push	eax ; *
  1220 000007AD 66B81000                	mov	ax, KDATA
  1221 000007B1 8ED8                    	mov	ds, ax
  1222                                  	;
  1223 000007B3 8A25[5E310100]          	mov	ah, [RTC_2Hz] ;  2 Hz interrupt to 1 Hz function
  1224 000007B9 80F401                  	xor	ah, 1
  1225 000007BC 8825[5E310100]          	mov	[RTC_2Hz], ah ; 1 = 0.5 second, 0 = 1 second
  1226 000007C2 753B                    	jnz	short rtc_int_return ; half second
  1227                                  	; 1 second
  1228                                  rtc_int_0:
  1229                                  	; 22/05/2016
  1230 000007C4 58                      	pop	eax ; *
  1231                                  	;
  1232                                  	; 14/10/2015 ('timer_int')
  1233                                  	; Here, we are simulating system call entry (for task switch)
  1234                                  	; (If multitasking is enabled, 
  1235                                  	; 'clock' procedure may jump to 'sysrelease')
  1236                                  	;push	ds ; ** ; 23/05/2016
  1237 000007C5 06                      	push	es
  1238 000007C6 0FA0                    	push	fs
  1239 000007C8 0FA8                    	push	gs
  1240 000007CA 60                      	pushad  ; eax, ecx, edx, ebx, esp -before pushad-, ebp, esi, edi
  1241 000007CB 66B91000                	mov     cx, KDATA
  1242                                          ;mov    ds, cx ; 06/06/2016
  1243 000007CF 8EC1                            mov     es, cx
  1244 000007D1 8EE1                            mov     fs, cx
  1245 000007D3 8EE9                            mov     gs, cx
  1246                                  	;
  1247 000007D5 0F20D9                  	mov	ecx, cr3
  1248 000007D8 890D[B0470100]          	mov	[cr3reg], ecx ; save current cr3 register value/content
  1249                                  	;
  1250 000007DE 803D[8C470100]00        	cmp	byte [u.t_lock], 0 ; timer lock (callback) status ?
  1251 000007E5 7711                    	ja	short rtc_int_1	   ; yes
  1252                                  
  1253                                  	; 15/01/2017
  1254 000007E7 3B0D[E0300100]          	cmp 	ecx, [k_page_dir]
  1255 000007ED 7409                    	je	short rtc_int_1
  1256                                  
  1257 000007EF 8B0D[E0300100]          	mov	ecx, [k_page_dir]
  1258 000007F5 0F22D9                  	mov	cr3, ecx
  1259                                  rtc_int_1:
  1260                                  	; Timer event (kernel) functions must be performed with
  1261                                  	; 1 second intervals - TRDOS 386 (TRDOS v2.0) feature ! -
  1262                                   	;	
  1263                                  	; 25/08/2014
  1264 000007F8 E8EB020000              	call	rtc_p  ; 19/05/2016 - major modification 
  1265                                  	
  1266                                  	; 23/05/2016
  1267 000007FD 28E4                    	sub	ah, ah ; 0
  1268                                  	; 22/05/2016 - TRDOS 386 timer event modifications
  1269                                  rtc_int_return: ; 19/05/2016
  1270                                  	; 22/02/2015 - dsectpm.s
  1271                                  	; [ source: http://wiki.osdev.org/RTC ]
  1272                                  	; read status register C to complete procedure
  1273                                  	;(it is needed to get a next IRQ 8) 
  1274 000007FF B00C                    	mov	al, 0Ch ; 
  1275 00000801 E670                    	out	70h, al ; select register C
  1276 00000803 90                      	nop
  1277 00000804 E471                    	in	al, 71h ; just throw away contents
  1278                                  	; 22/02/2015
  1279 00000806 B020                    	MOV	AL,EOI		; END OF INTERRUPT
  1280                                  	;CLI			; DISABLE INTERRUPTS TILL STACK CLEARED
  1281 00000808 E6A0                    	OUT	INTB00,AL	; FOR CONTROLLER #2
  1282                                  
  1283                                  	; 23/05/2016
  1284 0000080A B020                    	MOV	AL,EOI		; GET END OF INTERRUPT MASK
  1285 0000080C FA                      	CLI			; DISABLE INTERRUPTS TILL STACK CLEARED
  1286 0000080D E620                    	OUT	INTA00,AL	; END OF INTERRUPT TO 8259 - 1	
  1287                                  	;
  1288                                  	; 23/05/2016
  1289 0000080F 20E4                    	and	ah, ah
  1290 00000811 0F84C0FEFFFF                    jz      rtc_int_2
  1291                                  	
  1292                                  	; ah = 1 (half second)
  1293 00000817 58                      	pop	eax ; *
  1294 00000818 1F                      	pop	ds  ; **
  1295 00000819 CF                      	iretd
  1296                                  
  1297                                  ; ////////////////
  1298                                  
  1299                                  	; 28/08/2014
  1300                                  irq0:
  1301 0000081A 6A00                            push 	dword 0
  1302 0000081C EB48                    	jmp	short which_irq
  1303                                  irq1:
  1304 0000081E 6A01                            push 	dword 1
  1305 00000820 EB44                    	jmp	short which_irq
  1306                                  irq2:
  1307 00000822 6A02                            push 	dword 2
  1308 00000824 EB40                    	jmp	short which_irq
  1309                                  irq3:
  1310                                  	; 20/11/2015
  1311                                  	; 24/10/2015
  1312 00000826 2EFF15[70EA0000]        	call	dword [cs:com2_irq3]
  1313 0000082D 6A03                    	push 	dword 3
  1314 0000082F EB35                    	jmp	short which_irq
  1315                                  irq4:
  1316                                  	; 20/11/2015
  1317                                  	; 24/10/2015
  1318 00000831 2EFF15[6CEA0000]        	call	dword [cs:com1_irq4]
  1319 00000838 6A04                            push 	dword 4
  1320 0000083A EB2A                    	jmp	short which_irq
  1321                                  irq5:
  1322 0000083C 6A05                            push 	dword 5
  1323 0000083E EB26                    	jmp	short which_irq
  1324                                  irq6:
  1325 00000840 6A06                            push 	dword 6
  1326 00000842 EB22                    	jmp	short which_irq
  1327                                  irq7:
  1328 00000844 6A07                            push 	dword 7
  1329 00000846 EB1E                    	jmp	short which_irq
  1330                                  irq8:
  1331 00000848 6A08                            push 	dword 8
  1332 0000084A EB1A                    	jmp	short which_irq
  1333                                  irq9:
  1334 0000084C 6A09                            push 	dword 9
  1335 0000084E EB16                    	jmp	short which_irq
  1336                                  irq10:
  1337 00000850 6A0A                            push 	dword 10
  1338 00000852 EB12                    	jmp	short which_irq
  1339                                  irq11:
  1340 00000854 6A0B                            push 	dword 11
  1341 00000856 EB0E                    	jmp	short which_irq
  1342                                  irq12:
  1343 00000858 6A0C                            push 	dword 12
  1344 0000085A EB0A                    	jmp	short which_irq
  1345                                  irq13:
  1346 0000085C 6A0D                            push 	dword 13
  1347 0000085E EB06                    	jmp	short which_irq
  1348                                  irq14:
  1349 00000860 6A0E                            push 	dword 14
  1350 00000862 EB02                    	jmp	short which_irq
  1351                                  irq15:
  1352 00000864 6A0F                            push 	dword 15
  1353                                  	;jmp	short which_irq
  1354                                  
  1355                                  	; 19/10/2015
  1356                                  	; 29/08/2014
  1357                                  	; 21/08/2014
  1358                                  which_irq:
  1359 00000866 870424                  	xchg	eax, [esp]  ; 28/08/2014
  1360 00000869 53                      	push	ebx
  1361 0000086A 56                      	push	esi
  1362 0000086B 57                      	push	edi
  1363 0000086C 1E                      	push 	ds
  1364 0000086D 06                      	push 	es
  1365                                  	;
  1366 0000086E 88C3                    	mov	bl, al
  1367                                  	;
  1368 00000870 B810000000              	mov	eax, KDATA
  1369 00000875 8ED8                    	mov	ds, ax
  1370 00000877 8EC0                    	mov	es, ax
  1371                                  	; 19/10/2015
  1372 00000879 FC                      	cld
  1373                                          ; 27/08/2014
  1374 0000087A 8105[5EFC0000]A000-             add     dword [scr_row], 0A0h
  1374 00000882 0000               
  1375                                  	;
  1376 00000884 B417                    	mov	ah, 17h	; blue (1) background, 
  1377                                  			; light gray (7) forecolor
  1378 00000886 8B3D[5EFC0000]                  mov     edi, [scr_row]
  1379 0000088C B049                    	mov	al, 'I'
  1380 0000088E 66AB                    	stosw
  1381 00000890 B052                    	mov	al, 'R'
  1382 00000892 66AB                    	stosw
  1383 00000894 B051                    	mov	al, 'Q'
  1384 00000896 66AB                    	stosw
  1385 00000898 B020                    	mov	al, ' '
  1386 0000089A 66AB                    	stosw
  1387 0000089C 88D8                    	mov	al, bl
  1388 0000089E 3C0A                    	cmp	al, 10
  1389 000008A0 7208                    	jb	short iix
  1390 000008A2 B031                    	mov	al, '1'
  1391 000008A4 66AB                    	stosw
  1392 000008A6 88D8                    	mov	al, bl
  1393 000008A8 2C0A                    	sub	al, 10
  1394                                  iix:
  1395 000008AA 0430                    	add	al, '0'
  1396 000008AC 66AB                    	stosw
  1397 000008AE B020                    	mov	al, ' '
  1398 000008B0 66AB                    	stosw
  1399 000008B2 B021                    	mov	al, '!'
  1400 000008B4 66AB                    	stosw
  1401 000008B6 B020                    	mov	al, ' '
  1402 000008B8 66AB                    	stosw
  1403                                  	; 23/02/2015
  1404 000008BA 80FB07                  	cmp	bl, 7 ; check for IRQ 8 to IRQ 15 
  1405 000008BD 0F86A3010000            	jna	iiret
  1406 000008C3 B020                    	mov	al, 20h  ; END OF INTERRUPT COMMAND TO
  1407 000008C5 E6A0                    	out	0A0h, al ; the 2nd 8259
  1408 000008C7 E99A010000              	jmp     iiret
  1409                                  	;
  1410                                  	; 22/08/2014
  1411                                  	;mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
  1412                                  	;out	20h, al	; 8259 PORT
  1413                                  	;
  1414                                  	;pop	es
  1415                                  	;pop	ds
  1416                                  	;pop	edi
  1417                                  	;pop	esi
  1418                                  	;pop	ebx
  1419                                  	;pop 	eax
  1420                                  	;iret
  1421                                  
  1422                                  	; 02/04/2015
  1423                                  	; 25/08/2014
  1424                                  exc0:
  1425 000008CC 6A00                            push 	dword 0
  1426 000008CE E990000000                      jmp     cpu_except
  1427                                  exc1:
  1428 000008D3 6A01                            push 	dword 1
  1429 000008D5 E989000000                      jmp     cpu_except
  1430                                  exc2:
  1431 000008DA 6A02                            push 	dword 2
  1432 000008DC E982000000                      jmp     cpu_except
  1433                                  exc3:
  1434 000008E1 6A03                            push 	dword 3
  1435 000008E3 EB7E                            jmp     cpu_except
  1436                                  exc4:
  1437 000008E5 6A04                            push 	dword 4
  1438 000008E7 EB7A                            jmp     cpu_except
  1439                                  exc5:
  1440 000008E9 6A05                            push 	dword 5
  1441 000008EB EB76                            jmp     cpu_except
  1442                                  exc6:
  1443 000008ED 6A06                            push 	dword 6
  1444 000008EF EB72                            jmp     cpu_except
  1445                                  exc7:
  1446 000008F1 6A07                            push 	dword 7
  1447 000008F3 EB6E                            jmp     cpu_except
  1448                                  exc8:
  1449                                  	; [esp] = Error code
  1450 000008F5 6A08                            push 	dword 8
  1451 000008F7 EB5C                            jmp     cpu_except_en
  1452                                  exc9:
  1453 000008F9 6A09                            push 	dword 9
  1454 000008FB EB66                            jmp     cpu_except
  1455                                  exc10:
  1456                                  	; [esp] = Error code
  1457 000008FD 6A0A                            push 	dword 10
  1458 000008FF EB54                            jmp     cpu_except_en
  1459                                  exc11:
  1460                                  	; [esp] = Error code
  1461 00000901 6A0B                            push 	dword 11
  1462 00000903 EB50                            jmp     cpu_except_en
  1463                                  exc12:
  1464                                  	; [esp] = Error code
  1465 00000905 6A0C                            push 	dword 12
  1466 00000907 EB4C                            jmp     cpu_except_en
  1467                                  exc13:
  1468                                  	; [esp] = Error code
  1469 00000909 6A0D                            push 	dword 13
  1470 0000090B EB48                            jmp     cpu_except_en
  1471                                  exc14:
  1472                                  	; [esp] = Error code
  1473 0000090D 6A0E                            push 	dword 14
  1474 0000090F EB44                    	jmp	short cpu_except_en
  1475                                  exc15:
  1476 00000911 6A0F                            push 	dword 15
  1477 00000913 EB4E                            jmp     cpu_except
  1478                                  exc16:
  1479 00000915 6A10                            push 	dword 16
  1480 00000917 EB4A                            jmp     cpu_except
  1481                                  exc17:
  1482                                  	; [esp] = Error code
  1483 00000919 6A11                            push 	dword 17
  1484 0000091B EB38                    	jmp	short cpu_except_en
  1485                                  exc18:
  1486 0000091D 6A12                            push 	dword 18
  1487 0000091F EB42                    	jmp	short cpu_except
  1488                                  exc19:
  1489 00000921 6A13                            push 	dword 19
  1490 00000923 EB3E                    	jmp	short cpu_except
  1491                                  exc20:
  1492 00000925 6A14                            push 	dword 20
  1493 00000927 EB3A                    	jmp	short cpu_except
  1494                                  exc21:
  1495 00000929 6A15                            push 	dword 21
  1496 0000092B EB36                    	jmp	short cpu_except
  1497                                  exc22:
  1498 0000092D 6A16                            push 	dword 22
  1499 0000092F EB32                    	jmp	short cpu_except
  1500                                  exc23:
  1501 00000931 6A17                            push 	dword 23
  1502 00000933 EB2E                    	jmp	short cpu_except
  1503                                  exc24:
  1504 00000935 6A18                            push 	dword 24
  1505 00000937 EB2A                    	jmp	short cpu_except
  1506                                  exc25:
  1507 00000939 6A19                            push 	dword 25
  1508 0000093B EB26                    	jmp	short cpu_except
  1509                                  exc26:
  1510 0000093D 6A1A                            push 	dword 26
  1511 0000093F EB22                    	jmp	short cpu_except
  1512                                  exc27:
  1513 00000941 6A1B                            push 	dword 27
  1514 00000943 EB1E                    	jmp	short cpu_except
  1515                                  exc28:
  1516 00000945 6A1C                            push 	dword 28
  1517 00000947 EB1A                    	jmp	short cpu_except
  1518                                  exc29:
  1519 00000949 6A1D                            push 	dword 29
  1520 0000094B EB16                    	jmp	short cpu_except
  1521                                  exc30:
  1522 0000094D 6A1E                            push 	dword 30
  1523 0000094F EB04                    	jmp	short cpu_except_en
  1524                                  exc31:
  1525 00000951 6A1F                            push 	dword 31
  1526 00000953 EB0E                            jmp     short cpu_except
  1527                                  
  1528                                  	; 19/10/2015
  1529                                  	; 19/09/2015
  1530                                  	; 01/09/2015
  1531                                  	; 28/08/2015
  1532                                  	; 28/08/2014
  1533                                  cpu_except_en:
  1534 00000955 87442404                	xchg	eax, [esp+4] ; Error code
  1535 00000959 36A3[CC480100]          	mov	[ss:error_code], eax
  1536 0000095F 58                      	pop	eax  ; Exception number
  1537 00000960 870424                  	xchg	eax, [esp]
  1538                                  		; eax = eax before exception
  1539                                  		; [esp] -> exception number
  1540                                  		; [esp+4] -> EIP to return
  1541                                  	; 19/10/2015
  1542                                  	; 19/09/2015
  1543                                  	; 01/09/2015
  1544                                  	; 28/08/2015
  1545                                  	; 29/08/2014
  1546                                  	; 28/08/2014
  1547                                  	; 25/08/2014
  1548                                  	; 21/08/2014
  1549                                  cpu_except:	; CPU Exceptions
  1550 00000963 FC                      	cld
  1551 00000964 870424                  	xchg	eax, [esp] 
  1552                                  		; eax = Exception number
  1553                                  		; [esp] = eax (before exception)	
  1554 00000967 53                      	push	ebx
  1555 00000968 56                      	push	esi
  1556 00000969 57                      	push	edi
  1557 0000096A 1E                      	push 	ds
  1558 0000096B 06                      	push 	es
  1559                                  	; 28/08/2015
  1560 0000096C 66BB1000                	mov	bx, KDATA
  1561 00000970 8EDB                    	mov	ds, bx
  1562 00000972 8EC3                    	mov	es, bx
  1563 00000974 0F20DB                  	mov	ebx, cr3
  1564 00000977 53                      	push	ebx ; (*) page directory
  1565                                  	; 19/10/2015
  1566 00000978 FC                      	cld
  1567                                  	; 25/03/2015
  1568 00000979 8B1D[E0300100]          	mov	ebx, [k_page_dir]
  1569 0000097F 0F22DB                  	mov	cr3, ebx
  1570                                  	; 28/08/2015
  1571 00000982 83F80E                  	cmp	eax, 0Eh ; 14, PAGE FAULT	
  1572 00000985 750F                    	jne	short cpu_except_nfp
  1573 00000987 E84B440000              	call	page_fault_handler
  1574 0000098C 21C0                    	and 	eax, eax
  1575 0000098E 0F84CE000000                    jz	iiretp ; 01/09/2015
  1576 00000994 B00E                    	mov	al, 0Eh ; 14
  1577                                  cpu_except_nfp:
  1578                                  	; 23/08/2016
  1579 00000996 803D[EEF70000]03        	cmp	byte [CRT_MODE], 3
  1580 0000099D 7409                    	je	short cpu_except_mode_3
  1581 0000099F 50                      	push	eax
  1582 000009A0 B003                    	mov	al, 3
  1583 000009A2 E8440B0000              	call	_set_mode
  1584 000009A7 58                      	pop	eax
  1585                                  cpu_except_mode_3:
  1586                                  	; 02/04/2015
  1587 000009A8 BB[00060000]            	mov	ebx, hang
  1588 000009AD 875C241C                	xchg	ebx, [esp+28]
  1589                                  		; EIP (points to instruction which faults)
  1590                                  	  	; New EIP (hang)
  1591 000009B1 891D[D0480100]          	mov	[FaultOffset], ebx
  1592 000009B7 C744242008000000        	mov	dword [esp+32], KCODE ; kernel's code segment
  1593 000009BF 814C242400020000        	or	dword [esp+36], 200h ; enable interrupts (set IF)
  1594                                  	;
  1595 000009C7 88C4                    	mov	ah, al
  1596 000009C9 240F                    	and	al, 0Fh
  1597 000009CB 3C09                    	cmp	al, 9
  1598 000009CD 7602                    	jna	short h1ok
  1599 000009CF 0407                    	add	al, 'A'-':'
  1600                                  h1ok:
  1601 000009D1 C0EC04                  	shr	ah, 4
  1602 000009D4 80FC09                  	cmp	ah, 9
  1603 000009D7 7603                    	jna	short h2ok
  1604 000009D9 80C407                  	add	ah, 'A'-':'
  1605                                  h2ok:	
  1606 000009DC 86E0                    	xchg 	ah, al	
  1607 000009DE 66053030                	add	ax, '00'
  1608 000009E2 66A3[B8FE0000]          	mov	[excnstr], ax
  1609                                  	;
  1610                                  	; 29/08/2014
  1611 000009E8 A1[D0480100]            	mov	eax, [FaultOffset]
  1612 000009ED 51                      	push	ecx
  1613 000009EE 52                      	push	edx
  1614 000009EF 89E3                    	mov	ebx, esp
  1615                                  	; 28/08/2015
  1616 000009F1 B910000000              	mov	ecx, 16	  ; divisor value to convert binary number
  1617                                  			  ; to hexadecimal string
  1618                                  	;mov	ecx, 10	    ; divisor to convert	
  1619                                  			    ; binary number to decimal string
  1620                                  b2d1:
  1621 000009F6 31D2                    	xor	edx, edx
  1622 000009F8 F7F1                    	div	ecx
  1623 000009FA 6652                    	push	dx
  1624 000009FC 39C8                    	cmp	eax, ecx
  1625 000009FE 73F6                    	jnb	short b2d1
  1626 00000A00 BF[C3FE0000]            	mov	edi, EIPstr ; EIP value
  1627                                  			    ; points to instruction which faults	
  1628                                  	; 28/08/2015
  1629 00000A05 89C2                    	mov	edx, eax
  1630                                  b2d2:
  1631                                  	;add	al, '0'
  1632 00000A07 8A82[A1320000]          	mov	al, [edx+hexchrs]
  1633 00000A0D AA                      	stosb		    ; write hexadecimal digit to its place	
  1634 00000A0E 39E3                    	cmp	ebx, esp
  1635 00000A10 7606                    	jna	short b2d3
  1636 00000A12 6658                    	pop	ax
  1637 00000A14 88C2                    	mov	dl, al
  1638 00000A16 EBEF                    	jmp	short b2d2
  1639                                  b2d3:
  1640 00000A18 B068                    	mov 	al, 'h' ; 28/08/2015
  1641 00000A1A AA                      	stosb
  1642 00000A1B B020                    	mov	al, 20h	    ; space
  1643 00000A1D AA                      	stosb
  1644 00000A1E 30C0                    	xor	al, al	    ; to do it an ASCIIZ string	
  1645 00000A20 AA                      	stosb
  1646                                  	;
  1647 00000A21 5A                      	pop	edx
  1648 00000A22 59                      	pop	ecx
  1649                                  	;
  1650 00000A23 B44F                    	mov	ah, 4Fh	; red (4) background, 
  1651                                  			; white (F) forecolor
  1652 00000A25 BE[A8FE0000]            	mov	esi, exc_msg ; message offset
  1653                                  	;
  1654 00000A2A EB19                    	jmp	short piemsg
  1655                                  	;
  1656                                          ;add    dword [scr_row], 0A0h
  1657                                          ;mov    edi, [scr_row]
  1658                                          ;
  1659                                  	;call 	printk
  1660                                  	;
  1661                                  	;mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
  1662                                  	;out	20h, al	; 8259 PORT
  1663                                  	;
  1664                                  	;pop	es
  1665                                  	;pop	ds
  1666                                  	;pop	edi
  1667                                  	;pop	esi
  1668                                  	;pop 	eax
  1669                                  	;iret
  1670                                  	
  1671                                  	; 18/04/2016
  1672                                  	; 28/08/2015
  1673                                  	; 23/02/2015
  1674                                  	; 20/08/2014
  1675                                  ignore_int:
  1676 00000A2C 50                      	push	eax
  1677 00000A2D 53                      	push	ebx ; 23/02/2015
  1678 00000A2E 56                      	push	esi
  1679 00000A2F 57                      	push	edi
  1680 00000A30 1E                      	push 	ds
  1681 00000A31 06                      	push 	es
  1682                                  	; 18/04/2016
  1683 00000A32 66B81000                	mov	ax, KDATA
  1684 00000A36 8ED8                    	mov	ds, ax
  1685 00000A38 8EC0                    	mov	es, ax
  1686                                  	; 28/08/2015
  1687 00000A3A 0F20D8                  	mov	eax, cr3
  1688 00000A3D 50                      	push	eax ; (*) page directory
  1689                                  	;
  1690 00000A3E B467                    	mov	ah, 67h	; brown (6) background, 
  1691                                  			; light gray (7) forecolor
  1692 00000A40 BE[70FD0000]            	mov	esi, int_msg ; message offset
  1693                                  piemsg:
  1694                                          ; 27/08/2014
  1695 00000A45 8105[5EFC0000]A000-             add     dword [scr_row], 0A0h
  1695 00000A4D 0000               
  1696 00000A4F 8B3D[5EFC0000]                  mov     edi, [scr_row]
  1697                                          ;
  1698 00000A55 E8E5FBFFFF              	call 	printk
  1699                                  	;
  1700                                  hanger: ; 31/12/2016 temporary
  1701 00000A5A FA                      	cli
  1702 00000A5B F4                      	hlt
  1703 00000A5C EBFC                    	jmp short hanger
  1704                                  
  1705                                  	; 23/02/2015
  1706 00000A5E B020                    	mov	al, 20h  ; END OF INTERRUPT COMMAND TO
  1707 00000A60 E6A0                    	out	0A0h, al ; the 2nd 8259
  1708                                  iiretp: ; 01/09/2015
  1709                                  	; 28/08/2015
  1710 00000A62 58                      	pop	eax ; (*) page directory
  1711 00000A63 0F22D8                  	mov	cr3, eax
  1712                                  	;
  1713                                  iiret:
  1714                                  	; 22/08/2014
  1715 00000A66 B020                    	mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
  1716 00000A68 E620                    	out	20h, al	; 8259 PORT
  1717                                  	;
  1718 00000A6A 07                      	pop	es
  1719 00000A6B 1F                      	pop	ds
  1720 00000A6C 5F                      	pop	edi
  1721 00000A6D 5E                      	pop	esi
  1722 00000A6E 5B                      	pop	ebx ; 29/08/2014
  1723 00000A6F 58                      	pop 	eax
  1724 00000A70 CF                      	iretd
  1725                                  
  1726                                  	; 23/05/2016
  1727                                  	; 22/08/2014
  1728                                  	; IBM PC/AT BIOS source code ----- 10/06/85 (bios.asm)
  1729                                  	; (INT 1Ah)
  1730                                  	;; Linux (v0.12) source code (main.c) by Linus Torvalds (1991)
  1731                                  time_of_day:
  1732 00000A71 E89F4E0000              	call	UPD_IPR			; WAIT TILL UPDATE NOT IN PROGRESS
  1733 00000A76 726F                            jc      short time_of_day_retn ; 23/05/2016
  1734 00000A78 B000                    	mov	al, CMOS_SECONDS
  1735 00000A7A E8B14E0000              	call	CMOS_READ
  1736 00000A7F A2[50310100]            	mov	[time_seconds], al 
  1737 00000A84 B002                    	mov	al, CMOS_MINUTES
  1738 00000A86 E8A54E0000              	call	CMOS_READ
  1739 00000A8B A2[51310100]            	mov	[time_minutes], al 
  1740 00000A90 B004                    	mov	al, CMOS_HOURS
  1741 00000A92 E8994E0000              	call	CMOS_READ
  1742 00000A97 A2[52310100]                    mov     [time_hours], al
  1743 00000A9C B006                    	mov	al, CMOS_DAY_WEEK 
  1744 00000A9E E88D4E0000              	call	CMOS_READ
  1745 00000AA3 A2[53310100]            	mov	[date_wday], al
  1746 00000AA8 B007                     	mov	al, CMOS_DAY_MONTH
  1747 00000AAA E8814E0000              	call	CMOS_READ
  1748 00000AAF A2[54310100]            	mov	[date_day], al
  1749 00000AB4 B008                    	mov	al, CMOS_MONTH
  1750 00000AB6 E8754E0000              	call	CMOS_READ
  1751 00000ABB A2[55310100]            	mov	[date_month], al
  1752 00000AC0 B009                    	mov	al, CMOS_YEAR
  1753 00000AC2 E8694E0000              	call	CMOS_READ
  1754 00000AC7 A2[56310100]            	mov	[date_year], al
  1755 00000ACC B032                    	mov	al, CMOS_CENTURY
  1756 00000ACE E85D4E0000              	call	CMOS_READ
  1757 00000AD3 A2[57310100]            	mov	[date_century], al
  1758                                  	;
  1759 00000AD8 B000                    	mov	al, CMOS_SECONDS
  1760 00000ADA E8514E0000              	call 	CMOS_READ
  1761 00000ADF 3A05[50310100]          	cmp	al, [time_seconds]
  1762 00000AE5 758A                    	jne	short time_of_day
  1763                                  
  1764                                  time_of_day_retn:
  1765 00000AE7 C3                      	retn
  1766                                  
  1767                                  	; 15/01/2017
  1768                                  	; 10/06/2016
  1769                                  	; 07/06/2016
  1770                                  	; 06/06/2016
  1771                                  	; 23/05/2016
  1772                                  rtc_p:
  1773 00000AE8 B101                    	mov	cl, 1 ; 15/01/2017
  1774 00000AEA EB02                    	jmp	short rtc_p0
  1775                                  u_timer: 
  1776                                  	; Timer Events with 18.2 Hz Timer Ticks
  1777                                  	; (and also timer events with RTC seconds)
  1778 00000AEC 28C9                    	sub	cl, cl ; mov cl, 0 ; 15/01/2017
  1779                                  rtc_p0:
  1780                                  	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  1781                                  	; Major Modification:
  1782                                  	; Check and Perform Timer Events (for RTC)
  1783                                  	; 25/08/2014 - 07/09/2014
  1784                                  	; Retro UNIX 386 v1:
  1785                                   	; Print Real Time Clock content
  1786                                  	
  1787                                  	; 15/01/2017
  1788 00000AEE 880D[743E0100]          	mov	byte [priority], cl ; 0 or 1 (not 2)
  1789 00000AF4 8A2D[773E0100]          	mov	ch, [timer_events]
  1790 00000AFA 20ED                    	and	ch, ch
  1791 00000AFC 7420                    	jz	short rtc_p3
  1792                                  
  1793 00000AFE BE[B4470100]            	mov	esi, timer_set  ; beginning address of
  1794                                  				; timer events space
  1795                                  rtc_p1:
  1796 00000B03 8B06                    	mov	eax, [esi]	
  1797 00000B05 20C0                    	and	al, al ; 0 = free, >0 = process no.
  1798 00000B07 7416                    	jz	short rtc_p4
  1799                                  	;
  1800 00000B09 C1C810                  	ror	eax, 16
  1801                                  	; ah = response value, al = interrupt type
  1802                                  	; 15/01/2017
  1803                                  	; cl = interrupt source
  1804                                  	;       1 = RTC, 0 = PIT  	 	
  1805 00000B0C 38C8                    	cmp	al, cl 
  1806 00000B0E 750A                    	jne	short rtc_p2 ; not as requested or undefined !
  1807 00000B10 3C01                    	cmp	al, 1 ; 1 ; RTC interrupt ?
  1808 00000B12 7410                    	je	short rtc_p5 ; yes, check for response
  1809                                  	; 06/06/2016 - 18.2 Hz Timer Ticks
  1810 00000B14 836E080A                	sub	dword [esi+8], 10 ; 1 tick = 10
  1811 00000B18 7613                    	jna	short rtc_p6  ; continue for responding
  1812                                  rtc_p2:
  1813                                  	; 15/01/2017 (cl -> ch)
  1814                                  	; 07/06/2016
  1815 00000B1A FECD                    	dec	ch    ; remain count of timer events	
  1816 00000B1C 7501                    	jnz	short rtc_p4
  1817                                  rtc_p3:	 
  1818 00000B1E C3                      	retn
  1819                                  rtc_p4:	
  1820                                  	;cmp	esi, timer_set + 240 ; 15*16 (last event)
  1821                                  	;jnb	short rtc_p3 ; end of timer event space
  1822 00000B1F 83C610                  	add	esi, 16 ; next timer event
  1823 00000B22 EBDF                    	jmp	short rtc_p1
  1824                                  rtc_p5:	 
  1825                                  	; current timer count ; 06/06/2016 (182)
  1826 00000B24 816E08B6000000          	sub	dword [esi+8], 182 ; 1 second (10*18.2)
  1827 00000B2B 77ED                    	ja	short rtc_p2  ; check for the next 
  1828                                  rtc_p6:	
  1829                                  	; it is the time of response! 
  1830 00000B2D 8B5E04                  	mov	ebx, [esi+4] ; set (count limit) value
  1831 00000B30 895E08                  	mov	[esi+8], ebx ; reset count down value
  1832                                  			     ; to count limit
  1833                                  	; 19/12/2016
  1834                                  	; 10/12/2016 - timer callback modification
  1835 00000B33 8B7E0C                  	mov	edi, [esi+12] ; response (or callback) address	
  1836 00000B36 807E0100                	cmp	byte [esi+1], 0 ; >0 = callback
  1837 00000B3A 762A                    	jna	short rtc_p8
  1838                                  
  1839                                  	; timer callback !
  1840 00000B3C 0FB61E                  	movzx	ebx, byte [esi] ; process number (>0)
  1841 00000B3F 89D8                    	mov	eax, ebx
  1842 00000B41 C0E302                  	shl	bl, 2 ; *4
  1843 00000B44 89BB[C4440100]          	mov	[ebx+p.tcb-4], edi ; user's callback service addr
  1844 00000B4A 3A05[6B470100]          	cmp	al, [u.uno]
  1845 00000B50 7521                    	jne	short rtc_p9
  1846 00000B52 893D[88470100]          	mov	[u.tcb], edi
  1847                                  rtc_p7:
  1848                                  	; 15/01/2017
  1849 00000B58 B002                    	mov	al, 2
  1850 00000B5A A2[743E0100]            	mov	[priority], al ; 2
  1851                                  	; 10/01/2017
  1852                                  	;mov	byte [u.pri], 2
  1853 00000B5F A2[61470100]            	mov	[u.pri], al ; 2
  1854 00000B64 EBB4                    	jmp	short rtc_p2
  1855                                  rtc_p8:
  1856                                  	; response address is physical address of
  1857                                  	; the program's response (signal return) byte
  1858                                  	; 06/06/2016
  1859                                  	;mov	edi, [esi+12] ; response address
  1860 00000B66 8827                    	mov	[edi], ah     ; response value 
  1861                                  	;
  1862 00000B68 C1C010                  	rol	eax, 16
  1863                                  	; 15/01/2017
  1864 00000B6B 3A05[6B470100]          	cmp	al, [u.uno] ; running process ?
  1865 00000B71 74E5                    	je	short rtc_p7
  1866                                  rtc_p9:
  1867                                  	; al = process number  ; 10/06/2016
  1868 00000B73 B202                    	mov	dl, 2 ; priority, 2 = event (high)	
  1869 00000B75 E80ADC0000              	call	set_run_sequence ; 19/05/2016
  1870 00000B7A EB9E                    	jmp	short rtc_p2 ; 10/06/2016
  1871                                  
  1872                                  
  1873                                  ; Default IRQ 7 handler against spurious IRQs (from master PIC)
  1874                                  ; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  1875                                  default_irq7:
  1876 00000B7C 6650                    	push	ax
  1877 00000B7E B00B                    	mov	al, 0Bh  ; In-Service register
  1878 00000B80 E620                    	out	20h, al
  1879 00000B82 EB00                            jmp short $+2
  1880 00000B84 EB00                    	jmp short $+2
  1881 00000B86 E420                    	in	al, 20h
  1882 00000B88 2480                    	and 	al, 80h ; bit 7 (is it real IRQ 7 or fake?)
  1883 00000B8A 7404                            jz      short irq7_iret ; Fake (spurious) IRQ, do not send EOI 
  1884 00000B8C B020                            mov     al, 20h ; EOI
  1885 00000B8E E620                    	out	20h, al 
  1886                                  irq7_iret:
  1887 00000B90 6658                    	pop	ax
  1888 00000B92 CF                      	iretd
  1889                                  	
  1890                                  bcd_to_ascii:
  1891                                  	; 25/08/2014
  1892                                  	; INPUT ->
  1893                                  	;	al = Packed BCD number
  1894                                  	; OUTPUT ->
  1895                                  	;	ax  = ASCII word/number
  1896                                  	;
  1897                                  	; Erdogan Tan - 1998 (proc_hex) - TRDOS.ASM (2004-2011)
  1898                                  	;
  1899 00000B93 D410                    	db 0D4h,10h                     ; Undocumented inst. AAM
  1900                                  					; AH = AL / 10h
  1901                                  					; AL = AL MOD 10h
  1902 00000B95 660D3030                	or ax,'00'                      ; Make it ASCII based
  1903                                  
  1904 00000B99 86E0                            xchg ah, al 
  1905                                  	
  1906 00000B9B C3                      	retn	
  1907                                  	
  1908                                  
  1909                                  %include 'keyboard.s' ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - keyboard.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 15/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 17/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; keyboard.inc (17/10/2015)
    15                              <1> ;
    16                              <1> ; Derived from 'IBM PC-XT-286' BIOS source code (1986) 
    17                              <1> ; ****************************************************************************
    18                              <1> 
    19                              <1> ; Retro UNIX 386 v1 Kernel - KEYBOARD.INC
    20                              <1> ; Last Modification: 17/10/2015
    21                              <1> ;		    (Keyboard Data is in 'KYBDATA.INC')	
    22                              <1> ;
    23                              <1> ; ///////// KEYBOARD FUNCTIONS (PROCEDURES) ///////////////
    24                              <1> 
    25                              <1> ; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
    26                              <1> 
    27                              <1> ; 03/12/2014
    28                              <1> ; 26/08/2014
    29                              <1> ; KEYBOARD I/O
    30                              <1> ; (INT_16h - Retro UNIX 8086 v1 - U9.ASM, 30/06/2014)
    31                              <1> 
    32                              <1> ;NOTE: 'k0' to 'k7' are name of OPMASK registers.
    33                              <1> ;	(The reason of using '_k' labels!!!) (27/08/2014)    
    34                              <1> ;NOTE: 'NOT' keyword is '~' unary operator in NASM.
    35                              <1> ;	('NOT LC_HC' --> '~LC_HC') (bit reversing operator)
    36                              <1> 
    37                              <1> int16h:	; 30/06/2015
    38                              <1> ;getc:
    39 00000B9C 9C                  <1> 	pushfd	; 28/08/2014
    40 00000B9D 0E                  <1> 	push 	cs
    41 00000B9E E801000000          <1> 	call 	KEYBOARD_IO_1 ; getc_int
    42 00000BA3 C3                  <1> 	retn	
    43                              <1> 
    44                              <1> getc_int:
    45                              <1> 	; 28/02/2015
    46                              <1> 	; 03/12/2014 (derivation from pc-xt-286 bios source code -1986-, 
    47                              <1> 	;	      instead of pc-at bios - 1985-)
    48                              <1> 	; 28/08/2014 (_k1d)
    49                              <1> 	; 30/06/2014
    50                              <1> 	; 03/03/2014
    51                              <1> 	; 28/02/2014
    52                              <1> 	; Derived from "KEYBOARD_IO_1" procedure of IBM "pc-xt-286" 
    53                              <1> 	; rombios source code (21/04/1986)
    54                              <1> 	;	 'keybd.asm', INT 16H, KEYBOARD_IO
    55                              <1> 	;
    56                              <1> 	; KYBD --- 03/06/86  KEYBOARD BIOS
    57                              <1> 	;
    58                              <1> 	;--- INT 16 H -----------------------------------------------------------------
    59                              <1> 	; KEYBOARD I/O								      :
    60                              <1> 	;	THESE ROUTINES PROVIDE READ KEYBOARD SUPPORT			      :
    61                              <1> 	; INPUT									      :
    62                              <1> 	;	(AH)= 00H  READ THE NEXT ASCII CHARACTER ENTERED FROM THE KEYBOARD,   :
    63                              <1> 	;		   RETURN THE RESULT IN (AL), SCAN CODE IN (AH).              :
    64                              <1> 	;		   THIS IS THE COMPATIBLE READ INTERFACE, EQUIVALENT TO THE   :
    65                              <1> 	;                  STANDARD PC OR PCAT KEYBOARD				      :	
    66                              <1> 	;-----------------------------------------------------------------------------:
    67                              <1> 	;	(AH)= 01H  SET THE ZERO FLAG TO INDICATE IF AN ASCII CHARACTER IS     :
    68                              <1> 	;		   AVAILABLE TO BE READ FROM THE KEYBOARD BUFFER.	      :
    69                              <1> 	;		   (ZF)= 1 -- NO CODE AVAILABLE			              :
    70                              <1> 	;		   (ZF)= 0 -- CODE IS AVAILABLE  (AX)= CHARACTER              :
    71                              <1> 	;		   IF (ZF)= 0, THE NEXT CHARACTER IN THE BUFFER TO BE READ IS :
    72                              <1> 	;		   IN (AX), AND THE ENTRY REMAINS IN THE BUFFER.              :
    73                              <1> 	;		   THIS WILL RETURN ONLY PC/PCAT KEYBOARD COMPATIBLE CODES    :
    74                              <1> 	;-----------------------------------------------------------------------------:	
    75                              <1> 	;	(AH)= 02H  RETURN THE CURRENT SHIFT STATUS IN AL REGISTER             :
    76                              <1> 	;		   THE BIT SETTINGS FOR THIS CODE ARE INDICATED IN THE        :
    77                              <1> 	;		   EQUATES FOR @KB_FLAG		                              :
    78                              <1> 	;-----------------------------------------------------------------------------:	
    79                              <1> 	;	(AH)= 03H  SET TYPAMATIC RATE AND DELAY                               :
    80                              <1> 	;	      (AL) = 05H                                                      :
    81                              <1> 	;	      (BL) = TYPAMATIC RATE (BITS 5 - 7 MUST BE RESET TO 0)           :
    82                              <1> 	;		       							      :
    83                              <1> 	;                     REGISTER     RATE      REGISTER     RATE                :
    84                              <1> 	;                      VALUE     SELECTED     VALUE     SELECTED              :
    85                              <1> 	;                     --------------------------------------------            :
    86                              <1> 	;			00H        30.0        10H        7.5                 :
    87                              <1> 	;			01H        26.7        11H        6.7                 :
    88                              <1> 	;			02H        24.0        12H        6.0                 :
    89                              <1> 	;			03H        21.8        13H        5.5                 :
    90                              <1> 	;			04H        20.0        14H        5.0                 :
    91                              <1> 	;			05H        18.5        15H        4.6                 :
    92                              <1> 	;			06H        17.1        16H        4.3                 :
    93                              <1> 	;			07H        16.0        17H        4.0                 :
    94                              <1> 	;			08H        15.0        18H        3.7                 :
    95                              <1> 	;			09H        13.3        19H        3.3                 :
    96                              <1> 	;			0AH        12.0        1AH        3.0                 :
    97                              <1> 	;			0BH        10.9        1BH        2.7                 :
    98                              <1>         ;			0CH        10.0        1CH        2.5                 :
    99                              <1> 	;			0DH         9.2        1DH        2.3                 :
   100                              <1> 	;			0EH         8.6        1EH        2.1                 :
   101                              <1> 	;			0FH         8.0        1FH        2.0                 :
   102                              <1> 	;									      :
   103                              <1> 	;	      (BH) = TYPAMATIC DELAY  (BITS 2 - 7 MUST BE RESET TO 0)         :
   104                              <1> 	;		       							      :
   105                              <1> 	;                     REGISTER     DELAY                                      :
   106                              <1> 	;                      VALUE       VALUE                                      :
   107                              <1> 	;                     ------------------                                      :
   108                              <1> 	;			00H        250 ms                                     :
   109                              <1> 	;			01H        500 ms                                     :
   110                              <1> 	;			02H        750 ms                                     :
   111                              <1> 	;			03H       1000 ms                                     :
   112                              <1> 	;-----------------------------------------------------------------------------:
   113                              <1> 	;	(AH)= 05H  PLACE ASCII CHARACTER/SCAN CODE COMBINATION IN KEYBOARD    :
   114                              <1> 	;		   BUFFER AS IF STRUCK FROM KEYBOARD                          :
   115                              <1> 	;		   ENTRY:  (CL) = ASCII CHARACTER		              :
   116                              <1> 	;		           (CH) = SCAN CODE                                   :
   117                              <1> 	;		   EXIT:   (AH) = 00H = SUCCESSFUL OPERATION                  :
   118                              <1> 	;		           (AL) = 01H = UNSUCCESSFUL - BUFFER FULL            :
   119                              <1> 	;		   FLAGS:  CARRY IF ERROR                                     :
   120                              <1> 	;-----------------------------------------------------------------------------:		
   121                              <1> 	;	(AH)= 10H  EXTENDED READ INTERFACE FOR THE ENHANCED KEYBOARD,         :
   122                              <1> 	;		   OTHERWISE SAME AS FUNCTION AH=0                            :
   123                              <1> 	;-----------------------------------------------------------------------------:
   124                              <1> 	;	(AH)= 11H  EXTENDED ASCII STATUS FOR THE ENHANCED KEYBOARD,           :
   125                              <1> 	;		   OTHERWISE SAME AS FUNCTION AH=1                            :
   126                              <1> 	;-----------------------------------------------------------------------------:	
   127                              <1> 	;	(AH)= 12H  RETURN THE EXTENDED SHIFT STATUS IN AX REGISTER            :
   128                              <1> 	;		   AL = BITS FROM KB_FLAG, AH = BITS FOR LEFT AND RIGHT       :
   129                              <1> 	;		   CTL AND ALT KEYS FROM KB_FLAG_1 AND KB_FLAG_3              :
   130                              <1> 	; OUTPUT					                              :
   131                              <1> 	;	AS NOTED ABOVE, ONLY (AX) AND FLAGS CHANGED	                      :
   132                              <1> 	;	ALL REGISTERS RETAINED		                                      :
   133                              <1> 	;------------------------------------------------------------------------------
   134                              <1> 
   135                              <1> ; 15/01/2017
   136                              <1> ; 14/01/2017
   137                              <1> ; 02/01/2017
   138                              <1> ; 29/05/2016
   139                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   140                              <1> int32h:  ; Keyboard BIOS
   141                              <1> 
   142                              <1> KEYBOARD_IO_1:	
   143                              <1> 	;sti				; INTERRUPTS BACK ON
   144                              <1> 	; 29/05/2016
   145 00000BA4 80642408BE          <1>         and     byte [esp+8], 10111110b ; clear zero flag and cary flag
   146                              <1> 	;
   147 00000BA9 1E                  <1> 	push	ds			; SAVE CURRENT DS
   148 00000BAA 53                  <1> 	push	ebx			; SAVE BX TEMPORARILY
   149                              <1> 	;push	ecx			; SAVE CX TEMPORARILY
   150 00000BAB 66BB1000            <1>         mov     bx, KDATA 
   151 00000BAF 8EDB                <1> 	mov	ds, bx			; PUT SEGMENT VALUE OF DATA AREA INTO DS
   152                              <1> 
   153                              <1> 	; 14/01/2017
   154 00000BB1 8B1C24              <1> 	mov	ebx, [esp]
   155                              <1> 	;; 15/01/2017
   156                              <1> 	; 02/01/2017
   157                              <1> 	;;mov	byte [intflg], 32h	; keyboard interrupt 
   158 00000BB4 FB                  <1> 	sti
   159                              <1> 	;
   160                              <1> 
   161 00000BB5 08E4                <1> 	or	ah, ah			; CHECK FOR (AH)= 00H
   162 00000BB7 743A                <1> 	jz	short _K1		; ASCII_READ
   163 00000BB9 FECC                <1> 	dec	ah                      ; CHECK FOR (AH)= 01H
   164 00000BBB 7453                <1>         jz      short _K2               ; ASCII_STATUS
   165 00000BBD FECC                <1> 	dec	ah			; CHECK FOR (AH)= 02H
   166 00000BBF 0F8494000000        <1>         jz      _K3                     ; SHIFT STATUS
   167 00000BC5 FECC                <1> 	dec	ah			; CHECK FOR (AH)= 03H	
   168 00000BC7 0F8493000000        <1>         jz      _K300                   ; SET TYPAMATIC RATE/DELAY
   169 00000BCD 80EC02              <1> 	sub	ah, 2			; CHECK FOR (AH)= 05H	
   170 00000BD0 0F84BC000000        <1>         jz      _K500                   ; KEYBOARD WRITE         
   171                              <1> _KIO1:	
   172 00000BD6 80EC0B              <1> 	sub	ah, 11			; AH =  10H
   173 00000BD9 740C                <1> 	jz	short _K1E		; EXTENDED ASCII READ
   174 00000BDB FECC                <1> 	dec	ah			; CHECK FOR (AH)= 11H
   175 00000BDD 7422                <1> 	jz	short _K2E		; EXTENDED_ASCII_STATUS
   176 00000BDF FECC                <1> 	dec	ah			; CHECK FOR (AH)= 12H
   177 00000BE1 7458                <1> 	jz	short _K3E		; EXTENDED_SHIFT_STATUS
   178                              <1> _KIO_EXIT:
   179                              <1> 	; 02/01/2017
   180 00000BE3 FA                  <1> 	cli
   181                              <1> 	;;mov	byte [intflg], 0 ;; 15/01/2017
   182                              <1> 	;
   183                              <1> 	;pop	ecx			; RECOVER REGISTER
   184 00000BE4 5B                  <1> 	pop	ebx			; RECOVER REGISTER
   185 00000BE5 1F                  <1> 	pop	ds			; RECOVER SEGMENT
   186 00000BE6 CF                  <1> 	iretd				; INVALID COMMAND, EXIT
   187                              <1> 
   188                              <1> 	;-----	ASCII CHARACTER
   189                              <1> _K1E:	
   190 00000BE7 E8D3000000          <1> 	call	_K1S			; GET A CHARACTER FROM THE BUFFER (EXTENDED)
   191 00000BEC E848010000          <1> 	call	_KIO_E_XLAT		; ROUTINE TO XLATE FOR EXTENDED CALLS
   192 00000BF1 EBF0                <1> 	jmp	short _KIO_EXIT         ; GIVE IT TO THE CALLER
   193                              <1> _K1:	
   194 00000BF3 E8C7000000          <1> 	call	_K1S			; GET A CHARACTER FROM THE BUFFER
   195 00000BF8 E847010000          <1> 	call	_KIO_S_XLAT		; ROUTINE TO XLATE FOR STANDARD CALLS
   196 00000BFD 72F4                <1> 	jc	short _K1		; CARRY SET MEANS TROW CODE AWAY
   197                              <1> _K1A:
   198 00000BFF EBE2                <1> 	jmp	short _KIO_EXIT         ; RETURN TO CALLER
   199                              <1> 
   200                              <1> 	;-----	ASCII STATUS
   201                              <1> _K2E:	
   202 00000C01 E804010000          <1> 	call	_K2S			; TEST FOR CHARACTER IN BUFFER (EXTENDED)
   203 00000C06 7420                <1> 	jz	short _K2B		; RETURN IF BUFFER EMPTY
   204 00000C08 9C                  <1> 	pushf				; SAVE ZF FROM TEST
   205 00000C09 E82B010000          <1> 	call	_KIO_E_XLAT		; ROUTINE TO XLATE FOR EXTENDED CALLS
   206 00000C0E EB17                <1> 	jmp	short _K2A	        ; GIVE IT TO THE CALLER
   207                              <1> _K2:	
   208 00000C10 E8F5000000          <1> 	call	_K2S			; TEST FOR CHARACTER IN BUFFER
   209 00000C15 7411                <1> 	jz	short _K2B		; RETURN IF BUFFER EMPTY
   210 00000C17 9C                  <1> 	pushf				; SAVE ZF FROM TEST
   211 00000C18 E827010000          <1> 	call	_KIO_S_XLAT		; ROUTINE TO XLATE FOR STANDARD CALLS
   212 00000C1D 7308                <1> 	jnc	short _K2A	        ; CARRY CLEAR MEANS PASS VALID CODE
   213 00000C1F 9D                  <1> 	popf				; INVALID CODE FOR THIS TYPE OF CALL
   214 00000C20 E89A000000          <1> 	call	_K1S			; THROW THE CHARACTER AWAY
   215 00000C25 EBE9                <1> 	jmp	short _K2		; GO LOOK FOR NEXT CHAR, IF ANY
   216                              <1> _K2A:
   217 00000C27 9D                  <1> 	popf				; RESTORE ZF FROM TEST
   218                              <1> _K2B:
   219                              <1> 	; 02/01/2017
   220 00000C28 FA                  <1> 	cli
   221                              <1> 	;; mov	byte [intflg], 0 ;; 15/01/2017
   222                              <1> 	;
   223                              <1> 	;pop	ecx			; RECOVER REGISTER
   224 00000C29 5B                  <1> 	pop	ebx			; RECOVER REGISTER
   225 00000C2A 1F                  <1> 	pop	ds			; RECOVER SEGMENT
   226                              <1> 	; (*) 29/05/2016
   227                              <1> 	; (*) retf 4			; THROW AWAY (e)FLAGS
   228 00000C2B 7208                <1> 	jc	short _k2d
   229 00000C2D 7505                <1> 	jnz	short _k2c
   230 00000C2F 804C240840          <1> 	or	byte [esp+8], 01000000b	; set zero flag bit of eflags register
   231                              <1> _k2c:
   232 00000C34 CF                  <1> 	iretd
   233                              <1> _k2d:
   234                              <1> 	; 29/05/2016 -set carry flag on stack-
   235                              <1> 	; [esp] = EIP
   236                              <1> 	; [esp+4] = CS
   237                              <1> 	; [esp+8] = E-FLAGS
   238 00000C35 804C240801          <1> 	or	byte [esp+8], 1  ; set carry bit of eflags register
   239                              <1> 	; [esp+12] = ESP (user)
   240                              <1> 	; [esp+16] = SS (User)
   241 00000C3A CF                  <1> 	iretd
   242                              <1> 
   243                              <1> 	
   244                              <1> 	; (*) 29/05/2016 - 'ref 4' intruction causes to stack fault
   245                              <1> 	; (OUTER-PRIVILEGE-LEVEL)
   246                              <1> 	; INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986
   247                              <1> 	; // RETF instruction:
   248                              <1> 	;
   249                              <1> 	; IF OperandMode=32 THEN
   250                              <1>  	;    Load CS:EIP from stack;
   251                              <1>  	;    Set CS RPL to CPL;
   252                              <1>  	;    Increment eSP by 8 plus the immediate offset if it exists;
   253                              <1>  	;    Load SS:eSP from stack;
   254                              <1>  	; ELSE (* OperandMode=16 *)
   255                              <1>  	;    Load CS:IP from stack;
   256                              <1>  	;    Set CS RPL to CPL;
   257                              <1>  	;    Increment eSP by 4 plus the immediate offset if it exists;
   258                              <1> 	;    Load SS:eSP from stack;
   259                              <1>  	; FI;
   260                              <1> 	;
   261                              <1> 	; //
   262                              <1> 
   263                              <1> 	;-----	SHIFT STATUS
   264                              <1> _K3E:                                   ; GET THE EXTENDED SHIFT STATUS FLAGS
   265 00000C3B 8A25[BAF70000]      <1> 	mov	ah, [KB_FLAG_1]		; GET SYSTEM SHIFT KEY STATUS
   266 00000C41 80E404              <1> 	and	ah, SYS_SHIFT		; MASK ALL BUT SYS KEY BIT
   267                              <1> 	;mov	cl, 5			; SHIFT THEW SYSTEMKEY BIT OVER TO
   268                              <1> 	;shl	ah, cl			; BIT 7 POSITION
   269 00000C44 C0E405              <1>         shl	ah, 5
   270 00000C47 A0[BAF70000]        <1> 	mov	al, [KB_FLAG_1]		; GET SYSTEM SHIFT STATES BACK
   271 00000C4C 2473                <1> 	and	al, 01110011b		; ELIMINATE SYS SHIFT, HOLD_STATE AND INS_SHIFT
   272 00000C4E 08C4                <1> 	or	ah, al                  ; MERGE REMAINING BITS INTO AH
   273 00000C50 A0[BCF70000]        <1> 	mov	al, [KB_FLAG_3]		; GET RIGHT CTL AND ALT
   274 00000C55 240C                <1> 	and	al, 00001100b		; ELIMINATE LC_E0 AND LC_E1
   275 00000C57 08C4                <1> 	or	ah, al			; OR THE SHIFT FLAGS TOGETHER
   276                              <1> _K3:
   277 00000C59 A0[B9F70000]        <1> 	mov	al, [KB_FLAG]		; GET THE SHIFT STATUS FLAGS
   278                              <1> 	;jmp	short _KIO_EXIT		; RETURN TO CALLER
   279 00000C5E EB83                <1> 	jmp	_KIO_EXIT
   280                              <1> 
   281                              <1> 	;-----	SET TYPAMATIC RATE AND DELAY
   282                              <1> _K300:
   283 00000C60 3C05                <1> 	cmp	al, 5			; CORRECT FUNCTION CALL?
   284                              <1> 	;jne	short _KIO_EXIT		; NO, RETURN
   285 00000C62 0F857BFFFFFF        <1>      	jne	_KIO_EXIT
   286 00000C68 F6C3E0              <1> 	test	bl, 0E0h		; TEST FOR OUT-OF-RANGE RATE
   287 00000C6B 0F8572FFFFFF        <1>         jnz     _KIO_EXIT               ; RETURN IF SO
   288 00000C71 F6C7FC              <1> 	test	BH, 0FCh		; TEST FOR OUT-OF-RANGE DELAY
   289 00000C74 0F8569FFFFFF        <1>         jnz     _KIO_EXIT               ; RETURN IF SO
   290 00000C7A B0F3                <1> 	mov	al, KB_TYPA_RD		; COMMAND FOR TYPAMATIC RATE/DELAY		
   291 00000C7C E8DA060000          <1> 	call	SND_DATA		; SEND TO KEYBOARD	
   292                              <1> 	;mov	cx, 5			; SHIFT COUNT
   293                              <1> 	;shl	bh, cl			; SHIFT DELAY OVER
   294 00000C81 C0E705              <1> 	shl	bh, 5
   295 00000C84 88D8                <1> 	mov	al, bl			; PUT IN RATE
   296 00000C86 08F8                <1> 	or	al, bh			; AND DELAY
   297 00000C88 E8CE060000          <1> 	call	SND_DATA		; SEND TO KEYBOARD	
   298 00000C8D E951FFFFFF          <1>         jmp     _KIO_EXIT               ; RETURN TO CALLER
   299                              <1> 
   300                              <1> 	;-----	WRITE TO KEYBOARD BUFFER
   301                              <1> _K500:
   302 00000C92 56                  <1> 	push	esi			; SAVE SI (esi)
   303 00000C93 FA                  <1> 	cli				; 
   304 00000C94 8B1D[CAF70000]      <1>      	mov	ebx, [BUFFER_TAIL]	; GET THE 'IN TO' POINTER TO THE BUFFER
   305 00000C9A 89DE                <1> 	mov	esi, ebx		; SAVE A COPY IN CASE BUFFER NOT FULL
   306 00000C9C E8D3000000          <1> 	call	_K4			; BUMP THE POINTER TO SEE IF BUFFER IS FULL
   307 00000CA1 3B1D[C6F70000]      <1> 	cmp	ebx, [BUFFER_HEAD]	; WILL THE BUFFER OVERRUN IF WE STORE THIS?
   308 00000CA7 740D                <1> 	je	short _K502		; YES - INFORM CALLER OF ERROR		
   309 00000CA9 66890E              <1> 	mov	[esi], cx		; NO - PUT ASCII/SCAN CODE INTO BUFFER	
   310 00000CAC 891D[CAF70000]      <1> 	mov	[BUFFER_TAIL], ebx	; ADJUST 'IN TO' POINTER TO REFLECT CHANGE
   311 00000CB2 28C0                <1> 	sub	al, al			; TELL CALLER THAT OPERATION WAS SUCCESSFUL
   312 00000CB4 EB02                <1> 	jmp	short _K504		; SUB INSTRUCTION ALSO RESETS CARRY FLAG
   313                              <1> _K502:
   314 00000CB6 B001                <1> 	mov	al, 01h			; BUFFER FULL INDICATION
   315                              <1> _K504:
   316 00000CB8 FB                  <1> 	sti				
   317 00000CB9 5E                  <1> 	pop	esi			; RECOVER SI (esi)
   318 00000CBA E924FFFFFF          <1>         jmp     _KIO_EXIT               ; RETURN TO CALLER WITH STATUS IN AL
   319                              <1> 
   320                              <1> 	;-----	READ THE KEY TO FIGURE OUT WHAT TO DO -----
   321                              <1> _K1S:
   322 00000CBF FA                  <1> 	cli	; 03/12/2014
   323 00000CC0 8B1D[C6F70000]      <1>         mov     ebx, [BUFFER_HEAD] 	; GET POINTER TO HEAD OF BUFFER
   324 00000CC6 3B1D[CAF70000]      <1>         cmp     ebx, [BUFFER_TAIL] 	; TEST END OF BUFFER
   325                              <1> 	;jne	short _K1U		; IF ANYTHING IN BUFFER SKIP INTERRUPT
   326 00000CCC 750F                <1> 	jne	short _k1x ; 03/12/2014
   327                              <1> 	;
   328                              <1> 	; 03/12/2014
   329                              <1> 	; 28/08/2014
   330                              <1> 	; PERFORM OTHER FUNCTION ?? here !
   331                              <1> 	;; MOV	AX, 9002h		; MOVE IN WAIT CODE & TYPE
   332                              <1> 	;; INT 	15H			; PERFORM OTHER FUNCTION
   333                              <1> _K1T:                                   ; ASCII READ
   334 00000CCE FB                  <1> 	sti				; INTERRUPTS BACK ON DURING LOOP
   335 00000CCF 90                  <1> 	nop				; ALLOW AN INTERRUPT TO OCCUR
   336                              <1> _K1U:	
   337 00000CD0 FA                  <1> 	cli				; INTERRUPTS BACK OFF
   338 00000CD1 8B1D[C6F70000]      <1>         mov    	ebx, [BUFFER_HEAD] 	; GET POINTER TO HEAD OF BUFFER
   339 00000CD7 3B1D[CAF70000]      <1>         cmp     ebx, [BUFFER_TAIL] 	; TEST END OF BUFFER
   340                              <1> _k1x:
   341 00000CDD 53                  <1> 	push	ebx			; SAVE ADDRESS		
   342 00000CDE 9C                  <1> 	pushf				; SAVE FLAGS
   343 00000CDF E82F070000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   344 00000CE4 8A1D[BBF70000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   345 00000CEA 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   346 00000CEC 80E307              <1> 	and	bl, 07h	; KB_LEDS	; ISOLATE INDICATOR BITS
   347 00000CEF 7406                <1> 	jz	short _K1V		; IF NO CHANGE BYPASS UPDATE
   348 00000CF1 E8C9060000          <1> 	call	SND_LED1
   349 00000CF6 FA                  <1> 	cli				; DISABLE INTERRUPTS
   350                              <1> _K1V:
   351 00000CF7 9D                  <1> 	popf				; RESTORE FLAGS
   352 00000CF8 5B                  <1> 	pop	ebx			; RESTORE ADDRESS
   353 00000CF9 74D3                <1>         je      short _K1T              ; LOOP UNTIL SOMETHING IN BUFFER
   354                              <1> 	;
   355 00000CFB 668B03              <1> 	mov	ax, [ebx] 		; GET SCAN CODE AND ASCII CODE
   356 00000CFE E871000000          <1>         call    _K4                     ; MOVE POINTER TO NEXT POSITION
   357 00000D03 891D[C6F70000]      <1>         mov     [BUFFER_HEAD], ebx      ; STORE VALUE IN VARIABLE
   358 00000D09 C3                  <1> 	retn				; RETURN
   359                              <1> 
   360                              <1> 	;-----	READ THE KEY TO SEE IF ONE IS PRESENT -----
   361                              <1> _K2S:
   362 00000D0A FA                  <1> 	cli				; INTERRUPTS OFF
   363 00000D0B 8B1D[C6F70000]      <1>         mov     ebx, [BUFFER_HEAD]      ; GET HEAD POINTER
   364 00000D11 3B1D[CAF70000]      <1>         cmp     ebx, [BUFFER_TAIL]      ; IF EQUAL (Z=1) THEN NOTHING THERE
   365 00000D17 668B03              <1> 	mov	ax, [ebx]
   366 00000D1A 9C                  <1> 	pushf				; SAVE FLAGS
   367 00000D1B 6650                <1> 	push	ax			; SAVE CODE
   368 00000D1D E8F1060000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   369 00000D22 8A1D[BBF70000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   370 00000D28 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   371 00000D2A 80E307              <1> 	and	bl, 07h ; KB_LEDS	; ISOLATE INDICATOR BITS
   372 00000D2D 7405                <1> 	jz	short _K2T		; IF NO CHANGE BYPASS UPDATE
   373 00000D2F E874060000          <1> 	call	SND_LED			; GO TURN ON MODE INDICATORS
   374                              <1> _K2T:
   375 00000D34 6658                <1> 	pop	ax			; RESTORE CODE
   376 00000D36 9D                  <1> 	popf				; RESTORE FLAGS
   377 00000D37 FB                  <1> 	sti				; INTERRUPTS BACK ON
   378 00000D38 C3                  <1> 	retn				; RETURN
   379                              <1> 
   380                              <1> 	;-----	ROUTINE TO TRANSLATE SCAN CODE PAIRS FOR EXTENDED CALLS -----
   381                              <1> _KIO_E_XLAT:
   382 00000D39 3CF0                <1> 	cmp	al, 0F0h		; IS IT ONE OF THE FILL-INs?
   383 00000D3B 7506                <1> 	jne	short _KIO_E_RET	; NO, PASS IT ON
   384 00000D3D 08E4                <1>         or 	ah, ah			; AH = 0 IS SPECIAL CASE
   385 00000D3F 7402                <1>         jz	short _KIO_E_RET        ; PASS THIS ON UNCHANGED
   386 00000D41 30C0                <1> 	xor	al, al			; OTHERWISE SET AL = 0
   387                              <1> _KIO_E_RET:				
   388 00000D43 C3                  <1> 	retn				; GO BACK
   389                              <1> 
   390                              <1> 	;-----	ROUTINE TO TRANSLATE SCAN CODE PAIRS FOR STANDARD CALLS -----
   391                              <1> _KIO_S_XLAT:
   392 00000D44 80FCE0              <1> 	cmp	ah, 0E0h		; IS IT KEYPAD ENTER OR / ?
   393 00000D47 750F                <1> 	jne	short _KIO_S2		; NO, CONTINUE
   394 00000D49 3C0D                <1> 	cmp	al, 0Dh			; KEYPAD ENTER CODE?
   395 00000D4B 7408                <1>         je	short _KIO_S1		; YES, MASSAGE A BIT
   396 00000D4D 3C0A                <1> 	cmp	al, 0Ah			; CTRL KEYPAD ENTER CODE?
   397 00000D4F 7404                <1>         je	short _KIO_S1		; YES, MASSAGE THE SAME
   398 00000D51 B435                <1> 	mov	ah, 35h			; NO, MUST BE KEYPAD /
   399                              <1> _kio_ret: ; 03/12/2014
   400 00000D53 F8                  <1> 	clc
   401 00000D54 C3                  <1> 	retn
   402                              <1> 	;jmp	short _KIO_USE		; GIVE TO CALLER
   403                              <1> _KIO_S1:				
   404 00000D55 B41C                <1> 	mov	ah, 1Ch			; CONVERT TO COMPATIBLE OUTPUT
   405                              <1> 	;jmp	short _KIO_USE		; GIVE TO CALLER
   406 00000D57 C3                  <1> 	retn
   407                              <1> _KIO_S2:		
   408 00000D58 80FC84              <1> 	cmp	ah, 84h			; IS IT ONE OF EXTENDED ONES?
   409 00000D5B 7715                <1> 	ja	short _KIO_DIS		; YES, THROW AWAY AND GET ANOTHER CHAR
   410 00000D5D 3CF0                <1> 	cmp	al, 0F0h		; IS IT ONE OF THE FILL-INs?
   411 00000D5F 7506                <1>         jne	short _KIO_S3		; NO, TRY LAST TEST
   412 00000D61 08E4                <1> 	or	ah, ah			; AH = 0 IS SPECIAL CASE
   413 00000D63 740C                <1>         jz	short _KIO_USE		; PASS THIS ON UNCHANGED
   414 00000D65 EB0B                <1> 	jmp	short _KIO_DIS		; THROW AWAY THE REST
   415                              <1> _KIO_S3:
   416 00000D67 3CE0                <1> 	cmp	al, 0E0h		; IS IT AN EXTENSION OF A PREVIOUS ONE?
   417                              <1> 	;jne	short _KIO_USE		; NO, MUST BE A STANDARD CODE
   418 00000D69 75E8                <1> 	jne	short _kio_ret
   419 00000D6B 08E4                <1> 	or	ah, ah			; AH = 0 IS SPECIAL CASE
   420 00000D6D 7402                <1>         jz	short _KIO_USE		; JUMP IF AH = 0
   421 00000D6F 30C0                <1> 	xor	al, al			; CONVERT TO COMPATIBLE OUTPUT
   422                              <1> 	;jmp	short _KIO_USE		; PASS IT ON TO CALLER
   423                              <1> _KIO_USE:
   424                              <1> 	;clc				; CLEAR CARRY TO INDICATE GOOD CODE
   425 00000D71 C3                  <1> 	retn				; RETURN	
   426                              <1> _KIO_DIS:
   427 00000D72 F9                  <1> 	stc				; SET CARRY TO INDICATE DISCARD CODE
   428 00000D73 C3                  <1> 	retn				; RETURN
   429                              <1> 
   430                              <1> 	;-----	INCREMENT BUFFER POINTER ROUTINE -----
   431                              <1> _K4:    
   432 00000D74 43                  <1> 	inc     ebx
   433 00000D75 43                  <1> 	inc	ebx			; MOVE TO NEXT WORD IN LIST
   434 00000D76 3B1D[C2F70000]      <1>         cmp     ebx, [BUFFER_END] 	; AT END OF BUFFER?
   435                              <1>         ;jne    short _K5               ; NO, CONTINUE
   436 00000D7C 7206                <1> 	jb	short _K5
   437 00000D7E 8B1D[BEF70000]      <1>         mov     ebx, [BUFFER_START]     ; YES, RESET TO BUFFER BEGINNING
   438                              <1> _K5:
   439 00000D84 C3                  <1> 	retn
   440                              <1> 
   441                              <1> ; 20/02/2015
   442                              <1> ; 05/12/2014
   443                              <1> ; 26/08/2014
   444                              <1> ; KEYBOARD (HARDWARE) INTERRUPT -  IRQ LEVEL 1
   445                              <1> ; (INT_09h - Retro UNIX 8086 v1 - U9.ASM, 07/03/2014)
   446                              <1> ;
   447                              <1> ; Derived from "KB_INT_1" procedure of IBM "pc-at" 
   448                              <1> ; rombios source code (06/10/1985)
   449                              <1> ; 'keybd.asm', HARDWARE INT 09h - (IRQ Level 1)
   450                              <1> 
   451                              <1> ; EQUATES (IBM PC-XT-286 BIOS, 1986, 'POSQEQU.INC')
   452                              <1> 
   453                              <1> ;--------- 8042 COMMANDS -------------------------------------------------------
   454                              <1> ENA_KBD		equ	0AEh		; ENABLE KEYBOARD COMMAND
   455                              <1> DIS_KBD		equ	0ADh		; DISABLE KEYBOARD COMMAND
   456                              <1> SHUT_CMD	equ	0FEh		; CAUSE A SHUTDOWN COMMAND
   457                              <1> ;--------- 8042 KEYBOARD INTERFACE AND DIAGNOSTIC CONTROL REGISTERS ------------
   458                              <1> STATUS_PORT	equ	064h		; 8042 STATUS PORT
   459                              <1> INPT_BUF_FULL	equ	00000010b 	; 1 = +INPUT BUFFER FULL
   460                              <1> PORT_A		equ	060h		; 8042 KEYBOARD SCAN CODE/CONTROL PORT
   461                              <1> ;---------- 8042 KEYBOARD RESPONSE ---------------------------------------------
   462                              <1> KB_ACK		equ	0FAh		; ACKNOWLEDGE PROM TRANSMISSION
   463                              <1> KB_RESEND	equ	0FEh		; RESEND REQUEST
   464                              <1> KB_OVER_RUN	equ	0FFh		; OVER RUN SCAN CODE
   465                              <1> ;---------- KEYBOARD/LED COMMANDS ----------------------------------------------
   466                              <1> KB_ENABLE	equ	0F4h		; KEYBOARD ENABLE
   467                              <1> LED_CMD		equ	0EDh		; LED WRITE COMMAND
   468                              <1> KB_TYPA_RD	equ	0F3h		; TYPAMATIC RATE/DELAY COMMAND
   469                              <1> ;---------- KEYBOARD SCAN CODES ------------------------------------------------
   470                              <1> NUM_KEY		equ	69		; SCAN CODE FOR	 NUMBER LOCK KEY
   471                              <1> SCROLL_KEY	equ	70		; SCAN CODE FOR	 SCROLL LOCK KEY
   472                              <1> ALT_KEY		equ	56		; SCAN CODE FOR	 ALTERNATE SHIFT KEY
   473                              <1> CTL_KEY		equ	29		; SCAN CODE FOR	 CONTROL KEY
   474                              <1> CAPS_KEY	equ	58		; SCAN CODE FOR	 SHIFT LOCK KEY
   475                              <1> DEL_KEY		equ	83		; SCAN CODE FOR	 DELETE KEY
   476                              <1> INS_KEY		equ	82		; SCAN CODE FOR	 INSERT KEY
   477                              <1> LEFT_KEY	equ	42		; SCAN CODE FOR	 LEFT SHIFT
   478                              <1> RIGHT_KEY	equ	54		; SCAN CODE FOR	 RIGHT SHIFT
   479                              <1> SYS_KEY		equ	84		; SCAN CODE FOR	 SYSTEM KEY
   480                              <1> ;---------- ENHANCED KEYBOARD SCAN CODES ---------------------------------------
   481                              <1> ID_1		equ	0ABh		; 1ST ID CHARACTER FOR KBX
   482                              <1> ID_2		equ	041h		; 2ND ID CHARACTER FOR KBX
   483                              <1> ID_2A		equ	054h		; ALTERNATE 2ND ID CHARACTER FOR KBX
   484                              <1> F11_M		equ	87		; F11 KEY MAKE
   485                              <1> F12_M		equ	88		; F12 KEY MAKE
   486                              <1> MC_E0		equ	224		; GENERAL MARKER CODE
   487                              <1> MC_E1		equ	225		; PAUSE KEY MARKER CODE
   488                              <1> ;---------- FLAG EQUATES WITHIN @KB_FLAG----------------------------------------
   489                              <1> RIGHT_SHIFT	equ	00000001b	; RIGHT SHIFT KEY DEPRESSED
   490                              <1> LEFT_SHIFT	equ	00000010b	; LEFT SHIFT KEY DEPRESSED
   491                              <1> CTL_SHIFT	equ	00000100b	; CONTROL SHIFT KEY DEPRESSED
   492                              <1> ALT_SHIFT	equ	00001000b	; ALTERNATE SHIFT KEY DEPRESSED
   493                              <1> SCROLL_STATE	equ	00010000b	; SCROLL LOCK STATE IS ACTIVE
   494                              <1> NUM_STATE	equ	00100000b	; NUM LOCK STATE IS ACTIVE
   495                              <1> CAPS_STATE	equ	01000000b	; CAPS LOCK STATE IS ACTIVE
   496                              <1> INS_STATE	equ	10000000b	; INSERT STATE IS ACTIVE
   497                              <1> ;---------- FLAG EQUATES WITHIN	@KB_FLAG_1 -------------------------------------
   498                              <1> L_CTL_SHIFT	equ	00000001b	; LEFT CTL KEY DOWN
   499                              <1> L_ALT_SHIFT	equ	00000010b	; LEFT ALT KEY DOWN
   500                              <1> SYS_SHIFT	equ	00000100b	; SYSTEM KEY DEPRESSED AND HELD
   501                              <1> HOLD_STATE	equ	00001000b	; SUSPEND KEY HAS BEEN TOGGLED
   502                              <1> SCROLL_SHIFT	equ	00010000b	; SCROLL LOCK KEY IS DEPRESSED
   503                              <1> NUM_SHIFT	equ	00100000b	; NUM LOCK KEY IS DEPRESSED
   504                              <1> CAPS_SHIFT	equ	01000000b	; CAPS LOCK KEY IS DEPRE55ED
   505                              <1> INS_SHIFT	equ	10000000b	; INSERT KEY IS DEPRESSED
   506                              <1> ;---------- FLAGS EQUATES WITHIN @KB_FLAG_2 -----------------------------------
   507                              <1> KB_LEDS		equ	00000111b	; KEYBOARD LED STATE BITS
   508                              <1> ;		equ	00000001b	; SCROLL LOCK INDICATOR
   509                              <1> ;		equ	00000010b	; NUM LOCK INDICATOR
   510                              <1> ;		equ	00000100b	; CAPS LOCK INDICATOR
   511                              <1> ;		equ	00001000b	; RESERVED (MUST BE ZERO)
   512                              <1> KB_FA		equ	00010000b	; ACKNOWLEDGMENT RECEIVED
   513                              <1> KB_FE		equ	00100000b	; RESEND RECEIVED FLAG
   514                              <1> KB_PR_LED	equ	01000000b	; MODE INDICATOR UPDATE
   515                              <1> KB_ERR		equ	10000000b	; KEYBOARD TRANSMIT ERROR FLAG
   516                              <1> ;----------- FLAGS EQUATES WITHIN @KB_FLAG_3 -----------------------------------
   517                              <1> LC_E1		equ	00000001b	; LAST CODE WAS THE E1 HIDDEN CODE
   518                              <1> LC_E0		equ	00000010b	; LAST CODE WAS THE E0 HIDDEN CODE
   519                              <1> R_CTL_SHIFT	equ	00000100b	; RIGHT CTL KEY DOWN
   520                              <1> R_ALT_SHIFT	equ	00001000b	; RIGHT ALT KEY DOWN
   521                              <1> GRAPH_ON	equ	00001000b	; ALT GRAPHICS KEY DOWN (WT ONLY)	
   522                              <1> KBX		equ	00010000b	; ENHANCED KEYBOARD INSTALLED
   523                              <1> SET_NUM_LK	equ	00100000b	; FORCE NUM LOCK IF READ ID AND KBX
   524                              <1> LC_AB		equ	01000000b	; LAST CHARACTER WAS FIRST ID CHARACTER
   525                              <1> RD_ID		equ	10000000b	; DOING A READ ID (MUST BE BIT0)
   526                              <1> ;
   527                              <1> ;----------- INTERRUPT EQUATES -------------------------------------------------
   528                              <1> EOI		equ	020h		; END OF INTERRUPT COMMAND TO 8259
   529                              <1> INTA00		equ	020h		; 8259 PORT
   530                              <1> 
   531                              <1> 
   532                              <1> kb_int:
   533                              <1> 
   534                              <1> ; 17/10/2015 ('ctrlbrk') 
   535                              <1> ; 05/12/2014
   536                              <1> ; 04/12/2014 (derived from pc-xt-286 bios source code -1986-)
   537                              <1> ; 26/08/2014
   538                              <1> ;
   539                              <1> ; 03/06/86  KEYBOARD BIOS
   540                              <1> ;
   541                              <1> ;--- HARDWARE INT 09H -- (IRQ LEVEL 1) ------------------------------------------
   542                              <1> ;										;
   543                              <1> ;	KEYBOARD INTERRUPT ROUTINE						;
   544                              <1> ;										;
   545                              <1> ;--------------------------------------------------------------------------------
   546                              <1> 
   547                              <1> KB_INT_1:
   548 00000D85 FB                  <1> 	sti				; ENABLE INTERRUPTS
   549                              <1> 	;push	ebp
   550 00000D86 50                  <1> 	push	eax
   551 00000D87 53                  <1> 	push	ebx
   552 00000D88 51                  <1> 	push	ecx
   553 00000D89 52                  <1> 	push	edx
   554 00000D8A 56                  <1> 	push	esi
   555 00000D8B 57                  <1> 	push	edi
   556 00000D8C 1E                  <1> 	push	ds
   557 00000D8D 06                  <1> 	push	es
   558 00000D8E FC                  <1> 	cld				; FORWARD DIRECTION
   559 00000D8F 66B81000            <1> 	mov	ax, KDATA
   560 00000D93 8ED8                <1> 	mov	ds, ax
   561 00000D95 8EC0                <1> 	mov	es, ax
   562                              <1> 	;
   563                              <1> 	;-----	WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED
   564 00000D97 B0AD                <1> 	mov	al, DIS_KBD		; DISABLE THE KEYBOARD COMMAND
   565 00000D99 E8A9050000          <1> 	call	SHIP_IT			; EXECUTE DISABLE
   566 00000D9E FA                  <1> 	cli				; DISABLE INTERRUPTS
   567 00000D9F B900000100          <1> 	mov	ecx, 10000h		; SET MAXIMUM TIMEOUT
   568                              <1> KB_INT_01:
   569 00000DA4 E464                <1> 	in	al, STATUS_PORT		; READ ADAPTER STATUS
   570 00000DA6 A802                <1> 	test	al, INPT_BUF_FULL	; CHECK INPUT BUFFER FULL STATUS BIT
   571 00000DA8 E0FA                <1> 	loopnz	KB_INT_01		; WAIT FOR COMMAND TO BE ACCEPTED
   572                              <1> 	;
   573                              <1> 	;-----	READ CHARACTER FROM KEYBOARD INTERFACE
   574 00000DAA E460                <1> 	in	al, PORT_A		; READ IN THE CHARACTER
   575                              <1> 	;
   576                              <1> 	;-----	SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INT LEVEL 9H) 	
   577                              <1> 	;MOV	AH, 04FH		; SYSTEM INTERCEPT - KEY CODE FUNCTION
   578                              <1> 	;STC				; SET CY=1 (IN CASE OF IRET)
   579                              <1> 	;INT	15H			; CASETTE CALL (AL)=KEY SCAN CODE
   580                              <1> 	;				; RETURNS CY=1 FOR INVALID FUNCTION
   581                              <1> 	;JC	KB_INT_02		; CONTINUE IF CARRY FLAG SET ((AL)=CODE)
   582                              <1> 	;JMP	K26			; EXIT IF SYSTEM HANDLES SCAN CODE
   583                              <1> 	;				; EXT HANDLES HARDWARE EOI AND ENABLE		
   584                              <1> 	;
   585                              <1> 	;-----	CHECK FOR A RESEND COMMAND TO KEYBOARD
   586                              <1> KB_INT_02:				; 	  (AL)= SCAN CODE
   587 00000DAC FB                  <1> 	sti				; ENABLE INTERRUPTS AGAIN
   588 00000DAD 3CFE                <1> 	cmp	al, KB_RESEND		; IS THE INPUT A RESEND
   589 00000DAF 7411                <1>         je      short KB_INT_4          ; GO IF RESEND
   590                              <1> 	;
   591                              <1> 	;-----	CHECK FOR RESPONSE TO A COMMAND TO KEYBOARD
   592 00000DB1 3CFA                <1> 	cmp	al, KB_ACK		; IS THE INPUT AN ACKNOWLEDGE
   593 00000DB3 751A                <1>         jne     short KB_INT_2          ; GO IF NOT
   594                              <1> 	;
   595                              <1> 	;-----	A COMMAND TO THE KEYBOARD WAS ISSUED
   596 00000DB5 FA                  <1> 	cli				; DISABLE INTERRUPTS
   597 00000DB6 800D[BBF70000]10    <1> 	or	byte [KB_FLAG_2], KB_FA ; INDICATE ACK RECEIVED
   598 00000DBD E97A020000          <1>         jmp     K26                     ; RETURN IF NOT (ACK RETURNED FOR DATA)
   599                              <1> 	;
   600                              <1> 	;-----	RESEND THE LAST BYTE
   601                              <1> KB_INT_4:
   602 00000DC2 FA                  <1> 	cli				; DISABLE INTERRUPTS
   603 00000DC3 800D[BBF70000]20    <1> 	or	byte [KB_FLAG_2], KB_FE ; INDICATE RESEND RECEIVED
   604 00000DCA E96D020000          <1>         jmp     K26                     ; RETURN IF NOT ACK RETURNED FOR DATA)
   605                              <1> 	;
   606                              <1> ;-----	UPDATE MODE INDICATORS IF CHANGE IN STATE
   607                              <1> KB_INT_2:
   608 00000DCF 6650                <1> 	push 	ax			; SAVE DATA IN
   609 00000DD1 E83D060000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   610 00000DD6 8A1D[BBF70000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   611 00000DDC 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   612 00000DDE 80E307              <1> 	and	bl, KB_LEDS		; ISOLATE INDICATOR BITS
   613 00000DE1 7405                <1> 	jz	short UP0		; IF NO CHANGE BYPASS UPDATE
   614 00000DE3 E8C0050000          <1> 	call	SND_LED			; GO TURN ON MODE INDICATORS
   615                              <1> UP0:
   616 00000DE8 6658                <1> 	pop	ax			; RESTORE DATA IN
   617                              <1> ;------------------------------------------------------------------------
   618                              <1> ;	START OF KEY PROCESSING						;
   619                              <1> ;------------------------------------------------------------------------
   620 00000DEA 88C4                <1> 	mov	ah, al			; SAVE SCAN CODE IN AH ALSO
   621                              <1> 	;
   622                              <1> 	;-----	TEST FOR OVERRUN SCAN CODE FROM KEYBOARD
   623 00000DEC 3CFF                <1> 	cmp	al, KB_OVER_RUN		; IS THIS AN OVERRUN CHAR
   624 00000DEE 0F843F050000        <1>         je      K62			; BUFFER_FULL_BEEP
   625                              <1> 	;
   626                              <1> K16:	
   627 00000DF4 8A3D[BCF70000]      <1> 	mov	bh, [KB_FLAG_3]		; LOAD FLAGS FOR TESTING
   628                              <1> 	;
   629                              <1> 	;-----	TEST TO SEE IF A READ_ID IS IN PROGRESS
   630 00000DFA F6C7C0              <1> 	test 	bh, RD_ID+LC_AB 	; ARE WE DOING A READ ID?
   631 00000DFD 7449                <1> 	jz	short NOT_ID		; CONTINUE IF NOT
   632 00000DFF 7917                <1> 	jns	short TST_ID_2		; IS THE RD_ID FLAG ON?
   633 00000E01 3CAB                <1> 	cmp	al, ID_1		; IS THIS THE 1ST ID CHARACTER?
   634 00000E03 7507                <1> 	jne	short RST_RD_ID
   635 00000E05 800D[BCF70000]40    <1> 	or	byte [KB_FLAG_3], LC_AB ; INDICATE 1ST ID WAS OK
   636                              <1> RST_RD_ID:
   637 00000E0C 8025[BCF70000]7F    <1> 	and	byte [KB_FLAG_3], ~RD_ID ; RESET THE READ ID FLAG
   638                              <1>         ;jmp    short ID_EX		; AND EXIT
   639 00000E13 E924020000          <1> 	jmp	K26
   640                              <1> 	;
   641                              <1> TST_ID_2:
   642 00000E18 8025[BCF70000]BF    <1> 	and	byte [KB_FLAG_3], ~LC_AB ; RESET FLAG
   643 00000E1F 3C54                <1> 	cmp	al, ID_2A		; IS THIS THE 2ND ID CHARACTER?
   644 00000E21 7419                <1>         je	short KX_BIT		; JUMP IF SO
   645 00000E23 3C41                <1> 	cmp	al, ID_2		; IS THIS THE 2ND ID CHARACTER?
   646                              <1>         ;jne	short ID_EX		; LEAVE IF NOT
   647 00000E25 0F8511020000        <1> 	jne	K26
   648                              <1> 	;
   649                              <1> 	;-----	A READ ID SAID THAT IT WAS ENHANCED KEYBOARD
   650 00000E2B F6C720              <1> 	test	bh, SET_NUM_LK 		; SHOULD WE SET NUM LOCK?
   651 00000E2E 740C                <1>         jz      short KX_BIT		; EXIT IF NOT
   652 00000E30 800D[B9F70000]20    <1> 	or	byte [KB_FLAG], NUM_STATE ; FORCE NUM LOCK ON
   653 00000E37 E86C050000          <1> 	call	SND_LED			; GO SET THE NUM LOCK INDICATOR
   654                              <1> KX_BIT:
   655 00000E3C 800D[BCF70000]10    <1> 	or	byte [KB_FLAG_3], KBX	; INDICATE ENHANCED KEYBOARD WAS FOUND
   656 00000E43 E9F4010000          <1> ID_EX:	jmp     K26			; EXIT
   657                              <1> 	;
   658                              <1> NOT_ID:
   659 00000E48 3CE0                <1> 	cmp	al, MC_E0		; IS THIS THE GENERAL MARKER CODE?
   660 00000E4A 750C                <1> 	jne	short TEST_E1
   661 00000E4C 800D[BCF70000]12    <1> 	or	byte [KB_FLAG_3], LC_E0+KBX ; SET FLAG BIT, SET KBX, AND
   662                              <1> 	;jmp	short EXIT		; THROW AWAY THIS CODE
   663 00000E53 E9EB010000          <1> 	jmp	K26A	
   664                              <1> TEST_E1:	
   665 00000E58 3CE1                <1> 	cmp	al, MC_E1		; IS THIS THE PAUSE KEY?
   666 00000E5A 750C                <1> 	jne	short NOT_HC
   667 00000E5C 800D[BCF70000]11    <1> 	or	byte [KB_FLAG_3], LC_E1+KBX ; SET FLAG BIT, SET KBX, AND
   668 00000E63 E9DB010000          <1> EXIT:	jmp	K26A			; THROW AWAY THIS CODE
   669                              <1> 	;
   670                              <1> NOT_HC:
   671 00000E68 247F                <1> 	and	al, 07Fh		; TURN OFF THE BREAK BIT
   672 00000E6A F6C702              <1> 	test	bh, LC_E0		; LAST CODE THE E0 MARKER CODE
   673 00000E6D 7414                <1> 	jz	short NOT_LC_E0		; JUMP IF NOT
   674                              <1> 	;
   675 00000E6F BF[A6F60000]        <1> 	mov	edi, _K6+6		; IS THIS A SHIFT KEY?
   676 00000E74 AE                  <1> 	scasb
   677 00000E75 0F84C1010000        <1>         je      K26 ; K16B              ; YES, THROW AWAY & RESET FLAG
   678 00000E7B AE                  <1> 	scasb
   679 00000E7C 757C                <1> 	jne	short K16A		; NO, CONTINUE KEY PROCESSING
   680                              <1> 	;jmp	short K16B		; YES, THROW AWAY & RESET FLAG
   681 00000E7E E9B9010000          <1> 	jmp	K26
   682                              <1> 	;
   683                              <1> NOT_LC_E0:
   684 00000E83 F6C701              <1> 	test	bh, LC_E1		; LAST CODE THE E1 MARKER CODE?
   685 00000E86 7435                <1> 	jz	short T_SYS_KEY		; JUMP IF NOT
   686 00000E88 B904000000          <1> 	mov	ecx, 4			; LENGHT OF SEARCH
   687 00000E8D BF[A4F60000]        <1> 	mov	edi, _K6+4		; IS THIS AN ALT, CTL, OR SHIFT?
   688 00000E92 F2AE                <1> 	repne	scasb			; CHECK IT
   689                              <1> 	;je	short EXIT		; THROW AWAY IF SO
   690 00000E94 0F84A9010000        <1> 	je	K26A			
   691                              <1> 	;
   692 00000E9A 3C45                <1> 	cmp	al, NUM_KEY		; IS IT THE PAUSE KEY?
   693                              <1> 	;jne	short K16B		; NO, THROW AWAY & RESET FLAG
   694 00000E9C 0F859A010000        <1> 	jne	K26
   695 00000EA2 F6C480              <1> 	test	ah, 80h			; YES, IS IT THE BREAK OF THE KEY?
   696                              <1> 	;jnz	short K16B		; YES, THROW THIS AWAY, TOO	
   697 00000EA5 0F8591010000        <1> 	jnz	K26
   698                              <1>         ; 20/02/2015 
   699 00000EAB F605[BAF70000]08    <1> 	test	byte [KB_FLAG_1],HOLD_STATE ;  NO, ARE WE PAUSED ALREADY?
   700                              <1> 	;jnz	short K16B		;  YES, THROW AWAY
   701 00000EB2 0F8584010000        <1> 	jnz	K26
   702 00000EB8 E9E1020000          <1> 	jmp     K39P                    ; NO, THIS IS THE REAL PAUSE STATE
   703                              <1> 	;
   704                              <1> 	;-----	TEST FOR SYSTEM KEY
   705                              <1> T_SYS_KEY:
   706 00000EBD 3C54                <1> 	cmp	al, SYS_KEY		; IS IT THE SYSTEM KEY?
   707 00000EBF 7539                <1> 	jnz	short K16A		; CONTINUE IF NOT
   708                              <1> 	;
   709 00000EC1 F6C480              <1> 	test	ah, 80h			; CHECK IF THIS A BREAK CODE
   710 00000EC4 7524                <1> 	jnz	short K16C		; DO NOT TOUCH SYSTEM INDICATOR IF TRUE
   711                              <1> 	;
   712 00000EC6 F605[BAF70000]04    <1> 	test	byte [KB_FLAG_1], SYS_SHIFT ; SEE IF IN SYSTEM KEY HELD DOWN 
   713                              <1>         ;jnz	short K16B		; IF YES, DO NOT PROCESS SYSTEM INDICATOR	
   714 00000ECD 0F8569010000        <1> 	jnz     K26			
   715                              <1> 	;
   716 00000ED3 800D[BAF70000]04    <1> 	or	byte [KB_FLAG_1], SYS_SHIFT ; INDICATE SYSTEM KEY DEPRESSED
   717 00000EDA B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   718 00000EDC E620                <1> 	out	20h, al ;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
   719                              <1> 					; INTERRUPT-RETURN-NO-EOI
   720 00000EDE B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
   721 00000EE0 E862040000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
   722                              <1> 	; !!! SYSREQ !!! function/system call (INTERRUPT) must be here !!!
   723                              <1> 	;MOV	AL, 8500H		; FUNCTION VALUE FOR MAKE OF SYSTEM KEY
   724                              <1> 	;STI				; MAKE SURE INTERRUPTS ENABLED
   725                              <1> 	;INT	15H			; USER INTERRUPT	
   726 00000EE5 E965010000          <1>         jmp     K27A                    ; END PROCESSING
   727                              <1> 	;
   728                              <1> ;K16B:	jmp	K26			; IGNORE SYSTEM KEY
   729                              <1> 	;
   730                              <1> K16C:
   731 00000EEA 8025[BAF70000]FB    <1> 	and	byte [KB_FLAG_1], ~SYS_SHIFT ; TURN OFF SHIFT KEY HELD DOWN
   732 00000EF1 B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   733 00000EF3 E620                <1> 	out	20h, al ;out INTA00, al ; SEND COMMAND TO INTERRUPT CONTROL PORT
   734                              <1> 					; INTERRUPT-RETURN-NO-EOI
   735                              <1> 	;MOV	AL, ENA_KBD		; INSURE KEYBOARD IS ENABLED
   736                              <1> 	;CALL	SHIP_IT			; EXECUTE ENABLE
   737                              <1> 	;
   738                              <1> 	;MOV	AX, 8501H		; FUNCTION VALUE FOR BREAK OF SYSTEM KEY
   739                              <1> 	;STI				; MAKE SURE INTERRUPTS ENABLED
   740                              <1> 	;INT	15H			; USER INTERRUPT
   741                              <1> 	;JMP	K27A			; INGONRE SYSTEM KEY				
   742                              <1> 	;
   743 00000EF5 E94E010000          <1> 	jmp     K27			; IGNORE SYSTEM KEY
   744                              <1> 	;
   745                              <1> 	;-----	TEST FOR SHIFT KEYS
   746                              <1> K16A:
   747 00000EFA 8A1D[B9F70000]      <1> 	mov	bl, [KB_FLAG]		; PUT STATE FLAGS IN BL
   748 00000F00 BF[A0F60000]        <1> 	mov	edi, _K6		; SHIFT KEY TABLE offset
   749 00000F05 B908000000          <1> 	mov	ecx, _K6L		; LENGTH
   750 00000F0A F2AE                <1> 	repne	scasb			; LOOK THROUGH THE TABLE FOR A MATCH
   751 00000F0C 88E0                <1> 	mov	al, ah			; RECOVER SCAN CODE
   752 00000F0E 0F8510010000        <1>         jne     K25                     ; IF NO MATCH, THEN SHIFT NOT FOUND
   753                              <1> 	;
   754                              <1> 	;------	SHIFT KEY FOUND
   755                              <1> K17:
   756 00000F14 81EF[A1F60000]      <1>         sub     edi, _K6+1              ; ADJUST PTR TO SCAN CODE MATCH
   757 00000F1A 8AA7[A8F60000]      <1>        	mov     ah, [edi+_K7]       	; GET MASK INTO AH
   758 00000F20 B102                <1> 	mov	cl, 2			; SETUP COUNT FOR FLAG SHIFTS
   759 00000F22 A880                <1> 	test	al, 80h			; TEST FOR BREAK KEY
   760 00000F24 0F8596000000        <1>         jnz     K23                     ; JUMP OF BREAK
   761                              <1> 	;
   762                              <1> 	;-----	SHIFT MAKE FOUND, DETERMINE SET OR TOGGLE
   763                              <1> K17C:
   764 00000F2A 80FC10              <1> 	cmp	ah, SCROLL_SHIFT
   765 00000F2D 732B                <1> 	jae	short K18		; IF SCROLL SHIFT OR ABOVE, TOGGLE KEY
   766                              <1> 	;
   767                              <1> 	;-----	PLAIN SHIFT KEY, SET SHIFT ON
   768 00000F2F 0825[B9F70000]      <1> 	or	[KB_FLAG], ah		; TURN ON SHIFT BIT
   769 00000F35 A80C                <1>         test	al, CTL_SHIFT+ALT_SHIFT ; IS IT ALT OR CTRL?
   770                              <1> 	;jnz	short K17D		; YES, MORE FLAGS TO SET
   771 00000F37 0F84FF000000        <1> 	jz	K26			; NO, INTERRUPT RETURN
   772                              <1> K17D:
   773 00000F3D F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OF NEW KEYS?
   774 00000F40 740B                <1> 	jz 	short K17E		; NO, JUMP
   775 00000F42 0825[BCF70000]      <1> 	or	[KB_FLAG_3], ah		; SET BITS FOR RIGHT CTRL, ALT
   776 00000F48 E9EF000000          <1> 	jmp	K26			; INTERRUPT RETURN
   777                              <1> K17E:
   778 00000F4D D2EC                <1> 	shr	ah, cl			; MOVE FLAG BITS TWO POSITIONS
   779 00000F4F 0825[BAF70000]      <1> 	or	[KB_FLAG_1], ah		; SET BITS FOR LEFT CTRL, ALT
   780 00000F55 E9E2000000          <1> 	jmp	K26
   781                              <1> 	;
   782                              <1> 	;-----	TOGGLED SHIFT KEY, TEST FOR 1ST MAKE OR NOT
   783                              <1> K18:					; SHIFT-TOGGLE
   784 00000F5A F6C304              <1> 	test	bl, CTL_SHIFT 		; CHECK CTL SHIFT STATE
   785                              <1>         ;jz    	short K18A              ; JUMP IF NOT CTL STATE
   786 00000F5D 0F85C1000000        <1>         jnz     K25                     ; JUMP IF CTL STATE
   787                              <1> K18A:
   788 00000F63 3C52                <1> 	cmp	al, INS_KEY		; CHECK FOR INSERT KEY
   789 00000F65 7524                <1> 	jne	short K22		; JUMP IF NOT INSERT KEY
   790 00000F67 F6C308              <1> 	test	bl, ALT_SHIFT 		; CHECK FOR ALTERNATE SHIFT
   791                              <1>       	;jz	short K18B		; JUMP IF NOT ALTERNATE SHIFT	
   792 00000F6A 0F85B4000000        <1>         jnz     K25                     ; JUMP IF ALTERNATE SHIFT
   793                              <1> K18B:
   794 00000F70 F6C702              <1> 	test	bh, LC_E0 ;20/02/2015	; IS THIS NEW INSERT KEY?
   795 00000F73 7516                <1> 	jnz	short K22		; YES, THIS ONE'S NEVER A '0'
   796                              <1> K19:	
   797 00000F75 F6C320              <1> 	test	bl, NUM_STATE 		; CHECK FOR BASE STATE
   798 00000F78 750C                <1> 	jnz	short K21		; JUMP IF NUM LOCK IS ON
   799 00000F7A F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; TEST FOR SHIFT STATE
   800 00000F7D 740C                <1> 	jz	short K22		; JUMP IF BASE STATE
   801                              <1> K20:					; NUMERIC ZERO, NOT INSERT KEY
   802 00000F7F 88C4                <1> 	mov	ah, al			; PUT SCAN CODE BACK IN AH
   803 00000F81 E99E000000          <1>         jmp     K25                     ; NUMERAL '0', STNDRD. PROCESSING
   804                              <1> K21:					; MIGHT BE NUMERIC
   805 00000F86 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT
   806 00000F89 74F4                <1> 	jz	short K20		; IS NUMERIC, STD. PROC.
   807                              <1> 	;
   808                              <1> K22:					; SHIFT TOGGLE KEY HIT; PROCESS IT
   809 00000F8B 8425[BAF70000]      <1> 	test	ah, [KB_FLAG_1] 	; IS KEY ALREADY DEPRESSED
   810 00000F91 0F85A5000000        <1>         jnz     K26                     ; JUMP IF KEY ALREADY DEPRESSED
   811                              <1> K22A:
   812 00000F97 0825[BAF70000]      <1>         or      [KB_FLAG_1], ah 	; INDICATE THAT THE KEY IS DEPRESSED
   813 00000F9D 3025[B9F70000]      <1> 	xor	[KB_FLAG], ah		; TOGGLE THE SHIFT STATE
   814                              <1> 	;
   815                              <1> 	;-----	TOGGLE LED IF CAPS, NUM  OR SCROLL KEY DEPRESSED
   816 00000FA3 F6C470              <1> 	test	ah, CAPS_SHIFT+NUM_SHIFT+SCROLL_SHIFT ; SHIFT TOGGLE?
   817 00000FA6 7409                <1> 	jz	short K22B		; GO IF NOT
   818                              <1> 	;
   819 00000FA8 6650                <1> 	push	ax			; SAVE SCAN CODE AND SHIFT MASK
   820 00000FAA E8F9030000          <1> 	call	SND_LED			; GO TURN MODE INDICATORS ON
   821 00000FAF 6658                <1> 	pop	ax			; RESTORE SCAN CODE
   822                              <1> K22B:
   823 00000FB1 3C52                <1> 	cmp	al, INS_KEY		; TEST FOR 1ST MAKE OF INSERT KEY
   824 00000FB3 0F8583000000        <1>         jne     K26                     ; JUMP IF NOT INSERT KEY
   825 00000FB9 88C4                <1> 	mov	ah, al		        ; SCAN CODE IN BOTH HALVES OF AX
   826 00000FBB E999000000          <1>         jmp     K28                     ; FLAGS UPDATED, PROC. FOR BUFFER
   827                              <1> 	;
   828                              <1> 	;-----	BREAK SHIFT FOUND
   829                              <1> K23:					; BREAK-SHIFT-FOUND
   830 00000FC0 80FC10              <1> 	cmp	ah, SCROLL_SHIFT	; IS THIS A TOGGLE KEY
   831 00000FC3 F6D4                <1> 	not	ah			; INVERT MASK
   832 00000FC5 7355                <1> 	jae	short K24		; YES, HANDLE BREAK TOGGLE
   833 00000FC7 2025[B9F70000]      <1> 	and	[KB_FLAG], ah		; TURN OFF SHIFT BIT
   834 00000FCD 80FCFB              <1> 	cmp	ah, ~CTL_SHIFT		; IS THIS ALT OR CTL?
   835 00000FD0 7730                <1> 	ja	short K23D		; NO, ALL DONE
   836                              <1> 	;
   837 00000FD2 F6C702              <1> 	test	bh, LC_E0		; 2ND ALT OR CTL?
   838 00000FD5 7408                <1> 	jz	short K23A		; NO, HANSLE NORMALLY
   839 00000FD7 2025[BCF70000]      <1> 	and 	[KB_FLAG_3], ah		; RESET BIT FOR RIGHT ALT OR CTL
   840 00000FDD EB08                <1> 	jmp	short K23B		; CONTINUE
   841                              <1> K23A:
   842 00000FDF D2FC                <1> 	sar	ah, cl			; MOVE THE MASK BIT TWO POSITIONS
   843 00000FE1 2025[BAF70000]      <1> 	and	[KB_FLAG_1], ah		; RESET BIT FOR LEFT ALT AND CTL
   844                              <1> K23B:
   845 00000FE7 88C4                <1> 	mov	ah, al			; SAVE SCAN CODE
   846 00000FE9 A0[BCF70000]        <1> 	mov	al, [KB_FLAG_3]		; GET RIGHT ALT & CTRL FLAGS
   847 00000FEE D2E8                <1> 	shr	al, cl			; MOVE TO BITS 1 & 0
   848 00000FF0 0A05[BAF70000]      <1> 	or	al, [KB_FLAG_1]		; PUT IN LEFT ALT & CTL FLAGS
   849 00000FF6 D2E0                <1> 	shl	al, cl			; MOVE BACK TO BITS 3 & 2
   850 00000FF8 240C                <1> 	and	al, ALT_SHIFT+CTL_SHIFT ; FILTER OUT OTHER GARBAGE
   851 00000FFA 0805[B9F70000]      <1> 	or	[KB_FLAG], al		; PUT RESULT IN THE REAL FLAGS	
   852 00001000 88E0                <1> 	mov	al, ah
   853                              <1> K23D:
   854 00001002 3CB8                <1> 	cmp	al, ALT_KEY+80h		; IS THIS ALTERNATE SHIFT RELEASE
   855 00001004 7536                <1> 	jne	short K26		; INTERRUPT RETURN
   856                              <1> 	;	
   857                              <1> 	;-----	ALTERNATE SHIFT KEY RELEASED, GET THE VALUE INTO BUFFER
   858 00001006 A0[BDF70000]        <1> 	mov	al, [ALT_INPUT]
   859 0000100B B400                <1> 	mov	ah, 0			; SCAN CODE OF 0
   860 0000100D 8825[BDF70000]      <1> 	mov	[ALT_INPUT], ah 	; ZERO OUT THE FIELD
   861 00001013 3C00                <1> 	cmp	al, 0			; WAS THE INPUT = 0?
   862 00001015 7425                <1> 	je	short K26		; INTERRUPT_RETURN
   863                              <1>         ; 29/01/2016
   864                              <1> 	;jmp     K61                    ; IT WASN'T, SO PUT IN BUFFER
   865 00001017 E9D0020000          <1> 	jmp	_K60
   866                              <1> 	;
   867                              <1> K24:					; BREAK-TOGGLE
   868 0000101C 2025[BAF70000]      <1> 	and	[KB_FLAG_1], ah 	; INDICATE NO LONGER DEPRESSED
   869 00001022 EB18                <1> 	jmp	short K26		; INTERRUPT_RETURN
   870                              <1> 	;
   871                              <1> 	;-----	TEST FOR HOLD STATE
   872                              <1> 					; AL, AH = SCAN CODE
   873                              <1> K25:					; NO-SHIFT-FOUND
   874 00001024 3C80                <1> 	cmp	al, 80h			; TEST FOR BREAK KEY
   875 00001026 7314                <1> 	jae	short K26		; NOTHING FOR BREAK CHARS FROM HERE ON
   876 00001028 F605[BAF70000]08    <1> 	test	byte [KB_FLAG_1], HOLD_STATE ; ARE WE IN HOLD STATE
   877 0000102F 7428                <1> 	jz	short K28		; BRANCH AROUND TEST IF NOT
   878 00001031 3C45                <1> 	cmp	al, NUM_KEY
   879 00001033 7407                <1> 	je	short K26		; CAN'T END HOLD ON NUM_LOCK
   880 00001035 8025[BAF70000]F7    <1> 	and	byte [KB_FLAG_1], ~HOLD_STATE ; TURN OFF THE HOLD STATE BIT
   881                              <1> 	;
   882                              <1> K26:
   883 0000103C 8025[BCF70000]FC    <1> 	and	byte [KB_FLAG_3], ~(LC_E0+LC_E1) ; RESET LAST CHAR H.C. FLAG
   884                              <1> K26A:					; INTERRUPT-RETURN
   885 00001043 FA                  <1> 	cli				; TURN OFF INTERRUPTS
   886 00001044 B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   887 00001046 E620                <1> 	out	20h, al	;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
   888                              <1> K27:					; INTERRUPT-RETURN-NO-EOI
   889 00001048 B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
   890 0000104A E8F8020000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
   891                              <1> K27A:
   892 0000104F FA                  <1> 	cli				; DISABLE INTERRUPTS
   893                              <1> 	;;mov	byte [intflg], 0 ; 07/01/2017 ;; 15/01/2017
   894 00001050 07                  <1> 	pop	es			; RESTORE REGISTERS
   895 00001051 1F                  <1> 	pop	ds
   896 00001052 5F                  <1> 	pop	edi
   897 00001053 5E                  <1> 	pop	esi
   898 00001054 5A                  <1> 	pop	edx
   899 00001055 59                  <1> 	pop	ecx
   900 00001056 5B                  <1> 	pop	ebx
   901 00001057 58                  <1> 	pop	eax
   902                              <1> 	;pop	ebp
   903 00001058 CF                  <1> 	iretd				; RETURN
   904                              <1> 
   905                              <1> 	;-----	NOT IN	HOLD STATE
   906                              <1> K28:					; NO-HOLD-STATE
   907 00001059 3C58                <1> 	cmp	al, 88			; TEST FOR OUT-OF-RANGE SCAN CODES
   908 0000105B 77DF                <1> 	ja	short K26		; IGNORE IF OUT-OF-RANGE	
   909                              <1> 	;
   910 0000105D F6C308              <1> 	test	bl, ALT_SHIFT 		; ARE WE IN ALTERNATE SHIFT
   911                              <1>         ;jz	short K28A		; IF NOT ALTERNATE
   912 00001060 0F84F1000000        <1>         jz      K38
   913                              <1> 	;
   914 00001066 F6C710              <1> 	test	bh, KBX			; IS THIS THE ENCHANCED KEYBOARD?
   915 00001069 740D                <1> 	jz	short K29		; NO, ALT STATE IS REAL
   916                              <1> 	 ;28/02/2015
   917 0000106B F605[BAF70000]04    <1> 	test	byte [KB_FLAG_1], SYS_SHIFT ; YES, IS SYSREQ KEY DOWN?
   918                              <1> 	;jz	short K29		;  NO, ALT STATE IS REAL
   919 00001072 0F85DF000000        <1> 	jnz	K38			; YES, THIS IS PHONY ALT STATE 
   920                              <1>         ;				; DUE TO PRESSING SYSREQ	
   921                              <1> ;K28A:	jmp	short K38
   922                              <1> 	;
   923                              <1> 	;-----	TEST FOR RESET KEY SEQUENCE (CTL ALT DEL)
   924                              <1> K29:					; TEST-RESET
   925 00001078 F6C304              <1> 	test	bl, CTL_SHIFT 		; ARE WE IN CONTROL SHIFT ALSO?
   926 0000107B 740B                <1> 	jz	short K31		; NO_RESET
   927 0000107D 3C53                <1> 	cmp	al, DEL_KEY		; CTL-ALT STATE, TEST FOR DELETE KEY
   928 0000107F 7507                <1> 	jne	short K31		; NO_RESET, IGNORE
   929                              <1> 	;
   930                              <1> 	;-----	CTL-ALT-DEL HAS BEEN FOUND
   931                              <1>  	; 26/08/2014
   932                              <1> cpu_reset:
   933                              <1> 	; IBM PC/AT ROM BIOS source code - 10/06/85 (TEST4.ASM - PROC_SHUTDOWN)
   934                              <1> 	; Send FEh (system reset command) to the keyboard controller.
   935 00001081 B0FE                <1> 	mov	al, SHUT_CMD		; SHUTDOWN COMMAND
   936 00001083 E664                <1> 	out	STATUS_PORT, al		; SEND TO KEYBOARD CONTROL PORT
   937                              <1> khere:
   938 00001085 F4                  <1> 	hlt				; WAIT FOR 80286 RESET
   939 00001086 EBFD                <1> 	jmp 	short khere		; INSURE HALT
   940                              <1> 
   941                              <1> 	;
   942                              <1> 	;-----	IN ALTERNATE SHIFT, RESET NOT FOUND
   943                              <1> K31:					; NO-RESET
   944 00001088 3C39                <1> 	cmp	al, 57			; TEST FOR SPACE KEY
   945 0000108A 7507                <1> 	jne	short K311		; NOT THERE
   946 0000108C B020                <1> 	mov	al, ' '			; SET SPACE CHAR
   947 0000108E E948020000          <1>         jmp     K57                     ; BUFFER_FILL
   948                              <1> K311:
   949 00001093 3C0F                <1> 	cmp	al, 15			; TEST FOR TAB KEY
   950 00001095 7509                <1> 	jne	short K312		; NOT THERE
   951 00001097 66B800A5            <1> 	mov	ax, 0A500h		; SET SPECIAL CODE FOR ALT-TAB
   952 0000109B E93B020000          <1>         jmp     K57                     ; BUFFER_FILL
   953                              <1> K312:
   954 000010A0 3C4A                <1> 	cmp	al, 74			; TEST FOR KEY PAD -
   955 000010A2 0F84A2000000        <1>         je      K37B                    ; GO PROCESS
   956 000010A8 3C4E                <1> 	cmp	al, 78			; TEST FOR KEY PAD +
   957 000010AA 0F849A000000        <1>         je      K37B                    ; GO PROCESS
   958                              <1> 	;
   959                              <1> 	;-----	LOOK FOR KEY PAD ENTRY
   960                              <1> K32:					; ALT-KEY-PAD
   961 000010B0 BF[7CF60000]        <1> 	mov	edi, K30		; ALT-INPUT-TABLE offset
   962 000010B5 B90A000000          <1> 	mov	ecx, 10			; LOOK FOR ENTRY USING KEYPAD
   963 000010BA F2AE                <1> 	repne	scasb			; LOOK FOR MATCH
   964 000010BC 7525                <1> 	jne	short K33		; NO_ALT_KEYPAD
   965 000010BE F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OF THE NEW KEYS?
   966 000010C1 0F858A000000        <1>         jnz     K37C                    ; YES, JUMP, NOT NUMPAD KEY
   967 000010C7 81EF[7DF60000]      <1> 	sub	edi, K30+1		; DI NOW HAS ENTRY VALUE
   968 000010CD A0[BDF70000]        <1> 	mov	al, [ALT_INPUT] 	; GET THE CURRENT BYTE
   969 000010D2 B40A                <1> 	mov	ah, 10			; MULTIPLY BY 10
   970 000010D4 F6E4                <1> 	mul	ah
   971 000010D6 6601F8              <1> 	add	ax, di			; ADD IN THE LATEST ENTRY
   972 000010D9 A2[BDF70000]        <1> 	mov	[ALT_INPUT], al 	; STORE IT AWAY
   973                              <1> ;K32A:
   974 000010DE E959FFFFFF          <1>         jmp     K26                     ; THROW AWAY THAT KEYSTROKE
   975                              <1> 	;
   976                              <1> 	;-----	LOOK FOR SUPERSHIFT ENTRY
   977                              <1> K33:					; NO-ALT-KEYPAD
   978 000010E3 C605[BDF70000]00    <1>         mov     byte [ALT_INPUT], 0     ; ZERO ANY PREVIOUS ENTRY INTO INPUT
   979 000010EA B91A000000          <1> 	mov	ecx, 26			; (DI),(ES) ALREADY POINTING
   980 000010EF F2AE                <1> 	repne	scasb			; LOOK FOR MATCH IN ALPHABET
   981 000010F1 7450                <1> 	je	short K37A		; MATCH FOUND, GO FILLL THE BUFFER
   982                              <1> 	;
   983                              <1> 	;-----	LOOK FOR TOP ROW OF ALTERNATE SHIFT
   984                              <1> K34:					; ALT-TOP-ROW
   985 000010F3 3C02                <1> 	cmp	al, 2			; KEY WITH '1' ON IT
   986 000010F5 7253                <1> 	jb	short K37B		; MUST BE ESCAPE
   987 000010F7 3C0D                <1> 	cmp	al, 13			; IS IT IN THE REGION
   988 000010F9 7705                <1> 	ja	short K35		; NO, ALT SOMETHING ELSE
   989 000010FB 80C476              <1> 	add	ah, 118			; CONVERT PSEUDO SCAN CODE TO RANGE
   990 000010FE EB43                <1> 	jmp	short K37A		; GO FILL THE BUFFER
   991                              <1> 	;
   992                              <1> 	;-----	TRANSLATE ALTERNATE SHIFT PSEUDO SCAN CODES
   993                              <1> K35:					; ALT-FUNCTION
   994 00001100 3C57                <1> 	cmp	al, F11_M		; IS IT F11?	
   995 00001102 7209                <1> 	jb	short K35A ; 20/02/2015	; NO, BRANCH
   996 00001104 3C58                <1> 	cmp	al, F12_M		; IS IT F12?
   997 00001106 7705                <1> 	ja	short K35A ; 20/02/2015	; NO, BRANCH
   998 00001108 80C434              <1> 	add	ah, 52			; CONVERT TO PSEUDO SCAN CODE
   999 0000110B EB36                <1> 	jmp	short K37A		; GO FILL THE BUFFER
  1000                              <1> K35A:
  1001 0000110D F6C702              <1> 	test	bh, LC_E0		; DO WE HAVE ONE OF THE NEW KEYS?
  1002 00001110 7422                <1> 	jz	short K37		; NO, JUMP
  1003 00001112 3C1C                <1> 	cmp	al, 28			; TEST FOR KEYPAD ENTER
  1004 00001114 7509                <1>         jne     short K35B              ; NOT THERE
  1005 00001116 66B800A6            <1> 	mov	ax, 0A600h		; SPECIAL CODE
  1006 0000111A E9BC010000          <1> 	jmp	K57			; BUFFER FILL
  1007                              <1> K35B:
  1008 0000111F 3C53                <1> 	cmp	al, 83			; TEST FOR DELETE KEY
  1009 00001121 742E                <1> 	je	short K37C		; HANDLE WITH OTHER EDIT KEYS
  1010 00001123 3C35                <1> 	cmp	al, 53			; TEST FOR KEYPAD /
  1011                              <1> 	;jne	short K32A		; NOT THERE, NO OTHER E0 SPECIALS	
  1012 00001125 0F8511FFFFFF        <1>         jne     K26
  1013 0000112B 66B800A4            <1> 	mov	ax, 0A400h		; SPECIAL CODE
  1014 0000112F E9A7010000          <1> 	jmp	K57			; BUFFER FILL
  1015                              <1> K37:
  1016 00001134 3C3B                <1> 	cmp	al, 59			; TEST FOR FUNCTION KEYS (F1)
  1017 00001136 7212                <1>         jb      short K37B		; NO FN, HANDLE W/OTHER EXTENDED
  1018 00001138 3C44                <1> 	cmp	al, 68			; IN KEYPAD REGION?
  1019                              <1>         ;ja	short K32A		; IF SO, IGNORE
  1020 0000113A 0F87FCFEFFFF        <1>         ja      K26
  1021 00001140 80C42D              <1> 	add	ah, 45			; CONVERT TO PSEUDO SCAN CODE
  1022                              <1> K37A:
  1023 00001143 B000                <1> 	mov	al, 0			; ASCII CODE OF ZERO
  1024 00001145 E991010000          <1>         jmp     K57                     ; PUT IT IN THE BUFFER
  1025                              <1> K37B:
  1026 0000114A B0F0                <1> 	mov	al, 0F0h		; USE SPECIAL ASCII CODE
  1027 0000114C E98A010000          <1> 	jmp     K57                     ; PUT IT IN THE BUFFER
  1028                              <1> K37C:
  1029 00001151 0450                <1> 	add	al, 80			; CONVERT SCAN CODE (EDIT KEYS)
  1030 00001153 88C4                <1> 	mov	ah, al			; (SCAN CODE NOT IN AH FOR INSERT)
  1031 00001155 EBEC                <1> 	jmp     short K37A              ; PUT IT IN THE BUFFER
  1032                              <1> 	;
  1033                              <1> 	;-----	NOT IN ALTERNATE SHIFT
  1034                              <1> K38:					; NOT-ALT-SHIFT
  1035                              <1> 					; BL STILL HAS SHIFT FLAGS
  1036 00001157 F6C304              <1> 	test	bl, CTL_SHIFT 		; ARE WE IN CONTROL SHIFT?
  1037                              <1> 	;jnz	short K38A		; YES, START PROCESSING	
  1038 0000115A 0F84B0000000        <1>         jz      K44                     ; NOT-CTL-SHIFT
  1039                              <1> 	;
  1040                              <1> 	;-----	CONTROL SHIFT, TEST SPECIAL CHARACTERS
  1041                              <1> 	;-----	TEST FOR BREAK
  1042                              <1> K38A:
  1043 00001160 3C46                <1> 	cmp	al, SCROLL_KEY		; TEST FOR BREAK
  1044 00001162 7531                <1> 	jne	short K39		; JUMP, NO-BREAK
  1045 00001164 F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1046 00001167 7405                <1> 	jz	short K38B		; NO, BREAK IS VALID	
  1047 00001169 F6C702              <1> 	test	bh, LC_E0		; YES, WAS LAST CODE AN E0?
  1048 0000116C 7427                <1> 	jz	short K39		; NO-BREAK, TEST FOR PAUSE	
  1049                              <1> K38B:
  1050 0000116E 8B1D[C6F70000]      <1> 	mov	ebx, [BUFFER_HEAD] 	; RESET BUFFER TO EMPTY
  1051 00001174 891D[CAF70000]      <1> 	mov	[BUFFER_TAIL], ebx
  1052 0000117A C605[B8F70000]80    <1> 	mov	byte [BIOS_BREAK], 80h  ; TURN ON BIOS_BREAK BIT
  1053                              <1> 	;
  1054                              <1> 	;-----	ENABLE KEYBOARD
  1055 00001181 B0AE                <1> 	mov	al, ENA_KBD		; ENABLE KEYBOARD
  1056 00001183 E8BF010000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
  1057                              <1> 	;
  1058                              <1> 	; CTRL+BREAK code here !!!
  1059                              <1> 	;INT	1BH			; BREAK INTERRUPT VECTOR
  1060                              <1> 	; 17/10/2015	
  1061 00001188 E858490000          <1> 	call	ctrlbrk ; control+break subroutine
  1062                              <1> 	;
  1063 0000118D 6629C0              <1> 	sub	ax, ax			; PUT OUT DUMMY CHARACTER
  1064 00001190 E946010000          <1>         jmp     K57                     ; BUFFER_FILL
  1065                              <1> 	;
  1066                              <1> 	;-----	TEST FOR PAUSE
  1067                              <1> K39:					; NO_BREAK
  1068 00001195 F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1069 00001198 7537                <1> 	jnz	short K41		; YES, THEN THIS CAN'T BE PAUSE	
  1070 0000119A 3C45                <1> 	cmp	al, NUM_KEY		; LOOK FOR PAUSE KEY
  1071 0000119C 7533                <1> 	jne	short K41		; NO-PAUSE
  1072                              <1> K39P:
  1073 0000119E 800D[BAF70000]08    <1> 	or	byte [KB_FLAG_1], HOLD_STATE ; TURN ON THE HOLD FLAG
  1074                              <1> 	;
  1075                              <1> 	;-----	ENABLE KEYBOARD
  1076 000011A5 B0AE                <1> 	mov	al, ENA_KBD		; ENABLE KEYBOARD
  1077 000011A7 E89B010000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
  1078                              <1> K39A:
  1079 000011AC B020                <1> 	mov	al, EOI			; END OF INTERRUPT TO CONTROL PORT
  1080 000011AE E620                <1> 	out	20h, al ;out INTA00, al	; ALLOW FURTHER KEYSTROKE INTERRUPTS
  1081                              <1> 	;
  1082                              <1> 	;-----	DURING PAUSE INTERVAL, TURN COLOR CRT BACK ON
  1083 000011B0 803D[EEF70000]07    <1>         cmp     byte [CRT_MODE], 7      ; IS THIS BLACK AND WHITE CARD
  1084 000011B7 740A                <1>         je      short K40              	; YES, NOTHING TO DO
  1085 000011B9 66BAD803            <1> 	mov	dx, 03D8h		; PORT FOR COLOR CARD
  1086 000011BD A0[EFF70000]        <1>         mov     al, [CRT_MODE_SET] 	; GET THE VALUE OF THE CURRENT MODE
  1087 000011C2 EE                  <1> 	out	dx, al			; SET THE CRT MODE, SO THAT CRT IS ON
  1088                              <1> 	;
  1089                              <1> K40:					; PAUSE-LOOP
  1090 000011C3 F605[BAF70000]08    <1>         test    byte [KB_FLAG_1], HOLD_STATE ; CHECK HOLD STATE FLAG
  1091 000011CA 75F7                <1> 	jnz	short K40		; LOOP UNTIL FLAG TURNED OFF
  1092                              <1> 	;
  1093 000011CC E977FEFFFF          <1>         jmp     K27                     ; INTERRUPT_RETURN_NO_EOI
  1094                              <1>         ;
  1095                              <1> 	;-----	TEST SPECIAL CASE KEY 55
  1096                              <1> K41:					; NO-PAUSE
  1097 000011D1 3C37                <1> 	cmp	al, 55			; TEST FOR */PRTSC KEY
  1098 000011D3 7513                <1> 	jne	short K42		; NOT-KEY-55
  1099 000011D5 F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1100 000011D8 7405                <1> 	jz	short K41A		; NO, CTL-PRTSC IS VALID	
  1101 000011DA F6C702              <1> 	test	bh, LC_E0		; YES, WAS LAST CODE AN E0?
  1102 000011DD 7421                <1> 	jz	short K42B		; NO, TRANSLATE TO A FUNCTION
  1103                              <1> K41A:	
  1104 000011DF 66B80072            <1> 	mov	ax, 114*256		; START/STOP PRINTING SWITCH
  1105 000011E3 E9F3000000          <1>         jmp     K57                     ; BUFFER_FILL
  1106                              <1> 	;
  1107                              <1> 	;-----	SET UP TO TRANSLATE CONTROL SHIFT
  1108                              <1> K42:					; NOT-KEY-55
  1109 000011E8 3C0F                <1> 	cmp	al, 15			; IS IT THE TAB KEY?
  1110 000011EA 7414                <1> 	je	short K42B		; YES, XLATE TO FUNCTION CODE
  1111 000011EC 3C35                <1> 	cmp	al, 53			; IS IT THE / KEY?
  1112 000011EE 750E                <1> 	jne	short K42A		; NO, NO MORE SPECIAL CASES	
  1113 000011F0 F6C702              <1> 	test	bh, LC_E0		; YES, IS IT FROM THE KEY PAD?
  1114 000011F3 7409                <1> 	jz	short K42A		; NO, JUST TRANSLATE
  1115 000011F5 66B80095            <1> 	mov	ax, 9500h		; YES, SPECIAL CODE FOR THIS ONE
  1116 000011F9 E9DD000000          <1> 	jmp	K57			; BUFFER FILL	
  1117                              <1> K42A: 
  1118                              <1> 	;;mov	ebx, _K8		; SET UP TO TRANSLATE CTL
  1119 000011FE 3C3B                <1> 	cmp	al, 59			; IS IT IN CHARACTER TABLE?
  1120                              <1>         ;jb	short K45F              ; YES, GO TRANSLATE CHAR
  1121                              <1> 	;;jb	K56 ; 20/02/2015
  1122                              <1> 	;;jmp	K64 ; 20/02/2015
  1123                              <1> K42B:
  1124 00001200 BB[B0F60000]        <1> 	mov	ebx, _K8		; SET UP TO TRANSLATE CTL
  1125 00001205 0F82AE000000        <1> 	jb	K56 ;; 20/02/2015	
  1126 0000120B E9B9000000          <1> 	jmp	K64	
  1127                              <1>         ;
  1128                              <1> 	;-----	NOT IN CONTROL SHIFT
  1129                              <1> K44:					; NOT-CTL-SHIFT
  1130 00001210 3C37                <1> 	cmp	al, 55			; PRINT SCREEN KEY?
  1131 00001212 7528                <1> 	jne	short K45		; NOT PRINT SCREEN
  1132 00001214 F6C710              <1> 	test	bh, KBX			; IS THIS ENHANCED KEYBOARD?
  1133 00001217 7407                <1> 	jz	short K44A		; NO, TEST FOR SHIFT STATE	
  1134 00001219 F6C702              <1> 	test	bh, LC_E0		; YES, LAST CODE A MARKER?
  1135 0000121C 7507                <1> 	jnz	short K44B		; YES, IS PRINT SCREEN
  1136 0000121E EB41                <1> 	jmp	short K45C		; NO, TRANSLATE TO '*' CHARACTER
  1137                              <1> K44A:
  1138 00001220 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; NOT 101 KBD, SHIFT KEY DOWN?
  1139 00001223 743C                <1> 	jz	short K45C		; NO, TRANSLATE TO '*' CHARACTER
  1140                              <1> 	;
  1141                              <1> 	;-----	ISSUE INTERRUPT TO INDICATE PRINT SCREEN FUNCTION
  1142                              <1> K44B:
  1143 00001225 B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
  1144 00001227 E81B010000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
  1145 0000122C B020                <1> 	mov	al, EOI			; END OF CURRENT INTERRUPT
  1146 0000122E E620                <1> 	out	20h, al ;out INTA00, al	; SO FURTHER THINGS CAN HAPPEN
  1147                              <1> 	; Print Screen !!!		; ISSUE PRINT SCREEN INTERRUPT (INT 05h)
  1148                              <1> 	;PUSH 	BP			; SAVE POINTER
  1149                              <1> 	;INT 	5H			; ISSUE PRINT SCREEN INTERRUPT
  1150                              <1> 	;POP	BP			; RESTORE POINTER
  1151 00001230 8025[BCF70000]FC    <1>         and     byte [KB_FLAG_3], ~(LC_E0+LC_E1) ; ZERO OUT THESE FLAGS
  1152 00001237 E90CFEFFFF          <1>         jmp     K27                     ; GO BACK WITHOUT EOI OCCURRING
  1153                              <1> 	;
  1154                              <1> 	;-----	HANDLE IN-CORE KEYS
  1155                              <1> K45:					; NOT-PRINT-SCREEN
  1156 0000123C 3C3A                <1> 	cmp	al, 58			; TEST FOR IN-CORE AREA
  1157 0000123E 7734                <1> 	ja	short K46		; JUMP IF NOT
  1158 00001240 3C35                <1> 	cmp	al, 53			; IS THIS THE '/' KEY?
  1159 00001242 7505                <1> 	jne	short K45A		; NO, JUMP
  1160 00001244 F6C702              <1> 	test	bh, LC_E0		; WAS THE LAST CODE THE MARKER?
  1161 00001247 7518                <1> 	jnz	short K45C		; YES, TRANSLATE TO CHARACTER
  1162                              <1> K45A:
  1163 00001249 B91A000000          <1> 	mov	ecx, 26			; LENGHT OF SEARCH
  1164 0000124E BF[86F60000]        <1> 	mov	edi, K30+10		; POINT TO TABLE OF A-Z CHARS
  1165 00001253 F2AE                <1> 	repne	scasb			; IS THIS A LETTER KEY?
  1166                              <1> 		; 20/02/2015
  1167 00001255 7505                <1> 	jne	short K45B              ; NO, SYMBOL KEY
  1168                              <1> 	;
  1169 00001257 F6C340              <1> 	test	bl, CAPS_STATE		; ARE WE IN CAPS_LOCK?
  1170 0000125A 750C                <1> 	jnz	short K45D		; TEST FOR SURE
  1171                              <1> K45B:
  1172 0000125C F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE?
  1173 0000125F 750C                <1> 	jnz	short K45E		; YES, UPPERCASE
  1174                              <1> 					; NO, LOWERCASE
  1175                              <1> K45C:
  1176 00001261 BB[08F70000]        <1> 	mov	ebx, K10		; TRANSLATE TO LOWERCASE LETTERS
  1177 00001266 EB51                <1> 	jmp	short K56	
  1178                              <1> K45D:					; ALMOST-CAPS-STATE
  1179 00001268 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; CL ON. IS SHIFT ON, TOO?
  1180 0000126B 75F4                <1> 	jnz	short K45C		; SHIFTED TEMP OUT OF CAPS STATE
  1181                              <1> K45E:
  1182 0000126D BB[60F70000]        <1> 	mov	ebx, K11		; TRANSLATE TO UPPER CASE LETTERS
  1183 00001272 EB45                <1> K45F:	jmp	short K56
  1184                              <1> 	;
  1185                              <1> 	;-----	TEST FOR KEYS F1 - F10
  1186                              <1> K46:					; NOT IN-CORE AREA
  1187 00001274 3C44                <1> 	cmp	al, 68			; TEST FOR F1 - F10
  1188                              <1> 	;ja	short K47		; JUMP IF NOT
  1189                              <1> 	;jmp	short K53		; YES, GO DO FN KEY PROCESS			
  1190 00001276 7635                <1> 	jna	short K53		
  1191                              <1> 	;
  1192                              <1> 	;-----	HANDLE THE NUMERIC PAD KEYS
  1193                              <1> K47:					; NOT F1 - F10
  1194 00001278 3C53                <1> 	cmp	al, 83			; TEST NUMPAD KEYS
  1195 0000127A 772D                <1> 	ja	short K52		; JUMP IF NOT
  1196                              <1> 	;
  1197                              <1> 	;-----	KEYPAD KEYS, MUST TEST NUM LOCK FOR DETERMINATION
  1198                              <1> K48:
  1199 0000127C 3C4A                <1> 	cmp	al , 74			; SPECIAL CASE FOR MINUS
  1200 0000127E 74ED                <1> 	je	short K45E		; GO TRANSLATE
  1201 00001280 3C4E                <1> 	cmp	al , 78			; SPECIAL CASE FOR PLUS
  1202 00001282 74E9                <1> 	je	short K45E		; GO TRANSLATE
  1203 00001284 F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OFTHE NEW KEYS?
  1204 00001287 750A                <1> 	jnz	short K49		; YES, TRANSLATE TO BASE STATE
  1205                              <1> 	;		
  1206 00001289 F6C320              <1> 	test 	bl, NUM_STATE		; ARE WE IN NUM LOCK
  1207 0000128C 7514                <1> 	jnz	short K50		; TEST FOR SURE
  1208 0000128E F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE?
  1209                              <1> 	;jnz	short K51		; IF SHIFTED, REALLY NUM STATE
  1210 00001291 75DA                <1> 	jnz	short K45E
  1211                              <1> 	;
  1212                              <1> 	;-----	BASE CASE FOR KEYPAD
  1213                              <1> K49:					
  1214 00001293 3C4C                <1> 	cmp	al, 76			; SPECIAL CASE FOR BASE STATE 5
  1215 00001295 7504                <1> 	jne	short K49A		; CONTINUE IF NOT KEYPAD 5
  1216 00001297 B0F0                <1> 	mov	al, 0F0h		; SPECIAL ASCII CODE	
  1217 00001299 EB40                <1> 	jmp	short K57		; BUFFER FILL
  1218                              <1> K49A:
  1219 0000129B BB[08F70000]        <1> 	mov	ebx, K10		; BASE CASE TABLE	
  1220 000012A0 EB27                <1> 	jmp	short K64		; CONVERT TO PSEUDO SCAN
  1221                              <1> 	;
  1222                              <1> 	;-----	MIGHT BE NUM LOCK, TEST SHIFT STATUS
  1223                              <1> K50:					; ALMOST-NUM-STATE
  1224 000012A2 F6C303              <1>         test    bl, LEFT_SHIFT+RIGHT_SHIFT
  1225 000012A5 75EC                <1> 	jnz 	short K49		; SHIFTED TEMP OUT OF NUM STATE
  1226 000012A7 EBC4                <1> K51:	jmp	short K45E		; REALLY NUM STATE
  1227                              <1> 	;
  1228                              <1> 	;-----	TEST FOR THE NEW KEYS ON WT KEYBOARDS 
  1229                              <1> K52:					; NOT A NUMPAD KEY
  1230 000012A9 3C56                <1> 	cmp	al, 86			; IS IT THE NEW WT KEY?
  1231                              <1> 	;jne	short K53		; JUMP IF NOT
  1232                              <1> 	;jmp	short K45B		; HANDLE WITH REST OF LETTER KEYS
  1233 000012AB 74AF                <1> 	je	short K45B		
  1234                              <1> 	;
  1235                              <1> 	;-----	MUST BE F11 OR F12 
  1236                              <1> K53:					; F1 - F10 COME HERE, TOO
  1237 000012AD F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; TEST SHIFT STATE
  1238 000012B0 74E1                <1> 	jz	short K49		; JUMP, LOWER CASE PSEUDO SC'S
  1239                              <1> 		; 20/02/2015 
  1240 000012B2 BB[60F70000]        <1> 	mov	ebx, K11		; UPPER CASE PSEUDO SCAN CODES
  1241 000012B7 EB10                <1> 	jmp	short K64		; TRANSLATE SCAN
  1242                              <1> 	;
  1243                              <1> 	;-----	TRANSLATE THE CHARACTER
  1244                              <1> K56:					; TRANSLATE-CHAR
  1245 000012B9 FEC8                <1> 	dec	al			; CONVERT ORIGIN
  1246 000012BB D7                  <1> 	xlat    			; CONVERT THE SCAN CODE TO ASCII
  1247 000012BC F605[BCF70000]02    <1> 	test	byte [KB_FLAG_3], LC_E0	; IS THIS A NEW KEY?
  1248 000012C3 7416                <1> 	jz	short K57		; NO, GO FILL BUFFER
  1249 000012C5 B4E0                <1> 	mov	ah, MC_E0		; YES, PUT SPECIAL MARKER IN AH
  1250 000012C7 EB12                <1> 	jmp	short K57		; PUT IT INTO THE BUFFER	
  1251                              <1> 	;
  1252                              <1> 	;-----	TRANSLATE SCAN FOR PSEUDO SCAN CODES
  1253                              <1> K64:					; TRANSLATE-SCAN-ORGD
  1254 000012C9 FEC8                <1> 	dec	al			; CONVERT ORIGIN
  1255 000012CB D7                  <1>        	xlat    	                ; CTL TABLE SCAN
  1256 000012CC 88C4                <1> 	mov	ah, al			; PUT VALUE INTO AH
  1257 000012CE B000                <1> 	mov	al, 0			; ZERO ASCII CODE
  1258 000012D0 F605[BCF70000]02    <1> 	test	byte [KB_FLAG_3], LC_E0	; IS THIS A NEW KEY?
  1259 000012D7 7402                <1> 	jz	short K57		; NO, GO FILL BUFFER
  1260 000012D9 B0E0                <1> 	mov	al, MC_E0		; YES, PUT SPECIAL MARKER IN AL
  1261                              <1> 	;
  1262                              <1> 	;-----	PUT CHARACTER INTO BUFFER
  1263                              <1> K57:					; BUFFER_FILL
  1264 000012DB 3CFF                <1> 	cmp	al, -1			; IS THIS AN IGNORE CHAR
  1265                              <1>         ;je	short K59		; YES, DO NOTHING WITH IT
  1266 000012DD 0F8459FDFFFF        <1> 	je      K26			; YES, DO NOTHING WITH IT
  1267 000012E3 80FCFF              <1> 	cmp	ah, -1			; LOOK FOR -1 PSEUDO SCAN
  1268                              <1>         ;jne	short K61		; NEAR_INTERRUPT_RETURN
  1269 000012E6 0F8450FDFFFF        <1> 	je      K26			; INTERRUPT_RETURN
  1270                              <1> ;K59:					; NEAR_INTERRUPT_RETURN
  1271                              <1> ;	jmp	K26			; INTERRUPT_RETURN
  1272                              <1> 
  1273                              <1> _K60: ; 29/01/2016
  1274 000012EC 80FC68              <1> 	cmp	ah, 68h	; ALT + F1 key
  1275 000012EF 721F                <1> 	jb	short K61
  1276 000012F1 80FC6F              <1> 	cmp	ah, 6Fh ; ALT + F8 key	
  1277 000012F4 771A                <1> 	ja	short K61
  1278                              <1> 	;
  1279 000012F6 8A1D[0E310100]      <1> 	mov	bl, [ACTIVE_PAGE]
  1280 000012FC 80C368              <1> 	add	bl, 68h
  1281 000012FF 38E3                <1> 	cmp	bl, ah
  1282 00001301 740D                <1> 	je	short K61
  1283 00001303 6650                <1> 	push	ax
  1284 00001305 88E0                <1> 	mov	al, ah
  1285 00001307 2C68                <1> 	sub	al, 68h
  1286 00001309 E8F4050000          <1> 	call	set_active_page
  1287 0000130E 6658                <1> 	pop	ax
  1288                              <1> K61:					; NOT-CAPS-STATE
  1289 00001310 8B1D[CAF70000]      <1> 	mov	ebx, [BUFFER_TAIL] 	; GET THE END POINTER TO THE BUFFER
  1290 00001316 89DE                <1> 	mov	esi, ebx		; SAVE THE VALUE
  1291 00001318 E857FAFFFF          <1> 	call	_K4			; ADVANCE THE TAIL
  1292 0000131D 3B1D[C6F70000]      <1> 	cmp	ebx, [BUFFER_HEAD] 	; HAS THE BUFFER WRAPPED AROUND
  1293 00001323 740E                <1> 	je	short K62		; BUFFER_FULL_BEEP
  1294 00001325 668906              <1> 	mov	[esi], ax		; STORE THE VALUE
  1295 00001328 891D[CAF70000]      <1> 	mov	[BUFFER_TAIL], ebx 	; MOVE THE POINTER UP
  1296 0000132E E909FDFFFF          <1> 	jmp	K26
  1297                              <1> 	;;cli				; TURN OFF INTERRUPTS
  1298                              <1> 	;;mov	al, EOI			; END OF INTERRUPT COMMAND
  1299                              <1> 	;;out	INTA00, al		; SEND COMMAND TO INTERRUPT CONTROL PORT
  1300                              <1> 	;MOV	AL, ENA_KBD		; INSURE KEYBOARD IS ENABLED
  1301                              <1> 	;CALL	SHIP_IT			; EXECUTE ENABLE
  1302                              <1> 	;MOV	AX, 9102H		; MOVE IN POST CODE & TYPE
  1303                              <1> 	;INT	15H			; PERFORM OTHER FUNCTION
  1304                              <1> 	;;and	byte [KB_FLAG_3],~(LC_E0+LC_E1) ; RESET LAST CHAR H.C. FLAG
  1305                              <1> 	;JMP	K27A			; INTERRUPT_RETURN
  1306                              <1> 	;;jmp   K27                    
  1307                              <1> 	;
  1308                              <1> 	;-----	BUFFER IS FULL SOUND THE BEEPER
  1309                              <1> K62:
  1310 00001333 B020                <1> 	mov	al, EOI			; ENABLE INTERRUPT CONTROLLER CHIP
  1311 00001335 E620                <1> 	out	INTA00, al
  1312 00001337 66B9A602            <1> 	mov	cx, 678			; DIVISOR FOR 1760 HZ
  1313 0000133B B304                <1> 	mov	bl, 4			; SHORT BEEP COUNT (1/16 + 1/64 DELAY)
  1314 0000133D E8E5090000          <1> 	call	beep			; GO TO COMMON BEEP HANDLER
  1315 00001342 E901FDFFFF          <1> 	jmp     K27			; EXIT   
  1316                              <1> 
  1317                              <1> SHIP_IT:
  1318                              <1> 	;---------------------------------------------------------------------------------
  1319                              <1> 	; SHIP_IT
  1320                              <1> 	;	THIS ROUTINES HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
  1321                              <1> 	;	TO THE KEYBOARD CONTROLLER.
  1322                              <1> 	;---------------------------------------------------------------------------------
  1323                              <1> 	;
  1324 00001347 6650                <1> 	push	ax			; SAVE DATA TO SEND
  1325                              <1> 
  1326                              <1> 	;-----	WAIT FOR COMMAND TO ACCEPTED
  1327 00001349 FA                  <1> 	cli				; DISABLE INTERRUPTS TILL DATA SENT
  1328                              <1> 	; xor	ecx, ecx		; CLEAR TIMEOUT COUNTER
  1329 0000134A B900000100          <1> 	mov	ecx, 10000h			
  1330                              <1> S10:
  1331 0000134F E464                <1> 	in	al, STATUS_PORT		; READ KEYBOARD CONTROLLER STATUS
  1332 00001351 A802                <1> 	test	al, INPT_BUF_FULL	; CHECK FOR ITS INPUT BUFFER BUSY
  1333 00001353 E0FA                <1> 	loopnz	S10			; WAIT FOR COMMAND TO BE ACCEPTED
  1334                              <1> 
  1335 00001355 6658                <1> 	pop	ax			; GET DATA TO SEND
  1336 00001357 E664                <1> 	out	STATUS_PORT, al		; SEND TO KEYBOARD CONTROLLER
  1337 00001359 FB                  <1> 	sti				; ENABLE INTERRUPTS AGAIN
  1338 0000135A C3                  <1> 	retn				; RETURN TO CALLER
  1339                              <1> 
  1340                              <1> SND_DATA:
  1341                              <1> 	; ---------------------------------------------------------------------------------
  1342                              <1> 	; SND_DATA
  1343                              <1> 	;	THIS ROUTINES HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
  1344                              <1> 	;	TO THE KEYBOARD AND RECEIPT OF ACKNOWLEDGEMENTS. IT ALSO
  1345                              <1> 	;	HANDLES ANY RETRIES IF REQUIRED
  1346                              <1> 	; ---------------------------------------------------------------------------------
  1347                              <1> 	;
  1348 0000135B 6650                <1> 	push	ax			; SAVE REGISTERS
  1349 0000135D 6653                <1> 	push	bx
  1350 0000135F 51                  <1> 	push	ecx
  1351 00001360 88C7                <1> 	mov	bh, al			; SAVE TRANSMITTED BYTE FOR RETRIES
  1352 00001362 B303                <1> 	mov	bl, 3			; LOAD RETRY COUNT
  1353                              <1> SD0:
  1354 00001364 FA                  <1> 	cli				; DISABLE INTERRUPTS
  1355 00001365 8025[BBF70000]CF    <1> 	and	byte [KB_FLAG_2], ~(KB_FE+KB_FA) ; CLEAR ACK AND RESEND FLAGS
  1356                              <1> 	;
  1357                              <1> 	;-----	WAIT FOR COMMAND TO BE ACCEPTED
  1358 0000136C B900000100          <1> 	mov	ecx, 10000h		; MAXIMUM WAIT COUNT
  1359                              <1> SD5:
  1360 00001371 E464                <1> 	in	al, STATUS_PORT		; READ KEYBOARD PROCESSOR STATUS PORT
  1361 00001373 A802                <1> 	test	al, INPT_BUF_FULL	; CHECK FOR ANY PENDING COMMAND
  1362 00001375 E0FA                <1> 	loopnz	SD5			; WAIT FOR COMMAND TO BE ACCEPTED
  1363                              <1> 	;
  1364 00001377 88F8                <1> 	mov	al, bh			; REESTABLISH BYTE TO TRANSMIT
  1365 00001379 E660                <1> 	out	PORT_A, al		; SEND BYTE
  1366 0000137B FB                  <1> 	sti				; ENABLE INTERRUPTS
  1367                              <1> 	;mov	cx, 01A00h		; LOAD COUNT FOR 10 ms+
  1368 0000137C B9FFFF0000          <1> 	mov	ecx, 0FFFFh
  1369                              <1> SD1:
  1370 00001381 F605[BBF70000]30    <1> 	test	byte [KB_FLAG_2], KB_FE+KB_FA ; SEE IF EITHER BIT SET
  1371 00001388 750F                <1> 	jnz	short SD3		; IF SET, SOMETHING RECEIVED GO PROCESS
  1372 0000138A E2F5                <1> 	loop	SD1			; OTHERWISE WAIT
  1373                              <1> SD2:
  1374 0000138C FECB                <1> 	dec	bl			; DECREMENT RETRY COUNT
  1375 0000138E 75D4                <1> 	jnz	short SD0		; RETRY TRANSMISSION
  1376 00001390 800D[BBF70000]80    <1> 	or	byte [KB_FLAG_2], KB_ERR ; TURN ON TRANSMIT ERROR FLAG
  1377 00001397 EB09                <1> 	jmp	short SD4		; RETRIES EXHAUSTED FORGET TRANSMISSION
  1378                              <1> SD3:
  1379 00001399 F605[BBF70000]10    <1> 	test	byte [KB_FLAG_2], KB_FA ; SEE IF THIS IS AN ACKNOWLEDGE
  1380 000013A0 74EA                <1> 	jz	short SD2		; IF NOT, GO RESEND
  1381                              <1> SD4:	
  1382 000013A2 59                  <1> 	pop	ecx			; RESTORE REGISTERS
  1383 000013A3 665B                <1> 	pop	bx
  1384 000013A5 6658                <1> 	pop	ax
  1385 000013A7 C3                  <1> 	retn				; RETURN, GOOD TRANSMISSION
  1386                              <1> 
  1387                              <1> SND_LED:
  1388                              <1> 	; ---------------------------------------------------------------------------------
  1389                              <1> 	; SND_LED
  1390                              <1> 	;	THIS ROUTINES TURNS ON THE MODE INDICATORS.
  1391                              <1> 	;
  1392                              <1> 	;----------------------------------------------------------------------------------
  1393                              <1> 	;
  1394 000013A8 FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1395 000013A9 F605[BBF70000]40    <1> 	test	byte [KB_FLAG_2], KB_PR_LED ; CHECK FOR MODE INDICATOR UPDATE
  1396 000013B0 755F                <1> 	jnz 	short SL1		; DON'T UPDATE AGAIN IF UPDATE UNDERWAY
  1397                              <1> 	;
  1398 000013B2 800D[BBF70000]40    <1> 	or	byte [KB_FLAG_2], KB_PR_LED ; TURN ON UPDATE IN PROCESS
  1399 000013B9 B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
  1400 000013BB E620                <1> 	out	20h, al ;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
  1401 000013BD EB11                <1> 	jmp	short SL0		; GO SEND MODE INDICATOR COMMAND
  1402                              <1> SND_LED1:
  1403 000013BF FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1404 000013C0 F605[BBF70000]40    <1> 	test	byte [KB_FLAG_2], KB_PR_LED ; CHECK FOR MODE INDICATOR UPDATE
  1405 000013C7 7548                <1> 	jnz	short SL1		; DON'T UPDATE AGAIN IF UPDATE UNDERWAY
  1406                              <1> 	;
  1407 000013C9 800D[BBF70000]40    <1> 	or	byte [KB_FLAG_2], KB_PR_LED ; TURN ON UPDATE IN PROCESS
  1408                              <1> SL0:
  1409 000013D0 B0ED                <1> 	mov	al, LED_CMD		; LED CMD BYTE
  1410 000013D2 E884FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1411 000013D7 FA                  <1> 	cli
  1412 000013D8 E836000000          <1> 	call	MAKE_LED		; GO FORM INDICATOR DATA BYTE
  1413 000013DD 8025[BBF70000]F8    <1> 	and	byte [KB_FLAG_2], 0F8h	; ~KB_LEDS ; CLEAR MODE INDICATOR BITS
  1414 000013E4 0805[BBF70000]      <1> 	or	[KB_FLAG_2], al 	; SAVE PRESENT INDICATORS FOR NEXT TIME
  1415 000013EA F605[BBF70000]80    <1> 	test	byte [KB_FLAG_2], KB_ERR ; TRANSMIT ERROR DETECTED
  1416 000013F1 750F                <1> 	jnz	short SL2		; IF SO, BYPASS SECOND BYTE TRANSMISSION
  1417                              <1> 	;
  1418 000013F3 E863FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1419 000013F8 FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1420 000013F9 F605[BBF70000]80    <1> 	test	byte [KB_FLAG_2], KB_ERR ; TRANSMIT ERROR DETECTED
  1421 00001400 7408                <1> 	jz	short SL3		; IF NOT, DON'T SEND AN ENABLE COMMAND
  1422                              <1> SL2:
  1423 00001402 B0F4                <1> 	mov	al, KB_ENABLE		; GET KEYBOARD CSA ENABLE COMMAND
  1424 00001404 E852FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1425 00001409 FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1426                              <1> SL3:
  1427 0000140A 8025[BBF70000]3F    <1> 	and	byte [KB_FLAG_2], ~(KB_PR_LED+KB_ERR) ; TURN OFF MODE INDICATOR
  1428                              <1> SL1:					; UPDATE AND TRANSMIT ERROR FLAG
  1429 00001411 FB                  <1> 	sti				; ENABLE INTERRUPTS
  1430 00001412 C3                  <1> 	retn				; RETURN TO CALLER
  1431                              <1> 
  1432                              <1> MAKE_LED:
  1433                              <1> 	;---------------------------------------------------------------------------------
  1434                              <1> 	; MAKE_LED
  1435                              <1> 	;	THIS ROUTINES FORMS THE DATA BYTE NECESSARY TO TURN ON/OFF
  1436                              <1> 	;	THE MODE INDICATORS.
  1437                              <1> 	;---------------------------------------------------------------------------------
  1438                              <1> 	;
  1439                              <1> 	;push 	cx			; SAVE CX
  1440 00001413 A0[B9F70000]        <1> 	mov	al, [KB_FLAG]		; GET CAPS & NUM LOCK INDICATORS
  1441 00001418 2470                <1> 	and	al, CAPS_STATE+NUM_STATE+SCROLL_STATE ; ISOLATE INDICATORS
  1442                              <1> 	;mov	cl, 4			; SHIFT COUNT
  1443                              <1> 	;rol	al, cl			; SHIFT BITS OVER TO TURN ON INDICATORS
  1444 0000141A C0C004              <1> 	rol	al, 4 ; 20/02/2015
  1445 0000141D 2407                <1> 	and	al, 07h			; MAKE SURE ONLY MODE BITS ON
  1446                              <1> 	;pop	cx
  1447 0000141F C3                  <1> 	retn				; RETURN TO CALLER
  1448                              <1> 
  1449                              <1> ; % include 'kybdata.s'   ; KEYBOARD DATA
  1450                              <1> 
  1451                              <1> 
  1452                              <1> ; /// End Of KEYBOARD FUNCTIONS ///
  1910                                  
  1911                                  %include 'video.s' ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - video.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 15/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 16/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; video.inc (13/08/2015)
    15                              <1> ;
    16                              <1> ; Derived from 'IBM PC-AT' BIOS source code (1985) 
    17                              <1> ; ****************************************************************************
    18                              <1> 
    19                              <1> ; Retro UNIX 386 v1 Kernel - VIDEO.INC
    20                              <1> ; Last Modification: 13/08/2015
    21                              <1> ;		  (Video Data is in 'VIDATA.INC')
    22                              <1> ;
    23                              <1> ; ///////// VIDEO (CGA) FUNCTIONS ///////////////
    24                              <1> 
    25                              <1> ; 16/01/2016 (32 bit modifications, TRDOS386 - TRDOS v2.0, video.s)
    26                              <1> ; INT 31H (TRDOS 386) = INT 10H (IBM PC/AT REAL MODE)
    27                              <1> 
    28                              <1> ; IBM PC-AT BIOS Source Code
    29                              <1> ; TITLE VIDEO1 --- 06/10/85  VIDEO DISPLAY BIOS
    30                              <1> 
    31                              <1> _int10h:
    32                              <1> 	; 23/03/2016
    33                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
    34 00001420 9C                  <1> 	pushfd
    35 00001421 0E                  <1> 	push 	cs
    36 00001422 E851000000          <1> 	call 	VIDEO_IO_1
    37 00001427 C3                  <1> 	retn
    38                              <1> 
    39                              <1> ;--- INT 10 H -------------------------------------------------------------------
    40                              <1> ; VIDEO_IO									:	
    41                              <1> ;	THESE ROUTINES PROVIDE THE CRT DISPLAY INTERFACE			:
    42                              <1> ;	THE FOLLOWING FUNCTIONS ARE PROVIDED:					:
    43                              <1> ;										:
    44                              <1> ;    (AH)= 00H	SET MODE (AL) CONTAINS MODE VALUE				:
    45                              <1> ;		(AL) = 00H  40X25 BW MODE (POWER ON DEFAULT)			:
    46                              <1> ;		(AL) = 01H  40X25 COLOR						:
    47                              <1> ;		(AL) = 02H  80X25 BW						:
    48                              <1> ;		(AL) = 03H  80X25 COLOR						:
    49                              <1> ;		              GRAPHICS MODES					:
    50                              <1> ;		(AL) = 04H  320X200 COLOR					:
    51                              <1> ;		(AL) = 05H  320X200 BW MODE					:
    52                              <1> ;		(AL) = 06H  640X200 BW MODE					:
    53                              <1> ;		(AL) = 07H   80X25 MONOCHROME (USED INTERNAL TO VIDEO ONLY)	:
    54                              <1> ;		*** NOTES -BW MODES OPERATE SAME AS COLOR MODES, BUT COLOR	:
    55                              <1> ;		           BURST IS NOT ENABLED					:
    56                              <1> ;		          -CURSOR IS NOT DISPLAYED IN GRAPHICS MODE		:
    57                              <1> ;    (AH)= 01H	SET CURSOR TYPE							:
    58                              <1> ;		(CH) = BITS 4-0 = START LINE FOR CURSOR				:
    59                              <1> ;		       ** HARDWARE WILL ALWAYS CAUSE BLINK			:
    60                              <1> ;		       ** SETTING BIT 5 OR 6 WILL CAUSE ERRATIC BLINKING	:
    61                              <1> ;		          OR NO CURSOR AT ALL					:
    62                              <1> ;		(CL) = BITS 4-0 = END LINE FOR CURSOR				:
    63                              <1> ;    (AH)= 02H	SET CURSOR POSITION						:
    64                              <1> ;		(DH,DL) = ROW,COLUMN  (00H,00H) IS UPPER LEFT			:
    65                              <1> ;		(BH) = A PAGE NUMBER (MUST BE 00H FOR GRAPHICS MODES)		:
    66                              <1> ;    (AH)= 03H	READ CURSOR POSITION						:
    67                              <1> ;		(BH) = PAGE NUMBER (MUST BE 00H FOR GRAPHICS MODES)		:
    68                              <1> ;		ON EXIT (DH,DL) = ROW,COLUMN OF CURRENT CURSOR			:
    69                              <1> ;		        (CH,CL) = CURSOR MODE CURRENTLY SET			:
    70                              <1> ;    (AH)= 04H	READ LIGHT PEN POSITION						:
    71                              <1> ;		ON EXIT:							:
    72                              <1> ;		(AH) = 00H -- LIGHT PEN SWITCH NOT DOWN/NOT TRIGGERED		:
    73                              <1> ;		(AH) = 01H -- VALID LIGHT PEN VALUE IN REGISTERS		:
    74                              <1> ;		        (DH,DL) = ROW,COLUMN OF CHARACTER LP POSITION		:
    75                              <1> ;		        (CH) = RASTER LINE (0-199)				:
    76                              <1> ;		        (BX) = PIXEL COLUMN (0-319,639)				:
    77                              <1> ;    (AH)= 05H	SELECT ACTIVE DISPLAY PAGE (VALID ONLY FOR ALPHA MODES)		:
    78                              <1> ;		(AL) = NEW PAGE VALUE (0-7 FOR MODES 0&1, 0-3 FOR MODES 2&3)	:
    79                              <1> ;    (AH)= 06H	SCROLL ACTIVE PAGE UP						:
    80                              <1> ;		(AL) = NUMBER OF LINES. ( LINES BLANKED AT BOTTOM OF WINDOW )	:
    81                              <1> ;		        (AL) = 00H MEANS BLANK ENTIRE WINDOW			:
    82                              <1> ;		(CH,CL) = ROW,COLUMN OF UPPER LEFT CORNER OF SCROLL		:
    83                              <1> ;		(DH,DL) = ROW,COLUMN OF LOWER RIGHT CORNER OF SCROLL		:
    84                              <1> ;		(BH) = ATTRIBUTE TO BE USED ON BLANK LINE			:
    85                              <1> ;    (AH)= 07H	SCROLL ACTIVE PAGE DOWN						:
    86                              <1> ;		(AL) = NUMBER OF LINES, INPUT LINES BLANKED AT TOP OF WINDOW	:
    87                              <1> ;		        (AL) = 00H MEANS BLANK ENTIRE WINDOW			:
    88                              <1> ;		(CH,CL) = ROW,COLUMN OF UPPER LEFT CORNER OF SCROLL		:
    89                              <1> ;		(DH,DL) = ROW,COLUMN OF LOWER RIGHT CORNER OF SCROLL		:
    90                              <1> ;		(BH) = ATTRIBUTE TO BE USED ON BLANK LINE			:
    91                              <1> ;										:
    92                              <1> ;   CHARACTER HANDLING ROUTINES							:
    93                              <1> ;										:
    94                              <1> ;    (AH)= 08H	READ ATTRIBUTE/CHARACTER AT CURRENT CURSOR POSITION		:
    95                              <1> ;		(BH) = DISPLAY PAGE (VALID FOR ALPHA MODES ONLY)		:
    96                              <1> ;		ON EXIT:							:
    97                              <1> ;		(AL) = CHAR READ						:
    98                              <1> ;		(AH) = ATTRIBUTE OF CHARACTER READ (ALPHA MODES ONLY)		:
    99                              <1> ;    (AH)= 09H	WRITE ATTRIBUTE/CHARACTER AT CURRENT CURSOR POSITION		:
   100                              <1> ;		(BH) = DISPLAY PAGE (VALID FOR ALPHA MODES ONLY)		:
   101                              <1> ;		(CX) = COUNT OF CHARACTERS TO WRITE				:
   102                              <1> ;		(AL) = CHAR TO WRITE						:
   103                              <1> ;		(BL) = ATTRIBUTE OF CHARACTER (ALPHA)/COLOR OF CHAR (GRAPHICS)	:
   104                              <1> ;		         SEE NOTE ON WRITE DOT FOR BIT 7 OF BL = 1.		:
   105                              <1> ;    (AH) = 0AH	WRITE CHARACTER ONLY AT CURRENT CURSOR POSITION			:
   106                              <1> ;		(BH) = DISPLAY PAGE (VALID FOR ALPHA MODES ONLY)		:
   107                              <1> ;		(CX) = COUNT OF CHARACTERS TO WRITE				:
   108                              <1> ;		(AL) = CHAR TO WRITE						:
   109                              <1> ;		       NOTE: USE FUNCTION (AH)= 09H IN GRAPHICS MODES		:
   110                              <1> ;	FOR READ/WRITE CHARACTER INTERFACE WHILE IN GRAPHICS MODE, THE		:
   111                              <1> ;		CHARACTERS ARE FORMED FROM A CHARACTER GENERATOR IMAGE		:
   112                              <1> ;		MAINTAINED IN THE SYSTEM ROM. ONLY THE 1ST 128 CHARS		:
   113                              <1> ;		ARE CONTAINED THERE. TO READ/WRITE THE SECOND 128 CHARS,	:
   114                              <1> ;		THE USER MUST INITIALIZE THE POINTER AT INTERRUPT 1FH		:
   115                              <1> ;		(LOCATION 0007CH) TO POINT TO THE 1K BYTE TABLE CONTAINING	:
   116                              <1> ;		THE CODE POINTS FOR THE SECOND 128 CHARS (128-255).		:
   117                              <1> ;	FOR WRITE CHARACTER INTERFACE IN GRAPHICS MODE, THE REPLICATION FACTOR	:
   118                              <1> ;		CONTAINED IN (CX) ON ENTRY WILL PRODUCE VALID RESULTS ONLY	:
   119                              <1> ;		FOR CHARACTERS CONTAINED ON THE SAME ROW. CONTINUATION TO	:
   120                              <1> ;		SUCCEEDING LINES WILL NOT PRODUCE CORRECTLY.			:
   121                              <1> ;										:
   122                              <1> ;    GRAPHICS INTERFACE								:
   123                              <1> ;    (AH)= 0BH	SET COLOR PALETTE						:
   124                              <1> ;		(BH) = PALETTE COLOR ID BEING SET (0-127)			:
   125                              <1> ;		(BL) = COLOR VALUE TO BE USED WITH THAT COLOR ID		:
   126                              <1> ;		       NOTE: FOR THE CURRENT COLOR CARD, THIS ENTRY POINT HAS	:
   127                              <1> ;		               MEANING ONLY FOR 320X200 GRAPHICS.		:
   128                              <1> ;		       COLOR ID = 0 SELECTS THE BACKGROUND COLOR (0-15)		:
   129                              <1> ;		       COLOR ID = 1 SELECTS THE PALETTE TO BE USED:		:
   130                              <1> ;		               0 = GREEN(1)/RED(2)/YELLOW(3)			:
   131                              <1> ;		               1 = CYAN(1)/MAGENTA(2)/WHITE(3)			:
   132                              <1> ;		       IN 40X25 OR 80X25 ALPHA MODES, THE VALUE SET FOR 	:
   133                              <1> ;		               PALETTE COLOR 0 INDICATES THE BORDER COLOR	:
   134                              <1> ;		               TO BE USED (VALUES 0-31, WHERE 16-31 SELECT	:
   135                              <1> ;		               THE HIGH INTENSITY BACKGROUND SET.		:
   136                              <1> ;    (AH)= 0CH	WRITE DOT							:
   137                              <1> ;		(DX) = ROW NUMBER						:
   138                              <1> ;		(CX) = COLUMN NUMBER						:
   139                              <1> ;		(AL) = COLOR VALUE						:
   140                              <1> ;		        IF BIT 7 OF AL = 1, THEN THE COLOR VALUE IS EXCLUSIVE	:
   141                              <1> ;		        ORed WITH THE CURRENT CONTENTS OF THE DOT		:
   142                              <1> ;    (AH)= ODH	READ DOT							:
   143                              <1> ;		(DX) = ROW NUMBER						:
   144                              <1> ;		(CX) = COLUMN NUMBER						:
   145                              <1> ;		(AL) = RETURNS THE DOT READ					:
   146                              <1> ;										:
   147                              <1> ;    ASCII TELETYPE ROUTINE FOR OUTPUT						:
   148                              <1> ;										:
   149                              <1> ;    (AH)= 0EH	WRITE TELETYPE TO ACTIVE PAGE					:
   150                              <1> ;		(AL) = CHAR TO WRITE						:
   151                              <1> ;		(BL) = FOREGROUND COLOR IN GRAPHICS MODE			:
   152                              <1> ;		NOTE -- SCREEN WIDTH IS CONTROLLED BY PREVIOUS MODE SET		:
   153                              <1> ;    (AH)= 0FH	CURRENT VIDEO STATE						:
   154                              <1> ;		RETURNS THE CURRENT VIDEO STATE					:
   155                              <1> ;		(AL) = MODE CURRENTLY SET ( SEE (AH)=00H FOR EXPLANATION)	:
   156                              <1> ;		(AH) = NUMBER OR CHARACTER COLUMNS ON SCREEN			:
   157                              <1> ;		(BH) = CURRENT ACTIVE DISPLAY PAGE				:
   158                              <1> ;    (AH)= 10H	RESERVED							:
   159                              <1> ;    (AH)= 11H	RESERVED							:
   160                              <1> ;    (AH)= 12H	RESERVED							:
   161                              <1> ;    (AH)= 13H	WRITE STRING							:
   162                              <1> ;			ES:BP  -  POINTER T0 STRING TO BE WRITTEN		:
   163                              <1> ;			CX     -  LENGTH OF CHARACTER STRING TO WRITTEN		:
   164                              <1> ;			DX     -  CURSOR POSITION FOR STRING TO BE WRITTEN	:
   165                              <1> ;			BH     -  PAGE NUMBER					:
   166                              <1> ;		(AL)= 00H	WRITE CHARACTER STRING				:
   167                              <1> ;			BL     -  ATTRIBUTE					:
   168                              <1> ;			STRING IS  <CHAR,CHAR, ... ,CHAR>			:
   169                              <1> ;			CURSOR NOT MOVED					:
   170                              <1> ;		(AL)= 01H	WRITE CHARACTER STRING AND MOVE CURSOR		:
   171                              <1> ;			BL     -  ATTRIBUTE					:
   172                              <1> ;			STRING IS  <CHAR,CHAR, ... ,CHAR>			:
   173                              <1> ;			CURSOR MOVED						:
   174                              <1> ;		(AL)= 02H	WRITE CHARACTER AND ATTRIBUTE STRING		:
   175                              <1> ;			       (VALID FOR ALPHA MODES ONLY)			:
   176                              <1> ;			STRING IS <CHAR,ATTR,CHAR,ATTR ..  ,CHAR,ATTR>		:
   177                              <1> ;			CURSOR IS NOT MOVED					:
   178                              <1> ;		(AL)= 03H WRITE CHARACTER AND ATTRIBUTE STRING AND MOVE CURSOR	:
   179                              <1> ;			       (VALID FOR ALPHA MODES ONLY)			:
   180                              <1> ;			STRING IS <CHAR,ATTR,CHAR,ATTR ..  ,CHAR,ATTR>		:
   181                              <1> ;			CURSOR IS MOVED						:
   182                              <1> ;		 NOTE:  CARRIAGE RETURN, LINE FEED, BACKSPACE, AND BELL ARE	:
   183                              <1> ;		        TREATED AS COMMANDS RATHER THAN PRINTABLE CHARACTERS.	:
   184                              <1> ;										:
   185                              <1> ;	BX,CX,DX,SI,DI,BP,SP,DS,ES,SS PRESERVED DURING CALLS EXCEPT FOR		:
   186                              <1> ;	BX,CX,DX RETURN VALUES ON FUNCTIONS 03H,04H,0DH AND 0FH. ON ALL CALLS	:
   187                              <1> ;	AX IS MODIFIED.								:
   188                              <1> ;--------------------------------------------------------------------------------
   189                              <1> 
   190 00001428 [D5140000]          <1> M1:	dd	SET_MODE	; TABLE OF ROUTINES WITHIN VIDEO I/O
   191 0000142C [3D180000]          <1> 	dd	SET_CTYPE
   192 00001430 [71180000]          <1> 	dd	SET_CPOS
   193 00001434 [99180000]          <1> 	dd	READ_CURSOR
   194                              <1> 	;dd	VIDEO_RETURN	; READ_LPEN
   195 00001438 [BE140000]          <1> 	dd	set_mode_ncm	; Set mode without clearing video memory
   196 0000143C [DF180000]          <1> 	dd	ACT_DISP_PAGE
   197 00001440 [76190000]          <1> 	dd	SCROLL_UP
   198 00001444 [9A1A0000]          <1> 	dd	SCROLL_DOWN
   199 00001448 [1B1B0000]          <1> 	dd	READ_AC_CURRENT
   200 0000144C [731B0000]          <1> 	dd	WRITE_AC_CURRENT
   201 00001450 [991B0000]          <1> 	dd	WRITE_C_CURRENT
   202 00001454 [BF240000]          <1> 	dd	SET_COLOR
   203 00001458 [2A250000]          <1> 	dd	WRITE_DOT
   204 0000145C [F5240000]          <1> 	dd	READ_DOT
   205 00001460 [1B1C0000]          <1> 	dd	WRITE_TTY
   206 00001464 [A6140000]          <1> 	dd	VIDEO_STATE
   207 00001468 [752E0000]          <1> 	dd	vga_pal_funcs ; 10/08/2016 (TRDOS 386)
   208 0000146C [2B2A0000]          <1> 	dd	font_setup    ; 10/07/2016 (TRDOS 386)
   209 00001470 [DA140000]          <1> 	dd	VIDEO_RETURN	; RESERVED
   210 00001474 [881D0000]          <1> 	dd	WRITE_STRING  ; 23/06/2016 (TRDOS 386)
   211                              <1> M1L	EQU	$ - M1
   212                              <1> 
   213                              <1> ; 14/01/2017
   214                              <1> ; 02/01/2017
   215                              <1> ; 04/07/2016
   216                              <1> ; 12/05/2016
   217                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   218                              <1> int31h:  ; Video BIOS
   219                              <1> 
   220                              <1> ; BH = Video page number
   221                              <1> ; BL = Color/Attribute
   222                              <1> ; AH = Function number
   223                              <1> ; AL = Character
   224                              <1> 
   225                              <1> VIDEO_IO_1:
   226                              <1> 	;sti				; INTERRUPTS BACK ON
   227 00001478 FC                  <1> 	cld				; SET DIRECTION FORWARD
   228 00001479 80FC14              <1> 	cmp	ah, M1L/4		; TEST FOR WITHIN TABLE RANGE
   229 0000147C 7327                <1> 	jnb	short M4		; BRANCH TO EXIT IF NOT A VALID COMMAND
   230                              <1> 
   231 0000147E 06                  <1> 	push	es
   232 0000147F 1E                  <1> 	push	ds			; SAVE WORK AND PARAMETER REGISTERS
   233 00001480 52                  <1> 	push	edx
   234 00001481 51                  <1> 	push	ecx
   235 00001482 53                  <1> 	push	ebx
   236 00001483 56                  <1> 	push	esi
   237 00001484 57                  <1> 	push	edi
   238 00001485 55                  <1> 	push	ebp
   239                              <1> 
   240 00001486 66BE1000            <1> 	mov	si, KDATA 		; POINT DS: TO DATA SEGMENT
   241 0000148A 8EDE                <1> 	mov	ds, si
   242 0000148C 8EC6                <1> 	mov	es, si
   243 0000148E BF00800B00          <1> 	mov	edi, 0B8000h		; GET offset FOR COLOR CARD
   244 00001493 A3[6C3E0100]        <1> 	mov	[video_eax], eax ; 12/05/2016 
   245                              <1> 	; 23/03/2016
   246 00001498 C0E402              <1> 	shl	ah, 2  ; dword		; TIMES 2 FOR WORD TABLE LOOKUP
   247 0000149B 0FB6F4              <1> 	movzx	esi, ah			; MOVE OFFSET INTO LOOK UP REGISTER (SI)
   248                              <1> 	;mov	ah, [CRT_MODE]		; MOVE CURRENT MODE INTO (AH) REGISTER
   249                              <1> 
   250                              <1> 	;;15/01/2017
   251                              <1> 	; 14/01/2017
   252                              <1> 	; 02/01/2017
   253                              <1> 	;;mov	byte [intflg], 31h  ; video interrupt
   254 0000149E FB                  <1> 	sti
   255                              <1> 	;
   256                              <1> 
   257 0000149F FFA6[28140000]      <1> 	JMP	dword [esi+M1]		; GO TO SELECTED FUNCTION
   258                              <1> 
   259                              <1> M4:					; COMMAND NOT VALID
   260 000014A5 CF                  <1> 	iretd				; DO NOTHING IF NOT IN VALID RANGE
   261                              <1> 
   262                              <1> VIDEO_STATE:
   263                              <1> 	; 26/06/2016
   264                              <1> 	; 12/05/2016
   265                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
   266                              <1> 
   267                              <1> ;---------------------------------------------------
   268                              <1> ; VIDEO STATE
   269                              <1> ;  RETURNS THE CURRENT VIDEO STATE IN AX
   270                              <1> ;  AH = NUMBER OF COLUMNS ON THE SCREEN
   271                              <1> ;  AL = CURRENT VIDEO MODE
   272                              <1> ;  BH = CURRENT ACTIVE PAGE
   273                              <1> ;---------------------------------------------------
   274                              <1> 
   275 000014A6 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS]	; GET NUMBER OF COLUMNS
   276 000014AC A0[EEF70000]        <1> 	mov	al, [CRT_MODE]	; CURRENT MODE
   277                              <1> 	;movzx	esi, al
   278                              <1> 	;mov	ah, [esi+M6] 
   279                              <1> 	; BH = active page
   280 000014B1 8A3D[0E310100]      <1> 	mov	bh, [ACTIVE_PAGE] ; GET CURRENT ACTIVE PAGE
   281 000014B7 FA                  <1> 	cli	; 02/01/2017
   282 000014B8 5D                  <1> 	pop	ebp		; RECOVER REGISTERS
   283 000014B9 5F                  <1> 	pop	edi
   284 000014BA 5E                  <1> 	pop	esi
   285 000014BB 59                  <1> 	pop	ecx		; DISCARD SAVED BX
   286 000014BC EB26                <1> 	jmp	short M15	; RETURN TO CALLER
   287                              <1> 
   288                              <1> set_mode_ncm:
   289                              <1> 	; 04/07/2016 - TRDOS 386 (TRDOS v2.0)
   290                              <1> 	; set mode without clearing the video memory
   291                              <1> 	; (ony for graphics modes)
   292 000014BE 3C07                <1> 	cmp	al, 7 ; IBM PC CGA modes
   293 000014C0 7613                <1> 	jna	short SET_MODE ; normal function (clear)
   294                              <1> 	; do not clear memory
   295 000014C2 A2[7B3E0100]        <1> 	mov	[noclearmem], al ; > 0
   296 000014C7 E81F000000          <1> 	call	_set_mode
   297 000014CC C605[7B3E0100]00    <1> 	mov	byte [noclearmem], 0
   298 000014D3 EB05                <1>         jmp     short VIDEO_RETURN
   299                              <1> 
   300                              <1> 	; 10/08/2016
   301                              <1> 	; 08/08/2016
   302                              <1> 	; 30/07/2016
   303                              <1> 	; 29/07/2016
   304                              <1> 	; 27/07/2016
   305                              <1> 	; 26/07/2016
   306                              <1> 	; 25/07/2016
   307                              <1> 	; 23/07/2016
   308                              <1> 	; 18/07/2016
   309                              <1> 	; 02/07/2016
   310                              <1> 	; 26/06/2016
   311                              <1> 	; 24/06/2016
   312                              <1> 	; 29/05/2016 - TRDOS 386 (TRDOS v2.0)
   313                              <1> SET_MODE:
   314                              <1> 	; For 32 bit TRDOS and Retro UNIX 386:
   315                              <1> 	;	valid video mode: 03h only!
   316                              <1> 	;	(VGA modes will be selected with another routine)
   317                              <1> 	;
   318                              <1> 	; set_txt_mode ; 80*25 (16 fore colors, 8 back colors)
   319                              <1> 
   320                              <1> ;------------------------------------------------------
   321                              <1> ; SET MODE					      :
   322                              <1> ;	THIS ROUTINE INITIALIZES THE ATTACHMENT TO    :
   323                              <1> ;	THE SELECTED MODE, THE SCREEN IS BLANKED.     :
   324                              <1> ; INPUT						      :
   325                              <1> ;	(AL) - MODE SELECTED (RANGE 0-7)	      :
   326                              <1> ; OUTPUT					      :
   327                              <1> ;	NONE					      :
   328                              <1> ;------------------------------------------------------
   329                              <1> 
   330 000014D5 E811000000          <1> 	call	_set_mode ; 24/06/2016 (set_txt_mode)
   331                              <1> 
   332                              <1> ; 12/05/2016
   333                              <1> ; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
   334                              <1> 
   335                              <1> ;-----	NORMAL RETURN FROM ALL VIDEO RETURNS
   336                              <1> 
   337                              <1> VIDEO_RETURN:
   338 000014DA A1[6C3E0100]        <1> 	mov	eax, [video_eax] ; 12/05/2016
   339                              <1> _video_return:
   340 000014DF FA                  <1> 	cli ; 02/01/2017
   341 000014E0 5D                  <1> 	pop	ebp
   342 000014E1 5F                  <1> 	pop	edi
   343 000014E2 5E                  <1> 	pop	esi
   344 000014E3 5B                  <1> 	pop	ebx
   345                              <1> M15:	; VIDEO_RETURN_C
   346                              <1> 	;;15/01/2017
   347                              <1> 	; 02/01/2017
   348                              <1> 	;;mov	byte [intflg], 0
   349                              <1> 	;
   350 000014E4 59                  <1> 	pop	ecx
   351 000014E5 5A                  <1> 	pop	edx
   352 000014E6 1F                  <1> 	pop	ds
   353 000014E7 07                  <1> 	pop	es	; RECOVER SEGMENTS
   354 000014E8 CF                  <1> 	iretd		; ALL DONE
   355                              <1> 
   356                              <1> set_txt_mode:
   357                              <1> 	; 29/07/2016
   358                              <1> 	; 27/06/2016
   359 000014E9 B003                <1> 	mov	al, 3
   360                              <1> 
   361                              <1> ; 10/08/2016
   362                              <1> ; 08/08/2016
   363                              <1> ; 30/07/2016
   364                              <1> ; 29/07/2016
   365                              <1> ; 27/07/2016
   366                              <1> ; 26/07/2016
   367                              <1> ; 25/07/2016
   368                              <1> ; 23/07/2016
   369                              <1> ; 18/07/2016
   370                              <1> ; 07/07/2016
   371                              <1> ; 04/07/2016
   372                              <1> ; 03/07/2016
   373                              <1> ; 02/07/2016
   374                              <1> ; 26/06/2016
   375                              <1> ; 24/06/2016 (set_txt_mode -> _set_mode)
   376                              <1> ; 17/06/2016
   377                              <1> ; 29/05/2016
   378                              <1> ; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
   379                              <1> _set_mode:
   380                              <1> 	; 24/06/2016
   381 000014EB 3805[EEF70000]      <1> 	cmp	[CRT_MODE], al  ; current mode = requested mode ?
   382 000014F1 750D                <1> 	jne	short _sm_0
   383 000014F3 3C03                <1> 	cmp	al, 3		; text, 80*25 color, default mode
   384                              <1> 				; for TRDOS 386 MainProg
   385 000014F5 755F                <1>         jne     short _sm_2	;  multiscreen is only for mode 3
   386                              <1> 
   387                              <1> 	; If '_set_mode' procedure is called for video mode 3
   388                              <1> 	;     while video mode is 3, video page will be cleared
   389                              <1> 	;     and cursor position of video page will be reset.	  
   390                              <1> 	
   391                              <1> 	; 29/07/2016
   392 000014F7 800D[793E0100]80    <1> 	or	byte [p_crt_mode], 80h ; clear page indicator
   393 000014FE EB5B                <1>         jmp     short _sm_3
   394                              <1> _sm_0:  
   395 00001500 803D[EEF70000]03    <1> 	cmp	byte [CRT_MODE], 3
   396 00001507 7534                <1>         jne     short _sm_1
   397                              <1> 
   398                              <1> 	; If '_set_mode' procedure is called for a video mode
   399                              <1> 	;     except video mode 3, while current video mode
   400                              <1> 	;     is 3; all video pages of mode 3 will be copied 
   401                              <1> 	;     to 98000h address as backup, before mode change.	
   402                              <1> 
   403                              <1> _sm_save_pm:
   404                              <1> 	; 03/07/2016
   405                              <1> 	; save video pages
   406 00001509 BE00800B00          <1> 	mov	esi, 0B8000h
   407 0000150E BF00800900          <1> 	mov	edi, 98000h ; 30/07/2016
   408 00001513 B900200000          <1> 	mov	ecx, (0B8000h-0B0000h)/4
   409 00001518 F3A5                <1> 	rep	movsd
   410                              <1> 
   411 0000151A C605[793E0100]03    <1> 	mov	byte [p_crt_mode], 3 ; previous mode, backup sign
   412                              <1> 	;mov	cl, [ACTIVE_PAGE]
   413                              <1> 	;mov	[p_crt_page], cl
   414                              <1> 
   415                              <1> 	; save cursor positions
   416 00001521 BE[FE300100]        <1> 	mov	esi, CURSOR_POSN
   417 00001526 BF[7E3E0100]        <1> 	mov	edi, cursor_pposn    ; cursor positions backup
   418 0000152B B104                <1> 	mov	cl, 4
   419 0000152D F3A5                <1> 	rep	movsd
   420                              <1> 
   421                              <1> 	; 29/07/2016
   422                              <1> 	;mov	[ACTIVE_PAGE], cl ; 0
   423 0000152F 860D[0E310100]      <1> 	xchg	cl, [ACTIVE_PAGE]
   424 00001535 880D[7A3E0100]      <1> 	mov	[p_crt_page], cl     ; previous page (for mode 3)	
   425                              <1> 	; [ACTIVE_PAGE] = 0 
   426 0000153B EB19                <1> 	jmp	short _sm_2
   427                              <1> 
   428                              <1> _sm_1:
   429 0000153D 3C03                <1> 	cmp	al, 3		; text, 80*25 color, default mode
   430                              <1> 				; for TRDOS 386 MainProg
   431 0000153F 7515                <1> 	jne	short _sm_2  ;  multiscreen is only for mode 3
   432                              <1> 
   433                              <1> 	; If '_set_mode' procedure is called for video mode 3
   434                              <1> 	;     while video mode is not 3 and if there is video
   435                              <1> 	;     page backup for video mode 3, all (of 8) mode 3
   436                              <1> 	;     video pages will be restored from 98000h.
   437                              <1> 
   438 00001541 803D[793E0100]03    <1> 	cmp	byte [p_crt_mode], 3 ; previous mode, backup sign
   439 00001548 750C                <1> 	jne	short _sm_2 ; there is no (multiscreen) video pages
   440                              <1> 			 ; to be restored
   441 0000154A 8A0D[7A3E0100]      <1> 	mov	cl, [p_crt_page]
   442 00001550 880D[0E310100]      <1> 	mov	[ACTIVE_PAGE], cl
   443                              <1> 
   444                              <1> _sm_2:
   445 00001556 A2[EEF70000]        <1> 	mov	[CRT_MODE], al  ; save mode in global variable
   446                              <1> _sm_3:
   447                              <1> 	; 30/07/2016
   448                              <1> 	; 26/07/2016
   449                              <1> 	; 25/07/2016
   450                              <1> 	; set_mode_vga:
   451                              <1> 	; 18/07/2016
   452                              <1> 	; 14/07/2016
   453                              <1> 	; 09/07/2016
   454                              <1> 	; 04/07/2016
   455                              <1> 	; 03/07/2016 (TRDOS 386 = TRDOS v2.0)
   456                              <1> 	; /// video mode 13h ///
   457                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
   458                              <1> 	; vgabios-0.7a (2011)
   459                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
   460                              <1> 	; 'vgabios.c', 'vgatables.h'
   461                              <1> 	;
   462                              <1> 	; Oracle VirtualBox 5.0.24 VGABios Source Code
   463                              <1> 	; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
   464                              <1> 	;
   465 0000155B 88C4                <1> 	mov	ah, al
   466 0000155D B910000000          <1> 	mov	ecx, vga_mode_count 	
   467 00001562 BE[0AF80000]        <1> 	mov	esi, vga_modes
   468 00001567 31DB                <1> 	xor	ebx, ebx
   469                              <1> _sm_4:
   470 00001569 AC                  <1> 	lodsb
   471 0000156A 38C4                <1> 	cmp	ah, al
   472 0000156C 740C                <1> 	je	short _sm_5
   473 0000156E FEC3                <1> 	inc	bl
   474 00001570 E2F7                <1> 	loop	_sm_4
   475                              <1> 
   476                              <1> 	; UNIMPLEMENTED VIDEO MODE !
   477 00001572 31C0                <1> 	xor	eax, eax
   478 00001574 A3[6C3E0100]        <1>         mov     [video_eax], eax ; 0 
   479 00001579 C3                  <1> 	retn
   480                              <1> 
   481                              <1> ;-----	eBX POINTS TO CORRECT ROW OF INITIALIZATION TABLE	
   482                              <1> 
   483                              <1> _sm_5: 	; 25/07/2016
   484 0000157A 89DE                <1> 	mov	esi, ebx
   485 0000157C 81C6[5AF80000]      <1> 	add	esi, vga_memmodel
   486 00001582 8A06                <1> 	mov	al, [esi]
   487 00001584 A2[923E0100]        <1> 	mov	[VGA_MTYPE], al
   488                              <1> 
   489 00001589 89DF                <1> 	mov	edi, ebx
   490 0000158B 81C7[6AF80000]      <1> 	add	edi, vga_dac_s 	
   491 00001591 C0E302              <1> 	shl	bl, 2 ; byte -> dword
   492 00001594 81C3[1AF80000]      <1> 	add	ebx, vga_mode_tbl_ptr
   493                              <1> 
   494                              <1> 	;mov	dword [VGA_BASE], 0B8000h
   495                              <1> 	;cmp	ah, 0Dh ; [CRT_MODE]
   496                              <1> 	;jb	short M9 
   497                              <1> 	;mov	dword [VGA_BASE], 0A0000h
   498                              <1> ;M9:
   499 0000159A 8B33                <1> 	mov	esi, [ebx]
   500 0000159C 89F3                <1> 	mov	ebx, esi
   501 0000159E 83C614              <1> 	add	esi, vga_p_cm_pos ; ebx + 20
   502 000015A1 668B06              <1> 	mov	ax, [esi]       ; get the cursor mode from the table
   503 000015A4 66A3[07F80000]      <1> 	mov	[CURSOR_MODE], ax ; save cursor mode (initial value)
   504                              <1> 	; al = 6, ah = 7
   505                              <1> 	; al = 0Dh, ah = 0Eh ; 25/07/2016
   506 000015AA E83B020000          <1> 	call	cursor_shape_fix
   507                              <1> 	; al = 14, ah = 15  (If [CHAR_HEIGHT] = 16)
   508 000015AF 668906              <1> 	mov	[esi], ax
   509                              <1> 
   510 000015B2 56                  <1> 	push	esi ; *	
   511                              <1> 
   512 000015B3 8A25[F5F70000]      <1> 	mov	ah, [VGA_MODESET_CTL]
   513 000015B9 80E408              <1> 	and	ah, 8 ; default palette loading ?
   514 000015BC 7524                <1> 	jnz	short _sm_6
   515 000015BE 66BAC603            <1> 	mov	dx, 3C6h ; VGAREG_PEL_MASK (DAC mask register)
   516 000015C2 B0FF                <1> 	mov	al, 0FFh ; PEL mask
   517 000015C4 EE                  <1> 	out	dx, al
   518 000015C5 8A27                <1> 	mov	ah, [edi] ; DAC model (selection number)
   519 000015C7 E8ED0F0000          <1> 	call	load_dac_palette
   520                              <1> 	; ecx = 0
   521 000015CC F605[F5F70000]02    <1> 	test	byte [VGA_MODESET_CTL], 2 ; gray scale summing
   522 000015D3 740D                <1> 	jz	short _sm_6
   523 000015D5 53                  <1> 	push	ebx
   524 000015D6 29DB                <1> 	sub	ebx, ebx ; sub bl, bl
   525 000015D8 66B90001            <1>         mov     cx, 256 
   526 000015DC E82B100000          <1> 	call	gray_scale_summing
   527 000015E1 5B                  <1> 	pop	ebx	
   528                              <1> _sm_6:
   529                              <1> 	; Reset Attribute Ctl flip-flop
   530 000015E2 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
   531 000015E6 EC                  <1>  	in	al, dx
   532                              <1> 	; Set Attribute Ctl
   533 000015E7 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
   534 000015E9 83C623              <1> 	add	esi, 35  ; actl regs
   535 000015EC 30E4                <1> 	xor	ah, ah ; 0
   536 000015EE 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
   537                              <1> _sm_7:
   538 000015F2 88E0                <1> 	mov	al, ah
   539 000015F4 EE                  <1> 	out	dx, al ; index
   540 000015F5 AC                  <1> 	lodsb
   541                              <1> 	; DX = 3C0h = VGAREG_ACTL_WRITE_DATA
   542 000015F6 EE                  <1> 	out	dx, al ; value
   543 000015F7 FEC4                <1> 	inc	ah
   544 000015F9 80FC14              <1> 	cmp	ah, 20 ; number of actl registers
   545 000015FC 72F4                <1> 	jb	short _sm_7
   546                              <1> 	;
   547 000015FE 88E0                <1> 	mov	al, ah ; 20
   548 00001600 EE                  <1> 	out	dx, al ; index
   549 00001601 28C0                <1> 	sub	al, al ; 0
   550 00001603 EE                  <1> 	out	dx, al ; value
   551                              <1> 	;
   552                              <1> 	; Set Sequencer Ctl
   553 00001604 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
   554 00001606 83C605              <1> 	add	esi, 5 ; sequ regs
   555                              <1> 	;
   556 00001609 66BAC403            <1> 	mov	dx, 3C4h  ; VGAREG_SEQU_ADDRESS
   557 0000160D EE                  <1> 	out	dx, al ; 0
   558 0000160E 6642                <1> 	inc	dx ; 3C5h ; VGAREG_SEQU_DATA
   559 00001610 B003                <1> 	mov	al, 3
   560 00001612 EE                  <1> 	out	dx, al
   561 00001613 B401                <1> 	mov	ah, 1	
   562                              <1> _sm_8:
   563 00001615 88E0                <1> 	mov	al, ah
   564                              <1> 	;mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
   565 00001617 664A                <1> 	dec	dx
   566 00001619 EE                  <1> 	out	dx, al ; index
   567 0000161A AC                  <1> 	lodsb
   568 0000161B 6642                <1> 	inc	dx ; 3C5h ; VGAREG_SEQU_DATA
   569 0000161D EE                  <1> 	out	dx, al
   570 0000161E 80FC04              <1> 	cmp	ah, 4 ; number of sequ regs
   571 00001621 7304                <1> 	jnb	short _sm_9		
   572 00001623 FEC4                <1> 	inc	ah 
   573 00001625 EBEE                <1> 	jmp	short _sm_8
   574                              <1> _sm_9:
   575                              <1> 	; Set Grafx Ctl
   576 00001627 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
   577 00001629 83C637              <1> 	add	esi, 55 ; grdc regs
   578 0000162C 30E4                <1> 	xor	ah, ah ; 0
   579                              <1> _sm_10:
   580 0000162E 88E0                <1> 	mov	al, ah
   581 00001630 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
   582 00001634 EE                  <1> 	out	dx, al	
   583 00001635 AC                  <1> 	lodsb
   584 00001636 6642                <1> 	inc	dx ; 3CFh ; VGAREG_GRDC_DATA
   585 00001638 EE                  <1> 	out	dx, al
   586 00001639 FEC4                <1> 	inc	ah
   587 0000163B 80FC09              <1> 	cmp	ah, 9 ; number of grdc regs
   588 0000163E 72EE                <1> 	jb	short _sm_10
   589                              <1> 	;
   590                              <1> 	; Disable CRTC write protection
   591 00001640 66BAD403            <1> 	mov	dx, 3D4h  ; VGAREG_VGA_CRTC_ADDRESS
   592                              <1> 	;mov	al, 11h
   593                              <1> 	;our	dx, al
   594                              <1> 	;inc	dx
   595                              <1> 	;sub	al, al
   596                              <1> 	;out	dx, al
   597 00001644 66B81100            <1> 	mov	ax, 11h
   598 00001648 66EF                <1> 	out	dx, ax
   599 0000164A 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
   600 0000164C 83C60A              <1> 	add	esi, 10 ; crtc regs
   601                              <1> 	; ah = 0
   602                              <1> _sm_11:
   603 0000164F 88E0                <1> 	mov	al, ah
   604                              <1> 	; dx = 3D4h = VGAREG_VGA_CRTC_ADDRESS
   605 00001651 EE                  <1> 	out	dx, al ; index
   606 00001652 AC                  <1> 	lodsb
   607 00001653 6642                <1> 	inc	dx  ; VGAREG_VGA_CRTC_ADDRESS + 1
   608 00001655 EE                  <1> 	out	dx, al ; value
   609 00001656 80FC18              <1> 	cmp	ah, 24 ; number of crtc registers - 1
   610 00001659 7306                <1> 	jnb	short _sm_12
   611 0000165B FEC4                <1> 	inc	ah
   612 0000165D 664A                <1> 	dec	dx ; 3D4h
   613 0000165F EBEE                <1> 	jmp	short _sm_11
   614                              <1> _sm_12:
   615                              <1> 	; Set the misc register
   616 00001661 66BACC03            <1> 	mov	dx, 3CCh ; VGAREG_READ_MISC_OUTPUT
   617 00001665 8A4309              <1> 	mov	al, [ebx+9] ; misc reg
   618 00001668 EE                  <1> 	out	dx, al
   619                              <1> 	;
   620                              <1> 	; Enable video
   621 00001669 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
   622 0000166D B020                <1> 	mov	al, 20h  
   623 0000166F EE                  <1>         out     dx, al   ; set bit 5 to 1
   624 00001670 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
   625 00001674 EC                  <1> 	in	al, dx
   626                              <1> 	;
   627 00001675 803D[7B3E0100]00    <1> 	cmp	byte [noclearmem], 0
   628 0000167C 7740                <1>         ja      short _sm_15
   629                              <1> 
   630                              <1> 	; 29/07/2016
   631 0000167E 31C0                <1> 	xor	eax, eax
   632 00001680 B900400000          <1> 	mov	ecx, 4000h ; 16K words (32K)
   633 00001685 803D[923E0100]02    <1> 	cmp     byte [VGA_MTYPE], 2  ; CTEXT, MTEXT, CGA
   634 0000168C 7715                <1> 	ja	short _sm_14    ; no ? (0A0000h)
   635 0000168E BF00800B00          <1> 	mov	edi, 0B8000h
   636 00001693 7409                <1> 	je	short _sm_13	; CGA graphics mode
   637                              <1> 	; 08/08/2016
   638 00001695 A3[8E3E0100]        <1> 	mov	[VGA_INT43H], eax ; 0 ; default font 
   639 0000169A 66B82007            <1> 	mov	ax, 0720h	; CGA text mode
   640                              <1> _sm_13:
   641 0000169E F366AB              <1> 	rep	stosw
   642 000016A1 EB1B                <1> 	jmp	short _sm_15		
   643                              <1> 
   644                              <1> _sm_14:
   645 000016A3 BF00000A00          <1> 	mov	edi, 0A0000h
   646                              <1> 	; ecx = 16384 dwords  (64K)
   647 000016A8 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
   648 000016AC B002                <1> 	mov	al, 2
   649 000016AE EE                  <1> 	out	dx, al
   650                              <1> 	;mov	dx, 3C5h ; VGAREG_SEQU_DATA
   651 000016AF 6642                <1> 	inc	dx
   652 000016B1 EC                  <1> 	in	al, dx ; mmask
   653 000016B2 6650                <1> 	push	ax
   654 000016B4 B00F                <1> 	mov	al, 0Fh ; all planes
   655 000016B6 EE                  <1> 	out	dx, al
   656 000016B7 30C0                <1> 	xor	al, al ; 0
   657 000016B9 F3AB                <1> 	rep	stosd	; ecx = 163684 (64K)
   658 000016BB 6658                <1> 	pop	ax
   659 000016BD EE                  <1> 	out	dx, al  ; mmask
   660                              <1> _sm_15:
   661                              <1> 	; ebx = addr of params tbl for selected mode
   662                              <1> 	; 10/08/2016
   663 000016BE 668B03              <1> 	mov	ax, [ebx] ; num of columns, 'twidth'
   664 000016C1 A2[F0F70000]        <1> 	mov	[CRT_COLS], al
   665                              <1> 	;; 26/07/2016
   666                              <1> 	;; CRTC_ADDRESS = 3D4h (always)
   667                              <1> 	;mov	ah, [ebx+1] ; num of rows, 'theightm1'
   668 000016C6 FEC4                <1> 	inc	ah ; 09/07/2016
   669 000016C8 8825[F6F70000]      <1> 	mov	[VGA_ROWS], ah
   670                              <1> 	; 10/08/2016
   671 000016CE 8A4302              <1> 	mov	al, [ebx+2]
   672 000016D1 A2[F2F70000]        <1> 	mov	[CHAR_HEIGHT], al 
   673                              <1> 	; 29/07/2016
   674                              <1> 	; length of regen buffer in bytes
   675 000016D6 668B4B03            <1> 	mov	cx, [ebx+3] ; 'slength_l'
   676 000016DA 66890D[7C3E0100]    <1> 	mov	[CRT_LEN], cx
   677                              <1> 	;
   678                              <1> 	; 27/07/2016
   679 000016E1 30E4                <1> 	xor	ah, ah
   680 000016E3 A0[0E310100]        <1> 	mov	al, [ACTIVE_PAGE] ; may be > 0 for mode 3
   681                              <1> 	;mul	word [CRT_LEN] ; 4096 for mode 3
   682 000016E8 66F7E1              <1> 	mul	cx ; 29/07/2016
   683 000016EB 66A3[FC300100]      <1> 	mov	[CRT_START], ax
   684                              <1> 	;
   685 000016F1 B060                <1> 	mov	al, 60h
   686 000016F3 803D[7B3E0100]00    <1> 	cmp	byte [noclearmem], 0
   687 000016FA 7602                <1> 	jna	short _sm_16
   688 000016FC 0480                <1> 	add	al, 80h
   689                              <1> _sm_16:
   690 000016FE A2[F3F70000]        <1> 	mov	[VGA_VIDEO_CTL], al
   691 00001703 C605[F4F70000]F9    <1> 	mov	byte [VGA_SWITCHES], 0F9h
   692 0000170A 8025[F5F70000]7F    <1> 	and	byte [VGA_MODESET_CTL], 7Fh
   693                              <1> 
   694 00001711 5E                  <1> 	pop	esi ; *
   695                              <1> 
   696                              <1> 	; 26/07/2016
   697                              <1> 	; 07/07/2016
   698 00001712 668B0D[07F80000]    <1> 	mov	cx, [CURSOR_MODE] ; restore cursor mode (initial value)
   699 00001719 66870E              <1> 	xchg	cx, [esi] ; cl = start line, ch = end line
   700                              <1> 			  ; reset to initial value
   701 0000171C 86E9                <1> 	xchg 	ch, cl  ; ch = start line, cl = end line  
   702 0000171E 66890D[07F80000]    <1> 	mov	[CURSOR_MODE], cx ; save (fixed) cursor mode
   703                              <1> 
   704                              <1> 	; 27/07/2016
   705 00001725 803D[923E0100]02    <1> 	cmp	byte [VGA_MTYPE], 2 ; CTEXT, MTEXT
   706 0000172C 7317                <1> 	jnb	short _sm_17
   707                              <1> 
   708                              <1> 	; Set cursor shape
   709                              <1> 	;mov	cx, 0607h
   710                              <1> 	;call	_set_ctype
   711                              <1> 
   712                              <1> 	; 29/07/2016
   713 0000172E B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
   714 00001730 E8C4050000          <1> 	call	m16	; output cx register
   715                              <1> 	
   716                              <1> 	; 25/07/2016
   717 00001735 803D[EEF70000]03    <1>         cmp     byte [CRT_MODE], 03h
   718 0000173C 7507                <1> 	jne	short _sm_17
   719                              <1> 	; 26/07/2016
   720                              <1> 
   721 0000173E A0[0E310100]        <1> 	mov	al, [ACTIVE_PAGE]
   722 00001743 EB0C                <1> 	jmp	short _sm_18
   723                              <1> _sm_17:
   724                              <1> 	; Set cursor pos for page 0..7
   725 00001745 6629C0              <1> 	sub	ax, ax ; eax = 0
   726 00001748 BF[FE300100]        <1> 	mov	edi, CURSOR_POSN
   727 0000174D AB                  <1> 	stosd	
   728 0000174E AB                  <1> 	stosd
   729 0000174F AB                  <1> 	stosd
   730 00001750 AB                  <1> 	stosd
   731                              <1> 	;; Set active page 0
   732                              <1> 	;mov	[ACTIVE_PAGE], al ; 0
   733                              <1> _sm_18:
   734                              <1> 	; 29/07/2016
   735 00001751 803D[923E0100]02    <1> 	cmp	byte [VGA_MTYPE], 2 ; CTEXT, MTEXT
   736 00001758 0F8386000000        <1>         jnb	_sm_23
   737                              <1> 
   738                              <1> 	;cmp	byte [CHAR_HEIGHT], 16
   739                              <1> 	;je	short _sm_19
   740                              <1> 
   741                              <1>  	;; copy and activate 8x16 font
   742                              <1> 	
   743                              <1> 	; 26/07/2016
   744 0000175E B004                <1> 	mov	al, 04h
   745                              <1> 	;sub	bl, bl
   746                              <1> 	; AX = 1104H ; Load ROM 8x16 Character Set
   747                              <1> 	; (BL = font block to load (EGA: 0-3; VGA: 0-7))
   748 00001760 E83A150000          <1> 	call	load_text_8_16_pat
   749                              <1> 
   750                              <1> 	; video_func_1103h:
   751                              <1> 	; biosfn_set_text_block_specifier:
   752                              <1> 	; BL = font block selector code	
   753                              <1> 	; NOTE: TRDOS 386 only uses and sets font block 0
   754                              <1> 	; (It is as BL = 0 for TRDOS 386)
   755 00001765 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
   756                              <1> 	;mov	ah, bl
   757 00001769 28E4                <1> 	sub	ah, ah ; 0
   758 0000176B B003                <1> 	mov	al, 03h
   759 0000176D 66EF                <1> 	out	dx, ax
   760                              <1> _sm_19:
   761                              <1> 	; 29/07/2016
   762                              <1> 	; 26/07/2016
   763                              <1> 	; 24/06/2016
   764                              <1> 	;mov	edi, 0B8000h
   765                              <1> 	;mov	cx, 4000h ; 16K words (32K)
   766                              <1> 	;
   767 0000176F 30C0                <1> 	xor	al, al
   768 00001771 3805[793E0100]      <1>         cmp     byte [p_crt_mode], al ; 0 
   769 00001777 7707                <1>         ja      short _sm_20 ; 3h, 80h or 83h
   770                              <1> 
   771                              <1> 	; 30/07/2016
   772                              <1> 	; 24/06/2016
   773                              <1> 	; TRDOS 386 (TRDOS v2) 'set mode' modification
   774                              <1> 	; (for multiscreen feature):
   775                              <1> 	; If '_set_mode' procedure is called for video mode 3
   776                              <1> 	;     while video mode is 3, video page will be cleared
   777                              <1> 	;     and cursor position of video page will be reset.	  
   778                              <1> 	; If '_set_mode' procedure is called for a video mode
   779                              <1> 	;     except video mode 3, while current video mode
   780                              <1> 	;     is 3; all video pages of mode 3 will be copied 
   781                              <1> 	;     to 98000h address as backup, before mode change.	 	
   782                              <1> 	; If '_set_mode' procedure is called for video mode 3
   783                              <1> 	;     while video mode is not 3 and if there is video
   784                              <1> 	;     page backup for video mode 3, all (of 8) mode 3
   785                              <1> 	;     video pages will be restored from 98000h.
   786                              <1> 
   787 00001779 A2[0E310100]        <1> 	mov	[ACTIVE_PAGE], al ; 0
   788                              <1> 	;mov	ax, 0720h
   789                              <1> 	;;mov	cx, 4000h ; 16K words (32K)
   790                              <1> 	;;mov	edi, 0B8000h
   791                              <1> 	;rep	stosw
   792                              <1> 	;sub	al, al
   793 0000177E EB64                <1> 	jmp	short _sm_23
   794                              <1> _sm_20:
   795                              <1> 	; Previous video mode is 3
   796                              <1> 	; New video mode is 3 while current video mode is not 3
   797                              <1> 	; (multi screen) video pages will be restored from 0B0000h
   798                              <1> 
   799 00001780 0FB61D[0E310100]    <1> 	movzx	ebx, byte [ACTIVE_PAGE]
   800 00001787 D0E3                <1> 	shl	bl, 1 ; * 2
   801 00001789 81C3[FE300100]      <1> 	add	ebx, CURSOR_POSN
   802                              <1> 
   803                              <1> 	; 29/07/2016
   804 0000178F F605[793E0100]7F    <1> 	test    byte [p_crt_mode], 7Fh ; 83h or 3h
   805 00001796 7427                <1> 	jz	short _sm_21	; do not restore video pages
   806                              <1> 
   807                              <1> 	;; restore video pages
   808 00001798 BE00800900          <1> 	mov	esi, 98000h ; 30/07/2016 
   809 0000179D BF00800B00          <1> 	mov	edi, 0B8000h
   810 000017A2 66B90020            <1> 	mov	cx, 2000h ; 8K dwords (32K)
   811 000017A6 F3A5                <1> 	rep	movsd
   812                              <1> 
   813                              <1> 	; restore cursor positions
   814 000017A8 BE[7E3E0100]        <1> 	mov	esi, cursor_pposn
   815 000017AD BF[FE300100]        <1> 	mov	edi, CURSOR_POSN
   816                              <1> 	;mov	ecx, 4	; restore all cursor positions (16 bytes)
   817 000017B2 B104                <1> 	mov	cl, 4
   818 000017B4 F3A5                <1> 	rep 	movsd
   819                              <1> 
   820 000017B6 F605[793E0100]80    <1>         test    byte [p_crt_mode], 80h
   821 000017BD 7420                <1> 	jz	short _sm_22 ; do not clear current video pages
   822                              <1> _sm_21:
   823                              <1> 	; clear video page
   824 000017BF 668B0D[7C3E0100]    <1> 	mov	cx, [CRT_LEN] ; 4096 
   825 000017C6 66D1E9              <1> 	shr	cx, 1 ; 2072
   826 000017C9 66B82007            <1> 	mov	ax, 0720h
   827 000017CD BF00800B00          <1> 	mov	edi, 0B8000h ; [crt_base]
   828 000017D2 66033D[FC300100]    <1> 	add	di, [CRT_START]
   829 000017D9 F366AB              <1> 	rep	stosw	; FILL THE REGEN BUFFER WITH BLANKS
   830                              <1> 	;
   831 000017DC 66890B              <1> 	mov	[ebx], cx ; reset cursor position
   832                              <1> _sm_22:
   833 000017DF A2[793E0100]        <1> 	mov	[p_crt_mode], al ; 0
   834                              <1> _sm_23:
   835                              <1> 	; al = video page number
   836                              <1> 	; [CRT_LEN] = length of regen buffer in bytes
   837 000017E4 E81E010000          <1> 	call	_set_active_page
   838                              <1> 
   839                              <1> ;-----	NORMAL RETURN FROM ALL VIDEO RETURNS
   840 000017E9 C3                  <1> 	retn
   841                              <1> 
   842                              <1> cursor_shape_fix:
   843                              <1> 	; 07/07/2016
   844                              <1> 	; (Cursor start and cursor end line values -6,7-
   845                              <1> 	; will be fixed depending on character height)
   846                              <1> 	;
   847                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
   848                              <1> 	; vgabios-0.7a (2011)
   849                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
   850                              <1> 	; 'vgabios.c', ' biosfn_set_cursor_shape (CH,CL)'
   851                              <1> 	;
   852                              <1> 	; INPUT ->
   853                              <1> 	;	AL = cursor start line (=6)
   854                              <1> 	;	AH = cursor end line (=7)
   855                              <1> 	; OUTPUT ->
   856                              <1> 	;	AL = cursor start line (=14)
   857                              <1> 	;	AH = cursor end line (=15)
   858                              <1> 	;
   859                              <1> 	;; if((modeset_ctl&0x01)&&(cheight>8)&&(CL<8)&&(CH<0x20))
   860                              <1> 
   861                              <1> 	;test	byte [VGA_MODESET_CTL], 1 ; VGA active
   862                              <1> 	;jz	short csf_3
   863 000017EA 803D[F2F70000]08    <1> 	cmp	byte [CHAR_HEIGHT], 8
   864 000017F1 7649                <1> 	jna	short csf_3
   865 000017F3 80FC08              <1> 	cmp	ah, 8
   866 000017F6 7344                <1> 	jnb	short csf_3
   867 000017F8 3C20                <1> 	cmp	al, 20h
   868 000017FA 7340                <1> 	jnb	short csf_3
   869                              <1> 	;
   870 000017FC 6650                <1> 	push	ax
   871                              <1> 	; {
   872                              <1>    	; if(CL!=(CH+1))	
   873 000017FE FEC0                <1> 	inc	al
   874 00001800 38C4                <1> 	cmp	ah, al   ; ah != al + 1
   875 00001802 740F                <1>         je      short csf_1
   876                              <1> 	; CH = ((CH+1) * cheight / 8) -1;
   877 00001804 8A25[F2F70000]      <1> 	mov	ah, [CHAR_HEIGHT]
   878 0000180A F6E4                <1> 	mul	ah
   879 0000180C C0E803              <1> 	shr	al, 3 ; / 8
   880 0000180F FEC8                <1> 	dec	al ; - 1
   881 00001811 EB0E                <1> 	jmp	short csf_2 
   882                              <1> csf_1: 	
   883                              <1>  	; }
   884                              <1>    	; else		; ah = al + 1
   885                              <1>     	; {
   886 00001813 FEC4                <1> 	inc	ah	; ah = ah + 1   
   887                              <1> 	; CH = ((CL+1) * cheight / 8) - 2;
   888 00001815 A0[F2F70000]        <1> 	mov	al, [CHAR_HEIGHT]
   889 0000181A F6E4                <1> 	mul	ah
   890 0000181C C0E803              <1> 	shr	al, 3 ; / 8
   891 0000181F 2C02                <1> 	sub	al, 2 ; - 2
   892                              <1> 	; al = 14 (if [CHAR_HEIGHT] = 16)
   893                              <1> csf_2:
   894 00001821 880424              <1> 	mov	[esp], al
   895 00001824 8A642401            <1> 	mov	ah, [esp+1]
   896                              <1> 	; CL = ((CL+1) * cheight / 8) - 1;
   897 00001828 FEC4                <1> 	inc	ah 
   898 0000182A A0[F2F70000]        <1> 	mov	al, [CHAR_HEIGHT]
   899 0000182F F6E4                <1> 	mul	ah
   900 00001831 C0E803              <1> 	shr	al, 3 ; / 8
   901 00001834 FEC8                <1> 	dec	al ; - 1
   902 00001836 88442401            <1> 	mov	[esp+1], al
   903                              <1> 	; ah = 15 (if [CHAR_HEIGHT] = 16)
   904                              <1> 	;
   905 0000183A 6658                <1> 	pop	ax
   906                              <1> csf_3:
   907 0000183C C3                  <1> 	retn
   908                              <1> 
   909                              <1> SET_CTYPE:
   910                              <1> 	; 12/09/2016
   911                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
   912 0000183D 803D[EEF70000]07    <1> 	cmp	byte [CRT_MODE], 7
   913 00001844 0F8790FCFFFF        <1> 	ja	VIDEO_RETURN ; 12/09/2016
   914 0000184A E805000000          <1> 	call	_set_ctype
   915 0000184F E986FCFFFF          <1>         jmp     VIDEO_RETURN
   916                              <1> 
   917                              <1> _set_ctype:
   918                              <1> 	; 02/09/2014 (Retro UNIX 386 v1)
   919                              <1> 	;
   920                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
   921                              <1> 
   922                              <1> 	; (CH) = BITS 4-0 = START LINE FOR CURSOR
   923                              <1> 	;  ** HARDWARE WILL ALWAYS CAUSE BLINK
   924                              <1> 	;  ** SETTING BIT 5 OR 6 WILL CAUSE ERRATIC BLINKING
   925                              <1> 	;     OR NO CURSOR AT ALL
   926                              <1> 	; (CL) = BITS 4-0 = END LINE FOR CURSOR
   927                              <1> 
   928                              <1> ;------------------------------------------------
   929                              <1> ; SET_CTYPE
   930                              <1> ;	THIS ROUTINE SETS THE CURSOR VALUE
   931                              <1> ; INPUT
   932                              <1> ;	(CX) HAS CURSOR VALUE CH-START LINE, CL-STOP LINE
   933                              <1> ; OUTPUT	
   934                              <1> ;	NONE
   935                              <1> ;------------------------------------------------
   936                              <1> 
   937                              <1> 	; 07/07/2016
   938                              <1> 	; Fixing cursor start and stop line depending on
   939                              <1> 	; current character height (=16)
   940                              <1> 	; (Note: Default/initial values are 6 and 7.
   941                              <1> 	; If set values are 6 (start) & 7 (stop) and 
   942                              <1> 	; [CHAR_HEIGHT] = 16 :
   943                              <1> 	; After fixing, start line will be 14, stop line
   944                              <1> 	; will be 15.)
   945 00001854 6689C8              <1> 	mov	ax, cx
   946 00001857 86C4                <1> 	xchg	al, ah
   947                              <1> 	; AL = start line, AH = stop line
   948 00001859 E88CFFFFFF          <1> 	call	cursor_shape_fix
   949                              <1> 	; AL = start line (fixed), AH = stop line (fixed)
   950 0000185E 6689C1              <1> 	mov	cx, ax
   951 00001861 86E9                <1> 	xchg	ch, cl
   952                              <1> 	; CH = start line (fixed), CL = stop line (fixed)
   953                              <1> 	;
   954 00001863 B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
   955 00001865 66890D[07F80000]    <1> 	mov	[CURSOR_MODE], cx ; save in data area
   956                              <1> 	;call	m16	; output cx register
   957                              <1> 	;retn
   958 0000186C E988040000          <1>         jmp     m16
   959                              <1> 
   960                              <1> SET_CPOS:
   961                              <1> 	; 12/09/2016
   962                              <1> 	; 07/07/2016
   963                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
   964 00001871 80FF07              <1> 	cmp	bh, 7 ; video page > 7 ; 07/07/2016
   965 00001874 0F8760FCFFFF        <1> 	ja	VIDEO_RETURN
   966                              <1> 	;
   967 0000187A 803D[EEF70000]07    <1> 	cmp	byte [CRT_MODE], 7
   968 00001881 770A                <1> 	ja	short vga_set_cpos ; 12/09/2016	
   969 00001883 E846040000          <1> 	call	_set_cpos
   970 00001888 E94DFCFFFF          <1>         jmp     VIDEO_RETURN
   971                              <1> 
   972                              <1> vga_set_cpos:
   973                              <1> 	; 12/09/2016
   974                              <1> 	; 09/07/2016
   975                              <1> 	; set cursor position
   976                              <1> 	; NOTE: Hardware cursor position will not be set
   977                              <1> 	;   in any VGA modes (>7)
   978                              <1> 	;   But, cursor position will be saved into
   979                              <1> 	;   [CURSOR_POSN].
   980                              <1> 	;   TRDOS 386 (TRDOS v2.0) uses only one page
   981                              <1> 	;   (page 0) for all graphics modes.
   982                              <1> 
   983 0000188D 668915[FE300100]    <1> 	mov	[CURSOR_POSN], dx ; save cursor pos for pg 0
   984                              <1> 	; 04/08/2016
   985                              <1> 	;mov	bh, [ACTIVE_PAGE] ; = 0
   986                              <1> 	;call	_set_cpos
   987 00001894 E941FCFFFF          <1> 	jmp     VIDEO_RETURN
   988                              <1> 
   989                              <1> READ_CURSOR:
   990                              <1> 	; 12/09/2016
   991                              <1> 	; 07/07/2016
   992                              <1> 	; 12/05/2016
   993                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
   994                              <1> 	;
   995                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
   996                              <1> 
   997                              <1> ;------------------------------------------------------
   998                              <1> ; READ_CURSOR
   999                              <1> ;	THIS ROUTINE READS THE CURRENT CURSOR VALUE FROM THE
  1000                              <1> ;	845, FORMATS IT, AND SENDS IT BACK TO THE CALLER
  1001                              <1> ; INPUT
  1002                              <1> ;	BH - PAGE OF CURSOR
  1003                              <1> ; OUTPUT
  1004                              <1> ;	DX - ROW, COLUMN OF THE CURRENT CURSOR POSITION
  1005                              <1> ;	CX - CURRENT CURSOR MODE
  1006                              <1> ;------------------------------------------------------
  1007                              <1> 
  1008                              <1> 	; BH = Video page number (0 to 7)
  1009                              <1> 
  1010                              <1> 	; 07/07/2016
  1011 00001899 80FF07              <1> 	cmp	bh, 7 ; video page > 7 (invalid)
  1012 0000189C 7606                <1> 	jna	short read_cursor_1
  1013                              <1> 	; invalid video page (input) 
  1014 0000189E 31C9                <1> 	xor	ecx, ecx ; 0
  1015 000018A0 31D2                <1> 	xor	edx, edx ; 0
  1016 000018A2 EB15                <1> 	jmp	short read_cursor_2
  1017                              <1> read_cursor_1:
  1018                              <1> 	; 12/09/2016
  1019 000018A4 803D[EEF70000]07    <1> 	cmp	byte [CRT_MODE], 7 ; vga mode
  1020 000018AB 7727                <1> 	ja	short vga_get_cpos
  1021                              <1> 	;
  1022 000018AD E815000000          <1> 	call	get_cpos
  1023 000018B2 0FB70D[07F80000]    <1> 	movzx	ecx, word [CURSOR_MODE]
  1024                              <1> read_cursor_2:
  1025 000018B9 5D                  <1> 	pop	ebp
  1026 000018BA 5F                  <1> 	pop	edi
  1027 000018BB 5E                  <1> 	pop	esi
  1028 000018BC 5B                  <1> 	pop	ebx
  1029 000018BD 58                  <1> 	pop	eax  ; DISCARD SAVED CX AND DX
  1030 000018BE 58                  <1> 	pop	eax
  1031 000018BF A1[6C3E0100]        <1> 	mov	eax, [video_eax] ; 12/05/2016
  1032                              <1> 	;;15/01/2017
  1033                              <1> 	;;mov	byte [intflg], 0 ; 07/01/2017
  1034 000018C4 1F                  <1> 	pop	ds
  1035 000018C5 07                  <1> 	pop	es
  1036 000018C6 CF                  <1> 	iretd
  1037                              <1> 
  1038                              <1> get_cpos:
  1039                              <1> 	; 12/05/2016
  1040                              <1> 	; 16/01/2016
  1041                              <1> 	; BH = Video page number (0 to 7)
  1042                              <1> 	;
  1043 000018C7 D0E7                <1> 	shl	bh, 1 ; WORD OFFSET
  1044 000018C9 0FB6F7              <1> 	movzx	esi, bh 
  1045 000018CC 0FB796[FE300100]    <1> 	movzx	edx, word [esi+CURSOR_POSN]
  1046 000018D3 C3                  <1> 	retn
  1047                              <1> 
  1048                              <1> vga_get_cpos:
  1049                              <1> 	; 12/09/2016
  1050                              <1> 	; get cursor position (vga)
  1051 000018D4 0FB715[FE300100]    <1> 	movzx	edx, word [CURSOR_POSN] ; cursor pos for pg 0
  1052 000018DB 31C9                <1> 	xor	ecx, ecx ; Cursor Mode = 0 (invalid)
  1053 000018DD EBDA                <1> 	jmp     short read_cursor_2
  1054                              <1> 
  1055                              <1> ACT_DISP_PAGE:
  1056                              <1> 	; 07/07/2016
  1057                              <1> 	; 26/06/2016
  1058                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1059                              <1> 	;
  1060                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1061                              <1> 	;
  1062                              <1> ;-----------------------------------------------------
  1063                              <1> ; ACT_DISP_PAGE
  1064                              <1> ;	THIS ROUTINE SETS THE ACTIVE DISPLAY PAGE, ALLOWING
  1065                              <1> ;	THE FULL USE OF THE MEMORY SET ASIDE FOR THE VIDEO ATTACHMENT
  1066                              <1> ; INPUT
  1067                              <1> ;	AL HAS THE NEW ACTIVE DISPLAY PAGE
  1068                              <1> ; OUTPUT
  1069                              <1> ;	THE 6845 IS RESET TO DISPLAY THAT PAGE
  1070                              <1> ;-----------------------------------------------------
  1071                              <1> 	; 07/07/2016
  1072 000018DF 3C07                <1> 	cmp	al, 7	; > 7 = invalid video page number
  1073 000018E1 0F87F3FBFFFF        <1> 	ja	VIDEO_RETURN
  1074 000018E7 803D[EEF70000]03    <1>         cmp     byte [CRT_MODE], 3
  1075 000018EE 7408                <1> 	je	short adp_1
  1076 000018F0 20C0                <1> 	and 	al, al
  1077 000018F2 0F85E2FBFFFF        <1>         jnz     VIDEO_RETURN
  1078                              <1> 	;sub	al, al ; 0 ; force to page 0
  1079                              <1> adp_1:	
  1080 000018F8 E805000000          <1> 	call	set_active_page
  1081 000018FD E9D8FBFFFF          <1>         jmp     VIDEO_RETURN
  1082                              <1> 
  1083                              <1> set_active_page:   ; tty_sw
  1084                              <1> 	; 26/07/2016
  1085                              <1> 	; 26/06/2016
  1086                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1087                              <1> 	; 30/06/2015
  1088                              <1> 	; 04/03/2014  (act_disp_page --> tty_sw)
  1089                              <1> 	; 10/12/2013
  1090                              <1> 	; 04/12/2013
  1091                              <1> 	;
  1092 00001902 A2[0E310100]        <1> 	mov	[ACTIVE_PAGE], al ; save active page value ; [ptty]
  1093                              <1> _set_active_page:
  1094                              <1> 	; 27/06/2015
  1095 00001907 0FB6D8              <1> 	movzx	ebx, al
  1096                              <1> 	;
  1097 0000190A 6698                <1> 	cbw	; 07/09/2014 (ah=0)
  1098 0000190C 66F725[7C3E0100]    <1> 	mul	word [CRT_LEN]  ; get saved length of regen buffer
  1099                              <1> 				; display page times regen length
  1100                              <1> 	; 10/12/2013
  1101 00001913 66A3[FC300100]      <1> 	mov	[CRT_START], ax ; save start address for later
  1102 00001919 6689C1              <1> 	mov	cx, ax ; start address to cx
  1103                              <1> _M16:
  1104                              <1> 	;sar	cx, 1
  1105 0000191C 66D1E9              <1> 	shr	cx, 1	; divide by 2 for 6845 handling
  1106 0000191F B40C                <1> 	mov	ah, 12	; 6845 register for start address
  1107 00001921 E8D3030000          <1> 	call	m16
  1108                              <1> 	;sal	bx, 1
  1109                              <1> 	; 01/09/2014
  1110 00001926 D0E3                <1> 	shl	bl, 1	; *2 for word offset
  1111 00001928 81C3[FE300100]      <1> 	add	ebx, CURSOR_POSN
  1112 0000192E 668B13              <1> 	mov	dx, [ebx] ; get cursor for this page
  1113                              <1> 	; 16/01/2016
  1114                              <1> 	;call	m18
  1115                              <1> 	;retn
  1116 00001931 E9AF030000          <1> 	jmp	m18
  1117                              <1> 
  1118                              <1> position:
  1119                              <1> 	; 24/06/2016
  1120                              <1> 	; 12/05/2016 - TRDOS 386 (TRDOS v2.0)
  1121                              <1> 	; 27/06/2015
  1122                              <1> 	; 02/09/2014
  1123                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  1124                              <1> 	; 04/12/2013 (Retro UNIX 8086 v1)
  1125                              <1> 	;
  1126                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1127                              <1> 	;
  1128                              <1> ;-----------------------------------------
  1129                              <1> ; POSITION
  1130                              <1> ;	THIS SERVICE ROUTINE CALCULATES THE REGEN BUFFER ADDRESS
  1131                              <1> ;	OF A CHARACTER IN THE ALPHA MODE
  1132                              <1> ; INPUT
  1133                              <1> ;	AX = ROW, COLUMN POSITION
  1134                              <1> ; OUTPUT
  1135                              <1> ;	AX = OFFSET OF CHAR POSITION IN REGEN BUFFER
  1136                              <1> ;-----------------------------------------
  1137                              <1> 
  1138                              <1> 	; DX = ROW, COLUMN POSITION
  1139 00001936 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS] ; 24/06/2016
  1140 0000193D F6E6                <1> 	mul	dh	 ; row value
  1141 0000193F 30F6                <1> 	xor	dh, dh   ; 0	
  1142 00001941 6601D0              <1> 	add	ax, dx	 ; add column value to the result
  1143 00001944 66D1E0              <1> 	shl	ax, 1	; * 2 for attribute bytes
  1144                              <1> 		; EAX = AX = OFFSET OF CHAR POSITION IN REGEN BUFFER 
  1145 00001947 C3                  <1> 	retn
  1146                              <1> 
  1147                              <1> find_position:
  1148                              <1> 	; 24/06/2016
  1149                              <1> 	; 12/05/2016 - TRDOS 386 (TRDOS v2.0)
  1150                              <1> 	; 27/06/2015
  1151                              <1> 	; 07/09/2014
  1152                              <1> 	; 02/09/2014
  1153                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  1154                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1155                              <1> 
  1156 00001948 0FB6CF              <1> 	movzx	ecx, bh ; video page number
  1157 0000194B 89CE                <1> 	mov	esi, ecx
  1158 0000194D 66D1E6              <1> 	shl	si, 1
  1159 00001950 668B96[FE300100]    <1> 	mov	dx, [esi+CURSOR_POSN]
  1160 00001957 740C                <1> 	jz	short p21
  1161 00001959 6631F6              <1> 	xor	si, si
  1162                              <1> p20:
  1163 0000195C 660335[7C3E0100]    <1> 	add	si, [CRT_LEN] ; 24/06/2016
  1164                              <1> 	;add	si, 80*25*2 ; add length of buffer for one page		
  1165 00001963 E2F7                <1> 	loop	p20
  1166                              <1> p21:
  1167 00001965 6621D2              <1> 	and	dx, dx
  1168 00001968 7407                <1> 	jz	short p22
  1169 0000196A E8C7FFFFFF          <1> 	call 	position ; determine location in regen in page
  1170 0000196F 01C6                <1> 	add	esi, eax ; add location to start of regen page
  1171                              <1> p22:	
  1172                              <1> 	;mov	dx, [addr_6845] ; get base address of active display			
  1173                              <1> 	;mov	dx, 03D4h ; I/O address of color card
  1174                              <1> 	;add	dx, 6	; point at status port
  1175 00001971 66BADA03            <1> 	mov	dx, 03DAh ; status port
  1176                              <1> 	; cx = 0
  1177 00001975 C3                  <1> 	retn
  1178                              <1> 
  1179                              <1> SCROLL_UP:
  1180                              <1> 	; 07/07/2016
  1181                              <1> 	; 26/06/2016
  1182                              <1> 	; 12/05/2016
  1183                              <1> 	; 30/01/2016
  1184                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1185                              <1> 	; 07/09/2014
  1186                              <1> 	; 02/09/2014
  1187                              <1> 	; 01/09/2014 (Retro UNIX 386 v1 - beginning)
  1188                              <1> 	; 04/04/2014
  1189                              <1> 	; 04/12/2013
  1190                              <1> 	;
  1191                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1192                              <1> 	;
  1193                              <1> ;----------------------------------------------
  1194                              <1> ; SCROLL UP
  1195                              <1> ;	THIS ROUTINE MOVES A BLOCK OF CHARACTERS UP
  1196                              <1> ;	ON THE SCREEN
  1197                              <1> ; INPUT
  1198                              <1> ;	(AH) = CURRENT CRT MODE
  1199                              <1> ;	(AL) = NUMBER OF ROWS TO SCROLL
  1200                              <1> ;	(CX) = ROW/COLUMN OF UPPER LEFT CORNER
  1201                              <1> ;	(DX) = ROW/COLUMN OF LOWER RIGHT CORNER
  1202                              <1> ;	(BH) = ATTRIBUTE TO BE USED ON BLANKED LINE
  1203                              <1> ;	(DS) = DATA SEGMENT
  1204                              <1> ;	(ES) = REGEN BUFFER SEGMENT
  1205                              <1> ; OUTPUT
  1206                              <1> ;	NONE -- THE REGEN BUFFER IS MODIFIED
  1207                              <1> ;--------------------------------------------
  1208                              <1> 
  1209                              <1> 	; 07/07/2016
  1210 00001976 38F5                <1> 	cmp	ch, dh
  1211 00001978 0F875CFBFFFF        <1> 	ja	VIDEO_RETURN
  1212 0000197E 38D1                <1> 	cmp	cl, dl
  1213 00001980 0F8754FBFFFF        <1> 	ja	VIDEO_RETURN
  1214                              <1> 	;
  1215 00001986 E805000000          <1> 	call	_scroll_up
  1216 0000198B E94AFBFFFF          <1>         jmp     VIDEO_RETURN
  1217                              <1> 
  1218                              <1> _scroll_up:  ; from 'write_tty'
  1219                              <1> 	;
  1220                              <1> 	; cl = left upper column
  1221                              <1> 	; ch = left upper row
  1222                              <1> 	; dl = right lower column
  1223                              <1> 	; dh = right lower row
  1224                              <1> 	;
  1225                              <1> 	; al = line count 
  1226                              <1> 	; bl = attribute to be used on blanked line	
  1227                              <1> 	; bh = video page number (0 to 7)
  1228                              <1> 
  1229 00001990 E896000000          <1> 	call	test_line_count ; 16/01/2016
  1230                              <1> 
  1231 00001995 8A25[EEF70000]      <1> 	mov	ah, [CRT_MODE] ; current video mode	
  1232                              <1> 	;cmp	ah, 4
  1233                              <1>  	;jb	short n0
  1234                              <1> 	;cmp	byte [CRT_MODE], 4
  1235 0000199B 80FC04              <1>         cmp	ah, 4 ; 07/07/2016
  1236 0000199E 0F8320050000        <1> 	jnb     GRAPHICS_UP ; 26/06/2016
  1237                              <1> 
  1238                              <1> 	;cmp	ah, 7 ; TEST FOR BW CARD
  1239                              <1> 	;jne	GRAPHICS_UP
  1240                              <1> n0:
  1241                              <1> 	; 07/07/2016
  1242 000019A4 80FF07              <1> 	cmp	bh, 7 ; video page number
  1243 000019A7 7606                <1> 	jna	short n1
  1244 000019A9 8A3D[0E310100]      <1> 	mov	bh, [ACTIVE_PAGE]
  1245                              <1> n1:
  1246 000019AF 88DC                <1> 	mov	ah, bl ; attribute
  1247 000019B1 6650                <1> 	push	ax ; *
  1248                              <1> 	;mov 	esi, [CRT_BASE]
  1249 000019B3 BE00800B00          <1>         mov     esi, 0B8000h  
  1250 000019B8 3A3D[0E310100]      <1>         cmp     bh, [ACTIVE_PAGE]
  1251 000019BE 750B                <1> 	jne	short n2
  1252                              <1> 	;
  1253 000019C0 66A1[FC300100]      <1>         mov     ax, [CRT_START]
  1254 000019C6 6601C6              <1>         add     si, ax
  1255 000019C9 EB11                <1>         jmp     short n4
  1256                              <1> n2:
  1257 000019CB 20FF                <1>         and     bh, bh
  1258 000019CD 740D                <1> 	jz	short n4
  1259 000019CF 88F8                <1> 	mov	al, bh
  1260                              <1> n3:
  1261 000019D1 660335[7C3E0100]    <1>         add	si, [CRT_LEN]
  1262 000019D8 FEC8                <1>         dec	al
  1263 000019DA 75F5                <1> 	jnz	short n3
  1264                              <1> n4:	
  1265 000019DC E85D000000          <1> 	call	scroll_position ; 16/01/2016
  1266 000019E1 7420                <1>         jz      short n6 
  1267                              <1> 
  1268 000019E3 01CE                <1>         add     esi, ecx ; from address for scroll
  1269 000019E5 88F5                <1> 	mov	ch, dh  ; #rows in block
  1270 000019E7 28C5                <1> 	sub	ch, al	; #rows to be moved
  1271                              <1> n5:
  1272 000019E9 E894000000          <1> 	call	n10 ; 16/01/2016
  1273                              <1> 	
  1274 000019EE 51                  <1>         push	ecx
  1275 000019EF 0FB60D[F0F70000]    <1> 	movzx	ecx, byte [CRT_COLS] 
  1276 000019F6 00C9                <1> 	add	cl, cl
  1277 000019F8 01CE                <1>         add	esi, ecx  ; next line
  1278 000019FA 01CF                <1>         add	edi, ecx
  1279 000019FC 59                  <1> 	pop	ecx
  1280                              <1> 
  1281 000019FD FECD                <1> 	dec	ch	 ; count of lines to move
  1282 000019FF 75E8                <1> 	jnz	short n5 ; row loop
  1283                              <1> 	; ch = 0
  1284 00001A01 88C6                <1> 	mov	dh, al	 ; #rows	
  1285                              <1> n6:
  1286                              <1> 	; attribute in ah
  1287 00001A03 B020                <1> 	mov	al, ' '	 ; fill with blanks
  1288                              <1> n7:
  1289 00001A05 E885000000          <1> 	call	n11 ; 16/01/2016
  1290                              <1> 
  1291 00001A0A 8A0D[F0F70000]      <1> 	mov	cl, [CRT_COLS]
  1292 00001A10 00C9                <1> 	add	cl, cl
  1293 00001A12 01CF                <1>         add	edi, ecx
  1294                              <1> 
  1295 00001A14 FECE                <1> 	dec	dh
  1296 00001A16 75ED                <1> 	jnz	short n7
  1297                              <1> n16:
  1298 00001A18 3A3D[0E310100]      <1> 	cmp	bh, [ACTIVE_PAGE]
  1299 00001A1E 750A                <1> 	jne	short n8
  1300                              <1> 	
  1301                              <1> 	;cmp	byte [CRT_MODE], 7	; is this the black and white card
  1302                              <1> 	;je	short n8		; if so, skip the mode reset
  1303                              <1> 
  1304 00001A20 A0[EFF70000]        <1> 	mov	al, [CRT_MODE_SET] ; get the value of mode set
  1305 00001A25 66BAD803            <1> 	mov	dx, 03D8h ; always set color card port
  1306 00001A29 EE                  <1> 	out	dx, al
  1307                              <1> n8:
  1308 00001A2A C3                  <1> 	retn
  1309                              <1> 
  1310                              <1> test_line_count:
  1311                              <1> 	; 12/05/2016
  1312                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1313                              <1> 	; 07/09/2014 (scroll_up)
  1314 00001A2B 08C0                <1> 	or	al, al
  1315 00001A2D 740E                <1> 	jz	short al_set2
  1316 00001A2F 6652                <1> 	push	dx
  1317 00001A31 28EE                <1> 	sub	dh, ch  ; subtract upper row from lower row number
  1318 00001A33 FEC6                <1> 	inc	dh	; adjust difference by 1
  1319 00001A35 38C6                <1> 	cmp	dh, al 	; line count = amount of rows in window?
  1320 00001A37 7502                <1> 	jne	short al_set1 ; if not the we're all set
  1321 00001A39 30C0                <1> 	xor	al, al	; otherwise set al to zero
  1322                              <1> al_set1:
  1323 00001A3B 665A                <1> 	pop	dx
  1324                              <1> al_set2:
  1325 00001A3D C3                  <1> 	retn
  1326                              <1> 
  1327                              <1> scroll_position:
  1328                              <1> 	; 26/06/2016
  1329                              <1> 	; 30/01/2016
  1330                              <1>         ; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1331                              <1> 	; 07/09/2014 (scroll_up)
  1332                              <1> 
  1333 00001A3E 6652                <1> 	push	dx
  1334 00001A40 6689CA              <1> 	mov	dx, cx	; now, upper left position in DX
  1335 00001A43 E8EEFEFFFF          <1> 	call	position
  1336 00001A48 01C6                <1> 	add	esi, eax
  1337 00001A4A 89F7                <1> 	mov	edi, esi
  1338 00001A4C 665A                <1> 	pop	dx	; lower right position in DX
  1339 00001A4E 6629CA              <1> 	sub	dx, cx
  1340 00001A51 FEC6                <1> 	inc	dh	; dh = #rows 
  1341 00001A53 FEC2                <1> 	inc	dl	; dl = #cols in block
  1342 00001A55 59                  <1> 	pop	ecx 	; return address
  1343 00001A56 6658                <1> 	pop	ax	; * ; al = line count, ah = attribute
  1344 00001A58 51                  <1> 	push	ecx	; return address
  1345 00001A59 0FB7C8              <1> 	movzx	ecx, ax
  1346 00001A5C 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS]
  1347 00001A62 F6E4                <1> 	mul	ah	; determine offset to from address
  1348 00001A64 6601C0              <1> 	add	ax, ax  ; *2 for attribute byte
  1349                              <1> 	;
  1350 00001A67 6650                <1> 	push	ax	; offset 
  1351 00001A69 6652                <1> 	push	dx
  1352                              <1> 	;
  1353                              <1> 	; 04/04/2014
  1354 00001A6B 66BADA03            <1> 	mov	dx, 3DAh ; guaranteed to be color card here	
  1355                              <1> n9:                      ; wait_display_enable
  1356 00001A6F EC                  <1>         in      al, dx   ; get port
  1357 00001A70 A808                <1> 	test	al, RVRT ; wait for vertical retrace	
  1358 00001A72 74FB                <1> 	jz	short n9 ; wait_display_enable
  1359 00001A74 B025                <1> 	mov	al, 25h
  1360 00001A76 B2D8                <1> 	mov	dl, 0D8h ; address control port
  1361 00001A78 EE                  <1> 	out	dx, al	; turn off video during vertical retrace
  1362 00001A79 665A                <1> 	pop	dx	; #rows, #cols
  1363 00001A7B 6658                <1>        	pop	ax	; offset
  1364 00001A7D 6691                <1> 	xchg	ax, cx	; 
  1365                              <1> 	; ecx = offset, al = line count, ah = attribute
  1366                              <1> 	;
  1367 00001A7F 08C0                <1> 	or	al, al
  1368 00001A81 C3                  <1> 	retn
  1369                              <1> n10:
  1370                              <1> 	; Move rows
  1371 00001A82 88D1                <1> 	mov	cl, dl	; get # of cols to move
  1372 00001A84 56                  <1> 	push	esi
  1373 00001A85 57                  <1> 	push	edi	; save start address
  1374                              <1> n10r:
  1375 00001A86 66A5                <1> 	movsw		; move that line on screen
  1376 00001A88 FEC9                <1> 	dec	cl
  1377 00001A8A 75FA                <1>         jnz     short n10r
  1378 00001A8C 5F                  <1> 	pop	edi
  1379 00001A8D 5E                  <1> 	pop	esi	; recover addresses
  1380 00001A8E C3                  <1> 	retn
  1381                              <1> n11:
  1382                              <1> 	; Clear rows
  1383                              <1>                 	; dh =  #rows
  1384 00001A8F 88D1                <1>         mov	cl, dl	; get # of cols to clear
  1385 00001A91 57                  <1>         push    edi     ; save address
  1386                              <1> n11r:
  1387 00001A92 66AB                <1>         stosw           ; store fill character
  1388 00001A94 FEC9                <1> 	dec	cl
  1389 00001A96 75FA                <1>         jnz     short n11r
  1390 00001A98 5F                  <1>         pop     edi     ; recover address
  1391 00001A99 C3                  <1> 	retn
  1392                              <1> 
  1393                              <1> SCROLL_DOWN:
  1394                              <1> 	; 07/07/2016
  1395                              <1> 	; 27/06/2016
  1396                              <1> 	; 26/06/2016
  1397                              <1> 	; 12/05/2016
  1398                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1399                              <1> 	;
  1400                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1401                              <1> 
  1402                              <1> ;------------------------------------------
  1403                              <1> ; SCROLL DOWN
  1404                              <1> ;	THIS ROUTINE MOVES THE CHARACTERS WITHIN A DEFINED
  1405                              <1> ;	BLOCK DOWN ON THE SCREEN, FILLING THE TOP LINES
  1406                              <1> ;	WITH A DEFINED CHARACTER
  1407                              <1> ; INPUT
  1408                              <1> ;	(AH) = CURRENT CRT MODE
  1409                              <1> ;	(AL) = NUMBER OF LINES TO SCROLL
  1410                              <1> ;	(CX) = UPPER LEFT CORNER OF RECION
  1411                              <1> ;	(DX) = LOWER RIGHT CORNER OF REGION
  1412                              <1> ;	(BH) = FILL CHARACTER
  1413                              <1> ;	(DS) = DATA SEGMENT
  1414                              <1> ;	(ES) = REGEN SEGMENT
  1415                              <1> ; OUTPUT
  1416                              <1> ;	NONE -- SCREEN IS SCROLLED
  1417                              <1> ;------------------------------------------
  1418                              <1> 
  1419                              <1> 	; 07/07/2016
  1420 00001A9A 38F5                <1> 	cmp	ch, dh
  1421 00001A9C 0F8738FAFFFF        <1> 	ja	VIDEO_RETURN
  1422 00001AA2 38D1                <1> 	cmp	cl, dl
  1423 00001AA4 0F8730FAFFFF        <1> 	ja	VIDEO_RETURN
  1424                              <1> 	;
  1425 00001AAA E805000000          <1> 	call	_scroll_down
  1426 00001AAF E926FAFFFF          <1>         jmp     VIDEO_RETURN
  1427                              <1> 
  1428                              <1> _scroll_down: ; 27/06/2016
  1429                              <1> 
  1430                              <1> 	; cl = left upper column
  1431                              <1> 	; ch = left upper row
  1432                              <1> 	; dl = right lower column
  1433                              <1> 	; dh = right lower row
  1434                              <1> 	;
  1435                              <1> 	; al = line count 
  1436                              <1> 	; bl = attribute to be used on blanked line	
  1437                              <1> 	; bh = video page number (0 to 7)
  1438                              <1> 
  1439                              <1> 	; !!!!
  1440 00001AB4 FD                  <1> 	std		; DIRECTION FOR SCROLL DOWN
  1441                              <1> 	; !!!!
  1442 00001AB5 E871FFFFFF          <1> 	call	test_line_count ; 16/01/2016
  1443                              <1> 	
  1444 00001ABA 8A25[EEF70000]      <1> 	mov	ah, [CRT_MODE] ; current video mode	
  1445                              <1> 	;cmp	ah, 4
  1446                              <1>  	;jb	short _n0
  1447                              <1> 	;cmp	byte [CRT_MODE], 4
  1448 00001AC0 80FC04              <1>         cmp	ah, 4 ; 07/07/2016
  1449 00001AC3 0F83DF070000        <1> 	jnb     GRAPHICS_DOWN ; 26/06/2016
  1450                              <1> 
  1451                              <1> 	;cmp	ah, 7 ; TEST FOR BW CARD
  1452                              <1> 	;jne	GRAPHICS_DOWN
  1453                              <1> _n0:
  1454                              <1> 	; 07/07/2016
  1455 00001AC9 80FF07              <1> 	cmp	bh, 7 ; video page number
  1456 00001ACC 7606                <1> 	jna	short n12
  1457 00001ACE 8A3D[0E310100]      <1> 	mov	bh, [ACTIVE_PAGE]
  1458                              <1> 	;
  1459                              <1> n12:			; CONTINUE_DOWN
  1460 00001AD4 88DC                <1> 	mov	ah, bl
  1461 00001AD6 6650                <1> 	push	ax	; * ; save attribute in ah
  1462 00001AD8 6689D0              <1> 	mov	ax, dx	; LOWER RIGHT CORNER
  1463 00001ADB E85EFFFFFF          <1> 	call	scroll_position	; GET REGEN LOCATION
  1464 00001AE0 741F                <1> 	jz	short n14
  1465 00001AE2 29CE                <1> 	sub	esi, ecx  ; SI IS FROM ADDRESS
  1466 00001AE4 88F5                <1> 	mov	ch, dh  ; #rows in block
  1467 00001AE6 28C5                <1> 	sub	ch, al	; #rows to be moved
  1468                              <1> n13:
  1469 00001AE8 E895FFFFFF          <1> 	call	n10	; MOVE ONE ROW
  1470                              <1> 
  1471 00001AED 51                  <1> 	push	ecx
  1472 00001AEE 8A0D[F0F70000]      <1> 	mov	cl, [CRT_COLS] 
  1473 00001AF4 00C9                <1> 	add	cl, cl
  1474 00001AF6 29CE                <1>         sub	esi, ecx  ; next line
  1475 00001AF8 29CF                <1>         sub	edi, ecx
  1476 00001AFA 59                  <1>         pop	ecx
  1477                              <1> 	
  1478 00001AFB FECD                <1> 	dec	ch	 ; count of lines to move
  1479 00001AFD 75E9                <1> 	jnz	short n13 ; row loop
  1480                              <1> 	; ch = 0
  1481 00001AFF 88C6                <1> 	mov	dh, al	 ; #rows
  1482                              <1> n14:
  1483                              <1> 	; attribute in ah
  1484 00001B01 B020                <1> 	mov	al, ' '	 ; fill with blanks
  1485                              <1> n15:
  1486 00001B03 E887FFFFFF          <1> 	call	n11 ; 16/01/2016
  1487                              <1> 
  1488 00001B08 8A0D[F0F70000]      <1> 	mov	cl, [CRT_COLS]
  1489 00001B0E 00C9                <1> 	add	cl, cl
  1490 00001B10 29CF                <1>         sub	edi, ecx
  1491                              <1>         
  1492 00001B12 FECE                <1> 	dec	dh
  1493 00001B14 75ED                <1> 	jnz	short n15
  1494                              <1> 	;
  1495 00001B16 E9FDFEFFFF          <1> 	jmp	n16 ; 27/06/2016
  1496                              <1> 
  1497                              <1> ;	cmp	bh, [ACTIVE_PAGE]
  1498                              <1> ;	jne	short n16
  1499                              <1> ;
  1500                              <1> ;	;cmp	byte [CRT_MODE], 7	; is this the black and white card
  1501                              <1> ;	;je	short n16		; if so, skip the mode reset
  1502                              <1> ;
  1503                              <1> ;	mov	al, [CRT_MODE_SET] ; get the value of mode set
  1504                              <1> ;	mov	dx, 03D8h ; always set color card port
  1505                              <1> ;	out	dx, al
  1506                              <1> ;n16:
  1507                              <1> ;	; !!!!
  1508                              <1> ;	cld		; Clear direction flag !
  1509                              <1> ;	; !!!!
  1510                              <1> ;	retn
  1511                              <1> 
  1512                              <1> READ_AC_CURRENT:
  1513                              <1> 	; 08/07/2016
  1514                              <1> 	; 26/06/2016
  1515                              <1> 	; 12/05/2016
  1516                              <1> 	; 18/01/2016
  1517                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1518                              <1> 	;
  1519                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1520                              <1> 	;
  1521                              <1> 	; 08/07/2016
  1522 00001B1B 803D[EEF70000]07    <1>         cmp     byte [CRT_MODE], 7 ; 6!?
  1523 00001B22 7607                <1> 	jna	short read_ac_c
  1524 00001B24 31C0                <1> 	xor	eax, eax
  1525 00001B26 E9B4F9FFFF          <1>         jmp     _video_return 
  1526                              <1> read_ac_c:
  1527 00001B2B E805000000          <1> 	call	_read_ac_current
  1528                              <1> 	; 12/05/2016
  1529                              <1>         ;jmp     VIDEO_RETURN
  1530 00001B30 E9AAF9FFFF          <1> 	jmp	_video_return
  1531                              <1> 
  1532                              <1> ;------------------------------------------------------------------------
  1533                              <1> ; READ_AC_CURRENT							:
  1534                              <1> ;	THIS ROUTINE READS THE ATTRIBUTE AND CHARACTER AT THE CURRENT	:
  1535                              <1> ;	CURSOR POSITION AND RETURNS THEM TO THE CALLER			:
  1536                              <1> ; INPUT									:
  1537                              <1> ;	(AH) = CURRENT CRT MODE						:
  1538                              <1> ;	(BH) = DISPLAY PAGE ( ALPHA MODES ONLY )			:
  1539                              <1> ;	(DS) = DATA SEGMENT						:
  1540                              <1> ;	(ES) = REGEN SEGMENT						:
  1541                              <1> ; OUTPUT								:
  1542                              <1> ;	(AL) = CHARACTER READ						:
  1543                              <1> ;	(AH) = ATTRIBUTE READ						:
  1544                              <1> ;------------------------------------------------------------------------
  1545                              <1> 
  1546                              <1> _read_ac_current:
  1547                              <1> 	; 26/06/2016
  1548                              <1> 	; 12/05/2016 
  1549                              <1> 	; 18/01/2016
  1550                              <1> 
  1551                              <1> 	;mov	ah, [CRT_MODE] ; current video mode	
  1552                              <1> 	;cmp	ah, 4
  1553                              <1>  	;jb	short p10
  1554 00001B35 803D[EEF70000]04    <1> 	cmp	byte [CRT_MODE], 4
  1555 00001B3C 0F83BB080000        <1> 	jnb     GRAPHICS_READ ; 26/06/2016
  1556                              <1> 
  1557                              <1> 	;cmp	ah, 7 ; TEST FOR BW CARD
  1558                              <1> 	;jne	GRAPHICS_READ
  1559                              <1> p10:
  1560 00001B42 E801FEFFFF          <1> 	call	find_position	; GET REGEN LOCATION AND PORT ADDRESS
  1561                              <1> 	;
  1562                              <1> 	; esi = regen location
  1563                              <1> 	; dx = status port
  1564                              <1> 	;
  1565 00001B47 8A25[EEF70000]      <1> 	mov	ah, [CRT_MODE]	
  1566 00001B4D 80EC02              <1> 	sub	ah, 2
  1567 00001B50 D0EC                <1> 	shr	ah, 1
  1568 00001B52 7515                <1> 	jnz	short p13
  1569                              <1> 
  1570                              <1> 	; WAIT FOR HORIZONTAL RETRACE OR VERTICAL RETRACE IF COLOR 80
  1571                              <1> p11:
  1572 00001B54 FB                  <1> 	sti		; enable interrupts first
  1573 00001B55 3A3D[0E310100]      <1> 	cmp     bh, [ACTIVE_PAGE]
  1574 00001B5B 750C                <1> 	jne	short p13 
  1575 00001B5D FA                  <1> 	cli 		; block interrupts for single loop
  1576 00001B5E EC                  <1> 	in	al, dx	; get status from the adapter
  1577 00001B5F A801                <1> 	test	al, RHRZ ; is horizontal retrace low
  1578 00001B61 75F1                <1> 	jnz	short p11 ; wait until it is
  1579                              <1> p12:			;  wait for either retrace high
  1580 00001B63 EC                  <1> 	in	al, dx ; get status again
  1581 00001B64 A809                <1> 	test	al, RVRT+RHRZ ; is horizontal or vertical retrace high
  1582 00001B66 74FB                <1> 	jz	short p12 ; wait until either retrace active
  1583 00001B68 FB                  <1> 	sti
  1584                              <1> p13:
  1585 00001B69 81C600800B00        <1> 	add	esi, 0B8000h 
  1586 00001B6F 668B06              <1> 	mov	ax, [esi]
  1587                              <1> 
  1588 00001B72 C3                  <1> 	retn	; 18/01/2016
  1589                              <1> 
  1590                              <1> WRITE_AC_CURRENT:
  1591                              <1> 	; 08/07/2016
  1592                              <1> 	; 26/06/2016
  1593                              <1> 	; 24/06/2016
  1594                              <1> 	; 12/05/2016
  1595                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1596                              <1> 	;
  1597                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1598                              <1> 	;
  1599                              <1> ;----------------------------------------------------------------
  1600                              <1> ; WRITE_AC_CURRENT						:
  1601                              <1> ;	THTS ROUTINE WRITES THE ATTRIBUTE AND CHARACTER		:
  1602                              <1> ;	AT THE CURRENT CURSOR POSITION				:
  1603                              <1> ; INPUT								:
  1604                              <1> ;	(AH) = CURRENT CRT MODE					:
  1605                              <1> ;	(BH) = DISPLAY PAGE					:
  1606                              <1> ;	(CX) = COUNT OF CHARACTERS TO WRITE			:
  1607                              <1> ;	(AL) = CHAR TO WRITE					:
  1608                              <1> ;	(BL) = ATTRIBUTE OF CHAR TO WRITE			:
  1609                              <1> ;	(DS) = DATA SEGMENT					:
  1610                              <1> ;	(ES) = REGEN SEGMENT					:
  1611                              <1> ; OUTPUT							:
  1612                              <1> ;	DISPLAY REGEN BUFFER UPDATED				:
  1613                              <1> ;----------------------------------------------------------------
  1614                              <1> 
  1615                              <1> 	; 08/07/2016
  1616 00001B73 803D[EEF70000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6!?
  1617 00001B7A 760A                <1> 	jna	short write_ac_c
  1618                              <1> 
  1619 00001B7C E8F20A0000          <1> 	call	vga_write_char_attr
  1620 00001B81 E954F9FFFF          <1> 	jmp     VIDEO_RETURN	
  1621                              <1> 
  1622                              <1> write_ac_c:
  1623 00001B86 E834000000          <1> 	call	_write_c_current
  1624                              <1> 
  1625 00001B8B 0FB6F7              <1> 	movzx	esi, bh ; video page number (0 to 7)	
  1626 00001B8E 889E[F7F70000]      <1> 	mov	[esi+chr_attrib], bl ; color/attribute
  1627                              <1> 
  1628 00001B94 E941F9FFFF          <1>         jmp     VIDEO_RETURN
  1629                              <1> 
  1630                              <1> WRITE_C_CURRENT:
  1631                              <1> 	; 08/07/2016
  1632                              <1> 	; 26/06/2016
  1633                              <1> 	; 12/05/2016
  1634                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1635                              <1> 	;
  1636                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1637                              <1> 	;
  1638                              <1> ;----------------------------------------------------------------
  1639                              <1> ; WRITE_C_CURRENT						:
  1640                              <1> ;	THIS ROUTINE WRITES THE CHARACTER AT			:
  1641                              <1> ;	THE CURRENT CURSOR POSITION, ATTRIBUTE UNCHANGED	:
  1642                              <1> ; INPUT								:
  1643                              <1> ;	(AH) = CURRENT CRT MODE					:
  1644                              <1> ;	(BH) = DISPLAY PAGE					:
  1645                              <1> ;	(CX) = COUNT OF CHARACTERS TO WRITE			:
  1646                              <1> ;	(AL) = CHAR TO WRITE					:
  1647                              <1> ;	(DS) = DATA SEGMENT					:
  1648                              <1> ;	(ES) = REGEN SEGMENT					:
  1649                              <1> ; OUTPUT							:
  1650                              <1> ;	DISPLAY REGEN BUFFER UPDATED				:
  1651                              <1> ;----------------------------------------------------------------
  1652                              <1> 
  1653                              <1> 	; 08/07/2016
  1654 00001B99 803D[EEF70000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6!?
  1655 00001BA0 760A                <1> 	jna	short write_c_c
  1656                              <1> 
  1657 00001BA2 E8CC0A0000          <1> 	call	vga_write_char_only
  1658 00001BA7 E92EF9FFFF          <1> 	jmp     VIDEO_RETURN	
  1659                              <1> 
  1660                              <1> write_c_c:
  1661                              <1> 	;and	bh, 7 ; video page number (<= 7)
  1662 00001BAC 0FB6F7              <1> 	movzx	esi, bh	
  1663 00001BAF 8A9E[F7F70000]      <1> 	mov	bl, [esi+chr_attrib]
  1664                              <1> 
  1665 00001BB5 E805000000          <1> 	call	_write_c_current
  1666 00001BBA E91BF9FFFF          <1>         jmp     VIDEO_RETURN
  1667                              <1> 
  1668                              <1> _write_c_current:  ; from 'write_tty'
  1669                              <1> 	; 26/06/2016
  1670                              <1> 	; 24/06/2016
  1671                              <1> 	; 12/05/2016
  1672                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1673                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  1674                              <1> 	; 18/01/2014
  1675                              <1> 	; 04/12/2013
  1676                              <1> 	;
  1677                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1678                              <1> 
  1679                              <1> 	;mov	ah, [CRT_MODE] ; current video mode	
  1680                              <1> 	;cmp	ah, 4
  1681                              <1>  	;jb	short p40
  1682 00001BBF 803D[EEF70000]04    <1> 	cmp	byte [CRT_MODE], 4
  1683 00001BC6 0F8381070000        <1>         jnb     GRAPHICS_WRITE ; 26/06/2016
  1684                              <1> 
  1685                              <1> 	;cmp	ah, 7 ; TEST FOR BW CARD
  1686                              <1> 	;jne	GRAPHICS_WRITE
  1687                              <1> p40:
  1688                              <1> 	; al = character
  1689                              <1> 	; bl = color/attribute
  1690                              <1> 	; bh = video page
  1691                              <1> 	; cx = count of characters to write
  1692 00001BCC 6652                <1> 	push	dx
  1693 00001BCE 88DC                <1> 	mov	ah, bl  ; color/attribute (12/05/2016)
  1694 00001BD0 6650                <1> 	push	ax	; save character & attribute/color
  1695 00001BD2 6651                <1> 	push	cx
  1696 00001BD4 E86FFDFFFF          <1> 	call 	find_position  ; get regen location and port address
  1697 00001BD9 6659                <1> 	pop	cx
  1698                              <1> 	; esi = regen location
  1699                              <1> 	; dx = status port
  1700                              <1> 	;
  1701 00001BDB 81C600800B00        <1> 	add	esi, 0B8000h ; 30/08/2014 (crt_base) 
  1702                              <1> 	;
  1703 00001BE1 8A25[EEF70000]      <1> 	mov	ah, [CRT_MODE]	
  1704 00001BE7 80EC02              <1> 	sub	ah, 2
  1705 00001BEA D0EC                <1> 	shr	ah, 1
  1706 00001BEC 7519                <1> 	jnz	short p44    ; 26/06/2016
  1707                              <1> 
  1708                              <1> 	; WAIT FOR HORIZONTAL RETRACE OR VERTICAL RETRACE IF COLOR 80
  1709                              <1> p41:
  1710 00001BEE FB                  <1> 	sti		; enable interrupts first
  1711 00001BEF 3A3D[0E310100]      <1> 	cmp     bh, [ACTIVE_PAGE]
  1712 00001BF5 7510                <1> 	jne	short p44 
  1713 00001BF7 FA                  <1> 	cli 		; block interrupts for single loop
  1714 00001BF8 EC                  <1> 	in	al, dx	; get status from the adapter
  1715 00001BF9 A808                <1> 	test	al, RVRT ; check for vertical retrace first
  1716 00001BFB 7509                <1> 	jnz	short p43 ; Do fast write now if vertical retrace
  1717 00001BFD A801                <1> 	test	al, RHRZ ; is horizontal retrace low
  1718 00001BFF 75ED                <1> 	jnz	short p41 ; wait until it is
  1719                              <1> p42:			;  wait for either retrace high
  1720 00001C01 EC                  <1> 	in	al, dx ; get status again
  1721 00001C02 A809                <1> 	test	al, RVRT+RHRZ ; is horizontal or vertical retrace high
  1722 00001C04 74FB                <1> 	jz	short p42 ; wait until either retrace active
  1723                              <1> p43:	
  1724 00001C06 FB                  <1> 	sti
  1725                              <1> p44:
  1726 00001C07 668B0424            <1> 	mov	ax, [esp] ; restore the character (al) & attribute (ah)
  1727 00001C0B 668906              <1> 	mov	[esi], ax
  1728                              <1> 
  1729 00001C0E 6649                <1> 	dec	cx
  1730 00001C10 7404                <1> 	jz	short p45
  1731                              <1> 
  1732 00001C12 46                  <1> 	inc	esi
  1733 00001C13 46                  <1> 	inc	esi
  1734 00001C14 EBD8                <1> 	jmp	short p41
  1735                              <1> p45:	
  1736 00001C16 6658                <1> 	pop	ax
  1737 00001C18 665A                <1> 	pop	dx
  1738 00001C1A C3                  <1> 	retn
  1739                              <1> 
  1740                              <1> ; 09/07/2016
  1741                              <1> ; 26/06/2016
  1742                              <1> ; 24/06/2016
  1743                              <1> ; 12/05/2016
  1744                              <1> ; 18/01/2016
  1745                              <1> ; 16/01/2016 - TRDOS 386 (TRDOS v2.0)
  1746                              <1> ; 30/06/2015
  1747                              <1> ; 27/06/2015
  1748                              <1> ; 11/03/2015
  1749                              <1> ; 02/09/2014
  1750                              <1> ; 30/08/2014
  1751                              <1> ; VIDEO FUNCTIONS
  1752                              <1> ; (write_tty - Retro UNIX 8086 v1 - U9.ASM, 01/02/2014)
  1753                              <1> 
  1754                              <1> WRITE_TTY:
  1755                              <1> 	; 09/07/2016
  1756                              <1> 	; 01/07/2016
  1757                              <1> 	; 26/06/2016
  1758                              <1> 	; 24/06/2016
  1759                              <1> 	; 13/05/2016
  1760                              <1> 	; 12/05/2016
  1761                              <1> 	; 30/01/2016
  1762                              <1> 	; 18/01/2016
  1763                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1764                              <1> 	; 13/08/2015
  1765                              <1> 	; 02/09/2014
  1766                              <1> 	; 30/08/2014 (Retro UNIX 386 v1 - beginning)
  1767                              <1> 	; 01/02/2014 (Retro UNIX 8086 v1 - last update)
  1768                              <1> 	; 03/12/2013 (Retro UNIX 8086 v1 - beginning)	
  1769                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, ESI, EDI)
  1770                              <1> 	;
  1771                              <1> 	; INPUT -> AL = Character to be written
  1772                              <1> 	;	   BL = Color (Forecolor, Backcolor)
  1773                              <1> 	;	   BH = Video Page (0 to 7)
  1774                              <1> 
  1775                              <1> 	; 09/07/2016
  1776 00001C1B 803D[EEF70000]07    <1>         cmp     byte [CRT_MODE], 7
  1777 00001C22 760A                <1> 	jna 	short write_tty_cga
  1778                              <1> 
  1779 00001C24 E8290D0000          <1> 	call	vga_write_teletype
  1780 00001C29 E9ACF8FFFF          <1> 	jmp	VIDEO_RETURN
  1781                              <1> 
  1782                              <1> write_tty_cga:
  1783                              <1> 	; 13/05/2016
  1784                              <1> 	;call	_write_tty
  1785                              <1> 	; 01/07/2016
  1786 00001C2E E818000000          <1> 	call	_write_tty_m3
  1787 00001C33 E9A2F8FFFF          <1> 	jmp	VIDEO_RETURN
  1788                              <1> 
  1789                              <1> RVRT	equ	00001000b	; VIDEO VERTICAL RETRACE BIT
  1790                              <1> RHRZ	equ	00000001b	; VIDEO HORIZONTAL RETRACE BIT
  1791                              <1> 
  1792                              <1> ; Derived from "WRITE_TTY" procedure of IBM "pc-at" rombios source code
  1793                              <1> ; (06/10/1985), 'video.asm', INT 10H, VIDEO_IO
  1794                              <1> ;
  1795                              <1> ; 06/10/85  VIDEO DISPLAY BIOS
  1796                              <1> ;
  1797                              <1> ;--- WRITE_TTY ------------------------------------------------------------------
  1798                              <1> ;										:
  1799                              <1> ;   THIS INTERFACE PROVIDES A TELETYPE LIKE INTERFACE TO THE			:
  1800                              <1> ;   VIDEO CARDS. THE INPUT CHARACTER IS WRITTEN TO THE CURRENT			:
  1801                              <1> ;   CURSOR POSITION, AND THE CURSOR IS MOVED TO THE NEXT POSITION.		:
  1802                              <1> ;   IF THE CURSOR LEAVES THE LAST COLUMN OF THE FIELD, THE COLUMN		:
  1803                              <1> ;   IS SET TO ZERO, AND THE ROW VALUE IS INCREMENTED. IF THE ROW		:
  1804                              <1> ;   ROW VALUE LEAVES THE FIELD, THE CURSOR IS PLACED ON THE LAST ROW,		:
  1805                              <1> ;   FIRST COLUMN, AND THE ENTIRE SCREEN IS SCROLLED UP ONE LINE.		:
  1806                              <1> ;   WHEN THE SCREEN IS SCROLLED UP, THE ATTRIBUTE FOR FILLING THE		:
  1807                              <1> ;   NEWLY BLANKED LINE IS READ FROM THE CURSOR POSITION ON THE PREVIOUS		:
  1808                              <1> ;   LINE BEFORE THE SCROLL, IN CHARACTER MODE. IN GRAPHICS MODE,		:
  1809                              <1> ;   THE 0 COLOR IS USED.							:
  1810                              <1> ;   ENTRY --									:
  1811                              <1> ;     (AH) = CURRENT CRT MODE							:
  1812                              <1> ;     (AL) = CHARACTER TO BE WRITTEN						:
  1813                              <1> ;	    NOTE THAT BACK SPACE, CARRIAGE RETURN, BELL AND LINE FEED ARE	:
  1814                              <1> ;	    HANDLED AS COMMANDS RATHER THAN AS DISPLAY GRAPHICS CHARACTERS	:
  1815                              <1> ;     (BL) = FOREGROUND COLOR FOR CHAR WRITE IF CURRENTLY IN A GRAPHICS MODE	:
  1816                              <1> ;   EXIT -- 									:
  1817                              <1> ;     ALL REGISTERS SAVED							:
  1818                              <1> ;--------------------------------------------------------------------------------
  1819                              <1> 
  1820                              <1> ; 08/07/2016
  1821                              <1> ; 26/06/2016
  1822                              <1> ; 24/06/2016
  1823                              <1> _write_tty:	; 13/05/2016
  1824 00001C38 FA                  <1> 	cli
  1825                              <1> 	;
  1826                              <1> 	; 01/09/2014
  1827 00001C39 803D[EEF70000]03    <1> 	cmp	byte [CRT_MODE], 3
  1828 00001C40 7409                <1> 	je	short _write_tty_m3
  1829                              <1> 	;
  1830                              <1> set_mode_3:
  1831 00001C42 53                  <1> 	push	ebx
  1832 00001C43 50                  <1> 	push	eax
  1833 00001C44 E8A2F8FFFF          <1> 	call	_set_mode
  1834 00001C49 58                  <1> 	pop	eax
  1835 00001C4A 5B                  <1> 	pop	ebx
  1836                              <1> 	;
  1837                              <1> _write_tty_m3: ; 24/06/2016 (m3 -> _write_tty_m3)
  1838 00001C4B 0FB6F7              <1> 	movzx 	esi, bh ; 12/05/2016
  1839 00001C4E 66D1E6              <1> 	shl	si, 1
  1840 00001C51 81C6[FE300100]      <1> 	add	esi, CURSOR_POSN
  1841 00001C57 668B16              <1> 	mov	dx, [esi]
  1842                              <1> 	;
  1843                              <1> 	; dx now has the current cursor position
  1844                              <1> 	;
  1845 00001C5A 3C0D                <1> 	cmp	al, 0Dh	; CR	; is it carriage return or control character
  1846 00001C5C 7636                <1> 	jbe	short u8
  1847                              <1> 	;
  1848                              <1> 	; write the char to the screen
  1849                              <1> u0:	
  1850                              <1> 	; al = character
  1851                              <1> 	; bl = attribute/color
  1852                              <1> 	; bh = video page number (0 to 7)
  1853                              <1> 	;
  1854 00001C5E 66B90100            <1> 	mov	cx, 1  ; 24/06/2016
  1855                              <1> 	; cx = count of characters to write
  1856                              <1> 	;
  1857 00001C62 E858FFFFFF          <1> 	call	_write_c_current ; 16/01/2015
  1858                              <1> 	;
  1859                              <1> 	; position the cursor for next char
  1860 00001C67 FEC2                <1> 	inc	dl		; next column
  1861 00001C69 3A15[F0F70000]      <1> 	cmp	dl, [CRT_COLS]  ; test for column overflow 
  1862 00001C6F 755D                <1>         jne     _set_cpos
  1863 00001C71 B200                <1> 	mov	dl, 0		; column = 0
  1864                              <1> u10:				; (line feed found)
  1865 00001C73 80FE18              <1> 	cmp	dh, 25-1 	; check for last row
  1866 00001C76 7218                <1> 	jb 	short u6
  1867                              <1> 	;
  1868                              <1> 	; scroll required
  1869                              <1> u1:	
  1870                              <1> 	; SET CURSOR POSITION (04/12/2013)
  1871 00001C78 E851000000          <1> 	call	_set_cpos
  1872                              <1> 	;
  1873                              <1> 	; determine value to fill with during scroll
  1874                              <1> u2:
  1875                              <1> 	; bh = video page number
  1876                              <1> 	;
  1877 00001C7D E8B3FEFFFF          <1> 	call	_read_ac_current ; 18/01/2016
  1878                              <1> 	;
  1879                              <1> 	; al = character, ah = attribute
  1880                              <1> 	; bh = video page number 	
  1881                              <1> u3:
  1882                              <1> 	;;mov	ax, 0601h 	; scroll one line
  1883                              <1> 	;;sub	cx, cx		; upper left corner
  1884                              <1> 	;;mov	dh, 25-1 	; lower right row
  1885                              <1> 	;;;mov	dl, [CRT_COLS]
  1886                              <1> 	;mov	dl, 80		; lower right column	
  1887                              <1> 	;;dec	dl
  1888                              <1> 	;;mov	dl, 79
  1889                              <1> 
  1890                              <1> 	;;call	scroll_up	; 04/12/2013
  1891                              <1> 	;;; 11/03/2015
  1892                              <1> 	; 02/09/2014
  1893                              <1> 	;;;mov	cx, [crt_ulc] ; Upper left corner  (0000h)
  1894                              <1> 	;;;mov	dx, [crt_lrc] ; Lower right corner (184Fh)
  1895                              <1> 	; 11/03/2015
  1896 00001C82 6629C9              <1> 	sub	cx, cx
  1897 00001C85 66BA4F18            <1> 	mov	dx, 184Fh ; dl = 79 (column), dh = 24 (row)
  1898                              <1> 	;
  1899 00001C89 B001                <1> 	mov	al, 1		; scroll 1 line up
  1900                              <1> 		; ah = attribute
  1901                              <1> 	;mov	bl, al ; 12/05/2016
  1902 00001C8B E900FDFFFF          <1> 	jmp	_scroll_up	; 16/01/2016
  1903                              <1> ;u4:
  1904                              <1> 	;;int	10h		; video-call return
  1905                              <1> 				; scroll up the screen
  1906                              <1> 				; tty return
  1907                              <1> ;u5:
  1908                              <1> 	;retn			; return to the caller
  1909                              <1> 
  1910                              <1> u6:				; set-cursor-inc
  1911 00001C90 FEC6                <1> 	inc	dh		; next row
  1912                              <1> 				; set cursor
  1913                              <1> ;u7:					
  1914                              <1> 	;;mov	ah, 02h
  1915                              <1> 	;;jmp	short u4 	; establish the new cursor
  1916                              <1> 	;call	_set_cpos
  1917                              <1> 	;jmp 	short u5
  1918 00001C92 EB3A                <1> 	jmp     _set_cpos
  1919                              <1> 
  1920                              <1> 	; check for control characters
  1921                              <1> u8:
  1922 00001C94 7436                <1> 	je	short u9
  1923 00001C96 3C0A                <1> 	cmp	al, 0Ah		; is it a line feed (0Ah)
  1924 00001C98 74D9                <1> 	je	short u10
  1925 00001C9A 3C07                <1> 	cmp	al, 07h 	; is it a bell
  1926 00001C9C 747A                <1> 	je	short u11
  1927 00001C9E 3C08                <1> 	cmp	al, 08h		; is it a backspace
  1928                              <1> 	;jne	short u0
  1929 00001CA0 7422                <1> 	je	short bs	; 12/12/2013
  1930                              <1> 	; 12/12/2013 (tab stop)
  1931 00001CA2 3C09                <1> 	cmp	al, 09h		; is it a tab stop
  1932 00001CA4 75B8                <1> 	jne	short u0
  1933 00001CA6 88D0                <1> 	mov	al, dl
  1934 00001CA8 6698                <1> 	cbw
  1935 00001CAA B108                <1> 	mov	cl, 8
  1936 00001CAC F6F1                <1> 	div	cl
  1937 00001CAE 28E1                <1> 	sub	cl, ah
  1938                              <1> ts:
  1939                              <1> 	; 02/09/2014
  1940                              <1> 	; 01/09/2014
  1941 00001CB0 B020                <1> 	mov	al, 20h
  1942                              <1> tsloop:
  1943 00001CB2 6651                <1> 	push	cx
  1944 00001CB4 6650                <1> 	push	ax
  1945                              <1> 	;mov	bh, [ACTIVE_PAGE]
  1946 00001CB6 E890FFFFFF          <1> 	call	_write_tty_m3 ; 24/06/2016 (m3 -> _write_tty_m3)
  1947 00001CBB 6658                <1> 	pop	ax  ; ah = attribute/color
  1948 00001CBD 6659                <1> 	pop	cx
  1949 00001CBF FEC9                <1> 	dec	cl
  1950 00001CC1 75EF                <1> 	jnz	short tsloop
  1951 00001CC3 C3                  <1> 	retn
  1952                              <1> bs:	
  1953                              <1> 	; back space found
  1954                              <1> 
  1955 00001CC4 08D2                <1> 	or	dl, dl 		; is it already at start of line
  1956                              <1> 	;je	short u7 	; set_cursor
  1957 00001CC6 7406                <1> 	jz	short _set_cpos
  1958 00001CC8 664A                <1> 	dec	dx     		; no -- just move it back
  1959                              <1> 	;jmp	short u7
  1960 00001CCA EB02                <1> 	jmp	short _set_cpos
  1961                              <1> 
  1962                              <1> 	; carriage return found
  1963                              <1> u9:
  1964 00001CCC B200                <1> 	mov	dl, 0 		; move to first column
  1965                              <1> 	;jmp	short u7
  1966                              <1> 	;jmp	short _set_cpos ; 30/01/2016
  1967                              <1> 
  1968                              <1> 	; line feed found
  1969                              <1> ;u10:
  1970                              <1> ;	cmp	dh, 25-1 	; bottom of screen
  1971                              <1> ;	jne	short u6 	; no, just set the cursor
  1972                              <1> ;       jmp     u1              ; yes, scroll the screen
  1973                              <1> 
  1974                              <1> _set_cpos:
  1975                              <1> 	; 12/05/2016 - TRDOS 386 (TRDOS v2.0)
  1976                              <1> 	; 27/06/2015
  1977                              <1> 	; 01/09/2014
  1978                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  1979                              <1> 	;
  1980                              <1> 	; 04/12/2013 - 12/12/2013 (Retro UNIX 8086 v1) 
  1981                              <1> 	;
  1982                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  1983                              <1> 	;
  1984                              <1> ;----------------------------------------------
  1985                              <1> ; SET_CPOS
  1986                              <1> ;	THIS ROUTINE SETS THE CURRENT CURSOR POSITION TO THE
  1987                              <1> ;	NEW X-Y VALUES PASSED
  1988                              <1> ; INPUT
  1989                              <1> ;	DX - ROW,COLUMN OF NEW CURSOR
  1990                              <1> ;	BH - DISPLAY PAGE OF CURSOR
  1991                              <1> ; OUTPUT
  1992                              <1> ;	CURSOR ID SET AT 6845 IF DISPLAY PAGE IS CURRENT DISPLAY
  1993                              <1> ;----------------------------------------------
  1994                              <1> 	;
  1995 00001CCE BE[FE300100]        <1> 	mov	esi, CURSOR_POSN
  1996 00001CD3 0FB6C7              <1>         movzx   eax, bh	; BH = video page number
  1997                              <1> ;	or	al, al
  1998                              <1> ;	jz	short _set_cpos_0
  1999 00001CD6 D0E0                <1>         shl     al, 1   ; word offset
  2000 00001CD8 01C6                <1>         add     esi, eax
  2001                              <1> ;_set_cpos_0:
  2002 00001CDA 668916              <1> 	mov	[esi], dx ; save the pointer
  2003 00001CDD 383D[0E310100]      <1> 	cmp	[ACTIVE_PAGE], bh
  2004 00001CE3 7532                <1> 	jne	short m17
  2005                              <1> 	;call	m18	; CURSOR SET
  2006                              <1> ;m17:			; SET_CPOS_RETURN
  2007                              <1> 	; 01/09/2014
  2008                              <1> ;	retn
  2009                              <1> 		; DX  = row/column
  2010                              <1> m18:
  2011 00001CE5 E84CFCFFFF          <1> 	call	position ; determine location in regen buffer	
  2012 00001CEA 668B0D[FC300100]    <1> 	mov	cx, [CRT_START]
  2013 00001CF1 6601C1              <1> 	add	cx, ax  ; add char position in regen buffer
  2014                              <1> 			; to the start address (offset) for this page
  2015 00001CF4 66D1E9              <1> 	shr	cx, 1	; divide by 2 for char only count
  2016 00001CF7 B40E                <1> 	mov	ah, 14	; register number for cursor
  2017                              <1> 	;call	m16	; output value to the 6845	
  2018                              <1> 	;retn
  2019                              <1> 
  2020                              <1> 	;-----	THIS ROUTINE OUTPUTS THE CX REGISTER
  2021                              <1> 	;	TO THE 6845 REGISTERS NAMED IN (AH)
  2022                              <1> m16:
  2023 00001CF9 FA                  <1> 	cli
  2024                              <1> 	;mov	dx, [addr_6845] ; address register
  2025 00001CFA 66BAD403            <1> 	mov 	dx, 03D4h ; I/O address of color card
  2026 00001CFE 88E0                <1> 	mov	al, ah	; get value
  2027 00001D00 EE                  <1> 	out	dx, al	; register set
  2028 00001D01 6642                <1> 	inc	dx	; data register
  2029 00001D03 EB00                <1> 	jmp	$+2	; i/o delay
  2030 00001D05 88E8                <1> 	mov	al, ch	; data
  2031 00001D07 EE                  <1> 	out	dx, al	
  2032 00001D08 664A                <1> 	dec	dx	
  2033 00001D0A 88E0                <1> 	mov	al, ah
  2034 00001D0C FEC0                <1> 	inc	al	; point to other data register
  2035 00001D0E EE                  <1> 	out	dx, al	; set for second register
  2036 00001D0F 6642                <1> 	inc	dx
  2037 00001D11 EB00                <1> 	jmp	$+2	; i/o delay
  2038 00001D13 88C8                <1> 	mov	al, cl	; second data value
  2039 00001D15 EE                  <1> 	out	dx, al
  2040 00001D16 FB                  <1> 	sti
  2041                              <1> m17:
  2042 00001D17 C3                  <1> 	retn
  2043                              <1> 
  2044                              <1> beeper: 
  2045                              <1> 	; 04/08/2016
  2046                              <1> 	; 12/05/2016 - TRDOS 386 (TRDOS v2.0)
  2047                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  2048                              <1> 	; 18/01/2014
  2049                              <1> 	; 03/12/2013
  2050                              <1> 	; bell found
  2051                              <1> u11:
  2052 00001D18 FB                  <1> 	sti
  2053 00001D19 3A3D[0E310100]      <1> 	cmp	bh, [ACTIVE_PAGE]
  2054 00001D1F 7551                <1> 	jne	short u12	; Do not sound the beep 
  2055                              <1> 				; if it is not written on the active page
  2056                              <1> beeper_gfx: ; 04/08/2016
  2057 00001D21 66B93305            <1> 	mov	cx, 1331 	; divisor for 896 hz tone
  2058 00001D25 B31F                <1> 	mov	bl, 31		; set count for 31/64 second for beep
  2059                              <1> 	;call	beep		; sound the pod bell
  2060                              <1> 	;jmp	short u5 	; tty_return
  2061                              <1> 	;retn
  2062                              <1> 	
  2063                              <1> TIMER	equ 	040h   		; 8254 TIMER - BASE ADDRESS
  2064                              <1> PORT_B	equ	061h		; PORT B READ/WRITE DIAGNOSTIC REGISTER
  2065                              <1> GATE2	equ	00000001b	; TIMER 2 INPUT CATE CLOCK BIT
  2066                              <1> SPK2	equ	00000010b	; SPEAKER OUTPUT DATA ENABLE BIT
  2067                              <1> 
  2068                              <1> beep:
  2069                              <1> 	; 07/02/2015
  2070                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  2071                              <1> 	; 18/01/2014
  2072                              <1> 	; 03/12/2013
  2073                              <1> 	;
  2074                              <1> 	; TEST4.ASM - 06/10/85  POST AND BIOS UTILITY ROUTINES
  2075                              <1> 	;
  2076                              <1> 	; ROUTINE TO SOUND THE BEEPER USING TIMER 2 FOR TONE
  2077                              <1> 	;
  2078                              <1> 	; ENTRY:
  2079                              <1> 	;    (BL) = DURATION COUNTER ( 1 FOR 1/64 SECOND )
  2080                              <1> 	;    (CX) = FREQUENCY DIVISOR (1193180/FREQUENCY) (1331 FOR 886 HZ)
  2081                              <1> 	; EXIT:				:
  2082                              <1> 	;    (AX),(BL),(CX) MODIFIED.
  2083                              <1> 
  2084 00001D27 9C                  <1> 	pushf  ; 18/01/2014	; save interrupt status
  2085 00001D28 FA                  <1> 	cli			; block interrupts during update
  2086 00001D29 B0B6                <1> 	mov	al, 10110110b	; select timer 2, lsb, msb binary
  2087 00001D2B E643                <1> 	out	TIMER+3, al 	; write timer mode register
  2088 00001D2D EB00                <1> 	jmp	$+2		; I/O delay
  2089 00001D2F 88C8                <1> 	mov	al, cl		; divisor for hz (low)
  2090 00001D31 E642                <1> 	out	TIMER+2,AL	; write timer 2 count - lsb
  2091 00001D33 EB00                <1> 	jmp	$+2		; I/O delay
  2092 00001D35 88E8                <1> 	mov	al, ch		; divisor for hz (high)
  2093 00001D37 E642                <1> 	out	TIMER+2, al	; write timer 2 count - msb
  2094 00001D39 E461                <1> 	in	al, PORT_B	; get current setting of port
  2095 00001D3B 88C4                <1> 	mov	ah, al		; save that setting
  2096 00001D3D 0C03                <1> 	or	al, GATE2+SPK2	; gate timer 2 and turn speaker on
  2097 00001D3F E661                <1> 	out	PORT_B, al	; and restore interrupt status
  2098                              <1> 	;popf	; 18/01/2014
  2099 00001D41 FB                  <1> 	sti
  2100                              <1> g7:				; 1/64 second per count (bl)
  2101 00001D42 B90B040000          <1> 	mov	ecx, 1035	; delay count for 1/64 of a second	
  2102 00001D47 E827000000          <1> 	call	waitf		; go to beep delay 1/64 count
  2103 00001D4C FECB                <1> 	dec	bl		; (bl) length count expired?
  2104 00001D4E 75F2                <1> 	jnz	short g7	; no - continue beeping speaker
  2105                              <1> 	;
  2106                              <1> 	;pushf			; save interrupt status
  2107 00001D50 FA                  <1> 	cli  	; 18/01/2014	; block interrupts during update
  2108 00001D51 E461                <1> 	in	al, PORT_B	; get current port value
  2109                              <1>         ;or      al, not (GATE2+SPK2) ; isolate current speaker bits in case
  2110 00001D53 0CFC                <1>         or      al, ~(GATE2+SPK2)
  2111 00001D55 20C4                <1>         and	ah, al		; someone turned them off during beep
  2112 00001D57 88E0                <1> 	mov	al, ah		; recover value of port
  2113                              <1>         ;or      al, not (GATE2+SPK2) ; force speaker data off
  2114 00001D59 0CFC                <1> 	or 	al, ~(GATE2+SPK2) ; isolate current speaker bits in case
  2115 00001D5B E661                <1> 	out	PORT_B, al	; and stop speaker timer
  2116                              <1> 	;popf			; restore interrupt flag state
  2117 00001D5D FB                  <1> 	sti
  2118 00001D5E B90B040000          <1> 	mov	ecx, 1035	; force 1/64 second delay (short)
  2119 00001D63 E80B000000          <1> 	call	waitf		; minimum delay between all beeps
  2120                              <1> 	;pushf			; save interrupt status
  2121 00001D68 FA                  <1> 	cli			; block interrupts during update
  2122 00001D69 E461                <1> 	in	al, PORT_B	; get current port value in case	
  2123 00001D6B 2403                <1> 	and	al, GATE2+SPK2	; someone turned them on
  2124 00001D6D 08E0                <1> 	or	al, ah		; recover value of port_b
  2125 00001D6F E661                <1> 	out	PORT_B, al	; restore speaker status
  2126 00001D71 9D                  <1> 	popf			; restore interrupt flag state
  2127                              <1> u12:	
  2128 00001D72 C3                  <1> 	retn
  2129                              <1> 
  2130                              <1> REFRESH_BIT equ	00010000b 	; REFRESH TEST BIT
  2131                              <1> 
  2132                              <1> WAITF:
  2133                              <1> waitf:
  2134                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  2135                              <1> 	; 03/12/2013
  2136                              <1> 	;
  2137                              <1> ;	push ax			; save work register (ah)	
  2138                              <1> ;waitf1:
  2139                              <1> 				; use timer 1 output bits
  2140                              <1> ;	in	al, PORT_B	; read current counter output status
  2141                              <1> ;	and	al, REFRESH_BIT	; mask for refresh determine bit
  2142                              <1> ;	cmp	al, ah		; did it just change
  2143                              <1> ;	je	short waitf1	; wait for a change in output line
  2144                              <1> ;	;
  2145                              <1> ;	mov	ah, al		; save new lflag state
  2146                              <1> ;	loop	waitf1		; decrement half cycles till count end		
  2147                              <1> ;	;
  2148                              <1> ;	pop	ax		; restore (ah)
  2149                              <1> ;	retn			; return (cx)=0
  2150                              <1> 
  2151                              <1> ; 06/02/2015 (unix386.s <-- dsectrm2.s)
  2152                              <1> ; 17/12/2014 (dsectrm2.s)
  2153                              <1> ; WAITF
  2154                              <1> ; /// IBM PC-XT Model 286 System BIOS Source Code - Test 4 - 06/10/85 ///
  2155                              <1> ;
  2156                              <1> ;---WAITF-----------------------------------------------------------------------
  2157                              <1> ;	FIXED TIME WAIT ROUTINE (HARDWARE CONTROLLED - NOT PROCESSOR)
  2158                              <1> ; ENTRY:
  2159                              <1> ;	(CX) =	COUNT OF 15.085737 MICROSECOND INTERVALS TO WAIT
  2160                              <1> ;	      	MEMORY REFRESH TIMER 1 OUTPUT USED AS REFERENCE
  2161                              <1> ; EXIT:
  2162                              <1> ;	       	AFTER (CX) TIME COUNT (PLUS OR MINUS 16 MICROSECONDS)
  2163                              <1> ;	(CX) = 0	
  2164                              <1> ;-------------------------------------------------------------------------------
  2165                              <1> 
  2166                              <1> ; Refresh period: 30 micro seconds (15-80 us)
  2167                              <1> ; (16/12/2014 - AWARDBIOS 1999 - ATORGS.ASM, WAIT_REFRESH)
  2168                              <1> 
  2169                              <1> ;WAITF:					; DELAY FOR (CX)*15.085737 US
  2170 00001D73 6650                <1> 	PUSH	AX			; SAVE WORK REGISTER (AH)
  2171                              <1> 	; 16/12/2014
  2172                              <1> 	;shr	cx, 1			; convert to count of 30 micro seconds
  2173 00001D75 D1E9                <1> 	shr	ecx, 1	; 21/02/2015
  2174                              <1> ;17/12/2014	
  2175                              <1> ;WAITF1:
  2176                              <1> ;	IN	AL, PORT_B   ;061h	; READ CURRENT COUNTER OUTPUT STATUS
  2177                              <1> ;	AND	AL, REFRESH_BIT	;00010000b ; MASK FOR REFRESH DETERMINE BIT
  2178                              <1> ;	CMP	AL, AH			; DID IT JUST CHANGE
  2179                              <1> ;	JE	short WAITF1		; WAIT FOR A CHANGE IN OUTPUT LINE
  2180                              <1> ;	MOV	AH, AL			; SAVE NEW FLAG STATE
  2181                              <1> ;	LOOP	WAITF1			; DECREMENT HALF CYCLES TILL COUNT END		
  2182                              <1> 	;
  2183                              <1> 	; 17/12/2014
  2184                              <1> 	;
  2185                              <1> 	; Modification from 'WAIT_REFRESH' procedure of AWARD BIOS - 1999
  2186                              <1> 	;
  2187                              <1> ;WAIT_REFRESH:  Uses port 61, bit 4 to have CPU speed independent waiting.
  2188                              <1> ;   	INPUT:  CX = number of refresh periods to wait
  2189                              <1> ;     	       (refresh periods = 1 per 30 microseconds on most machines)
  2190                              <1> WR_STATE_0:
  2191 00001D77 E461                <1> 	IN	AL,PORT_B		; IN AL,SYS1
  2192 00001D79 A810                <1> 	TEST	AL,010H
  2193 00001D7B 74FA                <1> 	JZ	SHORT WR_STATE_0
  2194                              <1> WR_STATE_1:
  2195 00001D7D E461                <1> 	IN	AL,PORT_B		; IN AL,SYS1
  2196 00001D7F A810                <1> 	TEST	AL,010H
  2197 00001D81 75FA                <1> 	JNZ	SHORT WR_STATE_1
  2198 00001D83 E2F2                <1>         LOOP    WR_STATE_0
  2199                              <1> 	;
  2200 00001D85 6658                <1> 	POP	AX			; RESTORE (AH)
  2201 00001D87 C3                  <1> 	RETn				; (CX) = 0
  2202                              <1> 
  2203                              <1> ; 09/07/2016
  2204                              <1> ; 01/07/2016
  2205                              <1> ; 24/06/2016
  2206                              <1> ; 23/06/2016 - TRDOS 386 (TRDOS v2.0)
  2207                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  2208                              <1> ;-------------------------------------------------------------------------------
  2209                              <1> ; WRITE_STRING								       :
  2210                              <1> ;	THIS ROUTINE WRITES A STRING OF CHARACTERS TO THE CRT.		       :
  2211                              <1> ; INPUT 								       :
  2212                              <1> ;	(AL) = WRITE STRING COMMAND  0 - 3				       :
  2213                              <1> ;	(BH) = DISPLAY PAGE (ACTIVE PAGE)				       :
  2214                              <1> ;	(CX) = COUNT OF CHARACTERS TO WRITE, IF (CX) = 0 THEN RETURN	       :
  2215                              <1> ;	(DX) = CURSOR POSITION FOR START OF STRING WRITE		       :
  2216                              <1> ;	(BL) = ATTRIBUTE OF CHARACTER TO WRITE IF (AL) = 0  OR	(AL) = 1       :
  2217                              <1> ;	(eBP) = SOURCE STRING OFFSET					       :
  2218                              <1> ; OUTPUT								       :
  2219                              <1> ;	NONE								       :
  2220                              <1> ;-------------------------------------------------------------------------------
  2221                              <1> 
  2222                              <1> ; AL = 00h: Assign all characters the attribute in BL; do not update cursor
  2223                              <1> ; AL = 01h: Assign all characters the attribute in BL; update cursor
  2224                              <1> ; AL = 02h: Use attributes in string; do not update cursor
  2225                              <1> ; AL = 03h: Use attributes in string; update cursor
  2226                              <1> 
  2227                              <1> WRITE_STRING:
  2228                              <1> 	; 12/09/2016
  2229                              <1> 	; 09/07/2016
  2230                              <1> 	;cmp	byte [CRT_MODE], 7 ; 6?!
  2231                              <1> 	;ja	VIDEO_RETURN		; not a valid function for VGA modes
  2232                              <1> 	;
  2233 00001D88 A2[783E0100]        <1> 	mov	[w_str_cmd], al		; save (AL) command
  2234 00001D8D 3C04                <1> 	CMP	AL, 4			; TEST FOR INVALID WRITE STRING OPTION
  2235 00001D8F 0F8345F7FFFF        <1> 	JNB	VIDEO_RETURN		; IF OPTION INVALID THEN RETURN
  2236                              <1> 
  2237                              <1>         ;JCXZ   VIDEO_RETURN            ; IF ZERO LENGTH STRING THEN RETURN
  2238                              <1> 
  2239 00001D95 67E35E              <1>         jcxz    P55			; 01/07/2016
  2240                              <1> 
  2241                              <1> 
  2242                              <1> 	; 01/07/2016
  2243                              <1> 	;and	ecx, 0FFFFh
  2244                              <1> 	; ECX = byte count
  2245                              <1> 	;push	ecx
  2246 00001D98 89EE                <1> 	mov	esi, ebp ; user buffer
  2247 00001D9A BF00000700          <1> 	mov	edi, Cluster_Buffer  ; system buffer
  2248 00001D9F E820C10000          <1> 	call	transfer_from_user_buffer
  2249                              <1> 	;pop	ecx
  2250 00001DA4 0F8230F7FFFF        <1> 	jc	VIDEO_RETURN
  2251                              <1> 	; ecx = transfer (byte) count = character count
  2252 00001DAA BD00000700          <1> 	mov	ebp, Cluster_Buffer
  2253                              <1> 	; 12/09/2016
  2254 00001DAF 803D[EEF70000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6?!
  2255 00001DB6 0F879F000000        <1> 	ja	vga_write_string
  2256                              <1> 	;
  2257 00001DBC 0FB6F7              <1> 	movzx	esi, bh			; GET CURRENT CURSOR PAGE
  2258 00001DBF 66D1E6              <1> 	SAL	SI,1			; CONVERT TO PAGE OFFSET  (SI= PAGE)
  2259                              <1> 	; *****
  2260 00001DC2 66FFB6[FE300100]    <1> 	PUSH	word [eSI+CURSOR_POSN]	; SAVE CURRENT CURSOR POSITION IN STACK
  2261                              <1> 
  2262                              <1> 	;MOV	AX,0200H		; SET NEW CURSOR POSITION
  2263                              <1> 	;INT	10H
  2264                              <1> P50next:	
  2265 00001DC9 53                  <1> 	push	ebx ; ****
  2266 00001DCA 51                  <1> 	push	ecx ; ***
  2267 00001DCB 56                  <1> 	push	esi ; **
  2268 00001DCC 52                  <1> 	push	edx ; *
  2269 00001DCD E8FCFEFFFF          <1> 	call	_set_cpos
  2270                              <1> P50:
  2271 00001DD2 8A4500              <1> 	MOV	AL, [eBP]		; GET CHARACTER FROM INPUT STRING
  2272 00001DD5 45                  <1> 	INC	eBP			; BUMP POINTER TO CHARACTER
  2273                              <1> 
  2274                              <1> ;-----	TEST FOR SPECIAL CHARACTER'S
  2275                              <1> 
  2276 00001DD6 3C08                <1> 	CMP	AL, 08H			; IS IT A BACKSPACE
  2277 00001DD8 740C                <1> 	JE	short P51		; BACK_SPACE
  2278 00001DDA 3C0D                <1> 	CMP	AL, 0Dh ; CR		; IS IT CARRIAGE RETURN
  2279 00001DDC 7408                <1> 	JE	short P51		; CAR_RET
  2280 00001DDE 3C0A                <1> 	CMP	AL, 0Ah ; LF		; IS IT A LINE FEED
  2281 00001DE0 7404                <1> 	JE	short P51		; LINE_FEED
  2282 00001DE2 3C07                <1> 	CMP	AL, 07h			; IS IT A BELL
  2283 00001DE4 7515                <1> 	JNE	short P52		; IF NOT THEN DO WRITE CHARACTER
  2284                              <1> P51:
  2285                              <1> 	;MOV	AH,0EH			; TTY_CHARACTER_WRITE
  2286                              <1> 	;INT	10H			; WRITE TTY CHARACTER TO THE CRT
  2287                              <1> 	
  2288 00001DE6 E860FEFFFF          <1> 	call	_write_tty_m3
  2289                              <1> 
  2290 00001DEB 5A                  <1> 	pop	edx ; *
  2291 00001DEC 5E                  <1> 	pop	esi ; **
  2292                              <1> 
  2293 00001DED 668B96[FE300100]    <1> 	MOV	DX, [eSI+CURSOR_POSN]	; GET CURRENT CURSOR POSITION
  2294 00001DF4 EB46                <1> 	JMP	SHORT P54		; SET CURSOR POSITION AND CONTINUE
  2295                              <1> P55:
  2296 00001DF6 E9DFF6FFFF          <1> 	JMP	VIDEO_RETURN
  2297                              <1> P52:
  2298 00001DFB 66B90100            <1> 	MOV	CX, 1			; SET CHARACTER WRITE AMOUNT TO ONE
  2299 00001DFF 803D[783E0100]02    <1> 	CMP	byte [w_str_cmd], 2	; IS THE ATTRIBUTE IN THE STRING
  2300 00001E06 7204                <1> 	JB	short P53		; IF NOT THEN SKIP
  2301 00001E08 8A5D00              <1> 	MOV	BL, [eBP]		; ELSE GET NEW ATTRIBUTE
  2302 00001E0B 45                  <1> 	INC	eBP			; BUMP STRING POINTER
  2303                              <1> P53:
  2304                              <1> 	;MOV	AH,09H			; GOT_CHARACTER
  2305                              <1> 	;INT	10H			; WRITE CHARACTER TO THE CRT
  2306                              <1> 
  2307 00001E0C E8AEFDFFFF          <1> 	call	_write_c_current
  2308                              <1> 	
  2309 00001E11 5A                  <1> 	pop	edx ; *	
  2310                              <1> 	
  2311 00001E12 0FB6F7              <1> 	movzx	esi, bh ; video page number (0 to 7)	
  2312 00001E15 889E[F7F70000]      <1> 	mov	[esi+chr_attrib], bl ; color/attribute
  2313                              <1> 
  2314 00001E1B FEC2                <1> 	INC	DL			; INCREMENT COLUMN COUNTER
  2315 00001E1D 3A15[F0F70000]      <1> 	CMP	DL, [CRT_COLS]		; IF COLS ARE WITHIN RANGE FOR THIS MODE
  2316 00001E23 7217                <1> 	JB	short P54		;    THEN GO TO COLUMNS SET
  2317 00001E25 FEC6                <1> 	INC	DH			; BUMP ROW COUNTER BY ONE
  2318 00001E27 28D2                <1> 	SUB	DL, DL			; SET COLUMN COUNTER TO ZERO
  2319 00001E29 80FE19              <1> 	CMP	DH, 25			; IF ROWS ARE LESS THAN 25 THEN
  2320 00001E2C 720E                <1> 	JB	short P54		; GO TO ROWS_COLUMNS_SET
  2321                              <1> 
  2322 00001E2E 66B80A0E            <1> 	MOV	AX,0E0AH		; ELSE SCROLL SCREEN
  2323                              <1> 	;INT	10H			; RESET ROW COUNTER TO 24
  2324                              <1> 
  2325 00001E32 E814FEFFFF          <1> 	call	_write_tty_m3
  2326                              <1> 	
  2327 00001E37 66BA0018            <1> 	mov	dx, 1800h		; Column = 0, Row = 24
  2328 00001E3B 5E                  <1> 	pop	esi ; **
  2329                              <1> P54:
  2330                              <1> 					; ROW_COLUMNS_SET
  2331                              <1> 	;MOV	AX,0200H		; SET NEW CURSOR POSITION COMMAND
  2332                              <1> 	;INT	10H			; ESTABLISH NEW CURSOR POSITION
  2333                              <1> 
  2334 00001E3C 59                  <1> 	pop	ecx ; ***
  2335 00001E3D 5B                  <1> 	pop	ebx ; ****
  2336                              <1> 
  2337                              <1> 	;LOOP	P50			; DO IT ONCE MORE UNTIL (CX) = ZERO
  2338 00001E3E 6649                <1> 	dec	cx
  2339 00001E40 7587                <1> 	jnz	short P50next
  2340                              <1> 
  2341 00001E42 665A                <1> 	POP	DX  ; *****		; RESTORE OLD CURSOR COORDINATES
  2342                              <1> 	
  2343 00001E44 F605[783E0100]01    <1> 	test	byte [w_str_cmd], 1	; IF CURSOR WAS NOT TO BE MOVED
  2344 00001E4B 0F8589F6FFFF        <1> 	JNZ	VIDEO_RETURN		; THEN EXIT WITHOUT RESETTING OLD VALUE
  2345                              <1> 	
  2346                              <1> 	;MOV	AX,0200H		; ELSE RESTORE OLD CURSOR POSITION
  2347                              <1> 	;INT	10H
  2348                              <1> 					; DONE - EXIT WRITE STRING
  2349 00001E51 E878FEFFFF          <1> 	call	_set_cpos
  2350 00001E56 E97FF6FFFF          <1> 	JMP	VIDEO_RETURN		; RETURN TO CALLER
  2351                              <1> 
  2352                              <1> vga_write_string:
  2353                              <1> 	; 12/09/2016 - TRDOS 386 (TRDOS v2.0)
  2354                              <1> 	;
  2355                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  2356                              <1> 	; vgabios-0.7a (2011)
  2357                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  2358                              <1> 	; 'vgabios.c', ' biosfn_write_string'
  2359                              <1> 
  2360                              <1> 	; INPUT 								  :
  2361                              <1> 	;	(AL) = WRITE STRING COMMAND  0 - 3				  :
  2362                              <1> 	;	(BH) = DISPLAY PAGE (ACTIVE PAGE)				  :
  2363                              <1> 	;	(CX) = COUNT OF CHARACTERS TO WRITE, IF (CX) = 0 THEN RETURN	  :
  2364                              <1> 	;	(DX) = CURSOR POSITION FOR START OF STRING WRITE		  :
  2365                              <1> 	;	(BL) = ATTRIBUTE OF CHARACTER TO WRITE IF (AL) = 0  OR	(AL) = 1  :
  2366                              <1> 	;	(eBP) = SOURCE STRING OFFSET					  :
  2367                              <1> 	; OUTPUT								  :
  2368                              <1> 	;	NONE								  :
  2369                              <1> 	;-------------------------------------------------------------------------;
  2370                              <1> 
  2371                              <1> 	; AL = 00h: Assign all characters the attribute in BL; do not update cursor
  2372                              <1> 	; AL = 01h: Assign all characters the attribute in BL; update cursor
  2373                              <1> 	; AL = 02h: Use attributes in string; do not update cursor
  2374                              <1> 	; AL = 03h: Use attributes in string; update cursor
  2375                              <1> 	
  2376                              <1> 	; biosfn_write_string(GET_AL(),GET_BH(),GET_BL(),CX,GET_DH(),GET_DL(),ES,BP);
  2377                              <1> 	; static void biosfn_write_string (flag,page,attr,count,row,col,seg,offset) 
  2378                              <1> 
  2379                              <1> 	; // Read curs info for the page
  2380                              <1>  	; biosfn_get_cursor_pos(page,&dummy,&oldcurs);
  2381                              <1> 	; bh = video page = 0
  2382                              <1> 	;movzx	esi, word [CURSOR_POSN] ; current cursor position for video page 0
  2383                              <1> 	
  2384                              <1> 	; // if row=0xff special case : use current cursor position
  2385                              <1> 	; if(row==0xff)
  2386                              <1> 	;  {col=oldcurs&0x00ff;
  2387                              <1> 	;   row=(oldcurs&0xff00)>>8;
  2388                              <1> 	;  }
  2389                              <1> 
  2390                              <1> 	;mov	al, [w_str_cmd]
  2391                              <1> 
  2392 00001E5B 80FEFF              <1> 	cmp	dh, 0FFh
  2393 00001E5E 7407                <1> 	je	short vga_wstr_1 ; user current cursor position
  2394                              <1> vga_wstr_0:
  2395                              <1> 	; set cursor position
  2396 00001E60 668915[FE300100]    <1> 	mov	[CURSOR_POSN], dx ; save cursor pos for pg 0
  2397                              <1> vga_wstr_1:
  2398 00001E67 66FF35[FE300100]    <1> 	push	word [CURSOR_POSN] ; *
  2399                              <1> 
  2400                              <1> 	; ebp = string offset in system buffer (user buffer was copied to)	
  2401                              <1> 	
  2402                              <1> 	; while(count--!=0)
  2403                              <1> 	;  {
  2404                              <1> 	;   car=read_byte(seg,offset++);
  2405                              <1> 	;   if((flag&0x02)!=0)
  2406                              <1> 	;    attr=read_byte(seg,offset++);
  2407                              <1> 	;    biosfn_write_teletype(car,page,attr,WITH_ATTR);
  2408                              <1> 	;  }
  2409                              <1> 
  2410                              <1> 	;push	eax ; **
  2411                              <1> 	;test	al, 2
  2412 00001E6E F605[783E0100]02    <1> 	test	byte [w_str_cmd], 2
  2413 00001E75 751D                <1> 	jnz	short vga_wstr_3
  2414 00001E77 881D[0F310100]      <1> 	mov	[ccolor], bl
  2415                              <1> vga_wstr_2:
  2416 00001E7D 51                  <1> 	push	ecx
  2417 00001E7E 8A4500              <1> 	mov	al, [ebp]
  2418 00001E81 E8CC0A0000          <1> 	call	vga_write_teletype
  2419 00001E86 59                  <1> 	pop	ecx
  2420 00001E87 6649                <1> 	dec	cx
  2421 00001E89 741E                <1> 	jz	short vga_wstr_4
  2422 00001E8B 45                  <1> 	inc	ebp
  2423 00001E8C 8A1D[0F310100]      <1> 	mov	bl, [ccolor]
  2424 00001E92 EBE9                <1> 	jmp	short vga_wstr_2
  2425                              <1> vga_wstr_3:
  2426 00001E94 51                  <1> 	push	ecx
  2427 00001E95 8A4500              <1> 	mov	al, [ebp]
  2428 00001E98 45                  <1> 	inc	ebp
  2429 00001E99 8A5D00              <1> 	mov	bl, [ebp]
  2430 00001E9C E8B10A0000          <1> 	call	vga_write_teletype
  2431 00001EA1 59                  <1> 	pop	ecx
  2432 00001EA2 6649                <1> 	dec	cx
  2433 00001EA4 7403                <1> 	jz	short vga_wstr_4
  2434 00001EA6 45                  <1> 	inc	ebp
  2435 00001EA7 EBEB                <1> 	jmp	short vga_wstr_3
  2436                              <1> vga_wstr_4:
  2437                              <1> 	; // Set back curs pos 
  2438                              <1> 	; if((flag&0x01)==0)
  2439                              <1> 	;  biosfn_set_cursor_pos(page,oldcurs);
  2440                              <1> 	; }
  2441                              <1> 	;pop	eax ; **
  2442 00001EA9 665A                <1> 	pop	dx ; word [CURSOR_POSN] ; *
  2443                              <1> 	;test	al, 1
  2444 00001EAB F605[783E0100]01    <1> 	test	byte [w_str_cmd], 1
  2445 00001EB2 0F8522F6FFFF        <1> 	jnz	VIDEO_RETURN
  2446 00001EB8 668915[FE300100]    <1> 	mov 	[CURSOR_POSN], dx
  2447 00001EBF E916F6FFFF          <1> 	JMP	VIDEO_RETURN
  2448                              <1> 
  2449                              <1> ; 07/07/2016
  2450                              <1> ; 27/06/2016 - TRDOS 386 (TRDOS v2.0)
  2451                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  2452                              <1> ;------------------------------------------------------
  2453                              <1> ;  SCROLL UP
  2454                              <1> ;   THIS ROUTINE SCROLLS UP THE INFORMATION ON THE CRT
  2455                              <1> ; ENTRY ---
  2456                              <1> ;  CH,CL = UPPER LEFT CORNER OF REGION TO SCROLL
  2457                              <1> ;  DH,DL = LOWER RIGHT CORNER OF REGION TO SCROLL
  2458                              <1> ;   BOTH OF THE ABOVE ARE IN CHARACTER POSITIONS
  2459                              <1> ;  BH = FILL VALUE FOR BLANKED LINES
  2460                              <1> ;  AL = # LINES TO SCROLL (AL=0 MEANS BLANK THE ENTIRE FIELD)
  2461                              <1> ;  DS = DATA SEGMENT
  2462                              <1> ;  ES = REGEN SEGMENT
  2463                              <1> ; EXIT --
  2464                              <1> ;  NOTHING, THE SCREEN IS SCROLLED
  2465                              <1> ;--------------------------------------------------------
  2466                              <1> 
  2467                              <1> 	; cl = upper left column
  2468                              <1> 	; ch = upper left row
  2469                              <1> 	; dl = lower rigth column
  2470                              <1> 	; dh = lower right row
  2471                              <1> 	;
  2472                              <1> 	; al = line count (AL=0 means blank entire fields)
  2473                              <1> 	; bl = fill value for blanked lines	
  2474                              <1> 	; bh = unused
  2475                              <1> 
  2476                              <1> GRAPHICS_UP:
  2477                              <1> 	; 07/07/2016
  2478                              <1> 	;AH = Current video mode, [CRT_MODE]
  2479 00001EC4 80FC07              <1> 	cmp	ah, 7
  2480 00001EC7 7766                <1> 	ja	short vga_graphics_up
  2481                              <1> 	;je	n0
  2482                              <1> 
  2483 00001EC9 88C7                <1> 	MOV	bh, al			; save line count in BH
  2484 00001ECB 6689C8              <1> 	MOV	AX, CX			; GET UPPER LEFT POSITION INTO AX REG
  2485                              <1> 
  2486                              <1> ;-----	USE CHARACTER SUBROUTINE FOR POSITIONING
  2487                              <1> ;-----	ADDRESS RETURNED IS MULTIPLIED BY 2 FROM CORRECT VALUE
  2488                              <1> 
  2489 00001ECE E8D9050000          <1> 	CALL	GRAPH_POSN
  2490 00001ED3 0FB7F8              <1> 	MOVzx	eDI, AX			; SAVE RESULT AS DESTINATION ADDRESS
  2491                              <1> 
  2492                              <1> ;-----	DETERMINE SIZE OF WINDOW
  2493                              <1> 
  2494 00001ED6 6629CA              <1> 	SUB	DX, CX
  2495 00001ED9 6681C20101          <1>         ADD     DX, 101h                ; ADJUST VALUES
  2496 00001EDE C0E602              <1> 	SAL	DH, 2			; MULTIPLY ROWS BY 4 AT 8 VERT DOTS/CHAR
  2497                              <1> 					; AND EVEN/ODD ROWS
  2498                              <1> ;-----	DETERMINE CRT MODE
  2499                              <1> 
  2500 00001EE1 803D[EEF70000]06    <1> 	CMP	byte [CRT_MODE], 6	; TEST FOR MEDIUM RES
  2501 00001EE8 7305                <1>         JNC     short _R7_              ; FIND_SOURCE
  2502                              <1> 
  2503                              <1> ;-----	MEDIUM RES UP
  2504 00001EEA D0E2                <1> 	SAL	DL, 1			; # COLUMNS * 2, SINCE 2 BYTES/CHAR
  2505 00001EEC 66D1E7              <1> 	SAL	DI, 1			; OFFSET *2 SINCE 2 BYTES/CHAR
  2506                              <1> 
  2507                              <1> ;-----	DETERMINE THE SOURCE ADDRESS IN THE BUFFER
  2508                              <1> _R7_:                                   ; FIND_SOURCE
  2509 00001EEF 81C700800B00        <1> 	add	edi, 0B8000h
  2510 00001EF5 C0E702              <1> 	sal	bh, 2			; multiply number of lines by 4
  2511 00001EF8 7431                <1>         JZ      short _R11              ; IF ZERO, THEN BLANK ENTIRE FIELD
  2512 00001EFA B050                <1> 	MOV	AL, 80			; 80 BYTES/ROW
  2513 00001EFC F6E7                <1> 	mul	bh			; determine offset to source
  2514 00001EFE 0FB7F0              <1> 	movzx	esi, ax			; offset to source
  2515 00001F01 01FE                <1> 	add	eSI, eDI		; SET UP SOURCE
  2516 00001F03 88F4                <1> 	MOV	AH, DH			; NUMBER OF ROWS IN FIELD
  2517 00001F05 28FC                <1> 	sub	ah, bh			; determine number to move
  2518                              <1> 
  2519                              <1> ;-----	LOOP THROUGH, MOVING ONE ROW AT A TIME, BOTH EVEN AND ODD FIELDS
  2520                              <1> _R8:                                    ; ROW_LOOP
  2521 00001F07 E812040000          <1>         CALL    _R17                    ; MOVE ONE ROW
  2522 00001F0C 6681EEB01F          <1> 	SUB	SI, 2000h-80		; MOVE TO NEXT ROW
  2523 00001F11 6681EFB01F          <1> 	SUB	DI, 2000h-80
  2524 00001F16 FECC                <1> 	DEC	AH			; NUMBER OF ROWS TO MOVE
  2525 00001F18 75ED                <1>         JNZ     short _R8               ; CONTINUE TILL ALL MOVED
  2526                              <1> 
  2527                              <1> ;-----	FILL IN THE VACATED LINE(S)
  2528                              <1> _R9:                                    ; CLEAR ENTRY
  2529 00001F1A 88D8                <1> 	mov	al, bl			; attribute to fill with
  2530                              <1> _R10_:
  2531 00001F1C E819040000          <1>         CALL    _R18                    ; CLEAR THAT ROW
  2532 00001F21 6681EFB01F          <1> 	SUB	DI, 2000h-80		; POINT TO NEXT LINE
  2533 00001F26 FECF                <1> 	dec	bh			; number of lines to fill
  2534 00001F28 75F2                <1>         JNZ     short _R10_             ; CLEAR LOOP
  2535 00001F2A C3                  <1> 	retn				; EVERYYHING DONE
  2536                              <1> 
  2537                              <1> _R11:                                   ; BLANK_FIELD
  2538 00001F2B 88F7                <1> 	mov	bh, dh			; set blank count to everything in field
  2539 00001F2D EBEB                <1>         JMP     short _R9               ; CLEAR THE FIELD
  2540                              <1> 
  2541                              <1> vga_graphics_up:
  2542                              <1> 	; 08/08/2016
  2543                              <1> 	; 07/08/2016
  2544                              <1> 	; 04/08/2016
  2545                              <1> 	; 01/08/2016
  2546                              <1> 	; 31/07/2016
  2547                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  2548                              <1> 	;
  2549                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  2550                              <1> 	; vgabios-0.7a (2011)
  2551                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  2552                              <1> 	; 'vgabios.c', 'biosfn_scroll'
  2553                              <1> 	;
  2554                              <1> 
  2555                              <1> 	; cl = upper left column
  2556                              <1> 	; ch = upper left row
  2557                              <1> 	; dl = lower rigth column
  2558                              <1> 	; dh = lower right row
  2559                              <1> 	;
  2560                              <1> 	; al = line count (AL=0 means blank entire fields)
  2561                              <1> 	; bl = fill value for blanked lines	
  2562                              <1> 	; bh = unused
  2563                              <1> 	;
  2564                              <1> 	; ah = [CRT_MODE], current video mode	
  2565                              <1> 
  2566 00001F2F 88C7                <1> 	mov	bh, al ; 31/07/2016
  2567 00001F31 BE[12F80000]        <1> 	mov	esi, vga_g_modes
  2568 00001F36 89F7                <1> 	mov	edi, esi
  2569 00001F38 83C708              <1> 	add	edi, vga_g_mode_count
  2570                              <1> vga_g_up_0:
  2571 00001F3B AC                  <1> 	lodsb
  2572 00001F3C 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  2573 00001F3E 7405                <1> 	je	short vga_g_up_1
  2574 00001F40 39FE                <1> 	cmp	esi, edi
  2575 00001F42 72F7                <1> 	jb	short vga_g_up_0
  2576                              <1> 	;xor	bh, bh ; 31/07/2016)
  2577 00001F44 C3                  <1> 	retn	; nothing to do
  2578                              <1> vga_g_up_1:
  2579 00001F45 88F8                <1> 	mov	al, bh ; 31/07/2016
  2580 00001F47 83C64F              <1> 	add	esi, vga_g_memmodel - (vga_g_modes + 1)  
  2581                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  2582                              <1> 	
  2583                              <1> 	; if(rlr>=nbrows)rlr=nbrows-1;
  2584                              <1>  	; if(clr>=nbcols)clr=nbcols-1;
  2585                              <1>  	; if(nblines>nbrows)nblines=0;
  2586                              <1>  	; cols=clr-cul+1;
  2587                              <1> 
  2588 00001F4A 3A35[F6F70000]      <1> 	cmp	dh, [VGA_ROWS]
  2589 00001F50 7208                <1> 	jb	short vga_g_up_2
  2590 00001F52 8A35[F6F70000]      <1> 	mov	dh, [VGA_ROWS]
  2591 00001F58 FECE                <1> 	dec	dh
  2592                              <1> vga_g_up_2:
  2593 00001F5A 3A15[F0F70000]      <1> 	cmp	dl, [CRT_COLS]  ; = [VGA_COLS]
  2594 00001F60 7208                <1> 	jb	short vga_g_up_3
  2595 00001F62 8A15[F0F70000]      <1> 	mov	dl, [CRT_COLS]
  2596 00001F68 FECA                <1> 	dec	dl
  2597                              <1> vga_g_up_3:	
  2598 00001F6A 3A05[F6F70000]      <1> 	cmp	al, [VGA_ROWS]
  2599 00001F70 7602                <1> 	jna	short vga_g_up_4
  2600 00001F72 28C0                <1> 	sub	al, al ; 0
  2601                              <1> vga_g_up_4:
  2602 00001F74 88D7                <1> 	mov	bh, dl ; clr
  2603 00001F76 28CF                <1> 	sub	bh, cl ; cul
  2604 00001F78 FEC7                <1> 	inc	bh ; cols = clr-cul+1
  2605                              <1> 
  2606 00001F7A 20C0                <1> 	and	al, al ; nblines = 0
  2607 00001F7C 755D                <1> 	jnz	short vga_g_up_6
  2608 00001F7E 20ED                <1> 	and	ch, ch ; rul = 0
  2609 00001F80 7559                <1> 	jnz	short vga_g_up_6
  2610 00001F82 20C9                <1> 	and	cl, cl ; cul = 0
  2611 00001F84 7555                <1> 	jnz	short vga_g_up_6
  2612                              <1> 
  2613 00001F86 6650                <1> 	push	ax
  2614 00001F88 A0[F6F70000]        <1> 	mov	al, [VGA_ROWS]
  2615 00001F8D FEC8                <1> 	dec	al  
  2616 00001F8F 38C6                <1> 	cmp	dh, al ; rlr = nbrows-1
  2617 00001F91 7546                <1> 	jne	short vga_g_up_5
  2618 00001F93 A0[F0F70000]        <1>         mov     al, [CRT_COLS]  ; = VGA_COLS
  2619 00001F98 FEC8                <1> 	dec	al 
  2620 00001F9A 38C2                <1>  	cmp	dl, al ; clr = nbcols-1
  2621 00001F9C 753B                <1> 	jne	short vga_g_up_5
  2622 00001F9E 6658                <1> 	pop	ax
  2623                              <1> 
  2624 00001FA0 66B80502            <1> 	mov	ax, 0205h
  2625 00001FA4 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  2626 00001FA8 66EF                <1> 	out	dx, ax
  2627 00001FAA A0[F6F70000]        <1> 	mov	al, [VGA_ROWS]
  2628 00001FAF 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS] ; = [VGA_COLS]
  2629 00001FB5 F6E4                <1> 	mul	ah
  2630 00001FB7 0FB7D0              <1> 	movzx	edx, ax
  2631                              <1> 	; 08/08/2016
  2632 00001FBA 0FB605[F2F70000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  2633 00001FC1 F7E2                <1> 	mul	edx
  2634                              <1> 	; eax = byte count	
  2635 00001FC3 89C1                <1> 	mov	ecx, eax
  2636                              <1> 	;; 07/08/2016
  2637                              <1> 	;shl	dx, 3 ; * 8 ; * [CHAR_HEIGHT]
  2638                              <1> 	;mov	ecx, edx
  2639 00001FC5 88D8                <1> 	mov	al, bl ; fill value for blanked lines
  2640 00001FC7 BF00000A00          <1> 	mov	edi, 0A0000h
  2641 00001FCC F3AA                <1> 	rep	stosb		
  2642                              <1> 	
  2643 00001FCE 66B80500            <1> 	mov	ax, 5
  2644 00001FD2 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  2645 00001FD6 66EF                <1> 	out	dx, ax ; 0005h	
  2646                              <1> 
  2647 00001FD8 C3                  <1> 	retn
  2648                              <1> 
  2649                              <1> vga_g_up_5:
  2650 00001FD9 6658                <1> 	pop	ax
  2651                              <1> 
  2652                              <1> vga_g_up_6:
  2653                              <1> 	; [ESI] = VGA memory model number for current video mode
  2654                              <1>         ;
  2655                              <1>         ; LINEAR8 equ 5
  2656                              <1>         ; PLANAR4 equ 4
  2657                              <1>         ; PLANAR1 equ 3
  2658                              <1> 
  2659 00001FDB 803E04              <1> 	cmp	byte [esi], PLANAR4
  2660 00001FDE 7424                <1> 	je	short vga_g_up_planar
  2661 00001FE0 803E03              <1> 	cmp	byte [esi], PLANAR1
  2662 00001FE3 741F                <1> 	je	short vga_g_up_planar
  2663                              <1> vga_g_up_linear8:
  2664                              <1> 	; 07/07/2016 (TEMPORARY)
  2665                              <1> 	;
  2666                              <1> 	; cl = upper left column ; cul
  2667                              <1> 	; ch = upper left row ; rul
  2668                              <1> 	; dl = lower rigth column ; clr
  2669                              <1> 	; dh = lower right row ; rlr
  2670                              <1> 
  2671                              <1> vga_g_up_l0:
  2672                              <1>  	;{for(i=rul;i<=rlr;i++)
  2673                              <1>   	; if((i+nblines>rlr)||(nblines==0))
  2674 00001FE5 08C0                <1> 	or	al, al
  2675 00001FE7 7414                <1> 	jz	short vga_g_up_l2
  2676 00001FE9 88C4                <1> 	mov	ah, al
  2677 00001FEB 00EC                <1> 	add	ah, ch ; i+nblines
  2678                              <1> 	;jc	short vga_g_up_l2	
  2679 00001FED 38F4                <1> 	cmp	ah, dh
  2680 00001FEF 770C                <1> 	ja	short vga_g_up_l2
  2681                              <1> 	; else
  2682                              <1> 	;  vgamem_copy_pl4(cul,i+nblines,i,cols,nbcols,cheight);
  2683 00001FF1 E8F2000000          <1> 	call	vgamem_copy_l8
  2684                              <1> vga_g_up_l1:
  2685 00001FF6 FEC5                <1> 	inc	ch
  2686 00001FF8 38F5                <1> 	cmp	ch, dh
  2687 00001FFA 76E9                <1> 	jna	short vga_g_up_l0
  2688 00001FFC C3                  <1> 	retn
  2689                              <1> vga_g_up_l2:
  2690                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  2691 00001FFD E850010000          <1> 	call	vgamem_fill_l8
  2692 00002002 EBF2                <1> 	jmp	short vga_g_up_l1
  2693                              <1> 
  2694                              <1> vga_g_up_planar:
  2695                              <1> 	; cl = upper left column ; cul
  2696                              <1> 	; ch = upper left row ; rul
  2697                              <1> 	; dl = lower rigth column ; clr
  2698                              <1> 	; dh = lower right row ; rlr
  2699                              <1> vga_g_up_pl0:
  2700                              <1>  	;{for(i=rul;i<=rlr;i++)
  2701                              <1>   	; if((i+nblines>rlr)||(nblines==0))
  2702 00002004 20C0                <1> 	and	al, al
  2703 00002006 7414                <1> 	jz	short vga_g_up_pl2	
  2704 00002008 88C4                <1> 	mov	ah, al
  2705 0000200A 00EC                <1> 	add	ah, ch ; i+nblines
  2706                              <1> 	;jc	short vga_g_up_pl2
  2707 0000200C 38F4                <1> 	cmp	ah, dh
  2708 0000200E 770C                <1> 	ja	short vga_g_up_pl2
  2709                              <1> 	; else
  2710                              <1> 	;  vgamem_copy_pl4(cul,i+nblines,i,cols,nbcols,cheight);
  2711 00002010 E80E000000          <1> 	call	vgamem_copy_pl4
  2712                              <1> vga_g_up_pl1:
  2713 00002015 FEC5                <1> 	inc	ch 
  2714 00002017 38F5                <1> 	cmp	ch, dh
  2715 00002019 76E9                <1> 	jna	short vga_g_up_pl0
  2716 0000201B C3                  <1> 	retn
  2717                              <1> vga_g_up_pl2:
  2718                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  2719 0000201C E870000000          <1> 	call	vgamem_fill_pl4
  2720 00002021 EBF2                <1> 	jmp	short vga_g_up_pl1
  2721                              <1> 
  2722                              <1> vgamem_copy_pl4:
  2723                              <1> 	; 08/08/2016
  2724                              <1> 	; 07/08/2016
  2725                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  2726                              <1> 	;
  2727                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  2728                              <1> 	; vgabios-0.7a (2011)
  2729                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  2730                              <1> 	; 'vgabios.c', 'vgamem_copy_pl4'
  2731                              <1> 	;
  2732                              <1> 	; vgamem_copy_pl4(xstart,ysrc,ydest,cols,nbcols,cheight)
  2733                              <1> 	; cl = xstart, ah = ysrc (i+nblines), ch = ydest (i),
  2734                              <1> 	; bh = cols, [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight
  2735                              <1> 
  2736                              <1> 	; src=ysrc*cheight*nbcols+xstart;
  2737                              <1> 	; dest=ydest*cheight*nbcols+xstart;
  2738                              <1> 
  2739 00002023 52                  <1> 	push	edx
  2740 00002024 50                  <1> 	push	eax
  2741                              <1> 
  2742                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0105)
  2743 00002025 66B80501            <1> 	mov	ax, 0105h
  2744 00002029 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  2745 0000202D 66EF                <1> 	out	dx, ax
  2746                              <1> 
  2747                              <1> 	; 07/08/2016
  2748                              <1>  	;mov     ah, [esp+1]
  2749                              <1> 	;movzx	edx, ah ; ysrc
  2750 0000202F 0FB6542401          <1> 	movzx	edx, byte [esp+1]
  2751                              <1> 	; 08/08/2016
  2752 00002034 0FB605[F2F70000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  2753 0000203B 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  2754 00002041 F6E4                <1> 	mul	ah 
  2755                              <1> 	;; 07/08/2016
  2756                              <1> 	;movzx	eax, byte [CRT_COLS]
  2757                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  2758 00002043 50                  <1> 	push	eax ; cheight * nbcols
  2759 00002044 F7E2                <1> 	mul	edx ; * ysrc
  2760                              <1> 	; eax = ysrc * cheight * nbcols
  2761                              <1> 	; edx = 0
  2762 00002046 88CA                <1> 	mov	dl, cl ; edx = xstart	
  2763 00002048 01D0                <1>  	add	eax, edx
  2764 0000204A 89C6                <1> 	mov	esi, eax ; src
  2765 0000204C 88EA                <1> 	mov	dl, ch ; ydest
  2766 0000204E 58                  <1> 	pop	eax ; cheight * nbcols
  2767 0000204F F7E2                <1> 	mul	edx
  2768                              <1> 	; eax = ydest * cheight * nbcols
  2769 00002051 88CA                <1> 	mov	dl, cl ; edx = xstart	
  2770 00002053 01D0                <1>  	add	eax, edx
  2771 00002055 89C7                <1> 	mov	edi, eax ; dest
  2772                              <1> 	; esi = src
  2773                              <1> 	; edi = dest
  2774                              <1> 	; for(i=0;i<cheight;i++)
  2775                              <1>   	; {
  2776                              <1>    	;  memcpyb(0xa000,dest+i*nbcols,0xa000,src+i*nbcols,cols);
  2777                              <1>   	; }
  2778 00002057 51                  <1> 	push	ecx
  2779 00002058 B900000A00          <1> 	mov	ecx, 0A0000h
  2780 0000205D 01CE                <1> 	add	esi, ecx
  2781 0000205F 01CF                <1> 	add	edi, ecx
  2782                              <1> 	; 08/08/2016
  2783 00002061 8A35[F2F70000]      <1> 	mov	dh, [CHAR_HEIGHT]
  2784                              <1> 	;; 07/08/2016
  2785                              <1> 	;mov	dh, 8 ; 07/08/2016
  2786 00002067 28D2                <1> 	sub	dl, dl ; i
  2787                              <1> vgamem_copy_pl4_0:
  2788 00002069 56                  <1> 	push	esi
  2789 0000206A 57                  <1> 	push	edi
  2790 0000206B 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS]
  2791 00002072 F6E2                <1> 	mul	dl
  2792                              <1> 	; eax = i * nbcols
  2793 00002074 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  2794 00002076 01C6                <1> 	add	esi, eax
  2795 00002078 0FB6CF              <1> 	movzx	ecx, bh ; cols
  2796 0000207B F3A4                <1> 	rep	movsb
  2797 0000207D 5F                  <1> 	pop	edi
  2798 0000207E 5E                  <1> 	pop	esi
  2799 0000207F FECE                <1> 	dec	dh
  2800 00002081 75E6                <1> 	jnz	short vgamem_copy_pl4_0
  2801                              <1> vgamem_copy_pl4_1:
  2802 00002083 59                  <1> 	pop	ecx
  2803                              <1> 
  2804                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  2805 00002084 66B80500            <1> 	mov	ax, 0005h
  2806 00002088 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  2807 0000208C 66EF                <1> 	out	dx, ax
  2808                              <1> 
  2809 0000208E 58                  <1> 	pop	eax
  2810 0000208F 5A                  <1> 	pop	edx
  2811                              <1> 
  2812 00002090 C3                  <1> 	retn	
  2813                              <1> 
  2814                              <1> vgamem_fill_pl4:
  2815                              <1> 	; 08/08/2016
  2816                              <1> 	; 07/08/2016
  2817                              <1> 	; 04/08/2016
  2818                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  2819                              <1> 	;
  2820                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  2821                              <1> 	; vgabios-0.7a (2011)
  2822                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  2823                              <1> 	; 'vgabios.c', 'vgamem_fill_pl4'
  2824                              <1> 	;
  2825                              <1> 	; vgamem_fill_pl4(xstart,ystart,cols,nbcols,cheight,attr)
  2826                              <1> 	; cl = xstart, edi = ch = ystart, bh = cols,
  2827                              <1> 	; [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight, attr = 0
  2828                              <1> 
  2829                              <1> 	; dest=ystart*cheight*nbcols+xstart;
  2830 00002091 52                  <1> 	push	edx
  2831 00002092 50                  <1> 	push	eax
  2832                              <1> 
  2833                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205)
  2834 00002093 66B80502            <1> 	mov	ax, 0205h
  2835 00002097 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  2836 0000209B 66EF                <1> 	out	dx, ax
  2837                              <1> 
  2838                              <1>       	; 08/08/2016
  2839 0000209D 0FB605[F2F70000]    <1> 	movzx   eax, byte [CHAR_HEIGHT]
  2840 000020A4 F6E5                <1> 	mul	ch
  2841                              <1> 	;; 07/08/2016
  2842                              <1> 	;movzx	eax, ch
  2843                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  2844 000020A6 0FB615[F0F70000]    <1> 	movzx	edx, byte [CRT_COLS] ; = [VGA_COLS]
  2845 000020AD F7E2                <1> 	mul	edx
  2846                              <1> 	; edx  = 0
  2847 000020AF 88CA                <1> 	mov	dl, cl 
  2848 000020B1 01D0                <1> 	add	eax, edx
  2849 000020B3 89C7                <1> 	mov	edi, eax
  2850                              <1> 	; edi = dest
  2851                              <1> 	; for(i=0;i<cheight;i++)
  2852                              <1>   	; {
  2853                              <1>    	;  memsetb(0xa000,dest+i*nbcols,attr,cols);
  2854                              <1>   	; }
  2855 000020B5 81C700000A00        <1> 	add	edi, 0A0000h
  2856 000020BB 51                  <1> 	push	ecx
  2857                              <1> 	; 08/08/2016
  2858 000020BC 8A35[F2F70000]      <1> 	mov	dh, [CHAR_HEIGHT]
  2859                              <1> 	;; 07/08/2016
  2860                              <1> 	;mov	dh, 8 ; 07/08/2016
  2861 000020C2 28D2                <1> 	sub	dl, dl ; i
  2862                              <1> vgamem_fill_pl4_0:
  2863 000020C4 57                  <1> 	push	edi
  2864 000020C5 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS]
  2865 000020CC F6E2                <1> 	mul	dl
  2866                              <1> 	; eax = i * nbcols
  2867 000020CE 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  2868 000020D0 88D8                <1> 	mov	al, bl ; attr ; 04/08/2016
  2869 000020D2 0FB6CF              <1> 	movzx	ecx, bh ; cols
  2870 000020D5 F3AA                <1>  	rep	stosb
  2871 000020D7 5F                  <1> 	pop	edi
  2872 000020D8 75EA                <1> 	jnz	short vgamem_fill_pl4_0
  2873                              <1> vgamem_fill_pl4_1:
  2874 000020DA 59                  <1> 	pop	ecx
  2875                              <1> 
  2876                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  2877 000020DB 66B80500            <1> 	mov	ax, 0005h
  2878 000020DF 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  2879 000020E3 66EF                <1> 	out	dx, ax
  2880                              <1> 
  2881 000020E5 58                  <1> 	pop	eax
  2882 000020E6 5A                  <1> 	pop	edx 
  2883                              <1> 	
  2884 000020E7 C3                  <1> 	retn
  2885                              <1> 
  2886                              <1> vgamem_copy_l8:
  2887                              <1> 	; 08/08/2016
  2888                              <1> 	; 07/08/2016
  2889                              <1> 	; 06/08/2016
  2890                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  2891                              <1> 	;
  2892                              <1> 	; TEMPORARY
  2893                              <1> 	;
  2894                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  2895                              <1> 	; vgabios-0.7a (2011)
  2896                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  2897                              <1> 	; 'vgabios.c', 'vgamem_copy_pl4'
  2898                              <1> 	;
  2899                              <1> 	; vgamem_copy_pl4(xstart,ysrc,ydest,cols,nbcols,cheight)
  2900                              <1> 	; cl = xstart, ah = ysrc (i+nblines), ch = ydest (i),
  2901                              <1> 	; bh = cols, [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight
  2902                              <1> 
  2903                              <1> 	; src=ysrc*cheight*nbcols+xstart;
  2904                              <1> 	; dest=ydest*cheight*nbcols+xstart;
  2905                              <1> 
  2906 000020E8 52                  <1> 	push	edx
  2907 000020E9 50                  <1> 	push	eax
  2908                              <1> 
  2909                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0105)
  2910                              <1> 	;mov	ax, 0105h
  2911                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  2912                              <1> 	;out	dx, ax
  2913                              <1> 
  2914                              <1> 	;mov	ah, [esp+1]
  2915                              <1> 
  2916 000020EA 0FB6D4              <1> 	movzx	edx, ah ; ysrc
  2917                              <1> 	; 08/08/2016
  2918 000020ED 0FB605[F2F70000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  2919 000020F4 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  2920 000020FA F6E4                <1> 	mul	ah 
  2921                              <1> 	;; 07/08/2016
  2922                              <1> 	;movzx	eax, byte [CRT_COLS]
  2923                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  2924 000020FC 50                  <1> 	push	eax ; cheight * nbcols
  2925 000020FD F7E2                <1> 	mul	edx ; * ysrc
  2926                              <1> 	; eax = ysrc * cheight * nbcols
  2927                              <1> 	; edx = 0
  2928 000020FF 88CA                <1> 	mov	dl, cl ; edx = xstart
  2929 00002101 01D0                <1>  	add	eax, edx
  2930 00002103 89C6                <1> 	mov	esi, eax ; src
  2931 00002105 66C1E603            <1> 	shl	si, 3 ; * 8 ; 06/08/2016
  2932 00002109 88EA                <1> 	mov	dl, ch ; ydest
  2933 0000210B 58                  <1> 	pop	eax ; cheight * nbcols
  2934 0000210C F7E2                <1> 	mul	edx
  2935                              <1> 	; eax = ydest * cheight * nbcols
  2936 0000210E 88CA                <1> 	mov	dl, cl ; edx = xstart	
  2937 00002110 01D0                <1>  	add	eax, edx
  2938 00002112 89C7                <1> 	mov	edi, eax ; dest
  2939 00002114 66C1E703            <1> 	shl	di, 3 ; * 8 ; 06/08/2016
  2940                              <1> 	; esi = src
  2941                              <1> 	; edi = dest
  2942                              <1> 	; for(i=0;i<cheight;i++)
  2943                              <1>   	; {
  2944                              <1>    	;  memcpyb(0xa000,dest+i*nbcols,0xa000,src+i*nbcols,cols);
  2945                              <1>   	; }
  2946 00002118 51                  <1> 	push	ecx
  2947 00002119 B900000A00          <1> 	mov	ecx, 0A0000h
  2948 0000211E 01CE                <1> 	add	esi, ecx
  2949 00002120 01CF                <1> 	add	edi, ecx
  2950                              <1> 	; 08/08/2016
  2951 00002122 8A35[F2F70000]      <1> 	mov	dh, [CHAR_HEIGHT]
  2952                              <1> 	;; 07/08/2016
  2953                              <1> 	;mov	dh, 8 ; 07/08/2016
  2954 00002128 28D2                <1> 	sub	dl, dl ; i
  2955                              <1> vgamem_copy_l8_0:
  2956 0000212A 56                  <1> 	push	esi
  2957 0000212B 57                  <1> 	push	edi
  2958 0000212C 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS]
  2959 00002133 F6E2                <1> 	mul	dl
  2960                              <1> 	; eax = i * nbcols
  2961 00002135 66C1E003            <1> 	shl	ax, 3 ; * 8 ; 06/08/2016
  2962 00002139 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  2963 0000213B 01C6                <1> 	add	esi, eax
  2964 0000213D 0FB6CF              <1> 	movzx	ecx, bh ; cols
  2965 00002140 66C1E103            <1> 	shl	cx, 3 ; * 8 ; 06/08/2016
  2966 00002144 F3A4                <1> 	rep	movsb
  2967 00002146 5F                  <1> 	pop	edi
  2968 00002147 5E                  <1> 	pop	esi
  2969 00002148 FEC2                <1> 	inc	dl ; 06/08/2016
  2970 0000214A FECE                <1> 	dec	dh
  2971 0000214C 75DC                <1> 	jnz	short vgamem_copy_l8_0
  2972                              <1> vgamem_copy_l8_1:
  2973 0000214E 59                  <1> 	pop	ecx
  2974                              <1> 
  2975                              <1> 	;; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  2976                              <1> 	;mov	ax, 0005h
  2977                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  2978                              <1> 	;out	dx, ax
  2979                              <1> 
  2980 0000214F 58                  <1> 	pop	eax
  2981 00002150 5A                  <1> 	pop	edx
  2982                              <1> 
  2983 00002151 C3                  <1> 	retn
  2984                              <1> 
  2985                              <1> vgamem_fill_l8:
  2986                              <1> 	; 08/08/2016
  2987                              <1> 	; 07/08/2016
  2988                              <1> 	; 06/08/2016
  2989                              <1> 	; 04/08/2016
  2990                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  2991                              <1> 	;
  2992                              <1> 	; TEMPORARY
  2993                              <1> 	;
  2994                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  2995                              <1> 	; vgabios-0.7a (2011)
  2996                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  2997                              <1> 	; 'vgabios.c', 'vgamem_fill_pl4'
  2998                              <1> 	;
  2999                              <1> 	; vgamem_fill_pl4(xstart,ystart,cols,nbcols,cheight,attr)
  3000                              <1> 	; cl = xstart, edi = ch = ystart, bh = cols,
  3001                              <1> 	; [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight, attr = 0
  3002                              <1> 
  3003                              <1> 	; dest=ystart*cheight*nbcols+xstart;
  3004 00002152 52                  <1> 	push	edx
  3005 00002153 50                  <1> 	push	eax
  3006                              <1> 
  3007                              <1> 	;; outw(VGAREG_GRDC_ADDRESS, 0x0205)
  3008                              <1> 	;mov	ax, 0205h
  3009                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  3010                              <1> 	;out	dx, ax
  3011                              <1> 
  3012                              <1>         ; 08/08/2016
  3013 00002154 0FB605[F2F70000]    <1> 	movzx   eax, byte [CHAR_HEIGHT]
  3014 0000215B F6E5                <1> 	mul	ch
  3015                              <1> 	;; 07/08/2016
  3016                              <1> 	;movzx	eax, ch
  3017                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  3018 0000215D 0FB615[F0F70000]    <1> 	movzx	edx, byte [CRT_COLS] ; = [VGA_COLS]
  3019 00002164 F7E2                <1> 	mul	edx
  3020                              <1> 	; edx  = 0
  3021 00002166 88CA                <1> 	mov	dl, cl 
  3022 00002168 01D0                <1> 	add	eax, edx
  3023 0000216A 89C7                <1> 	mov	edi, eax
  3024 0000216C 66C1E703            <1> 	shl	di, 3 ; * 8 ; 06/08/2016
  3025                              <1> 	; edi = dest
  3026                              <1> 	; for(i=0;i<cheight;i++)
  3027                              <1>   	; {
  3028                              <1>    	;  memsetb(0xa000,dest+i*nbcols,attr,cols);
  3029                              <1>   	; }
  3030 00002170 81C700000A00        <1> 	add	edi, 0A0000h
  3031 00002176 51                  <1> 	push	ecx
  3032                              <1> 	; 08/08/2016
  3033 00002177 8A35[F2F70000]      <1> 	mov	dh, [CHAR_HEIGHT]
  3034                              <1> 	;; 07/08/2016
  3035                              <1> 	;mov	dh, 8 ; 07/08/2016
  3036 0000217D 28D2                <1> 	sub	dl, dl ; i
  3037                              <1> vgamem_fill_l8_0:
  3038 0000217F 57                  <1> 	push	edi
  3039 00002180 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS]
  3040 00002187 F6E2                <1> 	mul	dl
  3041                              <1> 	; eax = i * nbcols
  3042 00002189 66C1E003            <1> 	shl	ax, 3 ; * 8 ; 06/08/2016
  3043 0000218D 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  3044 0000218F 88D8                <1> 	mov	al, bl ; attr ; 04/08/2016
  3045 00002191 0FB6CF              <1> 	movzx	ecx, bh ; cols
  3046 00002194 66C1E103            <1> 	shl	cx, 3 ; * 8 ; 06/08/2016
  3047 00002198 F3AA                <1>  	rep	stosb
  3048 0000219A 5F                  <1> 	pop	edi
  3049 0000219B FEC2                <1> 	inc	dl ; 06/08/2016
  3050 0000219D FECE                <1> 	dec	dh
  3051 0000219F 75DE                <1> 	jnz	short vgamem_fill_l8_0
  3052                              <1> vgamem_fill_l8_1:
  3053 000021A1 59                  <1> 	pop	ecx
  3054                              <1> 
  3055                              <1> 	;; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  3056                              <1> 	;mov	ax, 0005h
  3057                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  3058                              <1> 	;out	dx, ax
  3059                              <1> 
  3060 000021A2 58                  <1> 	pop	eax
  3061 000021A3 5A                  <1> 	pop	edx 
  3062                              <1> 
  3063 000021A4 C3                  <1> 	retn
  3064                              <1> 
  3065                              <1> vga_graphics_down:
  3066                              <1> 	; 08/08/2016
  3067                              <1> 	; 07/08/2016
  3068                              <1> 	; 31/07/2016
  3069                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  3070                              <1> 	;
  3071                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  3072                              <1> 	; vgabios-0.7a (2011)
  3073                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  3074                              <1> 	; 'vgabios.c', 'biosfn_scroll'
  3075                              <1> 	;
  3076                              <1> 
  3077                              <1> 	; cl = upper left column
  3078                              <1> 	; ch = upper left row
  3079                              <1> 	; dl = lower rigth column
  3080                              <1> 	; dh = lower right row
  3081                              <1> 	;
  3082                              <1> 	; al = line count (AL=0 means blank entire fields)
  3083                              <1> 	; bl = fill value for blanked lines	
  3084                              <1> 	; bh = unused
  3085                              <1> 	;
  3086                              <1> 	; ah = [CRT_MODE], current video mode	
  3087                              <1> 
  3088 000021A5 FC                  <1>         cld     ; !!! Clear direction flag !!! 
  3089                              <1> 
  3090 000021A6 88C7                <1> 	mov	bh, al ; 31/07/2016
  3091                              <1> 
  3092 000021A8 BE[0AF80000]        <1> 	mov	esi, vga_modes
  3093 000021AD 89F7                <1> 	mov	edi, esi
  3094 000021AF 83C710              <1> 	add	edi, vga_mode_count
  3095                              <1> vga_g_down_0:
  3096 000021B2 AC                  <1> 	lodsb
  3097 000021B3 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  3098 000021B5 7405                <1> 	je	short vga_g_down_1
  3099 000021B7 39FE                <1> 	cmp	esi, edi
  3100 000021B9 72F7                <1> 	jb	short vga_g_down_0
  3101                              <1> 	; xor 	bh, bh	; 31/07/2016
  3102 000021BB C3                  <1> 	retn	; nothing to do
  3103                              <1> vga_g_down_1:
  3104 000021BC 88F8                <1> 	mov	al, bh ; 31/07/2016
  3105 000021BE 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  3106                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  3107                              <1> 	
  3108                              <1> 	; if(rlr>=nbrows)rlr=nbrows-1;
  3109                              <1>  	; if(clr>=nbcols)clr=nbcols-1;
  3110                              <1>  	; if(nblines>nbrows)nblines=0;
  3111                              <1>  	; cols=clr-cul+1;
  3112                              <1> 
  3113 000021C1 3A35[F6F70000]      <1> 	cmp	dh, [VGA_ROWS]
  3114 000021C7 7208                <1> 	jb	short vga_g_down_2
  3115 000021C9 8A35[F6F70000]      <1> 	mov	dh, [VGA_ROWS]
  3116 000021CF FECE                <1> 	dec	dh
  3117                              <1> vga_g_down_2:
  3118 000021D1 3A15[F0F70000]      <1> 	cmp	dl, [CRT_COLS]  ; = [VGA_COLS]
  3119 000021D7 7208                <1> 	jb	short vga_g_down_3
  3120 000021D9 8A15[F0F70000]      <1> 	mov	dl, [CRT_COLS]
  3121 000021DF FECA                <1> 	dec	dl
  3122                              <1> vga_g_down_3:	
  3123 000021E1 3A05[F6F70000]      <1> 	cmp	al, [VGA_ROWS]
  3124 000021E7 7602                <1> 	jna	short vga_g_down_4
  3125 000021E9 28C0                <1> 	sub	al, al ; 0
  3126                              <1> vga_g_down_4:
  3127 000021EB 88F7                <1> 	mov	bh, dh ; clr
  3128 000021ED 28CF                <1> 	sub	bh, cl ; cul
  3129 000021EF FEC7                <1> 	inc	bh ; cols = clr-cul+1
  3130                              <1> 
  3131 000021F1 20C0                <1> 	and	al, al ; nblines = 0
  3132 000021F3 755B                <1> 	jnz	short vga_g_down_6
  3133 000021F5 20ED                <1> 	and	ch, ch ; rul = 0
  3134 000021F7 7557                <1> 	jnz	short vga_g_down_6
  3135 000021F9 20C9                <1> 	and	cl, cl ; cul = 0
  3136 000021FB 7553                <1> 	jnz	short vga_g_down_6
  3137                              <1> 
  3138 000021FD 6650                <1> 	push	ax
  3139 000021FF A0[F6F70000]        <1> 	mov	al, [VGA_ROWS]
  3140 00002204 FEC8                <1> 	dec	al  
  3141 00002206 38C6                <1> 	cmp	dh, al ; rlr = nbrows-1
  3142 00002208 7544                <1> 	jne	short vga_g_down_5
  3143 0000220A A0[F0F70000]        <1>         mov     al, [CRT_COLS]  ; = VGA_COLS
  3144 0000220F FEC8                <1> 	dec	al 
  3145 00002211 38C2                <1>  	cmp	dl, al ; clr = nbcols-1
  3146 00002213 7539                <1> 	jne	short vga_g_down_5
  3147 00002215 6658                <1> 	pop	ax
  3148                              <1> 
  3149 00002217 66B80502            <1> 	mov	ax, 0205h
  3150 0000221B 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  3151 0000221F 66EF                <1> 	out	dx, ax
  3152 00002221 A0[F6F70000]        <1> 	mov	al, [VGA_ROWS]
  3153 00002226 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS] ; = [VGA_COLS]
  3154 0000222C F6E4                <1> 	mul	ah
  3155 0000222E 0FB7D0              <1> 	movzx	edx, ax
  3156                              <1> 	; 08/08/2016
  3157 00002231 0FB605[F2F70000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  3158 00002238 F7E2                <1> 	mul	edx
  3159                              <1> 	; eax = byte count	
  3160 0000223A 89C1                <1> 	mov	ecx, eax
  3161                              <1> 	;; 07/08/2016
  3162                              <1> 	;shl	dx, 3 ; * 8 ; * [CHAR_HEIGHT]
  3163                              <1> 	;mov	ecx, edx
  3164 0000223C 88D8                <1> 	mov	al, bl ; fill value for blanked lines
  3165 0000223E BF00000A00          <1> 	mov	edi, 0A0000h
  3166 00002243 F3AA                <1> 	rep	stosb			
  3167                              <1> 	
  3168 00002245 B005                <1> 	mov	al, 5
  3169 00002247 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  3170 0000224B 66EF                <1> 	out	dx, ax ; 0005h	
  3171                              <1> 
  3172 0000224D C3                  <1> 	retn
  3173                              <1> 
  3174                              <1> vga_g_down_5:
  3175 0000224E 6658                <1> 	pop	ax
  3176                              <1> 
  3177                              <1> vga_g_down_6:
  3178                              <1> 	; [ESI] = VGA memory model number for current video mode
  3179                              <1>         ;
  3180                              <1>         ; LINEAR8 equ 5
  3181                              <1>         ; PLANAR4 equ 4
  3182                              <1>         ; PLANAR1 equ 3
  3183                              <1> 
  3184 00002250 803E04              <1> 	cmp	byte [esi], PLANAR4
  3185 00002253 742C                <1> 	je	short vga_g_down_planar
  3186 00002255 803E03              <1> 	cmp	byte [esi], PLANAR1
  3187 00002258 7427                <1> 	je	short vga_g_down_planar
  3188                              <1> vga_g_down_linear8:
  3189                              <1> 	; 07/07/2016 (TEMPORARY)
  3190                              <1> 	;
  3191                              <1> 	; cl = upper left column ; cul
  3192                              <1> 	; ch = upper left row ; rul
  3193                              <1> 	; dl = lower rigth column ; clr
  3194                              <1> 	; dh = lower right row ; rlr
  3195                              <1> 
  3196                              <1> vga_g_down_l0:
  3197                              <1> 	;{for(i=rlr;i>=rul;i--)
  3198                              <1>         ; if((i<rul+nblines)||(nblines==0))
  3199 0000225A 08C0                <1> 	or	al, al
  3200 0000225C 741C                <1> 	jz	short vga_g_down_l2
  3201 0000225E 88C4                <1> 	mov	ah, al
  3202 00002260 00EC                <1> 	add	ah, ch
  3203                              <1> 	;jc	short vga_g_down_l2	
  3204 00002262 86EE                <1> 	xchg	ch, dh
  3205 00002264 38E5                <1> 	cmp	ch, ah
  3206 00002266 7212                <1> 	jb	short vga_g_down_l2
  3207 00002268 88EC                <1> 	mov	ah, ch
  3208 0000226A 28C4                <1> 	sub	ah, al ; ah = i - nblines
  3209                              <1> 	; else
  3210                              <1> 	; vgamem_copy_pl4(cul,i,i-nblines,cols,nbcols,cheight);
  3211 0000226C E877FEFFFF          <1> 	call	vgamem_copy_l8
  3212                              <1> vga_g_down_l1:
  3213 00002271 86F5                <1> 	xchg	dh, ch
  3214 00002273 FECE                <1> 	dec	dh 
  3215 00002275 38EE                <1> 	cmp	dh, ch
  3216 00002277 73E1                <1> 	jnb	short vga_g_down_l0
  3217 00002279 C3                  <1> 	retn
  3218                              <1> 
  3219                              <1> vga_g_down_l2:
  3220                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  3221 0000227A E8D3FEFFFF          <1> 	call	vgamem_fill_l8
  3222 0000227F EBF0                <1> 	jmp	short vga_g_down_l1
  3223                              <1> 		 
  3224                              <1> vga_g_down_planar:
  3225                              <1> 	; cl = upper left column ; cul
  3226                              <1> 	; ch = upper left row ; rul
  3227                              <1> 	; dl = lower rigth column ; clr
  3228                              <1> 	; dh = lower right row ; rlr
  3229                              <1> vga_g_down_pl0:
  3230                              <1>  	;{for(i=rlr;i>=rul;i--)
  3231                              <1>         ; if((i<rul+nblines)||(nblines==0))
  3232 00002281 08C0                <1> 	or	al, al
  3233 00002283 741C                <1> 	jz	short vga_g_down_pl2
  3234 00002285 88C4                <1> 	mov	ah, al
  3235 00002287 00EC                <1> 	add	ah, ch
  3236                              <1> 	;jc	short vga_g_down_pl2	
  3237 00002289 86EE                <1> 	xchg	ch, dh
  3238 0000228B 38E5                <1> 	cmp	ch, ah
  3239 0000228D 7212                <1> 	jb	short vga_g_down_pl2
  3240 0000228F 88EC                <1> 	mov	ah, ch
  3241 00002291 28C4                <1> 	sub	ah, al ; ah = i - nblines
  3242                              <1> 	; else
  3243                              <1> 	; vgamem_copy_pl4(cul,i,i-nblines,cols,nbcols,cheight);
  3244 00002293 E88BFDFFFF          <1> 	call	vgamem_copy_pl4
  3245                              <1> vga_g_down_pl1:
  3246 00002298 86F5                <1> 	xchg	dh, ch
  3247 0000229A FECE                <1> 	dec	dh 
  3248 0000229C 38EE                <1> 	cmp	dh, ch
  3249 0000229E 73E1                <1> 	jnb	short vga_g_down_pl0
  3250 000022A0 C3                  <1> 	retn
  3251                              <1> 
  3252                              <1> vga_g_down_pl2:
  3253                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  3254 000022A1 E8EBFDFFFF          <1> 	call	vgamem_fill_pl4
  3255 000022A6 EBF0                <1> 	jmp	short vga_g_down_pl1
  3256                              <1> 
  3257                              <1> ; 07/07/2016
  3258                              <1> ; 27/06/2016 - TRDOS 386 (TRDOS v2.0)
  3259                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3260                              <1> ;------------------------------------------------------
  3261                              <1> ; SCROLL DOWN
  3262                              <1> ;  THIS ROUTINE SCROLLS DOWN THE INFORMATION ON THE CRT
  3263                              <1> ; ENTRY --
  3264                              <1> ;  CH,CL = UPPER LEFT CORNER OF REGION TO SCROLL
  3265                              <1> ;  DH,DL = LOWER RIGHT CORNER OF REGION TO SCROLL
  3266                              <1> ;   BOTH OF THE ABOVE ARE IN CHARACTER POSITIONS
  3267                              <1> ;  BH = FILL VALUE FOR BLANKED LINES
  3268                              <1> ;  AL = # LINES TO SCROLL (AL=0 MEANS BLANK THE ENTIRE FIELD)
  3269                              <1> ;  DS = DATA SEGMENT
  3270                              <1> ;  ES = REGEN SEGMENT
  3271                              <1> ; EXIT --
  3272                              <1> ;  NOTHING, THE SCREEN IS SCROLLED
  3273                              <1> ;--------------------------------------------------------
  3274                              <1> 
  3275                              <1> 	; cl = upper left column
  3276                              <1> 	; ch = upper left row
  3277                              <1> 	; dl = lower rigth column
  3278                              <1> 	; dh = lower right row
  3279                              <1> 	;
  3280                              <1> 	; al = line count (AL=0 means blank entire fields)
  3281                              <1> 	; bl = fill value for blanked lines	
  3282                              <1> 	; bh = unused
  3283                              <1> 
  3284                              <1> GRAPHICS_DOWN:
  3285                              <1> 	; 07/07/2016
  3286                              <1> 	;AH = Current video mode, [CRT_MODE]
  3287                              <1> 	;STD				; SET DIRECTION
  3288 000022A8 80FC07              <1> 	cmp	ah, 7
  3289 000022AB 0F87F4FEFFFF        <1>         ja      vga_graphics_down
  3290                              <1> 	;je	_n0
  3291                              <1> 
  3292 000022B1 88C7                <1> 	MOV	bh, al			; save line count in BH
  3293 000022B3 6689D0              <1> 	MOV	AX, DX			; GET LOWER RIGHT POSITION INTO AX REG
  3294                              <1> 
  3295                              <1> ;-----	USE CHARACTER SUBROUTINE FOR POSITIONING
  3296                              <1> ;-----	ADDRESS RETURNED IS MULTIPLIED BY 2 FROM CORRECT VALUE
  3297                              <1> 
  3298 000022B6 E8F1010000          <1> 	CALL	GRAPH_POSN
  3299 000022BB 0FB7F8              <1> 	MOVzx	eDI, AX			; SAVE RESULT AS DESTINATION ADDRESS
  3300                              <1> 
  3301                              <1> ;-----	DETERMINE SIZE OF WINDOW
  3302                              <1> 
  3303 000022BE 6629CA              <1> 	SUB	DX, CX
  3304 000022C1 6681C20101          <1>         ADD     DX, 101h                ; ADJUST VALUES
  3305 000022C6 C0E602              <1> 	SAL	DH, 2			; MULTIPLY ROWS BY 4 AT 8 VERT DOTS/CHAR
  3306                              <1> 					; AND EVEN/ODD ROWS
  3307                              <1> 
  3308                              <1> ;-----	DETERMINE CRT MODE
  3309                              <1> 
  3310 000022C9 803D[EEF70000]06    <1> 	CMP	byte [CRT_MODE], 6	; TEST FOR MEDIUM RES
  3311 000022D0 7307                <1>         JNC     short _R12              ; FIND_SOURCE_DOWN
  3312                              <1> 
  3313                              <1> ;-----	MEDIUM RES DOWN
  3314 000022D2 D0E2                <1> 	SAL	DL, 1			; # COLUMNS * 2, SINCE 2 BYTES/CHAR
  3315 000022D4 66D1E7              <1> 	SAL	DI, 1			; OFFSET *2 SINCE 2 BYTES/CHAR
  3316 000022D7 6647                <1> 	INC	DI			; POINT TO LAST BYTE
  3317                              <1> 
  3318                              <1> ;-----	DETERMINE THE SOURCE ADDRESS IN THE BUFFER
  3319                              <1> 
  3320                              <1> _R12:                                   ; FIND_SOURCE_DOWN
  3321 000022D9 81C700800B00        <1> 	add	edi, 0B8000h		
  3322 000022DF 6681C7F000          <1> 	ADD	DI, 240			; POINT TO LAST ROW OF PIXELS
  3323 000022E4 C0E702              <1> 	sal	bh, 2			; multiply number of lines by 4
  3324 000022E7 74(06)              <1> 	JZ	short 6			; IF ZERO, THEN BLANK ENTIRE FIELD
  3325 000022E9 B050                <1> 	MOV	AL, 80			; 80 BYTES/ROW
  3326 000022EB F6E7                <1> 	mul	bh			; determine offset to source
  3327 000022ED 89FE                <1> 	MOV	eSI, eDI		; SET UP SOURCE
  3328 000022EF 6629C6              <1> 	SUB	SI, AX			; SUBTRACT THE OFFSET
  3329 000022F2 88F4                <1> 	MOV	AH, DH			; NUMBER OF ROWS IN FIELD
  3330 000022F4 28FC                <1> 	sub	ah, bh			; determine number to move
  3331                              <1> 
  3332                              <1> ;-----	LOOP THROUGH, MOVING ONE ROW AT A TIME, BOTH EVEN AND ODD FIELDS
  3333                              <1> 
  3334                              <1> _R13:                                   ; ROW_LOOP_DOWN
  3335 000022F6 E823000000          <1>         CALL    _R17                    ; MOVE ONE ROW
  3336 000022FB 6681EE5020          <1> 	SUB	SI, 2000h+80		; MOVE TO NEXT ROW
  3337 00002300 6681EF5020          <1> 	SUB	DI, 2000h+80
  3338 00002305 FECC                <1> 	DEC	AH			; NUMBER OF ROWS TO MOVE
  3339 00002307 75ED                <1>         JNZ     short _R13              ; CONTINUE TILL ALL MOVED
  3340                              <1> 
  3341                              <1> ;-----	FILL IN THE VACATED LINE(S)
  3342                              <1> _R14:                                   ; CLEAR_ENTRY_DOWN
  3343 00002309 88D8                <1> 	mov	al, bl			; attribute to fill with
  3344                              <1> _R15_:                                  ; CLEAR_LOOP_DOWN
  3345 0000230B E82A000000          <1> 	CALL	_R18			; CLEAR A ROW
  3346 00002310 6681EF5020          <1> 	SUB	DI, 2000h+80		; POINT TO NEXT LINE
  3347 00002315 FECF                <1> 	dec	bh			; number of lines to fill
  3348 00002317 75F2                <1>         JNZ     short _R15_             ; CLEAR_LOOP_DOWN
  3349                              <1> 
  3350 00002319 C3                  <1> 	retn				; EVERYYHING DONE
  3351                              <1> 
  3352                              <1> _R16:                                   ; BLANK_FIELD_DOWN
  3353 0000231A 88F7                <1> 	mov	bh, dh			; set blank count to everything in field
  3354 0000231C EBEB                <1>         JMP     short _R14              ; CLEAR THE FIELD
  3355                              <1> 
  3356                              <1> ; 27/06/2016 - TRDOS 386 (TRDOS v2.0)
  3357                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3358                              <1> 
  3359                              <1> ;-----	ROUTINE TO MOVE ONE ROW OF INFORMATION
  3360                              <1> 
  3361                              <1> _R17:
  3362 0000231E 0FB6CA              <1> 	MOVzx	ecx, DL			; NUMBER OF BYTES IN THE ROW
  3363 00002321 56                  <1> 	PUSH	eSI
  3364 00002322 57                  <1> 	PUSH	eDI			; SAVE POINTERS
  3365 00002323 F3A4                <1> 	REP	MOVSB			; MOVE THE EVEN FIELD
  3366 00002325 5F                  <1> 	POP	eDI
  3367 00002326 5E                  <1> 	POP	eSI
  3368 00002327 6681C60020          <1> 	ADD	SI, 2000h
  3369 0000232C 6681C70020          <1> 	ADD	DI, 2000h		; POINT TO THE ODD FIELD
  3370 00002331 56                  <1> 	PUSH	eSI
  3371 00002332 57                  <1> 	PUSH	eDI			; SAVE THE POINTERS
  3372 00002333 88D1                <1> 	MOV	CL, DL			; COUNT BACK
  3373 00002335 F3A4                <1> 	REP	MOVSB			; MOVE THE ODD FIELD
  3374 00002337 5F                  <1> 	POP	eDI
  3375 00002338 5E                  <1> 	POP	eSI			; POINTERS BACK
  3376 00002339 C3                  <1> 	RETn				; RETURN TO CALLER
  3377                              <1> 
  3378                              <1> ;-----	CLEAR A SINGLE ROW
  3379                              <1> 
  3380                              <1> _R18:
  3381 0000233A 0FB6CA              <1> 	MOVzx	ecx, DL			; NUMBER OF BYTES IN FIELD
  3382 0000233D 57                  <1> 	PUSH	eDI			; SAVE POINTER
  3383 0000233E F3AA                <1> 	REP	STOSB			; STORE THE NEW VALUE
  3384 00002340 5F                  <1> 	POP	eDI			; POINTER BACK
  3385 00002341 6681C70020          <1> 	ADD	DI, 2000h		; POINT TO ODD FIELD
  3386 00002346 57                  <1> 	PUSH	eDI
  3387 00002347 88D1                <1> 	MOV	CL, DL
  3388 00002349 F3AA                <1> 	REP	STOSB			; FILL THE ODD FIELD
  3389 0000234B 5F                  <1> 	POP	eDI
  3390 0000234C C3                  <1> 	RETn				; RETURN TO CALLER
  3391                              <1> 
  3392                              <1> ; 04/07/2016
  3393                              <1> ; 01/07/2016
  3394                              <1> ; 30/06/2016 - TRDOS 386 (TRDOS v2.0)
  3395                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3396                              <1> ;--------------------------------------------------
  3397                              <1> ; GRAPHICS WRITE
  3398                              <1> ;  THIS ROUTINE WRITES THE ASCII CHARACTER TO THE CURRENT
  3399                              <1> ;  POSITION ON THE SCREEN.
  3400                              <1> ; ENTRY --
  3401                              <1> ;  AL = CHARACTER TO WRITE
  3402                              <1> ;  BL = COLOR ATTRIBUTE TO BE USED FOR FOREGROUND COLOR
  3403                              <1> ;	IF BIT 7 IS SET, THE CHAR IS XOR'D INTO THE REGEN BUFFER
  3404                              <1> ;	(0 IS USED FOR THE BACKGROUND COLOR)
  3405                              <1> ;  CX = NUMBER OF CHARS TO WRITE
  3406                              <1> ;  DS = DATA SEGMENT
  3407                              <1> ;  ES = REGEN SEGMENT
  3408                              <1> ; EXIT --
  3409                              <1> ;  NOTHING IS RETURNED
  3410                              <1> ;
  3411                              <1> ; GRAPHICS READ
  3412                              <1> ;  THIS ROUTINE READS THE ASCII CHARACTER AT THE CURRENT CURSOR
  3413                              <1> ;  POSITION ON THE SCREEN BY MATCHING THE DOTS ON THE SCREEN TO THE
  3414                              <1> ;  CHARACTER GENERATOR CODE POINTS
  3415                              <1> ; ENTRY --
  3416                              <1> ;  NONE (0 IS ASSUMED AS THE BACKGROUND COLOR)
  3417                              <1> ; EXIT --
  3418                              <1> ;  AL = CHARACTER READ AT THAT POSITION (0 RETURNED IF NONE FOUND)
  3419                              <1> ;
  3420                              <1> ; FOR BOTH ROUTINES, THE IMAGES USED TO FORM CHARS ARE CONTAINED IN ROM
  3421                              <1> ;  FOR THE 1ST 128 CHARS.  TO ACCESS CHARS IN THE SECOND HALF, THE USER
  3422                              <1> ;  MUST INITIALIZE THE VECTOR AT INTERRUPT 1FH (LOCATION 0007CH) TO
  3423                              <1> ;  POINT TO THE USER SUPPLIED TABLE OF GRAPHIC IMAGES (8X8 BOXES).
  3424                              <1> ;  FAILURE TO DO SO WILL CAUSE IN STRANGE RESULTS
  3425                              <1> ;-----------------------------------------------------
  3426                              <1> 
  3427                              <1> GRAPHICS_WRITE:
  3428 0000234D 25FF000000          <1> 	and 	eax, 0FFh		; ZERO TO HIGH OF CODE POINT
  3429 00002352 50                  <1> 	PUSH	eAX			; SAVE CODE POINT VALUE
  3430                              <1> 
  3431                              <1> ;-----	DETERMINE POSITION IN REGEN BUFFER TO PUT CODE POINTS
  3432                              <1> 
  3433 00002353 E84D010000          <1> 	CALL	S26			; FIND LOCATION IN REGEN BUFFER
  3434 00002358 89C7                <1> 	MOV	eDI, eAX		; REGEN POINTER IN DI
  3435                              <1> 
  3436                              <1> ;-----	DETERMINE REGION TO GET CODE POINTS FROM
  3437                              <1> 
  3438 0000235A 58                  <1> 	POP	eAX			; RECOVER CODE POINT
  3439                              <1> 
  3440 0000235B BE[50050100]        <1> 	MOV	eSI, CRT_CHAR_GEN	; OFFSET OF IMAGES
  3441                              <1> 
  3442                              <1> ;-----	DETERMINE GRAPHICS MODE IN OPERATION
  3443                              <1> 					; DETERMINE_MODE
  3444 00002360 66C1E003            <1> 	SAL	AX, 3			; MULTIPLY CODE POINT VALUE BY 8
  3445 00002364 01C6                <1> 	ADD	eSI, eAX		; SI HAS OFFSET OF DESIRED CODES
  3446                              <1> 	
  3447 00002366 803D[EEF70000]06    <1> 	CMP	byte [CRT_MODE], 6
  3448 0000236D 7231                <1> 	JC	short S6		; TEST FOR MEDIUM RESOLUTION MODE
  3449                              <1> 
  3450                              <1> ;-----	HIGH RESOLUTION MODE
  3451                              <1> 
  3452 0000236F 81C700800B00        <1> 	add	edi, 0B8000h
  3453                              <1> S1:					; HIGH_CHAR
  3454 00002375 57                  <1> 	PUSH	eDI			; SAVE REGEN POINTER
  3455 00002376 56                  <1> 	PUSH	eSI			; SAVE CODE POINTER
  3456 00002377 B604                <1> 	MOV	DH, 4			; NUMBER OF TIMES THROUGH LOOP
  3457                              <1> S2:
  3458 00002379 AC                  <1> 	LODSB				; GET BYTE FROM CODE POINTS
  3459 0000237A F6C380              <1> 	TEST	BL, 80H			; SHOULD WE USE THE FUNCTION
  3460 0000237D 7515                <1> 	JNZ	short S5		; TO PUT CHAR IN
  3461 0000237F AA                  <1> 	STOSB				; STORE IN REGEN BUFFER
  3462 00002380 AC                  <1> 	LODSB
  3463                              <1> S4:
  3464 00002381 8887FF1F0000        <1> 	MOV	[eDI+2000H-1], AL ; STORE IN SECOND HALF
  3465 00002387 83C74F              <1> 	ADD	eDI, 79			; MOVE TO NEXT ROW IN REGEN
  3466 0000238A FECE                <1> 	DEC	DH			; DONE WITH LOOP
  3467 0000238C 75EB                <1> 	JNZ	short S2
  3468 0000238E 5E                  <1> 	POP	eSI
  3469 0000238F 5F                  <1> 	POP	eDI			; RECOVER REGEN POINTER
  3470 00002390 47                  <1> 	INC	eDI			; POINT TO NEXT CHAR POSITION
  3471 00002391 E2E2                <1> 	LOOP	S1			; MORE CHARS TO WRITE
  3472 00002393 C3                  <1> 	retn
  3473                              <1> 
  3474                              <1> S5:
  3475 00002394 3207                <1> 	XOR	AL, [eDI]		; EXCLUSIVE OR WITH CURRENT
  3476 00002396 AA                  <1> 	STOSB				; STORE THE CODE POINT
  3477 00002397 AC                  <1> 	LODSB				; AGAIN FOR ODD FIELD
  3478 00002398 3287FF1F0000        <1> 	XOR	AL, [eDI+2000H-1]
  3479 0000239E EBE1                <1> 	JMP	short S4		; BACK TO MAINSTREAM
  3480                              <1> 
  3481                              <1> ;-----	MEDIUM RESOLUTION WRITE
  3482                              <1> S6:					; MED_RES_WRITE
  3483 000023A0 88DA                <1> 	MOV	DL, BL			; SAVE HIGH COLOR BIT
  3484 000023A2 66D1E7              <1> 	SAL	DI, 1			; OFFSET*2 SINCE 2 BYTES/CHAR
  3485                              <1> 					; EXPAND BL TO FULL WORD OF COLOR
  3486 000023A5 80E303              <1> 	AND	BL, 3			; ISOLATE THE COLOR BITS ( LOW 2 BITS )
  3487 000023A8 B055                <1> 	MOV	AL, 055H 		; GET BIT CONVERSION MULTIPLIER
  3488 000023AA F6E3                <1> 	MUL	BL			; EXPAND 2 COLOR BITS TO 4 REPLICATIONS
  3489 000023AC 88C3                <1> 	MOV	BL, AL			; PLACE BACK IN WORK REGISTER
  3490 000023AE 88C7                <1> 	MOV	BH, AL			; EXPAND TO 8 REPLICATIONS OF COLOR BITS
  3491 000023B0 81C700800B00        <1> 	add	edi, 0B8000h
  3492                              <1> S7:                                     ; MED_CHAR
  3493 000023B6 57                  <1> 	PUSH	eDI			; SAVE REGEN POINTER
  3494 000023B7 56                  <1> 	PUSH	eSI			; SAVE THE CODE POINTER
  3495 000023B8 B604                <1> 	MOV	DH, 4			; NUMBER OF LOOPS
  3496                              <1> S8:
  3497 000023BA AC                  <1> 	LODSB				; GET CODE POINT
  3498 000023BB E8B3000000          <1> 	CALL	S21			; DOUBLE UP ALL THE BITS
  3499 000023C0 6621D8              <1> 	AND	AX, BX			; CONVERT TO FOREGROUND COLOR ( 0 BACK )
  3500 000023C3 86E0                <1> 	XCHG	AH, AL			; SWAP HIGH/LOW BYTES FOR WORD MOVE
  3501 000023C5 F6C280              <1> 	TEST	DL, 80H			; IS THIS XOR FUNCTION
  3502 000023C8 7403                <1> 	JZ	short S9		; NO, STORE IT IN AS IS
  3503 000023CA 663307              <1> 	XOR	AX, [eDI]		; DO FUNCTION WITH LOW/HIGH
  3504                              <1> S9:
  3505 000023CD 668907              <1> 	MOV	[eDI], AX		; STORE FIRST BYTE HIGH, SECOND LOW
  3506 000023D0 AC                  <1> 	LODSB				; GET CODE POINT
  3507 000023D1 E89D000000          <1> 	CALL	S21
  3508 000023D6 6621D8              <1> 	AND	AX, BX			; CONVERT TO COLOR
  3509 000023D9 86E0                <1> 	XCHG	AH, AL			; SWAP HIGH/LOW BYTES FOR WORD MOVE
  3510 000023DB F6C280              <1> 	TEST	DL, 80H			; AGAIN, IS THIS XOR FUNCTION
  3511 000023DE 7407                <1> 	JZ	short _S10		; NO, JUST STORE THE VALUES
  3512 000023E0 66338700200000      <1> 	XOR	AX, [eDI+2000H]		; FUNCTION WITH FIRST HALF LOW
  3513                              <1> _S10:
  3514 000023E7 66898700200000      <1> 	MOV	[eDI+2000H], AX		; STORE SECOND PORTION HIGH
  3515 000023EE 6683C750            <1> 	ADD	DI, 80			; POINT TO NEXT LOCATION
  3516 000023F2 FECE                <1> 	DEC	DH
  3517 000023F4 75C4                <1> 	JNZ	short S8		; KEEP GOING
  3518 000023F6 5E                  <1> 	POP	eSI			; RECOVER CODE POINTER
  3519 000023F7 5F                  <1> 	POP	eDI			; RECOVER REGEN POINTER
  3520 000023F8 47                  <1> 	INC	eDI			; POINT TO NEXT CHAR POSITION
  3521 000023F9 47                  <1> 	INC	eDI
  3522 000023FA E2BA                <1> 	LOOP	S7			; MORE TO WRITE
  3523 000023FC C3                  <1> 	retn
  3524                              <1> 
  3525                              <1> ; 04/07/2016
  3526                              <1> ; 01/07/2016
  3527                              <1> ; 30/06/2016 - TRDOS 386 (TRDOS v2.0)
  3528                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3529                              <1> ;----------------------------------------
  3530                              <1> ; GRAPHICS READ
  3531                              <1> ;----------------------------------------
  3532                              <1> GRAPHICS_READ:
  3533 000023FD E8A3000000          <1> 	CALL	S26			; CONVERTED TO OFFSET IN REGEN
  3534 00002402 89C6                <1> 	MOV	eSI, eAX		; SAVE IN SI
  3535 00002404 81C600800B00        <1> 	add	esi, 0B8000h		; 01/07/2016
  3536 0000240A 83EC08              <1> 	SUB	eSP, 8			; ALLOCATE SPACE FOR THE READ CODE POINT
  3537 0000240D 89E5                <1> 	MOV	eBP, eSP		; POINTER TO SAVE AREA
  3538                              <1> 
  3539                              <1> ;-----	DETERMINE GRAPHICS MODES
  3540 0000240F B604                <1> 	mov	dh, 4			; number of passes ; 01/07/2016
  3541 00002411 803D[EEF70000]06    <1> 	CMP	byte [CRT_MODE], 6
  3542 00002418 7219                <1> 	JC	short S12		; MEDIUM RESOLUTION
  3543                              <1> 
  3544                              <1> ;-----	HIGH RESOLUTION READ
  3545                              <1> ;-----	GET VALUES FROM REGEN BUFFER AND CONVERT TO CODE POINT
  3546                              <1> 	;MOV	DH,4			; NUMBER OF PASSES
  3547                              <1> S11:
  3548 0000241A 8A06                <1> 	MOV	AL, [eSI] 		; GET FIRST BYTE
  3549 0000241C 884500              <1> 	MOV	[eBP], AL 		; SAVE IN STORAGE AREA
  3550 0000241F 45                  <1> 	INC	eBP			; NEXT LOCATION
  3551 00002420 8A8600200000        <1> 	MOV	AL, [eSI+2000H]		; GET LOWER REGION BYTE
  3552 00002426 884500              <1> 	MOV	[eBP], AL 		; ADJUST AND STORE
  3553 00002429 45                  <1> 	INC	eBP
  3554 0000242A 83C650              <1> 	ADD	eSI, 80			; POINTER INTO REGEN
  3555 0000242D FECE                <1> 	DEC	DH			; LOOP CONTROL
  3556 0000242F 75E9                <1> 	JNZ	short S11		; DO IT SOME MORE
  3557 00002431 EB1D                <1> 	JMP	SHORT S14		; GO MATCH THE SAVED CODE POINTS
  3558                              <1> 
  3559                              <1> ;-----	MEDIUM RESOLUTION READ
  3560                              <1> S12:	
  3561 00002433 66D1E6              <1> 	SAL	SI, 1			; OFFSET*2 SINCE 2 BYTES/CHAR
  3562                              <1> 	;MOV	DH, 4			; NUMBER OF PASSES
  3563                              <1> S13:
  3564 00002436 E84D000000          <1> 	CALL	S23			; GET BYTES FROM REGEN INTO SINGLE SAVE
  3565 0000243B 81C6FE1F0000        <1> 	ADD	eSI, 2000H-2		; GO TO LOWER REGION
  3566 00002441 E842000000          <1> 	CALL	S23			; GET THIS PAIR INTO SAVE
  3567 00002446 81EEB21F0000        <1> 	SUB	eSI, 2000H-80+2		; ADJUST POINTER BACK INTO UPPER
  3568 0000244C FECE                <1> 	DEC	DH
  3569 0000244E 75E6                <1> 	JNZ	short S13		; KEEP GOING UNTIL ALL 8 DONE
  3570                              <1> 
  3571                              <1> ;-----	SAVE AREA HAS CHARACTER IN IT, MATCH IT
  3572                              <1> S14:					; FIND_CHAR
  3573 00002450 BF[50050100]        <1> 	MOV	eDI, CRT_CHAR_GEN	; ESTABLISH ADDRESSING
  3574 00002455 83ED08              <1> 	SUB	eBP, 8			; ADJUST POINTER TO START OF SAVE AREA
  3575 00002458 89EE                <1> 	MOV	eSI, eBP
  3576                              <1> S15:
  3577 0000245A 66B80001            <1> 	mov	ax, 256			; NUMBER TO TEST AGAINST
  3578                              <1> S16:
  3579 0000245E 56                  <1> 	PUSH	eSI			; SAVE SAVE AREA POINTER
  3580 0000245F 57                  <1> 	PUSH	eDI			; SAVE CODE POINTER
  3581                              <1> 	;MOV	eCX, 4			; NUMBER OF WORDS TO MATCH
  3582                              <1> 	;REPE	CMPSW			; COMPARE THE 8 BYTES AS WORDS
  3583 00002460 A7                  <1> 	cmpsd				; compare first 4 bytes 
  3584 00002461 7501                <1> 	jne	short S17		; 
  3585 00002463 A7                  <1> 	cmpsd				; compare last 4 bytes
  3586                              <1> S17:
  3587 00002464 5F                  <1> 	POP	eDI			; RECOVER THE POINTERS
  3588 00002465 5E                  <1> 	POP	eSI
  3589                              <1> 	;JZ	short S18		; IF ZERO FLAG SET, THEN MATCH OCCURRED
  3590 00002466 7407                <1> 	je	short S18
  3591                              <1> 	;				; NO MATCH, MOVE ON TO NEXT
  3592 00002468 83C708              <1> 	ADD	eDI, 8			; NEXT CODE POINT
  3593 0000246B 6648                <1> 	dec	ax			; LOOP CONTROL
  3594 0000246D 75EF                <1> 	JNZ	short S16		; DO ALL OF THEM
  3595                              <1> 
  3596                              <1> ;-----	CHARACTER IS FOUND ( AL=0 IF NOT FOUND )
  3597                              <1> S18:	
  3598 0000246F 83C408              <1> 	ADD	eSP, 8			; READJUST THE STACK, THROW AWAY SAVE
  3599 00002472 C3                  <1> 	retn				; ALL DONE
  3600                              <1> 
  3601                              <1> ; 30/06/2016 - TRDOS 386 (TRDOS v2.0)
  3602                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3603                              <1> ;--------------------------------------------
  3604                              <1> ; EXPAND BYTE
  3605                              <1> ;  THIS ROUTINE TAKES THE BYTE IN AL AND DOUBLES ALL
  3606                              <1> ;  OF THE BITS, TURNING THE 8 BITS INTO 16 BITS.
  3607                              <1> ;  THE RESULT IS LEFT IN AX
  3608                              <1> ;--------------------------------------------
  3609                              <1> S21:
  3610 00002473 6651                <1> 	PUSH	CX			; SAVE REGISTER
  3611                              <1> 	;MOV	CX, 8			; SHIFT COUNT REGISTER FOR ONE BYTE
  3612 00002475 B108                <1> 	mov	cl, 8
  3613                              <1> S22:
  3614 00002477 D0C8                <1> 	ROR	AL,1			; SHIFT BITS, LOW BIT INTO CARRY FLAG
  3615 00002479 66D1DD              <1> 	RCR	BP,1			; MOVE CARRY FLAG (LOW BIT INTO RESULTS
  3616 0000247C 66D1FD              <1> 	SAR	BP,1			; SIGN EXTEND HIGH BIT (DOUBLE IT)
  3617                              <1> 	;LOOP	S22			; REPEAT FOR ALL 8 BITS
  3618 0000247F FEC9                <1> 	dec	cl
  3619 00002481 75F4                <1> 	jnz	short S22
  3620 00002483 6695                <1> 	XCHG	AX, BP			; MOVE RESULTS TO PARAMETER REGISTER
  3621 00002485 6659                <1> 	POP	CX			; RECOVER REGISTER
  3622 00002487 C3                  <1> 	RETn				; ALL DONE
  3623                              <1> 
  3624                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  3625                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3626                              <1> ;--------------------------------------------------
  3627                              <1> ; MED_READ_BYTE
  3628                              <1> ; THIS ROUTINE WILL TAKE 2 BYTES FROM THE REGEN BUFFER,
  3629                              <1> ;  COMPARE AGAINST THE CURRENT FOREGROUND COLOR, AND PLACE
  3630                              <1> ;  THE CORRESPONDING ON/OFF BIT PATTERN INTO THE CURRENT
  3631                              <1> ;  POSITION IN THE SAVE AREA
  3632                              <1> ; ENTRY --
  3633                              <1> ;  SI,DS = POINTER TO REGEN AREA OF INTEREST
  3634                              <1> ;  BX = EXPANDED FOREGROUND COLOR
  3635                              <1> ;  BP = POINTER TO SAVE AREA
  3636                              <1> ; EXIT --
  3637                              <1> ;  SI AND BP ARE INCREMENTED
  3638                              <1> ;----------------------------------------------------
  3639                              <1> S23:
  3640 00002488 66AD                <1> 	LODSW				; GET FIRST BYTE AND SECOND BYTES
  3641 0000248A 86C4                <1> 	XCHG	AL, AH			; SWAP FOR COMPARE
  3642 0000248C 66B900C0            <1> 	MOV	CX, 0C000H		; 2 BIT MASK TO TEST THE ENTRIES
  3643 00002490 B200                <1> 	MOV	DL, 0			; RESULT REGISTER
  3644                              <1> S24:
  3645 00002492 6685C8              <1> 	TEST	AX, CX			; IS THIS SECTION BACKCROUND?
  3646 00002495 7401                <1>         JZ      short S25               ; IF ZERO, IT IS BACKGROUND (CARRY=0)
  3647 00002497 F9                  <1> 	STC				; WASN'T, SO SET CARRY
  3648                              <1> S25:
  3649 00002498 D0D2                <1> 	RCL	DL, 1			; MOVE THAT BIT INTO THE RESULT
  3650 0000249A 66C1E902            <1> 	SHR	CX, 2			; MOVE THE MASK TO THE RIGHT BY 2 BITS
  3651 0000249E 73F2                <1> 	JNC	short S24		; DO IT AGAIN IF MASK DIDN'T FALL OUT
  3652 000024A0 885500              <1> 	MOV	[eBP], DL 		; STORE RESULT IN SAVE AREA
  3653 000024A3 45                  <1> 	INC	eBP			; ADJUST POINTER
  3654 000024A4 C3                  <1> 	RETn				; ALL DONE
  3655                              <1> 
  3656                              <1> ; 30/06/2016 - TRDOS 386 (TRDOS v2.0)
  3657                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3658                              <1> ;-----------------------------------------
  3659                              <1> ; V4_POSITION
  3660                              <1> ;  THIS ROUTINE TAKES THE CURSOR POSITION CONTAINED IN
  3661                              <1> ;  THE MEMORY LOCATION, AND CONVERTS IT INTO AN OFFSET
  3662                              <1> ;  INTO THE REGEN BUFFER, ASSUMING ONE BYTE/CHAR.
  3663                              <1> ;  FOR MEDIUM RESOLUTION GRAPHICS, THE NUMBER MUST
  3664                              <1> ;  BE DOUBLED.
  3665                              <1> ; ENTRY -- NO REGISTERS,MEMORY LOCATION @CURSOR_POSN IS USED
  3666                              <1> ; EXIT--
  3667                              <1> ;  AX CONTAINS OFFSET INTO REGEN BUFFER
  3668                              <1> ;-----------------------------------------
  3669                              <1> S26:
  3670 000024A5 0FB705[FE300100]    <1> 	movzx	eax, word [CURSOR_POSN]	; GET CURRENT CURSOR
  3671                              <1> GRAPH_POSN:
  3672 000024AC 53                  <1> 	PUSH	eBX			; SAVE REGISTER
  3673 000024AD 0FB6D8              <1> 	movzx	ebx, al			; SAVE A COPY OF CURRENT CURSOR
  3674 000024B0 A0[F0F70000]        <1> 	MOV	AL, [CRT_COLS]		; GET BYTES PER COLUMN
  3675 000024B5 F6E4                <1> 	MUL	AH			; MULTIPLY BY ROWS
  3676 000024B7 66C1E002            <1> 	SHL	AX, 2			; MULTIPLY * 4 SINCE 4 ROWS/BYTE
  3677 000024BB 01D8                <1> 	ADD	eAX, eBX		; DETERMINE OFFSET
  3678 000024BD 5B                  <1> 	POP	eBX			; RECOVER POINTER
  3679 000024BE C3                  <1> 	RETn				; ALL DONE
  3680                              <1> 
  3681                              <1> ; 09/07/2016
  3682                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  3683                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3684                              <1> ;---------------------------------------------
  3685                              <1> ; SET_COLOR
  3686                              <1> ;	THIS ROUTINE WILL ESTABLISH THE BACKGROUND COLOR, THE OVERSCAN COLOR,
  3687                              <1> ;	AND THE FOREGROUND COLOR SET FOR MEDIUM RESOLUTION GRAPHICS
  3688                              <1> ; INPUT
  3689                              <1> ;	(BH) HAS COLOR ID
  3690                              <1> ;		IF BH=0, THE BACKGROUND COLOR VALUE IS SET
  3691                              <1> ;			FROM THE LOW BITS OF BL (0-31)
  3692                              <1> ;		IF BH=1, THE PALETTE SELECTION IS MADE
  3693                              <1> ;			BASED ON THE LOW BIT OF BL:
  3694                              <1> ;				0 = GREEN, RED, YELLOW FOR COLORS 1,2,3
  3695                              <1> ;				1 = BLUE, CYAN, MAGENTA FOR COLORS 1,2,3
  3696                              <1> ;	(BL) HAS THE COLOR VALUE TO BE USED
  3697                              <1> ; OUTPUT
  3698                              <1> ;	THE COLOR SELECTION IS UPDATED
  3699                              <1> ;----------------------------------------------
  3700                              <1> SET_COLOR:
  3701 000024BF 803D[EEF70000]07    <1>         cmp     byte [CRT_MODE], 7      ; 09/07/2016
  3702 000024C6 0F870EF0FFFF        <1> 	ja	VIDEO_RETURN		; nothing to do for VGA modes	 
  3703                              <1> 
  3704                              <1> 	;MOV	DX, [ADDR_6845]		; I/O PORT FOR PALETTE
  3705                              <1> 	;mov	dx, 3D4h
  3706                              <1> 	;ADD	DX,5			; OVERSCAN PORT
  3707 000024CC 66BAD903            <1> 	mov	dx, 3D9h
  3708 000024D0 A0[F1F70000]        <1> 	MOV	AL, [CRT_PALETTE] 	; GET THE CURRENT PALETTE VALUE
  3709 000024D5 08FF                <1> 	OR	BH, BH			; IS THIS COLOR 0?
  3710 000024D7 7512                <1> 	JNZ	short M20		; OUTPUT COLOR 1
  3711                              <1> 
  3712                              <1> ;-----	HANDLE COLOR 0 BY SETTING THE BACKGROUND COLOR
  3713                              <1> 
  3714 000024D9 24E0                <1> 	AND	AL, 0E0H 		; TURN OFF LOW 5 BITS OF CURRENT
  3715 000024DB 80E31F              <1> 	AND	BL, 01FH 		; TURN OFF HIGH 3 BITS OF INPUT VALUE
  3716 000024DE 08D8                <1> 	OR	AL, BL			; PUT VALUE INTO REGISTER
  3717                              <1> M19:					; OUTPUT THE PALETTE
  3718 000024E0 EE                  <1> 	OUT	DX, AL			; OUTPUT COLOR SELECTION TO 3D9 PORT
  3719 000024E1 A2[F1F70000]        <1> 	MOV	[CRT_PALETTE], AL 	; SAVE THE COLOR VALUE
  3720 000024E6 E9EFEFFFFF          <1> 	JMP	VIDEO_RETURN
  3721                              <1> 
  3722                              <1> ;-----	HANDLE COLOR 1 BY SELECTING THE PALETTE TO BE USED
  3723                              <1> 
  3724                              <1> M20:
  3725 000024EB 24DF                <1> 	AND	AL, 0DFH 		; TURN OFF PALETTE SELECT BIT
  3726 000024ED D0EB                <1> 	SHR	BL, 1			; TEST THE LOW ORDER BIT OF BL
  3727 000024EF 73EF                <1> 	JNC	short M19		; ALREADY DONE
  3728 000024F1 0C20                <1> 	OR	AL, 20H			; TURN ON PALETTE SELECT BIT
  3729 000024F3 EBEB                <1> 	JMP	short M19		; GO DO IT
  3730                              <1> 
  3731                              <1> ; 09/07/2016
  3732                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  3733                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3734                              <1> ;--------------------------------------------
  3735                              <1> ; READ DOT -- WRITE DOT
  3736                              <1> ; THESE ROUTINES WILL WRITE A DOT, OR READ THE
  3737                              <1> ;  DOT AT THE INDICATED LOCATION
  3738                              <1> ; ENTRY --
  3739                              <1> ;   DX = ROW (0-199)	(THE ACTUAL VALUE DEPENDS ON THE MODE)
  3740                              <1> ;   CX = COLUMN ( 0-639) ( THE VALUES ARE NOT RANGE CHECKED )
  3741                              <1> ;   AL = DOT VALUE TO WRITE (1,2 OR 4 BITS DEPENDING ON MODE,
  3742                              <1> ;	REQUIRED FOR WRITE DOT ONLY, RIGHT JUSTIFIED)
  3743                              <1> ;	BIT 7 OF AL = 1 INDICATES XOR THE VALUE INTO THE LOCATION
  3744                              <1> ;   DS = DATA SEGMENT
  3745                              <1> ;   ES = REGEN SEGMENT
  3746                              <1> ;
  3747                              <1> ; EXIT
  3748                              <1> ;	AL = DOT VALUE READ, RIGHT JUSTIFIED, READ ONLY
  3749                              <1> ;----------------------------------------------
  3750                              <1> 
  3751                              <1> READ_DOT:
  3752                              <1> 	; 09/07/2016
  3753 000024F5 8A25[EEF70000]      <1> 	mov	ah,  [CRT_MODE]
  3754 000024FB 80FC07              <1> 	cmp	ah, 7 ; 6!?
  3755 000024FE 760A                <1> 	jna	short read_dot_cga
  3756                              <1> 
  3757 00002500 E8CB030000          <1> 	call	vga_read_pixel
  3758                              <1> 	; al = pixel value
  3759 00002505 E9D5EFFFFF          <1> 	jmp	_video_return
  3760                              <1> 
  3761                              <1> read_dot_cga:
  3762                              <1> 	;je	VIDEO_RETURN ; 7	
  3763 0000250A 80FC04              <1> 	cmp	ah, 4 ; graphics ? 
  3764 0000250D 0F82C7EFFFFF        <1> 	jb	VIDEO_RETURN ; no, text mode, nothing to do
  3765                              <1> 
  3766 00002513 E855000000          <1> 	CALL	R3			; DETERMINE BYTE POSITION OF DOT
  3767 00002518 8A06                <1> 	MOV	AL, [eSI]		; GET THE BYTE
  3768 0000251A 20E0                <1> 	AND	AL, AH			; MASK OFF THE OTHER BITS IN THE BYTE
  3769 0000251C D2E0                <1> 	SHL	AL, CL			; LEFT JUSTIFY THE VALUE
  3770 0000251E 88F1                <1> 	MOV	CL, DH			; GET NUMBER OF BITS IN RESULT
  3771 00002520 D2C0                <1> 	ROL	AL, CL			; RIGHT JUSTIFY THE RESULT
  3772                              <1> 	;JMP	VIDEO_RETURN		; RETURN FROM VIDEO I/O
  3773 00002522 0FB6C0              <1> 	movzx	eax, al
  3774 00002525 E9B5EFFFFF          <1> 	jmp	_video_return
  3775                              <1> 
  3776                              <1> ; 09/07/2016
  3777                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  3778                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3779                              <1> 
  3780                              <1> WRITE_DOT:
  3781                              <1> 	; 09/07/2016
  3782 0000252A 8A25[EEF70000]      <1> 	mov	ah, [CRT_MODE]
  3783 00002530 80FC07              <1> 	cmp	ah, 7 ; 6!?
  3784 00002533 760A                <1> 	jna	short write_dot_cga
  3785                              <1> 	
  3786 00002535 E805030000          <1> 	call	vga_write_pixel
  3787 0000253A E99BEFFFFF          <1> 	jmp	VIDEO_RETURN
  3788                              <1> 
  3789                              <1> write_dot_cga:
  3790                              <1> 	;je	VIDEO_RETURN ; 7	
  3791 0000253F 80FC04              <1> 	cmp	ah, 4 ; graphics ? 
  3792 00002542 0F8292EFFFFF        <1> 	jb	VIDEO_RETURN ; no, text mode, nothing to do
  3793                              <1> 
  3794                              <1> 	;PUSH	AX			; SAVE DOT VALUE
  3795 00002548 6650                <1> 	PUSH	AX			; TWICE
  3796 0000254A E81E000000          <1> 	CALL	R3			; DETERMINE BYTE POSITION OF THE DOT
  3797 0000254F D2E8                <1> 	SHR	AL, CL			; SHIFT TO SET UP THE BITS FOR OUTPUT
  3798 00002551 20E0                <1> 	AND	AL, AH			; STRIP OFF THE OTHER BITS
  3799 00002553 8A0E                <1> 	MOV	CL, [eSI]		; GET THE CURRENT BYTE
  3800 00002555 665B                <1> 	POP	BX			; RECOVER XOR FLAG
  3801 00002557 F6C380              <1> 	TEST	BL, 80H			; IS IT ON
  3802 0000255A 750D                <1> 	JNZ	short R2		; YES, XOR THE DOT
  3803 0000255C F6D4                <1> 	NOT	AH			; SET MASK TO REMOVE THE INDICATED BITS
  3804 0000255E 20E1                <1> 	AND	CL, AH
  3805 00002560 08C8                <1> 	OR	AL, CL			; OR IN THE NEW VALUE OF THOSE BITS
  3806                              <1> R1:					; FINISH_DOT
  3807 00002562 8806                <1> 	MOV	[eSI], AL		; RESTORE THE BYTE IN MEMORY
  3808                              <1> 	;POP	AX
  3809 00002564 E971EFFFFF          <1> 	JMP	VIDEO_RETURN		; RETURN FROM VIDEO I/O
  3810                              <1> R2:					; XOR_DOT
  3811 00002569 30C8                <1> 	XOR	AL, CL			; EXCLUSIVE OR THE DOTS
  3812 0000256B EBF5                <1> 	JMP	short R1		; FINISH UP THE WRITING
  3813                              <1> 
  3814                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  3815                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3816                              <1> 
  3817                              <1> ;----------------------------------------------
  3818                              <1> ; THIS SUBROUTINE DETERMINES THE REGEN BYTE LOCATION OF THE
  3819                              <1> ; INDICATED ROW COLUMN VALUE IN GRAPHICS MODE.
  3820                              <1> ; ENTRY --
  3821                              <1> ;  DX = ROW VALUE (0-199)
  3822                              <1> ;  CX = COLUMN VALUE (0-639)
  3823                              <1> ; EXIT --
  3824                              <1> ;  SI = OFFSET INTO REGEN BUFFER FOR BYTE OF INTEREST
  3825                              <1> ;  AH = MASK TO STRIP OFF THE BITS OF INTEREST
  3826                              <1> ;  CL = BITS TO SHIFT TO RIGHT JUSTIFY THE MASK IN AH
  3827                              <1> ;  DH = # BITS IN RESULT
  3828                              <1> ;  BX = MODIFIED
  3829                              <1> ;-----------------------------------------------
  3830                              <1> R3:
  3831                              <1> 
  3832                              <1> ;-----	DETERMINE 1ST BYTE IN INDICATED ROW BY MULTIPLYING ROW VALUE BY 40
  3833                              <1> ;-----	 ( LOW BIT OF ROW DETERMINES EVEN/ODD, 80 BYTES/ROW )
  3834                              <1> 
  3835 0000256D 0FB7F0              <1> 	movzx	esi, ax			; WILL SAVE AL AND AH DURING OPERATION
  3836 00002570 B028                <1> 	MOV	AL, 40
  3837 00002572 F6E2                <1> 	MUL	DL			; AX= ADDRESS OF START OF INDICATED ROW
  3838 00002574 A808                <1> 	TEST	AL, 08H 		; TEST FOR EVEN/ODD ROW CALCULATED
  3839 00002576 7404                <1> 	JZ	short R4		; JUMP IF EVEN ROW
  3840 00002578 6605D81F            <1> 	ADD	AX, 2000H-40		; OFFSET TO LOCATION OF ODD ROWS ADJUST
  3841                              <1> R4:					; EVEN_ROW
  3842 0000257C 6696                <1> 	XCHG	SI, AX			; MOVE POINTER TO (SI) AND RECOVER (AX)
  3843 0000257E 81C600800B00        <1> 	add	esi, 0B8000h
  3844 00002584 6689CA              <1> 	MOV	DX, CX			; COLUMN VALUE TO DX
  3845                              <1> 
  3846                              <1> ;-----	DETERMINE GRAPHICS MODE CURRENTLY IN EFFECT
  3847                              <1> 
  3848                              <1> ; SET UP THE REGISTERS ACCORDING TO THE MODE
  3849                              <1> ; CH = MASK FOR LOW OF COLUMN ADDRESS ( 7/3 FOR HIGH/MED RES )
  3850                              <1> ; CL = # OF ADDRESS BITS IN COLUMN VALUE ( 3/2 FOR H/M )
  3851                              <1> ; BL = MASK TO SELECT BITS FROM POINTED BYTE ( 80H/C0H FOR H/M )
  3852                              <1> ; BH = NUMBER OF VALID BITS IN POINTED BYTE ( 1/2 FOR H/M )
  3853                              <1> 
  3854 00002587 66BBC002            <1> 	MOV	BX, 2C0H
  3855 0000258B 66B90203            <1> 	MOV	CX, 302H 		; SET PARMS FOR MED RES
  3856 0000258F 803D[EEF70000]06    <1> 	CMP	byte [CRT_MODE], 6
  3857 00002596 7208                <1> 	JC	short R5		; HANDLE IF MED RES
  3858 00002598 66BB8001            <1> 	MOV	BX, 180H
  3859 0000259C 66B90307            <1> 	MOV	CX, 703H 		; SET PARMS FOR HIGH RES
  3860                              <1> 
  3861                              <1> ;-----	DETERMINE BIT OFFSET IN BYTE FROM COLUMN MASK
  3862                              <1> R5:
  3863 000025A0 20D5                <1> 	AND	CH, DL			; ADDRESS OF PEL WITHIN BYTE TO CH
  3864                              <1> 
  3865                              <1> ;-----	DETERMINE BYTE OFFSET FOR THIS LOCATION IN COLUMN
  3866                              <1> 
  3867 000025A2 66D3EA              <1> 	SHR	DX, CL			; SHIFT BY CORRECT AMOUNT
  3868 000025A5 6601D6              <1> 	ADD	SI, DX			; INCREMENT THE POINTER
  3869 000025A8 88FE                <1> 	MOV	DH, BH			; GET THE # OF BITS IN RESULT TO DH
  3870                              <1> 
  3871                              <1> ;-----	MULTIPLY BH (VALID BITS IN BYTE) BY CH (BIT OFFSET)
  3872                              <1> 
  3873 000025AA 28C9                <1> 	SUB	CL, CL			; ZERO INTO STORAGE LOCATION
  3874                              <1> R6:
  3875 000025AC D0C8                <1> 	ROR	AL, 1			; LEFT JUSTIFY VALUE IN AL (FOR WRITE)
  3876 000025AE 00E9                <1> 	ADD	CL, CH			; ADD IN THE BIT OFFSET VALUE
  3877 000025B0 FECF                <1> 	DEC	BH			; LOOP CONTROL
  3878 000025B2 75F8                <1> 	JNZ	short R6		; ON EXIT, CL HAS COUNT TO RESTORE BITS
  3879 000025B4 88DC                <1> 	MOV	AH, BL			;  GET MASK TO AH
  3880 000025B6 D2EC                <1> 	SHR	AH, CL			;  MOVE THE MASK TO CORRECT LOCATION
  3881 000025B8 C3                  <1> 	RETn				;  RETURN WITH EVERYTHING SET UP
  3882                              <1> 
  3883                              <1> load_dac_palette:
  3884                              <1> 	; 29/07/2016
  3885                              <1> 	; 23/07/2016
  3886                              <1> 	; 03/07/2016 (TRDOS 386 = TRDOS v2.0)
  3887                              <1> 	; (set_mode_vga)
  3888                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  3889                              <1> 	; vgabios-0.7a (2011)
  3890                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  3891                              <1> 	; 'vgabios.c', 'load_dac_palette'
  3892                              <1> 	;
  3893                              <1> 	; Oracle VirtualBox 5.0.24 VGABios Source Code
  3894                              <1> 	; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
  3895                              <1> 	;
  3896                              <1> 	; INPUT -> AH = DAC selection number (3, 2 or 1)
  3897                              <1> 	; OUTPUT -> ECX = 0, AX = 0
  3898                              <1> 	; (Modifed registers: EAX, ECX, EDX, ESI)
  3899                              <1> 	;
  3900 000025B9 66BAC803            <1> 	mov	dx, 3C8h  ; VGAREG_DAC_WRITE_ADDRESS
  3901 000025BD 28C0                <1> 	sub	al, al ; 0
  3902 000025BF EE                  <1> 	out	dx, al ; 0 ; color index, always 0 at the beginning	
  3903 000025C0 6642                <1> 	inc	dx   ; 3C9h ; VGAREG_DAC_DATA
  3904 000025C2 B900010000          <1> 	mov	ecx, 256   ; always 256*3 values
  3905                              <1> 	;push	esi
  3906 000025C7 88E0                <1> 	mov	al, ah
  3907 000025C9 B43F                <1> 	mov	ah, 3Fh	; 3Fh except DAC selection number 3
  3908 000025CB 3C02                <1> 	cmp 	al, 2
  3909 000025CD 7414                <1> 	je	short l_dac_p_2
  3910 000025CF 7719                <1> 	ja	short l_dac_p_3
  3911 000025D1 20C0                <1> 	and	al, al
  3912 000025D3 7507                <1> 	jnz	short l_dac_p_1
  3913                              <1> l_dac_p_0:
  3914 000025D5 BE[10000100]        <1> 	mov	esi, palette0
  3915 000025DA EB15                <1> 	jmp	short l_dac_p_4	
  3916                              <1> l_dac_p_1:
  3917 000025DC BE[D0000100]        <1> 	mov	esi, palette1
  3918 000025E1 EB0E                <1> 	jmp	short l_dac_p_4
  3919                              <1> l_dac_p_2:
  3920 000025E3 BE[90010100]        <1> 	mov	esi, palette2
  3921 000025E8 EB07                <1> 	jmp	short l_dac_p_4
  3922                              <1> l_dac_p_3:
  3923 000025EA B4FF                <1> 	mov	ah, 0FFh ; dac registers
  3924 000025EC BE[50020100]        <1> 	mov	esi, palette3
  3925                              <1> l_dac_p_4:
  3926 000025F1 AC                  <1> 	lodsb
  3927 000025F2 EE                  <1> 	out	dx, al  ; Red
  3928 000025F3 AC                  <1> 	lodsb
  3929 000025F4 EE                  <1> 	out	dx, al	; Green
  3930 000025F5 AC                  <1> 	lodsb
  3931 000025F6 EE                  <1> 	out	dx, al	; Blue
  3932 000025F7 20E4                <1> 	and	ah, ah
  3933 000025F9 7405                <1> 	jz	short l_dac_p_5	
  3934 000025FB FECC                <1> 	dec	ah
  3935 000025FD E2F2                <1> 	loop	l_dac_p_4
  3936                              <1> 	;pop	esi
  3937 000025FF C3                  <1> 	retn
  3938                              <1> l_dac_p_5:
  3939                              <1> 	; 29/07/2016
  3940 00002600 FEC9                <1> 	dec	cl
  3941 00002602 7407                <1> 	jz	short l_dac_p_7
  3942                              <1> 	;
  3943 00002604 28C0                <1> 	sub	al, al ; 0
  3944                              <1> l_dac_p_6:
  3945 00002606 EE                  <1> 	out	dx, al ; outb(VGAREG_DAC_DATA,0);
  3946 00002607 EE                  <1> 	out	dx, al
  3947 00002608 EE                  <1> 	out	dx, al
  3948 00002609 E2FB                <1> 	loop	l_dac_p_6
  3949                              <1> l_dac_p_7:
  3950                              <1> 	;pop	esi
  3951 0000260B C3                  <1> 	retn
  3952                              <1> 
  3953                              <1> gray_scale_summing:
  3954                              <1> 	; 03/07/2016 (TRDOS 386 = TRDOS v2.0)
  3955                              <1> 	; (set_mode_vga)
  3956                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  3957                              <1> 	; vgabios-0.7a (2011)
  3958                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  3959                              <1> 	; 'vgabios.c', 'biosfn_perform_gray_scale_summing'
  3960                              <1> 	;
  3961                              <1> 	; Oracle VirtualBox 5.0.24 VGABios Source Code
  3962                              <1> 	; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
  3963                              <1> 	;
  3964                              <1> 
  3965                              <1> 	; INPUT -> EBX = Start address (color index <= 255)
  3966                              <1> 	;	   ECX = Count (<= 256)
  3967                              <1> 	; OUTPUT -> (E)CX = 0
  3968                              <1> 	; (Modifed registers: EAX, ECX, EDX, EBX)
  3969                              <1> 
  3970 0000260C 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  3971 00002610 EC                  <1> 	in	al, dx
  3972 00002611 30C0                <1> 	xor	al, al ; 0
  3973 00002613 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  3974 00002617 EE                  <1> 	out	dx, al	; clear bit 5
  3975                              <1> 			; (while loading palette registers)
  3976                              <1> 	; set read address and switch to read mode
  3977                              <1> g_s_s_1:
  3978 00002618 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
  3979 0000261C 88D8                <1> 	mov	al, bl
  3980 0000261E EE                  <1> 	out	dx, al
  3981                              <1> 	; get 6-bit wide RGB data values
  3982                              <1>  	; intensity = (0.3*Red)+(0.59*Green)+(0.11*Blue)
  3983                              <1> 	; i = ( ( 77*r + 151*g + 28*b ) + 0x80 ) >> 8;
  3984 0000261F 66BAC903            <1> 	mov	dx, 3C9h ; VGAREG_DAC_DATA
  3985 00002623 EC                  <1> 	in	al, dx ; red
  3986 00002624 B44D                <1> 	mov	ah, 77 ; 0.3* Red
  3987 00002626 F6E4                <1> 	mul	ah
  3988 00002628 6650                <1> 	push	ax
  3989 0000262A EC                  <1> 	in	al, dx ; green
  3990 0000262B B497                <1> 	mov	ah, 151  ; 0.59 * Green
  3991 0000262D F6E4                <1> 	mul	ah
  3992 0000262F 6650                <1> 	push	ax
  3993 00002631 EC                  <1> 	in	al, dx ; blue
  3994 00002632 B41C                <1> 	mov	ah, 28 ; 0.11 * Blue
  3995 00002634 F6E4                <1> 	mul	ah
  3996 00002636 665A                <1> 	pop	dx
  3997 00002638 6601D0              <1> 	add	ax, dx
  3998 0000263B 665A                <1> 	pop	dx
  3999 0000263D 6601D0              <1> 	add	ax, dx
  4000 00002640 66058000            <1> 	add	ax, 80h  
  4001 00002644 B03F                <1> 	mov	al, 3Fh
  4002 00002646 38C4                <1> 	cmp	ah, al
  4003 00002648 7602                <1> 	jna	short g_s_s_2
  4004 0000264A 88C4                <1> 	mov	ah, al
  4005                              <1> g_s_s_2:
  4006 0000264C 66BAC803            <1> 	mov	dx, 3C8h  ; VGAREG_DAC_WRITE_ADDRESS
  4007 00002650 88D8                <1> 	mov	al, bl ; color index
  4008 00002652 EE                  <1> 	out	dx, al
  4009 00002653 88E0                <1> 	mov	al, ah ; intensity
  4010 00002655 6642                <1> 	inc	dx ; 3C9h ; VGAREG_DAC_DATA
  4011 00002657 EE                  <1> 	out	dx, al ; R (R=G=B)
  4012 00002658 88E0                <1> 	mov	al, ah ; intensity
  4013 0000265A EE                  <1> 	out	dx, al ; G (R=G=B)
  4014 0000265B 88E0                <1>  	mov	al, ah ; intensity
  4015 0000265D EE                  <1> 	out	dx, al ; B (R=G=B)
  4016 0000265E 6649                <1> 	dec	cx
  4017 00002660 7404                <1> 	jz	short g_s_s_3
  4018 00002662 FEC3                <1> 	inc	bl    ; next color index value
  4019 00002664 EBB2                <1> 	jmp	short g_s_s_1
  4020                              <1> g_s_s_3:
  4021 00002666 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  4022 0000266A EC                  <1> 	in	al, dx
  4023 0000266B B020                <1> 	mov	al, 20h
  4024 0000266D 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  4025 00002671 EE                  <1> 	out	dx, al ; 20h -> set bit 5
  4026                              <1> 		        ; (after loading palette regs)	
  4027 00002672 C3                  <1> 	retn
  4028                              <1> 
  4029                              <1> vga_write_char_attr:
  4030                              <1> vga_write_char_only: 
  4031                              <1> 	; 08/07/2016 (TRDOS 386 = TRDOS v2.0)
  4032                              <1> 	;
  4033                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4034                              <1> 	; vgabios-0.7a (2011)
  4035                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4036                              <1> 	; 'vgabios.c', 'biosfn_write_char_attr'
  4037                              <1> 	; 'biosfn_write_char_only'
  4038                              <1> 
  4039                              <1> 	; INPUT ->
  4040                              <1> 	; [CRT_MODE] = current video mode (>7)
  4041                              <1> 	; CX = Count of characters to write
  4042                              <1> 	; AL = Character to write
  4043                              <1> 	; BL = Color of character
  4044                              <1> 	; OUTPUT ->
  4045                              <1> 	; Regen buffer updated
  4046                              <1>  
  4047 00002673 8A25[EEF70000]      <1> 	mov 	ah, [CRT_MODE]
  4048 00002679 668B15[FE300100]    <1> 	mov	dx, [CURSOR_POSN] ; cursor pos for page 0
  4049                              <1> 
  4050 00002680 BE[0AF80000]        <1> 	mov	esi, vga_modes
  4051 00002685 89F7                <1> 	mov	edi, esi
  4052 00002687 83C710              <1> 	add	edi, vga_mode_count
  4053                              <1> vga_wca_0:
  4054 0000268A AC                  <1> 	lodsb
  4055 0000268B 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  4056 0000268D 7405                <1> 	je	short vga_wca_2
  4057 0000268F 39FE                <1> 	cmp	esi, edi
  4058 00002691 72F7                <1> 	jb	short vga_wca_0
  4059                              <1> vga_wca_1:
  4060 00002693 C3                  <1> 	retn	; nothing to do
  4061                              <1> vga_wca_2:
  4062 00002694 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  4063                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  4064                              <1> 
  4065                              <1> 	; biosfn_write_char_attr (car,page,attr,count) 
  4066                              <1> 	; AL = car, page = 0, BL = attr, CX = count
  4067 00002697 803E04              <1> 	cmp	byte [esi], PLANAR4
  4068 0000269A 741D                <1> 	je	short vga_wca_planar
  4069 0000269C 803E03              <1> 	cmp	byte [esi], PLANAR1
  4070 0000269F 7418                <1> 	je	short vga_wca_planar
  4071                              <1> vga_wca_linear8:
  4072                              <1> 	; while((count-->0) && (xcurs<nbcols))
  4073                              <1> 	; CX = count
  4074 000026A1 6621C9              <1> 	and	cx, cx
  4075 000026A4 74ED                <1> 	jz	short vga_wca_1
  4076 000026A6 3A15[F0F70000]      <1> 	cmp	dl, [CRT_COLS]
  4077 000026AC 73E5                <1> 	jnb	short vga_wca_1
  4078                              <1> 	; write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols);
  4079                              <1> 	; AL = car, BL = attr, DL = xcurs, DH = ycurs, 
  4080                              <1> 	; [CRT_COLS] = nbcols
  4081 000026AE E81E000000          <1> 	call	write_gfx_char_lin	 
  4082 000026B3 6649                <1> 	dec	cx ; count
  4083 000026B5 FEC2                <1> 	inc	dl ; xcurs
  4084 000026B7 EBE8                <1> 	jmp	short vga_wca_linear8
  4085                              <1> vga_wca_planar:
  4086                              <1> 	; while((count-->0) && (xcurs<nbcols))
  4087                              <1> 	; CX = count
  4088 000026B9 6621C9              <1> 	and	cx, cx
  4089 000026BC 74D5                <1> 	jz	short vga_wca_1
  4090 000026BE 3A15[F0F70000]      <1> 	cmp	dl, [CRT_COLS]
  4091 000026C4 73CD                <1> 	jnb	short vga_wca_1
  4092                              <1> 	; write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight);
  4093                              <1> 	; AL = car, BL = attr, DL = xcurs, DH = ycurs, 
  4094                              <1> 	; [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight
  4095 000026C6 E89D000000          <1> 	call	write_gfx_char_pl4
  4096 000026CB 6649                <1> 	dec	cx ; count
  4097 000026CD FEC2                <1> 	inc	dl ; xcurs
  4098 000026CF EBE8                <1> 	jmp	short vga_wca_planar
  4099                              <1> 
  4100                              <1> write_gfx_char_lin:
  4101                              <1> 	; 08/08/2016
  4102                              <1> 	; 31/07/2016
  4103                              <1> 	; 08/07/2016 (TRDOS 386 = TRDOS v2.0)
  4104                              <1> 	;
  4105                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4106                              <1> 	; vgabios-0.7a (2011)
  4107                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4108                              <1> 	; 'vgabios.c', 'write_gfx_char_lin'
  4109                              <1> 
  4110                              <1> 	; write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols)
  4111                              <1> 	; INPUT ->
  4112                              <1> 	; AL = car, BL = attr, DL = xcurs, DH = ycurs, 
  4113                              <1> 	; [CRT_COLS] = nbcols
  4114                              <1> 	; OUTPUT ->
  4115                              <1> 	; Regen buffer updated
  4116                              <1> 
  4117 000026D1 51                  <1> 	push	ecx
  4118 000026D2 53                  <1> 	push	ebx
  4119 000026D3 52                  <1> 	push	edx
  4120 000026D4 50                  <1> 	push	eax
  4121                              <1> 	; addr=xcurs*8+ycurs*nbcols*64;
  4122                              <1> 	; 08/08/2016
  4123 000026D5 0FB6F0              <1> 	movzx	esi, al ; car
  4124 000026D8 0FB6C6              <1> 	movzx	eax, dh ; ycurs
  4125 000026DB 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  4126 000026E1 F6E4                <1> 	mul	ah
  4127                              <1> 	;shl	ax, 6 ; * 64
  4128 000026E3 66C1E003            <1>  	shl	ax, 3 ; * 8
  4129                              <1> 	;sub	dh, dh
  4130                              <1> 	;shl	dx, 3 ; xcurs * 8
  4131                              <1> 	;movzx	edi, dx
  4132 000026E7 0FB6FA              <1> 	movzx	edi, dl
  4133 000026EA 66C1E703            <1> 	shl	di, 3 ; xcurs * 8
  4134 000026EE 30F6                <1> 	xor	dh, dh
  4135 000026F0 8A15[F2F70000]      <1> 	mov	dl, [CHAR_HEIGHT]
  4136 000026F6 66F7E2              <1> 	mul	dx
  4137                              <1> 	; eax = ycurs*nbcols*8*[CHAR_HEIGHT]
  4138 000026F9 01C7                <1> 	add	edi, eax ; addr
  4139 000026FB 81C700000A00        <1> 	add	edi, 0A0000h
  4140                              <1> 	;shl	si, 3 ; car * 8
  4141 00002701 30E4                <1> 	xor	ah, ah
  4142 00002703 A0[F2F70000]        <1> 	mov	al, [CHAR_HEIGHT]
  4143 00002708 66F7E6              <1> 	mul	si
  4144 0000270B 6689C6              <1> 	mov	si, ax
  4145                              <1> 	;; esi = src = car * 8
  4146                              <1> 	; esi = src = car * [CHAR_HEIGHT]
  4147                              <1> 	; i = 0
  4148                              <1> 	;add	esi, vgafont8 ; fdata [src+i]
  4149                              <1> 	; 08/08/2016
  4150 0000270E A1[8E3E0100]        <1> 	mov	eax, [VGA_INT43H]
  4151 00002713 3D[501B0100]        <1> 	cmp	eax, vgafont16
  4152 00002718 740F                <1>         je      short wgfxl_0
  4153 0000271A 3D[500D0100]        <1> 	cmp	eax, vgafont14
  4154 0000271F 7408                <1> 	je	short wgfxl_0
  4155 00002721 81C6[50050100]      <1> 	add	esi, vgafont8
  4156 00002727 EB02                <1> 	jmp	short wgfxl_1
  4157                              <1> wgfxl_0:
  4158 00002729 01C6                <1> 	add	esi, eax
  4159                              <1> wgfxl_1:
  4160 0000272B 28FF                <1> 	sub	bh, bh ; i = 0
  4161                              <1> wgfxl_2:
  4162                              <1> 	; for(i=0;i<8;i++)
  4163 0000272D 57                  <1> 	push	edi ; addr
  4164 0000272E 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS] ; nbcols
  4165 00002735 F6E7                <1> 	mul	bh ; nbcols*i
  4166 00002737 66C1E003            <1> 	shl	ax, 3 ; i*nbcols*8
  4167                              <1>  	; dest=addr+i*nbcols*8;
  4168 0000273B 01C7                <1> 	add	edi, eax ; dest + j ; j = 0
  4169 0000273D B180                <1> 	mov	cl, 80h ; mask = 0x80;
  4170                              <1> 	; esi = fdata + src + i
  4171                              <1> 	; for(j=0;j<8;j++)
  4172 0000273F 29D2                <1> 	sub	edx, edx ; j = 0
  4173                              <1> wgfxl_3:
  4174 00002741 8A06                <1> 	mov	al, [esi] ; al = fdata[src+i]
  4175 00002743 20C8                <1> 	and	al, cl ; if (fdata[src+i] & mask)
  4176 00002745 7402                <1> 	jz	short wgfxl_4  ; data = 0, zf = 1
  4177 00002747 88D8                <1> 	mov	al, bl ; data = attr;
  4178                              <1> wgfxl_4:
  4179                              <1> 	; write_byte(0xa000,dest+j,data);		
  4180 00002749 AA                  <1> 	stosb  ; dest + j (+ 0A0000h)
  4181                              <1> 	;inc	dl ; j++
  4182                              <1> 	;cmp	dl, 8
  4183 0000274A 80FA07              <1> 	cmp	dl, 7
  4184 0000274D 720E                <1> 	jb	short wgfxl_5
  4185 0000274F 5F                  <1> 	pop	edi
  4186                              <1> 	; 08/08/2016
  4187                              <1> 	;cmp	bh, 7
  4188                              <1> 	;jnb	short wgfxl_6
  4189 00002750 FEC7                <1> 	inc	bh ; i++
  4190 00002752 3A3D[F2F70000]      <1> 	cmp	bh, [CHAR_HEIGHT]
  4191 00002758 7309                <1> 	jnb	short wgfxl_6
  4192 0000275A 46                  <1> 	inc	esi
  4193 0000275B EBD0                <1> 	jmp	short wgfxl_2
  4194                              <1> wgfxl_5:
  4195 0000275D D0E9                <1> 	shr	cl, 1 ; mask >>= 1;
  4196 0000275F FEC2                <1> 	inc	dl ; j++
  4197 00002761 EBDE                <1>         jmp     short wgfxl_3
  4198                              <1> wgfxl_6:
  4199 00002763 58                  <1> 	pop	eax
  4200 00002764 5A                  <1> 	pop	edx
  4201 00002765 5B                  <1> 	pop	ebx
  4202 00002766 59                  <1> 	pop	ecx
  4203 00002767 C3                  <1> 	retn
  4204                              <1> 
  4205                              <1> write_gfx_char_pl4:
  4206                              <1> 	; 08/08/2016
  4207                              <1> 	; 08/07/2016 (TRDOS 386 = TRDOS v2.0)
  4208                              <1> 	;
  4209                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4210                              <1> 	; vgabios-0.7a (2011)
  4211                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4212                              <1> 	; 'vgabios.c', 'write_gfx_char_pl4'
  4213                              <1> 
  4214                              <1> 	; write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight)
  4215                              <1> 	; INPUT ->
  4216                              <1> 	; AL = car, BL = attr, DL = xcurs, DH = ycurs, 
  4217                              <1> 	; [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight
  4218                              <1> 	; OUTPUT ->
  4219                              <1> 	; Regen buffer updated
  4220                              <1> 
  4221 00002768 51                  <1> 	push	ecx
  4222 00002769 53                  <1> 	push	ebx
  4223 0000276A 52                  <1> 	push	edx
  4224 0000276B 50                  <1> 	push	eax
  4225                              <1> wgfxpl_f0:
  4226                              <1> 	; switch(cheight)
  4227 0000276C 8A25[F2F70000]      <1> 	mov	ah, [CHAR_HEIGHT]
  4228 00002772 80FC10              <1> 	cmp	ah, 16 ; case 16:
  4229 00002775 7507                <1> 	jne	short wgfxpl_f1
  4230                              <1> 	; fdata = &vgafont16;
  4231 00002777 BE[501B0100]        <1> 	mov	esi, vgafont16
  4232 0000277C EB13                <1> 	jmp	short wgfxpl_f3
  4233                              <1> wgfxpl_f1:
  4234 0000277E 80FC0E              <1> 	cmp	ah, 14 ; case 14:
  4235 00002781 7507                <1> 	jne	short wgfxpl_f2
  4236 00002783 BE[500D0100]        <1> 	mov	esi, vgafont14
  4237 00002788 EB07                <1> 	jmp	short wgfxpl_f3
  4238                              <1> wgfxpl_f2:
  4239                              <1> 	; default:
  4240                              <1> 	;  fdata = &vgafont8;
  4241 0000278A BE[50050100]        <1> 	mov	esi, vgafont8
  4242 0000278F B408                <1> 	mov	ah, 8	
  4243                              <1> wgfxpl_f3:
  4244                              <1> 	; al = car
  4245 00002791 F6E4                <1> 	mul	ah ; ah = cheight
  4246 00002793 25FFFF0000          <1> 	and	eax, 0FFFFh ; car * cheight
  4247                              <1> 	; src = car * cheight;
  4248 00002798 01C6                <1> 	add	esi, eax ; esi = fdata[src+i]
  4249                              <1> 	; addr=xcurs*8+ycurs*nbcols*64;
  4250 0000279A 88F0                <1> 	mov	al, dh ; ycurs
  4251 0000279C 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  4252 000027A2 F6E4                <1> 	mul	ah
  4253                              <1> 	; 08/08/2016
  4254                              <1> 	;shl	ax, 6 ; * 64
  4255 000027A4 66C1E003            <1> 	shl	ax, 3 ; * 8
  4256                              <1> 	;sub	dh, dh ; 0
  4257                              <1> 	;shl	dx, 3 ; xcurs * 8
  4258                              <1> 	;movzx	edi, dx
  4259 000027A8 0FB6FA              <1> 	movzx	edi, dl
  4260 000027AB 66C1E703            <1> 	shl	di, 3 ; xcurs * 8
  4261 000027AF 30F6                <1> 	xor	dh, dh
  4262 000027B1 8A15[F2F70000]      <1> 	mov	dl, [CHAR_HEIGHT]
  4263 000027B7 66F7E2              <1> 	mul	dx
  4264                              <1> 	; eax = ycurs*nbcols*8*[CHAR_HEIGHT]
  4265 000027BA 01C7                <1> 	add	edi, eax ; addr
  4266 000027BC 81C700000A00        <1> 	add	edi, 0A0000h
  4267                              <1> 	;
  4268                              <1> 	; outw(VGAREG_SEQU_ADDRESS, 0x0f02);
  4269                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205);
  4270 000027C2 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  4271 000027C6 66B8020F            <1> 	mov	ax, 0F02h
  4272 000027CA 66EF                <1> 	out	dx, ax
  4273 000027CC 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4274 000027D0 66B80502            <1> 	mov	ax, 0205h
  4275 000027D4 66EF                <1> 	out	dx, ax
  4276                              <1> 	;
  4277 000027D6 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4278 000027DA F6C380              <1> 	test	bl, 80h ; if(attr&0x80)
  4279 000027DD 7406                <1> 	jz	short wgfxpl_f4 ; else
  4280                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x1803);
  4281 000027DF 66B80318            <1> 	mov	ax, 1803h
  4282 000027E3 EB04                <1> 	jmp	short wgfxpl_f5
  4283                              <1> wgfxpl_f4:
  4284                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0003);
  4285 000027E5 66B80300            <1> 	mov	ax, 0003h	
  4286                              <1> wgfxpl_f5:
  4287 000027E9 66EF                <1> 	out	dx, ax
  4288                              <1> 	;	
  4289 000027EB 28FF                <1> 	sub	bh, bh ; i = 0
  4290                              <1> wgfxpl_0:
  4291                              <1> 	; for(i=0;i<cheight;i++)
  4292 000027ED 57                  <1> 	push	edi ; addr
  4293 000027EE 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS] ; nbcols
  4294 000027F5 F6E7                <1> 	mul	bh ; nbcols*i
  4295                              <1> 	; dest=addr+i*nbcols
  4296 000027F7 01C7                <1> 	add	edi, eax ; dest
  4297 000027F9 B580                <1> 	mov	ch, 80h ; mask = 0x80;
  4298                              <1> 	; for(j=0;j<8;j++)
  4299 000027FB 28C9                <1> 	sub	cl, cl ; j = 0
  4300                              <1> wgfxpl_1:
  4301 000027FD D2ED                <1> 	shr	ch, cl ; mask=0x80>>j;
  4302                              <1> 	;
  4303                              <1> 	; outw(VGAREG_GRDC_ADDRESS, (mask << 8) | 0x08);
  4304                              <1>      	; read_byte(0xa000,dest);
  4305                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4306 000027FF 88EC                <1> 	mov	ah, ch
  4307 00002801 B008                <1> 	mov	al, 8
  4308 00002803 66EF                <1> 	out	dx, ax
  4309 00002805 8A07                <1> 	mov	al, [edi] ; ? (io delay?)
  4310                              <1> 	;
  4311 00002807 28C0                <1> 	sub	al, al ; attr = 0
  4312                              <1> 	; if (fdata[src+i] & mask)
  4313 00002809 842E                <1> 	test	byte [esi], ch
  4314 0000280B 7404                <1> 	jz	short wgfxpl_2  ; zf = 1
  4315                              <1> 	; write_byte(0xa000,dest,attr&0x0f);
  4316 0000280D 88D8                <1> 	mov	al, bl ; attr;
  4317 0000280F 240F                <1> 	and	al, 0Fh	; attr&0x0f
  4318                              <1> wgfxpl_2:
  4319                              <1> 	; write_byte(0xa000,dest,0x00);		
  4320 00002811 8807                <1> 	mov	[edi], al ; dest (+ 0A0000h)
  4321 00002813 FEC1                <1> 	inc	cl ; j++
  4322 00002815 80F908              <1> 	cmp	cl, 8
  4323 00002818 72E3                <1> 	jb	short wgfxpl_1
  4324 0000281A 5F                  <1> 	pop	edi
  4325                              <1> 	; 08/08/2016
  4326                              <1> 	;cmp	bh, 7
  4327                              <1> 	;jnb	short wgfxpl_3
  4328 0000281B FEC7                <1> 	inc	bh ; i++
  4329 0000281D 3A3D[F2F70000]      <1> 	cmp	bh, [CHAR_HEIGHT]
  4330 00002823 7303                <1> 	jnb	short wgfxpl_3
  4331 00002825 46                  <1> 	inc	esi
  4332 00002826 EBC5                <1> 	jmp	short wgfxpl_0
  4333                              <1> wgfxpl_3:
  4334                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4335 00002828 66B808FF            <1>   	mov	ax, 0FF08h
  4336 0000282C 66EF                <1> 	out	dx, ax
  4337 0000282E 66B80500            <1> 	mov	ax, 0005h
  4338 00002832 66EF                <1> 	out	dx, ax
  4339 00002834 66B80300            <1> 	mov	ax, 0003h
  4340 00002838 66EF                <1> 	out	dx, ax
  4341                              <1> 	;
  4342 0000283A 58                  <1> 	pop	eax
  4343 0000283B 5A                  <1> 	pop	edx
  4344 0000283C 5B                  <1> 	pop	ebx
  4345 0000283D 59                  <1> 	pop	ecx
  4346 0000283E C3                  <1> 	retn
  4347                              <1> 
  4348                              <1> vga_write_pixel: 
  4349                              <1> 	; 09/07/2016 (TRDOS 386 = TRDOS v2.0)
  4350                              <1> 	;
  4351                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4352                              <1> 	; vgabios-0.7a (2011)
  4353                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4354                              <1> 	; 'vgabios.c', 'biosfn_write_pixel'
  4355                              <1> 
  4356                              <1> 	; INPUT ->
  4357                              <1> 	; 	DX = row (0-239)
  4358                              <1> 	; 	CX = column (0-799)
  4359                              <1> 	; 	AL = pixel value
  4360                              <1> 	;	(AH = [CRT_MODE])
  4361                              <1> 	; OUTPUT ->
  4362                              <1> 	; 	none
  4363                              <1>  
  4364 0000283F 88C3                <1> 	mov	bl, al ; pixel value
  4365                              <1> 	;mov 	ah, [CRT_MODE]
  4366 00002841 BE[0AF80000]        <1> 	mov	esi, vga_modes
  4367 00002846 89F7                <1> 	mov	edi, esi
  4368 00002848 83C710              <1> 	add	edi, vga_mode_count
  4369                              <1> vga_wp_0:
  4370 0000284B AC                  <1> 	lodsb
  4371 0000284C 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  4372 0000284E 7405                <1> 	je	short vga_wp_1
  4373 00002850 39FE                <1> 	cmp	esi, edi
  4374 00002852 72F7                <1> 	jb	short vga_wp_0
  4375 00002854 C3                  <1> 	retn	; nothing to do
  4376                              <1> vga_wp_1:
  4377 00002855 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  4378                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  4379 00002858 BF00000A00          <1> 	mov	edi, 0A0000h
  4380                              <1> 	;
  4381 0000285D 803E04              <1> 	cmp	byte [esi], PLANAR4
  4382 00002860 741D                <1> 	je	short vga_wp_planar
  4383 00002862 803E03              <1> 	cmp	byte [esi], PLANAR1
  4384 00002865 7418                <1> 	je	short vga_wp_planar
  4385                              <1> vga_wp_linear8:
  4386                              <1> 	; addr=CX+DX*(read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)*8);
  4387 00002867 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS] ; = [VGA_COLS] ; nbcols
  4388 0000286E 66C1E003            <1>      	shl	ax, 3 ; * 8
  4389 00002872 66F7E2              <1> 	mul	dx
  4390 00002875 50                  <1> 	push	eax
  4391                              <1> 	;mov	edi, 0A0000h
  4392 00002876 6601CF              <1> 	add	di, cx
  4393 00002879 58                  <1> 	pop	eax
  4394 0000287A 01C7                <1> 	add	edi, eax ; addr
  4395                              <1> 	; write_byte(0xa000,addr,AL);
  4396 0000287C 881F                <1> 	mov	[edi], bl
  4397 0000287E C3                  <1> 	retn    
  4398                              <1> vga_wp_planar:
  4399                              <1> 	; addr = CX/8+DX*read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
  4400 0000287F 0FB7C1              <1> 	movzx	eax, cx
  4401 00002882 66C1E803            <1> 	shr	ax, 3 ; CX/8
  4402 00002886 50                  <1> 	push	eax
  4403 00002887 28E4                <1> 	sub	ah, ah ; 0
  4404 00002889 A0[F0F70000]        <1> 	mov	al, [CRT_COLS] ; = [VGA_COLS] ; nbcols
  4405 0000288E 66F7E2              <1> 	mul	dx
  4406                              <1> 	;mov	edi, 0A0000h
  4407 00002891 6601C7              <1>         add     di, ax
  4408 00002894 58                  <1> 	pop	eax
  4409 00002895 01C7                <1> 	add	edi, eax ; addr
  4410 00002897 80E107              <1> 	and	cl, 7
  4411 0000289A B580                <1> 	mov	ch, 80h ; mask
  4412 0000289C D2ED                <1> 	shr	ch, cl 	; mask = 0x80 >> (CX & 0x07);
  4413                              <1> 	
  4414                              <1> 	; outw(VGAREG_GRDC_ADDRESS, (mask << 8) | 0x08);
  4415 0000289E 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4416 000028A2 88EC                <1> 	mov	ah, ch
  4417 000028A4 B008                <1> 	mov	al, 8
  4418 000028A6 66EF                <1> 	out	dx, ax
  4419                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205);
  4420 000028A8 66B80502            <1> 	mov	ax, 0205h
  4421 000028AC 66EF                <1> 	out	dx, ax
  4422                              <1> 	; data = read_byte(0xa000,addr);
  4423 000028AE 8A07                <1> 	mov	al, [edi] ; (delay?)	
  4424                              <1> 	; if (AL & 0x80)
  4425                              <1> 	; {
  4426                              <1> 	;  outw(VGAREG_GRDC_ADDRESS, 0x1803);
  4427                              <1> 	; }
  4428 000028B0 F6C380              <1> 	test	bl, 80h
  4429 000028B3 7406                <1> 	jz	short vga_wp_2
  4430 000028B5 66B80318            <1> 	mov	ax, 1803h
  4431 000028B9 66EF                <1> 	out	dx, ax
  4432                              <1> vga_wp_2:	
  4433                              <1> 	; write_byte(0xa000,addr,AL);
  4434 000028BB 881F                <1> 	mov	[edi], bl
  4435                              <1> 	;
  4436                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4437 000028BD 66B808FF            <1>   	mov	ax, 0FF08h
  4438 000028C1 66EF                <1> 	out	dx, ax
  4439 000028C3 66B80500            <1> 	mov	ax, 0005h
  4440 000028C7 66EF                <1> 	out	dx, ax
  4441 000028C9 66B80300            <1> 	mov	ax, 0003h
  4442 000028CD 66EF                <1> 	out	dx, ax
  4443                              <1> 	;
  4444 000028CF C3                  <1> 	retn
  4445                              <1> 
  4446                              <1> vga_read_pixel: 
  4447                              <1> 	; 09/07/2016 (TRDOS 386 = TRDOS v2.0)
  4448                              <1> 	;
  4449                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4450                              <1> 	; vgabios-0.7a (2011)
  4451                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4452                              <1> 	; 'vgabios.c', 'biosfn_read_pixel'
  4453                              <1> 
  4454                              <1> 	; INPUT ->
  4455                              <1> 	; 	DX = row (0-239)
  4456                              <1> 	; 	CX = column (0-799)
  4457                              <1> 	;	(AH = [CRT_MODE])
  4458                              <1> 	; OUTPUT ->
  4459                              <1> 	; 	AL = pixel value
  4460                              <1> 	 
  4461                              <1> 	;mov 	ah, [CRT_MODE]
  4462 000028D0 BE[0AF80000]        <1> 	mov	esi, vga_modes
  4463 000028D5 89F7                <1> 	mov	edi, esi
  4464 000028D7 83C710              <1> 	add	edi, vga_mode_count
  4465                              <1> vga_rp_0:
  4466 000028DA AC                  <1> 	lodsb
  4467 000028DB 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  4468 000028DD 7405                <1> 	je	short vga_rp_1
  4469 000028DF 39FE                <1> 	cmp	esi, edi
  4470 000028E1 72F7                <1> 	jb	short vga_rp_0
  4471 000028E3 C3                  <1> 	retn	; nothing to do
  4472                              <1> vga_rp_1:
  4473 000028E4 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  4474                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  4475 000028E7 BF00000A00          <1> 	mov	edi, 0A0000h
  4476                              <1> 	;
  4477 000028EC 803E04              <1> 	cmp	byte [esi], PLANAR4
  4478 000028EF 741D                <1> 	je	short vga_rp_planar
  4479 000028F1 803E03              <1> 	cmp	byte [esi], PLANAR1
  4480 000028F4 7418                <1> 	je	short vga_rp_planar
  4481                              <1> vga_rp_linear8:
  4482                              <1> 	; addr=CX+DX*(read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)*8);
  4483 000028F6 0FB605[F0F70000]    <1> 	movzx	eax, byte [CRT_COLS] ; = [VGA_COLS] ; nbcols
  4484 000028FD 66C1E003            <1>      	shl	ax, 3 ; * 8
  4485 00002901 66F7E2              <1> 	mul	dx
  4486 00002904 50                  <1> 	push	eax
  4487                              <1> 	;mov	edi, 0A0000h
  4488 00002905 6601CF              <1> 	add	di, cx
  4489 00002908 58                  <1> 	pop	eax
  4490 00002909 01C7                <1> 	add	edi, eax ; addr
  4491                              <1> 	; attr=read_byte(0xa000,addr);
  4492 0000290B 8A07                <1> 	mov	al, [edi] ; pixel value
  4493 0000290D C3                  <1> 	retn    
  4494                              <1> vga_rp_planar:
  4495                              <1> 	; addr = CX/8+DX*read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
  4496 0000290E 0FB7C1              <1> 	movzx	eax, cx
  4497 00002911 66C1E803            <1> 	shr	ax, 3 ; CX/8
  4498 00002915 50                  <1> 	push	eax
  4499 00002916 28E4                <1> 	sub	ah, ah ; 0
  4500 00002918 A0[F0F70000]        <1> 	mov	al, [CRT_COLS] ; = [VGA_COLS] ; nbcols
  4501 0000291D 66F7E2              <1> 	mul	dx
  4502                              <1> 	;mov	edi, 0A0000h
  4503 00002920 6601C7              <1>         add     di, ax
  4504 00002923 58                  <1> 	pop	eax
  4505 00002924 01C7                <1> 	add	edi, eax ; addr
  4506 00002926 80E107              <1> 	and	cl, 7
  4507 00002929 B580                <1> 	mov	ch, 80h ; mask
  4508 0000292B D2ED                <1> 	shr	ch, cl 	; mask = 0x80 >> (CX & 0x07);
  4509                              <1> 	; attr = 0x00;
  4510 0000292D 30DB                <1> 	xor	bl, bl ; attr = bl = 0, 
  4511 0000292F 30C9                <1> 	xor	cl, cl ; i = cl = 0
  4512                              <1> 	; for(i=0;i<4;i++)
  4513                              <1>       	; {
  4514                              <1>        	;  outw(VGAREG_GRDC_ADDRESS, (i << 8) | 0x04);
  4515                              <1>        	;  data = read_byte(0xa000,addr) & mask;
  4516                              <1>        	;  if (data > 0) attr |= (0x01 << i);
  4517                              <1>       	; }
  4518                              <1> vga_rp_2:
  4519 00002931 88CC                <1> 	mov	ah, cl ; i << 8
  4520 00002933 B004                <1> 	mov	al, 4  ; | 0x04
  4521 00002935 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4522 00002939 66EF                <1> 	out	dx, ax
  4523                              <1> 	; data = read_byte(0xa000,addr) & mask;
  4524 0000293B 8A07                <1> 	mov	al, [edi]
  4525 0000293D 20E8                <1> 	and	al, ch ; & mask
  4526                              <1> 	; if (data > 0) attr |= (0x01 << i);
  4527 0000293F 08C0                <1> 	or	al, al
  4528 00002941 7408                <1> 	jz	short vga_rp_3 ; al = 0 
  4529 00002943 B701                <1> 	mov	bh, 1
  4530 00002945 D2E7                <1> 	shl	bh, cl ; (0x01 << i)
  4531 00002947 08FB                <1> 	or	bl, bh ; attr |= (0x01 << i)
  4532 00002949 88D8                <1> 	mov	al, bl ; pixel value	
  4533                              <1> vga_rp_3:	
  4534 0000294B C3                  <1> 	retn
  4535                              <1> 
  4536                              <1> vga_beeper:
  4537                              <1> 	; 04/08/2016  (TRDOS 386 = TRDOS v2.0)
  4538 0000294C FB                  <1> 	sti
  4539                              <1> 	;mov	bh, [ACTIVE_PAGE]
  4540 0000294D E9CFF3FFFF          <1>         jmp     beeper_gfx
  4541                              <1> 
  4542                              <1> vga_write_teletype:
  4543                              <1> 	; 06/08/2016
  4544                              <1> 	; 04/08/2016
  4545                              <1> 	; 01/08/2016
  4546                              <1> 	; 31/07/2016
  4547                              <1> 	; 09/07/2016 (TRDOS 386 = TRDOS v2.0)
  4548                              <1> 	;
  4549                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4550                              <1> 	; vgabios-0.7a (2011)
  4551                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4552                              <1> 	; 'vgabios.c', 'biosfn_write_teletype'
  4553                              <1> 	; 'biosfn_write_char_only'
  4554                              <1> 
  4555                              <1> 	; INPUT ->
  4556                              <1> 	; [CRT_MODE] = current video mode (>7)
  4557                              <1> 	; AL = Character to write
  4558                              <1> 	; BL = Color of character
  4559                              <1> 	; OUTPUT ->
  4560                              <1> 	; Regen buffer updated
  4561                              <1> 
  4562                              <1> 	; biosfn_write_teletype (car, page, attr, flag) 
  4563                              <1> 	; car = character (AL)
  4564                              <1> 	; page = 0
  4565                              <1> 	; attr = color (BL)
  4566                              <1> 	; 'flag' not used
  4567                              <1> 
  4568 00002952 8A25[EEF70000]      <1> 	mov 	ah, [CRT_MODE]
  4569 00002958 88C7                <1> 	mov	bh, al ; character
  4570 0000295A 668B15[FE300100]    <1> 	mov	dx, [CURSOR_POSN] ; cursor pos for page 0
  4571                              <1> 
  4572 00002961 BE[12F80000]        <1> 	mov	esi, vga_g_modes
  4573 00002966 89F7                <1> 	mov	edi, esi
  4574 00002968 83C708              <1> 	add	edi, vga_g_mode_count
  4575                              <1> vga_wtty_0:
  4576 0000296B AC                  <1> 	lodsb
  4577 0000296C 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  4578 0000296E 7405                <1> 	je	short vga_wtty_2
  4579 00002970 39FE                <1> 	cmp	esi, edi
  4580 00002972 72F7                <1> 	jb	short vga_wtty_0
  4581                              <1> vga_wtty_1:
  4582 00002974 C3                  <1> 	retn	; nothing to do
  4583                              <1> vga_wtty_2:
  4584 00002975 80FF07              <1> 	cmp	bh, 07h ; bell (beep)
  4585 00002978 74D2                <1> 	je	short vga_beeper  ; u11
  4586 0000297A 80FF08              <1> 	cmp	bh, 08h ; backspace
  4587 0000297D 7508                <1> 	jne	short vga_wtty_3
  4588                              <1> 	; if(xcurs>0)xcurs--;
  4589 0000297F 08D2                <1> 	or	dl, dl ; xcurs (column)
  4590 00002981 74F1                <1> 	jz	short vga_wtty_1
  4591 00002983 FECA                <1> 	dec	dl ; xcurs--;
  4592 00002985 EB59                <1>         jmp     short vga_wtty_12 
  4593                              <1> vga_wtty_3:			
  4594 00002987 80FF0D              <1> 	cmp	bh, 0Dh ; carriage return (\r)
  4595 0000298A 7504                <1> 	jne	short vga_wtty_4
  4596                              <1> 	; xcurs=0;
  4597 0000298C 28D2                <1> 	sub	dl, dl ; 0
  4598 0000298E EB50                <1>         jmp     short vga_wtty_12 
  4599                              <1> vga_wtty_4:	
  4600 00002990 80FF0A              <1> 	cmp	bh, 0Ah ; new line (\n)
  4601 00002993 7504                <1> 	jne	short vga_wtty_5
  4602                              <1> 	; ycurs++;
  4603 00002995 FEC6                <1> 	inc	dh ; next row
  4604 00002997 EB62                <1>         jmp     short vga_wtty_11
  4605                              <1> vga_wtty_5:
  4606 00002999 80FF09              <1> 	cmp 	bh, 09h ; tab stop
  4607 0000299C 7527                <1> 	jne	short vga_wtty_8
  4608 0000299E 88D0                <1> 	mov	al, dl
  4609 000029A0 6698                <1> 	cbw
  4610 000029A2 B108                <1> 	mov	cl, 8
  4611 000029A4 F6F1                <1> 	div	cl
  4612 000029A6 28E1                <1> 	sub	cl, ah
  4613                              <1> 	;
  4614 000029A8 B720                <1> 	mov	bh, 20h ; space
  4615                              <1> vga_wtty_6: ; tab stop loop
  4616 000029AA 6651                <1> 	push	cx
  4617 000029AC 6653                <1> 	push	bx
  4618 000029AE E812000000          <1> 	call	vga_wtty_8
  4619 000029B3 665B                <1> 	pop	bx  ; bh = character, bl = color
  4620 000029B5 6659                <1> 	pop	cx
  4621 000029B7 FEC9                <1> 	dec	cl
  4622 000029B9 7409                <1> 	jz	short vga_wtty_7
  4623 000029BB 668B15[FE300100]    <1> 	mov	dx, [CURSOR_POSN] ; new cursor position (pg 0)
  4624 000029C2 EBE6                <1> 	jmp	short vga_wtty_6
  4625                              <1> vga_wtty_7:
  4626 000029C4 C3                  <1> 	retn
  4627                              <1> 	;
  4628                              <1> vga_wtty_8:
  4629 000029C5 83C64F              <1> 	add	esi, vga_g_memmodel - (vga_g_modes + 1)  
  4630                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  4631 000029C8 BF00000A00          <1> 	mov	edi, 0A0000h
  4632                              <1> 	;
  4633 000029CD 88F8                <1> 	mov	al, bh ; character
  4634                              <1> 	;
  4635 000029CF 803E04              <1> 	cmp	byte [esi], PLANAR4
  4636 000029D2 7414                <1> 	je	short vga_wtty_planar
  4637 000029D4 803E03              <1> 	cmp	byte [esi], PLANAR1
  4638 000029D7 740F                <1> 	je	short vga_wtty_planar
  4639                              <1> vga_wtty_linear8:
  4640                              <1> 	; write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols);
  4641                              <1> 	; AL = car, BL = attr (color), DL = xcurs, DH = ycurs, 
  4642                              <1> 	; [CRT_COLS] = nbcols
  4643 000029D9 E8F3FCFFFF          <1> 	call	write_gfx_char_lin
  4644 000029DE EB0D                <1> 	jmp	short vga_wtty_9
  4645                              <1> 
  4646                              <1> vga_wtty_12:
  4647                              <1> 	; 09/07/2016
  4648                              <1> 	; set cursor position
  4649                              <1> 	; NOTE: Hardware cursor position will not be set
  4650                              <1> 	;   in any VGA modes (>7)
  4651                              <1> 	;   But, cursor position will be saved into
  4652                              <1> 	;   [CURSOR_POSN].
  4653                              <1> 	;   TRDOS 386 (TRDOS v2.0) uses only one page
  4654                              <1> 	;   (page 0) for all graphics modes.
  4655                              <1> 
  4656 000029E0 668915[FE300100]    <1> 	mov	[CURSOR_POSN], dx ; save cursor pos for pg 0
  4657                              <1> 	; 04/08/2016
  4658                              <1> 	;mov	bh, [ACTIVE_PAGE] ; = 0
  4659                              <1> 	;call	_set_cpos
  4660 000029E7 C3                  <1> 	retn
  4661                              <1> 
  4662                              <1> vga_wtty_planar:
  4663                              <1> 	; write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight);
  4664                              <1> 	; AL = car, BL = attr (color), DL = xcurs, DH = ycurs, 
  4665                              <1> 	; [CRT_COLS]= nbcols, [CHAR_HEIGHT] = cheight
  4666 000029E8 E87BFDFFFF          <1> 	call	write_gfx_char_pl4
  4667                              <1> vga_wtty_9:
  4668 000029ED FEC2                <1> 	inc	dl ; xcurs++;
  4669                              <1> vga_wtty_10:
  4670                              <1> 	; Do we need to wrap ?
  4671                              <1> 	; if(xcurs==nbcols)
  4672 000029EF 3A15[F0F70000]      <1> 	cmp	dl, [CRT_COLS] ; [VGA_COLS]
  4673 000029F5 7204                <1> 	jb	short vga_wtty_11 ; no
  4674 000029F7 28D2                <1> 	sub	dl, dl ; xcurs=0;
  4675 000029F9 FEC6                <1> 	inc	dh ;  ycurs++;
  4676                              <1> vga_wtty_11:
  4677                              <1> 	; Do we need to scroll ?
  4678                              <1> 	; if(ycurs==nbrows)
  4679 000029FB 3A35[F6F70000]      <1> 	cmp	dh, [VGA_ROWS]
  4680 00002A01 72DD                <1> 	jb	short vga_wtty_12 ; no
  4681                              <1> 	;
  4682                              <1> 	; biosfn_scroll (nblines,attr,rul,cul,rlr,clr,page,dir)
  4683                              <1> 	; al = nblines = 1, bl = attr (color) = 0
  4684                              <1> 	; ch = rul, cl = cul, dh = rlr, dl = clr, page = 0
  4685                              <1> 	; dir = SCROLL_UP
  4686                              <1> 	
  4687 00002A03 B001                <1> 	mov	al, 1
  4688 00002A05 28DB                <1> 	sub	bl, bl ; 0 ; blank/black line (attr=0) will be used
  4689 00002A07 6629C9              <1> 	sub	cx, cx ; 0,0
  4690                              <1> 
  4691                              <1> 	; 06/08/2016
  4692 00002A0A 8A35[F6F70000]      <1> 	mov	dh, [VGA_ROWS]
  4693 00002A10 FECE                <1> 	dec	dh ; nbrows -1
  4694                              <1> 
  4695 00002A12 6652                <1> 	push	dx 	; 04/08/2016
  4696 00002A14 8A15[F0F70000]      <1> 	mov	dl, [CRT_COLS]
  4697 00002A1A FECA                <1> 	dec	dl ; nbcols -1
  4698                              <1> 	
  4699 00002A1C 8A25[EEF70000]      <1> 	mov	ah, [CRT_MODE]
  4700                              <1> 	
  4701                              <1> 	; biosfn_scroll(0x01,0x00,0,0,nbrows-1,nbcols-1,page,SCROLL_UP);
  4702 00002A22 E808F5FFFF          <1> 	call	vga_graphics_up
  4703                              <1> 	; 04/08/2016
  4704 00002A27 665A                <1> 	pop	dx
  4705                              <1> 	;dec	dh ; ycurs-=1
  4706 00002A29 EBB5                <1> 	jmp	short vga_wtty_12 
  4707                              <1> 
  4708                              <1> font_setup:
  4709                              <1> 	; 09/07/2016
  4710                              <1> 	; character generator (font loading) functions
  4711                              <1> 	;
  4712                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4713                              <1> 	; vgabios-0.7a (2011)
  4714                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4715                              <1> 	; 'vgabios.c', 'int10_func'
  4716                              <1> 
  4717                              <1> 	; AX = 1100H ; Load User-Defined Font (EGA/VGA)
  4718                              <1> 	;
  4719                              <1>         ; BH    height of each character (bytes per character definition)
  4720                              <1>         ; (BL   font block to load (EGA: 0-3; VGA: 0-7))
  4721                              <1> 	; CX    number of characters to redefine (<=256)
  4722                              <1>         ; DX    ASCII code of the first character defined at ES:BP
  4723                              <1>         ; EBP	address of font-definition information
  4724                              <1> 	;	(in user's memory space)
  4725                              <1> 
  4726                              <1> 	; case 0x11:
  4727                              <1>      	; switch(GET_AL())
  4728                              <1>       	; {
  4729                              <1> 	; case 0x00:
  4730                              <1>         ; case 0x10:
  4731                              <1>         ; biosfn_load_text_user_pat(GET_AL(),ES,BP,CX,DX,GET_BL(),GET_BH());
  4732                              <1>         ; break;
  4733                              <1> 
  4734                              <1> 	; AX = 1110H ; Load and Activate User-Defined Font (EGA/VGA)
  4735 00002A2B 08C0                <1> 	or	al, al ; 0
  4736 00002A2D 7404                <1> 	jz	short font_setup_0
  4737 00002A2F 3C10                <1> 	cmp	al, 10h
  4738 00002A31 7511                <1> 	jne	short font_setup_1	
  4739                              <1> font_setup_0:
  4740 00002A33 E8B7000000          <1> 	call	transfer_user_fonts
  4741 00002A38 721C                <1> 	jc	short font_setup_error
  4742 00002A3A E8C2000000          <1> 	call	load_text_user_pat
  4743 00002A3F E996EAFFFF          <1>         jmp     VIDEO_RETURN 
  4744                              <1> font_setup_1:
  4745                              <1> 	; AX = 1101H ; Load ROM 8x14 Character Set (EGA/VGA)
  4746                              <1> 	; case 0x01:
  4747                              <1>         ; case 0x11:
  4748                              <1>         ; biosfn_load_text_8_14_pat(GET_AL(),GET_BL());
  4749                              <1>         ; break;
  4750 00002A44 3C01                <1> 	cmp	al, 1
  4751 00002A46 7404                <1> 	je	short font_setup_2
  4752 00002A48 3C11                <1> 	cmp	al, 11h
  4753 00002A4A 7511                <1> 	jne	short font_setup_3	
  4754                              <1> font_setup_2:
  4755                              <1> 	; AX = 1111H ; Load and Activate ROM 8x14 Character Set (EGA/VGA)
  4756                              <1> 	; (BL = font block to load (EGA: 0-3; VGA: 0-7))
  4757 00002A4C E8EE010000          <1> 	call	load_text_8_14_pat
  4758 00002A51 E984EAFFFF          <1>         jmp     VIDEO_RETURN
  4759                              <1> font_setup_error:
  4760 00002A56 29C0                <1> 	sub	eax, eax ; 0 -> fonts could not be loaded
  4761 00002A58 E982EAFFFF          <1> 	jmp	_video_return
  4762                              <1> font_setup_3:
  4763                              <1> 	; AX = 1102H ; Load ROM 8x8 Character Set (EGA/VGA)
  4764                              <1> 	; case 0x02:
  4765                              <1>         ; case 0x12:
  4766                              <1>         ; biosfn_load_text_8_8_pat(GET_AL(),GET_BL());
  4767                              <1>         ; break;
  4768 00002A5D 3C02                <1> 	cmp	al, 2
  4769 00002A5F 7404                <1> 	je	short font_setup_4
  4770 00002A61 3C12                <1> 	cmp	al, 12h
  4771 00002A63 750A                <1> 	jne	short font_setup_5	
  4772                              <1> font_setup_4:
  4773                              <1> 	; AX = 1112H ; Load and Activate ROM 8x8 Character Set (EGA/VGA)
  4774                              <1> 	; (BL = font block to load (EGA: 0-3; VGA: 0-7))
  4775 00002A65 E805020000          <1> 	call	load_text_8_8_pat
  4776 00002A6A E96BEAFFFF          <1>         jmp     VIDEO_RETURN
  4777                              <1> font_setup_5:
  4778                              <1> 	; AX = 1104H ; Load ROM 8x16 Character Set (EGA/VGA)
  4779                              <1> 	; case 0x04:
  4780                              <1>         ; case 0x14:
  4781                              <1>         ; biosfn_load_text_8_16_pat(GET_AL(),GET_BL());
  4782                              <1>         ; break;
  4783 00002A6F 3C04                <1> 	cmp	al, 4
  4784 00002A71 7404                <1> 	je	short font_setup_6
  4785 00002A73 3C14                <1> 	cmp	al, 14h
  4786 00002A75 750A                <1> 	jne	short font_setup_7	
  4787                              <1> font_setup_6:
  4788                              <1> 	; AX = 1114H ; Load and Activate ROM 8x16 Character Set (EGA/VGA)
  4789                              <1> 	; (BL = font block to load (EGA: 0-3; VGA: 0-7))
  4790 00002A77 E823020000          <1> 	call	load_text_8_16_pat
  4791 00002A7C E959EAFFFF          <1>         jmp     VIDEO_RETURN
  4792                              <1> font_setup_7:
  4793                              <1> 	; Note: AX=1120h (Setup INT 1Fh, EXT_PTR) is not needed
  4794                              <1> 	; for TRDOS 386 (TRDIOS v2.0) video functionality;
  4795                              <1> 	; because, originally EXT_PTR (font address) was used for
  4796                              <1> 	; chars 80h to 0FFh (after the first 128 ASCII char fonts), for
  4797                              <1> 	; CGA graphics mode; currenty, 'vgafont8' address has 256 chars!
  4798                              <1> 	; 
  4799                              <1> 	; case 0x20:
  4800                              <1>         ; biosfn_load_gfx_8_8_chars(ES,BP);
  4801                              <1>         ; break; 
  4802                              <1> 	; case 0x21:
  4803                              <1>         ; biosfn_load_gfx_user_chars(ES,BP,CX,GET_BL(),GET_DL());
  4804                              <1>         ; break;
  4805                              <1> 	; AX = 1121H ; Setup User-Defined Font for Graphics Mode (VGA)
  4806                              <1> 	; BL   screen rows code: 00H = user-specified (in DL)
  4807                              <1>         ;                        01H = 14 rows
  4808                              <1>         ;                        02H = 25 rows
  4809                              <1>         ;                        03H = 43 rows
  4810                              <1>         ; CX   bytes per character definition
  4811                              <1>         ; DL   (when BL=0) custom number of character rows on screen
  4812                              <1>         ; EBP  address of font-definition information (user's mem space)
  4813                              <1> 
  4814 00002A81 3C21                <1> 	cmp	al, 21h
  4815 00002A83 751A                <1> 	jne	short font_setup_9
  4816                              <1> 
  4817                              <1> 	; TRDOS 386 modification !
  4818                              <1> 	; dh = 0 -> 256 characters
  4819                              <1> 	; dh = 80h -> 128 characters
  4820                              <1> 	; (If DH <> 0 and DH <> 80h -> invalid)     
  4821 00002A85 20F6                <1> 	and	dh, dh
  4822 00002A87 7405                <1> 	jz	short font_setup_8 ; 256 characters
  4823 00002A89 80FE80              <1> 	cmp	dh, 80h ; 128 characters
  4824 00002A8C 75C8                <1> 	jne	short font_setup_error ; invalid !
  4825                              <1> font_setup_8:
  4826 00002A8E E85C000000          <1> 	call	transfer_user_fonts
  4827 00002A93 72C1                <1> 	jc	short font_setup_error
  4828                              <1> 	; ebp = user's font data address in system's memory space
  4829 00002A95 E836020000          <1> 	call	load_gfx_user_chars
  4830 00002A9A E93BEAFFFF          <1>         jmp     VIDEO_RETURN 
  4831                              <1> font_setup_9:
  4832                              <1> 	; case 0x22:
  4833                              <1>         ; biosfn_load_gfx_8_14_chars(GET_BL());
  4834                              <1>         ; break;
  4835 00002A9F 3C22                <1> 	cmp	al, 22h
  4836 00002AA1 750A                <1> 	jne	short font_setup_10
  4837 00002AA3 E866020000          <1> 	call	load_gfx_8_14_chars	
  4838 00002AA8 E92DEAFFFF          <1>         jmp     VIDEO_RETURN 
  4839                              <1> font_setup_10:	
  4840                              <1> 	; case 0x23:
  4841                              <1>         ; biosfn_load_gfx_8_8_dd_chars(GET_BL());
  4842                              <1>         ; break;
  4843 00002AAD 3C23                <1> 	cmp	al, 23h
  4844 00002AAF 750A                <1> 	jne	short font_setup_11
  4845 00002AB1 E899020000          <1> 	call	load_gfx_8_8_chars	
  4846 00002AB6 E91FEAFFFF          <1>         jmp     VIDEO_RETURN 
  4847                              <1> font_setup_11:	
  4848                              <1> 	; case 0x24:
  4849                              <1>         ; biosfn_load_gfx_8_16_chars(GET_BL());
  4850                              <1>         ; break;
  4851 00002ABB 3C24                <1> 	cmp	al, 24h
  4852 00002ABD 750A                <1> 	jne	short font_setup_12
  4853 00002ABF E8CC020000          <1> 	call	load_gfx_8_16_chars	
  4854 00002AC4 E911EAFFFF          <1>         jmp     VIDEO_RETURN 
  4855                              <1> font_setup_12:
  4856                              <1>  	; case 0x30:
  4857                              <1>         ; biosfn_get_font_info(GET_BH(),&ES,&BP,&CX,&DX);
  4858                              <1>         ; break;
  4859 00002AC9 3C30                <1> 	cmp	al, 30h
  4860 00002ACB 750A                <1> 	jne	short font_setup_13			
  4861 00002ACD E8FF020000          <1> 	call	get_font_info
  4862                              <1> 	; eax = return value (info: 4 bytes for 4 parms)
  4863                              <1> 	; eax = 0 -> invalid function (input)
  4864 00002AD2 E908EAFFFF          <1>         jmp     _video_return
  4865                              <1> font_setup_13:
  4866 00002AD7 3C03                <1> 	cmp	al, 03h ; AX = 1103h	
  4867 00002AD9 750D                <1> 	jne	short font_setup_14
  4868                              <1> 	; biosfn_set_text_block_specifier:
  4869                              <1> 	; BL = font block selector code	
  4870                              <1> 	; NOTE: TRDOS 386 only uses and sets font block 0
  4871                              <1> 	; (It is as BL = 0 for TRDOS 386)
  4872 00002ADB 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  4873                              <1> 	;mov	ah, bl
  4874 00002ADF 28E4                <1> 	sub	ah, ah ; 0
  4875                              <1> 	;mov	al, 03h
  4876 00002AE1 66EF                <1> 	out	dx, ax
  4877 00002AE3 E9F2E9FFFF          <1> 	jmp     VIDEO_RETURN 
  4878                              <1> 	
  4879                              <1> font_setup_14:
  4880 00002AE8 29C0                <1> 	sub	eax, eax ; 0 = invalid function
  4881 00002AEA E9F0E9FFFF          <1>         jmp     _video_return
  4882                              <1> 
  4883                              <1> transfer_user_fonts:
  4884                              <1> 	; 09/07/2016
  4885                              <1> 	;and	ecx, 0FFFFh
  4886                              <1> 	; ECX = byte count
  4887                              <1> 	;push	ecx
  4888 00002AEF 89EE                <1> 	mov	esi, ebp ; user buffer
  4889 00002AF1 BF00000700          <1> 	mov	edi, Cluster_Buffer  ; system buffer
  4890 00002AF6 E8C9B30000          <1> 	call	transfer_from_user_buffer
  4891                              <1> 	;pop	ecx
  4892                              <1> 	; ecx = transfer (byte) count = character count
  4893 00002AFB BD00000700          <1> 	mov	ebp, Cluster_Buffer
  4894                              <1> 	; jc	VIDEO_RETURN -> failed
  4895 00002B00 C3                  <1> 	retn
  4896                              <1> 
  4897                              <1> load_text_user_pat:
  4898                              <1> 	; 26/07/2016
  4899                              <1> 	; 09/07/2016
  4900                              <1> 	; load user defined (EGA/VGA) text fonts
  4901                              <1> 	;
  4902                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4903                              <1> 	; vgabios-0.7a (2011)
  4904                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4905                              <1> 	; 'vgabios.c', 'biosfn_load_text_user_pat'
  4906                              <1> 
  4907                              <1> 	; biosfn_load_text_user_pat (AL,ES,BP,CX,DX,BL,BH)
  4908                              <1> 
  4909                              <1> 	; get_font_access();
  4910                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  4911                              <1> 	; for(i=0;i<CX;i++)
  4912                              <1> 	; {
  4913                              <1> 	;  src = BP + i * BH;
  4914                              <1> 	;  dest = blockaddr + (DX + i) * 32;
  4915                              <1> 	;  memcpyb(0xA000, dest, ES, src, BH);
  4916                              <1> 	; }
  4917                              <1> 	; release_font_access();
  4918                              <1> 	; if(AL>=0x10)
  4919                              <1> 	; {
  4920                              <1> 	; set_scan_lines(BH);
  4921                              <1> 	; }
  4922                              <1> 
  4923 00002B01 50                  <1> 	push	eax
  4924 00002B02 E83C000000          <1> 	call	get_font_access
  4925 00002B07 28DB                <1> 	sub	bl, bl ; i = 0	
  4926                              <1> ltup_1:
  4927 00002B09 88D8                <1> 	mov	al, bl
  4928 00002B0B F6E7                <1> 	mul	bh
  4929 00002B0D 0FB7F0              <1> 	movzx	esi, ax
  4930 00002B10 01EE                <1> 	add	esi, ebp
  4931 00002B12 88D8                <1> 	mov	al, bl
  4932 00002B14 28E4                <1> 	sub	ah, ah
  4933 00002B16 6601D0              <1> 	add	ax, dx ; (DX + i)
  4934 00002B19 66C1E005            <1> 	shl	ax, 5  ; * 32
  4935 00002B1D 0FB7F8              <1> 	movzx	edi, ax
  4936 00002B20 81C700000A00        <1> 	add	edi, 0A0000h
  4937 00002B26 51                  <1> 	push	ecx
  4938 00002B27 0FB6CF              <1> 	movzx	ecx, bh 		
  4939 00002B2A F3A4                <1> 	rep	movsb
  4940 00002B2C 59                  <1> 	pop	ecx	
  4941 00002B2D FEC3                <1> 	inc	bl
  4942 00002B2F 38CB                <1> 	cmp	bl, cl
  4943 00002B31 75D6                <1> 	jne	short ltup_1	
  4944                              <1> 	;
  4945 00002B33 E840000000          <1> 	call	release_font_access
  4946                              <1> 	;
  4947 00002B38 58                  <1> 	pop	eax
  4948                              <1> 	; if(AL>=0x10)
  4949 00002B39 3C10                <1> 	cmp	al, 10h
  4950 00002B3B 7205                <1> 	jb	short ltup_2
  4951                              <1>    	; set_scan_lines(BH);
  4952 00002B3D E875000000          <1> 	call	set_scan_lines
  4953                              <1> ltup_2:
  4954 00002B42 C3                  <1> 	retn
  4955                              <1> 
  4956                              <1> get_font_access:
  4957                              <1> 	; 09/07/2016
  4958                              <1> 	;
  4959                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4960                              <1> 	; vgabios-0.7a (2011)
  4961                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4962                              <1> 	; 'vgabios.c', 'get_font_access'
  4963                              <1> 
  4964                              <1> 	; get_font_access()
  4965 00002B43 52                  <1> 	push	edx
  4966 00002B44 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  4967 00002B48 66B80001            <1> 	mov	ax, 0100h
  4968 00002B4C 66EF                <1> 	out	dx, ax
  4969 00002B4E 66B80204            <1> 	mov	ax, 0402h
  4970 00002B52 66EF                <1> 	out	dx, ax
  4971 00002B54 66B80407            <1> 	mov	ax, 0704h
  4972 00002B58 66EF                <1> 	out	dx, ax
  4973 00002B5A 66B80003            <1> 	mov	ax, 0300h
  4974 00002B5E 66EF                <1> 	out	dx, ax
  4975 00002B60 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4976 00002B64 66B80402            <1> 	mov	ax, 0204h
  4977 00002B68 66EF                <1> 	out	dx, ax
  4978 00002B6A 66B80500            <1> 	mov	ax, 0005h
  4979 00002B6E 66EF                <1> 	out	dx, ax
  4980 00002B70 66B80604            <1> 	mov	ax, 0406h
  4981 00002B74 66EF                <1> 	out	dx, ax
  4982 00002B76 5A                  <1> 	pop	edx
  4983 00002B77 C3                  <1> 	retn
  4984                              <1> 
  4985                              <1> release_font_access:
  4986                              <1> 	; 29/07/2016
  4987                              <1> 	; 09/07/2016
  4988                              <1> 	;
  4989                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4990                              <1> 	; vgabios-0.7a (2011)
  4991                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4992                              <1> 	; 'vgabios.c', 'release_font_access'
  4993                              <1> 
  4994 00002B78 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  4995 00002B7C 66B80001            <1> 	mov	ax, 0100h
  4996 00002B80 66EF                <1> 	out	dx, ax
  4997 00002B82 66B80203            <1> 	mov	ax, 0302h
  4998 00002B86 66EF                <1> 	out	dx, ax
  4999 00002B88 66B80403            <1> 	mov	ax, 0304h
  5000 00002B8C 66EF                <1> 	out	dx, ax
  5001 00002B8E 66B80003            <1> 	mov	ax, 0300h
  5002 00002B92 66EF                <1> 	out	dx, ax
  5003 00002B94 66BACC03            <1> 	mov	dx, 3CCh ; VGAREG_READ_MISC_OUTPUT
  5004 00002B98 EC                  <1>  	in	al, dx
  5005 00002B99 2401                <1> 	and	al, 01h
  5006 00002B9B C0E002              <1> 	shl	al, 2
  5007 00002B9E 0C0A                <1> 	or	al, 0Ah
  5008 00002BA0 88C4                <1> 	mov	ah, al
  5009 00002BA2 B006                <1> 	mov	al, 06h
  5010 00002BA4 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  5011 00002BA8 66EF                <1> 	out	dx, ax
  5012 00002BAA 66B80400            <1> 	mov	ax, 0004h
  5013 00002BAE 66EF                <1> 	out	dx, ax
  5014 00002BB0 66B80510            <1> 	mov	ax, 1005h
  5015 00002BB4 66EF                <1> 	out	dx, ax
  5016 00002BB6 C3                  <1> 	retn
  5017                              <1> 
  5018                              <1> set_scan_lines:
  5019                              <1> 	; 09/07/2016
  5020                              <1> 	;
  5021                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5022                              <1> 	; vgabios-0.7a (2011)
  5023                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5024                              <1> 	; 'vgabios.c', 'set_scan_lines'
  5025                              <1> 
  5026                              <1> 	; set_scan_lines(lines)
  5027                              <1> 	; BH = lines
  5028                              <1> 
  5029                              <1> 	; outb(crtc_addr, 0x09);
  5030 00002BB7 66BAD403            <1> 	mov	dx, 3D4h ; CRTC_ADDRESS = 3D4h (always)
  5031 00002BBB B009                <1> 	mov	al, 09h
  5032 00002BBD EE                  <1> 	out	dx, al
  5033                              <1> 	; crtc_r9 = inb(crtc_addr+1);
  5034 00002BBE 6642                <1> 	inc	dx ; 3D5h
  5035 00002BC0 EC                  <1> 	in	al, dx
  5036                              <1> 	; crtc_r9 = (crtc_r9 & 0xe0) | (lines - 1);
  5037 00002BC1 24E0                <1> 	and	al, 0E0h
  5038 00002BC3 FECF                <1> 	dec	bh ; lines - 1
  5039 00002BC5 08F8                <1> 	or	al, bh
  5040                              <1> 	; outb(crtc_addr+1, crtc_r9);
  5041 00002BC7 EE                  <1> 	out	dx, al
  5042                              <1> 	;inc	bh 
  5043                              <1> 	; if(lines==8)
  5044                              <1> 	;cmp	bh, 8
  5045 00002BC8 80FF07              <1> 	cmp	bh, 7
  5046 00002BCB 7506                <1> 	jne	short ssl_1
  5047                              <1> 	; biosfn_set_cursor_shape(0x06,0x07);
  5048 00002BCD 66B90706            <1> 	mov	cx, 0607h
  5049 00002BD1 EB06                <1> 	jmp	short ssl_2
  5050                              <1> ssl_1:
  5051                              <1> 	; biosfn_set_cursor_shape(lines-4,lines-3);
  5052 00002BD3 88F9                <1> 	mov	cl, bh ; lines - 1
  5053 00002BD5 88CD                <1> 	mov	ch, cl ; lines - 1 (16 -> 15)
  5054 00002BD7 FECD                <1> 	dec	ch  ; lines - 2 (16 -> 14)
  5055                              <1> ssl_2:
  5056                              <1> 	; CH = start line, CL = stop line
  5057 00002BD9 B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
  5058 00002BDB 66890D[07F80000]    <1> 	mov	[CURSOR_MODE], cx ; save in data area
  5059 00002BE2 E812F1FFFF          <1> 	call	m16	; output cx register
  5060                              <1> 	; write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, lines);
  5061 00002BE7 FEC7                <1> 	inc	bh ; lines
  5062 00002BE9 883D[F2F70000]      <1> 	mov	[CHAR_HEIGHT], bh
  5063                              <1> 	;  outb(crtc_addr, 0x12);
  5064 00002BEF 66BAD403            <1> 	mov	dx, 3D4h ; CRTC_ADDRESS
  5065 00002BF3 B012                <1> 	mov	al, 12h
  5066 00002BF5 EE                  <1> 	out	dx, al
  5067                              <1> 	; vde = inb(crtc_addr+1);
  5068 00002BF6 6642                <1> 	inc	dx
  5069 00002BF8 EC                  <1> 	in	al, dx
  5070 00002BF9 88C4                <1> 	mov	ah, al
  5071                              <1> 	; outb(crtc_addr, 0x07);
  5072 00002BFB 664A                <1> 	dec	dx
  5073 00002BFD B007                <1> 	mov	al, 07h
  5074 00002BFF EE                  <1> 	out	dx, al
  5075                              <1> 	; ovl = inb(crtc_addr+1);
  5076 00002C00 6642                <1> 	inc	dx
  5077 00002C02 EC                  <1> 	in	al, dx
  5078                              <1> 	; vde += (((ovl & 0x02) << 7) + ((ovl & 0x40) << 3) + 1);
  5079 00002C03 88E2                <1> 	mov	dl, ah ; vde
  5080 00002C05 88C6                <1> 	mov	dh, al ; ovl
  5081 00002C07 6683E002            <1> 	and	ax, 02h
  5082 00002C0B 66C1E007            <1> 	shl	ax, 7
  5083 00002C0F 6689C1              <1> 	mov	cx, ax ; (ovl & 0x02) << 7)	
  5084 00002C12 88F0                <1> 	mov	al, dh ; ovl
  5085 00002C14 6683E040            <1> 	and	ax, 40h			
  5086 00002C18 66C1E003            <1> 	shl	ax, 3  ; (ovl & 0x40) << 3)
  5087 00002C1C 6640                <1> 	inc	ax ; + 1 
  5088 00002C1E 6601C8              <1> 	add	ax, cx
  5089 00002C21 30F6                <1> 	xor	dh, dh
  5090 00002C23 6601D0              <1> 	add	ax, dx ; + vde
  5091                              <1> 	; rows = vde / lines;
  5092 00002C26 F6F7                <1> 	div	bh
  5093                              <1> 	;dec	al ; rows -1
  5094                              <1> 	; write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, rows-1);
  5095 00002C28 A2[F6F70000]        <1> 	mov	[VGA_ROWS], al ; rows (not 'rows-1' !)
  5096                              <1> 	; write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE, rows * cols * 2);
  5097 00002C2D 8A25[F0F70000]      <1> 	mov	ah, [CRT_COLS]
  5098 00002C33 F6E4                <1> 	mul	ah
  5099 00002C35 66D1E0              <1> 	shl	ax, 1
  5100 00002C38 66A3[7C3E0100]      <1> 	mov 	[CRT_LEN], ax	
  5101 00002C3E C3                  <1> 	retn
  5102                              <1> 
  5103                              <1> load_text_8_14_pat:
  5104                              <1> 	; 26/07/2016
  5105                              <1> 	; 25/07/2016
  5106                              <1> 	; 23/07/2016
  5107                              <1> 	; 09/07/2016
  5108                              <1> 	; load user defined (EGA/VGA) text fonts
  5109                              <1> 	;
  5110                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5111                              <1> 	; vgabios-0.7a (2011)
  5112                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5113                              <1> 	; 'vgabios.c', 'biosfn_load_text_8_14_pat'
  5114                              <1> 
  5115                              <1> 	; biosfn_load_text_8_14_pat (AL,BL)
  5116                              <1> 
  5117                              <1> 	; get_font_access();
  5118                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  5119                              <1> 	; for(i=0;i<0x100;i++)
  5120                              <1> 	; {
  5121                              <1> 	;  src = i * 14;
  5122                              <1> 	;  dest = blockaddr + i * 32;
  5123                              <1> 	;  memcpyb(0xA000, dest, 0xC000, vgafont14+src, 14);
  5124                              <1> 	; }
  5125                              <1> 	; release_font_access();
  5126                              <1> 	; if(AL>=0x10)
  5127                              <1> 	; {
  5128                              <1> 	; set_scan_lines(14);
  5129                              <1> 	; }
  5130                              <1> 
  5131 00002C3F 50                  <1> 	push	eax
  5132 00002C40 E8FEFEFFFF          <1> 	call	get_font_access
  5133                              <1> 
  5134                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  5135                              <1> 	;mov	dl, bl
  5136                              <1> 	;and	dl, 3
  5137                              <1> 	;shl	dx, 14
  5138                              <1> 	;xchg	dx, bx
  5139                              <1> 	;and	dl, 4
  5140                              <1> 	;shl	dx, 11
  5141                              <1> 	;add	dx, bx 	
  5142                              <1>  
  5143                              <1> 	;xor	dx, dx  ; blockaddr = 0
  5144                              <1> 	; Always block 0 for TRDOS 386 ! (blockaddr=0(
  5145                              <1> 
  5146 00002C45 28DB                <1> 	sub	bl, bl ; i = 0
  5147 00002C47 B70E                <1> 	mov	bh, 14
  5148 00002C49 BE[500D0100]        <1> 	mov	esi, vgafont14
  5149 00002C4E BF00000A00          <1> 	mov	edi, 0A0000h		
  5150                              <1> lt8_14_1:
  5151                              <1> 	;mov	al, bl
  5152                              <1> 	;mul	bh
  5153                              <1> 	;movzx	esi, ax
  5154                              <1> 	;add	esi, vgafont14
  5155                              <1> 	;mov	al, bl
  5156                              <1> 	;sub	ah, ah
  5157                              <1> 	;shl	ax, 5 ; * 32
  5158                              <1> 	;;add	ax, dx ; blockaddr + i * 32;
  5159                              <1> 	;movzx	edi, ax ; dest
  5160                              <1> 	;add	edi, 0A0000h
  5161 00002C53 0FB6CF              <1> 	movzx	ecx, bh 		
  5162 00002C56 F3A4                <1> 	rep	movsb
  5163 00002C58 83C712              <1> 	add	edi, 18 ; 32 - 14
  5164 00002C5B FEC3                <1> 	inc	bl
  5165 00002C5D 75F4                <1> 	jnz	short lt8_14_1	
  5166                              <1> 	;
  5167 00002C5F E814FFFFFF          <1> 	call	release_font_access
  5168                              <1> 	;
  5169 00002C64 58                  <1> 	pop	eax
  5170                              <1> 	; if(AL>=0x10)
  5171 00002C65 3C10                <1> 	cmp	al, 10h
  5172 00002C67 7205                <1> 	jb	short lt8_14_4
  5173                              <1> 	; BH = 14
  5174                              <1>    	; set_scan_lines(14);
  5175 00002C69 E849FFFFFF          <1> 	call	set_scan_lines
  5176                              <1> lt8_14_4:
  5177 00002C6E C3                  <1> 	retn
  5178                              <1> 
  5179                              <1> load_text_8_8_pat:
  5180                              <1> 	; 26/07/2016
  5181                              <1> 	; 25/07/2016
  5182                              <1> 	; 23/07/2016
  5183                              <1> 	; 09/07/2016
  5184                              <1> 	; load user defined (EGA/VGA) text fonts
  5185                              <1> 	;
  5186                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5187                              <1> 	; vgabios-0.7a (2011)
  5188                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5189                              <1> 	; 'vgabios.c', 'biosfn_load_text_8_8_pat'
  5190                              <1> 
  5191                              <1> 	; biosfn_load_text_8_8_pat (AL,BL)
  5192                              <1> 
  5193                              <1> 	; get_font_access();
  5194                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  5195                              <1> 	; for(i=0;i<0x100;i++)
  5196                              <1> 	; {
  5197                              <1> 	;  src = i * 8;
  5198                              <1> 	;  dest = blockaddr + i * 32;
  5199                              <1> 	;  memcpyb(0xA000, dest, 0xC000, vgafont8+src, 8);
  5200                              <1> 	; }
  5201                              <1> 	; release_font_access();
  5202                              <1> 	; if(AL>=0x10)
  5203                              <1> 	; {
  5204                              <1> 	; set_scan_lines(8);
  5205                              <1> 	; }
  5206                              <1> 
  5207 00002C6F 50                  <1> 	push	eax
  5208 00002C70 E8CEFEFFFF          <1> 	call	get_font_access
  5209                              <1> 
  5210                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  5211                              <1> 	;mov	dl, bl
  5212                              <1> 	;and	dl, 3
  5213                              <1> 	;shl	dx, 14
  5214                              <1> 	;xchg	dx, bx
  5215                              <1> 	;and	dl, 4
  5216                              <1> 	;shl	dx, 11
  5217                              <1> 	;add	dx, bx 	
  5218                              <1>  
  5219                              <1> 	;xor	dx, dx  ; blockaddr = 0
  5220                              <1> 	; Always block 0 for TRDOS 386 ! (blockaddr=0(
  5221                              <1> 
  5222 00002C75 28DB                <1> 	sub	bl, bl ; i = 0
  5223 00002C77 B708                <1> 	mov	bh, 8
  5224 00002C79 BE[50050100]        <1> 	mov	esi, vgafont8
  5225 00002C7E BF00000A00          <1> 	mov	edi, 0A0000h		
  5226                              <1> lt8_8_1:
  5227                              <1> 	;mov	al, bl
  5228                              <1> 	;mul	bh
  5229                              <1> 	;movzx	esi, ax
  5230                              <1> 	;add	esi, vgafont8
  5231                              <1> 	;mov	al, bl
  5232                              <1> 	;sub	ah, ah
  5233                              <1> 	;shl	ax, 5 ; * 32
  5234                              <1> 	;;add	ax, dx ; blockaddr + i * 32;
  5235                              <1> 	;movzx	edi, ax ; dest
  5236                              <1> 	;add	edi, 0A0000h
  5237 00002C83 0FB6CF              <1> 	movzx	ecx, bh 		
  5238 00002C86 F3A4                <1> 	rep	movsb
  5239 00002C88 83C718              <1> 	add	edi, 24 ; 32 - 8
  5240 00002C8B FEC3                <1> 	inc	bl
  5241 00002C8D 75F4                <1> 	jnz	short lt8_8_1	
  5242                              <1> 	;
  5243 00002C8F E8E4FEFFFF          <1> 	call	release_font_access
  5244                              <1> 	;
  5245 00002C94 58                  <1> 	pop	eax
  5246                              <1> 	; if(AL>=0x10)
  5247 00002C95 3C10                <1> 	cmp	al, 10h
  5248 00002C97 7205                <1> 	jb	short lt8_8_2
  5249                              <1> 	; BH = 8
  5250                              <1>    	; set_scan_lines(8);
  5251 00002C99 E819FFFFFF          <1> 	call	set_scan_lines
  5252                              <1> lt8_8_2:
  5253 00002C9E C3                  <1> 	retn
  5254                              <1> 
  5255                              <1> load_text_8_16_pat:
  5256                              <1> 	; 26/07/2016
  5257                              <1> 	; 25/07/2016
  5258                              <1> 	; 23/07/2016
  5259                              <1> 	; 09/07/2016
  5260                              <1> 	; load user defined (EGA/VGA) text fonts
  5261                              <1> 	;
  5262                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5263                              <1> 	; vgabios-0.7a (2011)
  5264                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5265                              <1> 	; 'vgabios.c', 'biosfn_load_text_8_16_pat'
  5266                              <1> 
  5267                              <1> 	; biosfn_load_text_8_16_pat (AL,BL)
  5268                              <1> 
  5269                              <1> 	; get_font_access();
  5270                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  5271                              <1> 	; for(i=0;i<0x100;i++)
  5272                              <1> 	; {
  5273                              <1> 	;  src = i * 16;
  5274                              <1> 	;  dest = blockaddr + i * 32;
  5275                              <1> 	;  memcpyb(0xA000, dest, 0xC000, vgafont16+src, 16);
  5276                              <1> 	; }
  5277                              <1> 	; release_font_access();
  5278                              <1> 	; if(AL>=0x10)
  5279                              <1> 	; {
  5280                              <1> 	; set_scan_lines(16);
  5281                              <1> 	; }
  5282                              <1> 
  5283 00002C9F 50                  <1> 	push	eax
  5284 00002CA0 E89EFEFFFF          <1> 	call	get_font_access
  5285                              <1> 
  5286                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  5287                              <1> 	;mov	dl, bl
  5288                              <1> 	;and	dl, 3
  5289                              <1> 	;shl	dx, 14
  5290                              <1> 	;xchg	dx, bx
  5291                              <1> 	;and	dl, 4
  5292                              <1> 	;shl	dx, 11
  5293                              <1> 	;add	dx, bx 	
  5294                              <1>  
  5295                              <1> 	;xor	dx, dx  ; blockaddr = 0
  5296                              <1> 	; Always block 0 for TRDOS 386 ! (blockaddr=0(
  5297                              <1> 
  5298 00002CA5 28DB                <1> 	sub	bl, bl ; i = 0
  5299 00002CA7 B710                <1> 	mov	bh, 16
  5300 00002CA9 BE[501B0100]        <1> 	mov	esi, vgafont16
  5301 00002CAE BF00000A00          <1> 	mov	edi, 0A0000h
  5302 00002CB3 0FB6C7              <1> 	movzx	eax, bh	
  5303                              <1> lt8_16_1:
  5304                              <1> 	;mov	al, bl
  5305                              <1> 	;mul	bh
  5306                              <1> 	;movzx	esi, ax
  5307                              <1> 	;add	esi, vgafont16
  5308                              <1> 	;mov	al, bl ; i
  5309                              <1> 	;sub	ah, ah
  5310                              <1> 	;shl	ax, 5 ; * 32
  5311                              <1> 	;;add	ax, dx ; blockaddr + i * 32;
  5312                              <1> 	;movzx	edi, ax ; dest
  5313                              <1> 	;add	edi, 0A0000h
  5314                              <1> 	;movzx	ecx, bh
  5315 00002CB6 89C1                <1> 	mov	ecx, eax ; 16	
  5316 00002CB8 F3A4                <1> 	rep	movsb
  5317 00002CBA 01C7                <1> 	add	edi, eax ; add edi, 16
  5318 00002CBC FEC3                <1> 	inc	bl
  5319 00002CBE 75F6                <1> 	jnz	short lt8_16_1
  5320                              <1> 	;
  5321 00002CC0 E8B3FEFFFF          <1> 	call	release_font_access
  5322                              <1> 	;
  5323 00002CC5 58                  <1> 	pop	eax
  5324                              <1> 	; if(AL>=0x10)
  5325 00002CC6 3C10                <1> 	cmp	al, 10h
  5326 00002CC8 7205                <1> 	jb	short lt8_16_2
  5327                              <1> 	; BH = 16
  5328                              <1>    	; set_scan_lines(16);
  5329 00002CCA E8E8FEFFFF          <1> 	call	set_scan_lines
  5330                              <1> lt8_16_2:
  5331 00002CCF C3                  <1> 	retn
  5332                              <1> 
  5333                              <1> load_gfx_user_chars:
  5334                              <1> 	; 08/08/2016
  5335                              <1> 	; 10/07/2016
  5336                              <1> 	; Setup User-Defined Font for Graphics Mode (VGA)
  5337                              <1> 	;
  5338                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5339                              <1> 	; vgabios-0.7a (2011)
  5340                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5341                              <1> 	; 'vgabios.c', 'biosfn_load_gfx_user_chars'
  5342                              <1> 
  5343                              <1> 	; biosfn_load_gfx_user_chars (ES,BP,CX,BL,DL)
  5344                              <1> 	; /* set 0x43 INT pointer */
  5345                              <1>     	; write_word(0x0, 0x43*4, BP);
  5346                              <1>     	; write_word(0x0, 0x43*4+2, ES);
  5347 00002CD0 31C0                <1> 	xor	eax, eax
  5348 00002CD2 48                  <1> 	dec	eax ; 0FFFFFFFFh (user defined fonts)
  5349 00002CD3 A3[8E3E0100]        <1> 	mov	[VGA_INT43H], eax
  5350                              <1> 		
  5351                              <1> 	; BL   screen rows code: 00H = user-specified (in DL)
  5352                              <1>         ;                        01H = 14 rows
  5353                              <1>         ;                        02H = 25 rows
  5354                              <1>         ;                        03H = 43 rows
  5355                              <1>         ; CX   bytes per character definition
  5356                              <1>         ; DL   (when BL=0) custom number of character rows on screen
  5357                              <1> 	; dh = 0 -> 256 characters
  5358                              <1> 	; dh = 80h -> 128 characters
  5359                              <1> 	; (If DH <> 0 and DH <> 80h -> invalid)     	 
  5360                              <1>         ; EBP  address of font-definition information (user's mem space)
  5361                              <1> 
  5362                              <1> 	; switch (BL) {
  5363                              <1> 	; case 0:
  5364                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, DL-1);
  5365                              <1> 	;    break;
  5366 00002CD8 20DB                <1> 	and	bl, bl
  5367 00002CDA 7508                <1> 	jnz	short l_gfx_uc_1
  5368 00002CDC 8815[F6F70000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  5369 00002CE2 EB23                <1> 	jmp	short l_gfx_uc_4 	
  5370                              <1> l_gfx_uc_1:
  5371                              <1> 	; case 1:
  5372                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 13);
  5373                              <1> 	;    break;
  5374 00002CE4 FECB                <1> 	dec	bl
  5375 00002CE6 7509                <1> 	jnz	short l_gfx_uc_2
  5376                              <1> 	; bl = 1
  5377 00002CE8 C605[F6F70000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  5378 00002CEF EB16                <1> 	jmp	short l_gfx_uc_4 	
  5379                              <1> l_gfx_uc_2:
  5380 00002CF1 FECB                <1> 	dec	bl
  5381 00002CF3 740B                <1> 	jz	short l_gfx_uc_3 ; bl = 2
  5382 00002CF5 FECB                <1> 	dec	bl
  5383 00002CF7 750E                <1> 	jnz	short l_gfx_uc_4 ; bl > 3
  5384                              <1> 	; bl = 3
  5385                              <1> 	; case 3:
  5386                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 42);
  5387                              <1> 	;    break;
  5388 00002CF9 C605[F6F70000]2B    <1> 	mov	byte [VGA_ROWS], 43  ; not 42 !
  5389                              <1> l_gfx_uc_3:
  5390                              <1>     	; case 2:
  5391                              <1>     	; default:
  5392                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 24);
  5393                              <1> 	;    break;
  5394                              <1> 	; bl = 2 or bl > 3
  5395 00002D00 C605[F6F70000]19    <1> 	mov	byte [VGA_ROWS], 25  ; not 24 !	
  5396                              <1>     	; }
  5397                              <1> l_gfx_uc_4:
  5398                              <1>     	; write_byte(BIOSMEM_SEG, BIOSMEM_CHAR_HEIGHT, CX);
  5399 00002D07 880D[F2F70000]      <1> 	mov	[CHAR_HEIGHT], cl
  5400                              <1> 	; }
  5401 00002D0D C3                  <1> 	retn	
  5402                              <1> 
  5403                              <1> load_gfx_8_14_chars:
  5404                              <1> 	; 08/08/2016
  5405                              <1> 	; 10/07/2016
  5406                              <1> 	; Setup ROM 8x14 Font for Graphics Mode (VGA)
  5407                              <1> 	;
  5408                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5409                              <1> 	; vgabios-0.7a (2011)
  5410                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5411                              <1> 	; 'vgabios.c', 'biosfn_load_gfx_8_14_chars'
  5412                              <1> 
  5413                              <1> 	; biosfn_load_gfx_8_14_chars (BL)
  5414                              <1> 	; /* set 0x43 INT pointer */
  5415                              <1>     	; write_word(0x0, 0x43*4, &vgafont14);
  5416                              <1>     	; write_word(0x0, 0x43*4+2, 0xC000);
  5417 00002D0E C705[8E3E0100]-     <1> 	mov	dword [VGA_INT43H], vgafont14
  5417 00002D14 [500D0100]          <1>
  5418                              <1> 		
  5419                              <1> 	; BL    screen rows code: 00H = user-specified (in DL)
  5420                              <1>         ;                         01H = 14 rows
  5421                              <1>         ;                         02H = 25 rows
  5422                              <1>         ;                         03H = 43 rows
  5423                              <1>         ; DL    (when BL=0) custom number of char rows on screen
  5424                              <1> 
  5425                              <1> 	; switch (BL) {
  5426                              <1> 	; case 0:
  5427                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, DL-1);
  5428                              <1> 	;    break;
  5429 00002D18 20DB                <1> 	and	bl, bl
  5430 00002D1A 7508                <1> 	jnz	short l_gfx_8_14c_1
  5431 00002D1C 8815[F6F70000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  5432 00002D22 EB23                <1> 	jmp	short l_gfx_8_14c_4 	
  5433                              <1> l_gfx_8_14c_1:
  5434                              <1> 	; case 1:
  5435                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 13);
  5436                              <1> 	;    break;
  5437 00002D24 FECB                <1> 	dec	bl
  5438 00002D26 7509                <1> 	jnz	short l_gfx_8_14c_2
  5439                              <1> 	; bl = 1
  5440 00002D28 C605[F6F70000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  5441 00002D2F EB16                <1> 	jmp	short l_gfx_8_14c_4 	
  5442                              <1> l_gfx_8_14c_2:
  5443 00002D31 FECB                <1> 	dec	bl
  5444 00002D33 740B                <1> 	jz	short l_gfx_8_14c_3 ; bl = 2
  5445 00002D35 FECB                <1> 	dec	bl
  5446 00002D37 750E                <1> 	jnz	short l_gfx_8_14c_4 ; bl > 3
  5447                              <1> 	; bl = 3
  5448                              <1> 	; case 3:
  5449                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 42);
  5450                              <1> 	;    break;
  5451 00002D39 C605[F6F70000]2B    <1> 	mov	byte [VGA_ROWS], 43  ; not 42 !
  5452                              <1> l_gfx_8_14c_3:
  5453                              <1>     	; case 2:
  5454                              <1>     	; default:
  5455                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 24);
  5456                              <1> 	;    break;
  5457                              <1> 	; bl = 2 or bl > 3
  5458 00002D40 C605[F6F70000]19    <1> 	mov	byte [VGA_ROWS], 25  ; not 24 !	
  5459                              <1>     	; }
  5460                              <1> l_gfx_8_14c_4:
  5461                              <1>     	; write_byte(BIOSMEM_SEG, BIOSMEM_CHAR_HEIGHT, 14);
  5462 00002D47 C605[F2F70000]0E    <1>         mov     byte [CHAR_HEIGHT], 14
  5463                              <1> 	; }
  5464 00002D4E C3                  <1> 	retn	
  5465                              <1> 
  5466                              <1> load_gfx_8_8_chars:
  5467                              <1> 	; 08/08/2016
  5468                              <1> 	; 10/07/2016
  5469                              <1> 	; Setup ROM 8x14 Font for Graphics Mode (VGA)
  5470                              <1> 	;
  5471                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5472                              <1> 	; vgabios-0.7a (2011)
  5473                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5474                              <1> 	; 'vgabios.c', 'biosfn_load_gfx_8_8_dd_chars'
  5475                              <1> 
  5476                              <1> 	; biosfn_load_gfx_8_8_dd_chars (BL)
  5477                              <1> 	; /* set 0x43 INT pointer */
  5478                              <1>     	; write_word(0x0, 0x43*4, &vgafont8);
  5479                              <1>     	; write_word(0x0, 0x43*4+2, 0xC000);
  5480 00002D4F C705[8E3E0100]-     <1> 	mov	dword [VGA_INT43H], vgafont8
  5480 00002D55 [50050100]          <1>
  5481                              <1> 		
  5482                              <1> 	; BL    screen rows code: 00H = user-specified (in DL)
  5483                              <1>         ;                         01H = 14 rows
  5484                              <1>         ;                         02H = 25 rows
  5485                              <1>         ;                         03H = 43 rows
  5486                              <1>         ; DL    (when BL=0) custom number of char rows on screen
  5487                              <1> 
  5488                              <1> 	; switch (BL) {
  5489                              <1> 	; case 0:
  5490                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, DL-1);
  5491                              <1> 	;    break;
  5492 00002D59 20DB                <1> 	and	bl, bl
  5493 00002D5B 7508                <1> 	jnz	short l_gfx_8_8c_1
  5494 00002D5D 8815[F6F70000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  5495 00002D63 EB23                <1> 	jmp	short l_gfx_8_8c_4 	
  5496                              <1> l_gfx_8_8c_1:
  5497                              <1> 	; case 1:
  5498                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 13);
  5499                              <1> 	;    break;
  5500 00002D65 FECB                <1> 	dec	bl
  5501 00002D67 7509                <1> 	jnz	short l_gfx_8_8c_2
  5502                              <1> 	; bl = 1
  5503 00002D69 C605[F6F70000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  5504 00002D70 EB16                <1> 	jmp	short l_gfx_8_8c_4 	
  5505                              <1> l_gfx_8_8c_2:
  5506 00002D72 FECB                <1> 	dec	bl
  5507 00002D74 740B                <1> 	jz	short l_gfx_8_8c_3 ; bl = 2
  5508 00002D76 FECB                <1> 	dec	bl
  5509 00002D78 750E                <1> 	jnz	short l_gfx_8_8c_4 ; bl > 3
  5510                              <1> 	; bl = 3
  5511                              <1> 	; case 3:
  5512                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 42);
  5513                              <1> 	;    break;
  5514 00002D7A C605[F6F70000]2B    <1> 	mov	byte [VGA_ROWS], 43  ; not 42 !
  5515                              <1> l_gfx_8_8c_3:
  5516                              <1>     	; case 2:
  5517                              <1>     	; default:
  5518                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 24);
  5519                              <1> 	;    break;
  5520                              <1> 	; bl = 2 or bl > 3
  5521 00002D81 C605[F6F70000]19    <1> 	mov	byte [VGA_ROWS], 25  ; not 24 !	
  5522                              <1>     	; }
  5523                              <1> l_gfx_8_8c_4:
  5524                              <1>     	; write_byte(BIOSMEM_SEG, BIOSMEM_CHAR_HEIGHT, 8);
  5525 00002D88 C605[F2F70000]08    <1>         mov     byte [CHAR_HEIGHT], 8
  5526                              <1> 	; }
  5527 00002D8F C3                  <1> 	retn
  5528                              <1> 
  5529                              <1> load_gfx_8_16_chars:
  5530                              <1> 	; 08/08/2016
  5531                              <1> 	; 10/07/2016
  5532                              <1> 	; Setup ROM 8x14 Font for Graphics Mode (VGA)
  5533                              <1> 	;
  5534                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5535                              <1> 	; vgabios-0.7a (2011)
  5536                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5537                              <1> 	; 'vgabios.c', 'biosfn_load_gfx_8_16_chars'
  5538                              <1> 
  5539                              <1> 	; biosfn_load_gfx_8_16_chars (BL)
  5540                              <1> 	; /* set 0x43 INT pointer */
  5541                              <1>     	; write_word(0x0, 0x43*4, &vgafont16);
  5542                              <1>     	; write_word(0x0, 0x43*4+2, 0xC000);
  5543 00002D90 C705[8E3E0100]-     <1> 	mov	dword [VGA_INT43H], vgafont16
  5543 00002D96 [501B0100]          <1>
  5544                              <1> 		
  5545                              <1> 	; BL    screen rows code: 00H = user-specified (in DL)
  5546                              <1>         ;                         01H = 14 rows
  5547                              <1>         ;                         02H = 25 rows
  5548                              <1>         ;                         03H = 43 rows
  5549                              <1>         ; DL    (when BL=0) custom number of char rows on screen
  5550                              <1> 
  5551                              <1> 	; switch (BL) {
  5552                              <1> 	; case 0:
  5553                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, DL-1);
  5554                              <1> 	;    break;
  5555 00002D9A 20DB                <1> 	and	bl, bl
  5556 00002D9C 7508                <1> 	jnz	short l_gfx_8_16c_1
  5557 00002D9E 8815[F6F70000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  5558 00002DA4 EB23                <1> 	jmp	short l_gfx_8_16c_4 	
  5559                              <1> l_gfx_8_16c_1:
  5560                              <1> 	; case 1:
  5561                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 13);
  5562                              <1> 	;    break;
  5563 00002DA6 FECB                <1> 	dec	bl
  5564 00002DA8 7509                <1> 	jnz	short l_gfx_8_16c_2
  5565                              <1> 	; bl = 1
  5566 00002DAA C605[F6F70000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  5567 00002DB1 EB16                <1> 	jmp	short l_gfx_8_16c_4 	
  5568                              <1> l_gfx_8_16c_2:
  5569 00002DB3 FECB                <1> 	dec	bl
  5570 00002DB5 740B                <1> 	jz	short l_gfx_8_16c_3 ; bl = 2
  5571 00002DB7 FECB                <1> 	dec	bl
  5572 00002DB9 750E                <1> 	jnz	short l_gfx_8_16c_4 ; bl > 3
  5573                              <1> 	; bl = 3
  5574                              <1> 	; case 3:
  5575                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 42);
  5576                              <1> 	;    break;
  5577 00002DBB C605[F6F70000]2B    <1> 	mov	byte [VGA_ROWS], 43  ; not 42 !
  5578                              <1> l_gfx_8_16c_3:
  5579                              <1>     	; case 2:
  5580                              <1>     	; default:
  5581                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 24);
  5582                              <1> 	;    break;
  5583                              <1> 	; bl = 2 or bl > 3
  5584 00002DC2 C605[F6F70000]19    <1> 	mov	byte [VGA_ROWS], 25  ; not 24 !	
  5585                              <1>     	; }
  5586                              <1> l_gfx_8_16c_4:
  5587                              <1>     	; write_byte(BIOSMEM_SEG, BIOSMEM_CHAR_HEIGHT, 16);
  5588 00002DC9 C605[F2F70000]10    <1>         mov     byte [CHAR_HEIGHT], 16
  5589                              <1> 	; }
  5590 00002DD0 C3                  <1> 	retn
  5591                              <1> 			
  5592                              <1> get_font_info:
  5593                              <1> 	; 19/09/2016
  5594                              <1> 	; 08/08/2016
  5595                              <1> 	; 10/07/2016
  5596                              <1> 	; Get Current Character Generator Info (VGA)
  5597                              <1> 	;
  5598                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5599                              <1> 	; vgabios-0.7a (2011)
  5600                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5601                              <1> 	; 'vgabios.c', 'biosfn_get_font_info'
  5602                              <1> 
  5603                              <1> 	; Modified for TRDOS 386 !
  5604                              <1> 	;
  5605                              <1> 	; INPUT ->
  5606                              <1> 	;    AX = 1130h
  5607                              <1> 	;    BL = 0 -> Get info for current VGA font
  5608                              <1> 	;	       (BH = unused)
  5609                              <1> 	;    19/09/2016
  5610                              <1> 	;    BL > 0 -> Get requested character font data
  5611                              <1> 	;	 BL = 1 -> vgafont8
  5612                              <1> 	;        BL = 2 -> vgafont14
  5613                              <1> 	;	 BL = 3 -> vgafont16   
  5614                              <1> 	;	 BL > 3 -> Invalid function (for now!)
  5615                              <1> 	;	 BH = ASCII code of the first character
  5616                              <1> 	;	 ECX = Number of characters from the 1st char
  5617                              <1> 	;	 ECX >= 256 -> All (256-BH) characters
  5618                              <1> 	;	 ECX = 0 -> All characters (BH = unused)	
  5619                              <1> 	;        EDX = User's Buffer Address	
  5620                              <1> 	; OUTPUT ->
  5621                              <1> 	;    AL = height (scanlines), bytes per character
  5622                              <1> 	;    AH = screen rows
  5623                              <1> 	;    Byte 16-23 of EAX = number of columns
  5624                              <1> 	;    Byte 24-31 of EAX = 
  5625                              <1> 	;	  0 -> default font (not configured yet)
  5626                              <1> 	;	  0FFh -> user defined font
  5627                              <1> 	;	  14 = vgafont14
  5628                              <1> 	;	   8 = vgafont8
  5629                              <1> 	;	  16 = vgafont16
  5630                              <1> 	;   If BL input > 0 -> 
  5631                              <1> 	;       EAX = Actual transfer count
  5632                              <1> 	;
  5633 00002DD1 20DB                <1> 	and	bl, bl
  5634 00002DD3 7408                <1> 	jz	short gfi_0
  5635                              <1> 	; invalid function (input)
  5636 00002DD5 80FB03              <1> 	cmp	bl, 3
  5637 00002DD8 7642                <1> 	jna	short gfi_4
  5638 00002DDA 31C0                <1> 	xor	eax, eax ; 0
  5639 00002DDC C3                  <1> 	retn
  5640                              <1> gfi_0:
  5641 00002DDD A0[F2F70000]        <1> 	mov	al, [CHAR_HEIGHT]
  5642 00002DE2 8A25[F6F70000]      <1> 	mov	ah, [VGA_ROWS]
  5643 00002DE8 C1E010              <1> 	shl	eax, 16
  5644 00002DEB A0[F0F70000]        <1> 	mov	al, [CRT_COLS]
  5645 00002DF0 8B0D[8E3E0100]      <1> 	mov	ecx, [VGA_INT43H]
  5646 00002DF6 21C9                <1> 	and	ecx, ecx
  5647 00002DF8 741E                <1> 	jz	short gfi_2 ; 0 = default font
  5648 00002DFA 41                  <1> 	inc	ecx ; 0FFFFFFFFh -> 0 (user defined font)
  5649 00002DFB 7504                <1> 	jnz	short gfi_1
  5650 00002DFD FECC                <1> 	dec	ah ; 0FFh
  5651 00002DFF EB17                <1> 	jmp	short gfi_2
  5652                              <1> gfi_1:
  5653 00002E01 49                  <1> 	dec	ecx ; 08/08/2016
  5654 00002E02 B40E                <1> 	mov	ah, 14
  5655 00002E04 81F9[500D0100]      <1> 	cmp	ecx, vgafont14
  5656 00002E0A 740C                <1> 	je	short gfi_2
  5657 00002E0C B408                <1> 	mov	ah, 8
  5658 00002E0E 81F9[50050100]      <1> 	cmp	ecx, vgafont8
  5659 00002E14 7402                <1> 	je	short gfi_2
  5660                              <1> 	; vgafont16
  5661 00002E16 D0E4                <1> 	shl	ah, 1 ; ah = 16
  5662                              <1> gfi_2:
  5663 00002E18 C1C010              <1> 	rol	eax, 16
  5664                              <1> gfi_3:
  5665 00002E1B C3                  <1> 	retn
  5666                              <1> gfi_4:
  5667 00002E1C 89D7                <1> 	mov	edi, edx ; **
  5668 00002E1E 80FB02              <1> 	cmp	bl, 2
  5669 00002E21 720B                <1> 	jb	short gfi_5
  5670 00002E23 772F                <1> 	ja	short gfi_7
  5671                              <1> 	;BL = 2 -> vgafont14
  5672 00002E25 BE[500D0100]        <1> 	mov	esi, vgafont14 ; *
  5673 00002E2A B30E                <1> 	mov	bl, 14
  5674 00002E2C EB07                <1> 	jmp	short gfi_6 
  5675                              <1> gfi_5:
  5676                              <1> 	;BL = 1 -> vgafont8
  5677 00002E2E BE[50050100]        <1> 	mov	esi, vgafont8 ; *
  5678 00002E33 B308                <1> 	mov	bl, 8
  5679                              <1> gfi_6:
  5680 00002E35 09C9                <1> 	or	ecx, ecx
  5681 00002E37 7424                <1> 	jz	short gfi_8 ; all chars from the 00h
  5682 00002E39 88F8                <1> 	mov	al, bh ; character index
  5683 00002E3B F6E3                <1> 	mul	bl ; char index * char height/size
  5684 00002E3D 0FB7D0              <1> 	movzx	edx, ax
  5685 00002E40 01D6                <1> 	add	esi, edx ; *
  5686 00002E42 66BAFF00            <1> 	mov	dx, 255
  5687 00002E46 28FA                <1> 	sub	dl, bh
  5688 00002E48 6642                <1> 	inc	dx	
  5689 00002E4A 39D1                <1> 	cmp	ecx, edx
  5690 00002E4C 770F                <1> 	ja	short gfi_8
  5691 00002E4E 7412                <1> 	je	short gfi_9
  5692 00002E50 89D1                <1> 	mov	ecx, edx
  5693 00002E52 EB0E                <1> 	jmp	short gfi_9
  5694                              <1> gfi_7:
  5695                              <1> 	;BL = 3 -> vgafont16
  5696 00002E54 BE[501B0100]        <1> 	mov	esi, vgafont16 ; *
  5697 00002E59 B310                <1> 	mov	bl, 16
  5698 00002E5B EBD8                <1> 	jmp	short gfi_6
  5699                              <1> gfi_8:
  5700 00002E5D B900010000          <1> 	mov	ecx, 256
  5701                              <1> gfi_9:
  5702 00002E62 6689C8              <1> 	mov	ax, cx ; character count
  5703 00002E65 30FF                <1> 	xor	bh, bh
  5704 00002E67 66F7E3              <1> 	mul	bx ; char count * char height/size	
  5705 00002E6A 6689C1              <1>  	mov	cx, ax
  5706                              <1> 
  5707                              <1> 	; ESI = source address in system space
  5708                              <1> 	; EDI = user's buffer address
  5709                              <1> 	; ECX = transfer (byte) count
  5710 00002E6D E808B00000          <1> 	call	transfer_to_user_buffer
  5711 00002E72 89C8                <1> 	mov	eax, ecx ; actual transfer count
  5712 00002E74 C3                  <1> 	retn
  5713                              <1> 	
  5714                              <1> vga_pal_funcs:
  5715                              <1> 	; 10/08/2016
  5716                              <1> 	; VGA Palette functions
  5717                              <1> 	;
  5718                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5719                              <1> 	; vgabios-0.7a (2011)
  5720                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5721                              <1> 	; 'vgabios.c', 'vgarom.asm'
  5722                              <1> 
  5723 00002E75 3C00                <1> 	cmp	al, 0
  5724 00002E77 0F848F000000        <1>         je      set_single_palette_reg
  5725                              <1> vga_palf_1001:
  5726 00002E7D 3C01                <1> 	cmp	al, 1
  5727 00002E7F 0F84B4000000        <1>         je      set_overscan_border_color
  5728                              <1> vga_palf_1002:
  5729 00002E85 3C02                <1> 	cmp	al, 2
  5730 00002E87 0F84B0000000        <1>         je      set_all_palette_reg
  5731                              <1> vga_palf_1003:
  5732 00002E8D 3C03                <1> 	cmp	al, 3
  5733 00002E8F 0F84E8000000        <1>         je      toggle_intensity
  5734                              <1> vga_palf_1007:
  5735 00002E95 3C07                <1> 	cmp	al, 7
  5736 00002E97 0F840D010000        <1>         je      get_single_palette_reg
  5737 00002E9D 7266                <1> 	jb	short vga_palf_unknown
  5738                              <1> vga_palf_1008:
  5739 00002E9F 3C08                <1> 	cmp	al, 8
  5740 00002EA1 0F8437010000        <1>         je      read_overscan_border_color
  5741                              <1> vga_palf_1009:
  5742 00002EA7 3C09                <1> 	cmp	al, 9
  5743 00002EA9 0F8433010000        <1> 	je	get_all_palette_reg
  5744                              <1> vga_palf_1010:
  5745 00002EAF 3C10                <1> 	cmp	al, 10h
  5746 00002EB1 0F8487010000        <1> 	je 	set_single_dac_reg
  5747 00002EB7 724C                <1> 	jb	short vga_palf_unknown
  5748                              <1> vga_palf_1012:
  5749 00002EB9 3C12                <1> 	cmp	al, 12h
  5750 00002EBB 0F8498010000        <1>         je      set_all_dac_reg
  5751 00002EC1 7242                <1> 	jb	short vga_palf_unknown
  5752                              <1> vga_palf_1013:
  5753 00002EC3 3C13                <1> 	cmp	al, 13h
  5754 00002EC5 0F84CC010000        <1>         je      select_video_dac_color_page
  5755                              <1> vga_palf_1015:
  5756 00002ECB 3C15                <1> 	cmp	al, 15h
  5757 00002ECD 0F8412020000        <1> 	je	read_single_dac_reg
  5758 00002ED3 7230                <1> 	jb	short vga_palf_unknown
  5759                              <1> vga_palf_1017:
  5760 00002ED5 3C17                <1> 	cmp	al, 17h
  5761 00002ED7 0F8428020000        <1>         je      read_all_dac_reg
  5762 00002EDD 7226                <1> 	jb	short vga_palf_unknown
  5763                              <1> vga_palf_1018:
  5764 00002EDF 3C18                <1> 	cmp	al, 18h
  5765 00002EE1 0F845E020000        <1>         je      set_pel_mask
  5766                              <1> vga_palf_1019:
  5767 00002EE7 3C19                <1> 	cmp	al, 19h
  5768 00002EE9 0F8462020000        <1>         je      read_pel_mask
  5769                              <1> vga_palf_101A:
  5770 00002EEF 3C1A                <1> 	cmp	al, 1Ah
  5771 00002EF1 0F8468020000        <1>         je      read_video_dac_state
  5772                              <1> vga_palf_101B:
  5773 00002EF7 3C1B                <1> 	cmp	al, 1Bh
  5774                              <1> 	;jne	short vga_palf_unknown
  5775 00002EF9 770A                <1> 	ja	short vga_palf_unknown
  5776                              <1>  
  5777 00002EFB E80CF7FFFF          <1> 	call	gray_scale_summing
  5778 00002F00 E9D5E5FFFF          <1>         jmp     VIDEO_RETURN 	
  5779                              <1> 
  5780                              <1> vga_palf_unknown:
  5781 00002F05 29C0                <1> 	sub	eax, eax ; 0 = invalid function
  5782 00002F07 E9D3E5FFFF          <1>         jmp     _video_return
  5783                              <1> 
  5784                              <1> set_single_palette_reg:
  5785                              <1> 	; 10/08/2016
  5786                              <1> 	; Set One Palette Register
  5787                              <1> 	; BL = register number to set
  5788                              <1> 	;     (a 4-bit attribute nibble: 00h-0Fh)
  5789                              <1> 	; BH = 6-bit RGB color to display 
  5790                              <1> 	;      for that attribute
  5791                              <1> 
  5792 00002F0C 80FB14              <1> 	cmp	bl, 14h
  5793                              <1> 	;ja	short no_actl_reg1
  5794 00002F0F 0F87C5E5FFFF        <1> 	ja	VIDEO_RETURN
  5795 00002F15 6650                <1> 	push	ax
  5796 00002F17 6652                <1> 	push	dx
  5797 00002F19 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5798 00002F1D EC                  <1> 	in	al, dx
  5799 00002F1E 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5800 00002F22 88D8                <1> 	mov	al, bl
  5801 00002F24 EE                  <1> 	out	dx, al
  5802 00002F25 88F8                <1> 	mov	al, bh
  5803 00002F27 EE                  <1> 	out	dx, al
  5804 00002F28 B020                <1> 	mov	al, 20h
  5805 00002F2A EE                  <1> 	out	dx, al
  5806                              <1> 	; ifdef VBOX
  5807 00002F2B 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5808 00002F2F EC                  <1> 	in	al, dx
  5809                              <1> 	; endif ; VBOX
  5810 00002F30 665A                <1> 	pop	dx
  5811 00002F32 6658                <1> 	pop	ax
  5812                              <1> ;no_actl_reg1:
  5813 00002F34 E9A1E5FFFF          <1> 	jmp	VIDEO_RETURN
  5814                              <1> 
  5815                              <1> set_overscan_border_color:
  5816                              <1> 	; 10/08/2016
  5817                              <1> 	; Set Overscan/Border Color Register
  5818                              <1> 	; BH = 6-bit RGB color to display 
  5819                              <1> 	;      for that attribute
  5820                              <1> 	
  5821 00002F39 B311                <1> 	mov	bl, 11h
  5822 00002F3B EBCF                <1>   	jmp	short set_single_palette_reg
  5823                              <1> 
  5824                              <1> set_all_palette_reg:
  5825                              <1> 	; 10/08/2016
  5826                              <1> 	; Set All Palette Registers and Overscan
  5827                              <1> 	; EDX = Address of 17 bytes; 
  5828                              <1> 	; an rgbRGB value for each of 16 palette
  5829                              <1> 	; registers plus one for the border.
  5830                              <1> 
  5831 00002F3D 89D6                <1> 	mov	esi, edx ; user buffer
  5832 00002F3F B911000000          <1> 	mov	ecx, 17
  5833 00002F44 89E7                <1> 	mov	edi, esp
  5834 00002F46 83EC14              <1> 	sub	esp, 20	 	 
  5835 00002F49 E876AF0000          <1> 	call	transfer_from_user_buffer
  5836                              <1> 	;jc	VIDEO_RETURN
  5837                              <1> 
  5838 00002F4E 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5839 00002F52 EC                  <1> 	in	al, dx
  5840 00002F53 B100                <1> 	mov	cl, 0
  5841 00002F55 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5842                              <1> set_palette_loop:
  5843 00002F59 88C8                <1> 	mov	al, cl
  5844 00002F5B EE                  <1> 	out	dx, al
  5845 00002F5C 8A07                <1> 	mov	al, [edi]
  5846 00002F5E EE                  <1> 	out	dx, al
  5847 00002F5F 47                  <1> 	inc	edi
  5848 00002F60 FEC1                <1> 	inc	cl
  5849 00002F62 80F910              <1> 	cmp	cl, 10h
  5850 00002F65 75F2                <1> 	jne	short set_palette_loop
  5851 00002F67 B011                <1> 	mov	al, 11h
  5852 00002F69 EE                  <1> 	out	dx, al
  5853 00002F6A 8A07                <1> 	mov	al, [edi]
  5854 00002F6C EE                  <1> 	out	dx, al
  5855 00002F6D B020                <1> 	mov	al, 20h
  5856 00002F6F EE                  <1> 	out	dx, al
  5857                              <1> 	; ifdef VBOX
  5858 00002F70 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5859 00002F74 EC                  <1> 	in	al, dx
  5860                              <1> 	; endif ; VBOX
  5861 00002F75 83C414              <1> 	add	esp, 20
  5862 00002F78 E95DE5FFFF          <1> 	jmp	VIDEO_RETURN
  5863                              <1> 
  5864                              <1> toggle_intensity:
  5865                              <1> 	; 10/08/2016
  5866                              <1> 	; Select Foreground Blink or Bold Background
  5867                              <1> 	; BL = 00h = enable bold backgrounds
  5868                              <1> 	;	    (16 background colors)
  5869                              <1>         ;      01h = enable blinking foreground
  5870                              <1> 	;	    (8 background colors)
  5871                              <1> 
  5872 00002F7D 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5873 00002F81 EC                  <1> 	in	al, dx
  5874 00002F82 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5875 00002F86 B010                <1> 	mov	al, 10h
  5876 00002F88 EE                  <1> 	out	dx, al
  5877 00002F89 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  5878 00002F8D EC                  <1> 	in	al, dx
  5879 00002F8E 24F7                <1> 	and	al, 0F7h
  5880 00002F90 80E301              <1> 	and	bl, 01h
  5881 00002F93 C0E303              <1> 	shl	bl, 3
  5882 00002F96 08D8                <1> 	or	al, bl
  5883 00002F98 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5884 00002F9C EE                  <1> 	out	dx, al
  5885 00002F9D B020                <1> 	mov	al, 20h
  5886 00002F9F EE                  <1> 	out	dx, al
  5887                              <1> 	; ifdef VBOX
  5888 00002FA0 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5889 00002FA4 EC                  <1> 	in	al, dx
  5890                              <1> 	; endif ; VBOX
  5891 00002FA5 E930E5FFFF          <1> 	jmp	VIDEO_RETURN
  5892                              <1> 
  5893                              <1> get_single_palette_reg:
  5894                              <1> 	; 10/08/2016
  5895                              <1> 	; Read One Palette Register
  5896                              <1>         ; INPUT:
  5897                              <1> 	; BL = Palette register to read (00h-0Fh)
  5898                              <1> 	; OUTPUT:
  5899                              <1> 	; BH = Current rgbRGB value of specified register
  5900                              <1> 	;      for that attribute
  5901                              <1> 
  5902 00002FAA 80FB14              <1> 	cmp	bl, 14h
  5903                              <1> 	;ja	short no_actl_reg2
  5904 00002FAD 0F8727E5FFFF        <1> 	ja	VIDEO_RETURN
  5905                              <1> 
  5906 00002FB3 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5907 00002FB7 EC                  <1> 	in	al, dx
  5908 00002FB8 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5909 00002FBC 88D8                <1> 	mov	al, bl
  5910 00002FBE EE                  <1> 	out	dx, al
  5911 00002FBF 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  5912 00002FC3 EC                  <1> 	in	al, dx
  5913 00002FC4 8844240D            <1> 	mov	[esp+13], al ; bh
  5914 00002FC8 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5915 00002FCC EC                  <1> 	in	al, dx
  5916 00002FCD 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5917 00002FD1 B020                <1> 	mov	al, 20h
  5918 00002FD3 EE                  <1> 	out	dx, al
  5919                              <1> 	; ifdef VBOX
  5920 00002FD4 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5921 00002FD8 EC                  <1> 	in	al, dx
  5922                              <1> 	; endif ; VBOX
  5923 00002FD9 E9FCE4FFFF          <1> 	jmp	VIDEO_RETURN
  5924                              <1> 
  5925                              <1> read_overscan_border_color:
  5926                              <1> 	; 10/08/2016
  5927                              <1> 	; Read Overscan Register
  5928                              <1> 	; OUTPUT:
  5929                              <1> 	; BH = current rgbRGB value 
  5930                              <1> 	;      of the overscan/border register
  5931                              <1> 
  5932 00002FDE B311                <1> 	mov	bl, 11h
  5933 00002FE0 EBC8                <1> 	jmp	short get_single_palette_reg
  5934                              <1> 
  5935                              <1> get_all_palette_reg:
  5936                              <1> 	; 10/08/2016
  5937                              <1> 	; Read All Palette Registers
  5938                              <1> 	; EDX = Address of 17-byte buffer 
  5939                              <1> 	;	to receive data
  5940                              <1> 	
  5941 00002FE2 89D7                <1> 	mov	edi, edx
  5942 00002FE4 89E3                <1> 	mov	ebx, esp
  5943 00002FE6 89DE                <1> 	mov	esi, ebx
  5944 00002FE8 83EC14              <1> 	sub	esp, 20	 
  5945                              <1> 
  5946 00002FEB B100                <1> 	mov	cl, 0
  5947                              <1> get_palette_loop:
  5948 00002FED 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5949 00002FF1 EC                  <1> 	in	al, dx
  5950 00002FF2 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5951 00002FF6 88C8                <1> 	mov	al, cl
  5952 00002FF8 EE                  <1> 	out	dx, al
  5953 00002FF9 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  5954 00002FFD EC                  <1> 	in	al, dx
  5955 00002FFE 8803                <1> 	mov	[ebx], al
  5956 00003000 43                  <1> 	inc	ebx
  5957 00003001 FEC1                <1> 	inc	cl
  5958 00003003 80F910              <1> 	cmp	cl, 10h
  5959 00003006 75E5                <1> 	jne	short get_palette_loop
  5960 00003008 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5961 0000300C EC                  <1> 	in	al, dx
  5962 0000300D 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5963 00003011 B011                <1> 	mov	al, 11h
  5964 00003013 EE                  <1> 	out	dx, al
  5965 00003014 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  5966 00003018 EC                  <1> 	in	al, dx
  5967 00003019 8803                <1> 	mov	[ebx], al
  5968 0000301B 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5969 0000301F EC                  <1> 	in	al, dx
  5970 00003020 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5971 00003024 B020                <1> 	mov	al, 20h
  5972 00003026 EE                  <1> 	out	dx, al
  5973                              <1> 	; ifdef VBOX
  5974 00003027 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5975 0000302B EC                  <1> 	in	al, dx
  5976                              <1> 	; endif ; VBOX
  5977                              <1> 
  5978 0000302C B911000000          <1> 	mov	ecx, 17 ; transfer (byte) count
  5979                              <1> 	; ESI = source address in system space
  5980                              <1> 	; EDI = user's buffer address
  5981 00003031 E844AE0000          <1> 	call	transfer_to_user_buffer
  5982                              <1> 
  5983 00003036 83C414              <1> 	add	esp, 20
  5984 00003039 E99CE4FFFF          <1> 	jmp	VIDEO_RETURN
  5985                              <1> 
  5986                              <1> set_single_dac_reg:
  5987                              <1> 	; 10/08/2016
  5988                              <1> 	; Set One DAC Color Register
  5989                              <1> 	; BX = color register to set (0-255)
  5990                              <1>         ; CH = green value (00h-3Fh)
  5991                              <1>         ; CL = blue value  (00h-3Fh)
  5992                              <1>         ; DH = red value   (00h-3Fh)
  5993                              <1> 
  5994 0000303E 6652                <1> 	push	dx
  5995 00003040 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
  5996 00003044 88D8                <1> 	mov	al, bl
  5997 00003046 EE                  <1> 	out	dx, al
  5998                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
  5999 00003047 6642                <1> 	inc	dx
  6000 00003049 6658                <1> 	pop	ax
  6001 0000304B 88E0                <1> 	mov	al, ah
  6002 0000304D EE                  <1> 	out	dx, al
  6003 0000304E 88E8                <1> 	mov	al, ch
  6004 00003050 EE                  <1> 	out	dx, al
  6005 00003051 88C8                <1> 	mov	al, cl
  6006 00003053 EE                  <1> 	out	dx, al
  6007 00003054 E981E4FFFF          <1> 	jmp	VIDEO_RETURN
  6008                              <1> 
  6009                              <1> set_all_dac_reg:
  6010                              <1> 	; 12/08/2016
  6011                              <1> 	; 11/08/2016
  6012                              <1> 	; 10/08/2016
  6013                              <1> 	; Set a Block of DAC Color Register
  6014                              <1> 	; BX = first DAC register to set (0-00FFh)
  6015                              <1> 	; ECX = number of registers to set (0-00FFh)
  6016                              <1> 	; EDX = addr of a table of R,G,B values 
  6017                              <1> 	;	(it will be CX*3 bytes long)
  6018                              <1> 
  6019 00003059 89D6                <1> 	mov	esi, edx ; user buffer
  6020 0000305B 89CA                <1> 	mov	edx, ecx
  6021 0000305D 66D1E1              <1> 	shl	cx, 1 ; *2
  6022 00003060 01D1                <1> 	add	ecx, edx ; ecx = 3*ecx
  6023 00003062 89E5                <1> 	mov	ebp, esp
  6024 00003064 89EF                <1> 	mov	edi, ebp
  6025 00003066 29CF                <1> 	sub	edi, ecx
  6026 00003068 6683E7FC            <1> 	and	di, 0FFFCh ; (dword alignment)
  6027 0000306C 89FC                <1> 	mov	esp, edi
  6028 0000306E E851AE0000          <1> 	call	transfer_from_user_buffer
  6029                              <1> 	;jc	VIDEO_RETURN
  6030                              <1> 
  6031 00003073 89D1                <1> 	mov	ecx, edx
  6032 00003075 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
  6033 00003079 88D8                <1> 	mov	al, bl
  6034 0000307B EE                  <1> 	out	dx, al
  6035 0000307C 66BAC903            <1> 	mov	dx, 3C9h ; VGAREG_DAC_DATA
  6036                              <1> set_dac_loop:
  6037 00003080 8A07                <1> 	mov	al, [edi]
  6038 00003082 EE                  <1> 	out	dx, al
  6039 00003083 47                  <1> 	inc	edi
  6040 00003084 8A07                <1> 	mov	al, [edi]
  6041 00003086 EE                  <1> 	out	dx, al
  6042 00003087 47                  <1> 	inc	edi
  6043 00003088 8A07                <1> 	mov	al, [edi]
  6044 0000308A EE                  <1> 	out	dx, al
  6045 0000308B 47                  <1> 	inc	edi
  6046 0000308C 6649                <1> 	dec	cx
  6047 0000308E 75F0                <1> 	jnz	short set_dac_loop
  6048 00003090 89EC                <1> 	mov	esp, ebp
  6049 00003092 E943E4FFFF          <1> 	jmp	VIDEO_RETURN
  6050                              <1> 
  6051                              <1> select_video_dac_color_page:
  6052                              <1> 	; 10/08/2016
  6053                              <1> 	; DAC Color Paging Functions
  6054                              <1> 	; BL = 00H = select color paging mode
  6055                              <1>         ;       BH = paging mode
  6056                              <1>         ;            00h = 4 blocks of 64 registers
  6057                              <1>         ;            01h = 16 blocks of 16 registers
  6058                              <1> 	; BL = 01H = activate color page
  6059                              <1>         ;       BH = DAC color page number
  6060                              <1>         ;            00h-03h (4-page/64-reg mode)
  6061                              <1>         ;            00h-0Fh (16-page/16-reg mode)
  6062                              <1> 
  6063 00003097 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  6064 0000309B EC                  <1> 	in	al, dx
  6065 0000309C 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  6066 000030A0 B010                <1> 	mov	al, 10h
  6067 000030A2 EE                  <1> 	out	dx, al
  6068 000030A3 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  6069 000030A7 EC                  <1> 	in	al, dx
  6070 000030A8 80E301              <1> 	and	bl, 01h
  6071 000030AB 750E                <1> 	jnz	short set_dac_page
  6072 000030AD 247F                <1> 	and	al, 07Fh
  6073 000030AF C0E707              <1> 	shl	bh, 7
  6074 000030B2 08F8                <1> 	or	al, bh
  6075 000030B4 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  6076 000030B8 EE                  <1> 	out	dx, al
  6077 000030B9 EB1D                <1> 	jmp	short set_actl_normal
  6078                              <1> set_dac_page:
  6079 000030BB 6650                <1> 	push	ax
  6080 000030BD 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  6081 000030C1 EC                  <1> 	in	al, dx
  6082 000030C2 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  6083 000030C6 B014                <1> 	mov	al, 14h
  6084 000030C8 EE                  <1> 	out	dx, al
  6085 000030C9 6658                <1> 	pop	ax
  6086 000030CB 2480                <1> 	and	al, 80h
  6087 000030CD 7503                <1> 	jnz	short set_dac_16_page
  6088 000030CF C0E702              <1> 	shl	bh, 2
  6089                              <1> set_dac_16_page:
  6090 000030D2 80E70F              <1> 	and	bh, 0Fh
  6091 000030D5 88F8                <1> 	mov	al, bh
  6092 000030D7 EE                  <1> 	out	dx, al
  6093                              <1> set_actl_normal:
  6094 000030D8 B020                <1> 	mov	al, 20h
  6095 000030DA EE                  <1> 	out	dx, al
  6096                              <1> 	; ifdef VBOX
  6097 000030DB 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  6098 000030DF EC                  <1> 	in	al, dx
  6099                              <1> 	; endif ; VBOX
  6100 000030E0 E9F5E3FFFF          <1> 	jmp	VIDEO_RETURN	
  6101                              <1> 
  6102                              <1> read_single_dac_reg:
  6103                              <1> 	; 10/08/2016
  6104                              <1> 	; Read One DAC Color Register
  6105                              <1> 	; INPUT:
  6106                              <1> 	; BX = color register to read (0-255)
  6107                              <1> 	; OUTPUT:
  6108                              <1> 	; CH = green value (00h-3Fh)
  6109                              <1>         ; CL = blue value  (00h-3Fh)
  6110                              <1>         ; DH = red value   (00h-3Fh)
  6111                              <1> 
  6112 000030E5 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
  6113 000030E9 88D8                <1> 	mov	al, bl
  6114 000030EB EE                  <1> 	out	dx, al
  6115 000030EC 66BAC903            <1> 	mov	dx, 3C9h ; VGAREG_DAC_DATA
  6116 000030F0 EC                  <1> 	in	al, dx
  6117 000030F1 88442415            <1> 	mov	[esp+21], al ; dh
  6118 000030F5 EC                  <1> 	in	al, dx
  6119 000030F6 88C5                <1> 	mov	ch, al
  6120 000030F8 EC                  <1> 	in	al, dx
  6121 000030F9 88C1                <1> 	mov	cl, al
  6122 000030FB 66894C2410          <1> 	mov	[esp+16], cx ; cx
  6123 00003100 E9D5E3FFFF          <1> 	jmp	VIDEO_RETURN	
  6124                              <1> 
  6125                              <1> read_all_dac_reg:
  6126                              <1> 	; 12/08/2016
  6127                              <1> 	; 11/08/2016
  6128                              <1> 	; 10/08/2016
  6129                              <1> 	; Read a Block of DAC Color Registers
  6130                              <1>         ; BX = first DAC register to read (0-00FFh)
  6131                              <1>         ; ECX = number of registers to read (0-00FFh)
  6132                              <1>         ; EDX = addr of a buffer to hold R,G,B values
  6133                              <1> 	;	(CX*3 bytes long)
  6134                              <1> 
  6135 00003105 89D7                <1> 	mov	edi, edx ; user buffer
  6136 00003107 89CA                <1> 	mov	edx, ecx
  6137 00003109 66D1E2              <1> 	shl	dx, 1 ; *2
  6138 0000310C 01CA                <1> 	add	edx, ecx ; edx = 3*ecx
  6139 0000310E 89E5                <1> 	mov	ebp, esp
  6140 00003110 89EE                <1> 	mov	esi, ebp
  6141 00003112 29D6                <1> 	sub	esi, edx
  6142 00003114 6683E6FC            <1> 	and	si, 0FFFCh ; (dword alignment)
  6143 00003118 89F4                <1> 	mov	esp, esi
  6144 0000311A 52                  <1> 	push	edx ; 3*ecx
  6145 0000311B 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
  6146 0000311F 88D8                <1> 	mov	al, bl
  6147 00003121 EE                  <1> 	out	dx, al
  6148 00003122 66BAC903            <1> 	mov	dx, 3C9h ; VGAREG_DAC_DATA
  6149 00003126 89F3                <1> 	mov	ebx, esi
  6150                              <1> read_dac_loop:
  6151 00003128 EC                  <1> 	in	al, dx
  6152 00003129 8803                <1> 	mov	[ebx], al
  6153 0000312B 43                  <1> 	inc	ebx
  6154 0000312C EC                  <1> 	in	al, dx
  6155 0000312D 8803                <1> 	mov	[ebx], al
  6156 0000312F 43                  <1> 	inc	ebx
  6157 00003130 EC                  <1> 	in	al, dx
  6158 00003131 8803                <1> 	mov	[ebx], al
  6159 00003133 43                  <1> 	inc	ebx
  6160 00003134 6649                <1> 	dec	cx
  6161 00003136 75F0                <1> 	jnz	short read_dac_loop
  6162 00003138 59                  <1> 	pop	ecx ; 3*ecx
  6163                              <1> 	; ECX = transfer (byte) count
  6164                              <1> 	; ESI = source address in system space
  6165                              <1> 	; EDI = user's buffer address
  6166 00003139 E83CAD0000          <1> 	call	transfer_to_user_buffer
  6167 0000313E 89EC                <1> 	mov	esp, ebp
  6168 00003140 E995E3FFFF          <1> 	jmp	VIDEO_RETURN
  6169                              <1> 
  6170                              <1> set_pel_mask:
  6171                              <1> 	; 10/08/2016
  6172                              <1> 	; BL = mask value
  6173 00003145 66BAC603            <1> 	mov	dx, 3C6h ; VGAREG_PEL_MASK
  6174 00003149 88D8                <1> 	mov	al, bl
  6175 0000314B EE                  <1> 	out	dx, al
  6176 0000314C E989E3FFFF          <1> 	jmp	VIDEO_RETURN
  6177                              <1> 
  6178                              <1> read_pel_mask:
  6179                              <1> 	; 10/08/2016
  6180                              <1> 	; Output: BL = mask value 
  6181 00003151 66BAC603            <1> 	mov	dx, 3C6h ; VGAREG_PEL_MASK
  6182 00003155 EC                  <1> 	in	al, dx
  6183 00003156 8844240C            <1> 	mov	[esp+12], al ; bl
  6184 0000315A E97BE3FFFF          <1> 	jmp	VIDEO_RETURN
  6185                              <1> 
  6186                              <1> read_video_dac_state:
  6187                              <1> 	; 10/08/2016
  6188                              <1> 	; Query DAC Color Paging State
  6189                              <1> 	; Output:
  6190                              <1> 	; BH = current active DAC color page
  6191                              <1>         ; BL = current active DAC paging mode
  6192                              <1> 
  6193 0000315F 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  6194 00003163 EC                  <1> 	in	al, dx
  6195 00003164 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  6196 00003168 B010                <1> 	mov	al, 10h
  6197 0000316A EE                  <1> 	out	dx, al
  6198 0000316B 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  6199 0000316F EC                  <1> 	in	al, dx
  6200 00003170 88C3                <1> 	mov	bl, al
  6201 00003172 C0EB07              <1> 	shr	bl, 7
  6202 00003175 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  6203 00003179 EC                  <1> 	in	al, dx
  6204 0000317A 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  6205 0000317E B014                <1> 	mov	al, 14h
  6206 00003180 EE                  <1> 	out	dx, al
  6207 00003181 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  6208 00003185 EC                  <1> 	in	al, dx
  6209 00003186 88C7                <1> 	mov	bh, al
  6210 00003188 80E70F              <1> 	and	bh, 0Fh
  6211 0000318B F6C301              <1> 	test	bl, 01
  6212 0000318E 7503                <1> 	jnz	short get_dac_16_page
  6213 00003190 C0EF02              <1> 	shr	bh, 2
  6214                              <1> get_dac_16_page:
  6215 00003193 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  6216 00003197 EC                  <1> 	in	al, dx
  6217 00003198 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  6218 0000319C B020                <1> 	mov	al, 20h
  6219 0000319E EE                  <1> 	out	dx, al
  6220                              <1> 	; ifdef VBOX
  6221 0000319F 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  6222 000031A3 EC                  <1> 	in	al, dx
  6223                              <1> 	; endif ; VBOX 
  6224 000031A4 66895C240C          <1> 	mov	[esp+12], bx ; bx
  6225 000031A9 E92CE3FFFF          <1> 	jmp	VIDEO_RETURN
  6226                              <1> 
  6227                              <1> ; % include 'vidata.s' ; VIDEO DATA
  6228                              <1> 
  6229                              <1> ; /// End Of VIDEO FUNCTIONS ///
  1912                                  
  1913                                  setup_rtc_int:
  1914                                  ; source: http://wiki.osdev.org/RTC
  1915 000031AE FA                      	cli		; disable interrupts
  1916                                  	; default int frequency is 1024 Hz (Lower 4 bits of register A is 0110b or 6)
  1917                                  	; in order to change this ...
  1918                                  	; frequency  = 32768 >> (rate-1) --> 32768 >> 5 = 1024
  1919                                  	; (rate must be above 2 and not over 15)
  1920                                  	; new rate = 15 --> 32768 >> (15-1) = 2 Hz
  1921 000031AF B08A                    	mov	al, 8Ah 
  1922 000031B1 E670                    	out	70h, al ; set index to register A, disable NMI
  1923 000031B3 90                      	nop
  1924 000031B4 E471                    	in	al, 71h ; get initial value of register A
  1925 000031B6 88C4                    	mov 	ah, al
  1926 000031B8 80E4F0                  	and	ah, 0F0h
  1927 000031BB B08A                    	mov	al, 8Ah 
  1928 000031BD E670                    	out	70h, al ; reset index to register A
  1929 000031BF 88E0                    	mov	al, ah
  1930 000031C1 0C0F                    	or	al, 0Fh	; new rate (0Fh -> 15)
  1931 000031C3 E671                    	out	71h, al ; write only our rate to A. Note, rate is the bottom 4 bits. 
  1932                                  	; enable RTC interrupt
  1933 000031C5 B08B                    	mov	al, 8Bh ;
  1934 000031C7 E670                    	out	70h, al ; select register B and disable NMI
  1935 000031C9 90                      	nop
  1936 000031CA E471                    	in	al, 71h ; read the current value of register B
  1937 000031CC 88C4                    	mov	ah, al  ;
  1938 000031CE B08B                    	mov 	al, 8Bh ;
  1939 000031D0 E670                    	out	70h, al ; set the index again (a read will reset the index to register B)	
  1940 000031D2 88E0                    	mov	al, ah  ;
  1941 000031D4 0C40                    	or	al, 40h ;
  1942 000031D6 E671                    	out	71h, al ; write the previous value ORed with 0x40. This turns on bit 6 of register B
  1943 000031D8 FB                      	sti
  1944 000031D9 C3                      	retn
  1945                                  
  1946                                  ; Write memory information
  1947                                  ; 29/01/2016
  1948                                  ; 06/11/2014
  1949                                  ; 14/08/2015 
  1950                                  memory_info:	
  1951 000031DA A1[E4300100]            	mov	eax, [memory_size] ; in pages
  1952 000031DF 50                      	push	eax
  1953 000031E0 C1E00C                  	shl	eax, 12		   ; in bytes
  1954 000031E3 BB0A000000              	mov	ebx, 10
  1955 000031E8 89D9                    	mov	ecx, ebx	   ; 10
  1956 000031EA BE[34FF0000]            	mov	esi, mem_total_b_str	
  1957 000031EF E8BD000000              	call	bintdstr
  1958 000031F4 58                      	pop	eax
  1959 000031F5 B107                    	mov	cl, 7
  1960 000031F7 BE[58FF0000]            	mov	esi, mem_total_p_str
  1961 000031FC E8B0000000              	call	bintdstr	
  1962                                  	; 14/08/2015
  1963 00003201 E8C8000000              	call	calc_free_mem
  1964                                  	; edx = calculated free pages
  1965                                  	; ecx = 0
  1966 00003206 A1[E8300100]            	mov 	eax, [free_pages]
  1967 0000320B 39D0                    	cmp	eax, edx ; calculated free mem value 
  1968                                  		; and initial free mem value are same or not?
  1969 0000320D 751D                    	jne 	short pmim ; print mem info with '?' if not
  1970 0000320F 52                      	push 	edx ; free memory in pages	
  1971                                  	;mov 	eax, edx
  1972 00003210 C1E00C                  	shl	eax, 12 ; convert page count
  1973                                  			; to byte count
  1974 00003213 B10A                    	mov	cl, 10
  1975 00003215 BE[78FF0000]            	mov	esi, free_mem_b_str
  1976 0000321A E892000000              	call	bintdstr
  1977 0000321F 58                      	pop	eax
  1978 00003220 B107                    	mov	cl, 7
  1979 00003222 BE[9CFF0000]            	mov	esi, free_mem_p_str
  1980 00003227 E885000000              	call	bintdstr
  1981                                  pmim:
  1982 0000322C BE[22FF0000]            	mov	esi, msg_memory_info
  1983                                  	;
  1984 00003231 B407                    	mov	ah, 07h ; Black background, 
  1985                                  			; light gray forecolor
  1986                                  print_kmsg: ; 29/01/2016
  1987 00003233 8825[0F310100]          	mov	[ccolor], ah
  1988                                  pkmsg_loop:
  1989 00003239 AC                      	lodsb
  1990 0000323A 08C0                    	or	al, al
  1991 0000323C 7410                    	jz	short pkmsg_ok
  1992 0000323E 56                      	push	esi
  1993                                  	; 13/05/2016
  1994 0000323F 0FB61D[0F310100]        	movzx	ebx, byte [ccolor]
  1995                                  			; Video page 0 (bh=0)
  1996 00003246 E8EDE9FFFF              	call	_write_tty
  1997 0000324B 5E                      	pop	esi
  1998 0000324C EBEB                    	jmp	short pkmsg_loop
  1999                                  pkmsg_ok:
  2000 0000324E C3                      	retn
  2001                                  
  2002                                  ; Convert binary number to hexadecimal string
  2003                                  ; 10/05/2015  
  2004                                  ; dsectpm.s (28/02/2015)
  2005                                  ; Retro UNIX 386 v1 - Kernel v0.2.0.6  
  2006                                  ; 01/12/2014
  2007                                  ; 25/11/2014
  2008                                  ;
  2009                                  bytetohex:
  2010                                  	; INPUT ->
  2011                                  	; 	AL = byte (binary number)
  2012                                  	; OUTPUT ->
  2013                                  	;	AX = hexadecimal string
  2014                                  	;
  2015 0000324F 53                      	push	ebx
  2016 00003250 31DB                    	xor	ebx, ebx
  2017 00003252 88C3                    	mov	bl, al
  2018 00003254 C0EB04                  	shr	bl, 4
  2019 00003257 8A9B[A1320000]          	mov	bl, [ebx+hexchrs] 	 	
  2020 0000325D 86D8                    	xchg	bl, al
  2021 0000325F 80E30F                  	and	bl, 0Fh
  2022 00003262 8AA3[A1320000]          	mov	ah, [ebx+hexchrs] 
  2023 00003268 5B                      	pop	ebx	
  2024 00003269 C3                      	retn
  2025                                  
  2026                                  wordtohex:
  2027                                  	; INPUT ->
  2028                                  	; 	AX = word (binary number)
  2029                                  	; OUTPUT ->
  2030                                  	;	EAX = hexadecimal string
  2031                                  	;
  2032 0000326A 53                      	push	ebx
  2033 0000326B 31DB                    	xor	ebx, ebx
  2034 0000326D 86E0                    	xchg	ah, al
  2035 0000326F 6650                    	push	ax
  2036 00003271 88E3                    	mov	bl, ah
  2037 00003273 C0EB04                  	shr	bl, 4
  2038 00003276 8A83[A1320000]          	mov	al, [ebx+hexchrs] 	 	
  2039 0000327C 88E3                    	mov	bl, ah
  2040 0000327E 80E30F                  	and	bl, 0Fh
  2041 00003281 8AA3[A1320000]          	mov	ah, [ebx+hexchrs]
  2042 00003287 C1E010                  	shl	eax, 16
  2043 0000328A 6658                    	pop	ax
  2044 0000328C 5B                      	pop	ebx
  2045 0000328D EBC0                    	jmp	short bytetohex
  2046                                  	;mov	bl, al
  2047                                  	;shr	bl, 4
  2048                                  	;mov	bl, [ebx+hexchrs] 	 	
  2049                                  	;xchg	bl, al	 	
  2050                                  	;and	bl, 0Fh
  2051                                  	;mov	ah, [ebx+hexchrs] 
  2052                                  	;pop	ebx	
  2053                                  	;retn
  2054                                  
  2055                                  dwordtohex:
  2056                                  	; INPUT ->
  2057                                  	; 	EAX = dword (binary number)
  2058                                  	; OUTPUT ->
  2059                                  	;	EDX:EAX = hexadecimal string
  2060                                  	;
  2061 0000328F 50                      	push	eax
  2062 00003290 C1E810                  	shr	eax, 16
  2063 00003293 E8D2FFFFFF              	call	wordtohex
  2064 00003298 89C2                    	mov	edx, eax
  2065 0000329A 58                      	pop	eax
  2066 0000329B E8CAFFFFFF              	call	wordtohex
  2067 000032A0 C3                      	retn
  2068                                  
  2069                                  ; 10/05/2015
  2070                                  hex_digits:
  2071                                  hexchrs:
  2072 000032A1 303132333435363738-     	db '0123456789ABCDEF'
  2072 000032AA 39414243444546     
  2073                                  
  2074                                  ; Convert binary number to decimal/numeric string
  2075                                  ; 06/11/2014
  2076                                  ; Temporary Code
  2077                                  ;
  2078                                  
  2079                                  bintdstr:
  2080                                  	; EAX = binary number
  2081                                  	; ESI = decimal/numeric string address
  2082                                  	; EBX = divisor (10)
  2083                                  	; ECX = string length (<=10)
  2084 000032B1 01CE                    	add	esi, ecx
  2085                                  btdstr0:
  2086 000032B3 4E                      	dec	esi
  2087 000032B4 31D2                    	xor	edx, edx
  2088 000032B6 F7F3                    	div	ebx
  2089 000032B8 80C230                  	add	dl, 30h
  2090 000032BB 8816                    	mov	[esi], dl
  2091 000032BD FEC9                    	dec	cl
  2092 000032BF 740C                    	jz	short btdstr2 ; 08/09/2016
  2093 000032C1 09C0                    	or	eax, eax
  2094 000032C3 75EE                    	jnz	short btdstr0
  2095                                  btdstr1:
  2096 000032C5 4E                      	dec	esi
  2097 000032C6 C60620                          mov     byte [esi], 20h ; blank space
  2098 000032C9 FEC9                    	dec	cl
  2099 000032CB 75F8                    	jnz	short btdstr1
  2100                                  btdstr2:
  2101 000032CD C3                      	retn
  2102                                  
  2103                                  ; Calculate free memory pages on M.A.T.
  2104                                  ; 06/11/2014
  2105                                  ; Temporary Code
  2106                                  ;
  2107                                  
  2108                                  calc_free_mem:
  2109 000032CE 31D2                    	xor	edx, edx
  2110                                  	;xor	ecx, ecx
  2111 000032D0 668B0D[F8300100]        	mov	cx, [mat_size] ; in pages
  2112 000032D7 C1E10A                  	shl	ecx, 10	; 1024 dwords per page
  2113 000032DA BE00001000              	mov	esi, MEM_ALLOC_TBL
  2114                                  cfm0:
  2115 000032DF AD                      	lodsd
  2116 000032E0 51                      	push	ecx
  2117 000032E1 B920000000              	mov	ecx, 32
  2118                                  cfm1:
  2119 000032E6 D1E8                    	shr	eax, 1
  2120 000032E8 7301                    	jnc	short cfm2
  2121 000032EA 42                      	inc	edx
  2122                                  cfm2:
  2123 000032EB E2F9                    	loop	cfm1
  2124 000032ED 59                      	pop	ecx
  2125 000032EE E2EF                    	loop	cfm0
  2126 000032F0 C3                      	retn
  2127                                  
  2128                                  %include 'diskio.s'  ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - diskio.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 15/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; diskio.inc (22/08/2015)
    15                              <1> ;
    16                              <1> ; Derived from 'IBM PC-XT-286' BIOS source code (1986) 
    17                              <1> ; ****************************************************************************
    18                              <1> 
    19                              <1> ; Retro UNIX 386 v1 Kernel - DISKIO.INC
    20                              <1> ; Last Modification: 22/08/2015
    21                              <1> ; 	(Initialized Disk Parameters Data is in 'DISKDATA.INC') 
    22                              <1> ; 	(Uninitialized Disk Parameters Data is in 'DISKBSS.INC') 
    23                              <1> 
    24                              <1> ; DISK I/O SYSTEM - Erdogan Tan (Retro UNIX 386 v1 project)
    25                              <1> 
    26                              <1> ; ///////// DISK I/O SYSTEM ///////////////
    27                              <1> 
    28                              <1> ; 06/02/2015
    29                              <1> diskette_io:
    30 000032F1 9C                  <1> 	pushfd
    31 000032F2 0E                  <1> 	push 	cs
    32 000032F3 E809000000          <1> 	call 	DISKETTE_IO_1
    33 000032F8 C3                  <1> 	retn
    34                              <1> 	
    35                              <1> ;;;;;; DISKETTE I/O ;;;;;;;;;;;;;;;;;;;; 06/02/2015 ;;;
    36                              <1> ;//////////////////////////////////////////////////////
    37                              <1> 
    38                              <1> ; DISKETTE I/O - Erdogan Tan (Retro UNIX 386 v1 project)
    39                              <1> ; 20/02/2015
    40                              <1> ; 06/02/2015 (unix386.s)
    41                              <1> ; 16/12/2014 - 02/01/2015 (dsectrm2.s)
    42                              <1> ;
    43                              <1> ; Code (DELAY) modifications - AWARD BIOS 1999 (ADISK.EQU, COMMON.MAC)
    44                              <1> ;
    45                              <1> ; ADISK.EQU
    46                              <1> 
    47                              <1> ;----- Wait control constants 
    48                              <1> 
    49                              <1> ;amount of time to wait while RESET is active.
    50                              <1> 
    51                              <1> WAITCPU_RESET_ON	EQU	21		;Reset on must last at least 14us
    52                              <1> 						;at 250 KBS xfer rate.
    53                              <1> 						;see INTEL MCS, 1985, pg. 5-456
    54                              <1> 
    55                              <1> WAITCPU_FOR_STATUS	EQU	100		;allow 30 microseconds for
    56                              <1> 						;status register to become valid
    57                              <1> 						;before re-reading.
    58                              <1> 
    59                              <1> ;After sending a byte to NEC, status register may remain
    60                              <1> ;incorrectly set for 24 us.
    61                              <1> 
    62                              <1> WAITCPU_RQM_LOW		EQU	24		;number of loops to check for
    63                              <1> 						;RQM low.
    64                              <1> 
    65                              <1> ; COMMON.MAC
    66                              <1> ;
    67                              <1> ;	Timing macros
    68                              <1> ;
    69                              <1> 
    70                              <1> %macro 		SIODELAY 0 			; SHORT IODELAY
    71                              <1> 		jmp short $+2
    72                              <1> %endmacro		
    73                              <1> 
    74                              <1> %macro		IODELAY  0			; NORMAL IODELAY
    75                              <1> 		jmp short $+2
    76                              <1> 		jmp short $+2
    77                              <1> %endmacro
    78                              <1> 
    79                              <1> %macro		NEWIODELAY 0
    80                              <1> 		out	0ebh,al
    81                              <1> %endmacro 
    82                              <1> 
    83                              <1> ; (According to) AWARD BIOS 1999 - ATORGS.ASM (dw -> equ, db -> equ)
    84                              <1> ;;; WAIT_FOR_MEM
    85                              <1> ;WAIT_FDU_INT_LO	equ	017798		; 2.5 secs in 30 micro units.
    86                              <1> ;WAIT_FDU_INT_HI	equ	1
    87                              <1> WAIT_FDU_INT_LH		equ	83334		; 27/02/2015 (2.5 seconds waiting)
    88                              <1> ;;; WAIT_FOR_PORT
    89                              <1> ;WAIT_FDU_SEND_LO	equ	16667		; .5 secons in 30 us units.
    90                              <1> ;WAIT_FDU_SEND_HI	equ	0
    91                              <1> WAIT_FDU_SEND_LH	equ 	16667		; 27/02/2015	
    92                              <1> ;Time to wait while waiting for each byte of NEC results = .5
    93                              <1> ;seconds.  .5 seconds = 500,000 micros.  500,000/30 = 16,667.
    94                              <1> ;WAIT_FDU_RESULTS_LO	equ	16667		; .5 seconds in 30 micro units.
    95                              <1> ;WAIT_FDU_RESULTS_HI	equ	0
    96                              <1> WAIT_FDU_RESULTS_LH	equ	16667  ; 27/02/2015
    97                              <1> ;;; WAIT_REFRESH
    98                              <1> ;amount of time to wait for head settle, per unit in parameter
    99                              <1> ;table = 1 ms.
   100                              <1> WAIT_FDU_HEAD_SETTLE	equ	33		; 1 ms in 30 micro units.
   101                              <1> 
   102                              <1> 
   103                              <1> ; //////////////// DISKETTE I/O ////////////////
   104                              <1> 
   105                              <1> ; 11/12/2014 (copy from IBM PC-XT Model 286 BIOS - POSTEQU.INC)
   106                              <1> 
   107                              <1> ;----------------------------------------
   108                              <1> ;	EQUATES USED BY POST AND BIOS	:
   109                              <1> ;----------------------------------------
   110                              <1> 
   111                              <1> ;--------- 8042 KEYBOARD INTERFACE AND DIAGNOSTIC CONTROL REGISTERS ------------
   112                              <1> ;PORT_A		EQU	060H		; 8042 KEYBOARD SCAN CODE/CONTROL PORT
   113                              <1> ;PORT_B		EQU	061H		; PORT B READ/WRITE DIAGNOSTIC REGISTER
   114                              <1> ;REFRESH_BIT	EQU	00010000B	; REFRESH TEST BIT
   115                              <1> 
   116                              <1> ;----------------------------------------
   117                              <1> ;	CMOS EQUATES FOR THIS SYSTEM	:
   118                              <1> ;-------------------------------------------------------------------------------
   119                              <1> ;CMOS_PORT	EQU	070H		; I/O ADDRESS OF CMOS ADDRESS PORT
   120                              <1> ;CMOS_DATA	EQU	071H		; I/O ADDRESS OF CMOS DATA PORT
   121                              <1> ;NMI		EQU	10000000B	; DISABLE NMI INTERRUPTS MASK -
   122                              <1> 					;  HIGH BIT OF CMOS LOCATION ADDRESS
   123                              <1> 
   124                              <1> ;---------- CMOS TABLE LOCATION ADDRESS'S ## -----------------------------------
   125                              <1> CMOS_DISKETTE	EQU	010H		; DISKETTE DRIVE TYPE BYTE	      ;
   126                              <1> ;		EQU	011H		; - RESERVED			      ;C
   127                              <1> CMOS_DISK	EQU	012H		; FIXED DISK TYPE BYTE		      ;H
   128                              <1> ;		EQU	013H		; - RESERVED			      ;E
   129                              <1> CMOS_EQUIP	EQU	014H		; EQUIPMENT WORD LOW BYTE	      ;C
   130                              <1> 
   131                              <1> ;---------- DISKETTE EQUATES ---------------------------------------------------
   132                              <1> INT_FLAG	EQU	10000000B	; INTERRUPT OCCURRENCE FLAG
   133                              <1> DSK_CHG 	EQU	10000000B	; DISKETTE CHANGE FLAG MASK BIT
   134                              <1> DETERMINED	EQU	00010000B	; SET STATE DETERMINED IN STATE BITS
   135                              <1> HOME		EQU	00010000B	; TRACK 0 MASK
   136                              <1> SENSE_DRV_ST	EQU	00000100B	; SENSE DRIVE STATUS COMMAND
   137                              <1> TRK_SLAP	EQU	030H		; CRASH STOP (48 TPI DRIVES)
   138                              <1> QUIET_SEEK	EQU	00AH		; SEEK TO TRACK 10
   139                              <1> ;MAX_DRV 	EQU	2		; MAX NUMBER OF DRIVES
   140                              <1> HD12_SETTLE	EQU	15		; 1.2 M HEAD SETTLE TIME
   141                              <1> HD320_SETTLE	EQU	20		; 320 K HEAD SETTLE TIME
   142                              <1> MOTOR_WAIT	EQU	37		; 2 SECONDS OF COUNTS FOR MOTOR TURN OFF
   143                              <1> 
   144                              <1> ;---------- DISKETTE ERRORS ----------------------------------------------------
   145                              <1> ;TIME_OUT	EQU	080H		; ATTACHMENT FAILED TO RESPOND
   146                              <1> ;BAD_SEEK	EQU	040H		; SEEK OPERATION FAILED
   147                              <1> BAD_NEC 	EQU	020H		; DISKETTE CONTROLLER HAS FAILED
   148                              <1> BAD_CRC 	EQU	010H		; BAD CRC ON DISKETTE READ
   149                              <1> MED_NOT_FND	EQU	00CH		; MEDIA TYPE NOT FOUND
   150                              <1> DMA_BOUNDARY	EQU	009H		; ATTEMPT TO DMA ACROSS 64K BOUNDARY
   151                              <1> BAD_DMA 	EQU	008H		; DMA OVERRUN ON OPERATION
   152                              <1> MEDIA_CHANGE	EQU	006H		; MEDIA REMOVED ON DUAL ATTACH CARD
   153                              <1> RECORD_NOT_FND	EQU	004H		; REQUESTED SECTOR NOT FOUND
   154                              <1> WRITE_PROTECT	EQU	003H		; WRITE ATTEMPTED ON WRITE PROTECT DISK
   155                              <1> BAD_ADDR_MARK	EQU	002H		; ADDRESS MARK NOT FOUND
   156                              <1> BAD_CMD 	EQU	001H		; BAD COMMAND PASSED TO DISKETTE I/O
   157                              <1> 
   158                              <1> ;---------- DISK CHANGE LINE EQUATES -------------------------------------------
   159                              <1> NOCHGLN 	EQU	001H		; NO DISK CHANGE LINE AVAILABLE
   160                              <1> CHGLN		EQU	002H		; DISK CHANGE LINE AVAILABLE
   161                              <1> 
   162                              <1> ;---------- MEDIA/DRIVE STATE INDICATORS ---------------------------------------
   163                              <1> TRK_CAPA	EQU	00000001B	; 80 TRACK CAPABILITY
   164                              <1> FMT_CAPA	EQU	00000010B	; MULTIPLE FORMAT CAPABILITY (1.2M)
   165                              <1> DRV_DET 	EQU	00000100B	; DRIVE DETERMINED
   166                              <1> MED_DET 	EQU	00010000B	; MEDIA DETERMINED BIT
   167                              <1> DBL_STEP	EQU	00100000B	; DOUBLE STEP BIT
   168                              <1> RATE_MSK	EQU	11000000B	; MASK FOR CLEARING ALL BUT RATE
   169                              <1> RATE_500	EQU	00000000B	; 500 KBS DATA RATE
   170                              <1> RATE_300	EQU	01000000B	; 300 KBS DATA RATE
   171                              <1> RATE_250	EQU	10000000B	; 250 KBS DATA RATE
   172                              <1> STRT_MSK	EQU	00001100B	; OPERATION START RATE MASK
   173                              <1> SEND_MSK	EQU	11000000B	; MASK FOR SEND RATE BITS
   174                              <1> 
   175                              <1> ;---------- MEDIA/DRIVE STATE INDICATORS COMPATIBILITY -------------------------
   176                              <1> M3D3U		EQU	00000000B	; 360 MEDIA/DRIVE NOT ESTABLISHED
   177                              <1> M3D1U		EQU	00000001B	; 360 MEDIA,1.2DRIVE NOT ESTABLISHED
   178                              <1> M1D1U		EQU	00000010B	; 1.2 MEDIA/DRIVE NOT ESTABLISHED
   179                              <1> MED_UNK 	EQU	00000111B	; NONE OF THE ABOVE
   180                              <1> 
   181                              <1> ;---------- INTERRUPT EQUATES --------------------------------------------------
   182                              <1> ;EOI		EQU	020H		; END OF INTERRUPT COMMAND TO 8259
   183                              <1> ;INTA00		EQU	020H		; 8259 PORT
   184                              <1> INTA01		EQU	021H		; 8259 PORT
   185                              <1> INTB00		EQU	0A0H		; 2ND 8259
   186                              <1> INTB01		EQU	0A1H		;
   187                              <1> 
   188                              <1> ;-------------------------------------------------------------------------------
   189                              <1> DMA08		EQU	008H		; DMA STATUS REGISTER PORT ADDRESS
   190                              <1> DMA		EQU	000H		; DMA CH.0 ADDRESS REGISTER PORT ADDRESS
   191                              <1> DMA18		EQU	0D0H		; 2ND DMA STATUS PORT ADDRESS
   192                              <1> DMA1		EQU	0C0H		; 2ND DMA CH.0 ADDRESS REGISTER ADDRESS
   193                              <1> ;-------------------------------------------------------------------------------
   194                              <1> ;TIMER		EQU	040H		; 8254 TIMER - BASE ADDRESS
   195                              <1> 
   196                              <1> ;-------------------------------------------------------------------------------
   197                              <1> DMA_PAGE	EQU	081H		; START OF DMA PAGE REGISTERS
   198                              <1> 
   199                              <1> ; 06/02/2015 (unix386.s, protected mode modifications)
   200                              <1> ; (unix386.s <-- dsectrm2.s)
   201                              <1> ; 11/12/2014 (copy from IBM PC-XT Model 286 BIOS - DSEG.INC)
   202                              <1> 
   203                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
   204                              <1> ; 10/12/2014
   205                              <1> ;
   206                              <1> ;int40h:
   207                              <1> ;	pushf
   208                              <1> ;	push 	cs
   209                              <1> ;	;cli
   210                              <1> ;	call 	DISKETTE_IO_1
   211                              <1> ;	retn
   212                              <1> 
   213                              <1> ; DSKETTE ----- 04/21/86 DISKETTE BIOS
   214                              <1> ; (IBM PC XT Model 286 System BIOS Source Code, 04-21-86)
   215                              <1> ;
   216                              <1> 
   217                              <1> ;-- INT13H ---------------------------------------------------------------------
   218                              <1> ; DISKETTE I/O
   219                              <1> ;	THIS INTERFACE PROVIDES ACCESS TO THE 5 1/4 INCH 360 KB,
   220                              <1> ;	1.2 MB, 720 KB AND 1.44 MB DISKETTE DRIVES.
   221                              <1> ; INPUT
   222                              <1> ;	(AH) =  00H RESET DISKETTE SYSTEM
   223                              <1> ;		HARD RESET TO NEC, PREPARE COMMAND, RECALIBRATE REQUIRED
   224                              <1> ;		ON ALL DRIVES
   225                              <1> ;------------------------------------------------------------------------------- 
   226                              <1> ;	(AH)= 01H  READ THE STATUS OF THE SYSTEM INTO (AH)
   227                              <1> ;		@DISKETTE_STATUS FROM LAST OPERATION IS USED
   228                              <1> ;-------------------------------------------------------------------------------
   229                              <1> ;	REGISTERS FOR READ/WRITE/VERIFY/FORMAT
   230                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED)
   231                              <1> ;	(DH) - HEAD NUMBER (0-1 ALLOWED, NOT VALUE CHECKED)
   232                              <1> ;	(CH) - TRACK NUMBER (NOT VALUE CHECKED)
   233                              <1> ;		MEDIA	DRIVE	TRACK NUMBER
   234                              <1> ;		320/360	320/360	    0-39
   235                              <1> ;		320/360	1.2M	    0-39
   236                              <1> ;		1.2M	1.2M	    0-79
   237                              <1> ;		720K	720K	    0-79
   238                              <1> ;		1.44M	1.44M	    0-79	
   239                              <1> ;	(CL) - 	SECTOR NUMBER (NOT VALUE CHECKED, NOT USED FOR FORMAT)
   240                              <1> ;		MEDIA	DRIVE	SECTOR NUMBER
   241                              <1> ;		320/360	320/360	     1-8/9
   242                              <1> ;		320/360	1.2M	     1-8/9
   243                              <1> ;		1.2M	1.2M	     1-15
   244                              <1> ;		720K	720K	     1-9
   245                              <1> ;		1.44M	1.44M	     1-18		
   246                              <1> ;	(AL)	NUMBER OF SECTORS (NOT VALUE CHECKED)
   247                              <1> ;		MEDIA	DRIVE	MAX NUMBER OF SECTORS
   248                              <1> ;		320/360	320/360	        8/9
   249                              <1> ;		320/360	1.2M	        8/9
   250                              <1> ;		1.2M	1.2M		15
   251                              <1> ;		720K	720K		9
   252                              <1> ;		1.44M	1.44M		18
   253                              <1> ;
   254                              <1> ;	(ES:BX) - ADDRESS OF BUFFER (NOT REQUIRED FOR VERIFY)
   255                              <1> ;
   256                              <1> ;-------------------------------------------------------------------------------
   257                              <1> ;	(AH)= 02H  READ THE DESIRED SECTORS INTO MEMORY
   258                              <1> ;-------------------------------------------------------------------------------
   259                              <1> ;	(AH)= 03H  WRITE THE DESIRED SECTORS FROM MEMORY
   260                              <1> ;-------------------------------------------------------------------------------
   261                              <1> ;	(AH)= 04H  VERIFY THE DESIRED SECTORS
   262                              <1> ;-------------------------------------------------------------------------------
   263                              <1> ;	(AH)= 05H  FORMAT THE DESIRED TRACK
   264                              <1> ;		(ES,BX) MUST POINT TO THE COLLECTION OF DESIRED ADDRESS FIELDS
   265                              <1> ;		FOR THE	TRACK. EACH FIELD IS COMPOSED OF 4 BYTES, (C,H,R,N),
   266                              <1> ;		WHERE C = TRACK NUMBER, H=HEAD NUMBER, R = SECTOR NUMBER, 
   267                              <1> ;		N= NUMBER OF BYTES PER SECTOR (00=128,01=256,02=512,03=1024),
   268                              <1> ;		THERE MUST BE ONE ENTRY FOR EVERY SECTOR ON THE TRACK.
   269                              <1> ;		THIS INFORMATION IS USED TO FIND THE REQUESTED SECTOR DURING 
   270                              <1> ;		READ/WRITE ACCESS.
   271                              <1> ;		PRIOR TO FORMATTING A DISKETTE, IF THERE EXISTS MORE THAN
   272                              <1> ;		ONE SUPPORTED MEDIA FORMAT TYPE WITHIN THE DRIVE IN QUESTION,
   273                              <1> ;		THEN "SET DASD TYPE" (INT 13H, AH = 17H) OR 'SET MEDIA TYPE'
   274                              <1> ;		(INT 13H, AH =  18H) MUST BE CALLED TO SET THE DISKETTE TYPE
   275                              <1> ;		THAT IS TO BE FORMATTED. IF "SET DASD TYPE" OR "SET MEDIA TYPE"
   276                              <1> ;		IS NOT CALLED, THE FORMAT ROUTINE WILL ASSUME THE 
   277                              <1> ;		MEDIA FORMAT TO BE THE MAXIMUM CAPACITY OF THE DRIVE.
   278                              <1> ;
   279                              <1> ;		THESE PARAMETERS OF DISK BASE MUST BE CHANGED IN ORDER TO
   280                              <1> ;		FORMAT THE FOLLOWING MEDIAS:
   281                              <1> ;		---------------------------------------------
   282                              <1> ;		: MEDIA  :     DRIVE      : PARM 1 : PARM 2 :
   283                              <1> ;		---------------------------------------------
   284                              <1> ;		: 320K	 : 320K/360K/1.2M :  50H   :   8    :
   285                              <1> ;		: 360K	 : 320K/360K/1.2M :  50H   :   9    :
   286                              <1> ;		: 1.2M	 : 1.2M           :  54H   :  15    :
   287                              <1> ;		: 720K	 : 720K/1.44M     :  50H   :   9    :
   288                              <1> ;		: 1.44M	 : 1.44M          :  6CH   :  18    :		  	
   289                              <1> ;		---------------------------------------------
   290                              <1> ;		NOTES: - PARM 1 = GAP LENGTH FOR FORMAT
   291                              <1> ;		       - PARM 2 = EOT (LAST SECTOR ON TRACK)
   292                              <1> ;		       - DISK BASE IS POINTED BY DISK POINTER LOCATED
   293                              <1> ;			 AT ABSOLUTE ADDRESS 0:78.
   294                              <1> ;		       - WHEN FORMAT OPERATIONS ARE COMPLETE, THE PARAMETERS
   295                              <1> ;			 SHOULD BE RESTORED TO THEIR RESPECTIVE INITIAL VALUES.			
   296                              <1> ;-------------------------------------------------------------------------------
   297                              <1> ;	(AH) = 08H READ DRIVE PARAMETERS
   298                              <1> ;	REGISTERS
   299                              <1> ;	  INPUT
   300                              <1> ;	    (DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED)
   301                              <1> ;	     ** 27/05/2016 - TRDOS 386 (TRDOS v2.0) **	
   302                              <1> ;            ** EBX = Buffer address for floppy disk parameters table **
   303                              <1> ;	  OUTPUT
   304                              <1> ;	    (ES:DI) POINTS TO DRIVE PARAMETER TABLE
   305                              <1> ; 	    *** TRDOS 386 note: floppy disk parameter table (16 bytes)
   306                              <1> ;	    will be returned to user in EBX, buffer address *** 27/05/2016 ***		
   307                              <1> ;					
   308                              <1> ;	    (CH) - LOW ORDER 8 OF 10 BITS MAXIMUM NUMBER OF TRACKS
   309                              <1> ;	    (CL) - BITS 7 & 6 - HIGH ORDER TWO BITS OF MAXIMUM TRACKS
   310                              <1> ;	           BITS 5 THRU 0 - MAXIMUM SECTORS PER TRACK
   311                              <1> ;	    (DH) - MAXIMUM HEAD NUMBER
   312                              <1> ;	    (DL) - NUMBER OF DISKETTE DRIVES INSTALLED
   313                              <1> ;	    (BH) - 0
   314                              <1> ;	    (BL) - BITS 7 THRU 4 - 0
   315                              <1> ;	           BITS 3 THRU 0 - VALID DRIVE TYPE VALUE IN CMOS
   316                              <1> ;	    (AX) - 0
   317                              <1> ;	 UNDER THE FOLLOWING CIRCUMSTANCES:
   318                              <1> ;	    (1) THE DRIVE NUMBER IS INVALID,
   319                              <1> ;	    (2) THE DRIVE TYPE IS UNKNOWN AND CMOS IS NOT PRESENT, 
   320                              <1> ;	    (3) THE DRIVE TYPE IS UNKNOWN AND CMOS IS BAD,
   321                              <1> ;	    (4) OR THE DRIVE TYPE IS UNKNOWN AND THE CMOS DRIVE TYPE IS INVALID
   322                              <1> ;	    THEN ES,AX,BX,CX,DH,DI=0 ; DL=NUMBER OF DRIVES. 
   323                              <1> ;	    IF NO DRIVES ARE PRESENT THEN: ES,AX,BX,CX,DX,DI=0.
   324                              <1> ;	    @DISKETTE_STATUS = 0 AND CY IS RESET.
   325                              <1> ;-------------------------------------------------------------------------------
   326                              <1> ;	(AH)= 15H  READ DASD TYPE
   327                              <1> ;	OUTPUT REGISTERS
   328                              <1> ;	(AH) - ON RETURN IF CARRY FLAG NOT SET, OTHERWISE ERROR	
   329                              <1> ;		00 - DRIVE NOT PRESENT	
   330                              <1> ;		01 - DISKETTE, NO CHANGE LINE AVAILABLE
   331                              <1> ;		02 - DISKETTE, CHANGE LINE AVAILABLE	
   332                              <1> ;		03 - RESERVED (FIXED DISK)
   333                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED)
   334                              <1> ;-------------------------------------------------------------------------------
   335                              <1> ;	(AH)= 16H  DISK CHANGE LINE STATUS
   336                              <1> ;	OUTPUT REGISTERS
   337                              <1> ;	(AH) - 00 - DISK CHANGE LINE NOT ACTIVE	
   338                              <1> ;	       06 - DISK CHANGE LINE ACTIVE & CARRY BIT ON
   339                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED)
   340                              <1> ;-------------------------------------------------------------------------------
   341                              <1> ;	(AH)= 17H  SET DASD TYPE FOR FORMAT
   342                              <1> ;	INPUT REGISTERS
   343                              <1> ;	(AL) -	00 - NOT USED	
   344                              <1> ;		01 - DISKETTE 320/360K IN 360K DRIVE	
   345                              <1> ;		02 - DISKETTE 360K IN 1.2M DRIVE
   346                              <1> ;		03 - DISKETTE 1.2M IN 1.2M DRIVE
   347                              <1> ;		04 - DISKETTE 720K IN 720K DRIVE
   348                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED:
   349                              <1> ;	       (DO NOT USE WHEN DISKETTE ATTACH CARD USED)
   350                              <1> ;-------------------------------------------------------------------------------
   351                              <1> ;	(AH)= 18H  SET MEDIA TYPE FOR FORMAT
   352                              <1> ;	INPUT REGISTERS
   353                              <1> ;	(CH) - LOW ORDER 8 OF 10 BITS MAXIMUM TRACKS
   354                              <1> ;	(CL) - BITS 7 & 6 - HIGH ORDER TWO BITS OF MAXIMUM TRACKS
   355                              <1> ;	       BITS 5 THRU 0 - MAXIMUM SECTORS PER TRACK
   356                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHACKED)
   357                              <1> ;	OUTPUT REGISTERS:
   358                              <1> ;	(ES:DI) - POINTER TO DRIVE PARAMETERS TABLE FOR THIS MEDIA TYPE,
   359                              <1> ;		  UNCHANGED IF (AH) IS NON-ZERO
   360                              <1> ;	(AH) - 00H, CY = 0, TRACK AND SECTORS/TRACK COMBINATION IS SUPPORTED
   361                              <1> ;	     - 01H, CY = 1, FUNCTION IS NOT AVAILABLE
   362                              <1> ;	     - 0CH, CY = 1, TRACK AND SECTORS/TRACK COMBINATION IS NOT SUPPORTED
   363                              <1> ;	     - 80H, CY = 1, TIME OUT (DISKETTE NOT PRESENT)		
   364                              <1> ;-------------------------------------------------------------------------------
   365                              <1> ;	DISK CHANGE STATUS IS ONLY CHECKED WHEN A MEDIA SPECIFIED IS OTHER
   366                              <1> ;	THAN 360 KB DRIVE. IF THE DISK CHANGE LINE IS FOUND TO BE
   367                              <1> ;	ACTIVE THE FOLLOWING ACTIONS TAKE PLACE:
   368                              <1> ;		ATTEMPT TO RESET DISK CHANGE LINE TO INACTIVE STATE. 
   369                              <1> ;		IF ATTEMPT SUCCEEDS SET DASD TYPE FOR FORMAT AND RETURN DISK 
   370                              <1> ;		CHANGE ERROR CODE
   371                              <1> ;		IF ATTEMPT FAILS RETURN TIMEOUT ERROR CODE AND SET DASD TYPE 
   372                              <1> ;		TO A PREDETERMINED STATE INDICATING MEDIA TYPE UNKNOWN.
   373                              <1> ;	IF THE DISK CHANGE LINE IN INACTIVE PERFORM SET DASD TYPE FOR FORMAT.
   374                              <1> ;
   375                              <1> ; DATA VARIABLE -- @DISK_POINTER
   376                              <1> ;	DOUBLE WORD POINTER TO THE CURRENT SET OF DISKETTE PARAMETERS
   377                              <1> ;-------------------------------------------------------------------------------
   378                              <1> ; OUTPUT FOR ALL FUNCTIONS
   379                              <1> ;	AH = STATUS OF OPERATION
   380                              <1> ;		STATUS BITS ARE DEFINED IN THE EQUATES FOR @DISKETTE_STATUS
   381                              <1> ;		VARIABLE IN THE DATA SEGMENT OF THIS MODULE
   382                              <1> ;	CY = 0	SUCCESSFUL OPERATION (AH=0 ON RETURN, EXCEPT FOR READ DASD
   383                              <1> ;		TYPE AH=(15)).
   384                              <1> ;	CY = 1	FAILED OPERATION (AH HAS ERROR REASON)
   385                              <1> ;	FOR READ/WRITE/VERIFY
   386                              <1> ;		DS,BX,DX,CX PRESERVED
   387                              <1> ;	NOTE: IF AN ERROR IS REPORTED BY THE DISKETTE CODE, THE APPROPRIATE 
   388                              <1> ;		ACTION IS TO RESET THE DISKETTE, THEN RETRY THE OPERATION.
   389                              <1> ;		ON READ ACCESSES, NO MOTOR START DELAY IS TAKEN, SO THAT 
   390                              <1> ;		THREE RETRIES ARE REQUIRED ON READS TO ENSURE THAT THE 
   391                              <1> ;		PROBLEM IS NOT DUE TO MOTOR START-UP.
   392                              <1> ;-------------------------------------------------------------------------------
   393                              <1> ;
   394                              <1> ; DISKETTE STATE MACHINE - ABSOLUTE ADDRESS 40:90 (DRIVE A) & 91 (DRIVE B)
   395                              <1> ;
   396                              <1> ;   -----------------------------------------------------------------
   397                              <1> ;   |       |       |       |       |       |       |       |       |
   398                              <1> ;   |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   |
   399                              <1> ;   |       |       |       |       |       |       |       |       |
   400                              <1> ;   -----------------------------------------------------------------
   401                              <1> ;	|	|	|	|	|	|	|	|
   402                              <1> ;	|	|	|	|	|	-----------------
   403                              <1> ;	|	|	|	|	|		|
   404                              <1> ;	|	|	|	|    RESERVED		|
   405                              <1> ;	|	|	|	|		  PRESENT STATE
   406                              <1> ;	|	|	|	|	000: 360K IN 360K DRIVE UNESTABLISHED
   407                              <1> ;	|	|	|	|	001: 360K IN 1.2M DRIVE UNESTABLISHED
   408                              <1> ;	|	|	|	|	010: 1.2M IN 1.2M DRIVE UNESTABLISHED
   409                              <1> ;	|	|	|	|	011: 360K IN 360K DRIVE ESTABLISHED
   410                              <1> ;	|	|	|	|	100: 360K IN 1.2M DRIVE ESTABLISHED
   411                              <1> ;	|	|	|	|	101: 1.2M IN 1.2M DRIVE ESTABLISHED
   412                              <1> ;	|	|	|	|	110: RESERVED
   413                              <1> ;	|	|	|	|	111: NONE OF THE ABOVE
   414                              <1> ;	|	|	|	|
   415                              <1> ;	|	|	|	------>	MEDIA/DRIVE ESTABLISHED
   416                              <1> ;	|	|	|
   417                              <1> ;	|	|	-------------->	DOUBLE STEPPING REQUIRED (360K IN 1.2M
   418                              <1> ;	|	|			DRIVE)
   419                              <1> ;	|	|
   420                              <1> ;	------------------------------>	DATA TRANSFER RATE FOR THIS DRIVE:
   421                              <1> ;
   422                              <1> ;						00: 500 KBS
   423                              <1> ;						01: 300 KBS
   424                              <1> ;						10: 250 KBS
   425                              <1> ;						11: RESERVED
   426                              <1> ;
   427                              <1> ;
   428                              <1> ;-------------------------------------------------------------------------------
   429                              <1> ; STATE OPERATION STARTED - ABSOLUTE ADDRESS 40:92 (DRIVE A) & 93 (DRIVE B)
   430                              <1> ;-------------------------------------------------------------------------------
   431                              <1> ; PRESENT CYLINDER NUMBER - ABSOLUTE ADDRESS 40:94 (DRIVE A) & 95 (DRIVE B)
   432                              <1> ;-------------------------------------------------------------------------------
   433                              <1> 
   434                              <1> struc MD
   435 00000000 <res 00000001>      <1> 	.SPEC1		resb	1	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   436 00000001 <res 00000001>      <1> 	.SPEC2		resb	1	; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   437 00000002 <res 00000001>      <1> 	.OFF_TIM	resb	1	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   438 00000003 <res 00000001>      <1> 	.BYT_SEC	resb	1	; 512 BYTES/SECTOR
   439 00000004 <res 00000001>      <1> 	.SEC_TRK	resb	1	; EOT (LAST SECTOR ON TRACK)
   440 00000005 <res 00000001>      <1> 	.GAP		resb	1	; GAP LENGTH
   441 00000006 <res 00000001>      <1> 	.DTL		resb	1	; DTL
   442 00000007 <res 00000001>      <1> 	.GAP3		resb	1	; GAP LENGTH FOR FORMAT
   443 00000008 <res 00000001>      <1> 	.FIL_BYT	resb	1	; FILL BYTE FOR FORMAT
   444 00000009 <res 00000001>      <1> 	.HD_TIM		resb	1	; HEAD SETTLE TIME (MILLISECONDS)
   445 0000000A <res 00000001>      <1> 	.STR_TIM	resb	1	; MOTOR START TIME (1/8 SECONDS)
   446 0000000B <res 00000001>      <1> 	.MAX_TRK	resb	1	; MAX. TRACK NUMBER
   447 0000000C <res 00000001>      <1> 	.RATE		resb	1	; DATA TRANSFER RATE
   448                              <1> endstruc
   449                              <1> 
   450                              <1> BIT7OFF	EQU	7FH
   451                              <1> BIT7ON	EQU	80H
   452                              <1> 
   453                              <1> ;;int13h: ; 16/02/2015
   454                              <1> ;; 16/02/2015 - 21/02/2015
   455                              <1> int40h:
   456 000032F9 9C                  <1> 	pushfd
   457 000032FA 0E                  <1> 	push 	cs
   458 000032FB E801000000          <1> 	call 	DISKETTE_IO_1
   459 00003300 C3                  <1> 	retn	
   460                              <1> 
   461                              <1> DISKETTE_IO_1:
   462                              <1> 
   463 00003301 FB                  <1> 	STI				; INTERRUPTS BACK ON
   464 00003302 55                  <1> 	PUSH	eBP			; USER REGISTER
   465 00003303 57                  <1> 	PUSH	eDI			; USER REGISTER
   466 00003304 52                  <1> 	PUSH	eDX			; HEAD #, DRIVE # OR USER REGISTER
   467 00003305 53                  <1> 	PUSH	eBX			; BUFFER OFFSET PARAMETER OR REGISTER
   468 00003306 51                  <1> 	PUSH	eCX			; TRACK #-SECTOR # OR USER REGISTER
   469 00003307 89E5                <1> 	MOV	eBP,eSP			; BP     => PARAMETER LIST DEP. ON AH
   470                              <1> 					; [BP]   = SECTOR #
   471                              <1> 					; [BP+1] = TRACK #
   472                              <1> 					; [BP+2] = BUFFER OFFSET
   473                              <1> 					; FOR RETURN OF DRIVE PARAMETERS:
   474                              <1> 					; CL/[BP] = BITS 7&6 HI BITS OF MAX CYL
   475                              <1> 					; 	    BITS 0-5 MAX SECTORS/TRACK
   476                              <1> 					; CH/[BP+1] = LOW 8 BITS OF MAX CYL.
   477                              <1> 					; BL/[BP+2] = BITS 7-4 = 0
   478                              <1> 					;	      BITS 3-0 = VALID CMOS TYPE
   479                              <1> 					; BH/[BP+3] = 0
   480                              <1> 					; DL/[BP+4] = # DRIVES INSTALLED
   481                              <1> 					; DH/[BP+5] = MAX HEAD #
   482                              <1> 					; DI/[BP+6] = OFFSET TO DISK BASE
   483 00003309 06                  <1> 	push	es ; 06/02/2015	
   484 0000330A 1E                  <1> 	PUSH	DS			; BUFFER SEGMENT PARM OR USER REGISTER
   485 0000330B 56                  <1> 	PUSH	eSI			; USER REGISTERS
   486                              <1> 	;CALL	DDS			; SEGMENT OF BIOS DATA AREA TO DS
   487                              <1> 	;mov	cx, cs
   488                              <1> 	;mov	ds, cx
   489 0000330C 66B91000            <1> 	mov	cx, KDATA
   490 00003310 8ED9                <1>         mov     ds, cx
   491 00003312 8EC1                <1>         mov     es, cx
   492                              <1> 
   493                              <1> 	;CMP	AH,(FNC_TAE-FNC_TAB)/2	; CHECK FOR > LARGEST FUNCTION
   494 00003314 80FC19              <1> 	cmp	ah,(FNC_TAE-FNC_TAB)/4  ; 18/02/2015
   495 00003317 7202                <1> 	JB	short OK_FUNC		; FUNCTION OK
   496 00003319 B414                <1> 	MOV	AH,14H			; REPLACE WITH KNOWN INVALID FUNCTION
   497                              <1> OK_FUNC:
   498 0000331B 80FC01              <1> 	CMP	AH,1			; RESET OR STATUS ?
   499 0000331E 760C                <1> 	JBE	short OK_DRV		; IF RESET OR STATUS DRIVE ALWAYS OK
   500 00003320 80FC08              <1> 	CMP	AH,8			; READ DRIVE PARMS ?
   501 00003323 7407                <1> 	JZ	short OK_DRV		; IF SO DRIVE CHECKED LATER
   502 00003325 80FA01              <1> 	CMP	DL,1			; DRIVES 0 AND 1 OK
   503 00003328 7602                <1> 	JBE	short OK_DRV		; IF 0 OR 1 THEN JUMP
   504 0000332A B414                <1> 	MOV	AH,14H			; REPLACE WITH KNOWN INVALID FUNCTION
   505                              <1> OK_DRV:
   506 0000332C 31C9                <1> 	xor	ecx, ecx
   507                              <1> 	;mov	esi, ecx ; 08/02/2015
   508 0000332E 89CF                <1> 	mov	edi, ecx ; 08/02/2015
   509 00003330 88E1                <1> 	MOV	CL,AH			; CL = FUNCTION
   510                              <1> 	;XOR	CH,CH			; CX = FUNCTION
   511                              <1> 	;SHL	CL, 1			; FUNCTION TIMES 2
   512 00003332 C0E102              <1> 	SHL	CL, 2 ; 20/02/2015	; FUNCTION TIMES 4 (for 32 bit offset)
   513 00003335 BB[6D330000]        <1> 	MOV	eBX,FNC_TAB		; LOAD START OF FUNCTION TABLE
   514 0000333A 01CB                <1> 	ADD	eBX,eCX			; ADD OFFSET INTO TABLE => ROUTINE
   515 0000333C 88F4                <1> 	MOV	AH,DH			; AX = HEAD #,# OF SECTORS OR DASD TYPE
   516 0000333E 30F6                <1> 	XOR	DH,DH			; DX = DRIVE #
   517 00003340 6689C6              <1> 	MOV	SI,AX			; SI = HEAD #,# OF SECTORS OR DASD TYPE
   518 00003343 6689D7              <1> 	MOV     DI,DX                   ; DI = DRIVE #
   519                              <1> 	;
   520                              <1> 	; 11/12/2014
   521 00003346 8815[F3FB0000]      <1>         mov     [cfd], dl               ; current floppy drive (for 'GET_PARM')        
   522                              <1> 	;
   523 0000334C 8A25[68310100]      <1> 	MOV	AH, [DSKETTE_STATUS]	; LOAD STATUS TO AH FOR STATUS FUNCTION
   524 00003352 C605[68310100]00    <1> 	MOV	byte [DSKETTE_STATUS],0	; INITIALIZE FOR ALL OTHERS
   525                              <1> 
   526                              <1> ;	THROUGHOUT THE DISKETTE BIOS, THE FOLLOWING INFORMATION IS CONTAINED IN
   527                              <1> ;	THE FOLLOWING MEMORY LOCATIONS AND REGISTERS. NOT ALL DISKETTE BIOS
   528                              <1> ;	FUNCTIONS REQUIRE ALL OF THESE PARAMETERS.
   529                              <1> ;
   530                              <1> ;		DI	: DRIVE #
   531                              <1> ;		SI-HI	: HEAD #
   532                              <1> ;		SI-LOW	: # OF SECTORS OR DASD TYPE FOR FORMAT
   533                              <1> ;		ES	: BUFFER SEGMENT
   534                              <1> ;		[BP]	: SECTOR #
   535                              <1> ;		[BP+1]	: TRACK #
   536                              <1> ;		[BP+2]	: BUFFER OFFSET
   537                              <1> ;
   538                              <1> ;	ACROSS CALLS TO SUBROUTINES THE CARRY FLAG (CY=1), WHERE INDICATED IN 
   539                              <1> ;	SUBROUTINE PROLOGUES, REPRESENTS AN EXCEPTION RETURN (NORMALLY AN ERROR 
   540                              <1> ;	CONDITION). IN MOST CASES, WHEN CY = 1, @DSKETTE_STATUS CONTAINS THE 
   541                              <1> ;	SPECIFIC ERROR CODE.
   542                              <1> ;
   543                              <1> 					; (AH) = @DSKETTE_STATUS
   544 00003359 FF13                <1> 	CALL	dWORD [eBX]		; CALL THE REQUESTED FUNCTION
   545 0000335B 5E                  <1> 	POP	eSI			; RESTORE ALL REGISTERS
   546 0000335C 1F                  <1> 	POP	DS
   547 0000335D 07                  <1> 	pop	es	; 06/02/2015
   548 0000335E 59                  <1> 	POP	eCX
   549 0000335F 5B                  <1> 	POP	eBX
   550 00003360 5A                  <1> 	POP	eDX
   551 00003361 5F                  <1> 	POP	eDI
   552 00003362 89E5                <1> 	MOV	eBP, eSP
   553 00003364 50                  <1> 	PUSH	eAX
   554 00003365 9C                  <1> 	PUSHFd
   555 00003366 58                  <1> 	POP	eAX
   556                              <1> 	;MOV	[BP+6], AX
   557 00003367 89450C              <1> 	mov	[ebp+12], eax  ; 18/02/2015, flags
   558 0000336A 58                  <1> 	POP	eAX
   559 0000336B 5D                  <1> 	POP	eBP
   560 0000336C CF                  <1> 	IRETd
   561                              <1> 
   562                              <1> ;-------------------------------------------------------------------------------
   563                              <1> ; DW --> dd (06/02/2015)
   564 0000336D [D1330000]          <1> FNC_TAB	dd	DSK_RESET		; AH = 00H; RESET
   565 00003371 [4A340000]          <1> 	dd	DSK_STATUS		; AH = 01H; STATUS
   566 00003375 [5B340000]          <1> 	dd	DSK_READ		; AH = 02H; READ
   567 00003379 [6C340000]          <1> 	dd	DSK_WRITE		; AH = 03H; WRITE
   568 0000337D [7D340000]          <1> 	dd	DSK_VERF		; AH = 04H; VERIFY
   569 00003381 [8E340000]          <1> 	dd	DSK_FORMAT		; AH = 05H; FORMAT
   570 00003385 [13350000]          <1> 	dd	FNC_ERR			; AH = 06H; INVALID
   571 00003389 [13350000]          <1> 	dd	FNC_ERR			; AH = 07H; INVALID
   572 0000338D [20350000]          <1> 	dd	DSK_PARMS		; AH = 08H; READ DRIVE PARAMETERS
   573 00003391 [13350000]          <1> 	dd	FNC_ERR			; AH = 09H; INVALID
   574 00003395 [13350000]          <1> 	dd	FNC_ERR			; AH = 0AH; INVALID
   575 00003399 [13350000]          <1> 	dd	FNC_ERR			; AH = 0BH; INVALID
   576 0000339D [13350000]          <1> 	dd	FNC_ERR			; AH = 0CH; INVALID
   577 000033A1 [13350000]          <1> 	dd	FNC_ERR			; AH = 0DH; INVALID
   578 000033A5 [13350000]          <1> 	dd	FNC_ERR			; AH = 0EH; INVALID
   579 000033A9 [13350000]          <1> 	dd	FNC_ERR			; AH = 0FH; INVALID
   580 000033AD [13350000]          <1> 	dd	FNC_ERR			; AH = 10H; INVALID
   581 000033B1 [13350000]          <1> 	dd	FNC_ERR			; AH = 11H; INVALID
   582 000033B5 [13350000]          <1> 	dd	FNC_ERR			; AH = 12H; INVALID
   583 000033B9 [13350000]          <1> 	dd	FNC_ERR			; AH = 13H; INVALID
   584 000033BD [13350000]          <1> 	dd	FNC_ERR			; AH = 14H; INVALID
   585 000033C1 [F8350000]          <1> 	dd	DSK_TYPE		; AH = 15H; READ DASD TYPE
   586 000033C5 [23360000]          <1> 	dd	DSK_CHANGE		; AH = 16H; CHANGE STATUS
   587 000033C9 [5D360000]          <1> 	dd	FORMAT_SET		; AH = 17H; SET DASD TYPE
   588 000033CD [E0360000]          <1> 	dd	SET_MEDIA		; AH = 18H; SET MEDIA TYPE	
   589                              <1> FNC_TAE EQU     $                       ; END
   590                              <1> 
   591                              <1> ;-------------------------------------------------------------------------------
   592                              <1> ; DISK_RESET	(AH = 00H)	
   593                              <1> ;		RESET THE DISKETTE SYSTEM.
   594                              <1> ;
   595                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   596                              <1> ;-------------------------------------------------------------------------------
   597                              <1> DSK_RESET:
   598 000033D1 66BAF203            <1> 	MOV	DX,03F2H		; ADAPTER CONTROL PORT
   599 000033D5 FA                  <1> 	CLI				; NO INTERRUPTS
   600 000033D6 A0[66310100]        <1> 	MOV	AL,[MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
   601 000033DB 243F                <1> 	AND	AL,00111111B		; KEEP SELECTED AND MOTOR ON BITS
   602 000033DD C0C004              <1> 	ROL	AL,4			; MOTOR VALUE TO HIGH NIBBLE
   603                              <1> 					; DRIVE SELECT TO LOW NIBBLE
   604 000033E0 0C08                <1> 	OR	AL,00001000B		; TURN ON INTERRUPT ENABLE
   605 000033E2 EE                  <1> 	OUT	DX,AL			; RESET THE ADAPTER
   606 000033E3 C605[65310100]00    <1> 	MOV	byte [SEEK_STATUS],0	; SET RECALIBRATE REQUIRED ON ALL DRIVES
   607                              <1> 	;JMP	$+2			; WAIT FOR I/O
   608                              <1> 	;JMP	$+2			; WAIT FOR I/O (TO INSURE MINIMUM
   609                              <1> 					;      PULSE WIDTH)
   610                              <1> 	; 19/12/2014
   611                              <1> 	NEWIODELAY
   611 000033EA E6EB                <2>  out 0ebh,al
   612                              <1> 
   613                              <1> 	; 17/12/2014 
   614                              <1> 	; AWARD BIOS 1999 - RESETDRIVES (ADISK.ASM)
   615 000033EC B915000000          <1> 	mov	ecx, WAITCPU_RESET_ON	; cx = 21 -- Min. 14 micro seconds !?
   616                              <1> wdw1:
   617                              <1> 	NEWIODELAY   ; 27/02/2015
   617 000033F1 E6EB                <2>  out 0ebh,al
   618 000033F3 E2FC                <1> 	loop	wdw1
   619                              <1> 	;
   620 000033F5 0C04                <1> 	OR	AL,00000100B		; TURN OFF RESET BIT
   621 000033F7 EE                  <1> 	OUT	DX,AL			; RESET THE ADAPTER
   622                              <1> 	; 16/12/2014
   623                              <1> 	IODELAY
   623 000033F8 EB00                <2>  jmp short $+2
   623 000033FA EB00                <2>  jmp short $+2
   624                              <1> 	;
   625                              <1> 	;STI				; ENABLE THE INTERRUPTS
   626 000033FC E83C0C0000          <1> 	CALL	WAIT_INT		; WAIT FOR THE INTERRUPT
   627 00003401 723E                <1> 	JC	short DR_ERR		; IF ERROR, RETURN IT
   628 00003403 66B9C000            <1> 	MOV	CX,11000000B		; CL = EXPECTED @NEC_STATUS
   629                              <1> NXT_DRV:
   630 00003407 6651                <1> 	PUSH	CX			; SAVE FOR CALL
   631 00003409 B8[3F340000]        <1> 	MOV	eAX, DR_POP_ERR 	; LOAD NEC_OUTPUT ERROR ADDRESS
   632 0000340E 50                  <1> 	PUSH	eAX			; "
   633 0000340F B408                <1> 	MOV	AH,08H			; SENSE INTERRUPT STATUS COMMAND
   634 00003411 E81A0B0000          <1> 	CALL	NEC_OUTPUT
   635 00003416 58                  <1> 	POP	eAX			; THROW AWAY ERROR RETURN
   636 00003417 E8510C0000          <1> 	CALL	RESULTS			; READ IN THE RESULTS
   637 0000341C 6659                <1> 	POP	CX			; RESTORE AFTER CALL
   638 0000341E 7221                <1> 	JC	short DR_ERR		; ERROR RETURN
   639 00003420 3A0D[69310100]      <1> 	CMP	CL, [NEC_STATUS]	; TEST FOR DRIVE READY TRANSITION
   640 00003426 7519                <1> 	JNZ	short DR_ERR		; EVERYTHING OK
   641 00003428 FEC1                <1> 	INC	CL			; NEXT EXPECTED @NEC_STATUS
   642 0000342A 80F9C3              <1> 	CMP	CL,11000011B		; ALL POSSIBLE DRIVES CLEARED
   643 0000342D 76D8                <1> 	JBE	short NXT_DRV		; FALL THRU IF 11000100B OR >
   644                              <1> 	;
   645 0000342F E869030000          <1> 	CALL	SEND_SPEC		; SEND SPECIFY COMMAND TO NEC
   646                              <1> RESBAC:
   647 00003434 E81D090000          <1> 	CALL	SETUP_END		; VARIOUS CLEANUPS
   648 00003439 6689F3              <1> 	MOV	BX,SI			; GET SAVED AL TO BL
   649 0000343C 88D8                <1> 	MOV	AL,BL			; PUT BACK FOR RETURN
   650 0000343E C3                  <1> 	RETn		
   651                              <1> DR_POP_ERR:
   652 0000343F 6659                <1> 	POP	CX			; CLEAR STACK
   653                              <1> DR_ERR:
   654 00003441 800D[68310100]20    <1> 	OR	byte [DSKETTE_STATUS],BAD_NEC ; SET ERROR CODE
   655 00003448 EBEA                <1> 	JMP	SHORT RESBAC		; RETURN FROM RESET
   656                              <1> 
   657                              <1> ;-------------------------------------------------------------------------------
   658                              <1> ; DISK_STATUS	(AH = 01H)
   659                              <1> ;	DISKETTE STATUS.
   660                              <1> ;
   661                              <1> ; ON ENTRY:	AH : STATUS OF PREVIOUS OPERATION
   662                              <1> ;
   663                              <1> ; ON EXIT:	AH, @DSKETTE_STATUS, CY REFLECT STATUS OF PREVIOUS OPERATION.
   664                              <1> ;-------------------------------------------------------------------------------
   665                              <1> DSK_STATUS:
   666 0000344A 8825[68310100]      <1> 	MOV	[DSKETTE_STATUS],AH	; PUT BACK FOR SETUP END
   667 00003450 E801090000          <1> 	CALL	SETUP_END		; VARIOUS CLEANUPS
   668 00003455 6689F3              <1> 	MOV	BX,SI			; GET SAVED AL TO BL
   669 00003458 88D8                <1> 	MOV	AL,BL			; PUT BACK FOR RETURN
   670 0000345A C3                  <1> 	RETn		
   671                              <1> 
   672                              <1> ;-------------------------------------------------------------------------------
   673                              <1> ; DISK_READ	(AH = 02H)	
   674                              <1> ;	DISKETTE READ.
   675                              <1> ;
   676                              <1> ; ON ENTRY:	DI	: DRIVE #
   677                              <1> ;		SI-HI	: HEAD #
   678                              <1> ;		SI-LOW	: # OF SECTORS
   679                              <1> ;		ES	: BUFFER SEGMENT
   680                              <1> ;		[BP]	: SECTOR #
   681                              <1> ;		[BP+1]	: TRACK #
   682                              <1> ;		[BP+2]	: BUFFER OFFSET
   683                              <1> ;
   684                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   685                              <1> ;-------------------------------------------------------------------------------
   686                              <1> 
   687                              <1> ; 06/02/2015, ES:BX -> EBX (unix386.s)
   688                              <1> 
   689                              <1> DSK_READ:
   690 0000345B 8025[66310100]7F    <1> 	AND	byte [MOTOR_STATUS],01111111B ; INDICATE A READ OPERATION
   691 00003462 66B846E6            <1> 	MOV	AX,0E646H		; AX = NEC COMMAND, DMA COMMAND
   692 00003466 E83C040000          <1> 	CALL	RD_WR_VF		; COMMON READ/WRITE/VERIFY
   693 0000346B C3                  <1> 	RETn
   694                              <1> 
   695                              <1> ;-------------------------------------------------------------------------------
   696                              <1> ; DISK_WRITE	(AH = 03H)
   697                              <1> ;	DISKETTE WRITE.
   698                              <1> ;
   699                              <1> ; ON ENTRY:	DI	: DRIVE #
   700                              <1> ;		SI-HI	: HEAD #
   701                              <1> ;		SI-LOW	: # OF SECTORS
   702                              <1> ;		ES	: BUFFER SEGMENT
   703                              <1> ;		[BP]	: SECTOR #
   704                              <1> ;		[BP+1]	: TRACK #
   705                              <1> ;		[BP+2]	: BUFFER OFFSET
   706                              <1> ;
   707                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   708                              <1> ;-------------------------------------------------------------------------------
   709                              <1> 
   710                              <1> ; 06/02/2015, ES:BX -> EBX (unix386.s)
   711                              <1> 
   712                              <1> DSK_WRITE:
   713 0000346C 66B84AC5            <1> 	MOV	AX,0C54AH		; AX = NEC COMMAND, DMA COMMAND
   714 00003470 800D[66310100]80    <1>         OR      byte [MOTOR_STATUS],10000000B ; INDICATE WRITE OPERATION
   715 00003477 E82B040000          <1> 	CALL	RD_WR_VF		; COMMON READ/WRITE/VERIFY
   716 0000347C C3                  <1> 	RETn
   717                              <1> 
   718                              <1> ;-------------------------------------------------------------------------------
   719                              <1> ; DISK_VERF	(AH = 04H)
   720                              <1> ;	DISKETTE VERIFY.
   721                              <1> ;
   722                              <1> ; ON ENTRY:	DI	: DRIVE #
   723                              <1> ;		SI-HI	: HEAD #
   724                              <1> ;		SI-LOW	: # OF SECTORS
   725                              <1> ;		ES	: BUFFER SEGMENT
   726                              <1> ;		[BP]	: SECTOR #
   727                              <1> ;		[BP+1]	: TRACK #
   728                              <1> ;		[BP+2]	: BUFFER OFFSET
   729                              <1> ;
   730                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   731                              <1> ;-------------------------------------------------------------------------------
   732                              <1> DSK_VERF:
   733 0000347D 8025[66310100]7F    <1> 	AND	byte [MOTOR_STATUS],01111111B ; INDICATE A READ OPERATION
   734 00003484 66B842E6            <1> 	MOV	AX,0E642H		; AX = NEC COMMAND, DMA COMMAND
   735 00003488 E81A040000          <1> 	CALL	RD_WR_VF		; COMMON READ/WRITE/VERIFY
   736 0000348D C3                  <1> 	RETn
   737                              <1> 
   738                              <1> ;-------------------------------------------------------------------------------
   739                              <1> ; DISK_FORMAT	(AH = 05H)
   740                              <1> ;	DISKETTE FORMAT.
   741                              <1> ;
   742                              <1> ; ON ENTRY:	DI	: DRIVE #
   743                              <1> ;		SI-HI	: HEAD #
   744                              <1> ;		SI-LOW	: # OF SECTORS
   745                              <1> ;		ES	: BUFFER SEGMENT
   746                              <1> ;		[BP]	: SECTOR #
   747                              <1> ;		[BP+1]	: TRACK #
   748                              <1> ;		[BP+2]	: BUFFER OFFSET
   749                              <1> ;		@DISK_POINTER POINTS TO THE PARAMETER TABLE OF THIS DRIVE
   750                              <1> ;
   751                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   752                              <1> ;-------------------------------------------------------------------------------
   753                              <1> DSK_FORMAT:
   754 0000348E E853030000          <1> 	CALL	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
   755 00003493 E84F050000          <1> 	CALL	FMT_INIT		; ESTABLISH STATE IF UNESTABLISHED
   756 00003498 800D[66310100]80    <1>         OR      byte [MOTOR_STATUS], 10000000B ; INDICATE WRITE OPERATION
   757 0000349F E897050000          <1> 	CALL	MED_CHANGE		; CHECK MEDIA CHANGE AND RESET IF SO
   758 000034A4 725D                <1>         JC      short FM_DON            ; MEDIA CHANGED, SKIP
   759 000034A6 E8F2020000          <1> 	CALL	SEND_SPEC		; SEND SPECIFY COMMAND TO NEC
   760 000034AB E8FD050000          <1> 	CALL	CHK_LASTRATE		; ZF=1 ATTEMPT RATE IS SAME AS LAST RATE
   761 000034B0 7405                <1>         JZ      short FM_WR             ; YES, SKIP SPECIFY COMMAND
   762 000034B2 E8D4050000          <1> 	CALL	SEND_RATE		; SEND DATA RATE TO CONTROLLER
   763                              <1> FM_WR:
   764 000034B7 E88A060000          <1> 	CALL	FMTDMA_SET		; SET UP THE DMA FOR FORMAT
   765 000034BC 7245                <1>         JC      short FM_DON            ; RETURN WITH ERROR
   766 000034BE B44D                <1> 	MOV	AH,04DH			; ESTABLISH THE FORMAT COMMAND
   767 000034C0 E8E7060000          <1> 	CALL	NEC_INIT		; INITIALIZE THE NEC
   768 000034C5 723C                <1>         JC      short FM_DON            ; ERROR - EXIT
   769 000034C7 B8[03350000]        <1>         MOV     eAX, FM_DON             ; LOAD ERROR ADDRESS
   770 000034CC 50                  <1> 	PUSH	eAX			; PUSH NEC_OUT ERROR RETURN
   771 000034CD B203                <1> 	MOV	DL,3			; BYTES/SECTOR VALUE TO NEC
   772 000034CF E856090000          <1> 	CALL	GET_PARM
   773 000034D4 E8570A0000          <1> 	CALL	NEC_OUTPUT
   774 000034D9 B204                <1> 	MOV	DL,4			; SECTORS/TRACK VALUE TO NEC
   775 000034DB E84A090000          <1> 	CALL	GET_PARM
   776 000034E0 E84B0A0000          <1> 	CALL	NEC_OUTPUT
   777 000034E5 B207                <1> 	MOV	DL,7			; GAP LENGTH VALUE TO NEC
   778 000034E7 E83E090000          <1> 	CALL	GET_PARM
   779 000034EC E83F0A0000          <1> 	CALL	NEC_OUTPUT
   780 000034F1 B208                <1> 	MOV	DL,8			; FILLER BYTE TO NEC
   781 000034F3 E832090000          <1> 	CALL	GET_PARM
   782 000034F8 E8330A0000          <1> 	CALL	NEC_OUTPUT
   783 000034FD 58                  <1> 	POP	eAX			; THROW AWAY ERROR
   784 000034FE E827070000          <1> 	CALL	NEC_TERM		; TERMINATE, RECEIVE STATUS, ETC,
   785                              <1> FM_DON:
   786 00003503 E80F030000          <1> 	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
   787 00003508 E849080000          <1> 	CALL	SETUP_END		; VARIOUS CLEANUPS
   788 0000350D 6689F3              <1> 	MOV	BX,SI			; GET SAVED AL TO BL
   789 00003510 88D8                <1> 	MOV	AL,BL			; PUT BACK FOR RETURN
   790 00003512 C3                  <1> 	RETn
   791                              <1> 
   792                              <1> ;-------------------------------------------------------------------------------
   793                              <1> ; FNC_ERR
   794                              <1> ;	INVALID FUNCTION REQUESTED OR INVALID DRIVE: 
   795                              <1> ;	SET BAD COMMAND IN STATUS.
   796                              <1> ;
   797                              <1> ; ON EXIT: 	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   798                              <1> ;-------------------------------------------------------------------------------
   799                              <1> FNC_ERR:				; INVALID FUNCTION REQUEST
   800 00003513 6689F0              <1> 	MOV	AX,SI			; RESTORE AL
   801 00003516 B401                <1> 	MOV	AH,BAD_CMD		; SET BAD COMMAND ERROR
   802 00003518 8825[68310100]      <1> 	MOV	[DSKETTE_STATUS],AH	; STORE IN DATA AREA
   803 0000351E F9                  <1> 	STC				; SET CARRY INDICATING ERROR
   804 0000351F C3                  <1> 	RETn
   805                              <1> 
   806                              <1> ; 01/06/2016
   807                              <1> ; 28/05/2016
   808                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v.2.0)
   809                              <1> ;-------------------------------------------------------------------------------
   810                              <1> ; DISK_PARMS	(AH = 08H)	
   811                              <1> ;	READ DRIVE PARAMETERS.
   812                              <1> ;
   813                              <1> ; ON ENTRY:	DI : DRIVE #
   814                              <1> ;		; 27/05/2016
   815                              <1> ;		EBX = Buffer Address for floppy disk parameters table (16 bytes)
   816                              <1> ;
   817                              <1> ; ON EXIT:	CL/[BP]   = BITS 7 & 6 HI 2 BITS OF MAX CYLINDER
   818                              <1> ;		            BITS 0-5 MAX SECTORS/TRACK
   819                              <1> ;		CH/[BP+1] = LOW 8 BITS OF MAX CYLINDER
   820                              <1> ;		BL/[BP+2] = BITS 7-4 = 0
   821                              <1> ;		            BITS 3-0 = VALID CMOS DRIVE TYPE
   822                              <1> ;		BH/[BP+3] = 0
   823                              <1> ;		DL/[BP+4] = # DRIVES INSTALLED (VALUE CHECKED)
   824                              <1> ;		DH/[BP+5] = MAX HEAD #
   825                              <1> ;	     ** 27/05/2016 - TRDOS 386 (TRDOS v2.0) **	
   826                              <1> ;            ** EBX = Buffer address for floppy disk parameters table **
   827                              <1> ;		;DI/[BP+6] = OFFSET TO DISK_BASE
   828                              <1> ;		;ES        = SEGMENT OF DISK_BASE
   829                              <1> ;
   830                              <1> ;		AX        = 0
   831                              <1> ;
   832                              <1> ;		NOTE : THE ABOVE INFORMATION IS STORED IN THE USERS STACK AT
   833                              <1> ;		       THE LOCATIONS WHERE THE MAIN ROUTINE WILL POP THEM
   834                              <1> ;		       INTO THE APPROPRIATE REGISTERS BEFORE RETURNING TO THE
   835                              <1> ;		       CALLER.
   836                              <1> ;-------------------------------------------------------------------------------
   837                              <1> DSK_PARMS:
   838 00003520 E8C1020000          <1> 	CALL	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH,
   839                              <1>      ;	MOV	WORD [BP+2],0		; DRIVE TYPE = 0
   840                              <1>      ;  MOV     AX, [EQUIP_FLAG]        ; LOAD EQUIPMENT FLAG FOR # DISKETTES
   841                              <1>      ;  AND     AL,11000001B            ; KEEP DISKETTE DRIVE BITS
   842                              <1>      ;  MOV     DL,2                    ; DISKETTE DRIVES = 2
   843                              <1>      ;  CMP     AL,01000001B            ; 2 DRIVES INSTALLED ?
   844                              <1>      ;  JZ      short STO_DL            ; IF YES JUMP
   845                              <1>      ;  DEC     DL                      ; DISKETTE DRIVES = 1
   846                              <1>      ;  CMP     AL,00000001B            ; 1 DRIVE INSTALLED ?
   847                              <1>      ;  JNZ     short NON_DRV           ; IF NO JUMP
   848 00003525 29D2                <1> 	sub	edx, edx
   849 00003527 66A1[04FC0000]      <1> 	mov     ax, [fd0_type]
   850 0000352D 6621C0              <1> 	and     ax, ax
   851 00003530 0F848A000000        <1>         jz      NON_DRV
   852 00003536 FEC2                <1> 	inc     dl
   853 00003538 20E4                <1> 	and     ah, ah
   854 0000353A 7402                <1> 	jz      short STO_DL
   855 0000353C FEC2                <1> 	inc     dl
   856                              <1> STO_DL:
   857                              <1> 	;MOV	[BP+4],DL		; STORE NUMBER OF DRIVES
   858 0000353E 895508              <1> 	mov	[ebp+8], edx ; 20/02/2015	 	
   859 00003541 6683FF01            <1> 	CMP	DI,1			; CHECK FOR VALID DRIVE
   860 00003545 777C                <1> 	JA	short NON_DRV1		; DRIVE INVALID
   861                              <1> 	;MOV	BYTE [BP+5],1		; MAXIMUM HEAD NUMBER =	1
   862 00003547 C6450901            <1> 	mov	byte [ebp+9], 1  ; 20/02/2015	
   863 0000354B E8D1080000          <1> 	CALL	CMOS_TYPE		; RETURN DRIVE TYPE IN AL
   864                              <1> 	;;20/02/2015
   865                              <1> 	;;JC	short CHK_EST		; IF CMOS BAD CHECKSUM ESTABLISHED
   866                              <1> 	;;OR	AL,AL			; TEST FOR NO DRIVE TYPE
   867 00003550 740F                <1> 	JZ	short CHK_EST		; JUMP IF SO
   868 00003552 E81B020000          <1> 	CALL	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
   869 00003557 7208                <1> 	JC	short CHK_EST		; TYPE NOT IN TABLE (POSSIBLE BAD CMOS)
   870                              <1> 	;MOV	[BP+2],AL		; STORE VALID CMOS DRIVE TYPE
   871                              <1>         ;mov	[ebp+4], al ; 06/02/2015
   872 00003559 8A4B04              <1> 	MOV     CL, [eBX+MD.SEC_TRK]     ; GET SECTOR/TRACK
   873 0000355C 8A6B0B              <1>         MOV     CH, [eBX+MD.MAX_TRK]     ; GET MAX. TRACK NUMBER
   874 0000355F EB36                <1> 	JMP	SHORT STO_CX		; CMOS GOOD, USE CMOS
   875                              <1> CHK_EST:
   876 00003561 8AA7[75310100]      <1> 	MOV	AH, [DSK_STATE+eDI]	; LOAD STATE FOR THIS DRIVE
   877 00003567 F6C410              <1> 	TEST	AH,MED_DET		; CHECK FOR ESTABLISHED STATE
   878 0000356A 7457                <1> 	JZ	short NON_DRV1		; CMOS BAD/INVALID OR UNESTABLISHED
   879                              <1> USE_EST:
   880 0000356C 80E4C0              <1> 	AND	AH,RATE_MSK		; ISOLATE STATE
   881 0000356F 80FC80              <1> 	CMP	AH,RATE_250		; RATE 250 ?
   882 00003572 7570                <1> 	JNE	short USE_EST2		; NO, GO CHECK OTHER RATE
   883                              <1> 
   884                              <1> ;-----	DATA RATE IS 250 KBS, TRY 360 KB TABLE FIRST
   885                              <1> 
   886 00003574 B001                <1> 	MOV	AL,01			; DRIVE TYPE 1 (360KB)
   887 00003576 E8F7010000          <1> 	CALL	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
   888 0000357B 8A4B04              <1>         MOV     CL, [eBX+MD.SEC_TRK]    ; GET SECTOR/TRACK
   889 0000357E 8A6B0B              <1>         MOV     CH, [eBX+MD.MAX_TRK]    ; GET MAX. TRACK NUMBER
   890 00003581 F687[75310100]01    <1> 	TEST	byte [DSK_STATE+eDI],TRK_CAPA ; 80 TRACK ?
   891 00003588 740D                <1> 	JZ	short STO_CX		; MUST BE 360KB DRIVE 
   892                              <1> 
   893                              <1> ;-----	IT IS 1.44 MB DRIVE
   894                              <1> 
   895                              <1> PARM144:
   896 0000358A B004                <1> 	MOV	AL,04			; DRIVE TYPE 4 (1.44MB)
   897 0000358C E8E1010000          <1> 	CALL	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
   898 00003591 8A4B04              <1>         MOV     CL, [eBX+MD.SEC_TRK]    ; GET SECTOR/TRACK
   899 00003594 8A6B0B              <1>         MOV     CH, [eBX+MD.MAX_TRK]    ; GET MAX. TRACK NUMBER
   900                              <1> STO_CX:
   901 00003597 894D00              <1> 	MOV	[eBP],eCX		; SAVE POINTER IN STACK FOR RETURN
   902                              <1> ES_DI:
   903                              <1> 	;MOV	[BP+6],BX		; ADDRESS OF MEDIA/DRIVE PARM TABLE 
   904                              <1> 	;mov	[ebp+12], ebx ; 06/02/2015
   905                              <1> 	;MOV	AX,CS			; SEGMENT MEDIA/DRIVE PARAMETER TABLE
   906                              <1> 	;MOV	ES,AX			; ES IS SEGMENT OF TABLE
   907                              <1> 	;
   908                              <1> 	; 28/05/2016
   909                              <1> 	; 27/05/2016
   910                              <1> 	; return floppy disk parameters table to user
   911                              <1> 	; in user's buffer, which is pointed by EBX
   912                              <1> 	;
   913 0000359A 57                  <1> 	push	edi
   914 0000359B 8B7D04              <1> 	mov	edi, [ebp+4]  		; ebx (input), user's buffer address
   915 0000359E 0FB6C0              <1> 	movzx	eax, al
   916 000035A1 894504              <1>         mov	[ebp+4], eax   ; ebx	; drive type (for floppy drives)
   917                              <1> 	; 01/06/2016 (INT 33h, disk type return for floppy disks, in BL)
   918 000035A4 A3[703E0100]        <1> 	mov	[user_buffer], eax	; 01/06/2016 (overwrite ebx return value)
   919                              <1> 	;(INT 33h, Function 08h will replace user's buffer addr with disk type!)
   920                              <1> 	;
   921 000035A9 89DE                <1> 	mov	esi, ebx 		; floppy disk parameter table (16 bytes)
   922 000035AB B910000000          <1> 	mov	ecx, 16 ; 16 bytes
   923 000035B0 E8C5A80000          <1>         call    transfer_to_user_buffer ; trdosk6.s (16/05/2016)
   924 000035B5 5F                  <1> 	pop	edi	
   925                              <1> DP_OUT:
   926 000035B6 E85C020000          <1> 	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
   927 000035BB 6631C0              <1> 	XOR	AX,AX			; CLEAR
   928 000035BE F8                  <1> 	CLC
   929 000035BF C3                  <1> 	RETn
   930                              <1> 
   931                              <1> ;-----	NO DRIYE PRESENT HANDLER
   932                              <1> 
   933                              <1> NON_DRV:
   934                              <1> 	;MOV	BYTE [BP+4],0		; CLEAR NUMBER OF DRIVES
   935 000035C0 895508              <1> 	mov	[ebp+8], edx ; 0 ; 20/02/2015
   936                              <1> NON_DRV1:
   937 000035C3 6681FF8000          <1> 	CMP	DI,80H			; CHECK FOR FIXED MEDIA TYPE REQUEST
   938 000035C8 720C                <1> 	JB	short NON_DRV2		; CONTINUE IF NOT REQUEST FALL THROUGH
   939                              <1> 
   940                              <1> ;-----	FIXED DISK REQUEST FALL THROUGH ERROR
   941                              <1> 	
   942 000035CA E848020000          <1> 	CALL	XLAT_OLD		; ELSE TRANSLATE TO COMPATIBLE MODE
   943 000035CF 6689F0              <1> 	MOV	AX,SI			; RESTORE AL
   944 000035D2 B401                <1> 	MOV	AH,BAD_CMD		; SET BAD COMMAND ERROR
   945 000035D4 F9                  <1> 	STC
   946 000035D5 C3                  <1> 	RETn
   947                              <1> 
   948                              <1> NON_DRV2:
   949                              <1> 	;XOR	AX,AX			; CLEAR PARMS IF NO DRIVES OR CMOS BAD
   950 000035D6 31C0                <1> 	xor	eax, eax	
   951 000035D8 66894500            <1> 	MOV	[eBP],AX		; TRACKS, SECTORS/TRACK = 0
   952                              <1> 	;MOV	[BP+5],AH		; HEAD = 0
   953 000035DC 886509              <1> 	mov	[ebp+9], ah ; 06/02/2015
   954                              <1> 	;MOV	[BP+6],AX		; OFFSET TO DISK_BASE = 0
   955 000035DF 89450C              <1> 	mov	[ebp+12], eax
   956                              <1> 	;MOV	ES,AX			; ES IS SEGMENT OF TABLE
   957 000035E2 EBD2                <1> 	JMP	SHORT DP_OUT
   958                              <1> 
   959                              <1> ;-----	DATA RATE IS EITHER 300 KBS OR 500 KBS, TRY 1.2 MB TABLE FIRST
   960                              <1> 
   961                              <1> USE_EST2:
   962 000035E4 B002                <1> 	MOV	AL,02			; DRIVE TYPE 2 (1.2MB)
   963 000035E6 E887010000          <1> 	CALL	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
   964 000035EB 8A4B04              <1>         MOV     CL, [eBX+MD.SEC_TRK]    ; GET SECTOR/TRACK
   965 000035EE 8A6B0B              <1>         MOV     CH, [eBX+MD.MAX_TRK]    ; GET MAX. TRACK NUMBER
   966 000035F1 80FC40              <1> 	CMP	AH,RATE_300		; RATE 300 ?
   967 000035F4 74A1                <1> 	JZ	short STO_CX		; MUST BE 1.2MB DRIVE
   968 000035F6 EB92                <1> 	JMP	SHORT PARM144		; ELSE, IT IS 1.44MB DRIVE 
   969                              <1> 
   970                              <1> ;-------------------------------------------------------------------------------
   971                              <1> ; DISK_TYPE (AH = 15H)	
   972                              <1> ;	THIS ROUTINE RETURNS THE TYPE OF MEDIA INSTALLED.
   973                              <1> ;
   974                              <1> ;  ON ENTRY:	DI = DRIVE #
   975                              <1> ;
   976                              <1> ;  ON EXIT:	AH = DRIVE TYPE, CY=0
   977                              <1> ;-------------------------------------------------------------------------------
   978                              <1> DSK_TYPE:
   979 000035F8 E8E9010000          <1> 	CALL	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
   980 000035FD 8A87[75310100]      <1> 	MOV	AL, [DSK_STATE+eDI]	; GET PRESENT STATE INFORMATION
   981 00003603 08C0                <1> 	OR	AL,AL			; CHECK FOR NO DRIVE
   982 00003605 7418                <1> 	JZ	short NO_DRV
   983 00003607 B401                <1> 	MOV	AH,NOCHGLN		; NO CHANGE LINE FOR 40 TRACK DRIVE
   984 00003609 A801                <1> 	TEST	AL,TRK_CAPA		; IS THIS DRIVE AN 80 TRACK DRIVE?
   985 0000360B 7402                <1> 	JZ	short DT_BACK			; IF NO JUMP
   986 0000360D B402                <1> 	MOV	AH,CHGLN		; CHANGE LINE FOR 80 TRACK DRIVE
   987                              <1> DT_BACK:
   988 0000360F 6650                <1> 	PUSH	AX			; SAVE RETURN VALUE
   989 00003611 E801020000          <1> 	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
   990 00003616 6658                <1> 	POP	AX			; RESTORE RETURN VALUE
   991 00003618 F8                  <1> 	CLC				; NO ERROR
   992 00003619 6689F3              <1> 	MOV	BX,SI			; GET SAVED AL TO BL
   993 0000361C 88D8                <1> 	MOV	AL,BL			; PUT BACK FOR RETURN
   994 0000361E C3                  <1> 	RETn
   995                              <1> NO_DRV:	
   996 0000361F 30E4                <1> 	XOR	AH,AH			; NO DRIVE PRESENT OR UNKNOWN
   997 00003621 EBEC                <1> 	JMP	SHORT DT_BACK
   998                              <1> 
   999                              <1> ;-------------------------------------------------------------------------------
  1000                              <1> ; DISK_CHANGE	(AH = 16H)
  1001                              <1> ;	THIS ROUTINE RETURNS THE STATE OF THE DISK CHANGE LINE.
  1002                              <1> ;
  1003                              <1> ; ON ENTRY:	DI = DRIVE #
  1004                              <1> ;
  1005                              <1> ; ON EXIT:	AH = @DSKETTE_STATUS
  1006                              <1> ;		     00 - DISK CHANGE LINE INACTIVE, CY = 0
  1007                              <1> ;		     06 - DISK CHANGE LINE ACTIVE, CY = 1
  1008                              <1> ;-------------------------------------------------------------------------------
  1009                              <1> DSK_CHANGE:
  1010 00003623 E8BE010000          <1> 	CALL	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1011 00003628 8A87[75310100]      <1> 	MOV	AL, [DSK_STATE+eDI]	; GET MEDIA STATE INFORMATION
  1012 0000362E 08C0                <1> 	OR	AL,AL			; DRIVE PRESENT ?
  1013 00003630 7422                <1> 	JZ	short DC_NON		; JUMP IF NO DRIVE
  1014 00003632 A801                <1> 	TEST	AL,TRK_CAPA		; 80 TRACK DRIVE ?
  1015 00003634 7407                <1> 	JZ	short SETIT		; IF SO , CHECK CHANGE LINE
  1016                              <1> DC0:
  1017 00003636 E88D0A0000          <1>         CALL    READ_DSKCHNG            ; GO CHECK STATE OF DISK CHANGE LINE
  1018 0000363B 7407                <1> 	JZ	short FINIS		; CHANGE LINE NOT ACTIVE
  1019                              <1> 
  1020 0000363D C605[68310100]06    <1> SETIT:	MOV	byte [DSKETTE_STATUS], MEDIA_CHANGE ; INDICATE MEDIA REMOVED
  1021                              <1> 
  1022 00003644 E8CE010000          <1> FINIS:	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1023 00003649 E808070000          <1> 	CALL	SETUP_END		; VARIOUS CLEANUPS
  1024 0000364E 6689F3              <1> 	MOV	BX,SI			; GET SAVED AL TO BL
  1025 00003651 88D8                <1> 	MOV	AL,BL			; PUT BACK FOR RETURN
  1026 00003653 C3                  <1> 	RETn
  1027                              <1> DC_NON:
  1028 00003654 800D[68310100]80    <1> 	OR	byte [DSKETTE_STATUS], TIME_OUT ; SET TIMEOUT, NO DRIVE
  1029 0000365B EBE7                <1> 	JMP	SHORT FINIS
  1030                              <1> 
  1031                              <1> ;-------------------------------------------------------------------------------
  1032                              <1> ; FORMAT_SET	(AH = 17H)
  1033                              <1> ;	THIS ROUTINE IS USED TO ESTABLISH THE TYPE OF MEDIA TO BE USED
  1034                              <1> ;	FOR THE FOLLOWING FORMAT OPERATION.
  1035                              <1> ;
  1036                              <1> ; ON ENTRY:	SI LOW = DASD TYPE FOR FORMAT
  1037                              <1> ;		DI     = DRIVE #
  1038                              <1> ;
  1039                              <1> ; ON EXIT:	@DSKETTE_STATUS REFLECTS STATUS
  1040                              <1> ;		AH = @DSKETTE_STATUS
  1041                              <1> ;		CY = 1 IF ERROR
  1042                              <1> ;-------------------------------------------------------------------------------
  1043                              <1> FORMAT_SET:
  1044 0000365D E884010000          <1> 	CALL	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1045 00003662 6656                <1> 	PUSH	SI			; SAVE DASD TYPE
  1046 00003664 6689F0              <1> 	MOV	AX,SI			; AH = ? , AL , DASD TYPE
  1047 00003667 30E4                <1> 	XOR	AH,AH			; AH , 0 , AL , DASD TYPE
  1048 00003669 6689C6              <1> 	MOV	SI,AX			; SI = DASD TYPE
  1049 0000366C 80A7[75310100]0F    <1> 	AND	byte [DSK_STATE+eDI], ~(MED_DET+DBL_STEP+RATE_MSK) ; CLEAR STATE
  1050 00003673 664E                <1> 	DEC	SI			; CHECK FOR 320/360K MEDIA & DRIVE
  1051 00003675 7509                <1> 	JNZ	short NOT_320		; BYPASS IF NOT
  1052 00003677 808F[75310100]90    <1> 	OR	byte [DSK_STATE+eDI], MED_DET+RATE_250 ; SET TO 320/360
  1053 0000367E EB48                <1> 	JMP	SHORT S0
  1054                              <1> 
  1055                              <1> NOT_320:
  1056 00003680 E8B6030000          <1> 	CALL	MED_CHANGE		; CHECK FOR TIME_OUT
  1057 00003685 803D[68310100]80    <1> 	CMP	byte [DSKETTE_STATUS], TIME_OUT
  1058 0000368C 743A                <1> 	JZ	short S0		; IF TIME OUT TELL CALLER
  1059                              <1> S3:
  1060 0000368E 664E                <1> 	DEC	SI			; CHECK FOR 320/360K IN 1.2M DRIVE
  1061 00003690 7509                <1> 	JNZ	short NOT_320_12	; BYPASS IF NOT
  1062 00003692 808F[75310100]70    <1> 	OR	byte [DSK_STATE+eDI], MED_DET+DBL_STEP+RATE_300 ; SET STATE
  1063 00003699 EB2D                <1> 	JMP	SHORT S0
  1064                              <1> 
  1065                              <1> NOT_320_12:
  1066 0000369B 664E                <1> 	DEC	SI			; CHECK FOR 1.2M MEDIA IN 1.2M DRIVE
  1067 0000369D 7509                <1> 	JNZ	short NOT_12		; BYPASS IF NOT
  1068 0000369F 808F[75310100]10    <1> 	OR	byte [DSK_STATE+eDI], MED_DET+RATE_500 ; SET STATE VARIABLE
  1069 000036A6 EB20                <1> 	JMP	SHORT S0		; RETURN TO CALLER
  1070                              <1> 
  1071                              <1> NOT_12:	
  1072 000036A8 664E                <1> 	DEC	SI			; CHECK FOR SET DASD TYPE 04
  1073 000036AA 752B                <1> 	JNZ	short FS_ERR		; BAD COMMAND EXIT IF NOT VALID TYPE
  1074                              <1> 
  1075 000036AC F687[75310100]04    <1> 	TEST	byte [DSK_STATE+eDI], DRV_DET ; DRIVE DETERMINED ?
  1076 000036B3 740B                <1> 	JZ	short ASSUME		; IF STILL NOT DETERMINED ASSUME
  1077 000036B5 B050                <1> 	MOV	AL,MED_DET+RATE_300
  1078 000036B7 F687[75310100]02    <1>         TEST    byte [DSK_STATE+eDI], FMT_CAPA ; MULTIPLE FORMAT CAPABILITY ?
  1079 000036BE 7502                <1> 	JNZ	short OR_IT_IN		; IF 1.2 M THEN DATA RATE 300
  1080                              <1> 
  1081                              <1> ASSUME:
  1082 000036C0 B090                <1> 	MOV	AL,MED_DET+RATE_250	; SET UP
  1083                              <1> 
  1084                              <1> OR_IT_IN:
  1085 000036C2 0887[75310100]      <1> 	OR	[DSK_STATE+eDI], AL	; OR IN THE CORRECT STATE
  1086                              <1> S0:
  1087 000036C8 E84A010000          <1> 	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1088 000036CD E884060000          <1> 	CALL	SETUP_END		; VARIOUS CLEANUPS
  1089 000036D2 665B                <1> 	POP	BX			; GET SAVED AL TO BL
  1090 000036D4 88D8                <1> 	MOV	AL,BL			; PUT BACK FOR RETURN
  1091 000036D6 C3                  <1> 	RETn
  1092                              <1> 
  1093                              <1> FS_ERR:
  1094 000036D7 C605[68310100]01    <1> 	MOV	byte [DSKETTE_STATUS], BAD_CMD ; UNKNOWN STATE,BAD COMMAND
  1095 000036DE EBE8                <1> 	JMP	SHORT S0
  1096                              <1> 
  1097                              <1> ;-------------------------------------------------------------------------------
  1098                              <1> ; SET_MEDIA	(AH = 18H)
  1099                              <1> ;	THIS ROUTINE SETS THE TYPE OF MEDIA AND DATA RATE 
  1100                              <1> ;	TO BE USED FOR THE FOLLOWING FORMAT OPERATION.
  1101                              <1> ;
  1102                              <1> ; ON ENTRY:
  1103                              <1> ;	[BP]	= SECTOR PER TRACK
  1104                              <1> ;	[BP+1]	= TRACK #
  1105                              <1> ;	DI	= DRIVE #
  1106                              <1> ;
  1107                              <1> ; ON EXIT:
  1108                              <1> ;	@DSKETTE_STATUS REFLECTS STATUS
  1109                              <1> ;	IF NO ERROR:
  1110                              <1> ;		AH = 0
  1111                              <1> ;		CY = 0
  1112                              <1> ;		ES = SEGMENT OF MEDIA/DRIVE PARAMETER TABLE
  1113                              <1> ;		DI/[BP+6] = OFFSET OF MEDIA/DRIVE PARAMETER TABLE
  1114                              <1> ;	IF ERROR:	
  1115                              <1> ;		AH = @DSKETTE_STATUS
  1116                              <1> ;		CY = 1
  1117                              <1> ;-------------------------------------------------------------------------------
  1118                              <1> SET_MEDIA:
  1119 000036E0 E801010000          <1> 	CALL	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1120 000036E5 F687[75310100]01    <1>         TEST    byte [DSK_STATE+eDI], TRK_CAPA ; CHECK FOR CHANGE LINE AVAILABLE
  1121 000036EC 7415                <1> 	JZ	short SM_CMOS		; JUMP IF 40 TRACK DRIVE
  1122 000036EE E848030000          <1> 	CALL	MED_CHANGE		; RESET CHANGE LINE
  1123 000036F3 803D[68310100]80    <1> 	CMP	byte [DSKETTE_STATUS], TIME_OUT ; IF TIME OUT TELL CALLER
  1124 000036FA 746B                <1> 	JE	short SM_RTN
  1125 000036FC C605[68310100]00    <1> 	MOV	byte [DSKETTE_STATUS], 0 ; CLEAR STATUS
  1126                              <1> SM_CMOS:
  1127 00003703 E819070000          <1> 	CALL	CMOS_TYPE		; RETURN DRIVE TYPE IN (AL)
  1128                              <1> 	;;20/02/2015
  1129                              <1> 	;;JC	short MD_NOT_FND	; ERROR IN CMOS
  1130                              <1> 	;;OR	AL,AL			; TEST FOR NO DRIVE
  1131 00003708 745D                <1> 	JZ	short SM_RTN		; RETURN IF SO
  1132 0000370A E863000000          <1> 	CALL	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1133 0000370F 7231                <1> 	JC	short MD_NOT_FND	; TYPE NOT IN TABLE (BAD CMOS)
  1134 00003711 57                  <1> 	PUSH	eDI			; SAVE REG.
  1135 00003712 31DB                <1> 	XOR	eBX,eBX			; BX = INDEX TO DR. TYPE TABLE
  1136 00003714 B906000000          <1> 	MOV	eCX,DR_CNT		; CX = LOOP COUNT
  1137                              <1> DR_SEARCH:
  1138 00003719 8AA3[7EFB0000]      <1> 	MOV	AH, [DR_TYPE+eBX]	; GET DRIVE TYPE
  1139 0000371F 80E47F              <1> 	AND	AH,BIT7OFF		; MASK OUT MSB
  1140 00003722 38E0                <1> 	CMP	AL,AH			; DRIVE TYPE MATCH ?
  1141 00003724 7516                <1> 	JNE	short NXT_MD		; NO, CHECK NEXT DRIVE TYPE
  1142                              <1> DR_FND:
  1143 00003726 8BBB[7FFB0000]      <1> 	MOV	eDI, [DR_TYPE+eBX+1] 	; DI = MEDIA/DRIVE PARAM TABLE
  1144                              <1> MD_SEARCH:
  1145 0000372C 8A6704              <1>         MOV     AH, [eDI+MD.SEC_TRK]    ; GET SECTOR/TRACK
  1146 0000372F 386500              <1> 	CMP	[eBP],AH		; MATCH?
  1147 00003732 7508                <1> 	JNE	short NXT_MD		; NO, CHECK NEXT MEDIA
  1148 00003734 8A670B              <1>         MOV     AH, [eDI+MD.MAX_TRK]    ; GET MAX. TRACK #
  1149 00003737 386501              <1> 	CMP 	[eBP+1],AH		; MATCH?
  1150 0000373A 740F                <1> 	JE	short MD_FND		; YES, GO GET RATE
  1151                              <1> NXT_MD:
  1152                              <1> 	;ADD	BX,3			; CHECK NEXT DRIVE TYPE
  1153 0000373C 83C305              <1>         add	ebx, 5 ; 18/02/2015
  1154 0000373F E2D8                <1> 	LOOP    DR_SEARCH
  1155 00003741 5F                  <1> 	POP	eDI			; RESTORE REG.
  1156                              <1> MD_NOT_FND:
  1157 00003742 C605[68310100]0C    <1> 	MOV	byte [DSKETTE_STATUS], MED_NOT_FND ; ERROR, MEDIA TYPE NOT FOUND
  1158 00003749 EB1C                <1> 	JMP	SHORT SM_RTN		; RETURN
  1159                              <1> MD_FND:
  1160 0000374B 8A470C              <1>         MOV     AL, [eDI+MD.RATE]       ; GET RATE
  1161 0000374E 3C40                <1> 	CMP	AL,RATE_300		; DOUBLE STEP REQUIRED FOR RATE 300
  1162 00003750 7502                <1> 	JNE	short MD_SET
  1163 00003752 0C20                <1> 	OR	AL,DBL_STEP
  1164                              <1> MD_SET:
  1165                              <1> 	;MOV	[BP+6],DI		; SAVE TABLE POINTER IN STACK
  1166 00003754 897D0C              <1> 	mov	[ebp+12], edi ; 18/02/2015
  1167 00003757 0C10                <1> 	OR	AL,MED_DET		; SET MEDIA ESTABLISHED
  1168 00003759 5F                  <1> 	POP	eDI
  1169 0000375A 80A7[75310100]0F    <1> 	AND	byte [DSK_STATE+eDI], ~(MED_DET+DBL_STEP+RATE_MSK) ; CLEAR STATE
  1170 00003761 0887[75310100]      <1> 	OR	[DSK_STATE+eDI], AL
  1171                              <1> 	;MOV	AX, CS			; SEGMENT OF MEDIA/DRIVE PARAMETER TABLE
  1172                              <1> 	;MOV	ES, AX			; ES IS SEGMENT OF TABLE
  1173                              <1> SM_RTN:
  1174 00003767 E8AB000000          <1> 	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1175 0000376C E8E5050000          <1> 	CALL	SETUP_END		; VARIOUS CLEANUPS
  1176 00003771 C3                  <1> 	RETn
  1177                              <1> 
  1178                              <1> ;----------------------------------------------------------------
  1179                              <1> ; DR_TYPE_CHECK							:
  1180                              <1> ;	CHECK IF THE GIVEN DRIVE TYPE IN REGISTER (AL)		:
  1181                              <1> ;	IS SUPPORTED IN BIOS DRIVE TYPE TABLE			:
  1182                              <1> ; ON ENTRY:							:
  1183                              <1> ;	AL = DRIVE TYPE						:
  1184                              <1> ; ON EXIT:							:
  1185                              <1> ;	CS = SEGMENT MEDIA/DRIVE PARAMETER TABLE (CODE)		:
  1186                              <1> ;	CY = 0 	DRIVE TYPE SUPPORTED				:
  1187                              <1> ;	     BX = OFFSET TO MEDIA/DRIVE PARAMETER TABLE		:
  1188                              <1> ;	CY = 1	DRIVE TYPE NOT SUPPORTED 			:
  1189                              <1> ; REGISTERS ALTERED: eBX						:
  1190                              <1> ;----------------------------------------------------------------		
  1191                              <1> DR_TYPE_CHECK:
  1192 00003772 6650                <1> 	PUSH	AX			
  1193 00003774 51                  <1> 	PUSH	eCX
  1194 00003775 31DB                <1> 	XOR	eBX,eBX			; BX = INDEX TO DR_TYPE TABLE
  1195 00003777 B906000000          <1> 	MOV	eCX,DR_CNT		; CX = LOOP COUNT
  1196                              <1> TYPE_CHK:	
  1197 0000377C 8AA3[7EFB0000]      <1> 	MOV	AH,[DR_TYPE+eBX]	; GET DRIVE TYPE
  1198 00003782 38E0                <1> 	CMP	AL,AH			; DRIVE TYPE MATCH?
  1199 00003784 740D                <1> 	JE	short DR_TYPE_VALID	; YES, RETURN WITH CARRY RESET
  1200                              <1> 	;ADD	BX,3			; CHECK NEXT DRIVE TYPE
  1201 00003786 83C305              <1>         add	ebx, 5	; 16/02/2015 (32 bit address modification)
  1202 00003789 E2F1                <1> 	LOOP    TYPE_CHK
  1203                              <1> 	;
  1204 0000378B BB[DDFB0000]        <1> 	mov	ebx, MD_TBL6		; 1.44MB fd parameter table
  1205                              <1> 					; Default for GET_PARM (11/12/2014)
  1206                              <1> 	;
  1207 00003790 F9                  <1> 	STC				; DRIVE TYPE NOT FOUND IN TABLE
  1208 00003791 EB06                <1> 	JMP	SHORT TYPE_RTN
  1209                              <1> DR_TYPE_VALID:
  1210 00003793 8B9B[7FFB0000]      <1> 	MOV	eBX,[DR_TYPE+eBX+1] 	; BX = MEDIA TABLE
  1211                              <1> TYPE_RTN:
  1212 00003799 59                  <1> 	POP	eCX
  1213 0000379A 6658                <1> 	POP	AX
  1214 0000379C C3                  <1> 	RETn	
  1215                              <1> 		
  1216                              <1> ;----------------------------------------------------------------
  1217                              <1> ; SEND_SPEC							:
  1218                              <1> ;	SEND THE SPECIFY COMMAND TO CONTROLLER USING DATA FROM	:
  1219                              <1> ;	THE DRIVE PARAMETER TABLE POINTED BY @DISK_POINTER	:
  1220                              <1> ; ON ENTRY:	@DISK_POINTER = DRIVE PARAMETER TABLE		:
  1221                              <1> ; ON EXIT:	NONE						:	
  1222                              <1> ; REGISTERS ALTERED: CX, DX					:
  1223                              <1> ;----------------------------------------------------------------		
  1224                              <1> SEND_SPEC:
  1225 0000379D 50                  <1> 	PUSH	eAX			; SAVE AX
  1226 0000379E B8[C4370000]        <1> 	MOV	eAX, SPECBAC		; LOAD ERROR ADDRESS
  1227 000037A3 50                  <1> 	PUSH	eAX			; PUSH NEC_OUT ERROR RETURN
  1228 000037A4 B403                <1> 	MOV	AH,03H			; SPECIFY COMMAND
  1229 000037A6 E885070000          <1> 	CALL	NEC_OUTPUT		; OUTPUT THE COMMAND
  1230 000037AB 28D2                <1> 	SUB	DL,DL			; FIRST SPECIFY BYTE
  1231 000037AD E878060000          <1> 	CALL	GET_PARM		; GET PARAMETER TO AH
  1232 000037B2 E879070000          <1> 	CALL	NEC_OUTPUT		; OUTPUT THE COMMAND
  1233 000037B7 B201                <1> 	MOV	DL,1			; SECOND SPECIFY BYTE
  1234 000037B9 E86C060000          <1> 	CALL	GET_PARM		; GET PARAMETER TO AH
  1235 000037BE E86D070000          <1> 	CALL	NEC_OUTPUT		; OUTPUT THE COMMAND
  1236 000037C3 58                  <1> 	POP	eAX			; POP ERROR RETURN
  1237                              <1> SPECBAC:
  1238 000037C4 58                  <1> 	POP	eAX			; RESTORE ORIGINAL AX VALUE
  1239 000037C5 C3                  <1> 	RETn
  1240                              <1> 
  1241                              <1> ;----------------------------------------------------------------
  1242                              <1> ; SEND_SPEC_MD							:
  1243                              <1> ;	SEND THE SPECIFY COMMAND TO CONTROLLER USING DATA FROM	:
  1244                              <1> ;	THE MEDIA/DRIVE PARAMETER TABLE POINTED BY (CS:BX)	:
  1245                              <1> ; ON ENTRY:	CS:BX = MEDIA/DRIVE PARAMETER TABLE		:
  1246                              <1> ; ON EXIT:	NONE						:	
  1247                              <1> ; REGISTERS ALTERED: AX						:
  1248                              <1> ;----------------------------------------------------------------		
  1249                              <1> SEND_SPEC_MD:
  1250 000037C6 50                  <1> 	PUSH	eAX			; SAVE RATE DATA
  1251 000037C7 B8[E4370000]        <1> 	MOV	eAX, SPEC_ESBAC		; LOAD ERROR ADDRESS
  1252 000037CC 50                  <1> 	PUSH	eAX			; PUSH NEC_OUT ERROR RETURN
  1253 000037CD B403                <1> 	MOV	AH,03H			; SPECIFY COMMAND
  1254 000037CF E85C070000          <1> 	CALL	NEC_OUTPUT		; OUTPUT THE COMMAND
  1255 000037D4 8A23                <1>         MOV     AH, [eBX+MD.SPEC1]      ; GET 1ST SPECIFY BYTE
  1256 000037D6 E855070000          <1> 	CALL	NEC_OUTPUT		; OUTPUT THE COMMAND
  1257 000037DB 8A6301              <1>         MOV     AH, [eBX+MD.SPEC2]      ; GET SECOND SPECIFY BYTE
  1258 000037DE E84D070000          <1> 	CALL	NEC_OUTPUT		; OUTPUT THE COMMAND
  1259 000037E3 58                  <1> 	POP	eAX			; POP ERROR RETURN
  1260                              <1> SPEC_ESBAC:
  1261 000037E4 58                  <1> 	POP	eAX			; RESTORE ORIGINAL AX VALUE
  1262 000037E5 C3                  <1> 	RETn
  1263                              <1> 
  1264                              <1> ;-------------------------------------------------------------------------------
  1265                              <1> ; XLAT_NEW  
  1266                              <1> ;	TRANSLATES DISKETTE STATE LOCATIONS FROM COMPATIBLE
  1267                              <1> ;	MODE TO NEW ARCHITECTURE.
  1268                              <1> ;
  1269                              <1> ; ON ENTRY:	DI = DRIVE #
  1270                              <1> ;-------------------------------------------------------------------------------
  1271                              <1> XLAT_NEW:
  1272 000037E6 83FF01              <1> 	CMP	eDI,1				; VALID DRIVE
  1273 000037E9 7725                <1> 	JA	short XN_OUT			; IF INVALID BACK
  1274 000037EB 80BF[75310100]00    <1> 	CMP	byte [DSK_STATE+eDI], 0		; NO DRIVE ?
  1275 000037F2 741D                <1> 	JZ	short DO_DET			; IF NO DRIVE ATTEMPT DETERMINE
  1276 000037F4 6689F9              <1> 	MOV	CX,DI				; CX = DRIVE NUMBER
  1277 000037F7 C0E102              <1> 	SHL	CL,2				; CL = SHIFT COUNT, A=0, B=4
  1278 000037FA A0[74310100]        <1> 	MOV	AL, [HF_CNTRL]			; DRIVE INFORMATION
  1279 000037FF D2C8                <1> 	ROR	AL,CL				; TO LOW NIBBLE
  1280 00003801 2407                <1> 	AND	AL,DRV_DET+FMT_CAPA+TRK_CAPA	; KEEP DRIVE BITS
  1281 00003803 80A7[75310100]F8    <1>         AND     byte [DSK_STATE+eDI], ~(DRV_DET+FMT_CAPA+TRK_CAPA)
  1282 0000380A 0887[75310100]      <1> 	OR	[DSK_STATE+eDI], AL		; UPDATE DRIVE STATE
  1283                              <1> XN_OUT:
  1284 00003810 C3                  <1> 	RETn
  1285                              <1> DO_DET:
  1286 00003811 E8BF080000          <1> 	CALL	DRIVE_DET			; TRY TO DETERMINE
  1287 00003816 C3                  <1> 	RETn
  1288                              <1> 
  1289                              <1> ;-------------------------------------------------------------------------------
  1290                              <1> ; XLAT_OLD 
  1291                              <1> ;	TRANSLATES DISKETTE STATE LOCATIONS FROM NEW
  1292                              <1> ;	ARCHITECTURE TO COMPATIBLE MODE.
  1293                              <1> ;
  1294                              <1> ; ON ENTRY:	DI = DRIVE
  1295                              <1> ;-------------------------------------------------------------------------------
  1296                              <1> XLAT_OLD:
  1297 00003817 83FF01              <1> 	CMP	eDI,1			; VALID DRIVE ?
  1298                              <1>         ;JA     short XO_OUT            ; IF INVALID BACK
  1299 0000381A 0F8786000000        <1>         ja      XO_OUT
  1300 00003820 80BF[75310100]00    <1>         CMP	byte [DSK_STATE+eDI],0	; NO DRIVE ?
  1301 00003827 747D                <1> 	JZ	short XO_OUT		; IF NO DRIVE TRANSLATE DONE
  1302                              <1> 
  1303                              <1> ;-----	TEST FOR SAVED DRIVE INFORMATION ALREADY SET
  1304                              <1> 
  1305 00003829 6689F9              <1> 	MOV	CX,DI			; CX = DRIVE NUMBER
  1306 0000382C C0E102              <1> 	SHL	CL,2			; CL = SHIFT COUNT, A=0, B=4
  1307 0000382F B402                <1> 	MOV	AH,FMT_CAPA		; LOAD MULTIPLE DATA RATE BIT MASK
  1308 00003831 D2CC                <1> 	ROR	AH,CL			; ROTATE BY MASK
  1309 00003833 8425[74310100]      <1> 	TEST	[HF_CNTRL], AH		; MULTIPLE-DATA RATE DETERMINED ?
  1310 00003839 751C                <1> 	JNZ	short SAVE_SET		; IF SO, NO NEED TO RE-SAVE
  1311                              <1> 
  1312                              <1> ;-----	ERASE DRIVE BITS IN @HF_CNTRL FOR THIS DRIVE
  1313                              <1> 
  1314 0000383B B407                <1> 	MOV	AH,DRV_DET+FMT_CAPA+TRK_CAPA ; MASK TO KEEP
  1315 0000383D D2CC                <1> 	ROR	AH,CL			; FIX MASK TO KEEP
  1316 0000383F F6D4                <1> 	NOT	AH			; TRANSLATE MASK
  1317 00003841 2025[74310100]      <1> 	AND	[HF_CNTRL], AH		; KEEP BITS FROM OTHER DRIVE INTACT
  1318                              <1> 
  1319                              <1> ;-----	ACCESS CURRENT DRIVE BITS AND STORE IN @HF_CNTRL
  1320                              <1> 
  1321 00003847 8A87[75310100]      <1> 	MOV	AL, [DSK_STATE+eDI]	; ACCESS STATE
  1322 0000384D 2407                <1> 	AND	AL,DRV_DET+FMT_CAPA+TRK_CAPA ; KEEP DRIVE BITS
  1323 0000384F D2C8                <1> 	ROR	AL,CL			; FIX FOR THIS DRIVE
  1324 00003851 0805[74310100]      <1> 	OR	[HF_CNTRL], AL		; UPDATE SAVED DRIVE STATE
  1325                              <1> 
  1326                              <1> ;-----	TRANSLATE TO COMPATIBILITY MODE
  1327                              <1> 
  1328                              <1> SAVE_SET:
  1329 00003857 8AA7[75310100]      <1> 	MOV	AH, [DSK_STATE+eDI]	; ACCESS STATE
  1330 0000385D 88E7                <1> 	MOV	BH,AH			; TO BH FOR LATER
  1331 0000385F 80E4C0              <1> 	AND	AH,RATE_MSK		; KEEP ONLY RATE
  1332 00003862 80FC00              <1> 	CMP	AH,RATE_500		; RATE 500 ?
  1333 00003865 7410                <1> 	JZ	short CHK_144		; YES 1.2/1.2 OR 1.44/1.44
  1334 00003867 B001                <1> 	MOV	AL,M3D1U		; AL = 360 IN 1.2 UNESTABLISHED
  1335 00003869 80FC40              <1> 	CMP	AH,RATE_300		; RATE 300 ?
  1336 0000386C 7518                <1> 	JNZ	short CHK_250		; NO, 360/360, 720/720 OR 720/1.44
  1337 0000386E F6C720              <1> 	TEST	BH,DBL_STEP		; CHECK FOR DOUBLE STEP
  1338 00003871 751F                <1> 	JNZ	short TST_DET		; MUST BE 360 IN 1.2
  1339                              <1> UNKNO:
  1340 00003873 B007                <1> 	MOV	AL,MED_UNK		; NONE OF THE ABOVE
  1341 00003875 EB22                <1> 	JMP	SHORT AL_SET		; PROCESS COMPLETE
  1342                              <1> CHK_144:
  1343 00003877 E8A5050000          <1> 	CALL	CMOS_TYPE		; RETURN DRIVE TYPE IN (AL)
  1344                              <1> 	;;20/02/2015
  1345                              <1> 	;;JC	short UNKNO		; ERROR, SET 'NONE OF ABOVE'
  1346 0000387C 74F5                <1> 	jz	short UNKNO ;; 20/02/2015
  1347 0000387E 3C02                <1> 	CMP	AL,2			; 1.2MB DRIVE ?
  1348 00003880 75F1                <1> 	JNE	short UNKNO		; NO, GO SET 'NONE OF ABOVE'
  1349 00003882 B002                <1> 	MOV	AL,M1D1U		; AL = 1.2 IN 1.2 UNESTABLISHED
  1350 00003884 EB0C                <1> 	JMP	SHORT TST_DET
  1351                              <1> CHK_250:
  1352 00003886 B000                <1> 	MOV	AL,M3D3U		; AL = 360 IN 360 UNESTABLISHED
  1353 00003888 80FC80              <1> 	CMP	AH,RATE_250		; RATE 250 ?
  1354 0000388B 75E6                <1> 	JNZ	short UNKNO		; IF SO FALL IHRU
  1355 0000388D F6C701              <1> 	TEST	BH,TRK_CAPA		; 80 TRACK CAPABILITY ?
  1356 00003890 75E1                <1> 	JNZ	short UNKNO		; IF SO JUMP, FALL THRU TEST DET
  1357                              <1> TST_DET:
  1358 00003892 F6C710              <1> 	TEST	BH,MED_DET		; DETERMINED ?
  1359 00003895 7402                <1> 	JZ	short AL_SET		; IF NOT THEN SET
  1360 00003897 0403                <1> 	ADD	AL,3			; MAKE DETERMINED/ESTABLISHED
  1361                              <1> AL_SET:
  1362 00003899 80A7[75310100]F8    <1> 	AND	byte [DSK_STATE+eDI], ~(DRV_DET+FMT_CAPA+TRK_CAPA) ; CLEAR DRIVE
  1363 000038A0 0887[75310100]      <1> 	OR	[DSK_STATE+eDI], AL	; REPLACE WITH COMPATIBLE MODE
  1364                              <1> XO_OUT:
  1365 000038A6 C3                  <1> 	RETn
  1366                              <1> 
  1367                              <1> ;-------------------------------------------------------------------------------
  1368                              <1> ; RD_WR_VF
  1369                              <1> ;	COMMON READ, WRITE AND VERIFY: 
  1370                              <1> ;	MAIN LOOP FOR STATE RETRIES.
  1371                              <1> ;
  1372                              <1> ; ON ENTRY:	AH = READ/WRITE/VERIFY NEC PARAMETER
  1373                              <1> ;		AL = READ/WRITE/VERIFY DMA PARAMETER
  1374                              <1> ;
  1375                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1376                              <1> ;-------------------------------------------------------------------------------
  1377                              <1> RD_WR_VF:
  1378 000038A7 6650                <1> 	PUSH	AX			; SAVE DMA, NEC PARAMETERS
  1379 000038A9 E838FFFFFF          <1> 	CALL	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1380 000038AE E8F3000000          <1> 	CALL	SETUP_STATE		; INITIALIZE START AND END RATE
  1381 000038B3 6658                <1> 	POP	AX			; RESTORE READ/WRITE/VERIFY
  1382                              <1> DO_AGAIN:
  1383 000038B5 6650                <1> 	PUSH	AX			; SAVE READ/WRITE/VERIFY PARAMETER
  1384 000038B7 E87F010000          <1> 	CALL	MED_CHANGE		; MEDIA CHANGE AND RESET IF CHANGED
  1385 000038BC 6658                <1> 	POP	AX			; RESTORE READ/WRITE/VERIFY
  1386 000038BE 0F82C9000000        <1>         JC      RWV_END                 ; MEDIA CHANGE ERROR OR TIME-OUT
  1387                              <1> RWV:
  1388 000038C4 6650                <1> 	PUSH	AX			; SAVE READ/WRITE/VERIFY PARAMETER
  1389 000038C6 8AB7[75310100]      <1> 	MOV	DH, [DSK_STATE+eDI]	; GET RATE STATE OF THIS DRIVE
  1390 000038CC 80E6C0              <1> 	AND	DH,RATE_MSK		; KEEP ONLY RATE
  1391 000038CF E84D050000          <1> 	CALL	CMOS_TYPE		; RETURN DRIVE TYPE IN AL (AL)
  1392                              <1> 	;;20/02/2015
  1393                              <1> 	;;JC	short RWV_ASSUME	; ERROR IN CMOS
  1394 000038D4 7451                <1> 	jz	short RWV_ASSUME ; 20/02/2015
  1395 000038D6 3C01                <1> 	CMP	AL,1			; 40 TRACK DRIVE?
  1396 000038D8 750D                <1> 	JNE	short RWV_1		; NO, BYPASS CMOS VALIDITY CHECK
  1397 000038DA F687[75310100]01    <1> 	TEST	byte [DSK_STATE+eDI], TRK_CAPA ; CHECK FOR 40 TRACK DRIVE
  1398 000038E1 7413                <1> 	JZ	short RWV_2		; YES, CMOS IS CORRECT
  1399 000038E3 B002                <1> 	MOV	AL,2			; CHANGE TO 1.2M
  1400 000038E5 EB0F                <1> 	JMP	SHORT RWV_2
  1401                              <1> RWV_1:
  1402 000038E7 720D                <1> 	JB	short RWV_2		; NO DRIVE SPECIFIED, CONTINUE
  1403 000038E9 F687[75310100]01    <1> 	TEST    byte [DSK_STATE+eDI], TRK_CAPA ; IS IT REALLY 40 TRACK?
  1404 000038F0 7504                <1> 	JNZ	short RWV_2		; NO, 80 TRACK
  1405 000038F2 B001                <1> 	MOV	AL,1			; IT IS 40 TRACK, FIX CMOS VALUE
  1406 000038F4 EB04                <1> 	jmp	short rwv_3
  1407                              <1> RWV_2:
  1408 000038F6 08C0                <1> 	OR	AL,AL			; TEST FOR NO DRIVE
  1409 000038F8 742D                <1> 	JZ	short RWV_ASSUME	; ASSUME TYPE, USE MAX TRACK
  1410                              <1> rwv_3:
  1411 000038FA E873FEFFFF          <1> 	CALL	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL.
  1412 000038FF 7226                <1> 	JC	short RWV_ASSUME	; TYPE NOT IN TABLE (BAD CMOS)
  1413                              <1> 
  1414                              <1> ;-----	SEARCH FOR MEDIA/DRIVE PARAMETER TABLE
  1415                              <1> 
  1416 00003901 57                  <1> 	PUSH	eDI			; SAVE DRIVE #
  1417 00003902 31DB                <1> 	XOR	eBX,eBX			; BX = INDEX TO DR_TYPE TABLE
  1418 00003904 B906000000          <1> 	MOV	eCX,DR_CNT		; CX = LOOP COUNT
  1419                              <1> RWV_DR_SEARCH:
  1420 00003909 8AA3[7EFB0000]      <1> 	MOV	AH, [DR_TYPE+eBX]	; GET DRIVE TYPE
  1421 0000390F 80E47F              <1> 	AND	AH,BIT7OFF		; MASK OUT MSB
  1422 00003912 38E0                <1> 	CMP	AL,AH			; DRIVE TYPE MATCH?
  1423 00003914 750B                <1> 	JNE	short RWV_NXT_MD	; NO, CHECK NEXT DRIVE TYPE
  1424                              <1> RWV_DR_FND:
  1425 00003916 8BBB[7FFB0000]      <1> 	MOV	eDI, [DR_TYPE+eBX+1] 	; DI = MEDIA/DRIVE PARAMETER TABLE
  1426                              <1> RWV_MD_SEARH:
  1427 0000391C 3A770C              <1>         CMP     DH, [eDI+MD.RATE]       ; MATCH?
  1428 0000391F 741B                <1> 	JE	short RWV_MD_FND	; YES, GO GET 1ST SPECIFY BYTE
  1429                              <1> RWV_NXT_MD:
  1430                              <1> 	;ADD	BX,3			; CHECK NEXT DRIVE TYPE
  1431 00003921 83C305              <1> 	add	eBX, 5
  1432 00003924 E2E3                <1> 	LOOP	RWV_DR_SEARCH
  1433 00003926 5F                  <1> 	POP	eDI			; RESTORE DRIVE #
  1434                              <1> 
  1435                              <1> ;-----	ASSUME PRIMARY DRIVE IS INSTALLED AS SHIPPED
  1436                              <1> 
  1437                              <1> RWV_ASSUME:
  1438 00003927 BB[9CFB0000]        <1> 	MOV	eBX, MD_TBL1		; POINT TO 40 TRACK 250 KBS
  1439 0000392C F687[75310100]01    <1> 	TEST 	byte [DSK_STATE+eDI], TRK_CAPA ; TEST FOR 80 TRACK
  1440 00003933 740A                <1> 	JZ	short RWV_MD_FND1	; MUST BE 40 TRACK
  1441 00003935 BB[B6FB0000]        <1> 	MOV	eBX, MD_TBL3		; POINT TO 80 TRACK 500 KBS
  1442 0000393A EB03                <1> 	JMP	short RWV_MD_FND1	; GO SPECIFY PARAMTERS
  1443                              <1> 
  1444                              <1> ;-----	CS:BX POINTS TO MEDIA/DRIVE PARAMETER TABLE
  1445                              <1> 	 			
  1446                              <1> RWV_MD_FND:
  1447 0000393C 89FB                <1> 	MOV	eBX,eDI			; BX = MEDIA/DRIVE PARAMETER TABLE
  1448 0000393E 5F                  <1> 	POP	eDI			; RESTORE DRIVE #
  1449                              <1> 	
  1450                              <1> ;-----	SEND THE SPECIFY COMMAND TO THE CONTROLLER
  1451                              <1> 
  1452                              <1> RWV_MD_FND1:
  1453 0000393F E882FEFFFF          <1> 	CALL	SEND_SPEC_MD
  1454 00003944 E864010000          <1> 	CALL	CHK_LASTRATE		; ZF=1 ATTEMP RATE IS SAME AS LAST RATE
  1455 00003949 7405                <1> 	JZ	short RWV_DBL		; YES,SKIP SEND RATE COMMAND
  1456 0000394B E83B010000          <1> 	CALL	SEND_RATE		; SEND DATA RATE TO NEC
  1457                              <1> RWV_DBL:
  1458 00003950 53                  <1> 	PUSH	eBX			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
  1459 00003951 E822040000          <1> 	CALL	SETUP_DBL		; CHECK FOR DOUBLE STEP
  1460 00003956 5B                  <1> 	POP	eBX			; RESTORE ADDRESS
  1461 00003957 7226                <1> 	JC	short CHK_RET		; ERROR FROM READ ID, POSSIBLE RETRY
  1462 00003959 6658                <1> 	POP	AX			; RESTORE NEC, DMA COMMAND
  1463 0000395B 6650                <1> 	PUSH	AX			; SAVE NEC COMMAND
  1464 0000395D 53                  <1> 	PUSH	eBX			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
  1465 0000395E E861010000          <1> 	CALL	DMA_SETUP		; SET UP THE DMA
  1466 00003963 5B                  <1> 	POP	eBX 
  1467 00003964 6658                <1> 	POP	AX			; RESTORE NEC COMMAND
  1468 00003966 722F                <1> 	JC	short RWV_BAC		; CHECK FOR DMA BOUNDARY ERROR
  1469 00003968 6650                <1> 	PUSH	AX			; SAVE NEC COMMAND
  1470 0000396A 53                  <1> 	PUSH	eBX			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
  1471 0000396B E83C020000          <1> 	CALL	NEC_INIT		; INITIALIZE NEC
  1472 00003970 5B                  <1> 	POP	eBX			; RESTORE ADDRESS
  1473 00003971 720C                <1> 	JC	short CHK_RET		; ERROR - EXIT
  1474 00003973 E866020000          <1> 	CALL	RWV_COM			; OP CODE COMMON TO READ/WRITE/VERIFY
  1475 00003978 7205                <1> 	JC	short CHK_RET		; ERROR - EXIT
  1476 0000397A E8AB020000          <1> 	CALL	NEC_TERM		; TERMINATE, GET STATUS, ETC.
  1477                              <1> CHK_RET:
  1478 0000397F E84A030000          <1> 	CALL	RETRY			; CHECK FOR, SETUP RETRY
  1479 00003984 6658                <1> 	POP	AX			; RESTORE READ/WRITE/VERIFY PARAMETER
  1480 00003986 7305                <1> 	JNC	short RWV_END		; CY = 0 NO RETRY
  1481 00003988 E928FFFFFF          <1>         JMP     DO_AGAIN                ; CY = 1 MEANS RETRY
  1482                              <1> RWV_END:
  1483 0000398D E8F4020000          <1> 	CALL	DSTATE			; ESTABLISH STATE IF SUCCESSFUL
  1484 00003992 E887030000          <1> 	CALL	NUM_TRANS		; AL = NUMBER TRANSFERRED
  1485                              <1> RWV_BAC:				; BAD DMA ERROR ENTRY
  1486 00003997 6650                <1> 	PUSH	AX			; SAVE NUMBER TRANSFERRED
  1487 00003999 E879FEFFFF          <1> 	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1488 0000399E 6658                <1> 	POP	AX			; RESTORE NUMBER TRANSFERRED
  1489 000039A0 E8B1030000          <1> 	CALL	SETUP_END		; VARIOUS CLEANUPS
  1490 000039A5 C3                  <1> 	RETn
  1491                              <1> 
  1492                              <1> ;-------------------------------------------------------------------------------
  1493                              <1> ; SETUP_STATE:	INITIALIZES START AND END RATES.
  1494                              <1> ;-------------------------------------------------------------------------------
  1495                              <1> SETUP_STATE:
  1496 000039A6 F687[75310100]10    <1> 	TEST	byte [DSK_STATE+eDI], MED_DET ; MEDIA DETERMINED ?
  1497 000039AD 7537                <1> 	JNZ	short J1C		; NO STATES IF DETERMINED
  1498 000039AF 66B84000            <1>         MOV     AX,(RATE_500*256)+RATE_300  ; AH = START RATE, AL = END RATE
  1499 000039B3 F687[75310100]04    <1> 	TEST	byte [DSK_STATE+eDI],DRV_DET ; DRIVE ?
  1500 000039BA 740D                <1> 	JZ	short AX_SET		; DO NOT KNOW DRIVE
  1501 000039BC F687[75310100]02    <1> 	TEST	byte [DSK_STATE+eDI], FMT_CAPA ; MULTI-RATE?
  1502 000039C3 7504                <1> 	JNZ	short AX_SET		; JUMP IF YES
  1503 000039C5 66B88080            <1>         MOV     AX,RATE_250*257         ; START A END RATE 250 FOR 360 DRIVE
  1504                              <1> AX_SET:	
  1505 000039C9 80A7[75310100]1F    <1> 	AND	byte [DSK_STATE+eDI], ~(RATE_MSK+DBL_STEP) ; TURN OFF THE RATE
  1506 000039D0 08A7[75310100]      <1> 	OR	[DSK_STATE+eDI], AH	; RATE FIRST TO TRY
  1507 000039D6 8025[70310100]F3    <1> 	AND	byte [LASTRATE], ~STRT_MSK ; ERASE LAST TO TRY RATE BITS
  1508 000039DD C0C804              <1> 	ROR	AL,4			; TO OPERATION LAST RATE LOCATION
  1509 000039E0 0805[70310100]      <1> 	OR	[LASTRATE], AL		; LAST RATE
  1510                              <1> J1C:	
  1511 000039E6 C3                  <1> 	RETn
  1512                              <1> 
  1513                              <1> ;-------------------------------------------------------------------------------
  1514                              <1> ;  FMT_INIT: ESTABLISH STATE IF UNESTABLISHED AT FORMAT TIME.
  1515                              <1> ;-------------------------------------------------------------------------------
  1516                              <1> FMT_INIT:
  1517 000039E7 F687[75310100]10    <1> 	TEST	byte [DSK_STATE+eDI], MED_DET ; IS MEDIA ESTABLISHED
  1518 000039EE 7546                <1> 	JNZ	short F1_OUT		; IF SO RETURN
  1519 000039F0 E82C040000          <1> 	CALL	CMOS_TYPE		; RETURN DRIVE TYPE IN AL
  1520                              <1> 	;; 20/02/2015
  1521                              <1> 	;;JC	short CL_DRV		; ERROR IN CMOS ASSUME NO DRIVE
  1522 000039F5 7440                <1> 	jz	short CL_DRV ;; 20/02/2015
  1523 000039F7 FEC8                <1> 	DEC	AL			; MAKE ZERO ORIGIN
  1524                              <1> 	;;JS	short CL_DRV		; NO DRIVE IF AL 0
  1525 000039F9 8AA7[75310100]      <1> 	MOV	AH, [DSK_STATE+eDI]	; AH = CURRENT STATE
  1526 000039FF 80E40F              <1> 	AND	AH, ~(MED_DET+DBL_STEP+RATE_MSK) ; CLEAR
  1527 00003A02 08C0                <1> 	OR	AL,AL			; CHECK FOR 360
  1528 00003A04 7505                <1> 	JNZ	short N_360		; IF 360 WILL BE 0
  1529 00003A06 80CC90              <1> 	OR	AH,MED_DET+RATE_250	; ESTABLISH MEDIA
  1530 00003A09 EB25                <1> 	JMP	SHORT SKP_STATE		; SKIP OTHER STATE PROCESSING
  1531                              <1> N_360:	
  1532 00003A0B FEC8                <1> 	DEC	AL			; 1.2 M DRIVE
  1533 00003A0D 7505                <1> 	JNZ	short N_12		; JUMP IF NOT
  1534                              <1> F1_RATE:
  1535 00003A0F 80CC10              <1> 	OR	AH,MED_DET+RATE_500	; SET FORMAT RATE
  1536 00003A12 EB1C                <1> 	JMP	SHORT SKP_STATE		; SKIP OTHER STATE PROCESSING
  1537                              <1> N_12:	
  1538 00003A14 FEC8                <1> 	DEC	AL			; CHECK FOR TYPE 3
  1539 00003A16 750F                <1> 	JNZ	short N_720		; JUMP IF NOT
  1540 00003A18 F6C404              <1> 	TEST	AH,DRV_DET		; IS DRIVE DETERMINED
  1541 00003A1B 7410                <1> 	JZ	short ISNT_12		; TREAT AS NON 1.2 DRIVE
  1542 00003A1D F6C402              <1> 	TEST	AH,FMT_CAPA		; IS 1.2M
  1543 00003A20 740B                <1> 	JZ	short ISNT_12		; JUMP IF NOT
  1544 00003A22 80CC50              <1> 	OR	AH,MED_DET+RATE_300	; RATE 300
  1545 00003A25 EB09                <1> 	JMP	SHORT SKP_STATE		; CONTINUE
  1546                              <1> N_720:
  1547 00003A27 FEC8                <1> 	DEC	AL			; CHECK FOR TYPE 4
  1548 00003A29 750C                <1> 	JNZ	short CL_DRV		; NO DRIVE, CMOS BAD
  1549 00003A2B EBE2                <1> 	JMP	SHORT F1_RATE
  1550                              <1> ISNT_12: 
  1551 00003A2D 80CC90              <1> 	OR	AH,MED_DET+RATE_250	; MUST BE RATE 250
  1552                              <1> 
  1553                              <1> SKP_STATE:
  1554 00003A30 88A7[75310100]      <1> 	MOV	[DSK_STATE+eDI], AH	; STORE AWAY
  1555                              <1> F1_OUT:
  1556 00003A36 C3                  <1> 	RETn
  1557                              <1> CL_DRV:	
  1558 00003A37 30E4                <1> 	XOR	AH,AH			; CLEAR STATE
  1559 00003A39 EBF5                <1> 	JMP	SHORT SKP_STATE		; SAVE IT
  1560                              <1> 
  1561                              <1> ;-------------------------------------------------------------------------------
  1562                              <1> ; MED_CHANGE	
  1563                              <1> ;	CHECKS FOR MEDIA CHANGE, RESETS MEDIA CHANGE, 
  1564                              <1> ;	CHECKS MEDIA CHANGE AGAIN.
  1565                              <1> ;
  1566                              <1> ; ON EXIT:	CY = 1 MEANS MEDIA CHANGE OR TIMEOUT
  1567                              <1> ;		@DSKETTE_STATUS = ERROR CODE
  1568                              <1> ;-------------------------------------------------------------------------------
  1569                              <1> MED_CHANGE:
  1570 00003A3B E888060000          <1> 	CALL	READ_DSKCHNG		; READ DISK CHANCE LINE STATE
  1571 00003A40 7447                <1> 	JZ	short MC_OUT		; BYPASS HANDLING DISK CHANGE LINE
  1572 00003A42 80A7[75310100]EF    <1> 	AND	byte [DSK_STATE+eDI], ~MED_DET ; CLEAR STATE FOR THIS DRIVE
  1573                              <1> 
  1574                              <1> ;	THIS SEQUENCE ENSURES WHENEVER A DISKETTE IS CHANGED THAT
  1575                              <1> ;	ON THE NEXT OPERATION THE REQUIRED MOTOR START UP TIME WILL
  1576                              <1> ;	BE WAITED. (DRIVE MOTOR MAY GO OFF UPON DOOR OPENING).
  1577                              <1> 
  1578 00003A49 6689F9              <1> 	MOV	CX,DI			; CL = DRIVE 0
  1579 00003A4C B001                <1> 	MOV	AL,1			; MOTOR ON BIT MASK
  1580 00003A4E D2E0                <1> 	SHL	AL,CL			; TO APPROPRIATE POSITION
  1581 00003A50 F6D0                <1> 	NOT	AL			; KEEP ALL BUT MOTOR ON
  1582 00003A52 FA                  <1> 	CLI				; NO INTERRUPTS
  1583 00003A53 2005[66310100]      <1> 	AND	[MOTOR_STATUS], AL	; TURN MOTOR OFF INDICATOR
  1584 00003A59 FB                  <1> 	STI				; INTERRUPTS ENABLED
  1585 00003A5A E810040000          <1> 	CALL	MOTOR_ON		; TURN MOTOR ON
  1586                              <1> 
  1587                              <1> ;-----	THIS SEQUENCE OF SEEKS IS USED TO RESET DISKETTE CHANGE SIGNAL
  1588                              <1> 
  1589 00003A5F E86DF9FFFF          <1> 	CALL	DSK_RESET		; RESET NEC
  1590 00003A64 B501                <1> 	MOV	CH,01H			; MOVE TO CYLINDER 1
  1591 00003A66 E8FF040000          <1> 	CALL	SEEK			; ISSUE SEEK
  1592 00003A6B 30ED                <1> 	XOR	CH,CH			; MOVE TO CYLINDER 0
  1593 00003A6D E8F8040000          <1> 	CALL	SEEK			; ISSUE SEEK
  1594 00003A72 C605[68310100]06    <1> 	MOV	byte [DSKETTE_STATUS], MEDIA_CHANGE ; STORE IN STATUS
  1595                              <1> OK1:
  1596 00003A79 E84A060000          <1> 	CALL	READ_DSKCHNG		; CHECK MEDIA CHANGED AGAIN
  1597 00003A7E 7407                <1> 	JZ	short OK2		; IF ACTIVE, NO DISKETTE, TIMEOUT
  1598                              <1> OK4:
  1599 00003A80 C605[68310100]80    <1> 	MOV	byte [DSKETTE_STATUS], TIME_OUT ; TIMEOUT IF DRIVE EMPTY
  1600                              <1> OK2:		
  1601 00003A87 F9                  <1> 	STC				; MEDIA CHANGED, SET CY
  1602 00003A88 C3                  <1> 	RETn
  1603                              <1> MC_OUT:
  1604 00003A89 F8                  <1> 	CLC				; NO MEDIA CHANGED, CLEAR CY
  1605 00003A8A C3                  <1> 	RETn
  1606                              <1> 
  1607                              <1> ;-------------------------------------------------------------------------------
  1608                              <1> ; SEND_RATE
  1609                              <1> ;	SENDS DATA RATE COMMAND TO NEC
  1610                              <1> ; ON ENTRY:	DI = DRIVE #
  1611                              <1> ; ON EXIT:	NONE
  1612                              <1> ; REGISTERS ALTERED: DX
  1613                              <1> ;-------------------------------------------------------------------------------
  1614                              <1> SEND_RATE:
  1615 00003A8B 6650                <1> 	PUSH	AX			; SAVE REG.
  1616 00003A8D 8025[70310100]3F    <1> 	AND	byte [LASTRATE], ~SEND_MSK ; ELSE CLEAR LAST RATE ATTEMPTED
  1617 00003A94 8A87[75310100]      <1> 	MOV	AL, [DSK_STATE+eDI]	; GET RATE STATE OF THIS DRIVE
  1618 00003A9A 24C0                <1> 	AND	AL,SEND_MSK		; KEEP ONLY RATE BITS
  1619 00003A9C 0805[70310100]      <1> 	OR	[LASTRATE], AL		; SAVE NEW RATE FOR NEXT CHECK
  1620 00003AA2 C0C002              <1> 	ROL	AL,2			; MOVE TO BIT OUTPUT POSITIONS
  1621 00003AA5 66BAF703            <1> 	MOV	DX,03F7H		; OUTPUT NEW DATA RATE
  1622 00003AA9 EE                  <1> 	OUT	DX,AL
  1623 00003AAA 6658                <1> 	POP	AX			; RESTORE REG.
  1624 00003AAC C3                  <1> 	RETn
  1625                              <1> 
  1626                              <1> ;-------------------------------------------------------------------------------
  1627                              <1> ; CHK_LASTRATE
  1628                              <1> ;	CHECK PREVIOUS DATE RATE SNT TO THE CONTROLLER.
  1629                              <1> ; ON ENTRY:
  1630                              <1> ;	DI = DRIVE #
  1631                              <1> ; ON EXIT:
  1632                              <1> ;	ZF =  1 DATA RATE IS THE SAME AS THE LAST RATE SENT TO NEC
  1633                              <1> ;	ZF =  0 DATA RATE IS DIFFERENT FROM LAST RATE
  1634                              <1> ; REGISTERS ALTERED: DX
  1635                              <1> ;-------------------------------------------------------------------------------
  1636                              <1> CHK_LASTRATE:
  1637 00003AAD 6650                <1> 	PUSH	AX			; SAVE REG
  1638 00003AAF 2225[70310100]      <1> 	AND	AH, [LASTRATE]		; GET LAST DATA RATE SELECTED
  1639 00003AB5 8A87[75310100]      <1> 	MOV	AL, [DSK_STATE+eDI]	; GET RATE STATE OF THIS DRIVE
  1640 00003ABB 6625C0C0            <1>         AND     AX, SEND_MSK*257        ; KEEP ONLY RATE BITS OF BOTH
  1641 00003ABF 38E0                <1> 	CMP	AL, AH			; COMPARE TO PREVIOUSLY TRIED
  1642                              <1> 					; ZF = 1 RATE IS THE SAME
  1643 00003AC1 6658                <1> 	POP	AX			; RESTORE REG.
  1644 00003AC3 C3                  <1> 	RETn
  1645                              <1> 
  1646                              <1> ;-------------------------------------------------------------------------------
  1647                              <1> ; DMA_SETUP
  1648                              <1> ;	THIS ROUTINE SETS UP THE DMA FOR READ/WRITE/VERIFY OPERATIONS.
  1649                              <1> ;
  1650                              <1> ; ON ENTRY:	AL = DMA COMMAND
  1651                              <1> ;
  1652                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1653                              <1> ;-------------------------------------------------------------------------------
  1654                              <1> 
  1655                              <1> ; SI = Head #, # of Sectors or DASD Type
  1656                              <1> 
  1657                              <1> ; 22/08/2015
  1658                              <1> ; 08/02/2015 - Protected Mode Modification
  1659                              <1> ; 06/02/2015 - 07/02/2015
  1660                              <1> ; NOTE: Buffer address must be in 1st 16MB of Physical Memory (24 bit limit).
  1661                              <1> ; (DMA Addres = Physical Address)
  1662                              <1> ; (Retro UNIX 386 v1 Kernel/System Mode Virtual Address = Physical Address)
  1663                              <1> ;
  1664                              <1> 
  1665                              <1> 
  1666                              <1> ; 04/02/2016 (clc)
  1667                              <1> ; 20/02/2015 modification (source: AWARD BIOS 1999, DMA_SETUP)
  1668                              <1> ; 16/12/2014 (IODELAY)
  1669                              <1> 
  1670                              <1> DMA_SETUP:
  1671                              <1> 
  1672                              <1> ;; 20/02/2015
  1673 00003AC4 8B5504              <1> 	mov	edx, [ebp+4] 		; Buffer address
  1674 00003AC7 F7C2000000FF        <1> 	test	edx, 0FF000000h		; 16 MB limit (22/08/2015, bugfix)
  1675 00003ACD 756E                <1> 	jnz	short dma_bnd_err_stc
  1676                              <1> 	;
  1677 00003ACF 6650                <1> 	push	ax			; DMA command
  1678 00003AD1 52                  <1> 	push	edx			; *
  1679 00003AD2 B203                <1> 	mov	dl, 3			; GET BYTES/SECTOR PARAMETER
  1680 00003AD4 E851030000          <1> 	call	GET_PARM		; 
  1681 00003AD9 88E1                <1> 	mov	cl, ah 			; SHIFT COUNT (0=128, 1=256, 2=512 ETC)
  1682 00003ADB 6689F0              <1> 	mov	ax, si			; Sector count
  1683 00003ADE 88C4                <1> 	mov	ah, al			; AH =  # OF SECTORS
  1684 00003AE0 28C0                <1> 	sub	al, al			; AL = 0, AX = # SECTORS * 256
  1685 00003AE2 66D1E8              <1> 	shr	ax, 1			; AX = # SECTORS * 128
  1686 00003AE5 66D3E0              <1> 	shl	ax, cl			; SHIFT BY PARAMETER VALUE
  1687 00003AE8 6648                <1> 	dec	ax			; -1 FOR DMA VALUE
  1688 00003AEA 6689C1              <1> 	mov	cx, ax
  1689 00003AED 5A                  <1> 	pop	edx			; *
  1690 00003AEE 6658                <1> 	pop	ax
  1691 00003AF0 3C42                <1> 	cmp	al, 42h
  1692 00003AF2 7507                <1>         jne     short NOT_VERF
  1693 00003AF4 BA0000FF00          <1> 	mov	edx, 0FF0000h
  1694 00003AF9 EB08                <1> 	jmp	short J33
  1695                              <1> NOT_VERF:
  1696 00003AFB 6601CA              <1> 	add	dx, cx			; check for overflow
  1697 00003AFE 723E                <1> 	jc	short dma_bnd_err
  1698                              <1> 	;
  1699 00003B00 6629CA              <1> 	sub	dx, cx			; Restore start address
  1700                              <1> J33:
  1701 00003B03 FA                  <1> 	CLI				; DISABLE INTERRUPTS DURING DMA SET-UP
  1702 00003B04 E60C                <1> 	OUT	DMA+12,AL		; SET THE FIRST/LA5T F/F
  1703                              <1> 	IODELAY				; WAIT FOR I/O
  1703 00003B06 EB00                <2>  jmp short $+2
  1703 00003B08 EB00                <2>  jmp short $+2
  1704 00003B0A E60B                <1> 	OUT	DMA+11,AL		; OUTPUT THE MODE BYTE
  1705 00003B0C 89D0                <1> 	mov	eax, edx		; Buffer address
  1706 00003B0E E604                <1> 	OUT	DMA+4,AL		; OUTPUT LOW ADDRESS
  1707                              <1> 	IODELAY				; WAIT FOR I/O
  1707 00003B10 EB00                <2>  jmp short $+2
  1707 00003B12 EB00                <2>  jmp short $+2
  1708 00003B14 88E0                <1> 	MOV	AL,AH
  1709 00003B16 E604                <1> 	OUT	DMA+4,AL		; OUTPUT HIGH ADDRESS
  1710 00003B18 C1E810              <1> 	shr	eax, 16
  1711                              <1> 	IODELAY				; I/O WAIT STATE
  1711 00003B1B EB00                <2>  jmp short $+2
  1711 00003B1D EB00                <2>  jmp short $+2
  1712 00003B1F E681                <1> 	OUT	081H,AL			; OUTPUT highest BITS TO PAGE REGISTER
  1713                              <1> 	IODELAY
  1713 00003B21 EB00                <2>  jmp short $+2
  1713 00003B23 EB00                <2>  jmp short $+2
  1714 00003B25 6689C8              <1> 	mov	ax, cx			; Byte count - 1
  1715 00003B28 E605                <1> 	OUT	DMA+5,AL		; LOW BYTE OF COUNT
  1716                              <1> 	IODELAY				; WAIT FOR I/O
  1716 00003B2A EB00                <2>  jmp short $+2
  1716 00003B2C EB00                <2>  jmp short $+2
  1717 00003B2E 88E0                <1> 	MOV	AL, AH
  1718 00003B30 E605                <1> 	OUT	DMA+5,AL		; HIGH BYTE OF COUNT
  1719                              <1> 	IODELAY
  1719 00003B32 EB00                <2>  jmp short $+2
  1719 00003B34 EB00                <2>  jmp short $+2
  1720 00003B36 FB                  <1> 	STI				; RE-ENABLE INTERRUPTS
  1721 00003B37 B002                <1> 	MOV	AL, 2			; MODE FOR 8237
  1722 00003B39 E60A                <1> 	OUT	DMA+10, AL		; INITIALIZE THE DISKETTE CHANNEL
  1723                              <1> 
  1724 00003B3B F8                  <1> 	clc	; 04/02/2016
  1725 00003B3C C3                  <1> 	retn
  1726                              <1> 
  1727                              <1> dma_bnd_err_stc:
  1728 00003B3D F9                  <1> 	stc
  1729                              <1> dma_bnd_err:
  1730 00003B3E C605[68310100]09    <1> 	MOV	byte [DSKETTE_STATUS], DMA_BOUNDARY ; SET ERROR
  1731 00003B45 C3                  <1> 	RETn				; CY SET BY ABOVE IF ERROR
  1732                              <1> 
  1733                              <1> ;; 16/12/2014
  1734                              <1> ;;	CLI				; DISABLE INTERRUPTS DURING DMA SET-UP
  1735                              <1> ;;	OUT	DMA+12,AL		; SET THE FIRST/LA5T F/F
  1736                              <1> ;;	;JMP	$+2			; WAIT FOR I/O
  1737                              <1> ;;	IODELAY
  1738                              <1> ;; 	OUT	DMA+11,AL		; OUTPUT THE MODE BYTE
  1739                              <1> ;;	;SIODELAY
  1740                              <1> ;;      ;CMP	AL, 42H			; DMA VERIFY COMMAND
  1741                              <1> ;;      ;JNE	short NOT_VERF		; NO
  1742                              <1> ;;      ;XOR	AX, AX			; START ADDRESS
  1743                              <1> ;;      ;JMP	SHORT J33
  1744                              <1> ;;;NOT_VERF:	
  1745                              <1> ;;	;MOV	AX,ES			; GET THE ES VALUE
  1746                              <1> ;;	;ROL	AX,4			; ROTATE LEFT
  1747                              <1> ;;	;MOV	CH,AL			; GET HIGHEST NIBBLE OF ES TO CH
  1748                              <1> ;;	;AND	AL,11110000B		; ZERO THE LOW NIBBLE FROM SEGMENT
  1749                              <1> ;;	;ADD	AX,[BP+2]		; TEST FOR CARRY FROM ADDITION
  1750                              <1> ;;	mov	eax, [ebp+4] ; 06/02/2015	
  1751                              <1> ;;	;JNC	short J33
  1752                              <1> ;;	;INC	CH			; CARRY MEANS HIGH 4 BITS MUST BE INC
  1753                              <1> ;;;J33:
  1754                              <1> ;;	PUSH	eAX			; SAVE START ADDRESS
  1755                              <1> ;;	OUT	DMA+4,AL		; OUTPUT LOW ADDRESS
  1756                              <1> ;;	;JMP	$+2			; WAIT FOR I/O
  1757                              <1> ;;	IODELAY
  1758                              <1> ;;	MOV	AL,AH
  1759                              <1> ;;	OUT	DMA+4,AL		; OUTPUT HIGH ADDRESS
  1760                              <1> ;;	shr	eax, 16	     ; 07/02/2015
  1761                              <1> ;;	;MOV	AL,CH			; GET HIGH 4 BITS
  1762                              <1> ;;	;JMP	$+2			; I/O WAIT STATE
  1763                              <1> ;;	IODELAY
  1764                              <1> ;;	;AND	AL,00001111B
  1765                              <1> ;;	OUT	081H,AL			; OUTPUT HIGH 4 BITS TO PAGE REGISTER
  1766                              <1> ;;	;SIODELAY
  1767                              <1> ;;
  1768                              <1> ;;;----- DETERMINE COUNT
  1769                              <1> ;;	sub	eax, eax ; 08/02/2015
  1770                              <1> ;;	MOV	AX, SI			; AL =  # OF SECTORS
  1771                              <1> ;;	XCHG	AL, AH			; AH =  # OF SECTORS
  1772                              <1> ;;	SUB	AL, AL			; AL = 0, AX = # SECTORS * 256
  1773                              <1> ;;	SHR	AX, 1			; AX = # SECTORS * 128
  1774                              <1> ;;	PUSH	AX			; SAVE # OF SECTORS * 128
  1775                              <1> ;;	MOV	DL, 3			; GET BYTES/SECTOR PARAMETER
  1776                              <1> ;;	CALL	GET_PARM		; "
  1777                              <1> ;;	MOV	CL,AH			; SHIFT COUNT (0=128, 1=256, 2=512 ETC)
  1778                              <1> ;;	POP	AX			; AX = # SECTORS * 128
  1779                              <1> ;;	SHL	AX,CL			; SHIFT BY PARAMETER VALUE
  1780                              <1> ;;	DEC	AX			; -1 FOR DMA VALUE
  1781                              <1> ;;	PUSH	eAX  ; 08/02/2015	; SAVE COUNT VALUE
  1782                              <1> ;;	OUT	DMA+5,AL		; LOW BYTE OF COUNT
  1783                              <1> ;;	;JMP	$+2			; WAIT FOR I/O
  1784                              <1> ;;	IODELAY
  1785                              <1> ;;	MOV	AL, AH
  1786                              <1> ;;	OUT	DMA+5,AL		; HIGH BYTE OF COUNT
  1787                              <1> ;;	;IODELAY
  1788                              <1> ;;	STI				; RE-ENABLE INTERRUPTS
  1789                              <1> ;;	POP	eCX  ; 08/02/2015 	; RECOVER COUNT VALUE
  1790                              <1> ;;	POP	eAX  ; 08/02/2015	; RECOVER ADDRESS VALUE
  1791                              <1> ;;	;ADD	AX, CX			; ADD, TEST FOR 64K OVERFLOW
  1792                              <1> ;;	add	ecx, eax ; 08/02/2015
  1793                              <1> ;;	MOV	AL, 2			; MODE FOR 8237
  1794                              <1> ;;	;JMP	$+2			; WAIT FOR I/O
  1795                              <1> ;;	SIODELAY
  1796                              <1> ;;	OUT	DMA+10, AL		; INITIALIZE THE DISKETTE CHANNEL
  1797                              <1> ;;	;JNC	short NO_BAD		; CHECK FOR ERROR
  1798                              <1> ;;	jc	short dma_bnd_err ; 08/02/2015
  1799                              <1> ;;	and	ecx, 0FFF00000h ; 16 MB limit
  1800                              <1> ;;	jz	short NO_BAD
  1801                              <1> ;;dma_bnd_err:
  1802                              <1> ;;	MOV	byte [DSKETTE_STATUS], DMA_BOUNDARY ; SET ERROR
  1803                              <1> ;;NO_BAD:
  1804                              <1> ;;	RETn				; CY SET BY ABOVE IF ERROR
  1805                              <1> 
  1806                              <1> ;-------------------------------------------------------------------------------
  1807                              <1> ; FMTDMA_SET
  1808                              <1> ;	THIS ROUTINE SETS UP THE DMA CONTROLLER FOR A FORMAT OPERATION.
  1809                              <1> ;
  1810                              <1> ; ON ENTRY:	NOTHING REQUIRED
  1811                              <1> ;
  1812                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1813                              <1> ;-------------------------------------------------------------------------------
  1814                              <1> 
  1815                              <1> FMTDMA_SET:
  1816                              <1> ;; 20/02/2015 modification	
  1817 00003B46 8B5504              <1> 	mov	edx, [ebp+4] 		; Buffer address
  1818 00003B49 F7C20000F0FF        <1> 	test	edx, 0FFF00000h		; 16 MB limit
  1819 00003B4F 75EC                <1> 	jnz	short dma_bnd_err_stc
  1820                              <1> 	;
  1821 00003B51 6652                <1> 	push	dx			; *
  1822 00003B53 B204                <1> 	mov	DL, 4			; SECTORS/TRACK VALUE IN PARM TABLE
  1823 00003B55 E8D0020000          <1> 	call	GET_PARM		; "
  1824 00003B5A 88E0                <1> 	mov	al, ah			; AL = SECTORS/TRACK VALUE
  1825 00003B5C 28E4                <1> 	sub	ah, ah			; AX = SECTORS/TRACK VALUE
  1826 00003B5E 66C1E002            <1> 	shl	ax, 2			; AX = SEC/TRK * 4 (OFFSET C,H,R,N)
  1827 00003B62 6648                <1> 	dec	ax			; -1 FOR DMA VALUE
  1828 00003B64 6689C1              <1> 	mov	cx, ax
  1829 00003B67 665A                <1> 	pop	dx			; *
  1830 00003B69 6601CA              <1> 	add	dx, cx			; check for overflow
  1831 00003B6C 72D0                <1> 	jc	short dma_bnd_err
  1832                              <1> 	;
  1833 00003B6E 6629CA              <1> 	sub	dx, cx			; Restore start address
  1834                              <1> 	;
  1835 00003B71 B04A                <1> 	MOV	AL, 04AH		; WILL WRITE TO THE DISKETTE
  1836 00003B73 FA                  <1> 	CLI				; DISABLE INTERRUPTS DURING DMA SET-UP
  1837 00003B74 E60C                <1> 	OUT	DMA+12,AL		; SET THE FIRST/LA5T F/F
  1838                              <1> 	IODELAY				; WAIT FOR I/O
  1838 00003B76 EB00                <2>  jmp short $+2
  1838 00003B78 EB00                <2>  jmp short $+2
  1839 00003B7A E60B                <1> 	OUT	DMA+11,AL		; OUTPUT THE MODE BYTE
  1840 00003B7C 89D0                <1> 	mov	eax, edx		; Buffer address
  1841 00003B7E E604                <1> 	OUT	DMA+4,AL		; OUTPUT LOW ADDRESS
  1842                              <1> 	IODELAY				; WAIT FOR I/O
  1842 00003B80 EB00                <2>  jmp short $+2
  1842 00003B82 EB00                <2>  jmp short $+2
  1843 00003B84 88E0                <1> 	MOV	AL,AH
  1844 00003B86 E604                <1> 	OUT	DMA+4,AL		; OUTPUT HIGH ADDRESS
  1845 00003B88 C1E810              <1> 	shr	eax, 16
  1846                              <1> 	IODELAY				; I/O WAIT STATE
  1846 00003B8B EB00                <2>  jmp short $+2
  1846 00003B8D EB00                <2>  jmp short $+2
  1847 00003B8F E681                <1> 	OUT	081H,AL			; OUTPUT highest BITS TO PAGE REGISTER
  1848                              <1> 	IODELAY
  1848 00003B91 EB00                <2>  jmp short $+2
  1848 00003B93 EB00                <2>  jmp short $+2
  1849 00003B95 6689C8              <1> 	mov	ax, cx			; Byte count - 1
  1850 00003B98 E605                <1> 	OUT	DMA+5,AL		; LOW BYTE OF COUNT
  1851                              <1> 	IODELAY				; WAIT FOR I/O
  1851 00003B9A EB00                <2>  jmp short $+2
  1851 00003B9C EB00                <2>  jmp short $+2
  1852 00003B9E 88E0                <1> 	MOV	AL, AH
  1853 00003BA0 E605                <1> 	OUT	DMA+5,AL		; HIGH BYTE OF COUNT
  1854                              <1> 	IODELAY
  1854 00003BA2 EB00                <2>  jmp short $+2
  1854 00003BA4 EB00                <2>  jmp short $+2
  1855 00003BA6 FB                  <1> 	STI				; RE-ENABLE INTERRUPTS
  1856 00003BA7 B002                <1> 	MOV	AL, 2			; MODE FOR 8237
  1857 00003BA9 E60A                <1> 	OUT	DMA+10, AL		; INITIALIZE THE DISKETTE CHANNEL
  1858 00003BAB C3                  <1> 	retn
  1859                              <1> 
  1860                              <1> ;; 08/02/2015 - Protected Mode Modification
  1861                              <1> ;;	MOV	AL, 04AH		; WILL WRITE TO THE DISKETTE
  1862                              <1> ;;	CLI				; DISABLE INTERRUPTS DURING DMA SET-UP
  1863                              <1> ;;	OUT	DMA+12,AL		; SET THE FIRST/LA5T F/F
  1864                              <1> ;;	;JMP	$+2			; WAIT FOR I/O
  1865                              <1> ;;	IODELAY
  1866                              <1> ;;	OUT	DMA+11,AL		; OUTPUT THE MODE BYTE
  1867                              <1> ;;	;MOV	AX,ES			; GET THE ES VALUE
  1868                              <1> ;;	;ROL	AX,4			; ROTATE LEFT
  1869                              <1> ;;	;MOV	CH,AL			; GET HIGHEST NIBBLE OF ES TO CH
  1870                              <1> ;;	;AND	AL,11110000B		; ZERO THE LOW NIBBLE FROM SEGMENT
  1871                              <1> ;;	;ADD	AX,[BP+2]		; TEST FOR CARRY FROM ADDITION
  1872                              <1> ;;	;JNC	short J33A
  1873                              <1> ;;	;INC	CH			; CARRY MEANS HIGH 4 BITS MUST BE INC
  1874                              <1> ;;	mov	eax, [ebp+4] ; 08/02/2015
  1875                              <1> ;;;J33A:
  1876                              <1> ;;	PUSH	eAX ; 08/02/2015	; SAVE START ADDRESS
  1877                              <1> ;;	OUT	DMA+4,AL		; OUTPUT LOW ADDRESS
  1878                              <1> ;;	;JMP	$+2			; WAIT FOR I/O
  1879                              <1> ;;	IODELAY
  1880                              <1> ;;	MOV	AL,AH
  1881                              <1> ;;	OUT	DMA+4,AL		; OUTPUT HIGH ADDRESS
  1882                              <1> ;;	shr 	eax, 16 ; 08/02/2015
  1883                              <1> ;;	;MOV	AL,CH			; GET HIGH 4 BITS
  1884                              <1> ;;	;JMP	$+2			; I/O WAIT STATE
  1885                              <1> ;;	IODELAY
  1886                              <1> ;;	;AND	AL,00001111B
  1887                              <1> ;;	OUT	081H,AL			; OUTPUT HIGH 4 BITS TO PAGE REGISTER
  1888                              <1> ;;
  1889                              <1> ;;;----- DETERMINE COUNT
  1890                              <1> ;;	sub	eax, eax ; 08/02/2015
  1891                              <1> ;;	MOV	DL, 4			; SECTORS/TRACK VALUE IN PARM TABLE
  1892                              <1> ;;	CALL	GET_PARM		; "
  1893                              <1> ;;	XCHG	AL, AH			; AL = SECTORS/TRACK VALUE
  1894                              <1> ;;	SUB	AH, AH			; AX = SECTORS/TRACK VALUE
  1895                              <1> ;;	SHL	AX, 2			; AX = SEC/TRK * 4 (OFFSET C,H,R,N)
  1896                              <1> ;;	DEC	AX			; -1 FOR DMA VALUE
  1897                              <1> ;;	PUSH	eAX 	; 08/02/2015	; SAVE # OF BYTES TO BE TRANSFERED
  1898                              <1> ;;	OUT	DMA+5,AL		; LOW BYTE OF COUNT
  1899                              <1> ;;	;JMP	$+2			; WAIT FOR I/O
  1900                              <1> ;;	IODELAY
  1901                              <1> ;;	MOV	AL, AH
  1902                              <1> ;;	OUT	DMA+5,AL		; HIGH BYTE OF COUNT
  1903                              <1> ;;	STI				; RE-ENABLE INTERRUPTS
  1904                              <1> ;;	POP	eCX	; 08/02/2015	; RECOVER COUNT VALUE
  1905                              <1> ;;	POP	eAX	; 08/02/2015	; RECOVER ADDRESS VALUE
  1906                              <1> ;;	;ADD	AX, CX			; ADD, TEST FOR 64K OVERFLOW
  1907                              <1> ;;	add	ecx, eax ; 08/02/2015
  1908                              <1> ;;	MOV	AL, 2			; MODE FOR 8237
  1909                              <1> ;;	;JMP	$+2			; WAIT FOR I/O
  1910                              <1> ;;	SIODELAY
  1911                              <1> ;;	OUT	DMA+10, AL		; INITIALIZE THE DISKETTE CHANNEL
  1912                              <1> ;;	;JNC	short FMTDMA_OK		; CHECK FOR ERROR
  1913                              <1> ;;	jc	short fmtdma_bnd_err ; 08/02/2015
  1914                              <1> ;;	and	ecx, 0FFF00000h  ; 16 MB limit
  1915                              <1> ;;	jz	short FMTDMA_OK
  1916                              <1> ;;	stc	; 20/02/2015
  1917                              <1> ;;fmtdma_bnd_err:
  1918                              <1> ;;	MOV	byte [DSKETTE_STATUS], DMA_BOUNDARY ; SET ERROR
  1919                              <1> ;;FMTDMA_OK:
  1920                              <1> ;;	RETn				; CY SET BY ABOVE IF ERROR
  1921                              <1> 
  1922                              <1> ;-------------------------------------------------------------------------------
  1923                              <1> ; NEC_INIT	
  1924                              <1> ;	THIS ROUTINE SEEKS TO THE REQUESTED TRACK AND INITIALIZES
  1925                              <1> ;	THE NEC FOR THE READ/WRITE/VERIFY/FORMAT OPERATION.
  1926                              <1> ;
  1927                              <1> ; ON ENTRY:	AH = NEC COMMAND TO BE PERFORMED
  1928                              <1> ;
  1929                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1930                              <1> ;-------------------------------------------------------------------------------
  1931                              <1> NEC_INIT:
  1932 00003BAC 6650                <1> 	PUSH	AX			; SAVE NEC COMMAND
  1933 00003BAE E8BC020000          <1> 	CALL	MOTOR_ON		; TURN MOTOR ON FOR SPECIFIC DRIVE
  1934                              <1> 
  1935                              <1> ;-----	DO THE SEEK OPERATION
  1936                              <1> 
  1937 00003BB3 8A6D01              <1> 	MOV	CH,[eBP+1]		; CH = TRACK #
  1938 00003BB6 E8AF030000          <1> 	CALL	SEEK			; MOVE TO CORRECT TRACK
  1939 00003BBB 6658                <1> 	POP	AX			; RECOVER COMMAND
  1940 00003BBD 721E                <1> 	JC	short ER_1		; ERROR ON SEEK
  1941 00003BBF BB[DD3B0000]        <1> 	MOV	eBX, ER_1		; LOAD ERROR ADDRESS
  1942 00003BC4 53                  <1> 	PUSH	eBX			; PUSH NEC_OUT ERROR RETURN
  1943                              <1> 
  1944                              <1> ;-----	SEND OUT THE PARAMETERS TO THE CONTROLLER
  1945                              <1> 
  1946 00003BC5 E866030000          <1> 	CALL	NEC_OUTPUT		; OUTPUT THE OPERATION COMMAND
  1947 00003BCA 6689F0              <1> 	MOV	AX,SI			; AH = HEAD #
  1948 00003BCD 89FB                <1> 	MOV	eBX,eDI			; BL = DRIVE #
  1949 00003BCF C0E402              <1> 	SAL	AH,2			; MOVE IT TO BIT 2
  1950 00003BD2 80E404              <1> 	AND	AH,00000100B		; ISOLATE THAT BIT
  1951 00003BD5 08DC                <1> 	OR	AH,BL			; OR IN THE DRIVE NUMBER
  1952 00003BD7 E854030000          <1> 	CALL	NEC_OUTPUT		; FALL THRU CY SET IF ERROR
  1953 00003BDC 5B                  <1> 	POP	eBX			; THROW AWAY ERROR RETURN
  1954                              <1> ER_1:
  1955 00003BDD C3                  <1> 	RETn
  1956                              <1> 
  1957                              <1> ;-------------------------------------------------------------------------------
  1958                              <1> ; RWV_COM
  1959                              <1> ;	THIS ROUTINE SENDS PARAMETERS TO THE NEC SPECIFIC TO THE 
  1960                              <1> ;	READ/WRITE/VERIFY OPERATIONS.
  1961                              <1> ;
  1962                              <1> ; ON ENTRY:	CS:BX = ADDRESS OF MEDIA/DRIVE PARAMETER TABLE
  1963                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1964                              <1> ;-------------------------------------------------------------------------------
  1965                              <1> RWV_COM:
  1966 00003BDE B8[293C0000]        <1> 	MOV	eAX, ER_2		; LOAD ERROR ADDRESS
  1967 00003BE3 50                  <1> 	PUSH	eAX			; PUSH NEC_OUT ERROR RETURN
  1968 00003BE4 8A6501              <1> 	MOV	AH,[eBP+1]		; OUTPUT TRACK #
  1969 00003BE7 E844030000          <1> 	CALL	NEC_OUTPUT
  1970 00003BEC 6689F0              <1> 	MOV	AX,SI			; OUTPUT HEAD #
  1971 00003BEF E83C030000          <1> 	CALL	NEC_OUTPUT
  1972 00003BF4 8A6500              <1>         MOV     AH,[eBP]                ; OUTPUT SECTOR #
  1973 00003BF7 E834030000          <1> 	CALL	NEC_OUTPUT
  1974 00003BFC B203                <1> 	MOV	DL,3			; BYTES/SECTOR PARAMETER FROM BLOCK
  1975 00003BFE E827020000          <1> 	CALL	GET_PARM 		; ... TO THE NEC
  1976 00003C03 E828030000          <1> 	CALL	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  1977 00003C08 B204                <1> 	MOV	DL,4			; EOT PARAMETER FROM BLOCK
  1978 00003C0A E81B020000          <1> 	CALL	GET_PARM 		; ... TO THE NEC
  1979 00003C0F E81C030000          <1> 	CALL	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  1980 00003C14 8A6305              <1>         MOV     AH, [eBX+MD.GAP]        ; GET GAP LENGTH
  1981                              <1> _R15:
  1982 00003C17 E814030000          <1> 	CALL	NEC_OUTPUT
  1983 00003C1C B206                <1> 	MOV	DL,6			; DTL PARAMETER PROM BLOCK
  1984 00003C1E E807020000          <1> 	CALL	GET_PARM		;  TO THE NEC
  1985 00003C23 E808030000          <1> 	CALL	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  1986 00003C28 58                  <1> 	POP	eAX			; THROW AWAY ERROR EXIT
  1987                              <1> ER_2:
  1988 00003C29 C3                  <1> 	RETn
  1989                              <1> 
  1990                              <1> ;-------------------------------------------------------------------------------
  1991                              <1> ; NEC_TERM
  1992                              <1> ;	THIS ROUTINE WAITS FOR THE OPERATION THEN ACCEPTS THE STATUS 
  1993                              <1> ;	FROM THE NEC FOR THE READ/WRITE/VERIFY/FORWAT OPERATION.
  1994                              <1> ;
  1995                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1996                              <1> ;-------------------------------------------------------------------------------
  1997                              <1> NEC_TERM:
  1998                              <1> 
  1999                              <1> ;-----	LET THE OPERATION HAPPEN
  2000                              <1> 
  2001 00003C2A 56                  <1> 	PUSH	eSI			; SAVE HEAD #, # OF SECTORS
  2002 00003C2B E80D040000          <1> 	CALL	WAIT_INT		; WAIT FOR THE INTERRUPT
  2003 00003C30 9C                  <1> 	PUSHF
  2004 00003C31 E837040000          <1> 	CALL	RESULTS			; GET THE NEC STATUS
  2005 00003C36 724B                <1> 	JC	short SET_END_POP
  2006 00003C38 9D                  <1> 	POPF
  2007 00003C39 723E                <1> 	JC	short SET_END		; LOOK FOR ERROR
  2008                              <1> 
  2009                              <1> ;-----	CHECK THE RESULTS RETURNED BY THE CONTROLLER
  2010                              <1> 
  2011 00003C3B FC                  <1> 	CLD				; SET THE CORRECT DIRECTION
  2012 00003C3C BE[69310100]        <1> 	MOV	eSI, NEC_STATUS		; POINT TO STATUS FIELD
  2013 00003C41 AC                  <1> 	lodsb				; GET ST0
  2014 00003C42 24C0                <1> 	AND	AL,11000000B		; TEST FOR NORMAL TERMINATION
  2015 00003C44 7433                <1> 	JZ	short SET_END
  2016 00003C46 3C40                <1> 	CMP	AL,01000000B		; TEST FOR ABNORMAL TERMINATION
  2017 00003C48 7527                <1> 	JNZ	short J18		; NOT ABNORMAL, BAD NEC
  2018                              <1> 
  2019                              <1> ;-----	ABNORMAL TERMINATION, FIND OUT WHY
  2020                              <1> 
  2021 00003C4A AC                  <1> 	lodsb				; GET ST1
  2022 00003C4B D0E0                <1> 	SAL	AL,1			; TEST FOR EDT FOUND
  2023 00003C4D B404                <1> 	MOV	AH,RECORD_NOT_FND
  2024 00003C4F 7222                <1> 	JC	short J19
  2025 00003C51 C0E002              <1> 	SAL	AL,2
  2026 00003C54 B410                <1> 	MOV	AH,BAD_CRC
  2027 00003C56 721B                <1> 	JC	short J19
  2028 00003C58 D0E0                <1> 	SAL	AL,1			; TEST FOR DMA OVERRUN
  2029 00003C5A B408                <1> 	MOV	AH,BAD_DMA
  2030 00003C5C 7215                <1> 	JC	short J19
  2031 00003C5E C0E002              <1> 	SAL	AL,2			; TEST FOR RECORD NOT FOUND
  2032 00003C61 B404                <1> 	MOV	AH,RECORD_NOT_FND
  2033 00003C63 720E                <1> 	JC	short J19
  2034 00003C65 D0E0                <1> 	SAL	AL,1
  2035 00003C67 B403                <1> 	MOV	AH,WRITE_PROTECT	; TEST FOR WRITE_PROTECT
  2036 00003C69 7208                <1> 	JC	short J19
  2037 00003C6B D0E0                <1> 	SAL	AL,1			; TEST MISSING ADDRESS MARK
  2038 00003C6D B402                <1> 	MOV	AH,BAD_ADDR_MARK
  2039 00003C6F 7202                <1> 	JC	short J19
  2040                              <1> 
  2041                              <1> ;----- 	NEC MUST HAVE FAILED
  2042                              <1> J18:
  2043 00003C71 B420                <1> 	MOV	AH,BAD_NEC
  2044                              <1> J19:
  2045 00003C73 0825[68310100]      <1> 	OR	[DSKETTE_STATUS], AH
  2046                              <1> SET_END:
  2047 00003C79 803D[68310100]01    <1> 	CMP	byte [DSKETTE_STATUS], 1 ; SET ERROR CONDITION
  2048 00003C80 F5                  <1> 	CMC
  2049 00003C81 5E                  <1> 	POP	eSI
  2050 00003C82 C3                  <1> 	RETn				; RESTORE HEAD #, # OF SECTORS
  2051                              <1> 
  2052                              <1> SET_END_POP:
  2053 00003C83 9D                  <1> 	POPF
  2054 00003C84 EBF3                <1> 	JMP	SHORT SET_END
  2055                              <1> 
  2056                              <1> ;-------------------------------------------------------------------------------
  2057                              <1> ; DSTATE:	ESTABLISH STATE UPON SUCCESSFUL OPERATION.
  2058                              <1> ;-------------------------------------------------------------------------------
  2059                              <1> DSTATE:
  2060 00003C86 803D[68310100]00    <1> 	CMP	byte [DSKETTE_STATUS],0	; CHECK FOR ERROR
  2061 00003C8D 753E                <1> 	JNZ	short SETBAC		    ; IF ERROR JUMP
  2062 00003C8F 808F[75310100]10    <1> 	OR	byte [DSK_STATE+eDI],MED_DET ; NO ERROR, MARK MEDIA AS DETERMINED
  2063 00003C96 F687[75310100]04    <1> 	TEST	byte [DSK_STATE+eDI],DRV_DET ; DRIVE DETERMINED ?
  2064 00003C9D 752E                <1> 	JNZ	short SETBAC		; IF DETERMINED NO TRY TO DETERMINE
  2065 00003C9F 8A87[75310100]      <1> 	MOV	AL,[DSK_STATE+eDI]	; LOAD STATE
  2066 00003CA5 24C0                <1> 	AND	AL,RATE_MSK		; KEEP ONLY RATE
  2067 00003CA7 3C80                <1> 	CMP	AL,RATE_250		; RATE 250 ?
  2068 00003CA9 751B                <1> 	JNE	short M_12		; NO, MUST BE 1.2M OR 1.44M DRIVE
  2069                              <1> 
  2070                              <1> ;----- 	CHECK IF IT IS 1.44M
  2071                              <1> 
  2072 00003CAB E871010000          <1> 	CALL	CMOS_TYPE		; RETURN DRIVE TYPE IN (AL)
  2073                              <1> 	;;20/02/2015
  2074                              <1> 	;;JC	short M_12		; CMOS BAD
  2075 00003CB0 7414                <1> 	jz	short M_12 ;; 20/02/2015
  2076 00003CB2 3C04                <1> 	CMP	AL, 4			; 1.44MB DRIVE ?
  2077 00003CB4 7410                <1> 	JE	short M_12		; YES
  2078                              <1> M_720:
  2079 00003CB6 80A7[75310100]FD    <1> 	AND	byte [DSK_STATE+eDI], ~FMT_CAPA ; TURN OFF FORMAT CAPABILITY
  2080 00003CBD 808F[75310100]04    <1> 	OR	byte [DSK_STATE+eDI],DRV_DET  ; MARK DRIVE DETERMINED
  2081 00003CC4 EB07                <1> 	JMP	SHORT SETBAC		; BACK
  2082                              <1> M_12:	
  2083 00003CC6 808F[75310100]06    <1> 	OR	byte [DSK_STATE+eDI],DRV_DET+FMT_CAPA 
  2084                              <1> 					; TURN ON DETERMINED & FMT CAPA
  2085                              <1> SETBAC:
  2086 00003CCD C3                  <1> 	RETn
  2087                              <1> 
  2088                              <1> ;-------------------------------------------------------------------------------
  2089                              <1> ; RETRY	
  2090                              <1> ;	DETERMINES WHETHER A RETRY IS NECESSARY. 
  2091                              <1> ;	IF RETRY IS REQUIRED THEN STATE INFORMATION IS UPDATED FOR RETRY.
  2092                              <1> ;
  2093                              <1> ; ON EXIT:	CY = 1 FOR RETRY, CY = 0 FOR NO RETRY
  2094                              <1> ;-------------------------------------------------------------------------------
  2095                              <1> RETRY:
  2096 00003CCE 803D[68310100]00    <1> 	CMP	byte [DSKETTE_STATUS],0	; GET STATUS OF OPERATION
  2097 00003CD5 7445                <1> 	JZ	short NO_RETRY		; SUCCESSFUL OPERATION
  2098 00003CD7 803D[68310100]80    <1> 	CMP	byte [DSKETTE_STATUS],TIME_OUT ; IF TIME OUT NO RETRY
  2099 00003CDE 743C                <1> 	JZ	short NO_RETRY
  2100 00003CE0 8AA7[75310100]      <1> 	MOV	AH,[DSK_STATE+eDI]	; GET MEDIA STATE OF DRIVE
  2101 00003CE6 F6C410              <1> 	TEST	AH,MED_DET		; ESTABLISHED/DETERMINED ?
  2102 00003CE9 7531                <1> 	JNZ	short NO_RETRY		; IF ESTABLISHED STATE THEN TRUE ERROR
  2103 00003CEB 80E4C0              <1> 	AND	AH,RATE_MSK		; ISOLATE RATE
  2104 00003CEE 8A2D[70310100]      <1> 	MOV	CH,[LASTRATE]		; GET START OPERATION STATE
  2105 00003CF4 C0C504              <1> 	ROL	CH,4			; TO CORRESPONDING BITS
  2106 00003CF7 80E5C0              <1> 	AND	CH,RATE_MSK		; ISOLATE RATE BITS
  2107 00003CFA 38E5                <1> 	CMP	CH,AH			; ALL RATES TRIED
  2108 00003CFC 741E                <1> 	JE	short NO_RETRY		; IF YES, THEN TRUE ERROR
  2109                              <1> 
  2110                              <1> ;	SETUP STATE INDICATOR FOR RETRY ATTEMPT TO NEXT RATE
  2111                              <1> ;	 00000000B (500) -> 10000000B	(250)
  2112                              <1> ;	 10000000B (250) -> 01000000B	(300)
  2113                              <1> ;	 01000000B (300) -> 00000000B	(500)
  2114                              <1> 
  2115 00003CFE 80FC01              <1> 	CMP	AH,RATE_500+1		; SET CY FOR RATE 500
  2116 00003D01 D0DC                <1> 	RCR	AH,1			; TO NEXT STATE
  2117 00003D03 80E4C0              <1> 	AND	AH,RATE_MSK		; KEEP ONLY RATE BITS
  2118 00003D06 80A7[75310100]1F    <1> 	AND	byte [DSK_STATE+eDI], ~(RATE_MSK+DBL_STEP)
  2119                              <1> 					; RATE, DBL STEP OFF
  2120 00003D0D 08A7[75310100]      <1> 	OR	[DSK_STATE+eDI],AH	; TURN ON NEW RATE
  2121 00003D13 C605[68310100]00    <1> 	MOV	byte [DSKETTE_STATUS],0	; RESET STATUS FOR RETRY
  2122 00003D1A F9                  <1> 	STC				; SET CARRY FOR RETRY
  2123 00003D1B C3                  <1> 	RETn				; RETRY RETURN
  2124                              <1> 
  2125                              <1> NO_RETRY:
  2126 00003D1C F8                  <1> 	CLC				; CLEAR CARRY NO RETRY
  2127 00003D1D C3                  <1> 	RETn				; NO RETRY RETURN
  2128                              <1> 
  2129                              <1> ;-------------------------------------------------------------------------------
  2130                              <1> ; NUM_TRANS
  2131                              <1> ;	THIS ROUTINE CALCULATES THE NUMBER OF SECTORS THAT WERE
  2132                              <1> ;	ACTUALLY TRANSFERRED TO/FROM THE DISKETTE.
  2133                              <1> ;
  2134                              <1> ; ON ENTRY:	[BP+1] = TRACK
  2135                              <1> ;		SI-HI  = HEAD
  2136                              <1> ;		[BP]   = START SECTOR
  2137                              <1> ;
  2138                              <1> ; ON EXIT:	AL = NUMBER ACTUALLY TRANSFERRED
  2139                              <1> ;-------------------------------------------------------------------------------
  2140                              <1> NUM_TRANS:
  2141 00003D1E 30C0                <1> 	XOR	AL,AL			; CLEAR FOR ERROR
  2142 00003D20 803D[68310100]00    <1> 	CMP	byte [DSKETTE_STATUS],0	; CHECK FOR ERROR
  2143 00003D27 752C                <1> 	JNZ	NT_OUT			; IF ERROR 0 TRANSFERRED
  2144 00003D29 B204                <1> 	MOV	DL,4			; SECTORS/TRACK OFFSET TO DL
  2145 00003D2B E8FA000000          <1> 	CALL	GET_PARM		; AH = SECTORS/TRACK
  2146 00003D30 8A1D[6E310100]      <1> 	MOV	BL, [NEC_STATUS+5]	; GET ENDING SECTOR
  2147 00003D36 6689F1              <1> 	MOV	CX,SI			; CH = HEAD # STARTED
  2148 00003D39 3A2D[6D310100]      <1> 	CMP	CH, [NEC_STATUS+4]	; GET HEAD ENDED UP ON
  2149 00003D3F 750D                <1> 	JNZ	DIF_HD			; IF ON SAME HEAD, THEN NO ADJUST
  2150 00003D41 8A2D[6C310100]      <1> 	MOV	CH, [NEC_STATUS+3]	; GET TRACK ENDED UP ON
  2151 00003D47 3A6D01              <1> 	CMP	CH,[eBP+1]		; IS IT ASKED FOR TRACK
  2152 00003D4A 7404                <1> 	JZ	short SAME_TRK		; IF SAME TRACK NO INCREASE
  2153 00003D4C 00E3                <1> 	ADD	BL,AH			; ADD SECTORS/TRACK
  2154                              <1> DIF_HD:
  2155 00003D4E 00E3                <1> 	ADD	BL,AH			; ADD SECTORS/TRACK
  2156                              <1> SAME_TRK:
  2157 00003D50 2A5D00              <1> 	SUB	BL,[eBP]		; SUBTRACT START FROM END
  2158 00003D53 88D8                <1> 	MOV	AL,BL			; TO AL
  2159                              <1> NT_OUT:
  2160 00003D55 C3                  <1> 	RETn
  2161                              <1> 
  2162                              <1> ;-------------------------------------------------------------------------------
  2163                              <1> ; SETUP_END
  2164                              <1> ;	RESTORES @MOTOR_COUNT TO PARAMETER PROVIDED IN TABLE 
  2165                              <1> ;	AND LOADS @DSKETTE_STATUS TO AH, AND SETS CY.
  2166                              <1> ;
  2167                              <1> ; ON EXIT:
  2168                              <1> ;	AH, @DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  2169                              <1> ;-------------------------------------------------------------------------------
  2170                              <1> SETUP_END:
  2171 00003D56 B202                <1> 	MOV	DL,2			; GET THE MOTOR WAIT PARAMETER
  2172 00003D58 6650                <1> 	PUSH	AX			; SAVE NUMBER TRANSFERRED
  2173 00003D5A E8CB000000          <1> 	CALL	GET_PARM
  2174 00003D5F 8825[67310100]      <1> 	MOV	[MOTOR_COUNT],AH	; STORE UPON RETURN
  2175 00003D65 6658                <1> 	POP	AX			; RESTORE NUMBER TRANSFERRED
  2176 00003D67 8A25[68310100]      <1> 	MOV	AH, [DSKETTE_STATUS]	; GET STATUS OF OPERATION
  2177 00003D6D 08E4                <1> 	OR	AH,AH			; CHECK FOR ERROR
  2178 00003D6F 7402                <1> 	JZ	short NUN_ERR		; NO ERROR
  2179 00003D71 30C0                <1> 	XOR	AL,AL			; CLEAR NUMBER RETURNED
  2180                              <1> NUN_ERR: 
  2181 00003D73 80FC01              <1> 	CMP	AH,1			; SET THE CARRY FLAG TO INDICATE
  2182 00003D76 F5                  <1> 	CMC				; SUCCESS OR FAILURE
  2183 00003D77 C3                  <1> 	RETn
  2184                              <1> 
  2185                              <1> ;-------------------------------------------------------------------------------
  2186                              <1> ; SETUP_DBL
  2187                              <1> ;	CHECK DOUBLE STEP.
  2188                              <1> ;
  2189                              <1> ; ON ENTRY :	DI = DRIVE
  2190                              <1> ;
  2191                              <1> ; ON EXIT :	CY = 1 MEANS ERROR
  2192                              <1> ;-------------------------------------------------------------------------------
  2193                              <1> SETUP_DBL:
  2194 00003D78 8AA7[75310100]      <1> 	MOV	AH, [DSK_STATE+eDI]	; ACCESS STATE
  2195 00003D7E F6C410              <1> 	TEST	AH,MED_DET		; ESTABLISHED STATE ?
  2196 00003D81 757E                <1> 	JNZ	short NO_DBL			; IF ESTABLISHED THEN DOUBLE DONE
  2197                              <1> 
  2198                              <1> ;-----	CHECK FOR TRACK 0 TO SPEED UP ACKNOWLEDGE OF UNFORMATTED DISKETTE
  2199                              <1> 
  2200 00003D83 C605[65310100]00    <1> 	MOV	byte [SEEK_STATUS],0	; SET RECALIBRATE REQUIRED ON ALL DRIVES
  2201 00003D8A E8E0000000          <1> 	CALL	MOTOR_ON		; ENSURE MOTOR STAY ON
  2202 00003D8F B500                <1> 	MOV	CH,0			; LOAD TRACK 0
  2203 00003D91 E8D4010000          <1> 	CALL	SEEK			; SEEK TO TRACK 0
  2204 00003D96 E868000000          <1> 	CALL	READ_ID			; READ ID FUNCTION
  2205 00003D9B 7249                <1> 	JC	short SD_ERR		; IF ERROR NO TRACK 0
  2206                              <1> 
  2207                              <1> ;-----	INITIALIZE START AND MAX TRACKS (TIMES 2 FOR BOTH HEADS)
  2208                              <1> 
  2209 00003D9D 66B95004            <1> 	MOV	CX,0450H 		; START, MAX TRACKS
  2210 00003DA1 F687[75310100]01    <1> 	TEST	byte [DSK_STATE+eDI],TRK_CAPA ; TEST FOR 80 TRACK CAPABILITY
  2211 00003DA8 7402                <1> 	JZ	short CNT_OK		; IF NOT COUNT IS SETUP
  2212 00003DAA B1A0                <1> 	MOV	CL,0A0H			; MAXIMUM TRACK 1.2 MB
  2213                              <1> 
  2214                              <1> ;	ATTEMPT READ ID OF ALL TRACKS, ALL HEADS UNTIL SUCCESS; UPON SUCCESS,
  2215                              <1> ;	MUST SEE IF ASKED FOR TRACK IN SINGLE STEP MODE = TRACK ID READ; IF NOT
  2216                              <1> ;	THEN SET DOUBLE STEP ON.
  2217                              <1> 
  2218                              <1> CNT_OK:
  2219 00003DAC C605[67310100]FF    <1>         MOV     byte [MOTOR_COUNT], 0FFH ; ENSURE MOTOR STAYS ON FOR OPERATION 
  2220 00003DB3 6651                <1> 	PUSH	CX			; SAVE TRACK, COUNT
  2221 00003DB5 C605[68310100]00    <1> 	MOV	byte [DSKETTE_STATUS],0	; CLEAR STATUS, EXPECT ERRORS
  2222 00003DBC 6631C0              <1> 	XOR	AX,AX			; CLEAR AX
  2223 00003DBF D0ED                <1> 	SHR	CH,1			; HALVE TRACK, CY = HEAD
  2224 00003DC1 C0D003              <1> 	RCL	AL,3			; AX = HEAD IN CORRECT BIT
  2225 00003DC4 6650                <1> 	PUSH	AX			; SAVE HEAD
  2226 00003DC6 E89F010000          <1> 	CALL	SEEK			; SEEK TO TRACK
  2227 00003DCB 6658                <1> 	POP	AX			; RESTORE HEAD
  2228 00003DCD 6609C7              <1> 	OR	DI,AX			; DI = HEAD OR'ED DRIVE
  2229 00003DD0 E82E000000          <1> 	CALL	READ_ID			; READ ID HEAD 0
  2230 00003DD5 9C                  <1> 	PUSHF				; SAVE RETURN FROM READ_ID
  2231 00003DD6 6681E7FB00          <1> 	AND	DI,11111011B		; TURN OFF HEAD 1 BIT
  2232 00003DDB 9D                  <1> 	POPF				; RESTORE ERROR RETURN
  2233 00003DDC 6659                <1> 	POP	CX			; RESTORE COUNT
  2234 00003DDE 7308                <1> 	JNC	short DO_CHK		; IF OK, ASKED = RETURNED TRACK ?
  2235 00003DE0 FEC5                <1> 	INC	CH			; INC FOR NEXT TRACK
  2236 00003DE2 38CD                <1> 	CMP	CH,CL			; REACHED MAXIMUM YET
  2237 00003DE4 75C6                <1> 	JNZ	short CNT_OK		; CONTINUE TILL ALL TRIED
  2238                              <1> 
  2239                              <1> ;-----	FALL THRU, READ ID FAILED FOR ALL TRACKS
  2240                              <1> 
  2241                              <1> SD_ERR:	
  2242 00003DE6 F9                  <1> 	STC				; SET CARRY FOR ERROR
  2243 00003DE7 C3                  <1> 	RETn				; SETUP_DBL ERROR EXIT
  2244                              <1> 
  2245                              <1> DO_CHK:
  2246 00003DE8 8A0D[6C310100]      <1> 	MOV	CL, [NEC_STATUS+3]	; LOAD RETURNED TRACK
  2247 00003DEE 888F[79310100]      <1> 	MOV	[DSK_TRK+eDI], CL	; STORE TRACK NUMBER
  2248 00003DF4 D0ED                <1> 	SHR	CH,1			; HALVE TRACK
  2249 00003DF6 38CD                <1> 	CMP	CH,CL			; IS IT THE SAME AS ASKED FOR TRACK
  2250 00003DF8 7407                <1> 	JZ	short NO_DBL		; IF SAME THEN NO DOUBLE STEP
  2251 00003DFA 808F[75310100]20    <1> 	OR	byte [DSK_STATE+eDI],DBL_STEP ; TURN ON DOUBLE STEP REQUIRED
  2252                              <1> NO_DBL:
  2253 00003E01 F8                  <1> 	CLC				; CLEAR ERROR FLAG
  2254 00003E02 C3                  <1> 	RETn
  2255                              <1> 
  2256                              <1> ;-------------------------------------------------------------------------------
  2257                              <1> ; READ_ID
  2258                              <1> ;	READ ID FUNCTION.
  2259                              <1> ;
  2260                              <1> ; ON ENTRY:	DI : BIT 2 = HEAD; BITS 1,0 = DRIVE
  2261                              <1> ;
  2262                              <1> ; ON EXIT: 	DI : BIT 2 IS RESET, BITS 1,0 = DRIVE
  2263                              <1> ;		@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  2264                              <1> ;-------------------------------------------------------------------------------
  2265                              <1> READ_ID:
  2266 00003E03 B8[203E0000]        <1> 	MOV	eAX, ER_3		; MOVE NEC OUTPUT ERROR ADDRESS
  2267 00003E08 50                  <1> 	PUSH	eAX
  2268 00003E09 B44A                <1> 	MOV	AH,4AH			; READ ID COMMAND
  2269 00003E0B E820010000          <1> 	CALL	NEC_OUTPUT		; TO CONTROLLER
  2270 00003E10 6689F8              <1> 	MOV	AX,DI			; DRIVE # TO AH, HEAD 0
  2271 00003E13 88C4                <1> 	MOV	AH,AL
  2272 00003E15 E816010000          <1> 	CALL	NEC_OUTPUT		; TO CONTROLLER
  2273 00003E1A E80BFEFFFF          <1> 	CALL	NEC_TERM		; WAIT FOR OPERATION, GET STATUS
  2274 00003E1F 58                  <1> 	POP	eAX			; THROW AWAY ERROR ADDRESS
  2275                              <1> ER_3:
  2276 00003E20 C3                  <1> 	RETn
  2277                              <1> 
  2278                              <1> ;-------------------------------------------------------------------------------
  2279                              <1> ; CMOS_TYPE
  2280                              <1> ;	RETURNS DISKETTE TYPE FROM CMOS
  2281                              <1> ;
  2282                              <1> ; ON ENTRY:	DI = DRIVE #
  2283                              <1> ;
  2284                              <1> ; ON EXIT:	AL = TYPE; CY REFLECTS STATUS
  2285                              <1> ;-------------------------------------------------------------------------------
  2286                              <1> 
  2287                              <1> CMOS_TYPE: ; 11/12/2014
  2288 00003E21 8A87[04FC0000]      <1> mov	al, [eDI+fd0_type]
  2289 00003E27 20C0                <1> and 	al, al ; 18/12/2014
  2290 00003E29 C3                  <1> retn
  2291                              <1> 
  2292                              <1> ;CMOS_TYPE:
  2293                              <1> ;	MOV	AL, CMOS_DIAG		; CMOS DIAGNOSTIC STATUS BYTE ADDRESS
  2294                              <1> ;	CALL	CMOS_READ		; GET CMOS STATUS
  2295                              <1> ;	TEST	AL,BAD_BAT+BAD_CKSUM	; BATTERY GOOD AND CHECKSUM VALID
  2296                              <1> ;	STC				; SET CY = 1 INDICATING ERROR FOR RETURN
  2297                              <1> ;	JNZ	short BAD_CM		; ERROR IF EITHER BIT ON
  2298                              <1> ;	MOV	AL,CMOS_DISKETTE	; ADDRESS OF DISKETTE BYTE IN CMOS
  2299                              <1> ;	CALL	CMOS_READ		; GET DISKETTE BYTE
  2300                              <1> ;	OR	DI,DI			; SEE WHICH DRIVE IN QUESTION
  2301                              <1> ;	JNZ	short TB		; IF DRIVE 1, DATA IN LOW NIBBLE
  2302                              <1> ;	ROR	AL,4			; EXCHANGE NIBBLES IF SECOND DRIVE
  2303                              <1> ;TB:
  2304                              <1> ;	AND	AL,0FH			; KEEP ONLY DRIVE DATA, RESET CY, 0
  2305                              <1> ;BAD_CM:
  2306                              <1> ;	RETn				; CY, STATUS OF READ
  2307                              <1> 
  2308                              <1> ;-------------------------------------------------------------------------------
  2309                              <1> ; GET_PARM
  2310                              <1> ;	THIS ROUTINE FETCHES THE INDEXED POINTER FROM THE DISK_BASE
  2311                              <1> ;	BLOCK POINTED TO BY THE DATA VARIABLE @DISK_POINTER. A BYTE FROM
  2312                              <1> ;	THAT TABLE IS THEN MOVED INTO AH, THE INDEX OF THAT BYTE BEING
  2313                              <1> ;	THE PARAMETER IN DL.
  2314                              <1> ;
  2315                              <1> ; ON ENTRY:	DL = INDEX OF BYTE TO BE FETCHED
  2316                              <1> ;
  2317                              <1> ; ON EXIT:	AH = THAT BYTE FROM BLOCK
  2318                              <1> ;		AL,DH DESTROYED
  2319                              <1> ;-------------------------------------------------------------------------------
  2320                              <1> GET_PARM:
  2321                              <1> 	;PUSH	DS
  2322 00003E2A 56                  <1> 	PUSH	eSI
  2323                              <1>     	;SUB	AX,AX			; DS = 0, BIOS DATA AREA
  2324                              <1>     	;MOV	DS,AX
  2325                              <1> 	;;mov	ax, cs
  2326                              <1> 	;;mov	ds, ax
  2327                              <1> 	; 08/02/2015 (protected mode modifications, bx -> ebx)
  2328 00003E2B 87D3                <1> 	XCHG	eDX,eBX			; BL = INDEX
  2329                              <1> 	;SUB	BH,BH			; BX = INDEX
  2330 00003E2D 81E3FF000000        <1> 	and	ebx, 0FFh
  2331                              <1>     	;LDS	SI, [DISK_POINTER]	; POINT TO BLOCK
  2332                              <1> 	;
  2333                              <1> 	; 17/12/2014
  2334 00003E33 66A1[F3FB0000]      <1> 	mov	ax, [cfd] ; current (AL) and previous fd (AH)
  2335 00003E39 38E0                <1> 	cmp	al, ah
  2336 00003E3B 7425                <1> 	je	short gpndc
  2337 00003E3D A2[F4FB0000]        <1> 	mov	[pfd], al ; current drive -> previous drive
  2338 00003E42 53                  <1> 	push	ebx ; 08/02/2015
  2339 00003E43 88C3                <1> 	mov	bl, al 
  2340                              <1> 	; 11/12/2014
  2341 00003E45 8A83[04FC0000]      <1> 	mov	al, [eBX+fd0_type]	; Drive type (0,1,2,3,4)
  2342                              <1> 	; 18/12/2014
  2343 00003E4B 20C0                <1> 	and	al, al
  2344 00003E4D 7507                <1> 	jnz	short gpdtc
  2345 00003E4F BB[DDFB0000]        <1> 	mov	ebx, MD_TBL6		; 1.44 MB param. tbl. (default)
  2346 00003E54 EB05                <1>         jmp     short gpdpu
  2347                              <1> gpdtc:	
  2348 00003E56 E817F9FFFF          <1> 	call	DR_TYPE_CHECK
  2349                              <1> 	; cf = 1 -> eBX points to 1.44MB fd parameter table (default)
  2350                              <1> gpdpu:
  2351 00003E5B 891D[7AFB0000]      <1> 	mov	[DISK_POINTER], ebx
  2352 00003E61 5B                  <1> 	pop	ebx
  2353                              <1> gpndc:
  2354 00003E62 8B35[7AFB0000]      <1> 	mov	esi, [DISK_POINTER] ; 08/02/2015, si -> esi
  2355 00003E68 8A241E              <1> 	MOV	AH, [eSI+eBX]		; GET THE WORD
  2356 00003E6B 87D3                <1> 	XCHG	eDX,eBX			; RESTORE BX
  2357 00003E6D 5E                  <1> 	POP	eSI
  2358                              <1> 	;POP	DS
  2359 00003E6E C3                  <1> 	RETn
  2360                              <1> 
  2361                              <1> ;-------------------------------------------------------------------------------
  2362                              <1> ; MOTOR_ON
  2363                              <1> ;	TURN MOTOR ON AND WAIT FOR MOTOR START UP TIME. THE @MOTOR_COUNT
  2364                              <1> ;	IS REPLACED WITH A SUFFICIENTLY HIGH NUMBER (0FFH) TO ENSURE
  2365                              <1> ;	THAT THE MOTOR DOES NOT GO OFF DURING THE OPERATION. IF THE
  2366                              <1> ;	MOTOR NEEDED TO BE TURNED ON, THE MULTI-TASKING HOOK FUNCTION
  2367                              <1> ;	(AX=90FDH, INT 15) IS CALLED TELLING THE OPERATING SYSTEM
  2368                              <1> ;	THAT THE BIOS IS ABOUT TO WAIT FOR MOTOR START UP. IF THIS
  2369                              <1> ;	FUNCTION RETURNS WITH CY = 1, IT MEANS THAT THE MINIMUM WAIT
  2370                              <1> ;	HAS BEEN COMPLETED. AT THIS POINT A CHECK IS MADE TO ENSURE
  2371                              <1> ;	THAT THE MOTOR WASN'T TURNED OFF BY THE TIMER. IF THE HOOK DID
  2372                              <1> ;	NOT WAIT, THE WAIT FUNCTION (AH=086H) IS CALLED TO WAIT THE
  2373                              <1> ;	PRESCRIBED AMOUNT OF TIME. IF THE CARRY FLAG IS SET ON RETURN,
  2374                              <1> ;	IT MEANS THAT THE FUNCTION IS IN USE AND DID NOT PERFORM THE
  2375                              <1> ;	WAIT. A TIMER 1 WAIT LOOP WILL THEN DO THE WAIT.
  2376                              <1> ;
  2377                              <1> ; ON ENTRY:	DI = DRIVE #
  2378                              <1> ; ON EXIT:	AX,CX,DX DESTROYED
  2379                              <1> ;-------------------------------------------------------------------------------
  2380                              <1> MOTOR_ON:
  2381 00003E6F 53                  <1> 	PUSH	eBX			; SAVE REG.
  2382 00003E70 E82A000000          <1> 	CALL	TURN_ON			; TURN ON MOTOR
  2383 00003E75 7226                <1> 	JC	short MOT_IS_ON		; IF CY=1 NO WAIT
  2384 00003E77 E89BF9FFFF          <1> 	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  2385 00003E7C E865F9FFFF          <1> 	CALL	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH,
  2386                              <1> 	;CALL	TURN_ON 		; CHECK AGAIN IF MOTOR ON
  2387                              <1> 	;JC	MOT_IS_ON		; IF NO WAIT MEANS IT IS ON
  2388                              <1> M_WAIT:
  2389 00003E81 B20A                <1> 	MOV	DL,10			; GET THE MOTOR WAIT PARAMETER
  2390 00003E83 E8A2FFFFFF          <1> 	CALL	GET_PARM
  2391                              <1> 	;MOV	AL,AH			; AL = MOTOR WAIT PARAMETER
  2392                              <1> 	;XOR	AH,AH			; AX = MOTOR WAIT PARAMETER
  2393                              <1> 	;CMP	AL,8			; SEE IF AT LEAST A SECOND IS SPECIFIED
  2394 00003E88 80FC08              <1> 	cmp	ah, 8
  2395                              <1> 	;JAE	short GP2		; IF YES, CONTINUE
  2396 00003E8B 7702                <1> 	ja	short J13
  2397                              <1> 	;MOV	AL,8			; ONE SECOND WAIT FOR MOTOR START UP
  2398 00003E8D B408                <1> 	mov	ah, 8
  2399                              <1> 
  2400                              <1> ;-----	AS CONTAINS NUMBER OF 1/8 SECONDS (125000 MICROSECONDS) TO WAIT
  2401                              <1> GP2:	
  2402                              <1> ;----- 	FOLLOWING LOOPS REQUIRED WHEN RTC WAIT FUNCTION IS ALREADY IN USE
  2403                              <1> J13:					; WAIT FOR 1/8 SECOND PER (AL)
  2404 00003E8F B95E200000          <1> 	MOV	eCX,8286		; COUNT FOR 1/8 SECOND AT 15.085737 US
  2405 00003E94 E8DADEFFFF          <1> 	CALL	WAITF			; GO TO FIXED WAIT ROUTINE
  2406                              <1> 	;DEC	AL			; DECREMENT TIME VALUE
  2407 00003E99 FECC                <1> 	dec	ah
  2408 00003E9B 75F2                <1> 	JNZ	short J13		; ARE WE DONE YET
  2409                              <1> MOT_IS_ON:
  2410 00003E9D 5B                  <1> 	POP	eBX			; RESTORE REG.
  2411 00003E9E C3                  <1> 	RETn
  2412                              <1> 
  2413                              <1> ;-------------------------------------------------------------------------------
  2414                              <1> ; TURN_ON
  2415                              <1> ;	TURN MOTOR ON AND RETURN WAIT STATE.
  2416                              <1> ;
  2417                              <1> ; ON ENTRY:	DI = DRIVE #
  2418                              <1> ;
  2419                              <1> ; ON EXIT:	CY = 0 MEANS WAIT REQUIRED
  2420                              <1> ;		CY = 1 MEANS NO WAIT REQUIRED
  2421                              <1> ;		AX,BX,CX,DX DESTROYED
  2422                              <1> ;-------------------------------------------------------------------------------
  2423                              <1> TURN_ON:
  2424 00003E9F 89FB                <1> 	MOV	eBX,eDI			; BX = DRIVE #
  2425 00003EA1 88D9                <1> 	MOV	CL,BL			; CL = DRIVE #
  2426 00003EA3 C0C304              <1> 	ROL	BL,4			; BL = DRIVE SELECT
  2427 00003EA6 FA                  <1> 	CLI				; NO INTERRUPTS WHILE DETERMINING STATUS
  2428 00003EA7 C605[67310100]FF    <1> 	MOV	byte [MOTOR_COUNT],0FFH	; ENSURE MOTOR STAYS ON FOR OPERATION
  2429 00003EAE A0[66310100]        <1> 	MOV	AL, [MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
  2430 00003EB3 2430                <1> 	AND	AL,00110000B		; KEEP ONLY DRIVE SELECT BITS
  2431 00003EB5 B401                <1> 	MOV	AH,1			; MASK FOR DETERMINING MOTOR BIT
  2432 00003EB7 D2E4                <1> 	SHL	AH,CL			; AH = MOTOR ON, A=00000001, B=00000010
  2433                              <1> 
  2434                              <1> ;  AL = DRIVE SELECT FROM @MOTOR_STATUS
  2435                              <1> ;  BL = DRIVE SELECT DESIRED
  2436                              <1> ;  AH = MOTOR ON MASK DESIRED
  2437                              <1> 
  2438 00003EB9 38D8                <1> 	CMP	AL,BL			; REQUESTED DRIVE ALREADY SELECTED ?
  2439 00003EBB 7508                <1> 	JNZ	short TURN_IT_ON	; IF NOT SELECTED JUMP
  2440 00003EBD 8425[66310100]      <1> 	TEST	AH, [MOTOR_STATUS]	; TEST MOTOR ON BIT
  2441 00003EC3 7535                <1> 	JNZ	short NO_MOT_WAIT	; JUMP IF MOTOR ON AND SELECTED
  2442                              <1> 
  2443                              <1> TURN_IT_ON:
  2444 00003EC5 08DC                <1> 	OR	AH,BL			; AH = DRIVE SELECT AND MOTOR ON
  2445 00003EC7 8A3D[66310100]      <1> 	MOV	BH,[MOTOR_STATUS]	; SAVE COPY OF @MOTOR_STATUS BEFORE
  2446 00003ECD 80E70F              <1> 	AND	BH,00001111B		; KEEP ONLY MOTOR BITS
  2447 00003ED0 8025[66310100]CF    <1> 	AND	byte [MOTOR_STATUS],11001111B ; CLEAR OUT DRIVE SELECT
  2448 00003ED7 0825[66310100]      <1> 	OR	[MOTOR_STATUS],AH	; OR IN DRIVE SELECTED AND MOTOR ON
  2449 00003EDD A0[66310100]        <1> 	MOV	AL,[MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
  2450 00003EE2 88C3                <1> 	MOV	BL,AL			; BL=@MOTOR_STATUS AFTER, BH=BEFORE
  2451 00003EE4 80E30F              <1> 	AND	BL,00001111B		; KEEP ONLY MOTOR BITS
  2452 00003EE7 FB                  <1> 	STI				; ENABLE INTERRUPTS AGAIN
  2453 00003EE8 243F                <1> 	AND	AL,00111111B		; STRIP AWAY UNWANTED BITS
  2454 00003EEA C0C004              <1> 	ROL	AL,4			; PUT BITS IN DESIRED POSITIONS
  2455 00003EED 0C0C                <1> 	OR	AL,00001100B		; NO RESET, ENABLE DMA/INTERRUPT
  2456 00003EEF 66BAF203            <1> 	MOV	DX,03F2H		; SELECT DRIVE AND TURN ON MOTOR
  2457 00003EF3 EE                  <1> 	OUT	DX,AL
  2458 00003EF4 38FB                <1> 	CMP	BL,BH			; NEW MOTOR TURNED ON ?
  2459                              <1> 	;JZ	short NO_MOT_WAIT	; NO WAIT REQUIRED IF JUST SELECT
  2460 00003EF6 7403                <1> 	je	short no_mot_w1 ; 27/02/2015 
  2461 00003EF8 F8                  <1> 	CLC				; (re)SET CARRY MEANING WAIT
  2462 00003EF9 C3                  <1> 	RETn
  2463                              <1> 
  2464                              <1> NO_MOT_WAIT:
  2465 00003EFA FB                  <1> 	sti
  2466                              <1> no_mot_w1: ; 27/02/2015
  2467 00003EFB F9                  <1> 	STC				; SET NO WAIT REQUIRED
  2468                              <1> 	;STI				; INTERRUPTS BACK ON
  2469 00003EFC C3                  <1> 	RETn
  2470                              <1> 
  2471                              <1> ;-------------------------------------------------------------------------------
  2472                              <1> ; HD_WAIT
  2473                              <1> ;	WAIT FOR HEAD SETTLE TIME.
  2474                              <1> ;
  2475                              <1> ; ON ENTRY:	DI = DRIVE #
  2476                              <1> ;
  2477                              <1> ; ON EXIT:	AX,BX,CX,DX DESTROYED
  2478                              <1> ;-------------------------------------------------------------------------------
  2479                              <1> HD_WAIT:
  2480 00003EFD B209                <1> 	MOV	DL,9			; GET HEAD SETTLE PARAMETER
  2481 00003EFF E826FFFFFF          <1> 	CALL	GET_PARM
  2482 00003F04 08E4                <1> 	or	ah, ah	; 17/12/2014
  2483 00003F06 7519                <1> 	jnz	short DO_WAT
  2484 00003F08 F605[66310100]80    <1>         TEST    byte [MOTOR_STATUS],10000000B ; SEE IF A WRITE OPERATION
  2485                              <1> 	;JZ	short ISNT_WRITE	; IF NOT, DO NOT ENFORCE ANY VALUES
  2486                              <1> 	;OR	AH,AH			; CHECK FOR ANY WAIT?
  2487                              <1> 	;JNZ	short DO_WAT		; IF THERE DO NOT ENFORCE
  2488 00003F0F 741E                <1> 	jz	short HW_DONE
  2489 00003F11 B40F                <1> 	MOV	AH,HD12_SETTLE		; LOAD 1.2M HEAD SETTLE MINIMUM
  2490 00003F13 8A87[75310100]      <1> 	MOV	AL,[DSK_STATE+eDI]	; LOAD STATE
  2491 00003F19 24C0                <1> 	AND	AL,RATE_MSK		; KEEP ONLY RATE
  2492 00003F1B 3C80                <1> 	CMP	AL,RATE_250		; 1.2 M DRIVE ?
  2493 00003F1D 7502                <1> 	JNZ	short DO_WAT		; DEFAULT HEAD SETTLE LOADED
  2494                              <1> ;GP3:
  2495 00003F1F B414                <1> 	MOV	AH,HD320_SETTLE		; USE 320/360 HEAD SETTLE
  2496                              <1> ;	JMP	SHORT DO_WAT
  2497                              <1> 
  2498                              <1> ;ISNT_WRITE:
  2499                              <1> ;	OR	AH,AH			; CHECK FOR NO WAIT
  2500                              <1> ;	JZ	short HW_DONE		; IF NOT WRITE AND 0 ITS OK
  2501                              <1> 
  2502                              <1> ;-----	AH CONTAINS NUMBER OF MILLISECONDS TO WAIT
  2503                              <1> DO_WAT:
  2504                              <1> ;	MOV	AL,AH			; AL = # MILLISECONDS
  2505                              <1> ;	;XOR	AH,AH			; AX = # MILLISECONDS
  2506                              <1> J29:					; 	1 MILLISECOND LOOP
  2507                              <1> 	;mov	cx, WAIT_FDU_HEAD_SETTLE ; 33 ; 1 ms in 30 micro units.
  2508 00003F21 B942000000          <1> 	MOV	eCX,66			; COUNT AT 15.085737 US PER COUNT
  2509 00003F26 E848DEFFFF          <1> 	CALL	WAITF			; DELAY FOR 1 MILLISECOND
  2510                              <1> 	;DEC	AL			; DECREMENT THE COUNT
  2511 00003F2B FECC                <1> 	dec	ah
  2512 00003F2D 75F2                <1> 	JNZ	short J29		; DO AL MILLISECOND # OF TIMES
  2513                              <1> HW_DONE:
  2514 00003F2F C3                  <1> 	RETn
  2515                              <1> 
  2516                              <1> ;-------------------------------------------------------------------------------
  2517                              <1> ; NEC_OUTPUT
  2518                              <1> ;	THIS ROUTINE SENDS A BYTE TO THE NEC CONTROLLER AFTER TESTING
  2519                              <1> ;	FOR CORRECT DIRECTION AND CONTROLLER READY THIS ROUTINE WILL
  2520                              <1> ;	TIME OUT IF THE BYTE IS NOT ACCEPTED WITHIN A REASONABLE AMOUNT
  2521                              <1> ;	OF TIME, SETTING THE DISKETTE STATUS ON COMPLETION.
  2522                              <1> ; 
  2523                              <1> ; ON ENTRY: 	AH = BYTE TO BE OUTPUT
  2524                              <1> ;
  2525                              <1> ; ON EXIT:	CY = 0  SUCCESS
  2526                              <1> ;		CY = 1  FAILURE -- DISKETTE STATUS UPDATED
  2527                              <1> ;		        IF A FAILURE HAS OCCURRED, THE RETURN IS MADE ONE LEVEL
  2528                              <1> ;		        HIGHER THAN THE CALLER OF NEC OUTPUT. THIS REMOVES THE
  2529                              <1> ;		        REQUIREMENT OF TESTING AFTER EVERY CALL OF NEC_OUTPUT.
  2530                              <1> ;		AX,CX,DX DESTROYED
  2531                              <1> ;-------------------------------------------------------------------------------
  2532                              <1> 
  2533                              <1> ; 09/12/2014 [Erdogan Tan] 
  2534                              <1> ;	(from 'PS2 Hardware Interface Tech. Ref. May 88', Page 09-05.)
  2535                              <1> ; Diskette Drive Controller Status Register (3F4h)
  2536                              <1> ;	This read only register facilitates the transfer of data between
  2537                              <1> ;	the system microprocessor and the controller.
  2538                              <1> ; Bit 7 - When set to 1, the Data register is ready to transfer data 
  2539                              <1> ;	  with the system micrprocessor.
  2540                              <1> ; Bit 6 - The direction of data transfer. If this bit is set to 0,
  2541                              <1> ;	  the transfer is to the controller.
  2542                              <1> ; Bit 5 - When this bit is set to 1, the controller is in the non-DMA mode.
  2543                              <1> ; Bit 4 - When this bit is set to 1, a Read or Write command is being executed.
  2544                              <1> ; Bit 3 - Reserved.
  2545                              <1> ; Bit 2 - Reserved.
  2546                              <1> ; Bit 1 - When this bit is set to 1, dskette drive 1 is in the seek mode.
  2547                              <1> ; Bit 0 - When this bit is set to 1, dskette drive 1 is in the seek mode.
  2548                              <1> 
  2549                              <1> ; Data Register (3F5h)
  2550                              <1> ; This read/write register passes data, commands and parameters, and provides
  2551                              <1> ; diskette status information.
  2552                              <1>   		
  2553                              <1> NEC_OUTPUT:
  2554                              <1> 	;PUSH	BX			; SAVE REG.
  2555 00003F30 66BAF403            <1> 	MOV	DX,03F4H		; STATUS PORT
  2556                              <1> 	;MOV	BL,2			; HIGH ORDER COUNTER
  2557                              <1> 	;XOR	CX,CX			; COUNT FOR TIME OUT
  2558                              <1> 	; 16/12/2014
  2559                              <1> 	; waiting for (max.) 0.5 seconds
  2560                              <1>         ;;mov     byte [wait_count], 0 ;; 27/02/2015
  2561                              <1> 	;
  2562                              <1> 	; 17/12/2014
  2563                              <1> 	; Modified from AWARD BIOS 1999 - ADISK.ASM - SEND_COMMAND
  2564                              <1> 	;
  2565                              <1> 	;WAIT_FOR_PORT:	Waits for a bit at a port pointed to by DX to
  2566                              <1> 	;		go on.
  2567                              <1> 	;INPUT:
  2568                              <1> 	;	AH=Mask for isolation bits.
  2569                              <1> 	;	AL=pattern to look for.
  2570                              <1> 	;	DX=Port to test for
  2571                              <1> 	;	BH:CX=Number of memory refresh periods to delay.
  2572                              <1> 	;	     (normally 30 microseconds per period.)
  2573                              <1> 	;
  2574                              <1> 	;WFP_SHORT:  
  2575                              <1> 	;	Wait for port if refresh cycle is short (15-80 Us range).
  2576                              <1> 	;
  2577                              <1> 
  2578                              <1> ;	mov	bl, WAIT_FDU_SEND_HI+1	; 0+1
  2579                              <1> ;	mov	cx, WAIT_FDU_SEND_LO	; 16667
  2580 00003F34 B91B410000          <1> 	mov	ecx, WAIT_FDU_SEND_LH   ; 16667 (27/02/2015)
  2581                              <1> ;
  2582                              <1> ;WFPS_OUTER_LP:
  2583                              <1> ;	;
  2584                              <1> ;WFPS_CHECK_PORT:
  2585                              <1> J23:
  2586 00003F39 EC                  <1> 	IN	AL,DX			; GET STATUS
  2587 00003F3A 24C0                <1> 	AND	AL,11000000B		; KEEP STATUS AND DIRECTION
  2588 00003F3C 3C80                <1> 	CMP	AL,10000000B		; STATUS 1 AND DIRECTION 0 ?
  2589 00003F3E 7418                <1> 	JZ	short J27		; STATUS AND DIRECTION OK
  2590                              <1> WFPS_HI:
  2591 00003F40 E461                <1> 	IN	AL, PORT_B	;061h	; SYS1	; wait for hi to lo
  2592 00003F42 A810                <1> 	TEST	AL,010H			; transition on memory
  2593 00003F44 75FA                <1> 	JNZ	SHORT WFPS_HI		; refresh.
  2594                              <1> WFPS_LO:
  2595 00003F46 E461                <1> 	IN	AL, PORT_B		; SYS1
  2596 00003F48 A810                <1> 	TEST	AL,010H
  2597 00003F4A 74FA                <1> 	JZ	SHORT WFPS_LO
  2598                              <1> 	;LOOP	SHORT WFPS_CHECK_PORT
  2599 00003F4C E2EB                <1> 	loop	J23	; 27/02/2015
  2600                              <1> ;	;
  2601                              <1> ;	dec	bl
  2602                              <1> ;	jnz	short WFPS_OUTER_LP
  2603                              <1> ;	jmp	short WFPS_TIMEOUT	; fail
  2604                              <1> ;J23:
  2605                              <1> ;	IN	AL,DX			; GET STATUS
  2606                              <1> ;	AND	AL,11000000B		; KEEP STATUS AND DIRECTION
  2607                              <1> ;	CMP	AL,10000000B		; STATUS 1 AND DIRECTION 0 ?
  2608                              <1> ;	JZ	short J27		; STATUS AND DIRECTION OK
  2609                              <1> 	;LOOP	J23			; CONTINUE TILL CX EXHAUSTED
  2610                              <1> 	;DEC	BL			; DECREMENT COUNTER
  2611                              <1> 	;JNZ	short J23		; REPEAT TILL DELAY FINISHED, CX = 0
  2612                              <1>    
  2613                              <1> 	;;27/02/2015
  2614                              <1> 	;16/12/2014
  2615                              <1>         ;;cmp     byte [wait_count], 10   ; (10/18.2 seconds)
  2616                              <1> 	;;jb	short J23
  2617                              <1> 
  2618                              <1> ;WFPS_TIMEOUT:
  2619                              <1> 
  2620                              <1> ;-----	FALL THRU TO ERROR RETURN
  2621                              <1> 
  2622 00003F4E 800D[68310100]80    <1> 	OR	byte [DSKETTE_STATUS],TIME_OUT
  2623                              <1> 	;POP	BX			; RESTORE REG.
  2624 00003F55 58                  <1> 	POP	eAX ; 08/02/2015	; DISCARD THE RETURN ADDRESS
  2625 00003F56 F9                  <1> 	STC				; INDICATE ERROR TO CALLER
  2626 00003F57 C3                  <1> 	RETn
  2627                              <1> 
  2628                              <1> ;-----	DIRECTION AND STATUS OK; OUTPUT BYTE
  2629                              <1> 
  2630                              <1> J27:	
  2631 00003F58 88E0                <1> 	MOV	AL,AH			; GET BYTE TO OUTPUT
  2632 00003F5A 6642                <1> 	INC	DX			; DATA PORT = STATUS PORT + 1
  2633 00003F5C EE                  <1> 	OUT	DX,AL			; OUTPUT THE BYTE
  2634                              <1> 	;;NEWIODELAY  ;; 27/02/2015
  2635                              <1> 	; 27/02/2015
  2636 00003F5D 9C                  <1> 	PUSHF				; SAVE FLAGS
  2637 00003F5E B903000000          <1> 	MOV	eCX, 3			; 30 TO 45 MICROSECONDS WAIT FOR
  2638 00003F63 E80BDEFFFF          <1> 	CALL 	WAITF			; NEC FLAGS UPDATE CYCLE
  2639 00003F68 9D                  <1> 	POPF				; RESTORE FLAGS FOR EXIT
  2640                              <1> 	;POP	BX			; RESTORE REG
  2641 00003F69 C3                  <1> 	RETn				; CY = 0 FROM TEST INSTRUCTION
  2642                              <1> 
  2643                              <1> ;-------------------------------------------------------------------------------
  2644                              <1> ; SEEK
  2645                              <1> ;	THIS ROUTINE WILL MOVE THE HEAD ON THE NAMED DRIVE TO THE NAMED
  2646                              <1> ;	TRACK. IF THE DRIVE HAS NOT BEEN ACCESSED SINCE THE DRIVE
  2647                              <1> ;	RESET COMMAND WAS ISSUED, THE DRIVE WILL BE RECALIBRATED.
  2648                              <1> ;
  2649                              <1> ; ON ENTRY:	DI = DRIVE #
  2650                              <1> ;		CH = TRACK #
  2651                              <1> ;
  2652                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION.
  2653                              <1> ;		AX,BX,CX DX DESTROYED
  2654                              <1> ;-------------------------------------------------------------------------------
  2655                              <1> SEEK:
  2656 00003F6A 89FB                <1> 	MOV	eBX,eDI			; BX = DRIVE #
  2657 00003F6C B001                <1> 	MOV	AL,1			; ESTABLISH MASK FOR RECALIBRATE TEST
  2658 00003F6E 86CB                <1> 	XCHG	CL,BL			; SET DRIVE VALULE INTO CL
  2659 00003F70 D2C0                <1> 	ROL	AL,CL			; SHIFT MASK BY THE DRIVE VALUE
  2660 00003F72 86CB                <1> 	XCHG	CL,BL			; RECOVER TRACK VALUE
  2661 00003F74 8405[65310100]      <1> 	TEST	AL,[SEEK_STATUS]	; TEST FOR RECALIBRATE REQUIRED
  2662 00003F7A 7526                <1> 	JNZ	short J28A		; JUMP IF RECALIBRATE NOT REQUIRED
  2663                              <1> 
  2664 00003F7C 0805[65310100]      <1> 	OR	[SEEK_STATUS],AL	; TURN ON THE NO RECALIBRATE BIT IN FLAG
  2665 00003F82 E862000000          <1> 	CALL	RECAL			; RECALIBRATE DRIVE
  2666 00003F87 730E                <1> 	JNC	short AFT_RECAL		; RECALIBRATE DONE
  2667                              <1> 
  2668                              <1> ;-----	ISSUE RECALIBRATE FOR 80 TRACK DISKETTES
  2669                              <1> 
  2670 00003F89 C605[68310100]00    <1> 	MOV	byte [DSKETTE_STATUS],0	; CLEAR OUT INVALID STATUS
  2671 00003F90 E854000000          <1> 	CALL	RECAL			; RECALIBRATE DRIVE
  2672 00003F95 7251                <1> 	JC	short RB		; IF RECALIBRATE FAILS TWICE THEN ERROR
  2673                              <1> 
  2674                              <1> AFT_RECAL:
  2675 00003F97 C687[79310100]00    <1>         MOV     byte [DSK_TRK+eDI],0    ; SAVE NEW CYLINDER AS PRESENT POSITION
  2676 00003F9E 08ED                <1> 	OR	CH,CH			; CHECK FOR SEEK TO TRACK 0
  2677 00003FA0 743F                <1> 	JZ	short DO_WAIT		; HEAD SETTLE, CY = 0 IF JUMP
  2678                              <1> 
  2679                              <1> ;-----	DRIVE IS IN SYNCHRONIZATION WITH CONTROLLER, SEEK TO TRACK
  2680                              <1> 
  2681 00003FA2 F687[75310100]20    <1> J28A:	TEST	byte [DSK_STATE+eDI],DBL_STEP ; CHECK FOR DOUBLE STEP REQUIRED
  2682 00003FA9 7402                <1> 	JZ	short _R7		; SINGLE STEP REQUIRED BYPASS DOUBLE
  2683 00003FAB D0E5                <1> 	SHL	CH,1			; DOUBLE NUMBER OF STEP TO TAKE
  2684                              <1> 
  2685 00003FAD 3AAF[79310100]      <1> _R7:	CMP	CH, [DSK_TRK+eDI]	; SEE IF ALREADY AT THE DESIRED TRACK
  2686 00003FB3 7433                <1> 	JE	short RB		; IF YES, DO NOT NEED TO SEEK
  2687                              <1> 
  2688 00003FB5 BA[E83F0000]        <1> 	MOV	eDX, NEC_ERR		; LOAD RETURN ADDRESS
  2689 00003FBA 52                  <1> 	PUSH	eDX ; (*)		; ON STACK FOR NEC OUTPUT ERROR
  2690 00003FBB 88AF[79310100]      <1> 	MOV	[DSK_TRK+eDI],CH	; SAVE NEW CYLINDER AS PRESENT POSITION
  2691 00003FC1 B40F                <1> 	MOV	AH,0FH			; SEEK COMMAND TO NEC
  2692 00003FC3 E868FFFFFF          <1> 	CALL	NEC_OUTPUT
  2693 00003FC8 89FB                <1> 	MOV	eBX,eDI			; BX = DRIVE #
  2694 00003FCA 88DC                <1> 	MOV	AH,BL			; OUTPUT DRIVE NUMBER
  2695 00003FCC E85FFFFFFF          <1> 	CALL	NEC_OUTPUT
  2696 00003FD1 8AA7[79310100]      <1> 	MOV	AH, [DSK_TRK+eDI]	; GET CYLINDER NUMBER
  2697 00003FD7 E854FFFFFF          <1> 	CALL	NEC_OUTPUT
  2698 00003FDC E829000000          <1> 	CALL	CHK_STAT_2		; ENDING INTERRUPT AND SENSE STATUS
  2699                              <1> 
  2700                              <1> ;-----	WAIT FOR HEAD SETTLE
  2701                              <1> 
  2702                              <1> DO_WAIT:
  2703 00003FE1 9C                  <1> 	PUSHF				; SAVE STATUS
  2704 00003FE2 E816FFFFFF          <1> 	CALL	HD_WAIT			; WAIT FOR HEAD SETTLE TIME
  2705 00003FE7 9D                  <1> 	POPF				; RESTORE STATUS
  2706                              <1> RB:
  2707                              <1> NEC_ERR:
  2708                              <1> 	; 08/02/2015 (code trick here from original IBM PC/AT DISKETTE.ASM)
  2709                              <1> 	; (*) nec_err -> retn (push edx -> pop edx) -> nec_err -> retn
  2710 00003FE8 C3                  <1> 	RETn				; RETURN TO CALLER
  2711                              <1> 
  2712                              <1> ;-------------------------------------------------------------------------------
  2713                              <1> ; RECAL
  2714                              <1> ;	RECALIBRATE DRIVE
  2715                              <1> ;
  2716                              <1> ; ON ENTRY:	DI = DRIVE #
  2717                              <1> ;
  2718                              <1> ; ON EXIT:	CY REFLECTS STATUS OF OPERATION.
  2719                              <1> ;-------------------------------------------------------------------------------
  2720                              <1> RECAL:
  2721 00003FE9 6651                <1> 	PUSH	CX
  2722 00003FEB B8[07400000]        <1> 	MOV	eAX, RC_BACK		; LOAD NEC_OUTPUT ERROR
  2723 00003FF0 50                  <1> 	PUSH	eAX
  2724 00003FF1 B407                <1> 	MOV	AH,07H			; RECALIBRATE COMMAND
  2725 00003FF3 E838FFFFFF          <1> 	CALL	NEC_OUTPUT
  2726 00003FF8 89FB                <1> 	MOV	eBX,eDI			; BX = DRIVE #
  2727 00003FFA 88DC                <1> 	MOV	AH,BL
  2728 00003FFC E82FFFFFFF          <1> 	CALL	NEC_OUTPUT		; OUTPUT THE DRIVE NUMBER
  2729 00004001 E804000000          <1> 	CALL	CHK_STAT_2		; GET THE INTERRUPT AND SENSE INT STATUS
  2730 00004006 58                  <1> 	POP	eAX			; THROW AWAY ERROR
  2731                              <1> RC_BACK:
  2732 00004007 6659                <1> 	POP	CX
  2733 00004009 C3                  <1> 	RETn
  2734                              <1> 
  2735                              <1> ;-------------------------------------------------------------------------------
  2736                              <1> ; CHK_STAT_2
  2737                              <1> ;	THIS ROUTINE HANDLES THE INTERRUPT RECEIVED AFTER RECALIBRATE,
  2738                              <1> ;	OR SEEK TO THE ADAPTER. THE INTERRUPT IS WAITED FOR, THE
  2739                              <1> ;	INTERRUPT STATUS SENSED, AND THE RESULT RETURNED TO THE CALLER.
  2740                              <1> ;
  2741                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION.
  2742                              <1> ;-------------------------------------------------------------------------------
  2743                              <1> CHK_STAT_2:
  2744 0000400A B8[32400000]        <1>         MOV     eAX, CS_BACK            ; LOAD NEC_OUTPUT ERROR ADDRESS
  2745 0000400F 50                  <1> 	PUSH	eAX
  2746 00004010 E828000000          <1> 	CALL	WAIT_INT		; WAIT FOR THE INTERRUPT
  2747 00004015 721A                <1> 	JC	short J34		; IF ERROR, RETURN IT
  2748 00004017 B408                <1> 	MOV	AH,08H			; SENSE INTERRUPT STATUS COMMAND
  2749 00004019 E812FFFFFF          <1> 	CALL	NEC_OUTPUT
  2750 0000401E E84A000000          <1> 	CALL	RESULTS			; READ IN THE RESULTS
  2751 00004023 720C                <1> 	JC	short J34
  2752 00004025 A0[69310100]        <1> 	MOV	AL,[NEC_STATUS]		; GET THE FIRST STATUS BYTE
  2753 0000402A 2460                <1> 	AND	AL,01100000B		; ISOLATE THE BITS
  2754 0000402C 3C60                <1> 	CMP	AL,01100000B		; TEST FOR CORRECT VALUE
  2755 0000402E 7403                <1> 	JZ	short J35		; IF ERROR, GO MARK IT
  2756 00004030 F8                  <1> 	CLC				; GOOD RETURN
  2757                              <1> J34:
  2758 00004031 58                  <1> 	POP	eAX			; THROW AWAY ERROR RETURN
  2759                              <1> CS_BACK:
  2760 00004032 C3                  <1> 	RETn
  2761                              <1> J35:
  2762 00004033 800D[68310100]40    <1> 	OR	byte [DSKETTE_STATUS], BAD_SEEK
  2763 0000403A F9                  <1> 	STC				; ERROR RETURN CODE
  2764 0000403B EBF4                <1> 	JMP	SHORT J34
  2765                              <1> 
  2766                              <1> ;-------------------------------------------------------------------------------
  2767                              <1> ; WAIT_INT
  2768                              <1> ;	THIS ROUTINE WAITS FOR AN INTERRUPT TO OCCUR A TIME OUT ROUTINE
  2769                              <1> ;	TAKES PLACE DURING THE WAIT, SO THAT AN ERROR MAY BE RETURNED
  2770                              <1> ;	IF THE DRIVE IS NOT READY.
  2771                              <1> ;
  2772                              <1> ; ON EXIT: 	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION.
  2773                              <1> ;-------------------------------------------------------------------------------
  2774                              <1> 
  2775                              <1> ; 17/12/2014
  2776                              <1> ; 2.5 seconds waiting !
  2777                              <1> ;(AWARD BIOS - 1999, WAIT_FDU_INT_LOW, WAIT_FDU_INT_HI)
  2778                              <1> ; amount of time to wait for completion interrupt from NEC.
  2779                              <1> 
  2780                              <1> 
  2781                              <1> WAIT_INT:
  2782 0000403D FB                  <1> 	STI				; TURN ON INTERRUPTS, JUST IN CASE
  2783 0000403E F8                  <1> 	CLC				; CLEAR TIMEOUT INDICATOR
  2784                              <1>        ;MOV	BL,10			; CLEAR THE COUNTERS
  2785                              <1>        ;XOR	CX,CX			; FOR 2 SECOND WAIT
  2786                              <1> 
  2787                              <1> 	; Modification from AWARD BIOS - 1999 (ATORGS.ASM, WAIT
  2788                              <1> 	;
  2789                              <1> 	;WAIT_FOR_MEM:	
  2790                              <1> 	;	Waits for a bit at a specified memory location pointed
  2791                              <1> 	;	to by ES:[DI] to become set.
  2792                              <1> 	;INPUT:
  2793                              <1> 	;	AH=Mask to test with.
  2794                              <1> 	;	ES:[DI] = memory location to watch.
  2795                              <1> 	;	BH:CX=Number of memory refresh periods to delay.
  2796                              <1> 	;	     (normally 30 microseconds per period.)
  2797                              <1> 
  2798                              <1> 	; waiting for (max.) 2.5 secs in 30 micro units.
  2799                              <1> ;	mov 	cx, WAIT_FDU_INT_LO		; 017798
  2800                              <1> ;;	mov 	bl, WAIT_FDU_INT_HI
  2801                              <1> ;	mov 	bl, WAIT_FDU_INT_HI + 1
  2802                              <1> 	; 27/02/2015
  2803 0000403F B986450100          <1> 	mov 	ecx, WAIT_FDU_INT_LH	; 83334 (2.5 seconds)		
  2804                              <1> WFMS_CHECK_MEM:
  2805 00004044 F605[65310100]80    <1> 	test	byte [SEEK_STATUS],INT_FLAG ; TEST FOR INTERRUPT OCCURRING
  2806 0000404B 7516                <1>         jnz     short J37
  2807                              <1> WFMS_HI:
  2808 0000404D E461                <1> 	IN	AL,PORT_B  ; 061h	; SYS1, wait for lo to hi
  2809 0000404F A810                <1> 	TEST	AL,010H			; transition on memory
  2810 00004051 75FA                <1> 	JNZ	SHORT WFMS_HI		; refresh.
  2811                              <1> WFMS_LO:
  2812 00004053 E461                <1> 	IN	AL,PORT_B		;SYS1
  2813 00004055 A810                <1> 	TEST	AL,010H
  2814 00004057 74FA                <1> 	JZ	SHORT WFMS_LO
  2815 00004059 E2E9                <1>         LOOP    WFMS_CHECK_MEM
  2816                              <1> ;WFMS_OUTER_LP:
  2817                              <1> ;;	or	bl, bl			; check outer counter
  2818                              <1> ;;	jz	short J36A		; WFMS_TIMEOUT
  2819                              <1> ;	dec	bl
  2820                              <1> ;	jz	short J36A	
  2821                              <1> ;	jmp	short WFMS_CHECK_MEM
  2822                              <1> 
  2823                              <1> 	;17/12/2014
  2824                              <1> 	;16/12/2014
  2825                              <1> ;        mov     byte [wait_count], 0    ; Reset (INT 08H) counter
  2826                              <1> ;J36:
  2827                              <1> ;	TEST	byte [SEEK_STATUS],INT_FLAG ; TEST FOR INTERRUPT OCCURRING
  2828                              <1> ;	JNZ	short J37
  2829                              <1> 	;16/12/2014
  2830                              <1> 	;LOOP	J36			; COUNT DOWN WHILE WAITING
  2831                              <1> 	;DEC	BL			; SECOND LEVEL COUNTER
  2832                              <1> 	;JNZ	short J36
  2833                              <1> ;       cmp     byte [wait_count], 46   ; (46/18.2 seconds)
  2834                              <1> ;	jb	short J36
  2835                              <1> 
  2836                              <1> ;WFMS_TIMEOUT:
  2837                              <1> ;J36A:
  2838 0000405B 800D[68310100]80    <1> 	OR	byte [DSKETTE_STATUS], TIME_OUT ; NOTHING HAPPENED
  2839 00004062 F9                  <1> 	STC				; ERROR RETURN
  2840                              <1> J37:
  2841 00004063 9C                  <1> 	PUSHF				; SAVE CURRENT CARRY
  2842 00004064 8025[65310100]7F    <1> 	AND	byte [SEEK_STATUS], ~INT_FLAG ; TURN OFF INTERRUPT FLAG
  2843 0000406B 9D                  <1> 	POPF				; RECOVER CARRY
  2844 0000406C C3                  <1> 	RETn				; GOOD RETURN CODE
  2845                              <1> 
  2846                              <1> ;-------------------------------------------------------------------------------
  2847                              <1> ; RESULTS
  2848                              <1> ;	THIS ROUTINE WILL READ ANYTHING THAT THE NEC CONTROLLER RETURNS 
  2849                              <1> ;	FOLLOWING AN INTERRUPT.
  2850                              <1> ;
  2851                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION.
  2852                              <1> ;		AX,BX,CX,DX DESTROYED
  2853                              <1> ;-------------------------------------------------------------------------------
  2854                              <1> RESULTS:
  2855 0000406D 57                  <1> 	PUSH	eDI
  2856 0000406E BF[69310100]        <1> 	MOV	eDI, NEC_STATUS		; POINTER TO DATA AREA
  2857 00004073 B307                <1> 	MOV	BL,7			; MAX STATUS BYTES
  2858 00004075 66BAF403            <1> 	MOV	DX,03F4H		; STATUS PORT
  2859                              <1> 
  2860                              <1> ;-----	WAIT FOR REQUEST FOR MASTER
  2861                              <1> 
  2862                              <1> _R10: 
  2863                              <1> 	; 16/12/2014
  2864                              <1> 	; wait for (max) 0.5 seconds
  2865                              <1> 	;MOV	BH,2			; HIGH ORDER COUNTER
  2866                              <1> 	;XOR	CX,CX			; COUNTER
  2867                              <1> 
  2868                              <1> 	;Time to wait while waiting for each byte of NEC results = .5
  2869                              <1> 	;seconds.  .5 seconds = 500,000 micros.  500,000/30 = 16,667.
  2870                              <1> 	; 27/02/2015
  2871 00004079 B91B410000          <1> 	mov 	ecx, WAIT_FDU_RESULTS_LH ; 16667  
  2872                              <1> 	;mov	cx, WAIT_FDU_RESULTS_LO  ; 16667
  2873                              <1> 	;mov	bh, WAIT_FDU_RESULTS_HI+1 ; 0+1
  2874                              <1> 
  2875                              <1> WFPSR_OUTER_LP:
  2876                              <1> 	;
  2877                              <1> WFPSR_CHECK_PORT:
  2878                              <1> J39:					; WAIT FOR MASTER
  2879 0000407E EC                  <1> 	IN	AL,DX			; GET STATUS
  2880 0000407F 24C0                <1> 	AND	AL,11000000B		; KEEP ONLY STATUS AND DIRECTION
  2881 00004081 3CC0                <1> 	CMP	AL,11000000B		; STATUS 1 AND DIRECTION 1 ?
  2882 00004083 7418                <1> 	JZ	short J42		; STATUS AND DIRECTION OK
  2883                              <1> WFPSR_HI:
  2884 00004085 E461                <1> 	IN	AL, PORT_B	;061h	; SYS1	; wait for hi to lo
  2885 00004087 A810                <1> 	TEST	AL,010H			; transition on memory
  2886 00004089 75FA                <1> 	JNZ	SHORT WFPSR_HI		; refresh.
  2887                              <1> WFPSR_LO:
  2888 0000408B E461                <1> 	IN	AL, PORT_B		; SYS1
  2889 0000408D A810                <1> 	TEST	AL,010H
  2890 0000408F 74FA                <1> 	JZ	SHORT WFPSR_LO
  2891 00004091 E2EB                <1>         LOOP    WFPSR_CHECK_PORT
  2892                              <1> 	;; 27/02/2015
  2893                              <1> 	;;dec	bh
  2894                              <1> 	;;jnz	short WFPSR_OUTER_LP
  2895                              <1> 	;jmp	short WFPSR_TIMEOUT	; fail
  2896                              <1> 
  2897                              <1> 	;;mov	byte [wait_count], 0
  2898                              <1> ;J39:					; WAIT FOR MASTER
  2899                              <1> ;	IN	AL,DX			; GET STATUS
  2900                              <1> ;	AND	AL,11000000B		; KEEP ONLY STATUS AND DIRECTION
  2901                              <1> ;	CMP	AL,11000000B		; STATUS 1 AND DIRECTION 1 ?
  2902                              <1> ;	JZ	short J42		; STATUS AND DIRECTION OK
  2903                              <1> 	;LOOP	J39			; LOOP TILL TIMEOUT
  2904                              <1> 	;DEC	BH			; DECREMENT HIGH ORDER COUNTER
  2905                              <1> 	;JNZ	short J39		; REPEAT TILL DELAY DONE
  2906                              <1> 	;
  2907                              <1> 	;;cmp	byte [wait_count], 10  ; (10/18.2 seconds)
  2908                              <1> 	;;jb	short J39	
  2909                              <1> 
  2910                              <1> ;WFPSR_TIMEOUT:
  2911 00004093 800D[68310100]80    <1> 	OR	byte [DSKETTE_STATUS],TIME_OUT
  2912 0000409A F9                  <1> 	STC				; SET ERROR RETURN
  2913 0000409B EB29                <1> 	JMP	SHORT POPRES		; POP REGISTERS AND RETURN
  2914                              <1> 
  2915                              <1> ;-----	READ IN THE STATUS
  2916                              <1> 
  2917                              <1> J42:
  2918 0000409D EB00                <1> 	JMP	$+2			; I/O DELAY
  2919 0000409F 6642                <1> 	INC	DX			; POINT AT DATA PORT
  2920 000040A1 EC                  <1> 	IN	AL,DX			; GET THE DATA
  2921                              <1> 	; 16/12/2014
  2922                              <1> 	NEWIODELAY
  2922 000040A2 E6EB                <2>  out 0ebh,al
  2923 000040A4 8807                <1>         MOV     [eDI],AL                ; STORE THE BYTE
  2924 000040A6 47                  <1> 	INC	eDI			; INCREMENT THE POINTER
  2925                              <1> 	; 16/12/2014
  2926                              <1> ;	push	cx
  2927                              <1> ;	mov	cx, 30
  2928                              <1> ;wdw2:
  2929                              <1> ;	NEWIODELAY
  2930                              <1> ;	loop	wdw2
  2931                              <1> ;	pop	cx
  2932                              <1> 
  2933 000040A7 B903000000          <1> 	MOV	eCX,3			; MINIMUM 24 MICROSECONDS FOR NEC
  2934 000040AC E8C2DCFFFF          <1> 	CALL	WAITF			; WAIT 30 TO 45 MICROSECONDS
  2935 000040B1 664A                <1> 	DEC	DX			; POINT AT STATUS PORT
  2936 000040B3 EC                  <1> 	IN	AL,DX			; GET STATUS
  2937                              <1> 	; 16/12/2014
  2938                              <1> 	NEWIODELAY
  2938 000040B4 E6EB                <2>  out 0ebh,al
  2939                              <1> 	;
  2940 000040B6 A810                <1> 	TEST	AL,00010000B		; TEST FOR NEC STILL BUSY
  2941 000040B8 740C                <1> 	JZ	short POPRES		; RESULTS DONE ?
  2942                              <1> 
  2943 000040BA FECB                <1> 	DEC	BL			; DECREMENT THE STATUS COUNTER
  2944 000040BC 75BB                <1>         JNZ     short _R10              ; GO BACK FOR MORE
  2945 000040BE 800D[68310100]20    <1> 	OR	byte [DSKETTE_STATUS],BAD_NEC ; TOO MANY STATUS BYTES
  2946 000040C5 F9                  <1> 	STC				; SET ERROR FLAG
  2947                              <1> 
  2948                              <1> ;-----	RESULT OPERATION IS DONE
  2949                              <1> POPRES:
  2950 000040C6 5F                  <1> 	POP	eDI
  2951 000040C7 C3                  <1> 	RETn				; RETURN WITH CARRY SET
  2952                              <1> 
  2953                              <1> ;-------------------------------------------------------------------------------
  2954                              <1> ; READ_DSKCHNG
  2955                              <1> ;	READS THE STATE OF THE DISK CHANGE LINE.
  2956                              <1> ;
  2957                              <1> ; ON ENTRY:	DI = DRIVE #
  2958                              <1> ;
  2959                              <1> ; ON EXIT:	DI = DRIVE #
  2960                              <1> ;		ZF = 0 : DISK CHANGE LINE INACTIVE
  2961                              <1> ;		ZF = 1 : DISK CHANGE LINE ACTIVE
  2962                              <1> ;		AX,CX,DX DESTROYED
  2963                              <1> ;-------------------------------------------------------------------------------
  2964                              <1> READ_DSKCHNG:
  2965 000040C8 E8A2FDFFFF          <1> 	CALL	MOTOR_ON		; TURN ON THE MOTOR IF OFF
  2966 000040CD 66BAF703            <1> 	MOV	DX,03F7H		; ADDRESS DIGITAL INPUT REGISTER
  2967 000040D1 EC                  <1> 	IN	AL,DX			; INPUT DIGITAL INPUT REGISTER
  2968 000040D2 A880                <1> 	TEST	AL,DSK_CHG		; CHECK FOR DISK CHANGE LINE ACTIVE
  2969 000040D4 C3                  <1> 	RETn				; RETURN TO CALLER WITH ZERO FLAG SET
  2970                              <1> 
  2971                              <1> ;-------------------------------------------------------------------------------
  2972                              <1> ; DRIVE_DET
  2973                              <1> ;	DETERMINES WHETHER DRIVE IS 80 OR 40 TRACKS AND
  2974                              <1> ;	UPDATES STATE INFORMATION ACCORDINGLY.
  2975                              <1> ; ON ENTRY:	DI = DRIVE #
  2976                              <1> ;-------------------------------------------------------------------------------
  2977                              <1> DRIVE_DET:
  2978 000040D5 E895FDFFFF          <1> 	CALL	MOTOR_ON		; TURN ON MOTOR IF NOT ALREADY ON
  2979 000040DA E80AFFFFFF          <1> 	CALL	RECAL			; RECALIBRATE DRIVE
  2980 000040DF 7251                <1> 	JC	short DD_BAC		; ASSUME NO DRIVE PRESENT
  2981 000040E1 B530                <1> 	MOV	CH,TRK_SLAP		; SEEK TO TRACK 48
  2982 000040E3 E882FEFFFF          <1> 	CALL	SEEK
  2983 000040E8 7248                <1> 	JC	short DD_BAC		; ERROR NO DRIVE
  2984 000040EA B50B                <1> 	MOV	CH,QUIET_SEEK+1		; SEEK TO TRACK 10
  2985                              <1> SK_GIN:
  2986 000040EC FECD                <1> 	DEC	CH			; DECREMENT TO NEXT TRACK
  2987 000040EE 6651                <1> 	PUSH	CX			; SAVE TRACK
  2988 000040F0 E875FEFFFF          <1> 	CALL	SEEK
  2989 000040F5 723C                <1> 	JC	short POP_BAC		; POP AND RETURN
  2990 000040F7 B8[33410000]        <1> 	MOV	eAX, POP_BAC		; LOAD NEC OUTPUT ERROR ADDRESS
  2991 000040FC 50                  <1> 	PUSH	eAX
  2992 000040FD B404                <1> 	MOV	AH,SENSE_DRV_ST		; SENSE DRIVE STATUS COMMAND BYTE
  2993 000040FF E82CFEFFFF          <1> 	CALL	NEC_OUTPUT		; OUTPUT TO NEC
  2994 00004104 6689F8              <1> 	MOV	AX,DI			; AL = DRIVE
  2995 00004107 88C4                <1> 	MOV	AH,AL			; AH = DRIVE
  2996 00004109 E822FEFFFF          <1> 	CALL	NEC_OUTPUT		; OUTPUT TO NEC
  2997 0000410E E85AFFFFFF          <1> 	CALL	RESULTS			; GO GET STATUS
  2998 00004113 58                  <1> 	POP	eAX			; THROW AWAY ERROR ADDRESS
  2999 00004114 6659                <1> 	POP	CX			; RESTORE TRACK
  3000 00004116 F605[69310100]10    <1> 	TEST	byte [NEC_STATUS], HOME	; TRACK 0 ?
  3001 0000411D 74CD                <1> 	JZ	short SK_GIN		; GO TILL TRACK 0
  3002 0000411F 08ED                <1> 	OR	CH,CH			; IS HOME AT TRACK 0
  3003 00004121 7408                <1> 	JZ	short IS_80		; MUST BE 80 TRACK DRIVE
  3004                              <1> 
  3005                              <1> ;	DRIVE IS A 360; SET DRIVE TO DETERMINED;
  3006                              <1> ;	SET MEDIA TO DETERMINED AT RATE 250.
  3007                              <1> 
  3008 00004123 808F[75310100]94    <1> 	OR	byte [DSK_STATE+eDI], DRV_DET+MED_DET+RATE_250
  3009 0000412A C3                  <1> 	RETn				; ALL INFORMATION SET
  3010                              <1> IS_80:
  3011 0000412B 808F[75310100]01    <1> 	OR	byte [DSK_STATE+eDI], TRK_CAPA ; SETUP 80 TRACK CAPABILITY
  3012                              <1> DD_BAC:
  3013 00004132 C3                  <1> 	RETn
  3014                              <1> POP_BAC:
  3015 00004133 6659                <1> 	POP	CX			; THROW AWAY
  3016 00004135 C3                  <1> 	RETn
  3017                              <1> 
  3018                              <1> fdc_int:  
  3019                              <1> 	  ; 30/07/2015	
  3020                              <1> 	  ; 16/02/2015
  3021                              <1> ;int_0Eh: ; 11/12/2014
  3022                              <1> 
  3023                              <1> ;--- HARDWARE INT 0EH -- ( IRQ LEVEL  6 ) --------------------------------------
  3024                              <1> ; DISK_INT
  3025                              <1> ;	THIS ROUTINE HANDLES THE DISKETTE INTERRUPT.
  3026                              <1> ;
  3027                              <1> ; ON EXIT:	THE INTERRUPT FLAG IS SET IN @SEEK_STATUS.
  3028                              <1> ;-------------------------------------------------------------------------------
  3029                              <1> DISK_INT_1:
  3030                              <1> 
  3031 00004136 6650                <1> 	PUSH	AX			; SAVE WORK REGISTER
  3032 00004138 1E                  <1> 	push	ds
  3033 00004139 66B81000            <1> 	mov	ax, KDATA
  3034 0000413D 8ED8                <1> 	mov 	ds, ax
  3035 0000413F 800D[65310100]80    <1>         OR      byte [SEEK_STATUS], INT_FLAG ; TURN ON INTERRUPT OCCURRED
  3036 00004146 B020                <1> 	MOV     AL,EOI                  ; END OF INTERRUPT MARKER
  3037 00004148 E620                <1> 	OUT	INTA00,AL		; INTERRUPT CONTROL PORT
  3038 0000414A 1F                  <1> 	pop	ds
  3039 0000414B 6658                <1> 	POP	AX			; RECOVER REGISTER
  3040 0000414D CF                  <1> 	IRETd				; RETURN FROM INTERRUPT
  3041                              <1> 
  3042                              <1> ;-------------------------------------------------------------------------------
  3043                              <1> ; DSKETTE_SETUP
  3044                              <1> ;	THIS ROUTINE DOES A PRELIMINARY CHECK TO SEE WHAT TYPE OF
  3045                              <1> ;	DISKETTE DRIVES ARE ATTACH TO THE SYSTEM.
  3046                              <1> ;-------------------------------------------------------------------------------
  3047                              <1> 
  3048                              <1> ; 29/05/2016 - TRDOS 386 (TRDOS v2.0)
  3049                              <1> 
  3050                              <1> DSKETTE_SETUP:
  3051                              <1> 	;PUSH	AX			; SAVE REGISTERS
  3052                              <1> 	;PUSH	BX
  3053                              <1> 	;PUSH	CX
  3054 0000414E 52                  <1> 	PUSH	eDX
  3055                              <1> 	;PUSH	DI
  3056                              <1> 	;;PUSH	DS
  3057                              <1> 	; 14/12/2014
  3058                              <1> 	;mov	word [DISK_POINTER], MD_TBL6
  3059                              <1> 	;mov	[DISK_POINTER+2], cs
  3060                              <1> 	;
  3061                              <1> 	;OR	byte [RTC_WAIT_FLAG], 1	; NO RTC WAIT, FORCE USE OF LOOP
  3062 0000414F 31FF                <1> 	XOR	eDI,eDI			; INITIALIZE DRIVE POINTER
  3063 00004151 66C705[75310100]00- <1> 	MOV	WORD [DSK_STATE],0	; INITIALIZE STATES
  3063 00004159 00                  <1>
  3064 0000415A 8025[70310100]33    <1> 	AND	byte [LASTRATE],~(STRT_MSK+SEND_MSK) ; CLEAR START & SEND
  3065 00004161 800D[70310100]C0    <1> 	OR	byte [LASTRATE],SEND_MSK ; INITIALIZE SENT TO IMPOSSIBLE
  3066 00004168 C605[65310100]00    <1> 	MOV	byte [SEEK_STATUS],0	; INDICATE RECALIBRATE NEEDED
  3067 0000416F C605[67310100]00    <1> 	MOV	byte [MOTOR_COUNT],0	; INITIALIZE MOTOR COUNT
  3068 00004176 C605[66310100]00    <1> 	MOV	byte [MOTOR_STATUS],0	; INITIALIZE DRIVES TO OFF STATE
  3069 0000417D C605[68310100]00    <1> 	MOV	byte [DSKETTE_STATUS],0	; NO ERRORS
  3070                              <1> 	;
  3071                              <1> 	; 28/02/2015
  3072                              <1> 	;mov	word [cfd], 100h 
  3073 00004184 E848F2FFFF          <1> 	call	DSK_RESET
  3074 00004189 5A                  <1> 	pop	edx
  3075 0000418A F8                  <1> 	clc	; 29/05/2016
  3076 0000418B C3                  <1> 	retn
  3077                              <1> 
  3078                              <1> ;SUP0:
  3079                              <1> ;	CALL	DRIVE_DET		; DETERMINE DRIVE
  3080                              <1> ;	CALL	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  3081                              <1> ;	; 02/01/2015
  3082                              <1> ;	;INC	DI			; POINT TO NEXT DRIVE
  3083                              <1> ;	;CMP	DI,MAX_DRV		; SEE IF DONE
  3084                              <1> ;	;JNZ	short SUP0		; REPEAT FOR EACH ORIVE
  3085                              <1> ;       cmp     byte [fd1_type], 0	
  3086                              <1> ;	jna	short sup1
  3087                              <1> ;	or	di, di
  3088                              <1> ;	jnz	short sup1
  3089                              <1> ;	inc	di
  3090                              <1> ;       jmp     short SUP0
  3091                              <1> ;sup1:
  3092                              <1> ;	MOV	byte [SEEK_STATUS],0	; FORCE RECALIBRATE
  3093                              <1> ;	;AND	byte [RTC_WAIT_FLAG],0FEH ; ALLOW FOR RTC WAIT
  3094                              <1> ;	CALL	SETUP_END		; VARIOUS CLEANUPS
  3095                              <1> ;	;;POP	DS			; RESTORE CALLERS REGISTERS
  3096                              <1> ;	;POP	DI
  3097                              <1> ;	POP	eDX
  3098                              <1> ;	;POP	CX
  3099                              <1> ;	;POP	BX
  3100                              <1> ;	;POP	AX
  3101                              <1> ;	RETn
  3102                              <1> 
  3103                              <1> ;//////////////////////////////////////////////////////
  3104                              <1> ;; END OF DISKETTE I/O ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3105                              <1> ;
  3106                              <1> 
  3107                              <1> int13h: ; 21/02/2015
  3108 0000418C 9C                  <1> 	pushfd
  3109 0000418D 0E                  <1> 	push 	cs
  3110 0000418E E843010000          <1> 	call 	DISK_IO
  3111 00004193 C3                  <1> 	retn
  3112                              <1> 
  3113                              <1> ;;;;;; DISK I/O ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 21/02/2015 ;;;
  3114                              <1> ;/////////////////////////////////////////////////////////////////////
  3115                              <1> 
  3116                              <1> ; DISK I/O - Erdogan Tan (Retro UNIX 386 v1 project)
  3117                              <1> ; 18/02/2016
  3118                              <1> ; 17/02/2016
  3119                              <1> ; 23/02/2015
  3120                              <1> ; 21/02/2015 (unix386.s)
  3121                              <1> ; 22/12/2014 - 14/02/2015 (dsectrm2.s)
  3122                              <1> ;
  3123                              <1> ; Original Source Code:
  3124                              <1> ; DISK ----- 09/25/85 FIXED DISK BIOS
  3125                              <1> ; (IBM PC XT Model 286 System BIOS Source Code, 04-21-86)
  3126                              <1> ;
  3127                              <1> ; Modifications: by reference of AWARD BIOS 1999 (D1A0622) 
  3128                              <1> ;		 Source Code - ATORGS.ASM, AHDSK.ASM
  3129                              <1> ;
  3130                              <1> 
  3131                              <1> 
  3132                              <1> ;The wait for controller to be not busy is 10 seconds.
  3133                              <1> ;10,000,000 / 30 = 333,333.  333,333 decimal = 051615h
  3134                              <1> ;;WAIT_HDU_CTLR_BUSY_LO	equ	1615h		
  3135                              <1> ;;WAIT_HDU_CTLR_BUSY_HI	equ	  05h
  3136                              <1> WAIT_HDU_CTRL_BUSY_LH	equ	51615h	 ;21/02/2015		
  3137                              <1> 
  3138                              <1> ;The wait for controller to issue completion interrupt is 10 seconds.
  3139                              <1> ;10,000,000 / 30 = 333,333.  333,333 decimal = 051615h
  3140                              <1> ;;WAIT_HDU_INT_LO	equ	1615h
  3141                              <1> ;;WAIT_HDU_INT_HI	equ	  05h
  3142                              <1> WAIT_HDU_INT_LH		equ	51615h	; 21/02/2015
  3143                              <1> 
  3144                              <1> ;The wait for Data request on read and write longs is
  3145                              <1> ;2000 us. (?)
  3146                              <1> ;;WAIT_HDU_DRQ_LO	equ	1000	; 03E8h
  3147                              <1> ;;WAIT_HDU_DRQ_HI	equ	0
  3148                              <1> WAIT_HDU_DRQ_LH		equ	1000	; 21/02/2015
  3149                              <1> 
  3150                              <1> ; Port 61h (PORT_B)
  3151                              <1> SYS1		equ	61h	; PORT_B  (diskette.inc)
  3152                              <1> 
  3153                              <1> ; 23/12/2014
  3154                              <1> %define CMD_BLOCK       eBP-8  ; 21/02/2015
  3155                              <1> 
  3156                              <1> 
  3157                              <1> ;--- INT 13H -------------------------------------------------------------------
  3158                              <1> ;									       :
  3159                              <1> ; FIXED DISK I/O INTERFACE						       :
  3160                              <1> ;									       :
  3161                              <1> ;	THIS INTERFACE PROVIDES ACCESS TO 5 1/4" FIXED DISKS THROUGH           :
  3162                              <1> ;	THE IBM FIXED DISK CONTROLLER.					       :
  3163                              <1> ;									       :
  3164                              <1> ;	THE  BIOS  ROUTINES  ARE  MEANT  TO  BE  ACCESSED  THROUGH	       :
  3165                              <1> ;	SOFTWARE  INTERRUPTS  ONLY.    ANY  ADDRESSES  PRESENT	IN	       :
  3166                              <1> ;	THESE  LISTINGS  ARE  INCLUDED	 ONLY	FOR  COMPLETENESS,	       :
  3167                              <1> ;	NOT  FOR  REFERENCE.  APPLICATIONS   WHICH  REFERENCE  ANY	       :
  3168                              <1> ;	ABSOLUTE  ADDRESSES  WITHIN  THE  CODE	SEGMENTS  OF  BIOS	       :
  3169                              <1> ;	VIOLATE  THE  STRUCTURE  AND  DESIGN  OF  BIOS. 		       :
  3170                              <1> ;									       :
  3171                              <1> ;------------------------------------------------------------------------------:
  3172                              <1> ;									       :
  3173                              <1> ; INPUT  (AH)= HEX COMMAND VALUE					       :
  3174                              <1> ;									       :
  3175                              <1> ;	(AH)= 00H  RESET DISK (DL = 80H,81H) / DISKETTE 		       :
  3176                              <1> ;	(AH)= 01H  READ THE STATUS OF THE LAST DISK OPERATION INTO (AL)        :
  3177                              <1> ;		    NOTE: DL < 80H - DISKETTE				       :
  3178                              <1> ;			  DL > 80H - DISK				       :
  3179                              <1> ;	(AH)= 02H  READ THE DESIRED SECTORS INTO MEMORY 		       :
  3180                              <1> ;	(AH)= 03H  WRITE THE DESIRED SECTORS FROM MEMORY		       :
  3181                              <1> ;	(AH)= 04H  VERIFY THE DESIRED SECTORS				       :
  3182                              <1> ;	(AH)= 05H  FORMAT THE DESIRED TRACK				       :
  3183                              <1> ;	(AH)= 06H  UNUSED						       :
  3184                              <1> ;	(AH)= 07H  UNUSED						       :
  3185                              <1> ;	(AH)= 08H  RETURN THE CURRENT DRIVE PARAMETERS			       :
  3186                              <1> ;	(AH)= 09H  INITIALIZE DRIVE PAIR CHARACTERISTICS		       :
  3187                              <1> ;		    INTERRUPT 41 POINTS TO DATA BLOCK FOR DRIVE 0	       :
  3188                              <1> ;		    INTERRUPT 46 POINTS TO DATA BLOCK FOR DRIVE 1	       :
  3189                              <1> ;	(AH)= 0AH  READ LONG						       :
  3190                              <1> ;	(AH)= 0BH  WRITE LONG  (READ & WRITE LONG ENCOMPASS 512 + 4 BYTES ECC) :
  3191                              <1> ;	(AH)= 0CH  SEEK 						       :
  3192                              <1> ;	(AH)= 0DH  ALTERNATE DISK RESET (SEE DL)			       :
  3193                              <1> ;	(AH)= 0EH  UNUSED						       :
  3194                              <1> ;	(AH)= 0FH  UNUSED						       :
  3195                              <1> ;	(AH)= 10H  TEST DRIVE READY					       :
  3196                              <1> ;	(AH)= 11H  RECALIBRATE						       :
  3197                              <1> ;	(AH)= 12H  UNUSED						       :
  3198                              <1> ;	(AH)= 13H  UNUSED						       :
  3199                              <1> ;	(AH)= 14H  CONTROLLER INTERNAL DIAGNOSTIC			       :
  3200                              <1> ;	(AH)= 15H  READ DASD TYPE					       :
  3201                              <1> ;									       :
  3202                              <1> ;-------------------------------------------------------------------------------
  3203                              <1> ;									       :
  3204                              <1> ;	REGISTERS USED FOR FIXED DISK OPERATIONS			       :
  3205                              <1> ;									       :
  3206                              <1> ;		(DL)	-  DRIVE NUMBER     (80H-81H FOR DISK. VALUE CHECKED)  :
  3207                              <1> ;		(DH)	-  HEAD NUMBER	    (0-15 ALLOWED, NOT VALUE CHECKED)  :
  3208                              <1> ;		(CH)	-  CYLINDER NUMBER  (0-1023, NOT VALUE CHECKED)(SEE CL):
  3209                              <1> ;		(CL)	-  SECTOR NUMBER    (1-17, NOT VALUE CHECKED)	       :
  3210                              <1> ;									       :
  3211                              <1> ;			   NOTE: HIGH 2 BITS OF CYLINDER NUMBER ARE PLACED     :
  3212                              <1> ;				 IN THE HIGH 2 BITS OF THE CL REGISTER	       :
  3213                              <1> ;				 (10 BITS TOTAL)			       :
  3214                              <1> ;									       :
  3215                              <1> ;		(AL)	-  NUMBER OF SECTORS (MAXIMUM POSSIBLE RANGE 1-80H,    :
  3216                              <1> ;					      FOR READ/WRITE LONG 1-79H)       :
  3217                              <1> ;									       :
  3218                              <1> ;		(ES:BX) -  ADDRESS OF BUFFER FOR READS AND WRITES,	       :
  3219                              <1> ;			   (NOT REQUIRED FOR VERIFY)			       :
  3220                              <1> ;									       :
  3221                              <1> ;		FORMAT (AH=5) ES:BX POINTS TO A 512 BYTE BUFFER. THE FIRST     :
  3222                              <1> ;			   2*(SECTORS/TRACK) BYTES CONTAIN F,N FOR EACH SECTOR.:
  3223                              <1> ;			   F = 00H FOR A GOOD SECTOR			       :
  3224                              <1> ;			       80H FOR A BAD SECTOR			       :
  3225                              <1> ;			   N = SECTOR NUMBER				       :
  3226                              <1> ;			   FOR AN INTERLEAVE OF 2 AND 17 SECTORS/TRACK	       :
  3227                              <1> ;			   THE TABLE SHOULD BE: 			       :
  3228                              <1> ;									       :
  3229                              <1> ;		   DB	   00H,01H,00H,0AH,00H,02H,00H,0BH,00H,03H,00H,0CH     :
  3230                              <1> ;		   DB	   00H,04H,00H,0DH,00H,05H,00H,0EH,00H,06H,00H,0FH     :
  3231                              <1> ;		   DB	   00H,07H,00H,10H,00H,08H,00H,11H,00H,09H	       :
  3232                              <1> ;									       :
  3233                              <1> ;-------------------------------------------------------------------------------
  3234                              <1> 
  3235                              <1> ;-------------------------------------------------------------------------------
  3236                              <1> ; OUTPUT								       :
  3237                              <1> ;	AH = STATUS OF CURRENT OPERATION				       :
  3238                              <1> ;	     STATUS BITS ARE DEFINED IN THE EQUATES BELOW		       :
  3239                              <1> ;	CY = 0	SUCCESSFUL OPERATION (AH=0 ON RETURN)			       :
  3240                              <1> ;	CY = 1	FAILED OPERATION (AH HAS ERROR REASON)			       :
  3241                              <1> ;									       :
  3242                              <1> ;	NOTE:	ERROR 11H  INDICATES THAT THE DATA READ HAD A RECOVERABLE      :
  3243                              <1> ;		ERROR WHICH WAS CORRECTED BY THE ECC ALGORITHM.  THE DATA      :
  3244                              <1> ;		IS PROBABLY GOOD,   HOWEVER THE BIOS ROUTINE INDICATES AN      :
  3245                              <1> ;		ERROR TO ALLOW THE CONTROLLING PROGRAM A CHANCE TO DECIDE      :
  3246                              <1> ;		FOR ITSELF.  THE  ERROR  MAY  NOT  RECUR  IF  THE DATA IS      :
  3247                              <1> ;		REWRITTEN.						       :
  3248                              <1> ;									       :
  3249                              <1> ;	IF DRIVE PARAMETERS WERE REQUESTED (DL >= 80H), 		       :
  3250                              <1> ;	   INPUT:							       :
  3251                              <1> ;	     (DL) = DRIVE NUMBER					       :	
  3252                              <1> ;	     ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)						       :	 	
  3253                              <1> ;	     EBX = Buffer address for fixed disk parameters table (32 bytes)   :
  3254                              <1> ;	   OUTPUT:							       :
  3255                              <1> ;	     (DL) = NUMBER OF CONSECUTIVE ACKNOWLEDGING DRIVES ATTACHED (1-2)  :
  3256                              <1> ;		    (CONTROLLER CARD ZERO TALLY ONLY)			       :
  3257                              <1> ;	     (DH) = MAXIMUM USEABLE VALUE FOR HEAD NUMBER		       :
  3258                              <1> ;	     (CH) = MAXIMUM USEABLE VALUE FOR CYLINDER NUMBER		       :
  3259                              <1> ;	     (CL) = MAXIMUM USEABLE VALUE FOR SECTOR NUMBER		       :
  3260                              <1> ;		    AND CYLINDER NUMBER HIGH BITS			       :
  3261                              <1> ;									       :
  3262                              <1> ;	IF READ DASD TYPE WAS REQUESTED,				       :
  3263                              <1> ;									       :
  3264                              <1> ;	AH = 0 - NOT PRESENT						       :
  3265                              <1> ;	     1 - DISKETTE - NO CHANGE LINE AVAILABLE			       :
  3266                              <1> ;	     2 - DISKETTE - CHANGE LINE AVAILABLE			       :
  3267                              <1> ;	     3 - FIXED DISK						       :
  3268                              <1> ;									       :
  3269                              <1> ;	CX,DX = NUMBER OF 512 BYTE BLOCKS WHEN AH = 3			       :
  3270                              <1> ;									       :
  3271                              <1> ;	REGISTERS WILL BE PRESERVED EXCEPT WHEN THEY ARE USED TO RETURN        :
  3272                              <1> ;	INFORMATION.							       :
  3273                              <1> ;									       :
  3274                              <1> ;	NOTE: IF AN ERROR IS REPORTED BY THE DISK CODE, THE APPROPRIATE        :
  3275                              <1> ;		ACTION IS TO RESET THE DISK, THEN RETRY THE OPERATION.	       :
  3276                              <1> ;									       :
  3277                              <1> ;-------------------------------------------------------------------------------
  3278                              <1> 
  3279                              <1> SENSE_FAIL	EQU	0FFH		; NOT IMPLEMENTED
  3280                              <1> NO_ERR		EQU	0E0H		; STATUS ERROR/ERROR REGISTER=0
  3281                              <1> WRITE_FAULT	EQU	0CCH		; WRITE FAULT ON SELECTED DRIVE
  3282                              <1> UNDEF_ERR	EQU	0BBH		; UNDEFINED ERROR OCCURRED
  3283                              <1> NOT_RDY 	EQU	0AAH		; DRIVE NOT READY
  3284                              <1> TIME_OUT	EQU	80H		; ATTACHMENT FAILED TO RESPOND
  3285                              <1> BAD_SEEK	EQU	40H		; SEEK OPERATION FAILED
  3286                              <1> BAD_CNTLR	EQU	20H		; CONTROLLER HAS FAILED
  3287                              <1> DATA_CORRECTED	EQU	11H		; ECC CORRECTED DATA ERROR
  3288                              <1> BAD_ECC 	EQU	10H		; BAD ECC ON DISK READ
  3289                              <1> BAD_TRACK	EQU	0BH		; NOT IMPLEMENTED
  3290                              <1> BAD_SECTOR	EQU	0AH		; BAD SECTOR FLAG DETECTED
  3291                              <1> ;DMA_BOUNDARY	EQU	09H		; DATA EXTENDS TOO FAR
  3292                              <1> INIT_FAIL	EQU	07H		; DRIVE PARAMETER ACTIVITY FAILED
  3293                              <1> BAD_RESET	EQU	05H		; RESET FAILED
  3294                              <1> ;RECORD_NOT_FND	EQU	04H		; REQUESTED SECTOR NOT FOUND
  3295                              <1> ;BAD_ADDR_MARK	EQU	02H		; ADDRESS MARK NOT FOUND
  3296                              <1> ;BAD_CMD 	EQU	01H		; BAD COMMAND PASSED TO DISK I/O
  3297                              <1> 
  3298                              <1> ;--------------------------------------------------------
  3299                              <1> ;							:
  3300                              <1> ; FIXED DISK PARAMETER TABLE				:
  3301                              <1> ;  -  THE TABLE IS COMPOSED OF A BLOCK DEFINED AS:	:
  3302                              <1> ;							:
  3303                              <1> ;  +0	(1 WORD) - MAXIMUM NUMBER OF CYLINDERS		:
  3304                              <1> ;  +2	(1 BYTE) - MAXIMUM NUMBER OF HEADS		:
  3305                              <1> ;  +3	(1 WORD) - NOT USED/SEE PC-XT			:
  3306                              <1> ;  +5	(1 WORD) - STARTING WRITE PRECOMPENSATION CYL	:
  3307                              <1> ;  +7	(1 BYTE) - MAXIMUM ECC DATA BURST LENGTH	:
  3308                              <1> ;  +8	(1 BYTE) - CONTROL BYTE 			:
  3309                              <1> ;		   BIT	  7 DISABLE RETRIES -OR-	:
  3310                              <1> ;		   BIT	  6 DISABLE RETRIES		:
  3311                              <1> ;		   BIT	  3 MORE THAN 8 HEADS		:
  3312                              <1> ;  +9	(3 BYTES)- NOT USED/SEE PC-XT			:
  3313                              <1> ; +12	(1 WORD) - LANDING ZONE 			:
  3314                              <1> ; +14	(1 BYTE) - NUMBER OF SECTORS/TRACK		:
  3315                              <1> ; +15	(1 BYTE) - RESERVED FOR FUTURE USE		:
  3316                              <1> ;							:
  3317                              <1> ;	 - TO DYNAMICALLY DEFINE A SET OF PARAMETERS	:
  3318                              <1> ;	   BUILD A TABLE FOR UP TO 15 TYPES AND PLACE	:
  3319                              <1> ;	   THE CORRESPONDING VECTOR INTO INTERRUPT 41	:
  3320                              <1> ;	   FOR DRIVE 0 AND INTERRUPT 46 FOR DRIVE 1.	:
  3321                              <1> ;							:
  3322                              <1> ;--------------------------------------------------------
  3323                              <1> 
  3324                              <1> ;--------------------------------------------------------
  3325                              <1> ;							:
  3326                              <1> ; HARDWARE SPECIFIC VALUES				:
  3327                              <1> ;							:
  3328                              <1> ;  -  CONTROLLER I/O PORT				:
  3329                              <1> ;							:
  3330                              <1> ;     > WHEN READ FROM: 				:
  3331                              <1> ;	HF_PORT+0 - READ DATA (FROM CONTROLLER TO CPU)	:
  3332                              <1> ;	HF_PORT+1 - GET ERROR REGISTER			:
  3333                              <1> ;	HF_PORT+2 - GET SECTOR COUNT			:
  3334                              <1> ;	HF_PORT+3 - GET SECTOR NUMBER			:
  3335                              <1> ;	HF_PORT+4 - GET CYLINDER LOW			:
  3336                              <1> ;	HF_PORT+5 - GET CYLINDER HIGH (2 BITS)		:
  3337                              <1> ;	HF_PORT+6 - GET SIZE/DRIVE/HEAD 		:
  3338                              <1> ;	HF_PORT+7 - GET STATUS REGISTER 		:
  3339                              <1> ;							:
  3340                              <1> ;     > WHEN WRITTEN TO:				:
  3341                              <1> ;	HF_PORT+0 - WRITE DATA (FROM CPU TO CONTROLLER) :
  3342                              <1> ;	HF_PORT+1 - SET PRECOMPENSATION CYLINDER	:
  3343                              <1> ;	HF_PORT+2 - SET SECTOR COUNT			:
  3344                              <1> ;	HF_PORT+3 - SET SECTOR NUMBER			:
  3345                              <1> ;	HF_PORT+4 - SET CYLINDER LOW			:
  3346                              <1> ;	HF_PORT+5 - SET CYLINDER HIGH (2 BITS)		:
  3347                              <1> ;	HF_PORT+6 - SET SIZE/DRIVE/HEAD 		:
  3348                              <1> ;	HF_PORT+7 - SET COMMAND REGISTER		:
  3349                              <1> ;							:
  3350                              <1> ;--------------------------------------------------------
  3351                              <1> 
  3352                              <1> ;HF_PORT 	EQU	01F0H	; DISK PORT
  3353                              <1> ;HF1_PORT	equ	0170h	
  3354                              <1> ;HF_REG_PORT	EQU	03F6H
  3355                              <1> ;HF1_REG_PORT	equ	0376h
  3356                              <1> 
  3357                              <1> HDC1_BASEPORT	equ	1F0h
  3358                              <1> HDC2_BASEPORT	equ	170h		
  3359                              <1> 
  3360                              <1> align 2
  3361                              <1> 
  3362                              <1> ;-----		STATUS REGISTER
  3363                              <1> 
  3364                              <1> ST_ERROR	EQU	00000001B	;
  3365                              <1> ST_INDEX	EQU	00000010B	;
  3366                              <1> ST_CORRCTD	EQU	00000100B	; ECC CORRECTION SUCCESSFUL
  3367                              <1> ST_DRQ		EQU	00001000B	;
  3368                              <1> ST_SEEK_COMPL	EQU	00010000B	; SEEK COMPLETE
  3369                              <1> ST_WRT_FLT	EQU	00100000B	; WRITE FAULT
  3370                              <1> ST_READY	EQU	01000000B	;
  3371                              <1> ST_BUSY 	EQU	10000000B	;
  3372                              <1> 
  3373                              <1> ;-----		ERROR REGISTER
  3374                              <1> 
  3375                              <1> ERR_DAM 	EQU	00000001B	; DATA ADDRESS MARK NOT FOUND
  3376                              <1> ERR_TRK_0	EQU	00000010B	; TRACK 0 NOT FOUND ON RECAL
  3377                              <1> ERR_ABORT	EQU	00000100B	; ABORTED COMMAND
  3378                              <1> ;		EQU	00001000B	; NOT USED
  3379                              <1> ERR_ID		EQU	00010000B	; ID NOT FOUND
  3380                              <1> ;		EQU	00100000B	; NOT USED
  3381                              <1> ERR_DATA_ECC	EQU	01000000B
  3382                              <1> ERR_BAD_BLOCK	EQU	10000000B
  3383                              <1> 
  3384                              <1> 
  3385                              <1> RECAL_CMD	EQU	00010000B	; DRIVE RECAL	(10H)
  3386                              <1> READ_CMD	EQU	00100000B	;	READ	(20H)
  3387                              <1> WRITE_CMD	EQU	00110000B	;	WRITE	(30H)
  3388                              <1> VERIFY_CMD	EQU	01000000B	;	VERIFY	(40H)
  3389                              <1> FMTTRK_CMD	EQU	01010000B	; FORMAT TRACK	(50H)
  3390                              <1> INIT_CMD	EQU	01100000B	;   INITIALIZE	(60H)
  3391                              <1> SEEK_CMD	EQU	01110000B	;	SEEK	(70H)
  3392                              <1> DIAG_CMD	EQU	10010000B	; DIAGNOSTIC	(90H)
  3393                              <1> SET_PARM_CMD	EQU	10010001B	; DRIVE PARMS	(91H)
  3394                              <1> NO_RETRIES	EQU	00000001B	; CHD MODIFIER	(01H)
  3395                              <1> ECC_MODE	EQU	00000010B	; CMD MODIFIER	(02H)
  3396                              <1> BUFFER_MODE	EQU	00001000B	; CMD MODIFIER	(08H)
  3397                              <1> 
  3398                              <1> ;MAX_FILE	EQU	2
  3399                              <1> ;S_MAX_FILE	EQU	2
  3400                              <1> MAX_FILE	equ	4		; 22/12/2014
  3401                              <1> S_MAX_FILE	equ	4		; 22/12/2014
  3402                              <1> 
  3403                              <1> DELAY_1 	EQU	25H		; DELAY FOR OPERATION COMPLETE
  3404                              <1> DELAY_2 	EQU	0600H		; DELAY FOR READY
  3405                              <1> DELAY_3 	EQU	0100H		; DELAY FOR DATA REQUEST
  3406                              <1> 
  3407                              <1> HF_FAIL 	EQU	08H		; CMOS FLAG IN BYTE 0EH
  3408                              <1> 
  3409                              <1> ;-----		COMMAND BLOCK REFERENCE
  3410                              <1> 
  3411                              <1> ;CMD_BLOCK      EQU     BP-8            ; @CMD_BLOCK REFERENCES BLOCK HEAD IN SS
  3412                              <1> 					;  (BP) POINTS TO COMMAND BLOCK TAIL
  3413                              <1> 					;	AS DEFINED BY THE "ENTER" PARMS
  3414                              <1> ; 19/12/2014
  3415                              <1> ORG_VECTOR	equ	4*13h		; INT 13h vector
  3416                              <1> DISK_VECTOR	equ	4*40h		; INT 40h vector (for floppy disks)
  3417                              <1> ;HDISK_INT	equ	4*76h		; Primary HDC - Hardware interrupt (IRQ14)
  3418                              <1> ;HDISK_INT1	equ	4*76h		; Primary HDC - Hardware interrupt (IRQ14)
  3419                              <1> ;HDISK_INT2	equ	4*77h		; Secondary HDC - Hardware interrupt (IRQ15)
  3420                              <1> ;HF_TBL_VEC	equ	4*41h		; Pointer to 1st fixed disk parameter table
  3421                              <1> ;HF1_TBL_VEC	equ	4*46h		; Pointer to 2nd fixed disk parameter table
  3422                              <1> 
  3423                              <1> align 2
  3424                              <1> 
  3425                              <1> ;----------------------------------------------------------------
  3426                              <1> ; FIXED DISK I/O SETUP						:
  3427                              <1> ;								:
  3428                              <1> ;  -  ESTABLISH TRANSFER VECTORS FOR THE FIXED DISK		:
  3429                              <1> ;  -  PERFORM POWER ON DIAGNOSTICS				:
  3430                              <1> ;     SHOULD AN ERROR OCCUR A "1701" MESSAGE IS DISPLAYED       :
  3431                              <1> ;								:
  3432                              <1> ;----------------------------------------------------------------
  3433                              <1> 
  3434                              <1> ; 29/05/2016 - TRDOS 386 (TRDOS v2.0)
  3435                              <1> 
  3436                              <1> DISK_SETUP:
  3437                              <1> 	;CLI
  3438                              <1> 	;;MOV	AX,ABS0 			; GET ABSOLUTE SEGMENT
  3439                              <1> 	;xor	ax,ax
  3440                              <1> 	;MOV	DS,AX				; SET SEGMENT REGISTER
  3441                              <1> 	;MOV	AX, [ORG_VECTOR] 		; GET DISKETTE VECTOR
  3442                              <1> 	;MOV	[DISK_VECTOR],AX		;  INTO INT 40H
  3443                              <1> 	;MOV	AX, [ORG_VECTOR+2]
  3444                              <1> 	;MOV	[DISK_VECTOR+2],AX
  3445                              <1> 	;MOV	word [ORG_VECTOR],DISK_IO	; FIXED DISK HANDLER
  3446                              <1> 	;MOV	[ORG_VECTOR+2],CS
  3447                              <1> 	; 1st controller (primary master, slave)   - IRQ 14
  3448                              <1> 	;;MOV	word [HDISK_INT],HD_INT		; FIXED DISK INTERRUPT
  3449                              <1> 	;mov	word [HDISK_INT1],HD_INT	;
  3450                              <1> 	;;MOV	[HDISK_INT+2],CS
  3451                              <1> 	;mov	[HDISK_INT1+2],CS
  3452                              <1> 	; 2nd controller (secondary master, slave) - IRQ 15
  3453                              <1> 	;mov	word [HDISK_INT2],HD1_INT	;
  3454                              <1> 	;mov	[HDISK_INT2+2],CS
  3455                              <1> 	;
  3456                              <1> 	;;MOV	word [HF_TBL_VEC],HD0_DPT	; PARM TABLE DRIVE 80
  3457                              <1> 	;;MOV	word [HF_TBL_VEC+2],DPT_SEGM
  3458                              <1> 	;;MOV	word [HF1_TBL_VEC],HD1_DPT	; PARM TABLE DRIVE 81
  3459                              <1> 	;;MOV	word [HF1_TBL_VEC+2],DPT_SEGM
  3460                              <1> 	;push	cs
  3461                              <1> 	;pop	ds
  3462                              <1> 	;mov	word [HDPM_TBL_VEC],HD0_DPT	; PARM TABLE DRIVE 80h
  3463                              <1> 	;mov	word [HDPM_TBL_VEC+2],DPT_SEGM
  3464 00004194 C705[80310100]0000- <1> 	mov 	dword [HDPM_TBL_VEC], (DPT_SEGM*16)+HD0_DPT
  3464 0000419C 0900                <1>
  3465                              <1> 	;mov	word [HDPS_TBL_VEC],HD1_DPT	; PARM TABLE DRIVE 81h
  3466                              <1> 	;mov	word [HDPS_TBL_VEC+2],DPT_SEGM
  3467 0000419E C705[84310100]2000- <1> 	mov 	dword [HDPS_TBL_VEC], (DPT_SEGM*16)+HD1_DPT
  3467 000041A6 0900                <1>
  3468                              <1> 	;mov	word [HDSM_TBL_VEC],HD2_DPT	; PARM TABLE DRIVE 82h
  3469                              <1> 	;mov	word [HDSM_TBL_VEC+2],DPT_SEGM
  3470 000041A8 C705[88310100]4000- <1> 	mov 	dword [HDSM_TBL_VEC], (DPT_SEGM*16)+HD2_DPT
  3470 000041B0 0900                <1>
  3471                              <1> 	;mov	word [HDSS_TBL_VEC],HD3_DPT	; PARM TABLE DRIVE 83h
  3472                              <1> 	;mov	word [HDSS_TBL_VEC+2],DPT_SEGM
  3473 000041B2 C705[8C310100]6000- <1> 	mov 	dword [HDSS_TBL_VEC], (DPT_SEGM*16)+HD3_DPT
  3473 000041BA 0900                <1>
  3474                              <1> 	;
  3475                              <1> 	;;IN	AL,INTB01		; TURN ON SECOND INTERRUPT CHIP
  3476                              <1> 	;;;AND	AL,0BFH
  3477                              <1> 	;;and	al, 3Fh			; enable IRQ 14 and IRQ 15
  3478                              <1> 	;;;JMP	$+2
  3479                              <1> 	;;IODELAY
  3480                              <1> 	;;OUT	INTB01,AL
  3481                              <1> 	;;IODELAY
  3482                              <1> 	;;IN	AL,INTA01		; LET INTERRUPTS PASS THRU TO
  3483                              <1> 	;;AND	AL,0FBH 		;  SECOND CHIP
  3484                              <1> 	;;;JMP	$+2
  3485                              <1> 	;;IODELAY
  3486                              <1> 	;;OUT	INTA01,AL
  3487                              <1> 	;
  3488                              <1> 	;STI
  3489                              <1> 	;;PUSH	DS			; MOVE ABS0 POINTER TO
  3490                              <1> 	;;POP	ES			; EXTRA SEGMENT POINTER
  3491                              <1> 	;;;CALL	DDS			; ESTABLISH DATA SEGMENT
  3492                              <1> 	;;MOV	byte [DISK_STATUS1],0 	; RESET THE STATUS INDICATOR
  3493                              <1> 	;;MOV	byte [HF_NUM],0		; ZERO NUMBER OF FIXED DISKS
  3494                              <1> 	;;MOV	byte [CONTROL_BYTE],0
  3495                              <1> 	;;MOV	byte [PORT_OFF],0	; ZERO CARD OFFSET
  3496                              <1> 	; 20/12/2014 - private code by Erdogan Tan
  3497                              <1> 		      ; (out of original PC-AT, PC-XT BIOS code)
  3498                              <1> 	;mov	si, hd0_type
  3499 000041BC BE[06FC0000]        <1> 	mov	esi, hd0_type
  3500                              <1> 	;mov	cx, 4
  3501 000041C1 B904000000          <1> 	mov	ecx, 4
  3502                              <1> hde_l:
  3503 000041C6 AC                  <1> 	lodsb
  3504 000041C7 3C80                <1> 	cmp	al, 80h			; 8?h = existing
  3505 000041C9 7206                <1> 	jb	short _L4
  3506 000041CB FE05[7C310100]      <1> 	inc	byte [HF_NUM]		; + 1 hard (fixed) disk drives
  3507                              <1> _L4: ; 26/02/2015
  3508 000041D1 E2F3                <1> 	loop	hde_l	
  3509                              <1> ;_L4:					; 0 <= [HF_NUM] =< 4
  3510                              <1> ;L4:
  3511                              <1> 	; 
  3512                              <1> 	;; 31/12/2014 - cancel controller diagnostics here
  3513                              <1> 	;;;mov 	cx, 3  ; 26/12/2014 (Award BIOS 1999)
  3514                              <1> 	;;mov 	cl, 3
  3515                              <1> 	;;
  3516                              <1> 	;;MOV	DL,80H			; CHECK THE CONTROLLER
  3517                              <1> ;;hdc_dl:
  3518                              <1> 	;;MOV	AH,14H			; USE CONTROLLER DIAGNOSTIC COMMAND
  3519                              <1> 	;;INT	13H			; CALL BIOS WITH DIAGNOSTIC COMMAND
  3520                              <1> 	;;;JC	short CTL_ERRX		; DISPLAY ERROR MESSAGE IF BAD RETURN
  3521                              <1> 	;;;jc	short POD_DONE ;22/12/2014
  3522                              <1> 	;;jnc	short hdc_reset0
  3523                              <1> 	;;loop	hdc_dl
  3524                              <1> 	;;; 27/12/2014
  3525                              <1> 	;;stc
  3526                              <1> 	;;retn
  3527                              <1> 	;
  3528                              <1> ;;hdc_reset0:
  3529                              <1> 	; 18/01/2015
  3530 000041D3 8A0D[7C310100]      <1> 	mov	cl, [HF_NUM]
  3531 000041D9 20C9                <1> 	and	cl, cl
  3532 000041DB 740E                <1> 	jz	short POD_DONE
  3533                              <1> 	;
  3534 000041DD B27F                <1> 	mov	dl, 7Fh
  3535                              <1> hdc_reset1:
  3536 000041DF FEC2                <1> 	inc	dl
  3537                              <1> 	;; 31/12/2015
  3538                              <1> 	;;push	dx
  3539                              <1> 	;;push	cx
  3540                              <1> 	;;push	ds
  3541                              <1> 	;;sub	ax, ax
  3542                              <1> 	;;mov	ds, ax
  3543                              <1> 	;;MOV	AX, [TIMER_LOW]		; GET START TIMER COUNTS
  3544                              <1> 	;;pop	ds
  3545                              <1> 	;;MOV	BX,AX
  3546                              <1> 	;;ADD	AX,6*182		; 60 SECONDS* 18.2
  3547                              <1> 	;;MOV	CX,AX
  3548                              <1> 	;;mov	word [wait_count], 0	; 22/12/2014 (reset wait counter)
  3549                              <1> 	;;
  3550                              <1> 	;; 31/12/2014 - cancel HD_RESET_1
  3551                              <1> 	;;CALL	HD_RESET_1		; SET UP DRIVE 0, (1,2,3)
  3552                              <1> 	;;pop	cx
  3553                              <1> 	;;pop	dx
  3554                              <1> 	;;
  3555                              <1> 	; 18/01/2015
  3556 000041E1 B40D                <1> 	mov	ah, 0Dh ; ALTERNATE RESET
  3557                              <1> 	;int	13h
  3558 000041E3 E8A4FFFFFF          <1> 	call	int13h
  3559 000041E8 E2F5                <1> 	loop	hdc_reset1
  3560 000041EA F8                  <1> 	clc 	; 29/05/2016
  3561                              <1> POD_DONE:
  3562 000041EB C3                  <1> 	RETn
  3563                              <1> 
  3564                              <1> ;;-----	POD_ERROR
  3565                              <1> 
  3566                              <1> ;;CTL_ERRX:
  3567                              <1> ;	;MOV	SI,OFFSET F1782 	; CONTROLLER ERROR
  3568                              <1> ;	;CALL	SET_FAIL		; DO NOT IPL FROM DISK
  3569                              <1> ;	;CALL	E_MSG			; DISPLAY ERROR AND SET (BP) ERROR FLAG
  3570                              <1> ;	;JMP	short POD_DONE
  3571                              <1> 
  3572                              <1> ;;HD_RESET_1:
  3573                              <1> ;;	;PUSH	BX			; SAVE TIMER LIMITS
  3574                              <1> ;;	;PUSH	CX
  3575                              <1> ;;RES_1: MOV	AH,09H			; SET DRIVE PARAMETERS
  3576                              <1> ;;	INT	13H
  3577                              <1> ;;	JC	short RES_2
  3578                              <1> ;;	MOV	AH,11H			; RECALIBRATE DRIVE
  3579                              <1> ;;	INT	13H
  3580                              <1> ;;	JNC	short RES_CK		; DRIVE OK
  3581                              <1> ;;RES_2: ;CALL	POD_TCHK		; CHECK TIME OUT
  3582                              <1> ;;	cmp	word [wait_count], 6*182 ; waiting time (in timer ticks)
  3583                              <1> ;;					; (30 seconds)		
  3584                              <1> ;;	;cmc
  3585                              <1> ;;	;JNC	short RES_1
  3586                              <1> ;;	jb	short RES_1
  3587                              <1> ;;;RES_FL: ;MOV	SI,OFFSET F1781 	; INDICATE DISK 1 FAILURE;
  3588                              <1> ;;	;TEST	DL,1
  3589                              <1> ;;	;JNZ	RES_E1
  3590                              <1> ;;	;MOV	SI,OFFSET F1780 	; INDICATE DISK 0 FAILURE
  3591                              <1> ;;	;CALL	SET_FAIL		; DO NOT TRY TO IPL DISK 0
  3592                              <1> ;;	;JMP	SHORT RES_E1
  3593                              <1> ;;RES_ER: ; 22/12/2014
  3594                              <1> ;;RES_OK:
  3595                              <1> ;;	;POP	CX			; RESTORE TIMER LIMITS
  3596                              <1> ;;	;POP	BX
  3597                              <1> ;;	RETn
  3598                              <1> ;;
  3599                              <1> ;;RES_RS: MOV	AH,00H			; RESET THE DRIVE
  3600                              <1> ;;	INT	13H
  3601                              <1> ;;RES_CK: MOV	AH,08H			; GET MAX CYLINDER,HEAD,SECTOR
  3602                              <1> ;;	MOV	BL,DL			; SAVE DRIVE CODE
  3603                              <1> ;;	INT	13H
  3604                              <1> ;;	JC	short RES_ER
  3605                              <1> ;;	MOV	[NEC_STATUS],CX 	; SAVE MAX CYLINDER, SECTOR
  3606                              <1> ;;	MOV	DL,BL			; RESTORE DRIVE CODE
  3607                              <1> ;;RES_3: MOV	AX,0401H		; VERIFY THE LAST SECTOR
  3608                              <1> ;;	INT	13H
  3609                              <1> ;;	JNC	short RES_OK		; VERIFY OK
  3610                              <1> ;;	CMP	AH,BAD_SECTOR		; OK ALSO IF JUST ID READ
  3611                              <1> ;;	JE	short RES_OK
  3612                              <1> ;;	CMP	AH,DATA_CORRECTED
  3613                              <1> ;;	JE	short RES_OK
  3614                              <1> ;;	CMP	AH,BAD_ECC
  3615                              <1> ;;	JE	short RES_OK
  3616                              <1> ;;	;CALL	POD_TCHK		; CHECK FOR TIME OUT
  3617                              <1> ;;	cmp	word [wait_count], 6*182 ; waiting time (in timer ticks)
  3618                              <1> ;;					; (60 seconds)		
  3619                              <1> ;;	cmc
  3620                              <1> ;;	JC	short RES_ER		; FAILED
  3621                              <1> ;;	MOV	CX,[NEC_STATUS] 	; GET SECTOR ADDRESS, AND CYLINDER
  3622                              <1> ;;	MOV	AL,CL			; SEPARATE OUT SECTOR NUMBER
  3623                              <1> ;;	AND	AL,3FH
  3624                              <1> ;;	DEC	AL			; TRY PREVIOUS ONE
  3625                              <1> ;;	JZ	short RES_RS		; WE'VE TRIED ALL SECTORS ON TRACK
  3626                              <1> ;;	AND	CL,0C0H 		; KEEP CYLINDER BITS
  3627                              <1> ;;	OR	CL,AL			; MERGE SECTOR WITH CYLINDER BITS
  3628                              <1> ;;	MOV	[NEC_STATUS],CX 	; SAVE CYLINDER, NEW SECTOR NUMBER
  3629                              <1> ;;	JMP	short RES_3		; TRY AGAIN
  3630                              <1> ;;;RES_ER: MOV	SI,OFFSET F1791 	; INDICATE DISK 1 ERROR
  3631                              <1> ;;	;TEST	DL,1
  3632                              <1> ;;	;JNZ	short RES_E1
  3633                              <1> ;;	;MOV	SI,OFFSET F1790 	; INDICATE DISK 0 ERROR
  3634                              <1> ;;;RES_E1:
  3635                              <1> ;;	;CALL	E_MSG			; DISPLAY ERROR AND SET (BP) ERROR FLAG
  3636                              <1> ;;;RES_OK:
  3637                              <1> ;;	;POP	CX			; RESTORE TIMER LIMITS
  3638                              <1> ;;	;POP	BX
  3639                              <1> ;;	;RETn
  3640                              <1> ;
  3641                              <1> ;;SET_FAIL:
  3642                              <1> ;	;MOV	AX,X*(CMOS_DIAG+NMI)	; GET CMOS ERROR BYTE
  3643                              <1> ;	;CALL	CMOS_READ
  3644                              <1> ;	;OR	AL,HF_FAIL		; SET DO NOT IPL FROM DISK FLAG
  3645                              <1> ;	;XCHG	AH,AL			; SAVE IT
  3646                              <1> ;	;CALL	CMOS_WRITE		; PUT IT OUT
  3647                              <1> ;	;RETn
  3648                              <1> ;
  3649                              <1> ;;POD_TCHK:				; CHECK FOR 30 SECOND TIME OUT
  3650                              <1> ;	;POP	AX			; SAVE RETURN
  3651                              <1> ;	;POP	CX			; GET TIME OUT LIMITS
  3652                              <1> ;	;POP	BX
  3653                              <1> ;	;PUSH	BX			; AND SAVE THEM AGAIN
  3654                              <1> ;	;PUSH	CX
  3655                              <1> ;	;PUSH	AX
  3656                              <1> ;	;push	ds
  3657                              <1> ;	;xor	ax, ax
  3658                              <1> ;	;mov	ds, ax			; RESTORE RETURN
  3659                              <1> ;	;MOV	AX, [TIMER_LOW]		; AX = CURRENT TIME
  3660                              <1> ;	;				; BX = START TIME
  3661                              <1> ;	;				; CX = END TIME
  3662                              <1> ;	;pop	ds
  3663                              <1> ;	;CMP	BX,CX
  3664                              <1> ;	;JB	short TCHK1		; START < END
  3665                              <1> ;	;CMP	BX,AX
  3666                              <1> ;	;JB	short TCHKG		; END < START < CURRENT
  3667                              <1> ;	;JMP	SHORT TCHK2		; END, CURRENT < START
  3668                              <1> ;;TCHK1: CMP	AX,BX
  3669                              <1> ;;	JB	short TCHKNG		; CURRENT < START < END
  3670                              <1> ;;TCHK2: CMP	AX,CX
  3671                              <1> ;;	JB	short TCHKG		; START < CURRENT < END
  3672                              <1> ;;					; OR CURRENT < END < START
  3673                              <1> ;;TCHKNG: STC				; CARRY SET INDICATES TIME OUT
  3674                              <1> ;;	RETn
  3675                              <1> ;;TCHKG: CLC				; INDICATE STILL TIME
  3676                              <1> ;;	RETn
  3677                              <1> ;;
  3678                              <1> ;;int_13h:
  3679                              <1> 
  3680                              <1> ;----------------------------------------
  3681                              <1> ;	FIXED DISK BIOS ENTRY POINT	:
  3682                              <1> ;----------------------------------------
  3683                              <1> 
  3684                              <1> ; 15/01/2017
  3685                              <1> ; 14/01/2017
  3686                              <1> ; 07/01/2017
  3687                              <1> ; 02/01/2017
  3688                              <1> ; 01/06/2016
  3689                              <1> ; 16/05/2016, 27/05/2016, 28/05/2016, 29/05/2016
  3690                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  3691                              <1> int33h:  ; DISK I/O
  3692                              <1> 	; 29/05/2016
  3693 000041EC 80642408FE          <1> 	and	byte [esp+8], 11111110b  ; clear carry bit of eflags register
  3694                              <1> 	; 16/05/2016
  3695 000041F1 1E                  <1> 	push	ds
  3696 000041F2 53                  <1> 	push	ebx ; user's buffer address (virtual)
  3697 000041F3 66BB1000            <1> 	mov	bx, KDATA ; System (Kernel's) data segment
  3698 000041F7 8EDB                <1> 	mov	ds, bx
  3699                              <1> 
  3700                              <1> 	;;15/01/2017
  3701                              <1> 	; 14/01/2017
  3702                              <1> 	; 02/01/2017
  3703                              <1> 	;;mov	byte [intflg], 33h	; disk io interrupt 
  3704                              <1> 	;pop	ebx
  3705                              <1> 	;mov	[user_buffer], ebx		
  3706                              <1> 
  3707 000041F9 8F05[703E0100]      <1> 	pop	dword [user_buffer] ; 01/06/2016
  3708                              <1> 
  3709 000041FF C605[A6370100]00    <1> 	mov	byte [scount], 0 ; sector count for transfer
  3710 00004206 80FC03              <1> 	cmp	ah, 03h ; chs write
  3711 00004209 7744                <1> 	ja	short int33h_2
  3712 0000420B 7407                <1> 	je	short int33h_0
  3713 0000420D 80FC02              <1> 	cmp	ah, 02h ; chs read
  3714 00004210 726A                <1> 	jb	short int33h_5
  3715 00004212 EB63                <1> 	jmp	short int33h_4
  3716                              <1> int33h_0:
  3717                              <1> 	; transfer user's buffer content to sector buffer
  3718 00004214 51                  <1> 	push	ecx
  3719 00004215 0FB6C8              <1> 	movzx	ecx, al
  3720                              <1> int33h_1:
  3721 00004218 56                  <1> 	push	esi
  3722 00004219 8B35[703E0100]      <1> 	mov	esi, [user_buffer]
  3723                              <1> 	; esi = user's buffer address (virtual, ebx)
  3724 0000421F 57                  <1> 	push	edi
  3725 00004220 06                  <1> 	push	es
  3726 00004221 50                  <1> 	push	eax
  3727 00004222 66B81000            <1> 	mov	ax, KDATA
  3728 00004226 8EC0                <1> 	mov	es, ax
  3729 00004228 BF00000700          <1> 	mov	edi, Cluster_Buffer
  3730 0000422D C1E109              <1> 	shl	ecx, 9 ; * 512
  3731 00004230 E88F9C0000          <1> 	call	transfer_from_user_buffer
  3732 00004235 58                  <1> 	pop	eax
  3733 00004236 07                  <1> 	pop	es
  3734 00004237 5F                  <1> 	pop	edi
  3735 00004238 5E                  <1> 	pop	esi
  3736 00004239 59                  <1> 	pop	ecx
  3737 0000423A 7340                <1> 	jnc	short int33h_5
  3738 0000423C 8B1D[703E0100]      <1> 	mov	ebx, [user_buffer] ; 01/06/2016
  3739 00004242 1F                  <1> 	pop	ds
  3740                              <1> 
  3741                              <1> 	;;15/01/2017
  3742                              <1> 	; 02/01/2017
  3743                              <1> 	;cli
  3744                              <1> 	;;mov	byte [ss:intflg], 0 ; 07/01/2017
  3745                              <1> 	;
  3746                              <1> 	; (*) 29/05/2016
  3747                              <1> 	; (*) retf 4 ; skip eflags on stack
  3748                              <1> 
  3749                              <1> 	; 29/05/2016 -set carry flag on stack-
  3750                              <1> 	; [esp] = EIP
  3751                              <1> 	; [esp+4] = CS
  3752                              <1> 	; [esp+8] = E-FLAGS
  3753 00004243 804C240801          <1> 	or	byte [esp+8], 1  ; set carry bit of eflags register
  3754                              <1> 	; [esp+12] = ESP (user)
  3755                              <1> 	; [esp+16] = SS (User)
  3756 00004248 B8FF000000          <1> 	mov	eax, 0FFh ; Unknown error !?
  3757                              <1> 	;iretd
  3758 0000424D EB79                <1> 	jmp	short int33h_7  ; 07/01/2017	
  3759                              <1> 
  3760                              <1> 	; (*) 29/05/2016 - 'ref 4' intruction causes to stack fault
  3761                              <1> 	; (OUTER-PRIVILEGE-LEVEL)
  3762                              <1> 	; INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986
  3763                              <1> 	; // RETF instruction:
  3764                              <1> 	;
  3765                              <1> 	; IF OperandMode=32 THEN
  3766                              <1>  	;    Load CS:EIP from stack;
  3767                              <1>  	;    Set CS RPL to CPL;
  3768                              <1>  	;    Increment eSP by 8 plus the immediate offset if it exists;
  3769                              <1>  	;    Load SS:eSP from stack;
  3770                              <1>  	; ELSE (* OperandMode=16 *)
  3771                              <1>  	;    Load CS:IP from stack;
  3772                              <1>  	;    Set CS RPL to CPL;
  3773                              <1>  	;    Increment eSP by 4 plus the immediate offset if it exists;
  3774                              <1> 	;    Load SS:eSP from stack;
  3775                              <1>  	; FI;
  3776                              <1> 	;
  3777                              <1> 	; //
  3778                              <1> 
  3779                              <1> int33h_2:
  3780 0000424F 80FC05              <1> 	cmp	ah, 05h ; format track
  3781 00004252 770A                <1> 	ja	short int33h_3
  3782 00004254 7226                <1> 	jb	short int33h_5
  3783 00004256 51                  <1> 	push	ecx
  3784 00004257 B901000000          <1> 	mov	ecx, 1
  3785 0000425C EBBA                <1> 	jmp	short int33h_1
  3786                              <1> int33h_3:
  3787 0000425E 80FC1C              <1> 	cmp	ah, 1Ch ; LBA write
  3788 00004261 7719                <1> 	ja	short int33h_5
  3789 00004263 74AF                <1> 	je	short int33h_0
  3790 00004265 80FC1B              <1> 	cmp	ah, 1Bh ; LBA read
  3791 00004268 740D                <1> 	je	short int33h_4
  3792 0000426A 80FC08              <1> 	cmp	ah, 08h ; get disk parameters
  3793 0000426D 750D                <1> 	jne	short int33h_5
  3794                              <1> 	; 01/06/2016
  3795 0000426F 8B1D[703E0100]      <1> 	mov	ebx, [user_buffer] ; user's buffer address
  3796 00004275 EB0A                <1> 	jmp	short int33h_6
  3797                              <1> int33h_4:
  3798 00004277 A2[A6370100]        <1> 	mov	byte [scount], al ; <= 128 sectors
  3799                              <1> int33h_5:
  3800 0000427C BB00000700          <1> 	mov	ebx, Cluster_Buffer ; max. 65536 bytes
  3801                              <1> 				    ; buf. addr: 70000h	
  3802                              <1> 	;mov	byte [ClusterBuffer_Valid], 0
  3803                              <1> int33h_6:
  3804 00004281 1F                  <1> 	pop	ds
  3805 00004282 9C                  <1> 	pushfd
  3806 00004283 0E                  <1> 	push 	cs
  3807 00004284 E84D000000          <1> 	call 	DISK_IO
  3808 00004289 2E8B1D[703E0100]    <1> 	mov	ebx, [CS:user_buffer] ; 01/06/2016
  3809 00004290 723D                <1> 	jc	short int33h_9
  3810                              <1> 	;
  3811 00004292 2E803D[A6370100]00  <1> 	cmp	byte [CS:scount], 0
  3812 0000429A 762C                <1> 	jna	short int33h_7
  3813                              <1> 	; transfer sector buffer content to user's buffer
  3814 0000429C 06                  <1> 	push	es
  3815 0000429D 1E                  <1> 	push	ds
  3816 0000429E 50                  <1> 	push	eax
  3817 0000429F 66B81000            <1> 	mov	ax, KDATA
  3818 000042A3 8ED8                <1> 	mov	ds, ax
  3819 000042A5 8EC0                <1> 	mov	es, ax
  3820 000042A7 51                  <1> 	push	ecx
  3821 000042A8 56                  <1> 	push	esi
  3822 000042A9 57                  <1> 	push	edi
  3823 000042AA 0FB60D[A6370100]    <1> 	movzx	ecx, byte [scount]
  3824 000042B1 C1E109              <1> 	shl	ecx, 9 ; * 512 bytes
  3825 000042B4 89DF                <1> 	mov	edi, ebx ; user's buffer address
  3826 000042B6 BE00000700          <1> 	mov	esi, Cluster_Buffer
  3827 000042BB E8BA9B0000          <1> 	call	transfer_to_user_buffer
  3828 000042C0 5F                  <1> 	pop	edi
  3829 000042C1 5E                  <1> 	pop	esi
  3830 000042C2 59                  <1> 	pop	ecx
  3831 000042C3 58                  <1> 	pop	eax
  3832 000042C4 1F                  <1> 	pop	ds
  3833 000042C5 07                  <1> 	pop	es
  3834 000042C6 7202                <1> 	jc	short int33h_8
  3835                              <1> int33h_7:
  3836 000042C8 FA                  <1> 	cli
  3837                              <1> 	;;15/01/2017
  3838                              <1> 	;;mov	byte [ss:intflg], 0 ; 07/01/2017
  3839                              <1> 	; cf = 0  ; use eflags which is in stack
  3840 000042C9 CF                  <1> 	iretd	
  3841                              <1> int33h_8:
  3842 000042CA B8FF000000          <1> 	mov	eax, 0FFh ; Unknown error !?
  3843                              <1> int33h_9:
  3844                              <1> 	; cf = 1
  3845                              <1> 
  3846                              <1> 	; (*) 29/05/2016	
  3847                              <1> 	; (*) retf 4 ; skip eflags on stack
  3848                              <1> 	; Note: This 'retf 4' was wrong, -it was causing
  3849                              <1> 	;       to stack errors in ring 3-
  3850                              <1> 	;	POP sequence of 'retf 4' is as
  3851                              <1> 	;       "eip, cs, eflags, esp, ss, +4 bytes" 
  3852                              <1>         ;       it is not as "eip, cs, +4 bytes, esp, ss" ! 
  3853                              <1> 
  3854                              <1> 	; 29/05/2016 -set carry flag on stack-
  3855 000042CF 804C240801          <1> 	or	byte [esp+8], 1  ; set carry bit of eflags register
  3856                              <1> 	;iretd
  3857 000042D4 EBF2                <1> 	jmp	short int33h_7 ; 07/01/2017
  3858                              <1> 
  3859                              <1> ; 29/05/2016
  3860                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
  3861                              <1> 
  3862                              <1> DISK_IO:
  3863 000042D6 80FA80              <1> 	CMP	DL,80H			; TEST FOR FIXED DISK DRIVE
  3864                              <1> 	;JAE	short A1		; YES, HANDLE HERE
  3865                              <1> 	;;;INT	40H			; DISKETTE HANDLER
  3866                              <1> 	;;call	int40h
  3867 000042D9 0F8222F0FFFF        <1> 	jb	DISKETTE_IO_1
  3868                              <1> ;RET_2:
  3869                              <1> 	;RETf	2			; BACK TO CALLER
  3870                              <1> ;	retf	4
  3871                              <1> A1:
  3872 000042DF FB                  <1> 	STI				; ENABLE INTERRUPTS
  3873                              <1> 	;; 04/01/2015
  3874                              <1> 	;;OR	AH,AH
  3875                              <1> 	;;JNZ	short A2
  3876                              <1> 	;;INT	40H			; RESET NEC WHEN AH=0
  3877                              <1> 	;;SUB	AH,AH
  3878 000042E0 80FA83              <1> 	CMP	DL,(80H + S_MAX_FILE - 1)
  3879                              <1> 	;JA	short RET_2
  3880 000042E3 7616                <1> 	jna	short _A0
  3881                              <1> 	; 29/05/2016
  3882 000042E5 1E                  <1> 	push	ds
  3883 000042E6 6650                <1> 	push	ax
  3884 000042E8 66B81000            <1> 	mov	ax, KDATA
  3885 000042EC 8ED8                <1> 	mov	ds, ax
  3886 000042EE 6658                <1> 	pop	ax
  3887 000042F0 B4AA                <1>         mov     ah, 0AAh        ; Hard disk drive not ready !
  3888                              <1> 				; (Programmer's guide to AMIBIOS, 1992)
  3889 000042F2 8825[7B310100]      <1> 	mov     byte [DISK_STATUS1], ah
  3890 000042F8 1F                  <1> 	pop	ds
  3891 000042F9 EB38                <1> 	jmp	short RET_2
  3892                              <1> _A0:
  3893                              <1> 	; 18/01/2015
  3894 000042FB 08E4                <1> 	or	ah,ah
  3895 000042FD 743A                <1> 	jz	short A4
  3896 000042FF 80FC0D              <1> 	cmp	ah, 0Dh	; Alternate reset
  3897 00004302 7504                <1> 	jne	short A2
  3898 00004304 28E4                <1> 	sub	ah,ah	; Reset
  3899 00004306 EB31                <1> 	jmp	short A4
  3900                              <1> A2:
  3901 00004308 80FC08              <1> 	CMP	AH,08H			; GET PARAMETERS IS A SPECIAL CASE
  3902                              <1> 	;JNZ	short A3
  3903                              <1>         ;JMP    GET_PARM_N
  3904 0000430B 0F8431030000        <1> 	je	GET_PARM_N
  3905 00004311 80FC15              <1> A3:	CMP	AH,15H			; READ DASD TYPE IS ALSO
  3906                              <1> 	;JNZ	short A4
  3907                              <1>         ;JMP    READ_DASD_TYPE
  3908 00004314 0F84DA020000        <1>         je      READ_DASD_TYPE
  3909                              <1> 	; 02/02/2015
  3910 0000431A 80FC1D              <1> 	cmp	ah, 1Dh			;(Temporary for Retro UNIX 386 v1)
  3911                              <1> 	; 12/01/2015
  3912 0000431D F5                  <1> 	cmc
  3913 0000431E 7319                <1> 	jnc	short A4
  3914                              <1> int33h_bad_cmd:
  3915                              <1> 	; 16/05/2016
  3916                              <1> 	; 30/01/2015
  3917                              <1> 	; 29/05/2016
  3918 00004320 1E                  <1> 	push	ds
  3919 00004321 6650                <1> 	push	ax
  3920 00004323 66B81000            <1> 	mov	ax, KDATA
  3921 00004327 8ED8                <1> 	mov	ds, ax
  3922 00004329 6658                <1> 	pop	ax
  3923 0000432B B401                <1> 	mov	ah, BAD_CMD
  3924 0000432D 8825[7B310100]      <1> 	mov     [DISK_STATUS1], ah ; BAD_CMD  ; COMMAND ERROR
  3925                              <1>         ;jmp	short RET_2
  3926                              <1> RET_2:
  3927                              <1> 	; (*) 29/05/2016
  3928                              <1> 	; (*) retf 4
  3929 00004333 804C240801          <1> 	or	byte [esp+8], 1 ; set carry bit of eflags register
  3930 00004338 CF                  <1> 	iretd
  3931                              <1> A4:					; SAVE REGISTERS DURING OPERATION
  3932 00004339 C8080000            <1> 	ENTER	8,0			; SAVE (BP) AND MAKE ROOM FOR @CMD_BLOCK
  3933 0000433D 53                  <1> 	PUSH	eBX			;  IN THE STACK, THE COMMAND BLOCK IS:
  3934 0000433E 51                  <1> 	PUSH	eCX			;   @CMD_BLOCK == BYTE PTR [BP]-8
  3935 0000433F 52                  <1> 	PUSH	eDX
  3936 00004340 1E                  <1> 	PUSH	DS
  3937 00004341 06                  <1> 	PUSH	ES
  3938 00004342 56                  <1> 	PUSH	eSI
  3939 00004343 57                  <1> 	PUSH	eDI
  3940                              <1> 	;;04/01/2015
  3941                              <1> 	;;OR	AH,AH			; CHECK FOR RESET
  3942                              <1> 	;;JNZ	short A5
  3943                              <1> 	;;MOV	DL,80H			; FORCE DRIVE 80 FOR RESET
  3944                              <1> ;;A5:	
  3945                              <1> 	;push	cs
  3946                              <1> 	;pop	ds
  3947                              <1> 	; 21/02/2015
  3948 00004344 6650                <1> 	push	ax
  3949 00004346 66B81000            <1> 	mov	ax, KDATA
  3950 0000434A 8ED8                <1> 	mov	ds, ax
  3951 0000434C 8EC0                <1> 	mov	es, ax	
  3952 0000434E 6658                <1> 	pop	ax
  3953 00004350 E88D000000          <1> 	CALL	DISK_IO_CONT		; PERFORM THE OPERATION
  3954                              <1> 	;;CALL	DDS			; ESTABLISH SEGMENT
  3955 00004355 8A25[7B310100]      <1> 	MOV	AH,[DISK_STATUS1]	; GET STATUS FROM OPERATION
  3956                              <1> 	;(*) CMP AH,1			; SET THE CARRY FLAG TO INDICATE
  3957                              <1> 	;(*) CMC			; SUCCESS OR FAILURE
  3958 0000435B 5F                  <1> 	POP	eDI			; RESTORE REGISTERS
  3959 0000435C 5E                  <1> 	POP	eSI
  3960 0000435D 07                  <1>         POP     ES
  3961 0000435E 1F                  <1>         POP     DS
  3962 0000435F 5A                  <1> 	POP	eDX
  3963 00004360 59                  <1> 	POP	eCX
  3964 00004361 5B                  <1> 	POP	eBX
  3965 00004362 C9                  <1> 	LEAVE				; ADJUST (SP) AND RESTORE (BP)
  3966                              <1> 	;RETf	2			; THROW AWAY SAVED FLAGS
  3967                              <1> 	; (*) 29/05/2016
  3968                              <1> 	; (*) retf 4
  3969 00004363 80FC01              <1> 	cmp	ah, 1
  3970 00004366 7205                <1> 	jc	short _A5 
  3971 00004368 804C240801          <1> 	or	byte [esp+8], 1 ; set carry bit of eflags register
  3972                              <1> _A5:
  3973 0000436D CF                  <1> 	iretd
  3974                              <1> 
  3975                              <1> ; 21/02/2015
  3976                              <1> ;       dw --> dd
  3977                              <1> D1:					; FUNCTION TRANSFER TABLE
  3978 0000436E [30450000]          <1> 	dd	DISK_RESET		; 000H
  3979 00004372 [A7450000]          <1> 	dd	RETURN_STATUS		; 001H
  3980 00004376 [B4450000]          <1> 	dd	DISK_READ		; 002H
  3981 0000437A [BD450000]          <1> 	dd	DISK_WRITE		; 003H
  3982 0000437E [C6450000]          <1> 	dd	DISK_VERF		; 004H
  3983 00004382 [DE450000]          <1> 	dd	FMT_TRK 		; 005H
  3984 00004386 [26450000]          <1> 	dd	BAD_COMMAND		; 006H	FORMAT BAD SECTORS
  3985 0000438A [26450000]          <1> 	dd	BAD_COMMAND		; 007H	FORMAT DRIVE
  3986 0000438E [26450000]          <1> 	dd	BAD_COMMAND		; 008H	RETURN PARAMETERS
  3987 00004392 [C9460000]          <1> 	dd	INIT_DRV		; 009H
  3988 00004396 [28470000]          <1> 	dd	RD_LONG 		; 00AH
  3989 0000439A [31470000]          <1> 	dd	WR_LONG 		; 00BH
  3990 0000439E [3A470000]          <1> 	dd	DISK_SEEK		; 00CH
  3991 000043A2 [30450000]          <1> 	dd	DISK_RESET		; 00DH
  3992 000043A6 [26450000]          <1> 	dd	BAD_COMMAND		; 00EH	READ BUFFER
  3993 000043AA [26450000]          <1> 	dd	BAD_COMMAND		; 00FH	WRITE BUFFER
  3994 000043AE [62470000]          <1> 	dd	TST_RDY 		; 010H
  3995 000043B2 [86470000]          <1> 	dd	HDISK_RECAL		; 011H
  3996 000043B6 [26450000]          <1> 	dd	BAD_COMMAND		; 012H	MEMORY DIAGNOSTIC
  3997 000043BA [26450000]          <1> 	dd	BAD_COMMAND		; 013H	DRIVE DIAGNOSTIC
  3998 000043BE [BC470000]          <1> 	dd	CTLR_DIAGNOSTIC 	; 014H	CONTROLLER DIAGNOSTIC
  3999                              <1> 	; 02/02/2015 (Temporary - Retro UNIX 386 v1 - DISK I/O test)
  4000 000043C2 [26450000]          <1> 	dd	BAD_COMMAND		; 015h
  4001 000043C6 [26450000]          <1> 	dd	BAD_COMMAND		; 016h
  4002 000043CA [26450000]          <1> 	dd	BAD_COMMAND		; 017h
  4003 000043CE [26450000]          <1> 	dd	BAD_COMMAND		; 018h
  4004 000043D2 [26450000]          <1> 	dd	BAD_COMMAND		; 019h
  4005 000043D6 [26450000]          <1> 	dd	BAD_COMMAND		; 01Ah
  4006 000043DA [B4450000]          <1> 	dd	DISK_READ		; 01Bh ; LBA read
  4007 000043DE [BD450000]          <1> 	dd	DISK_WRITE		; 01Ch ; LBA write
  4008                              <1> D1L     EQU    $ - D1
  4009                              <1> 
  4010                              <1> DISK_IO_CONT:
  4011                              <1> 	;;CALL	DDS			; ESTABLISH SEGMENT
  4012 000043E2 80FC01              <1> 	CMP	AH,01H			; RETURN STATUS
  4013                              <1> 	;;JNZ	short SU0
  4014                              <1>         ;;JMP    RETURN_STATUS
  4015 000043E5 0F84BC010000        <1> 	je	RETURN_STATUS
  4016                              <1> SU0:
  4017 000043EB C605[7B310100]00    <1> 	MOV	byte [DISK_STATUS1],0 	; RESET THE STATUS INDICATOR
  4018                              <1> 	;;PUSH	BX			; SAVE DATA ADDRESS
  4019                              <1> 	;mov	si, bx ;; 14/02/2015
  4020 000043F2 89DE                <1> 	mov	esi, ebx ; 21/02/2015
  4021 000043F4 8A1D[7C310100]      <1> 	MOV	BL,[HF_NUM]		; GET NUMBER OF DRIVES
  4022                              <1> 	;; 04/01/2015
  4023                              <1> 	;;PUSH	AX
  4024 000043FA 80E27F              <1> 	AND	DL,7FH			; GET DRIVE AS 0 OR 1
  4025                              <1> 					; (get drive number as 0 to 3)
  4026 000043FD 38D3                <1> 	CMP	BL,DL
  4027                              <1>         ;;JBE   BAD_COMMAND_POP         ; INVALID DRIVE
  4028 000043FF 0F8621010000        <1>         jbe     BAD_COMMAND ;; 14/02/2015
  4029                              <1>         ;
  4030                              <1> 	;;03/01/2015
  4031 00004405 29DB                <1> 	sub	ebx, ebx
  4032 00004407 88D3                <1> 	mov	bl, dl
  4033                              <1> 	;sub	bh, bh
  4034 00004409 883D[90310100]      <1> 	mov	[LBAMode], bh 	; 0
  4035                              <1> 	;;test	byte [bx+hd0_type], 1	; LBA ready ?
  4036                              <1> 	;test	byte [ebx+hd0_type], 1
  4037                              <1> 	;jz	short su1		; no
  4038                              <1> 	;inc	byte [LBAMode]
  4039                              <1> ;su1:
  4040                              <1> 	; 21/02/2015 (32 bit modification)
  4041                              <1> 	;04/01/2015
  4042 0000440F 6650                <1> 	push	ax ; ***
  4043                              <1> 	;PUSH	ES ; **
  4044 00004411 6652                <1> 	PUSH	DX ; *
  4045 00004413 6650                <1> 	push	ax
  4046 00004415 E888060000          <1> 	CALL	GET_VEC 		; GET DISK PARAMETERS
  4047                              <1> 	; 02/02/2015
  4048                              <1> 	;mov	ax, [ES:BX+16] ; I/O port base address (1F0h, 170h)
  4049 0000441A 668B4310            <1> 	mov	ax, [ebx+16]
  4050 0000441E 66A3[F6FB0000]      <1> 	mov	[HF_PORT], ax
  4051                              <1> 	;mov	dx, [ES:BX+18] ; control port address (3F6h, 376h)
  4052 00004424 668B5312            <1> 	mov	dx, [ebx+18]
  4053 00004428 668915[F8FB0000]    <1> 	mov	[HF_REG_PORT], dx
  4054                              <1> 	;mov	al, [ES:BX+20] ; head register upper nibble (A0h,B0h,E0h,F0h)
  4055 0000442F 8A4314              <1> 	mov	al, [ebx+20]
  4056                              <1> 	; 23/02/2015
  4057 00004432 A840                <1> 	test	al, 40h	 ; LBA bit (bit 6)
  4058 00004434 7406                <1> 	jz 	short su1
  4059 00004436 FE05[90310100]      <1> 	inc	byte [LBAMode] ; 1 
  4060                              <1> su1: 	 
  4061 0000443C C0E804              <1> 	shr 	al, 4
  4062 0000443F 2401                <1> 	and	al, 1			
  4063 00004441 A2[FAFB0000]        <1> 	mov	[hf_m_s], al 
  4064                              <1> 	;
  4065                              <1> 	; 03/01/2015
  4066                              <1> 	;MOV	AL,byte [ES:BX+8]	; GET CONTROL BYTE MODIFIER
  4067 00004446 8A4308              <1> 	mov	al, [ebx+8]
  4068                              <1> 	;MOV	DX,[HF_REG_PORT]	; Device Control register	
  4069 00004449 EE                  <1> 	OUT	DX,AL			; SET EXTRA HEAD OPTION
  4070                              <1> 					; Control Byte:  (= 08h, here)
  4071                              <1> 					; bit 0 - 0
  4072                              <1> 					; bit 1 - nIEN (1 = disable irq)
  4073                              <1> 					; bit 2 - SRST (software RESET)
  4074                              <1> 					; bit 3 - use extra heads (8 to 15)
  4075                              <1> 					;         -always set to 1-	
  4076                              <1> 					; (bits 3 to 7 are reserved
  4077                              <1> 					;          for ATA devices)
  4078 0000444A 8A25[7D310100]      <1> 	MOV	AH,[CONTROL_BYTE]	; SET EXTRA HEAD OPTION IN
  4079 00004450 80E4C0              <1> 	AND	AH,0C0H 		; CONTROL BYTE
  4080 00004453 08C4                <1> 	OR	AH,AL
  4081 00004455 8825[7D310100]      <1> 	MOV	[CONTROL_BYTE],AH	
  4082                              <1> 	; 04/01/2015
  4083 0000445B 6658                <1> 	pop	ax
  4084 0000445D 665A                <1> 	pop	dx ; * ;; 14/02/2015
  4085 0000445F 20E4                <1> 	and	ah, ah	; Reset function ?
  4086 00004461 7507                <1> 	jnz	short su2
  4087                              <1> 	;;pop	dx ; * ;; 14/02/2015
  4088                              <1> 	;pop	es ; **
  4089 00004463 6658                <1> 	pop	ax ; ***
  4090                              <1> 	;;pop	bx
  4091 00004465 E9C6000000          <1>         jmp     DISK_RESET
  4092                              <1> su2:
  4093 0000446A 803D[90310100]00    <1> 	cmp	byte [LBAMode], 0
  4094 00004471 7661                <1> 	jna	short su3
  4095                              <1> 	;
  4096                              <1> 	; 02/02/2015 (LBA read/write function calls)
  4097 00004473 80FC1B              <1> 	cmp	ah, 1Bh
  4098 00004476 720B                <1> 	jb	short lbarw1
  4099 00004478 80FC1C              <1> 	cmp	ah, 1Ch
  4100 0000447B 775C                <1> 	ja 	short invldfnc
  4101                              <1> 	;;pop	dx ; * ; 14/02/2015
  4102                              <1> 	;mov	ax, cx ; Lower word of LBA address (bits 0-15)
  4103 0000447D 89C8                <1> 	mov	eax, ecx ; LBA address (21/02/2015)
  4104                              <1> 	;; 14/02/2015
  4105 0000447F 88D1                <1> 	mov	cl, dl ; 14/02/2015
  4106                              <1> 	;;mov	dx, bx
  4107                              <1> 	;mov	dx, si ; higher word of LBA address (bits 16-23)
  4108                              <1> 	;;mov	bx, di
  4109                              <1> 	;mov	si, di ; Buffer offset
  4110 00004481 EB31                <1> 	jmp	short lbarw2
  4111                              <1> lbarw1:
  4112                              <1> 	; convert CHS to LBA
  4113                              <1> 	;
  4114                              <1> 	; LBA calculation - AWARD BIOS - 1999 - AHDSK.ASM
  4115                              <1> 	; LBA = "# of Heads" * Sectors/Track * Cylinder + Head * Sectors/Track
  4116                              <1> 	;	+ Sector - 1
  4117 00004483 6652                <1> 	push	dx ; * ;; 14/02/2015
  4118                              <1> 	;xor	dh, dh
  4119 00004485 31D2                <1> 	xor	edx, edx
  4120                              <1> 	;mov	dl, [ES:BX+14]	; sectors per track (logical)
  4121 00004487 8A530E              <1> 	mov	dl, [ebx+14]
  4122                              <1> 	;xor	ah, ah
  4123 0000448A 31C0                <1> 	xor	eax, eax
  4124                              <1> 	;mov	al, [ES:BX+2]	; heads (logical) 	
  4125 0000448C 8A4302              <1> 	mov	al, [ebx+2]
  4126 0000448F FEC8                <1> 	dec	al
  4127 00004491 6640                <1> 	inc	ax		; 0 =  256
  4128 00004493 66F7E2              <1> 	mul 	dx
  4129                              <1> 		; AX = # of Heads" * Sectors/Track
  4130 00004496 6689CA              <1> 	mov	dx, cx
  4131                              <1> 	;and	cx, 3Fh	 ; sector  (1 to 63)
  4132 00004499 83E13F              <1> 	and	ecx, 3fh
  4133 0000449C 86D6                <1> 	xchg	dl, dh
  4134 0000449E C0EE06              <1> 	shr	dh, 6
  4135                              <1> 		; DX = cylinder (0 to 1023)
  4136                              <1> 	;mul 	dx
  4137                              <1> 		; DX:AX = # of Heads" * Sectors/Track * Cylinder
  4138 000044A1 F7E2                <1> 	mul	edx
  4139 000044A3 FEC9                <1> 	dec	cl  ; sector - 1
  4140                              <1> 	;add	ax, cx
  4141                              <1> 	;adc	dx, 0
  4142                              <1> 		; DX:AX = # of Heads" * Sectors/Track * Cylinder + Sector -1
  4143 000044A5 01C8                <1> 	add	eax, ecx
  4144 000044A7 6659                <1> 	pop	cx ; * ; ch = head, cl = drive number (zero based)
  4145                              <1> 	;push	dx
  4146                              <1> 	;push	ax
  4147 000044A9 50                  <1> 	push	eax
  4148                              <1> 	;mov	al, [ES:BX+14]	; sectors per track (logical)	
  4149 000044AA 8A430E              <1> 	mov	al, [ebx+14]
  4150 000044AD F6E5                <1> 	mul	ch
  4151                              <1> 		;  AX = Head * Sectors/Track
  4152 000044AF 6699                <1>         cwd
  4153                              <1> 	;pop	dx
  4154 000044B1 5A                  <1> 	pop	edx
  4155                              <1> 	;add	ax, dx
  4156                              <1> 	;pop	dx
  4157                              <1> 	;adc	dx, 0 ; add carry bit
  4158 000044B2 01D0                <1> 	add	eax, edx
  4159                              <1> lbarw2:
  4160 000044B4 29D2                <1> 	sub	edx, edx ; 21/02/2015
  4161 000044B6 88CA                <1> 	mov	dl, cl ; 21/02/2015
  4162 000044B8 C645F800            <1>         mov     byte [CMD_BLOCK], 0 ; Features Register
  4163                              <1> 				; NOTE: Features register (1F1h, 171h)
  4164                              <1> 				; is not used for ATA device R/W functions. 
  4165                              <1> 				; It is old/obsolete 'write precompensation'
  4166                              <1> 				; register and error register
  4167                              <1> 				; for old ATA/IDE devices.
  4168                              <1> 	; 18/01/2014
  4169                              <1> 	;mov	ch, [hf_m_s]	; Drive 0 (master) or 1 (slave)
  4170 000044BC 8A0D[FAFB0000]      <1> 	mov	cl, [hf_m_s]
  4171                              <1> 	;shl	ch, 4		; bit 4 (drive bit)
  4172                              <1> 	;or	ch, 0E0h	; bit 5 = 1
  4173                              <1> 				; bit 6 = 1 = LBA mode
  4174                              <1> 				; bit 7 = 1
  4175 000044C2 80C90E              <1> 	or	cl, 0Eh ; 1110b
  4176                              <1> 	;and	dh, 0Fh		; LBA byte 4 (bits 24 to 27)
  4177 000044C5 25FFFFFF0F          <1> 	and	eax, 0FFFFFFFh
  4178 000044CA C1E11C              <1> 	shl	ecx, 28 ; 21/02/2015
  4179                              <1> 	;or	dh, ch
  4180 000044CD 09C8                <1> 	or	eax, ecx	
  4181                              <1> 	;;mov	[CMD_BLOCK+2], al ; LBA byte 1 (bits 0 to 7)
  4182                              <1> 				  ; (Sector Number Register)
  4183                              <1> 	;;mov	[CMD_BLOCK+3], ah ; LBA byte 2 (bits 8 to 15)
  4184                              <1> 				  ; (Cylinder Low Register)
  4185                              <1> 	;mov	[CMD_BLOCK+2], ax ; LBA byte 1, 2
  4186                              <1> 	;mov	[CMD_BLOCK+4], dl ; LBA byte 3 (bits 16 to 23)
  4187                              <1> 				  ; (Cylinder High Register)
  4188                              <1> 	;;mov	[CMD_BLOCK+5], dh ; LBA byte 4 (bits 24 to 27)
  4189                              <1> 				  ; (Drive/Head Register)
  4190                              <1> 	
  4191                              <1> 	;mov	[CMD_BLOCK+4], dx ; LBA byte 4, LBA & DEV select bits
  4192 000044CF 8945FA              <1> 	mov	[CMD_BLOCK+2], eax ; 21/02/2015
  4193                              <1> 	;14/02/2015
  4194                              <1> 	;mov	dl, cl ; Drive number (INIT_DRV)		
  4195 000044D2 EB38                <1> 	jmp	short su4
  4196                              <1> su3:
  4197                              <1> 	; 02/02/2015 
  4198                              <1> 	; (Temporary functions 1Bh & 1Ch are not valid for CHS mode) 
  4199 000044D4 80FC14              <1> 	cmp 	ah, 14h
  4200 000044D7 7604                <1> 	jna 	short chsfnc
  4201                              <1> invldfnc:
  4202                              <1>         ; 14/02/2015  
  4203                              <1> 	;pop	es ; **
  4204 000044D9 6658                <1>         pop     ax ; ***
  4205                              <1>         ;jmp     short BAD_COMMAND_POP
  4206 000044DB EB49                <1>         jmp     short BAD_COMMAND
  4207                              <1> chsfnc:	
  4208                              <1> 	;MOV	AX,[ES:BX+5]		; GET WRITE PRE-COMPENSATION CYLINDER
  4209 000044DD 668B4305            <1> 	mov	ax, [ebx+5]
  4210 000044E1 66C1E802            <1> 	SHR	AX,2
  4211 000044E5 8845F8              <1> 	MOV	[CMD_BLOCK],AL
  4212                              <1> 	;;MOV	AL,[ES:BX+8]		; GET CONTROL BYTE MODIFIER
  4213                              <1> 	;;PUSH	DX
  4214                              <1> 	;;MOV	DX,[HF_REG_PORT]
  4215                              <1> 	;;OUT	DX,AL			; SET EXTRA HEAD OPTION
  4216                              <1> 	;;POP	DX ; * 
  4217                              <1> 	;;POP	ES ; **
  4218                              <1> 	;;MOV	AH,[CONTROL_BYTE]	; SET EXTRA HEAD OPTION IN
  4219                              <1> 	;;AND	AH,0C0H 		; CONTROL BYTE	
  4220                              <1> 	;;OR	AH,AL
  4221                              <1> 	;;MOV	[CONTROL_BYTE],AH
  4222                              <1> 	;
  4223 000044E8 88C8                <1> 	MOV	AL,CL			; GET SECTOR NUMBER
  4224 000044EA 243F                <1> 	AND	AL,3FH
  4225 000044EC 8845FA              <1> 	MOV	[CMD_BLOCK+2],AL
  4226 000044EF 886DFB              <1> 	MOV	[CMD_BLOCK+3],CH 	; GET CYLINDER NUMBER
  4227 000044F2 88C8                <1> 	MOV	AL,CL
  4228 000044F4 C0E806              <1> 	SHR	AL,6
  4229 000044F7 8845FC              <1> 	MOV	[CMD_BLOCK+4],AL 	; CYLINDER HIGH ORDER 2 BITS
  4230                              <1> 	;;05/01/2015
  4231                              <1> 	;;MOV	AL,DL			; DRIVE NUMBER
  4232 000044FA A0[FAFB0000]        <1> 	mov	al, [hf_m_s]
  4233 000044FF C0E004              <1> 	SHL	AL,4
  4234 00004502 80E60F              <1> 	AND	DH,0FH			; HEAD NUMBER
  4235 00004505 08F0                <1> 	OR	AL,DH
  4236                              <1> 	;OR	AL,80H or 20H
  4237 00004507 0CA0                <1> 	OR	AL,80h+20h		; ECC AND 512 BYTE SECTORS
  4238 00004509 8845FD              <1> 	MOV	[CMD_BLOCK+5],AL 	; ECC/SIZE/DRIVE/HEAD
  4239                              <1> su4:
  4240                              <1> 	;POP	ES ; **
  4241                              <1>         ;; 14/02/2015
  4242                              <1>         ;;POP   AX
  4243                              <1>         ;;MOV   [CMD_BLOCK+1],AL        ; SECTOR COUNT
  4244                              <1>         ;;PUSH  AX
  4245                              <1>         ;;MOV   AL,AH                   ; GET INTO LOW BYTE
  4246                              <1>         ;;XOR   AH,AH                   ; ZERO HIGH BYTE
  4247                              <1>         ;;SAL   AX,1                    ; *2 FOR TABLE LOOKUP
  4248 0000450C 6658                <1>         pop     ax ; ***
  4249 0000450E 8845F9              <1>         mov     [CMD_BLOCK+1], al
  4250 00004511 29DB                <1>         sub	ebx, ebx
  4251 00004513 88E3                <1> 	mov     bl, ah
  4252                              <1>         ;xor     bh, bh
  4253                              <1>         ;sal     bx, 1
  4254 00004515 66C1E302            <1>         sal	bx, 2	; 32 bit offset (21/02/2015)
  4255                              <1> 	;;MOV   SI,AX                   ; PUT INTO SI FOR BRANCH
  4256                              <1>         ;;CMP   AX,D1L                  ; TEST WITHIN RANGE
  4257                              <1>         ;;JNB   short BAD_COMMAND_POP
  4258                              <1>         ;cmp     bx, D1L
  4259 00004519 83FB74              <1> 	cmp	ebx, D1L
  4260 0000451C 7308                <1> 	jnb	short BAD_COMMAND
  4261                              <1>         ;xchg    bx, si
  4262 0000451E 87DE                <1>         xchg	ebx, esi
  4263                              <1> 	;;;POP	AX			; RESTORE AX
  4264                              <1> 	;;;POP	BX			; AND DATA ADDRESS
  4265                              <1> 	
  4266                              <1> 	;;PUSH	CX
  4267                              <1> 	;;PUSH	AX			; ADJUST ES:BX
  4268                              <1> 	;MOV	CX,BX			; GET 3 HIGH ORDER NIBBLES OF BX
  4269                              <1> 	;SHR	CX,4
  4270                              <1> 	;MOV	AX,ES
  4271                              <1> 	;ADD	AX,CX
  4272                              <1> 	;MOV	ES,AX
  4273                              <1> 	;AND	BX,000FH		; ES:BX CHANGED TO ES:000X
  4274                              <1> 	;;POP	AX
  4275                              <1> 	;;POP	CX
  4276                              <1> 	;;JMP	word [CS:SI+D1]
  4277                              <1> 	;jmp	word [SI+D1]
  4278 00004520 FFA6[6E430000]      <1> 	jmp	dword [esi+D1]
  4279                              <1> ;;BAD_COMMAND_POP:
  4280                              <1> ;;	POP	AX
  4281                              <1> ;;	POP	BX
  4282                              <1> BAD_COMMAND:
  4283 00004526 C605[7B310100]01    <1>         MOV     byte [DISK_STATUS1],BAD_CMD  ; COMMAND ERROR
  4284 0000452D B000                <1> 	MOV	AL,0
  4285 0000452F C3                  <1> 	RETn
  4286                              <1> 
  4287                              <1> ;----------------------------------------
  4288                              <1> ;	RESET THE DISK SYSTEM  (AH=00H) :
  4289                              <1> ;----------------------------------------
  4290                              <1> 
  4291                              <1> ; 18-1-2015 : one controller reset (not other one)
  4292                              <1> 
  4293                              <1> DISK_RESET:
  4294 00004530 FA                  <1> 	CLI
  4295 00004531 E4A1                <1> 	IN	AL,INTB01		; GET THE MASK REGISTER
  4296                              <1> 	;JMP	$+2
  4297                              <1> 	IODELAY
  4297 00004533 EB00                <2>  jmp short $+2
  4297 00004535 EB00                <2>  jmp short $+2
  4298                              <1> 	;AND	AL,0BFH 		; ENABLE FIXED DISK INTERRUPT
  4299 00004537 243F                <1> 	and	al,3Fh			; 22/12/2014 (IRQ 14 & IRQ 15)
  4300 00004539 E6A1                <1> 	OUT	INTB01,AL
  4301 0000453B FB                  <1> 	STI				; START INTERRUPTS
  4302                              <1> 	; 14/02/2015
  4303 0000453C 6689D7              <1> 	mov	di, dx	
  4304                              <1> 	; 04/01/2015
  4305                              <1> 	;xor	di,di
  4306                              <1> drst0:
  4307 0000453F B004                <1> 	MOV	AL,04H  ; bit 2 - SRST 
  4308                              <1> 	;MOV	DX,HF_REG_PORT
  4309 00004541 668B15[F8FB0000]    <1> 	MOV	DX,[HF_REG_PORT]
  4310 00004548 EE                  <1> 	OUT	DX,AL			; RESET
  4311                              <1> ;	MOV	CX,10			; DELAY COUNT
  4312                              <1> ;DRD:	DEC	CX
  4313                              <1> ;	JNZ	short DRD		; WAIT 4.8 MICRO-SEC
  4314                              <1> 	;mov	cx,2			; wait for 30 micro seconds	
  4315 00004549 B902000000          <1>         mov	ecx, 2 ; 21/02/2015
  4316 0000454E E820D8FFFF          <1> 	call    WAITF                   ; (Award Bios 1999 - WAIT_REFRESH,
  4317                              <1>                                         ; 40 micro seconds)
  4318 00004553 A0[7D310100]        <1> 	mov	al,[CONTROL_BYTE]
  4319 00004558 240F                <1> 	AND	AL,0FH			; SET HEAD OPTION
  4320 0000455A EE                  <1> 	OUT	DX,AL			; TURN RESET OFF
  4321 0000455B E838040000          <1> 	CALL	NOT_BUSY
  4322 00004560 7515                <1> 	JNZ	short DRERR		; TIME OUT ON RESET
  4323 00004562 668B15[F6FB0000]    <1> 	MOV	DX,[HF_PORT]
  4324 00004569 FEC2                <1> 	inc	dl  ; HF_PORT+1
  4325                              <1> 	; 02/01/2015 - Award BIOS 1999 - AHDSK.ASM
  4326                              <1>         ;mov     cl, 10
  4327 0000456B B90A000000          <1>         mov     ecx, 10 ; 21/02/2015 
  4328                              <1> drst1:
  4329 00004570 EC                  <1> 	IN	AL,DX			; GET RESET STATUS
  4330 00004571 3C01                <1> 	CMP	AL,1
  4331                              <1> 	; 04/01/2015
  4332 00004573 740A                <1> 	jz	short drst2
  4333                              <1> 	;JNZ	short DRERR		; BAD RESET STATUS
  4334                              <1>         	; Drive/Head Register - bit 4
  4335 00004575 E2F9                <1> 	loop	drst1
  4336                              <1> DRERR:	
  4337 00004577 C605[7B310100]05    <1> 	MOV	byte [DISK_STATUS1],BAD_RESET ; CARD FAILED
  4338 0000457E C3                  <1> 	RETn
  4339                              <1> drst2:
  4340                              <1> 	; 14/02/2015
  4341 0000457F 6689FA              <1> 	mov	dx,di
  4342                              <1> ;drst3:
  4343                              <1> ;	; 05/01/2015
  4344                              <1> ;	shl 	di,1
  4345                              <1> ;	; 04/01/2015
  4346                              <1> ;	mov	ax,[di+hd_cports]
  4347                              <1> ;	cmp	ax,[HF_REG_PORT]
  4348                              <1> ;	je	short drst4
  4349                              <1> ;	mov	[HF_REG_PORT], ax
  4350                              <1> ;	; 03/01/2015
  4351                              <1> ;	mov	ax,[di+hd_ports]
  4352                              <1> ;       mov     [HF_PORT], ax
  4353                              <1> ;	; 05/01/2014
  4354                              <1> ;	shr	di,1
  4355                              <1> ;	; 04/01/2015
  4356                              <1> ;	jmp	short drst0	; reset other controller
  4357                              <1> ;drst4:
  4358                              <1> ;	; 05/01/2015
  4359                              <1> ;	shr	di,1
  4360                              <1> ;	mov	al,[di+hd_dregs]
  4361                              <1> ;	and	al,10h ; bit 4 only
  4362                              <1> ;	shr	al,4 ; bit 4  -> bit 0
  4363                              <1> ;	mov	[hf_m_s], al ; (0 = master, 1 = slave)
  4364                              <1> 	;
  4365 00004582 A0[FAFB0000]        <1> 	mov	al, [hf_m_s] ; 18/01/2015
  4366 00004587 A801                <1> 	test	al,1
  4367                              <1> ;	jnz	short drst6
  4368 00004589 7516                <1>         jnz     short drst4
  4369 0000458B 8065FDEF            <1> 	AND     byte [CMD_BLOCK+5],0EFH ; SET TO DRIVE 0
  4370                              <1> ;drst5:
  4371                              <1> drst3:
  4372 0000458F E835010000          <1> 	CALL	INIT_DRV		; SET MAX HEADS
  4373                              <1> 	;mov	dx,di
  4374 00004594 E8ED010000          <1> 	CALL	HDISK_RECAL		; RECAL TO RESET SEEK SPEED
  4375                              <1> 	; 04/01/2014
  4376                              <1> ;	inc	di
  4377                              <1> ;	mov	dx,di
  4378                              <1> ;	cmp	dl,[HF_NUM]
  4379                              <1> ;	jb	short drst3
  4380                              <1> ;DRE:
  4381 00004599 C605[7B310100]00    <1> 	MOV	byte [DISK_STATUS1],0 	; IGNORE ANY SET UP ERRORS
  4382 000045A0 C3                  <1> 	RETn
  4383                              <1> ;drst6:
  4384                              <1> drst4:		; Drive/Head Register - bit 4
  4385 000045A1 804DFD10            <1> 	OR      byte [CMD_BLOCK+5],010H ; SET TO DRIVE 1     
  4386                              <1>         ;jmp    short drst5
  4387 000045A5 EBE8                <1>         jmp     short drst3
  4388                              <1> 
  4389                              <1> ;----------------------------------------
  4390                              <1> ;	DISK STATUS ROUTINE  (AH = 01H) :
  4391                              <1> ;----------------------------------------
  4392                              <1> 
  4393                              <1> RETURN_STATUS:
  4394 000045A7 A0[7B310100]        <1> 	MOV	AL,[DISK_STATUS1]	; OBTAIN PREVIOUS STATUS
  4395 000045AC C605[7B310100]00    <1>         MOV     byte [DISK_STATUS1],0   ; RESET STATUS
  4396 000045B3 C3                  <1> 	RETn
  4397                              <1> 
  4398                              <1> ;----------------------------------------
  4399                              <1> ;	DISK READ ROUTINE    (AH = 02H) :
  4400                              <1> ;----------------------------------------
  4401                              <1> 
  4402                              <1> DISK_READ:
  4403 000045B4 C645FE20            <1> 	MOV	byte [CMD_BLOCK+6],READ_CMD
  4404 000045B8 E954020000          <1>         JMP     COMMANDI
  4405                              <1> 
  4406                              <1> ;----------------------------------------
  4407                              <1> ;	DISK WRITE ROUTINE   (AH = 03H) :
  4408                              <1> ;----------------------------------------
  4409                              <1> 
  4410                              <1> DISK_WRITE:
  4411 000045BD C645FE30            <1> 	MOV	byte [CMD_BLOCK+6],WRITE_CMD
  4412 000045C1 E9A6020000          <1>         JMP     COMMANDO
  4413                              <1> 
  4414                              <1> ;----------------------------------------
  4415                              <1> ;	DISK VERIFY	     (AH = 04H) :
  4416                              <1> ;----------------------------------------
  4417                              <1> 
  4418                              <1> DISK_VERF:
  4419 000045C6 C645FE40            <1> 	MOV	byte [CMD_BLOCK+6],VERIFY_CMD
  4420 000045CA E814030000          <1> 	CALL	COMMAND
  4421 000045CF 750C                <1> 	JNZ	short VERF_EXIT		; CONTROLLER STILL BUSY
  4422 000045D1 E886030000          <1> 	CALL	_WAIT			; (Original: CALL WAIT)	
  4423 000045D6 7505                <1> 	JNZ	short VERF_EXIT		; TIME OUT
  4424 000045D8 E813040000          <1> 	CALL	CHECK_STATUS
  4425                              <1> VERF_EXIT:
  4426 000045DD C3                  <1> 	RETn
  4427                              <1> 
  4428                              <1> ;----------------------------------------
  4429                              <1> ;	FORMATTING	     (AH = 05H) :
  4430                              <1> ;----------------------------------------
  4431                              <1> 
  4432                              <1> FMT_TRK:				; FORMAT TRACK	(AH = 005H)
  4433 000045DE C645FE50            <1> 	MOV	byte [CMD_BLOCK+6],FMTTRK_CMD
  4434                              <1> 	;PUSH	ES
  4435                              <1> 	;PUSH	BX
  4436 000045E2 53                  <1> 	push	ebx
  4437 000045E3 E8BA040000          <1> 	CALL	GET_VEC 		; GET DISK PARAMETERS ADDRESS
  4438                              <1> 	;MOV	AL,[ES:BX+14]		; GET SECTORS/TRACK
  4439 000045E8 8A430E              <1> 	mov	al, [ebx+14]
  4440 000045EB 8845F9              <1> 	MOV	[CMD_BLOCK+1],AL 	; SET SECTOR COUNT IN COMMAND
  4441 000045EE 5B                  <1> 	pop	ebx
  4442                              <1> 	;POP	BX
  4443                              <1> 	;POP	ES
  4444 000045EF E97F020000          <1>         JMP     CMD_OF                  ; GO EXECUTE THE COMMAND
  4445                              <1> 
  4446                              <1> ;----------------------------------------
  4447                              <1> ;	READ DASD TYPE	     (AH = 15H) :
  4448                              <1> ;----------------------------------------
  4449                              <1> 
  4450                              <1> READ_DASD_TYPE:
  4451                              <1> READ_D_T:				; GET DRIVE PARAMETERS
  4452 000045F4 1E                  <1> 	PUSH	DS			; SAVE REGISTERS
  4453                              <1> 	;PUSH	ES
  4454 000045F5 53                  <1> 	PUSH	eBX
  4455                              <1> 	;CALL	DDS			; ESTABLISH ADDRESSING
  4456                              <1> 	;push	cs
  4457                              <1> 	;pop	ds
  4458 000045F6 66BB1000            <1>         mov	bx, KDATA
  4459 000045FA 8EDB                <1> 	mov	ds, bx
  4460                              <1> 	;mov	es, bx
  4461 000045FC C605[7B310100]00    <1> 	MOV     byte [DISK_STATUS1],0
  4462 00004603 8A1D[7C310100]      <1> 	MOV	BL,[HF_NUM]		; GET NUMBER OF DRIVES
  4463 00004609 80E27F              <1> 	AND	DL,7FH			; GET DRIVE NUMBER
  4464 0000460C 38D3                <1> 	CMP	BL,DL
  4465 0000460E 7627                <1> 	JBE	short RDT_NOT_PRESENT 	; RETURN DRIVE NOT PRESENT
  4466 00004610 E88D040000          <1> 	CALL	GET_VEC 		; GET DISK PARAMETER ADDRESS
  4467                              <1> 	;MOV	AL,[ES:BX+2]		; HEADS
  4468 00004615 8A4302              <1> 	mov	al, [ebx+2]
  4469                              <1> 	;MOV	CL,[ES:BX+14]
  4470 00004618 8A4B0E              <1> 	mov	cl, [ebx+14]
  4471 0000461B F6E9                <1> 	IMUL	CL			; * NUMBER OF SECTORS
  4472                              <1> 	;MOV	CX,[ES:BX]		; MAX NUMBER OF CYLINDERS
  4473 0000461D 668B0B              <1> 	mov	cx ,[ebx]
  4474                              <1> 	;
  4475                              <1> 	; 02/01/2015 
  4476                              <1> 	; ** leave the last cylinder as reserved for diagnostics **
  4477                              <1> 	; (Also in Award BIOS - 1999, AHDSK.ASM, FUN15 -> sub ax, 1)
  4478 00004620 6649                <1> 	DEC	CX			; LEAVE ONE FOR DIAGNOSTICS
  4479                              <1> 	;
  4480 00004622 66F7E9              <1> 	IMUL	CX			; NUMBER OF SECTORS
  4481 00004625 6689D1              <1> 	MOV	CX,DX			; HIGH ORDER HALF
  4482 00004628 6689C2              <1> 	MOV	DX,AX			; LOW ORDER HALF
  4483                              <1> 	;SUB	AX,AX
  4484 0000462B 28C0                <1> 	sub	al, al
  4485 0000462D B403                <1> 	MOV	AH,03H			; INDICATE FIXED DISK
  4486 0000462F 5B                  <1> RDT2:	POP	eBX			; RESTORE REGISTERS
  4487                              <1> 	;POP	ES
  4488 00004630 1F                  <1> 	POP	DS
  4489                              <1> 	; (*) CLC			; CLEAR CARRY
  4490                              <1> 	;RETf	2
  4491                              <1> 	; (*) 29/05/2016
  4492                              <1> 	; (*) retf 4
  4493 00004631 80642408FE          <1> 	and	byte [esp+8], 0FEh ; clear carry bit of eflags register
  4494 00004636 CF                  <1> 	iretd
  4495                              <1> 
  4496                              <1> RDT_NOT_PRESENT:
  4497 00004637 6629C0              <1> 	SUB	AX,AX			; DRIVE NOT PRESENT RETURN
  4498 0000463A 6689C1              <1> 	MOV	CX,AX			; ZERO BLOCK COUNT
  4499 0000463D 6689C2              <1> 	MOV	DX,AX
  4500 00004640 EBED                <1> 	JMP	short RDT2
  4501                              <1> 
  4502                              <1> ; 28/05/2016
  4503                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
  4504                              <1> 
  4505                              <1> ;----------------------------------------
  4506                              <1> ;	GET PARAMETERS	     (AH = 08H) :
  4507                              <1> ;----------------------------------------
  4508                              <1> 
  4509                              <1> GET_PARM_N:
  4510                              <1> 	; ebx = user's buffer address for parameters table
  4511                              <1> ;GET_PARM:				; GET DRIVE PARAMETERS
  4512 00004642 1E                  <1> 	PUSH	DS			; SAVE REGISTERS
  4513 00004643 06                  <1> 	PUSH	ES
  4514 00004644 53                  <1> 	PUSH	eBX
  4515                              <1> 	;MOV	AX,ABS0 		; ESTABLISH ADDRESSING
  4516                              <1> 	;MOV	DS,AX
  4517                              <1> 	;TEST	DL,1			; CHECK FOR DRIVE 1
  4518                              <1> 	;JZ	short G0
  4519                              <1> 	;LES	BX,@HF1_TBL_VEC
  4520                              <1> 	;JMP	SHORT G1
  4521                              <1> ;G0:	LES	BX,@HF_TBL_VEC
  4522                              <1> ;G1:
  4523                              <1> 	;CALL	DDS			; ESTABLISH SEGMENT
  4524                              <1> 	; 22/12/2014
  4525                              <1> 	;push	cs
  4526                              <1> 	;pop	ds
  4527 00004645 66BB1000            <1> 	mov	bx, KDATA
  4528 00004649 8EDB                <1> 	mov	ds, bx
  4529 0000464B 8EC3                <1> 	mov	es, bx	; 27/05/2016
  4530                              <1> 	;
  4531 0000464D 80EA80              <1> 	SUB	DL,80H
  4532 00004650 80FA04              <1> 	CMP	DL,MAX_FILE		; TEST WITHIN RANGE
  4533 00004653 7361                <1> 	JAE	short G4
  4534                              <1> 	;
  4535 00004655 31DB                <1> 	xor	ebx, ebx ; 21/02/2015
  4536                              <1> 	; 22/12/2014
  4537 00004657 88D3                <1> 	mov	bl, dl
  4538                              <1> 	;xor	bh, bh  
  4539 00004659 C0E302              <1> 	shl	bl, 2			; convert index to offset
  4540                              <1> 	;add	bx, HF_TBL_VEC
  4541 0000465C 81C3[80310100]      <1> 	add	ebx, HF_TBL_VEC
  4542                              <1> 	;mov	ax, [bx+2]
  4543                              <1> 	;mov	es, ax			; dpt segment
  4544                              <1> 	;mov	bx, [bx]		; dpt offset
  4545 00004662 8B1B                <1> 	mov	ebx, [ebx] ; 32 bit offset	
  4546                              <1> 
  4547 00004664 C605[7B310100]00    <1> 	MOV	byte [DISK_STATUS1],0
  4548                              <1>         ;MOV     AX,[ES:BX]             ; MAX NUMBER OF CYLINDERS
  4549 0000466B 668B03              <1> 	mov	ax, [ebx]
  4550                              <1> 	;;SUB	AX,2			; ADJUST FOR 0-N
  4551 0000466E 6648                <1> 	dec	ax			; max. cylinder number
  4552 00004670 88C5                <1> 	MOV	CH,AL
  4553 00004672 66250003            <1> 	AND	AX,0300H		; HIGH TWO BITS OF CYLINDER
  4554 00004676 66D1E8              <1> 	SHR	AX,1
  4555 00004679 66D1E8              <1> 	SHR	AX,1
  4556                              <1> 	;OR	AL,[ES:BX+14]		; SECTORS
  4557 0000467C 0A430E              <1> 	or	al, [ebx+14]
  4558 0000467F 88C1                <1> 	MOV	CL,AL
  4559                              <1> 	;MOV	DH,[ES:BX+2]		; HEADS
  4560 00004681 8A7302              <1> 	mov	dh, [ebx+2]
  4561 00004684 FECE                <1> 	DEC	DH			; 0-N RANGE
  4562 00004686 8A15[7C310100]      <1> 	MOV	DL,[HF_NUM]		; DRIVE COUNT
  4563 0000468C 6629C0              <1> 	SUB	AX,AX
  4564                              <1>         ;27/12/2014 
  4565                              <1> 	;mov	di, bx			; HDPT offset
  4566                              <1> 	
  4567                              <1> 	; 27/05/2016
  4568                              <1> 	; return fixed disk parameters table to user
  4569                              <1> 	; in user's buffer, which is pointed by EBX
  4570                              <1> 	;
  4571 0000468F 873C24              <1> 	xchg	edi, [esp]		; ebx (input)-> edi, edi -> [esp]
  4572 00004692 56                  <1> 	push	esi
  4573 00004693 89DE                <1> 	mov	esi, ebx		; hard disk parameter table (32 bytes)	
  4574 00004695 89FB                <1> 	mov	ebx, edi		; ebx = user's buffer address
  4575 00004697 51                  <1> 	push	ecx
  4576 00004698 50                  <1> 	push	eax
  4577 00004699 B920000000          <1> 	mov	ecx, 32 ; 32 bytes
  4578 0000469E E8D7970000          <1> 	call	transfer_to_user_buffer ; trdosk6.s (16/05/2016)
  4579 000046A3 58                  <1> 	pop	eax
  4580 000046A4 59                  <1> 	pop	ecx
  4581 000046A5 5E                  <1> 	pop	esi
  4582 000046A6 5F                  <1> 	pop	edi
  4583 000046A7 730A                <1> 	jnc	short G5
  4584                              <1> 	; 29/05/2016 (*)
  4585 000046A9 B8FF000000          <1> 	mov	eax, 0FFh ; unknown error !
  4586                              <1> _G6:
  4587 000046AE 804C241001          <1> 	or	byte [esp+16], 1 ; set carry bit of eflags register
  4588                              <1> G5:
  4589                              <1> 	; 27/05/2016
  4590                              <1> 	;POP	eBX			; RESTORE REGISTERS
  4591 000046B3 07                  <1> 	POP	ES
  4592 000046B4 1F                  <1> 	POP	DS
  4593                              <1> 	;RETf	2
  4594                              <1> 	; (*) 29/05/2016
  4595                              <1> 	; (*) retf 4
  4596                              <1> 	; (*) or byte [esp+8], 1 ; set carry bit of eflags register
  4597 000046B5 CF                  <1> 	iretd
  4598                              <1> G4:
  4599 000046B6 C605[7B310100]07    <1> 	MOV     byte [DISK_STATUS1],INIT_FAIL ; OPERATION FAILED
  4600 000046BD B407                <1> 	MOV	AH,INIT_FAIL
  4601 000046BF 28C0                <1> 	SUB	AL,AL
  4602 000046C1 6629D2              <1> 	SUB	DX,DX
  4603 000046C4 6629C9              <1> 	SUB	CX,CX
  4604                              <1> 	; 29/05/2016 (*)
  4605                              <1> 	;STC				; SET ERROR FLAG
  4606                              <1> 	;JMP	short G5
  4607 000046C7 EBE5                <1> 	jmp	short _G6
  4608                              <1> 
  4609                              <1> ;----------------------------------------
  4610                              <1> ;	INITIALIZE DRIVE     (AH = 09H) :
  4611                              <1> ;----------------------------------------
  4612                              <1> 	; 03/01/2015
  4613                              <1> 	; According to ATA-ATAPI specification v2.0 to v5.0
  4614                              <1> 	; logical sector per logical track
  4615                              <1> 	; and logical heads - 1 would be set but
  4616                              <1> 	; it is seen as it will be good
  4617                              <1> 	; if physical parameters will be set here
  4618                              <1> 	; because, number of heads <= 16.
  4619                              <1> 	; (logical heads usually more than 16)
  4620                              <1> 	; NOTE: ATA logical parameters (software C, H, S)
  4621                              <1> 	;	== INT 13h physical parameters
  4622                              <1> 
  4623                              <1> ;INIT_DRV:
  4624                              <1> ;	MOV	byte [CMD_BLOCK+6],SET_PARM_CMD
  4625                              <1> ;	CALL	GET_VEC 		; ES:BX -> PARAMETER BLOCK
  4626                              <1> ;	MOV	AL,[ES:BX+2]		; GET NUMBER OF HEADS
  4627                              <1> ;	DEC	AL			; CONVERT TO 0-INDEX
  4628                              <1> ;	MOV	AH,[CMD_BLOCK+5] 	; GET SDH REGISTER
  4629                              <1> ;	AND	AH,0F0H 		; CHANGE HEAD NUMBER
  4630                              <1> ;	OR	AH,AL			; TO MAX HEAD
  4631                              <1> ;	MOV	[CMD_BLOCK+5],AH
  4632                              <1> ;	MOV	AL,[ES:BX+14]		; MAX SECTOR NUMBER
  4633                              <1> ;	MOV	[CMD_BLOCK+1],AL
  4634                              <1> ;	SUB	AX,AX
  4635                              <1> ;	MOV	[CMD_BLOCK+3],AL 	; ZERO FLAGS
  4636                              <1> ;	CALL	COMMAND 		; TELL CONTROLLER
  4637                              <1> ;	JNZ	short INIT_EXIT		; CONTROLLER BUSY ERROR
  4638                              <1> ;	CALL	NOT_BUSY		; WAIT FOR IT TO BE DONE
  4639                              <1> ;	JNZ	short INIT_EXIT		; TIME OUT
  4640                              <1> ;	CALL	CHECK_STATUS
  4641                              <1> ;INIT_EXIT:
  4642                              <1> ;	RETn
  4643                              <1> 
  4644                              <1> ; 04/01/2015
  4645                              <1> ; 02/01/2015 - Derived from from AWARD BIOS 1999
  4646                              <1> ;				 AHDSK.ASM - INIT_DRIVE
  4647                              <1> INIT_DRV:
  4648                              <1> 	;xor	ah,ah
  4649 000046C9 31C0                <1> 	xor	eax, eax ; 21/02/2015
  4650 000046CB B00B                <1> 	mov	al,11 ; Physical heads from translated HDPT
  4651 000046CD 3825[90310100]      <1>         cmp     [LBAMode], ah   ; 0
  4652 000046D3 7702                <1> 	ja	short idrv0
  4653 000046D5 B002                <1> 	mov	al,2  ; Physical heads from standard HDPT
  4654                              <1> idrv0:
  4655                              <1> 	; DL = drive number (0 based)
  4656 000046D7 E8C6030000          <1> 	call	GET_VEC
  4657                              <1> 	;push	bx
  4658 000046DC 53                  <1> 	push	ebx ; 21/02/2015
  4659                              <1> 	;add	bx,ax
  4660 000046DD 01C3                <1> 	add	ebx, eax
  4661                              <1> 	;; 05/01/2015
  4662 000046DF 8A25[FAFB0000]      <1> 	mov	ah, [hf_m_s] ; drive number (0= master, 1= slave)
  4663                              <1> 	;;and 	ah,1 
  4664 000046E5 C0E404              <1> 	shl	ah,4
  4665 000046E8 80CCA0              <1> 	or	ah,0A0h  ; Drive/Head register - 10100000b (A0h)	
  4666                              <1> 	;mov	al,[es:bx]
  4667 000046EB 8A03                <1> 	mov	al, [ebx] ; 21/02/2015
  4668 000046ED FEC8                <1> 	dec	al	 ; last head number 
  4669                              <1> 	;and	al,0Fh
  4670 000046EF 08E0                <1> 	or	al,ah	 ; lower 4 bits for head number
  4671                              <1> 	;
  4672 000046F1 C645FE91            <1> 	mov	byte [CMD_BLOCK+6],SET_PARM_CMD
  4673 000046F5 8845FD              <1> 	mov	[CMD_BLOCK+5],al
  4674                              <1> 	;pop	bx
  4675 000046F8 5B                  <1> 	pop	ebx
  4676 000046F9 29C0                <1> 	sub	eax, eax ; 21/02/2015
  4677 000046FB B004                <1> 	mov	al,4 ; Physical sec per track from translated HDPT
  4678 000046FD 803D[90310100]00    <1> 	cmp	byte [LBAMode], 0
  4679 00004704 7702                <1> 	ja	short idrv1
  4680 00004706 B00E                <1> 	mov	al,14 ; Physical sec per track from standard HDPT
  4681                              <1> idrv1:
  4682                              <1> 	;xor	ah,ah
  4683                              <1> 	;add	bx,ax
  4684 00004708 01C3                <1> 	add	ebx, eax ; 21/02/2015
  4685                              <1> 	;mov	al,[es:bx]
  4686                              <1> 			; sector number
  4687 0000470A 8A03                <1> 	mov	al, [ebx]
  4688 0000470C 8845F9              <1> 	mov	[CMD_BLOCK+1],al
  4689 0000470F 28C0                <1> 	sub	al,al
  4690 00004711 8845FB              <1> 	mov	[CMD_BLOCK+3],al  ; ZERO FLAGS
  4691 00004714 E8CA010000          <1> 	call	COMMAND 	  ; TELL CONTROLLER
  4692 00004719 750C                <1> 	jnz	short INIT_EXIT	  ; CONTROLLER BUSY ERROR
  4693 0000471B E878020000          <1> 	call	NOT_BUSY	  ; WAIT FOR IT TO BE DONE
  4694 00004720 7505                <1> 	jnz	short INIT_EXIT	  ; TIME OUT
  4695 00004722 E8C9020000          <1> 	call	CHECK_STATUS
  4696                              <1> INIT_EXIT:
  4697 00004727 C3                  <1> 	RETn
  4698                              <1> 
  4699                              <1> ;----------------------------------------
  4700                              <1> ;	READ LONG	     (AH = 0AH) :
  4701                              <1> ;----------------------------------------
  4702                              <1> 
  4703                              <1> RD_LONG:
  4704                              <1> 	;MOV	@CMD_BLOCK+6,READ_CMD OR ECC_MODE
  4705 00004728 C645FE22            <1>         mov     byte [CMD_BLOCK+6],READ_CMD + ECC_MODE 
  4706 0000472C E9E0000000          <1>         JMP     COMMANDI
  4707                              <1> 
  4708                              <1> ;----------------------------------------
  4709                              <1> ;	WRITE LONG	     (AH = 0BH) :
  4710                              <1> ;----------------------------------------
  4711                              <1> 
  4712                              <1> WR_LONG:
  4713                              <1> 	;MOV	@CMD_BLOCK+6,WRITE_CMD OR ECC_MODE
  4714 00004731 C645FE32            <1>         MOV     byte [CMD_BLOCK+6],WRITE_CMD + ECC_MODE
  4715 00004735 E932010000          <1>         JMP     COMMANDO
  4716                              <1> 
  4717                              <1> ;----------------------------------------
  4718                              <1> ;	SEEK		     (AH = 0CH) :
  4719                              <1> ;----------------------------------------
  4720                              <1> 
  4721                              <1> DISK_SEEK:
  4722 0000473A C645FE70            <1>         MOV     byte [CMD_BLOCK+6],SEEK_CMD
  4723 0000473E E8A0010000          <1> 	CALL	COMMAND
  4724 00004743 751C                <1> 	JNZ	short DS_EXIT 		; CONTROLLER BUSY ERROR
  4725 00004745 E812020000          <1> 	CALL	_WAIT
  4726 0000474A 7515                <1>         JNZ     DS_EXIT                 ; TIME OUT ON SEEK
  4727 0000474C E89F020000          <1> 	CALL	CHECK_STATUS
  4728 00004751 803D[7B310100]40    <1>         CMP     byte [DISK_STATUS1],BAD_SEEK
  4729 00004758 7507                <1> 	JNE	short DS_EXIT
  4730 0000475A C605[7B310100]00    <1>         MOV     byte [DISK_STATUS1],0
  4731                              <1> DS_EXIT:
  4732 00004761 C3                  <1> 	RETn
  4733                              <1> 
  4734                              <1> ;----------------------------------------
  4735                              <1> ;	TEST DISK READY      (AH = 10H) :
  4736                              <1> ;----------------------------------------
  4737                              <1> 
  4738                              <1> TST_RDY:				; WAIT FOR CONTROLLER
  4739 00004762 E831020000          <1> 	CALL	NOT_BUSY
  4740 00004767 751C                <1> 	JNZ	short TR_EX
  4741 00004769 8A45FD              <1> 	MOV	AL,[CMD_BLOCK+5] 	; SELECT DRIVE
  4742 0000476C 668B15[F6FB0000]    <1> 	MOV	DX,[HF_PORT]
  4743 00004773 80C206              <1> 	add	dl,6
  4744 00004776 EE                  <1> 	OUT	DX,AL
  4745 00004777 E88C020000          <1> 	CALL	CHECK_ST		; CHECK STATUS ONLY
  4746 0000477C 7507                <1> 	JNZ	short TR_EX
  4747 0000477E C605[7B310100]00    <1> 	MOV	byte [DISK_STATUS1],0 	; WIPE OUT DATA CORRECTED ERROR
  4748                              <1> TR_EX:	
  4749 00004785 C3                  <1> 	RETn
  4750                              <1> 
  4751                              <1> ;----------------------------------------
  4752                              <1> ;	RECALIBRATE	     (AH = 11H) :
  4753                              <1> ;----------------------------------------
  4754                              <1> 
  4755                              <1> HDISK_RECAL:
  4756 00004786 C645FE10            <1>         MOV     byte [CMD_BLOCK+6],RECAL_CMD ; 10h, 16
  4757 0000478A E854010000          <1> 	CALL	COMMAND 		; START THE OPERATION
  4758 0000478F 7523                <1> 	JNZ	short RECAL_EXIT	; ERROR
  4759 00004791 E8C6010000          <1> 	CALL	_WAIT			; WAIT FOR COMPLETION
  4760 00004796 7407                <1> 	JZ	short RECAL_X 		; TIME OUT ONE OK ?
  4761 00004798 E8BF010000          <1> 	CALL	_WAIT			; WAIT FOR COMPLETION LONGER
  4762 0000479D 7515                <1> 	JNZ	short RECAL_EXIT	; TIME OUT TWO TIMES IS ERROR
  4763                              <1> RECAL_X:
  4764 0000479F E84C020000          <1> 	CALL	CHECK_STATUS
  4765 000047A4 803D[7B310100]40    <1> 	CMP	byte [DISK_STATUS1],BAD_SEEK ; SEEK NOT COMPLETE
  4766 000047AB 7507                <1> 	JNE	short RECAL_EXIT	; IS OK
  4767 000047AD C605[7B310100]00    <1> 	MOV	byte [DISK_STATUS1],0
  4768                              <1> RECAL_EXIT:
  4769 000047B4 803D[7B310100]00    <1>         CMP     byte [DISK_STATUS1],0
  4770 000047BB C3                  <1> 	RETn
  4771                              <1> 
  4772                              <1> ;----------------------------------------
  4773                              <1> ;      CONTROLLER DIAGNOSTIC (AH = 14H) :
  4774                              <1> ;----------------------------------------
  4775                              <1> 
  4776                              <1> CTLR_DIAGNOSTIC:
  4777 000047BC FA                  <1>         CLI                             ; DISABLE INTERRUPTS WHILE CHANGING MASK
  4778 000047BD E4A1                <1> 	IN	AL,INTB01		; TURN ON SECOND INTERRUPT CHIP
  4779                              <1> 	;AND	AL,0BFH
  4780 000047BF 243F                <1> 	and	al, 3Fh			; enable IRQ 14 & IRQ 15
  4781                              <1> 	;JMP	$+2
  4782                              <1> 	IODELAY
  4782 000047C1 EB00                <2>  jmp short $+2
  4782 000047C3 EB00                <2>  jmp short $+2
  4783 000047C5 E6A1                <1> 	OUT	INTB01,AL
  4784                              <1> 	IODELAY
  4784 000047C7 EB00                <2>  jmp short $+2
  4784 000047C9 EB00                <2>  jmp short $+2
  4785 000047CB E421                <1> 	IN	AL,INTA01		; LET INTERRUPTS PASS THRU TO
  4786 000047CD 24FB                <1> 	AND	AL,0FBH 		;  SECOND CHIP
  4787                              <1> 	;JMP	$+2
  4788                              <1> 	IODELAY
  4788 000047CF EB00                <2>  jmp short $+2
  4788 000047D1 EB00                <2>  jmp short $+2
  4789 000047D3 E621                <1> 	OUT	INTA01,AL
  4790 000047D5 FB                  <1> 	STI
  4791 000047D6 E8BD010000          <1> 	CALL	NOT_BUSY		; WAIT FOR CARD
  4792 000047DB 752B                <1> 	JNZ	short CD_ERR		; BAD CARD
  4793                              <1> 	;MOV	DX, HF_PORT+7
  4794 000047DD 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]
  4795 000047E4 80C207              <1> 	add	dl, 7
  4796 000047E7 B090                <1> 	MOV	AL,DIAG_CMD		; START DIAGNOSE
  4797 000047E9 EE                  <1> 	OUT	DX,AL
  4798 000047EA E8A9010000          <1> 	CALL	NOT_BUSY		; WAIT FOR IT TO COMPLETE
  4799 000047EF B480                <1> 	MOV	AH,TIME_OUT
  4800 000047F1 7517                <1> 	JNZ	short CD_EXIT 		; TIME OUT ON DIAGNOSTIC
  4801                              <1> 	;MOV	DX,HF_PORT+1		; GET ERROR REGISTER
  4802 000047F3 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]
  4803 000047FA FEC2                <1> 	inc	dl
  4804 000047FC EC                  <1> 	IN	AL,DX
  4805 000047FD A2[72310100]        <1> 	MOV	[HF_ERROR],AL		; SAVE IT
  4806 00004802 B400                <1> 	MOV	AH,0
  4807 00004804 3C01                <1> 	CMP	AL,1			; CHECK FOR ALL OK
  4808 00004806 7402                <1> 	JE	SHORT CD_EXIT
  4809 00004808 B420                <1> CD_ERR: MOV	AH,BAD_CNTLR
  4810                              <1> CD_EXIT:
  4811 0000480A 8825[7B310100]      <1> 	MOV	[DISK_STATUS1],AH
  4812 00004810 C3                  <1> 	RETn
  4813                              <1> 
  4814                              <1> ;----------------------------------------
  4815                              <1> ; COMMANDI				:
  4816                              <1> ;	REPEATEDLY INPUTS DATA TILL	:
  4817                              <1> ;	NSECTOR RETURNS ZERO		:
  4818                              <1> ;----------------------------------------
  4819                              <1> COMMANDI:
  4820 00004811 E862020000          <1> 	CALL	CHECK_DMA		; CHECK 64K BOUNDARY ERROR
  4821 00004816 7253                <1> 	JC	short CMD_ABORT
  4822                              <1> 	;MOV	DI,BX
  4823 00004818 89DF                <1> 	mov	edi, ebx ; 21/02/2015
  4824 0000481A E8C4000000          <1> 	CALL	COMMAND 		; OUTPUT COMMAND
  4825 0000481F 754A                <1> 	JNZ	short CMD_ABORT
  4826                              <1> CMD_I1:
  4827 00004821 E836010000          <1> 	CALL	_WAIT			; WAIT FOR DATA REQUEST INTERRUPT
  4828 00004826 7543                <1> 	JNZ	short TM_OUT		; TIME OUT
  4829                              <1> cmd_i1x: ; 18/02/2016
  4830                              <1> 	;MOV	CX,256			; SECTOR SIZE IN WORDS
  4831 00004828 B900010000          <1> 	mov	ecx, 256 ; 21/02/2015	
  4832                              <1> 	;MOV	DX,HF_PORT
  4833 0000482D 668B15[F6FB0000]    <1> 	mov	dx,[HF_PORT]
  4834 00004834 FA                  <1> 	CLI
  4835 00004835 FC                  <1> 	CLD
  4836 00004836 F3666D              <1> 	REP	INSW			; GET THE SECTOR
  4837 00004839 FB                  <1> 	STI
  4838 0000483A F645FE02            <1> 	TEST	byte [CMD_BLOCK+6],ECC_MODE ; CHECK FOR NORMAL INPUT
  4839 0000483E 7419                <1> 	JZ	short CMD_I3
  4840 00004840 E880010000          <1> 	CALL	WAIT_DRQ		; WAIT FOR DATA REQUEST
  4841 00004845 7224                <1> 	JC	short TM_OUT
  4842                              <1> 	;MOV	DX,HF_PORT
  4843 00004847 668B15[F6FB0000]    <1> 	mov	dx,[HF_PORT]
  4844                              <1> 	;MOV	CX,4			; GET ECC BYTES
  4845 0000484E B904000000          <1> 	mov 	ecx, 4 ; mov cx, 4 
  4846 00004853 EC                  <1> CMD_I2: IN	AL,DX
  4847                              <1> 	;MOV	[ES:DI],AL		; GO SLOW FOR BOARD
  4848 00004854 8807                <1> 	mov 	[edi], al ; 21/02/2015
  4849 00004856 47                  <1> 	INC	eDI
  4850 00004857 E2FA                <1> 	LOOP	CMD_I2
  4851                              <1> CMD_I3: 
  4852                              <1> 	; wait for 400 ns
  4853 00004859 80C207              <1> 	add 	dl, 7
  4854 0000485C EC                  <1> 	in	al, dx
  4855 0000485D EC                  <1> 	in	al, dx
  4856 0000485E EC                  <1> 	in	al, dx
  4857                              <1> 	;
  4858 0000485F E88C010000          <1> 	CALL	CHECK_STATUS
  4859 00004864 7505                <1> 	JNZ	short CMD_ABORT		; ERROR RETURNED
  4860 00004866 FE4DF9              <1> 	DEC	byte [CMD_BLOCK+1]	; CHECK FOR MORE
  4861                              <1> 	;JNZ	SHORT CMD_I1
  4862 00004869 75BD                <1> 	jnz	short cmd_i1x ; 18/02/2016
  4863                              <1> CMD_ABORT:
  4864 0000486B C3                  <1> TM_OUT: RETn
  4865                              <1> 
  4866                              <1> ;----------------------------------------
  4867                              <1> ; COMMANDO				:
  4868                              <1> ;	REPEATEDLY OUTPUTS DATA TILL	:
  4869                              <1> ;	NSECTOR RETURNS ZERO		:
  4870                              <1> ;----------------------------------------
  4871                              <1> COMMANDO:
  4872 0000486C E807020000          <1> 	CALL	CHECK_DMA		; CHECK 64K BOUNDARY ERROR
  4873 00004871 72F8                <1> 	JC	short CMD_ABORT
  4874 00004873 89DE                <1> CMD_OF: MOV	eSI,eBX ; 21/02/2015
  4875 00004875 E869000000          <1> 	CALL	COMMAND 		; OUTPUT COMMAND
  4876 0000487A 75EF                <1> 	JNZ	short CMD_ABORT
  4877 0000487C E844010000          <1> 	CALL	WAIT_DRQ		; WAIT FOR DATA REQUEST
  4878 00004881 72E8                <1> 	JC	short TM_OUT			; TOO LONG
  4879                              <1> CMD_O1: ;PUSH	DS
  4880                              <1> 	;PUSH	ES			; MOVE ES TO DS
  4881                              <1> 	;POP	DS
  4882                              <1> 	;MOV	CX,256			; PUT THE DATA OUT TO THE CARD
  4883                              <1> 	;MOV	DX,HF_PORT
  4884                              <1> 	; 01/02/2015
  4885 00004883 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]
  4886                              <1> 	;push	es
  4887                              <1> 	;pop	ds
  4888                              <1> 	;mov	cx, 256
  4889 0000488A B900010000          <1> 	mov	ecx, 256 ; 21/02/2015
  4890 0000488F FA                  <1> 	CLI
  4891 00004890 FC                  <1> 	CLD
  4892 00004891 F3666F              <1> 	REP	OUTSW
  4893 00004894 FB                  <1> 	STI
  4894                              <1> 	;POP	DS			; RESTORE DS
  4895 00004895 F645FE02            <1> 	TEST	byte [CMD_BLOCK+6],ECC_MODE ; CHECK FOR NORMAL OUTPUT
  4896 00004899 7419                <1> 	JZ	short CMD_O3
  4897 0000489B E825010000          <1> 	CALL	WAIT_DRQ		; WAIT FOR DATA REQUEST
  4898 000048A0 72C9                <1> 	JC	short TM_OUT
  4899                              <1> 	;MOV	DX,HF_PORT
  4900 000048A2 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]
  4901                              <1> 	;MOV	CX,4			; OUTPUT THE ECC BYTES
  4902 000048A9 B904000000          <1> 	mov	ecx, 4  ; mov cx, 4
  4903                              <1> CMD_O2: ;MOV	AL,[ES:SI]
  4904 000048AE 8A06                <1> 	mov	al, [esi]
  4905 000048B0 EE                  <1> 	OUT	DX,AL
  4906 000048B1 46                  <1> 	INC	eSI
  4907 000048B2 E2FA                <1> 	LOOP	CMD_O2
  4908                              <1> CMD_O3:
  4909 000048B4 E8A3000000          <1> 	CALL	_WAIT			; WAIT FOR SECTOR COMPLETE INTERRUPT
  4910 000048B9 75B0                <1> 	JNZ	short TM_OUT		; ERROR RETURNED
  4911 000048BB E830010000          <1> 	CALL	CHECK_STATUS
  4912 000048C0 75A9                <1> 	JNZ	short CMD_ABORT
  4913 000048C2 F605[71310100]08    <1> 	TEST	byte [HF_STATUS],ST_DRQ	; CHECK FOR MORE
  4914 000048C9 75B8                <1> 	JNZ	SHORT CMD_O1
  4915                              <1> 	;MOV	DX,HF_PORT+2		; CHECK RESIDUAL SECTOR COUNT
  4916 000048CB 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]
  4917                              <1> 	;add	dl, 2
  4918 000048D2 FEC2                <1> 	inc	dl
  4919 000048D4 FEC2                <1> 	inc	dl
  4920 000048D6 EC                  <1> 	IN	AL,DX			;
  4921 000048D7 A8FF                <1> 	TEST	AL,0FFH 		;
  4922 000048D9 7407                <1> 	JZ	short CMD_O4			; COUNT = 0  OK
  4923 000048DB C605[7B310100]BB    <1> 	MOV	byte [DISK_STATUS1],UNDEF_ERR 
  4924                              <1> 					; OPERATION ABORTED - PARTIAL TRANSFER
  4925                              <1> CMD_O4:
  4926 000048E2 C3                  <1> 	RETn
  4927                              <1> 
  4928                              <1> ;--------------------------------------------------------
  4929                              <1> ; COMMAND						:
  4930                              <1> ;	THIS ROUTINE OUTPUTS THE COMMAND BLOCK		:
  4931                              <1> ; OUTPUT						:
  4932                              <1> ;	BL = STATUS					:
  4933                              <1> ;	BH = ERROR REGISTER				:
  4934                              <1> ;--------------------------------------------------------
  4935                              <1> 
  4936                              <1> COMMAND:
  4937 000048E3 53                  <1> 	PUSH	eBX			; WAIT FOR SEEK COMPLETE AND READY
  4938                              <1> 	;;MOV	CX,DELAY_2		; SET INITIAL DELAY BEFORE TEST
  4939                              <1> COMMAND1:
  4940                              <1> 	;;PUSH	CX			; SAVE LOOP COUNT
  4941 000048E4 E879FEFFFF          <1> 	CALL	TST_RDY 		; CHECK DRIVE READY
  4942                              <1> 	;;POP	CX
  4943 000048E9 7419                <1> 	JZ	short COMMAND2		; DRIVE IS READY
  4944 000048EB 803D[7B310100]80    <1>         CMP     byte [DISK_STATUS1],TIME_OUT ; TST_RDY TIMED OUT--GIVE UP
  4945                              <1> 	;JZ	short CMD_TIMEOUT
  4946                              <1> 	;;LOOP	COMMAND1		; KEEP TRYING FOR A WHILE
  4947                              <1> 	;JMP	SHORT COMMAND4		; ITS NOT GOING TO GET READY
  4948 000048F2 7507                <1> 	jne	short COMMAND4
  4949                              <1> CMD_TIMEOUT:
  4950 000048F4 C605[7B310100]20    <1> 	MOV	byte [DISK_STATUS1],BAD_CNTLR
  4951                              <1> COMMAND4:
  4952 000048FB 5B                  <1> 	POP	eBX
  4953 000048FC 803D[7B310100]00    <1>         CMP     byte [DISK_STATUS1],0   ; SET CONDITION CODE FOR CALLER
  4954 00004903 C3                  <1> 	RETn
  4955                              <1> COMMAND2:
  4956 00004904 5B                  <1> 	POP	eBX
  4957 00004905 57                  <1> 	PUSH	eDI
  4958 00004906 C605[73310100]00    <1> 	MOV	byte [HF_INT_FLAG],0	; RESET INTERRUPT FLAG
  4959 0000490D FA                  <1> 	CLI				; INHIBIT INTERRUPTS WHILE CHANGING MASK
  4960 0000490E E4A1                <1> 	IN	AL,INTB01		; TURN ON SECOND INTERRUPT CHIP
  4961                              <1> 	;AND	AL,0BFH
  4962 00004910 243F                <1> 	and	al, 3Fh			; Enable IRQ 14 & 15
  4963                              <1> 	;JMP	$+2
  4964                              <1> 	IODELAY
  4964 00004912 EB00                <2>  jmp short $+2
  4964 00004914 EB00                <2>  jmp short $+2
  4965 00004916 E6A1                <1> 	OUT	INTB01,AL
  4966 00004918 E421                <1> 	IN	AL,INTA01		; LET INTERRUPTS PASS THRU TO
  4967 0000491A 24FB                <1> 	AND	AL,0FBH 		;  SECOND CHIP
  4968                              <1> 	;JMP	$+2
  4969                              <1> 	IODELAY
  4969 0000491C EB00                <2>  jmp short $+2
  4969 0000491E EB00                <2>  jmp short $+2
  4970 00004920 E621                <1> 	OUT	INTA01,AL
  4971 00004922 FB                  <1> 	STI
  4972 00004923 31FF                <1> 	XOR	eDI,eDI			; INDEX THE COMMAND TABLE
  4973                              <1> 	;MOV	DX,HF_PORT+1		; DISK ADDRESS
  4974 00004925 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]
  4975 0000492C FEC2                <1> 	inc	dl
  4976 0000492E F605[7D310100]C0    <1> 	TEST	byte [CONTROL_BYTE],0C0H ; CHECK FOR RETRY SUPPRESSION
  4977 00004935 7411                <1> 	JZ	short COMMAND3
  4978 00004937 8A45FE              <1> 	MOV	AL, [CMD_BLOCK+6] 	; YES-GET OPERATION CODE
  4979 0000493A 24F0                <1> 	AND	AL,0F0H 		; GET RID OF MODIFIERS
  4980 0000493C 3C20                <1> 	CMP	AL,20H			; 20H-40H IS READ, WRITE, VERIFY
  4981 0000493E 7208                <1> 	JB	short COMMAND3
  4982 00004940 3C40                <1> 	CMP	AL,40H
  4983 00004942 7704                <1> 	JA	short COMMAND3
  4984 00004944 804DFE01            <1> 	OR	byte [CMD_BLOCK+6],NO_RETRIES 
  4985                              <1> 					; VALID OPERATION FOR RETRY SUPPRESS
  4986                              <1> COMMAND3:
  4987 00004948 8A443DF8            <1> 	MOV	AL,[CMD_BLOCK+eDI]	; GET THE COMMAND STRING BYTE
  4988 0000494C EE                  <1> 	OUT	DX,AL			; GIVE IT TO CONTROLLER
  4989                              <1> 	IODELAY
  4989 0000494D EB00                <2>  jmp short $+2
  4989 0000494F EB00                <2>  jmp short $+2
  4990 00004951 47                  <1> 	INC	eDI			; NEXT BYTE IN COMMAND BLOCK
  4991 00004952 6642                <1> 	INC	DX			; NEXT DISK ADAPTER REGISTER
  4992 00004954 6683FF07            <1> 	cmp	di, 7	; 1/1/2015	; ALL DONE?
  4993 00004958 75EE                <1> 	JNZ	short COMMAND3		; NO--GO DO NEXT ONE
  4994 0000495A 5F                  <1> 	POP	eDI
  4995 0000495B C3                  <1> 	RETn				; ZERO FLAG IS SET
  4996                              <1> 
  4997                              <1> ;CMD_TIMEOUT:
  4998                              <1> ;	MOV	byte [DISK_STATUS1],BAD_CNTLR
  4999                              <1> ;COMMAND4:
  5000                              <1> ;	POP	BX
  5001                              <1> ;	CMP	[DISK_STATUS1],0 	; SET CONDITION CODE FOR CALLER
  5002                              <1> ;	RETn
  5003                              <1> 
  5004                              <1> ;----------------------------------------
  5005                              <1> ;	WAIT FOR INTERRUPT		:
  5006                              <1> ;----------------------------------------
  5007                              <1> ;WAIT:
  5008                              <1> _WAIT:
  5009 0000495C FB                  <1> 	STI				; MAKE SURE INTERRUPTS ARE ON
  5010                              <1> 	;SUB	CX,CX			; SET INITIAL DELAY BEFORE TEST
  5011                              <1> 	;CLC
  5012                              <1> 	;MOV	AX,9000H		; DEVICE WAIT INTERRUPT
  5013                              <1> 	;INT	15H
  5014                              <1> 	;JC	WT2			; DEVICE TIMED OUT
  5015                              <1> 	;MOV	BL,DELAY_1		; SET DELAY COUNT
  5016                              <1> 
  5017                              <1> 	;mov	bl, WAIT_HDU_INT_HI
  5018                              <1> 	;; 21/02/2015
  5019                              <1> 	;;mov	bl, WAIT_HDU_INT_HI + 1
  5020                              <1> 	;;mov	cx, WAIT_HDU_INT_LO
  5021 0000495D B915160500          <1> 	mov	ecx, WAIT_HDU_INT_LH
  5022                              <1> 					; (AWARD BIOS -> WAIT_FOR_MEM)
  5023                              <1> ;-----	WAIT LOOP
  5024                              <1> 
  5025                              <1> WT1:	
  5026                              <1> 	;TEST	byte [HF_INT_FLAG],80H	; TEST FOR INTERRUPT
  5027 00004962 F605[73310100]C0    <1> 	test 	byte [HF_INT_FLAG],0C0h
  5028                              <1> 	;LOOPZ	WT1
  5029 00004969 7517                <1> 	JNZ	short WT3		; INTERRUPT--LETS GO
  5030                              <1> 	;DEC	BL
  5031                              <1> 	;JNZ	short WT1		; KEEP TRYING FOR A WHILE
  5032                              <1> 
  5033                              <1> WT1_hi:
  5034 0000496B E461                <1> 	in	al, SYS1 ; 61h (PORT_B)	; wait for lo to hi
  5035 0000496D A810                <1> 	test	al, 10h			; transition on memory
  5036 0000496F 75FA                <1> 	jnz	short WT1_hi		; refresh.
  5037                              <1> WT1_lo:
  5038 00004971 E461                <1> 	in	al, SYS1 		; 061h (PORT_B)	
  5039 00004973 A810                <1> 	test	al, 10h			
  5040 00004975 74FA                <1> 	jz	short WT1_lo
  5041 00004977 E2E9                <1> 	loop	WT1
  5042                              <1> 	;;or	bl, bl
  5043                              <1> 	;;jz	short WT2	
  5044                              <1> 	;;dec	bl
  5045                              <1> 	;;jmp	short WT1
  5046                              <1> 	;dec	bl
  5047                              <1> 	;jnz	short WT1	
  5048                              <1> 
  5049 00004979 C605[7B310100]80    <1> WT2:	MOV	byte [DISK_STATUS1],TIME_OUT ; REPORT TIME OUT ERROR
  5050 00004980 EB0E                <1> 	JMP	SHORT WT4
  5051 00004982 C605[7B310100]00    <1> WT3:	MOV	byte [DISK_STATUS1],0
  5052 00004989 C605[73310100]00    <1> 	MOV	byte [HF_INT_FLAG],0
  5053 00004990 803D[7B310100]00    <1> WT4:	CMP	byte [DISK_STATUS1],0 	; SET CONDITION CODE FOR CALLER
  5054 00004997 C3                  <1> 	RETn
  5055                              <1> 
  5056                              <1> ;----------------------------------------
  5057                              <1> ;	WAIT FOR CONTROLLER NOT BUSY	:
  5058                              <1> ;----------------------------------------
  5059                              <1> NOT_BUSY:
  5060 00004998 FB                  <1> 	STI				; MAKE SURE INTERRUPTS ARE ON
  5061                              <1> 	;PUSH	eBX
  5062                              <1> 	;SUB	CX,CX			; SET INITIAL DELAY BEFORE TEST
  5063 00004999 668B15[F6FB0000]    <1> 	mov	DX, [HF_PORT]
  5064 000049A0 80C207              <1> 	add	dl, 7			; Status port (HF_PORT+7)
  5065                              <1> 	;MOV	BL,DELAY_1
  5066                              <1> 					; wait for 10 seconds
  5067                              <1> 	;mov 	cx, WAIT_HDU_INT_LO	; 1615h
  5068                              <1> 	;;mov 	bl, WAIT_HDU_INT_HI	;   05h
  5069                              <1> 	;mov	bl, WAIT_HDU_INT_HI + 1
  5070 000049A3 B915160500          <1> 	mov	ecx, WAIT_HDU_INT_LH  ; 21/02/2015
  5071                              <1> 	;
  5072                              <1> ;;      mov     byte [wait_count], 0    ; Reset wait counter
  5073                              <1> NB1:	
  5074 000049A8 EC                  <1> 	IN	AL,DX			; CHECK STATUS
  5075                              <1> 	;TEST	AL,ST_BUSY
  5076 000049A9 2480                <1> 	and	al, ST_BUSY
  5077                              <1> 	;LOOPNZ	NB1
  5078 000049AB 7410                <1> 	JZ	short NB2		; NOT BUSY--LETS GO
  5079                              <1> 	;DEC	BL			
  5080                              <1> 	;JNZ	short NB1		; KEEP TRYING FOR A WHILE
  5081                              <1> 
  5082 000049AD E461                <1> NB1_hi: IN	AL,SYS1			; wait for hi to lo
  5083 000049AF A810                <1> 	TEST	AL,010H			; transition on memory
  5084 000049B1 75FA                <1> 	JNZ	SHORT NB1_hi		; refresh.
  5085 000049B3 E461                <1> NB1_lo: IN	AL,SYS1
  5086 000049B5 A810                <1> 	TEST	AL,010H
  5087 000049B7 74FA                <1> 	JZ	short NB1_lo
  5088 000049B9 E2ED                <1> 	LOOP	NB1
  5089                              <1> 	;dec	bl
  5090                              <1> 	;jnz	short NB1
  5091                              <1> 	;
  5092                              <1> ;;      cmp     byte [wait_count], 182  ; 10 seconds (182 timer ticks)
  5093                              <1> ;;	jb	short NB1
  5094                              <1> 	;
  5095                              <1> 	;MOV	[DISK_STATUS1],TIME_OUT	; REPORT TIME OUT ERROR
  5096                              <1> 	;JMP	SHORT NB3
  5097 000049BB B080                <1> 	mov	al, TIME_OUT
  5098                              <1> NB2:	
  5099                              <1> 	;MOV	byte [DISK_STATUS1],0
  5100                              <1> ;NB3:	
  5101                              <1> 	;POP	eBX
  5102 000049BD A2[7B310100]        <1> 	mov	[DISK_STATUS1], al	;;; will be set after return
  5103                              <1> 	;CMP	byte [DISK_STATUS1],0 	; SET CONDITION CODE FOR CALLER
  5104 000049C2 08C0                <1> 	or	al, al			; (zf = 0 --> timeout)
  5105 000049C4 C3                  <1> 	RETn
  5106                              <1> 
  5107                              <1> ;----------------------------------------
  5108                              <1> ;	WAIT FOR DATA REQUEST		:
  5109                              <1> ;----------------------------------------
  5110                              <1> WAIT_DRQ:
  5111                              <1> 	;MOV	CX,DELAY_3
  5112                              <1> 	;MOV	DX,HF_PORT+7
  5113 000049C5 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]
  5114 000049CC 80C207              <1> 	add	dl, 7
  5115                              <1> 	;;MOV	bl, WAIT_HDU_DRQ_HI	; 0
  5116                              <1> 	;MOV	cx, WAIT_HDU_DRQ_LO	; 1000 (30 milli seconds)
  5117                              <1> 					; (but it is written as 2000
  5118                              <1> 					; micro seconds in ATORGS.ASM file
  5119                              <1> 					; of Award Bios - 1999, D1A0622)
  5120 000049CF B9E8030000          <1> 	mov 	ecx, WAIT_HDU_DRQ_LH ; 21/02/2015 
  5121 000049D4 EC                  <1> WQ_1:	IN	AL,DX			; GET STATUS
  5122 000049D5 A808                <1> 	TEST	AL,ST_DRQ		; WAIT FOR DRQ
  5123 000049D7 7516                <1> 	JNZ	short WQ_OK
  5124                              <1> 	;LOOP	WQ_1			; KEEP TRYING FOR A SHORT WHILE
  5125                              <1> WQ_hi:	
  5126 000049D9 E461                <1> 	IN	AL,SYS1			; wait for hi to lo
  5127 000049DB A810                <1> 	TEST	AL,010H			; transition on memory
  5128 000049DD 75FA                <1> 	JNZ	SHORT WQ_hi		; refresh.
  5129 000049DF E461                <1> WQ_lo:  IN      AL,SYS1
  5130 000049E1 A810                <1> 	TEST	AL,010H
  5131 000049E3 74FA                <1> 	JZ	SHORT WQ_lo
  5132 000049E5 E2ED                <1> 	LOOP	WQ_1
  5133                              <1> 
  5134 000049E7 C605[7B310100]80    <1>         MOV     byte [DISK_STATUS1],TIME_OUT ; ERROR
  5135 000049EE F9                  <1> 	STC
  5136                              <1> WQ_OK:
  5137 000049EF C3                  <1> 	RETn
  5138                              <1> ;WQ_OK:	;CLC
  5139                              <1> ;	RETn
  5140                              <1> 
  5141                              <1> ;----------------------------------------
  5142                              <1> ;	CHECK FIXED DISK STATUS 	:
  5143                              <1> ;----------------------------------------
  5144                              <1> CHECK_STATUS:
  5145 000049F0 E813000000          <1> 	CALL	CHECK_ST		; CHECK THE STATUS BYTE
  5146 000049F5 7509                <1> 	JNZ	short CHECK_S1		; AN ERROR WAS FOUND
  5147 000049F7 A801                <1> 	TEST	AL,ST_ERROR		; WERE THERE ANY OTHER ERRORS
  5148 000049F9 7405                <1> 	JZ	short CHECK_S1		; NO ERROR REPORTED
  5149 000049FB E849000000          <1> 	CALL	CHECK_ER		; ERROR REPORTED
  5150                              <1> CHECK_S1:
  5151 00004A00 803D[7B310100]00    <1> 	CMP	byte [DISK_STATUS1],0 	; SET STATUS FOR CALLER
  5152 00004A07 C3                  <1> 	RETn
  5153                              <1> 
  5154                              <1> ;----------------------------------------
  5155                              <1> ;	CHECK FIXED DISK STATUS BYTE	:
  5156                              <1> ;----------------------------------------
  5157                              <1> CHECK_ST:
  5158                              <1> 	;MOV	DX,HF_PORT+7		; GET THE STATUS
  5159 00004A08 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]
  5160 00004A0F 80C207              <1> 	add	dl, 7
  5161                              <1> 	
  5162                              <1> 	; 17/02/2016
  5163                              <1> 	;(http://wiki.osdev.org/ATA_PIO_Mode)
  5164                              <1> 	;"delay 400ns to allow drive to set new values of BSY and DRQ"
  5165 00004A12 EC                  <1> 	IN	AL,DX
  5166                              <1> 	;in	al, dx ; 100ns
  5167                              <1> 	;in	al, dx ; 100ns
  5168                              <1>  	;in	al, dx ; 100ns
  5169                              <1> 	NEWIODELAY ; 18/02/2016 (AWARD BIOS - 1999, 'CKST' in AHSDK.ASM)
  5169 00004A13 E6EB                <2>  out 0ebh,al
  5170                              <1> 	;
  5171 00004A15 A2[71310100]        <1> 	MOV	[HF_STATUS],AL
  5172 00004A1A B400                <1> 	MOV	AH,0
  5173 00004A1C A880                <1> 	TEST	AL,ST_BUSY		; IF STILL BUSY
  5174 00004A1E 751A                <1> 	JNZ	short CKST_EXIT		;  REPORT OK
  5175 00004A20 B4CC                <1> 	MOV	AH,WRITE_FAULT
  5176 00004A22 A820                <1> 	TEST	AL,ST_WRT_FLT		; CHECK FOR WRITE FAULT
  5177 00004A24 7514                <1> 	JNZ	short CKST_EXIT
  5178 00004A26 B4AA                <1> 	MOV	AH,NOT_RDY
  5179 00004A28 A840                <1> 	TEST	AL,ST_READY		; CHECK FOR NOT READY
  5180 00004A2A 740E                <1> 	JZ	short CKST_EXIT
  5181 00004A2C B440                <1> 	MOV	AH,BAD_SEEK
  5182 00004A2E A810                <1> 	TEST	AL,ST_SEEK_COMPL	; CHECK FOR SEEK NOT COMPLETE
  5183 00004A30 7408                <1> 	JZ	short CKST_EXIT
  5184 00004A32 B411                <1> 	MOV	AH,DATA_CORRECTED
  5185 00004A34 A804                <1> 	TEST	AL,ST_CORRCTD		; CHECK FOR CORRECTED ECC
  5186 00004A36 7502                <1> 	JNZ	short CKST_EXIT
  5187 00004A38 B400                <1> 	MOV	AH,0
  5188                              <1> CKST_EXIT:
  5189 00004A3A 8825[7B310100]      <1> 	MOV	[DISK_STATUS1],AH	; SET ERROR FLAG
  5190 00004A40 80FC11              <1> 	CMP	AH,DATA_CORRECTED	; KEEP GOING WITH DATA CORRECTED
  5191 00004A43 7403                <1> 	JZ	short CKST_EX1
  5192 00004A45 80FC00              <1> 	CMP	AH,0
  5193                              <1> CKST_EX1:
  5194 00004A48 C3                  <1> 	RETn
  5195                              <1> 
  5196                              <1> ;----------------------------------------
  5197                              <1> ;	CHECK FIXED DISK ERROR REGISTER :
  5198                              <1> ;----------------------------------------
  5199                              <1> CHECK_ER:
  5200                              <1> 	;MOV	DX, HF_PORT+1		; GET THE ERROR REGISTER
  5201 00004A49 668B15[F6FB0000]    <1> 	mov	dx, [HF_PORT]		;
  5202 00004A50 FEC2                <1> 	inc	dl
  5203 00004A52 EC                  <1> 	IN	AL,DX
  5204 00004A53 A2[72310100]        <1> 	MOV	[HF_ERROR],AL
  5205 00004A58 53                  <1> 	PUSH	eBX ; 21/02/2015
  5206 00004A59 B908000000          <1> 	MOV	eCX,8			; TEST ALL 8 BITS
  5207 00004A5E D0E0                <1> CK1:	SHL	AL,1			; MOVE NEXT ERROR BIT TO CARRY
  5208 00004A60 7202                <1> 	JC	short CK2		; FOUND THE ERROR
  5209 00004A62 E2FA                <1> 	LOOP	CK1			; KEEP TRYING
  5210 00004A64 BB[EAFB0000]        <1> CK2:	MOV	eBX, ERR_TBL		; COMPUTE ADDRESS OF
  5211 00004A69 01CB                <1> 	ADD	eBX,eCX			; ERROR CODE
  5212                              <1> 	;;MOV	AH,BYTE [CS:BX]		; GET ERROR CODE
  5213                              <1> 	;mov	ah, [bx]
  5214 00004A6B 8A23                <1> 	mov	ah, [ebx] ; 21/02/2015	
  5215 00004A6D 8825[7B310100]      <1> CKEX:	MOV	[DISK_STATUS1],AH	; SAVE ERROR CODE
  5216 00004A73 5B                  <1> 	POP	eBX
  5217 00004A74 80FC00              <1> 	CMP	AH,0
  5218 00004A77 C3                  <1> 	RETn
  5219                              <1> 
  5220                              <1> ;--------------------------------------------------------
  5221                              <1> ; CHECK_DMA						:
  5222                              <1> ;  -CHECK ES:BX AND # SECTORS TO MAKE SURE THAT IT WILL :
  5223                              <1> ;   FIT WITHOUT SEGMENT OVERFLOW.			:
  5224                              <1> ;  -ES:BX HAS BEEN REVISED TO THE FORMAT SSSS:000X	:
  5225                              <1> ;  -OK IF # SECTORS < 80H (7FH IF LONG READ OR WRITE)	:
  5226                              <1> ;  -OK IF # SECTORS = 80H (7FH) AND BX <= 00H (04H)	:
  5227                              <1> ;  -ERROR OTHERWISE					:
  5228                              <1> ;--------------------------------------------------------
  5229                              <1> CHECK_DMA:
  5230 00004A78 6650                <1> 	PUSH	AX			; SAVE REGISTERS
  5231 00004A7A 66B80080            <1> 	MOV	AX,8000H		; AH = MAX # SECTORS AL = MAX OFFSET
  5232 00004A7E F645FE02            <1>         TEST    byte [CMD_BLOCK+6],ECC_MODE
  5233 00004A82 7404                <1> 	JZ	short CKD1
  5234 00004A84 66B8047F            <1> 	MOV	AX,7F04H		; ECC IS 4 MORE BYTES
  5235 00004A88 3A65F9              <1> CKD1:	CMP	AH, [CMD_BLOCK+1] 	; NUMBER OF SECTORS
  5236 00004A8B 7706                <1> 	JA	short CKDOK		; IT WILL FIT
  5237 00004A8D 7208                <1> 	JB	short CKDERR		; TOO MANY
  5238 00004A8F 38D8                <1> 	CMP	AL,BL			; CHECK OFFSET ON MAX SECTORS
  5239 00004A91 7204                <1> 	JB	short CKDERR		; ERROR
  5240 00004A93 F8                  <1> CKDOK:	CLC				; CLEAR CARRY
  5241 00004A94 6658                <1> 	POP	AX
  5242 00004A96 C3                  <1> 	RETn				; NORMAL RETURN
  5243 00004A97 F9                  <1> CKDERR: STC				; INDICATE ERROR
  5244 00004A98 C605[7B310100]09    <1>         MOV     byte [DISK_STATUS1],DMA_BOUNDARY
  5245 00004A9F 6658                <1> 	POP	AX
  5246 00004AA1 C3                  <1> 	RETn
  5247                              <1> 
  5248                              <1> ;----------------------------------------
  5249                              <1> ;	SET UP ES:BX-> DISK PARMS	:
  5250                              <1> ;----------------------------------------
  5251                              <1> 					
  5252                              <1> ; INPUT -> DL = 0 based drive number
  5253                              <1> ; OUTPUT -> ES:BX = disk parameter table address
  5254                              <1> 
  5255                              <1> GET_VEC:
  5256                              <1> 	;SUB	AX,AX			; GET DISK PARAMETER ADDRESS
  5257                              <1> 	;MOV	ES,AX
  5258                              <1> 	;TEST	DL,1
  5259                              <1> 	;JZ	short GV_0
  5260                              <1> ;	LES	BX,[HF1_TBL_VEC] 	; ES:BX -> DRIVE PARAMETERS
  5261                              <1> ;	JMP	SHORT GV_EXIT
  5262                              <1> ;GV_0:
  5263                              <1> ;	LES	BX,[HF_TBL_VEC]		; ES:BX -> DRIVE PARAMETERS
  5264                              <1> ;
  5265                              <1> 	;xor	bh, bh
  5266 00004AA2 31DB                <1> 	xor	ebx, ebx
  5267 00004AA4 88D3                <1> 	mov	bl, dl
  5268                              <1> 	;;02/01/2015
  5269                              <1> 	;;shl	bl, 1			; port address offset
  5270                              <1> 	;;mov	ax, [bx+hd_ports]	; Base port address (1F0h, 170h)
  5271                              <1> 	;;shl	bl, 1			; dpt pointer offset
  5272 00004AA6 C0E302              <1> 	shl	bl, 2	;;
  5273                              <1> 	;add	bx, HF_TBL_VEC		; Disk parameter table pointer
  5274 00004AA9 81C3[80310100]      <1> 	add	ebx, HF_TBL_VEC ; 21/02/2015
  5275                              <1> 	;push	word [bx+2]		; dpt segment
  5276                              <1> 	;pop	es
  5277                              <1> 	;mov	bx, [bx]		; dpt offset
  5278 00004AAF 8B1B                <1> 	mov	ebx, [ebx]		
  5279                              <1> ;GV_EXIT:
  5280 00004AB1 C3                  <1> 	RETn
  5281                              <1> 
  5282                              <1> hdc1_int: ; 21/02/2015
  5283                              <1> ;--- HARDWARE INT 76H -- ( IRQ LEVEL  14 ) ----------------------
  5284                              <1> ;								:
  5285                              <1> ;	FIXED DISK INTERRUPT ROUTINE				:
  5286                              <1> ;								:
  5287                              <1> ;----------------------------------------------------------------
  5288                              <1> 
  5289                              <1> ; 22/12/2014
  5290                              <1> ; IBM PC-XT Model 286 System BIOS Source Code - DISK.ASM (HD_INT)
  5291                              <1> ;	 '11/15/85'
  5292                              <1> ; AWARD BIOS 1999 (D1A0622) 
  5293                              <1> ;	Source Code - ATORGS.ASM (INT_HDISK, INT_HDISK1)
  5294                              <1> 
  5295                              <1> ;int_76h:
  5296                              <1> HD_INT:
  5297 00004AB2 6650                <1> 	PUSH	AX
  5298 00004AB4 1E                  <1> 	PUSH	DS
  5299                              <1> 	;CALL	DDS
  5300                              <1> 	; 21/02/2015 (32 bit, 386 pm modification)
  5301 00004AB5 66B81000            <1> 	mov	ax, KDATA
  5302 00004AB9 8ED8                <1> 	mov 	ds, ax
  5303                              <1> 	;
  5304                              <1> 	;;MOV	@HF_INT_FLAG,0FFH	; ALL DONE
  5305                              <1>         ;mov     byte [CS:HF_INT_FLAG], 0FFh
  5306 00004ABB C605[73310100]FF    <1> 	mov	byte [HF_INT_FLAG], 0FFh
  5307                              <1> 	;
  5308 00004AC2 6652                <1> 	push	dx
  5309 00004AC4 66BAF701            <1> 	mov	dx, HDC1_BASEPORT+7	; Status Register (1F7h)
  5310                              <1> 					; Clear Controller
  5311                              <1> Clear_IRQ1415:				; (Award BIOS - 1999)
  5312 00004AC8 EC                  <1> 	in	al, dx			;
  5313 00004AC9 665A                <1> 	pop	dx
  5314                              <1> 	NEWIODELAY
  5314 00004ACB E6EB                <2>  out 0ebh,al
  5315                              <1> 	;
  5316 00004ACD B020                <1> 	MOV	AL,EOI			; NON-SPECIFIC END OF INTERRUPT
  5317 00004ACF E6A0                <1> 	OUT	INTB00,AL		; FOR CONTROLLER #2
  5318                              <1> 	;JMP	$+2			; WAIT
  5319                              <1> 	NEWIODELAY
  5319 00004AD1 E6EB                <2>  out 0ebh,al
  5320 00004AD3 E620                <1> 	OUT	INTA00,AL		; FOR CONTROLLER #1
  5321 00004AD5 1F                  <1> 	POP	DS
  5322                              <1> 	;STI				; RE-ENABLE INTERRUPTS
  5323                              <1> 	;MOV	AX,9100H		; DEVICE POST
  5324                              <1> 	;INT	15H			;  INTERRUPT
  5325                              <1> irq15_iret: ; 25/02/2015
  5326 00004AD6 6658                <1> 	POP	AX
  5327 00004AD8 CF                  <1> 	IRETd				; RETURN FROM INTERRUPT
  5328                              <1> 
  5329                              <1> hdc2_int: ; 21/02/2015
  5330                              <1> ;++++ HARDWARE INT 77H ++ ( IRQ LEVEL  15 ) +++++++++++++++++++++
  5331                              <1> ;								:
  5332                              <1> ;	FIXED DISK INTERRUPT ROUTINE				:
  5333                              <1> ;								:
  5334                              <1> ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  5335                              <1> 
  5336                              <1> ;int_77h:
  5337                              <1> HD1_INT:
  5338 00004AD9 6650                <1> 	PUSH	AX
  5339                              <1> 	; Check if that is a spurious IRQ (from slave PIC)
  5340                              <1> 	; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  5341 00004ADB B00B                <1> 	mov	al, 0Bh  ; In-Service Register
  5342 00004ADD E6A0                <1> 	out	0A0h, al
  5343 00004ADF EB00                <1>         jmp short $+2
  5344 00004AE1 EB00                <1> 	jmp short $+2
  5345 00004AE3 E4A0                <1> 	in	al, 0A0h
  5346 00004AE5 2480                <1> 	and 	al, 80h ; bit 7 (is it real IRQ 15 or fake?)
  5347 00004AE7 74ED                <1> 	jz	short irq15_iret ; Fake (spurious)IRQ, do not send EOI)
  5348                              <1> 	;
  5349 00004AE9 1E                  <1> 	PUSH	DS
  5350                              <1> 	;CALL	DDS
  5351                              <1> 	; 21/02/2015 (32 bit, 386 pm modification)
  5352 00004AEA 66B81000            <1> 	mov	ax, KDATA
  5353 00004AEE 8ED8                <1> 	mov 	ds, ax
  5354                              <1> 	;
  5355                              <1> 	;;MOV	@HF_INT_FLAG,0FFH	; ALL DONE
  5356                              <1>         ;or      byte [CS:HF_INT_FLAG],0C0h 
  5357 00004AF0 800D[73310100]C0    <1> 	or	byte [HF_INT_FLAG], 0C0h
  5358                              <1> 	;
  5359 00004AF7 6652                <1> 	push	dx
  5360 00004AF9 66BA7701            <1> 	mov	dx, HDC2_BASEPORT+7	; Status Register (177h)
  5361                              <1> 					; Clear Controller (Award BIOS 1999)
  5362 00004AFD EBC9                <1> 	jmp	short Clear_IRQ1415
  5363                              <1> 
  5364                              <1> 
  5365                              <1> ;%include 'diskdata.inc' ; 11/03/2015
  5366                              <1> ;%include 'diskbss.inc' ; 11/03/2015
  5367                              <1> 
  5368                              <1> 
  5369                              <1> ;////////////////////////////////////////////////////////////////////
  5370                              <1> ;; END OF DISK I/O SYTEM ///
  2129                                  %include 'memory.s'  ; 09/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - memory.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 15/10/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; memory.inc (18/10/2015)
    15                              <1> ; ****************************************************************************
    16                              <1> 
    17                              <1> ; MEMORY.ASM - Retro UNIX 386 v1 MEMORY MANAGEMENT FUNCTIONS (PROCEDURES)
    18                              <1> ; Retro UNIX 386 v1 Kernel (unix386.s, v0.2.0.14) - MEMORY.INC
    19                              <1> ; Last Modification: 18/10/2015
    20                              <1> 
    21                              <1> ; ///////// MEMORY MANAGEMENT FUNCTIONS (PROCEDURES) ///////////////
    22                              <1> 
    23                              <1> ;;04/11/2014 (unix386.s)	
    24                              <1> ;PDE_A_PRESENT	equ	1		; Present flag for PDE
    25                              <1> ;PDE_A_WRITE	equ 	2		; Writable (write permission) flag
    26                              <1> ;PDE_A_USER	equ	4		; User (non-system/kernel) page flag
    27                              <1> ;;
    28                              <1> ;PTE_A_PRESENT	equ	1		; Present flag for PTE (bit 0)
    29                              <1> ;PTE_A_WRITE	equ 	2		; Writable (write permission) flag (bit 1)
    30                              <1> ;PTE_A_USER	equ	4		; User (non-system/kernel) page flag (bit 2)
    31                              <1> ;PTE_A_ACCESS   equ	32		; Accessed flag (bit 5) ; 09/03/2015
    32                              <1> 
    33                              <1> ; 27/04/2015
    34                              <1> ; 09/03/2015
    35                              <1> PAGE_SIZE 	equ 4096		; page size in bytes
    36                              <1> PAGE_SHIFT 	equ 12			; page table shift count
    37                              <1> PAGE_D_SHIFT 	equ 22	; 12 + 10	; page directory shift count
    38                              <1> PAGE_OFF	equ 0FFFh		; 12 bit byte offset in page frame
    39                              <1> PTE_MASK 	equ 03FFh		; page table entry mask
    40                              <1> PTE_DUPLICATED  equ 200h		; duplicated page sign (AVL bit 0)
    41                              <1> PDE_A_CLEAR	equ 0F000h		; to clear PDE attribute bits
    42                              <1> PTE_A_CLEAR	equ 0F000h		; to clear PTE attribute bits
    43                              <1> LOGIC_SECT_SIZE equ 512			; logical sector size
    44                              <1> ERR_MAJOR_PF	equ 0E0h		; major error: page fault
    45                              <1> ERR_MINOR_IM	equ 4 ;15/10/2016 (1->4); insufficient (out of) memory
    46                              <1> ERR_MINOR_PV	equ 6 ;15/10/2016 (1->4); protection violation
    47                              <1> SWP_DISK_READ_ERR 	   equ 40
    48                              <1> SWP_DISK_NOT_PRESENT_ERR   equ 41
    49                              <1> SWP_SECTOR_NOT_PRESENT_ERR equ 42
    50                              <1> SWP_NO_FREE_SPACE_ERR      equ 43
    51                              <1> SWP_DISK_WRITE_ERR         equ 44
    52                              <1> SWP_NO_PAGE_TO_SWAP_ERR    equ 45
    53                              <1> PTE_A_ACCESS_BIT equ 5  ; Bit 5 (accessed flag)        
    54                              <1> SECTOR_SHIFT     equ 3  ; sector shift (to convert page block number)
    55                              <1> ; 12/07/2016
    56                              <1> PTE_SHARED	 equ 400h		; AVL bit 1, direct memory access bit	
    57                              <1> 					; (Indicates that the page is not allocated
    58                              <1> 					; for the process, it is a shared or system
    59                              <1>                                         ; page, it must not be deallocated!)
    60                              <1> ;
    61                              <1> ;; Retro Unix 386 v1 - paging method/principles
    62                              <1> ;;
    63                              <1> ;; 10/10/2014
    64                              <1> ;; RETRO UNIX 386 v1 - PAGING METHOD/PRINCIPLES
    65                              <1> ;;
    66                              <1> ;; KERNEL PAGE MAP: 1 to 1 physical memory page map
    67                              <1> ;;	(virtual address = physical address)
    68                              <1> ;; KERNEL PAGE TABLES:
    69                              <1> ;;	Kernel page directory and all page tables are
    70                              <1> ;;	on memory as initialized, as equal to physical memory
    71                              <1> ;;	layout. Kernel pages can/must not be swapped out/in.
    72                              <1> ;;
    73                              <1> ;;	what for: User pages may be swapped out, when accessing
    74                              <1> ;;	a page in kernel/system mode, if it would be swapped out,
    75                              <1> ;;	kernel would have to swap it in! But it is also may be
    76                              <1> ;;	in use by a user process. (In system/kernel mode
    77                              <1> ;;	kernel can access all memory pages even if they are
    78                              <1> ;;	reserved/allocated for user processes. Swap out/in would
    79                              <1> ;;	cause conflicts.) 
    80                              <1> ;;	
    81                              <1> ;;	As result of these conditions,
    82                              <1> ;;	all kernel pages must be initialized as equal to 
    83                              <1> ;;	physical layout for preventing page faults. 
    84                              <1> ;;	Also, calling "allocate page" procedure after
    85                              <1> ;;	a page fault can cause another page fault (double fault)
    86                              <1> ;;	if all kernel page tables would not be initialized.
    87                              <1> ;;
    88                              <1> ;;	[first_page] = Beginning of users space, as offset to 
    89                              <1> ;;	memory allocation table. (double word aligned)
    90                              <1> ;;
    91                              <1> ;;	[next_page] = first/next free space to be searched
    92                              <1> ;;	as offset to memory allocation table. (dw aligned)
    93                              <1> ;;
    94                              <1> ;;	[last_page] = End of memory (users space), as offset
    95                              <1> ;;	to memory allocation table. (double word aligned)
    96                              <1> ;;
    97                              <1> ;; USER PAGE TABLES:
    98                              <1> ;;	Demand paging (& 'copy on write' allocation method) ...
    99                              <1> ;;		'ready only' marked copies of the 
   100                              <1> ;;		parent process's page table entries (for
   101                              <1> ;;		same physical memory).
   102                              <1> ;;		(A page will be copied to a new page after
   103                              <1> ;;		 if it causes R/W page fault.)
   104                              <1> ;;
   105                              <1> ;;	Every user process has own (different)
   106                              <1> ;;	page directory and page tables.	
   107                              <1> ;;
   108                              <1> ;;	Code starts at virtual address 0, always.
   109                              <1> ;;	(Initial value of EIP is 0 in user mode.)
   110                              <1> ;;	(Programs can be written/developed as simple
   111                              <1> ;;	 flat memory programs.)
   112                              <1> ;;
   113                              <1> ;; MEMORY ALLOCATION STRATEGY:
   114                              <1> ;;	Memory page will be allocated by kernel only 
   115                              <1> ;;		(in kernel/system mode only).
   116                              <1> ;;	* After a
   117                              <1> ;;	  - 'not present' page fault
   118                              <1> ;;	  - 'writing attempt on read only page' page fault 	 	
   119                              <1> ;;	* For loading (opening, reading) a file or disk/drive
   120                              <1> ;;	* As responce to 'allocate additional memory blocks' 
   121                              <1> ;;	  request by running process.
   122                              <1> ;;	* While creating a process, allocating a new buffer,
   123                              <1> ;;	  new page tables etc.
   124                              <1> ;;
   125                              <1> ;;	At first,
   126                              <1> ;;	- 'allocate page' procedure will be called;
   127                              <1> ;,	   if it will return with a valid (>0) physical address
   128                              <1> ;;	   (that means the relevant M.A.T. bit has been RESET)	
   129                              <1> ;;	   relevant memory page/block will be cleared (zeroed).
   130                              <1> ;;	- 'allocate page' will be called for allocating page
   131                              <1> ;;	   directory, page table and running space (data/code).
   132                              <1> ;;	- every successful 'allocate page' call will decrease
   133                              <1> ;;	  'free_pages' count (pointer).
   134                              <1> ;;	- 'out of (insufficient) memory error' will be returned
   135                              <1> ;;	  if 'free_pages' points to a ZERO.
   136                              <1> ;;	- swapping out and swapping in (if it is not a new page)
   137                              <1> ;;	  procedures will be called as responce to 'out of memory'
   138                              <1> ;;	  error except errors caused by attribute conflicts.
   139                              <1> ;;	 (swapper functions)	 
   140                              <1> ;;					
   141                              <1> ;;	At second,
   142                              <1> ;;	- page directory entry will be updated then page table
   143                              <1> ;;	  entry will be updated.		
   144                              <1> ;;
   145                              <1> ;; MEMORY ALLOCATION TABLE FORMAT:
   146                              <1> ;;	- M.A.T. has a size according to available memory as
   147                              <1> ;;	  follows:
   148                              <1> ;;		  - 1 (allocation) bit per 1 page (4096 bytes)
   149                              <1> ;;		  - a bit with value of 0 means allocated page
   150                              <1> ;;		  - a bit with value of 1 means a free page
   151                              <1> ;,	- 'free_pages' pointer holds count of free pages
   152                              <1> ;;	  depending on M.A.T.
   153                              <1> ;;		(NOTE: Free page count will not be checked
   154                              <1> ;;		again -on M.A.T.- after initialization. 
   155                              <1> ;;		Kernel will trust on initial count.)
   156                              <1> ;,	- 'free_pages' count will be decreased by allocation
   157                              <1> ;;	  and it will be increased by deallocation procedures.
   158                              <1> ;;	
   159                              <1> ;;	- Available memory will be calculated during
   160                              <1> ;;	  the kernel's initialization stage (in real mode).
   161                              <1> ;;	  Memory allocation table and kernel page tables 
   162                              <1> ;;	  will be formatted/sized as result of available
   163                              <1> ;;	  memory calculation before paging is enabled.
   164                              <1> ;;
   165                              <1> ;; For 4GB Available/Present Memory: (max. possible memory size)
   166                              <1> ;;	- Memory Allocation Table size will be 128 KB.
   167                              <1> ;;	- Memory allocation for kernel page directory size 
   168                              <1> ;;	  is always 4 KB. (in addition to total allocation size
   169                              <1> ;;	  for page tables)
   170                              <1> ;;	- Memory allocation for kernel page tables (1024 tables)
   171                              <1> ;;	  is 4 MB (1024*4*1024 bytes).
   172                              <1> ;;	- User (available) space will be started 
   173                              <1> ;;	  at 6th MB of the memory (after 1MB+4MB).
   174                              <1> ;;	- The first 640 KB is for kernel's itself plus
   175                              <1> ;;	  memory allocation table and kernel's page directory
   176                              <1> ;;	  (D0000h-EFFFFh may be used as kernel space...)	
   177                              <1> ;;	- B0000h to B7FFFh address space (32 KB) will be used
   178                              <1> ;; 	  for buffers.
   179                              <1> ;;	- ROMBIOS, VIDEO BUFFER and VIDEO ROM space are reserved.
   180                              <1> ;,	  (A0000h-AFFFFh, C0000h-CFFFFh, F0000h-FFFFFh)
   181                              <1> ;;	- Kernel page tables start at 100000h (2nd MB)
   182                              <1> ;;
   183                              <1> ;; For 1GB Available Memory:
   184                              <1> ;;	- Memory Allocation Table size will be 32 KB.
   185                              <1> ;;	- Memory allocation for kernel page directory size 
   186                              <1> ;;	  is always 4 KB. (in addition to total allocation size
   187                              <1> ;;	  for page tables)
   188                              <1> ;;	- Memory allocation for kernel page tables (256 tables)
   189                              <1> ;;	  is 1 MB (256*4*1024 bytes).
   190                              <1> ;;	- User (available) space will be started 
   191                              <1> ;;	  at 3th MB of the memory (after 1MB+1MB).
   192                              <1> ;;	- The first 640 KB is for kernel's itself plus
   193                              <1> ;;	  memory allocation table and kernel's page directory
   194                              <1> ;;	  (D0000h-EFFFFh may be used as kernel space...)	
   195                              <1> ;;	- B0000h to B7FFFh address space (32 KB) will be used
   196                              <1> ;; 	  for buffers.
   197                              <1> ;;	- ROMBIOS, VIDEO BUFFER and VIDEO ROM space are reserved.
   198                              <1> ;,	  (A0000h-AFFFFh, C0000h-CFFFFh, F0000h-FFFFFh)
   199                              <1> ;;	- Kernel page tables start at 100000h (2nd MB).	
   200                              <1> ;;
   201                              <1> ;;
   202                              <1> 
   203                              <1> 
   204                              <1> ;;************************************************************************************
   205                              <1> ;; 
   206                              <1> ;; RETRO UNIX 386 v1 - Paging (Method for Copy On Write paging principle)
   207                              <1> ;; DEMAND PAGING - PARENT&CHILD PAGE TABLE DUPLICATION PRINCIPLES (23/04/2015)
   208                              <1> 
   209                              <1> ;; Main factor: "sys fork" system call 
   210                              <1> ;;	
   211                              <1> ;; 		FORK
   212                              <1> ;;                      |----> parent - duplicated PTEs, read only pages
   213                              <1> ;;  writable pages ---->|
   214                              <1> ;;                      |----> child - duplicated PTEs, read only pages
   215                              <1> ;; 
   216                              <1> ;; AVL bit (0) of Page Table Entry is used as duplication sign 
   217                              <1> ;; 
   218                              <1> ;; AVL Bit 0 [PTE Bit 9] = 'Duplicated PTE belongs to child' sign/flag (if it is set)
   219                              <1> ;; Note: Dirty bit (PTE bit 6) may be used instead of AVL bit 0 (PTE bit 9)
   220                              <1> ;;       -while R/W bit is 0-. 
   221                              <1> ;; 
   222                              <1> ;; Duplicate page tables with writable pages (the 1st sys fork in the process):
   223                              <1> ;; # Parent's Page Table Entries are updated to point same pages as read only, 
   224                              <1> ;;   as duplicated PTE bit  -AVL bit 0, PTE bit 9- are reset/clear.
   225                              <1> ;; # Then Parent's Page Table is copied to Child's Page Table.
   226                              <1> ;; # Child's Page Table Entries are updated as duplicated child bit
   227                              <1> ;;   -AVL bit 0, PTE bit 9- is set.	  
   228                              <1> ;; 
   229                              <1> ;; Duplicate page tables with read only pages (several sys fork system calls):
   230                              <1> ;; # Parent's read only pages are copied to new child pages. 
   231                              <1> ;;   Parent's PTE attributes are not changed.
   232                              <1> ;;   (Because, there is another parent-child fork before this fork! We must not
   233                              <1> ;;    destroy/mix previous fork result).
   234                              <1> ;; # Child's Page Table Entries (which are corresponding to Parent's 
   235                              <1> ;;   read only pages) are set as writable (while duplicated PTE bit is clear). 
   236                              <1> ;; # Parent's PTEs with writable page attribute are updated to point same pages 
   237                              <1> ;;   as read only, (while) duplicated PTE bit is reset (clear).
   238                              <1> ;; # Parent's Page Table Entries (with writable page attribute) are duplicated 
   239                              <1> ;;   as Child's Page Table Entries without copying actual page.
   240                              <1> ;; # Child 's Page Table Entries (which are corresponding to Parent's writable 
   241                              <1> ;;   pages) are updated as duplicated PTE bit (AVL bit 0, PTE bit 9- is set.
   242                              <1> ;; 
   243                              <1> ;; !? WHAT FOR (duplication after duplication):
   244                              <1> ;; In UNIX method for sys fork (a typical 'fork' application in /etc/init)
   245                              <1> ;; program/executable code continues from specified location as child process, 
   246                              <1> ;; returns back previous code location as parent process, every child after 
   247                              <1> ;; every sys fork uses last image of code and data just prior the fork.
   248                              <1> ;; Even if the parent code changes data, the child will not see the changed data 
   249                              <1> ;; after the fork. In Retro UNIX 8086 v1, parent's process segment (32KB)
   250                              <1> ;; was copied to child's process segment (all of code and data) according to
   251                              <1> ;; original UNIX v1 which copies all of parent process code and data -core- 
   252                              <1> ;; to child space -core- but swaps that core image -of child- on to disk.
   253                              <1> ;; If I (Erdogan Tan) would use a method of to copy parent's core
   254                              <1> ;; (complete running image of parent process) to the child process; 
   255                              <1> ;; for big sizes, i would force Retro UNIX 386 v1 to spend many memory pages 
   256                              <1> ;; and times only for a sys fork. (It would excessive reservation for sys fork,
   257                              <1> ;; because sys fork usually is prior to sys exec; sys exec always establishes
   258                              <1> ;; a new/fresh core -running space-, by clearing all code/data content). 
   259                              <1> ;; 'Read Only' page flag ensures page fault handler is needed only for a few write
   260                              <1> ;; attempts between sys fork and sys exec, not more... (I say so by thinking 
   261                              <1> ;; of "/etc/init" content, specially.) sys exec will clear page tables and
   262                              <1> ;; new/fresh pages will be used to load and run new executable/program.
   263                              <1> ;; That is what for i have preferred "copy on write", "duplication" method
   264                              <1> ;; for sharing same read only pages between parent and child processes.
   265                              <1> ;; That is a pitty i have to use new private flag (AVL bit 0, "duplicated PTE 
   266                              <1> ;; belongs to child" sign) for cooperation on duplicated pages between a parent 
   267                              <1> ;; and it's child processes; otherwise parent process would destroy data belongs
   268                              <1> ;; to its child or vice versa; or some pages would remain unclaimed 
   269                              <1> ;; -deallocation problem-.
   270                              <1> ;; Note: to prevent conflicts, read only pages must not be swapped out... 
   271                              <1> ;; 
   272                              <1> ;; WHEN PARENT TRIES TO WRITE IT'S READ ONLY (DUPLICATED) PAGE:
   273                              <1> ;; # Page fault handler will do those:
   274                              <1> ;;   - 'Duplicated PTE' flag (PTE bit 9) is checked (on the failed PTE).
   275                              <1> ;;   - If it is reset/clear, there is a child uses same page.
   276                              <1> ;;   - Parent's read only page -previous page- is copied to a new writable page. 
   277                              <1> ;;   - Parent's PTE is updated as writable page, as unique page (AVL=0)
   278                              <1> ;;   - (Page fault handler whill check this PTE later, if child process causes to
   279                              <1> ;;     page fault due to write attempt on read only page. Of course, the previous 
   280                              <1> ;;     read only page will be converted to writable and unique page which belongs
   281                              <1> ;;     to child process.)	
   282                              <1> ;; WHEN CHILD TRIES TO WRITE IT'S READ ONLY (DUPLICATED) PAGE:
   283                              <1> ;; # Page fault handler will do those:
   284                              <1> ;;   - 'Duplicated PTE' flag (PTE bit 9) is checked (on the failed PTE).
   285                              <1> ;;   - If it is set, there is a parent uses -or was using- same page.
   286                              <1> ;;   - Same PTE address within parent's page table is checked if it has same page
   287                              <1> ;;     address or not. 
   288                              <1> ;;   - If parent's PTE has same address, child will continue with a new writable page.
   289                              <1> ;;     Parent's PTE will point to same (previous) page as writable, unique (AVL=0).	
   290                              <1> ;;   - If parent's PTE has different address, child will continue with it's 
   291                              <1> ;;     own/same page but read only flag (0) will be changed to writable flag (1) and
   292                              <1> ;;     'duplicated PTE (belongs to child)' flag/sign will be cleared/reset. 	  	
   293                              <1> ;; 
   294                              <1> ;; NOTE: When a child process is terminated, read only flags of parent's page tables
   295                              <1> ;;       will be set as writable (and unique) in case of child process was using 
   296                              <1> ;;       same pages with duplicated child PTE sign... Depending on sys fork and 
   297                              <1> ;;       duplication method details, it is not possible multiple child processes
   298                              <1> ;;       were using same page with duplicated PTEs.
   299                              <1> ;; 
   300                              <1> ;;************************************************************************************   
   301                              <1> 
   302                              <1> ;; 08/10/2014
   303                              <1> ;; 11/09/2014 - Retro UNIX 386 v1 PAGING (further) draft
   304                              <1> ;;		by Erdogan Tan (Based on KolibriOS 'memory.inc')
   305                              <1> 
   306                              <1> ;; 'allocate_page' code is derived and modified from KolibriOS
   307                              <1> ;; 'alloc_page' procedure in 'memory.inc' 
   308                              <1> ;; (25/08/2014, Revision: 5057) file 
   309                              <1> ;; by KolibriOS Team (2004-2012)
   310                              <1> 
   311                              <1> allocate_page:
   312                              <1> 	; 01/07/2015
   313                              <1> 	; 05/05/2015
   314                              <1> 	; 30/04/2015
   315                              <1> 	; 16/10/2014
   316                              <1> 	; 08/10/2014
   317                              <1> 	; 09/09/2014 (Retro UNIX 386 v1 - beginning)
   318                              <1> 	;
   319                              <1> 	; INPUT -> none
   320                              <1> 	;
   321                              <1> 	; OUTPUT ->
   322                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF THE ALLOCATED PAGE
   323                              <1> 	;	(corresponding MEMORY ALLOCATION TABLE bit is RESET)
   324                              <1> 	;
   325                              <1> 	;	CF = 1 and EAX = 0 
   326                              <1> 	; 		   if there is not a free page to be allocated	
   327                              <1> 	;
   328                              <1> 	; Modified Registers -> none (except EAX)
   329                              <1> 	;
   330 00004AFF A1[E8300100]        <1> 	mov	eax, [free_pages]
   331 00004B04 21C0                <1> 	and	eax, eax
   332 00004B06 7438                <1> 	jz	short out_of_memory
   333                              <1> 	;
   334 00004B08 53                  <1> 	push	ebx
   335 00004B09 51                  <1> 	push	ecx
   336                              <1> 	;
   337 00004B0A BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table offset
   338 00004B0F 89D9                <1> 	mov	ecx, ebx
   339                              <1>  				     ; NOTE: 32 (first_page) is initial
   340                              <1> 				     ; value of [next_page].
   341                              <1> 				     ; It points to the first available
   342                              <1> 				     ; page block for users (ring 3) ...	
   343                              <1> 				     ; (MAT offset 32 = 1024/32)	
   344                              <1> 				     ; (at the of the first 4 MB)		
   345 00004B11 031D[EC300100]      <1> 	add	ebx, [next_page] ; Free page searching starts from here
   346                              <1> 				 ; next_free_page >> 5
   347 00004B17 030D[F0300100]      <1> 	add	ecx, [last_page] ; Free page searching ends here
   348                              <1> 				 ; (total_pages - 1) >> 5
   349                              <1> al_p_scan:
   350 00004B1D 39CB                <1> 	cmp	ebx, ecx
   351 00004B1F 770A                <1> 	ja	short al_p_notfound
   352                              <1> 	;
   353                              <1> 	; 01/07/2015
   354                              <1> 	; AMD64 Architecture Programmers Manual
   355                              <1> 	; Volume 3:
   356                              <1> 	; General-Purpose and System Instructions
   357                              <1> 	;
   358                              <1> 	; BSF - Bit Scan Forward
   359                              <1> 	;
   360                              <1> 	;   Searches the value in a register or a memory location
   361                              <1> 	;   (second operand) for the least-significant set bit. 
   362                              <1> 	;   If a set bit is found, the instruction clears the zero flag (ZF)
   363                              <1> 	;   and stores the index of the least-significant set bit in a destination
   364                              <1> 	;   register (first operand). If the second operand contains 0, 
   365                              <1> 	;   the instruction sets ZF to 1 and does not change the contents of the 
   366                              <1> 	;   destination register. The bit index is an unsigned offset from bit 0 
   367                              <1> 	;   of the searched value
   368                              <1> 	;
   369 00004B21 0FBC03              <1> 	bsf	eax, [ebx] ; Scans source operand for first bit set (1).
   370                              <1> 			   ; Clear ZF if a bit is found set (1) and 
   371                              <1> 			   ; loads the destination with an index to
   372                              <1> 			   ; first set bit. (0 -> 31) 
   373                              <1> 			   ; Sets ZF to 1 if no bits are found set.
   374 00004B24 7525                <1> 	jnz	short al_p_found ; ZF = 0 -> a free page has been found
   375                              <1> 			 ;
   376                              <1> 			 ; NOTE:  a Memory Allocation Table bit 
   377                              <1> 			 ;	  with value of 1 means 
   378                              <1> 			 ;	  the corresponding page is free 
   379                              <1> 			 ;	  (Retro UNIX 386 v1 feature only!)
   380 00004B26 83C304              <1> 	add	ebx, 4
   381                              <1> 			 ; We return back for searching next page block
   382                              <1> 			 ; NOTE: [free_pages] is not ZERO; so, 
   383                              <1> 			 ;	 we always will find at least 1 free page here.
   384 00004B29 EBF2                <1>         jmp     short al_p_scan
   385                              <1> 	;
   386                              <1> al_p_notfound:
   387 00004B2B 81E900001000        <1> 	sub	ecx, MEM_ALLOC_TBL
   388 00004B31 890D[EC300100]      <1> 	mov	[next_page], ecx ; next/first free page = last page 
   389                              <1> 				 ; (deallocate_page procedure will change it)
   390 00004B37 31C0                <1> 	xor	eax, eax
   391 00004B39 A3[E8300100]        <1> 	mov	[free_pages], eax ; 0
   392 00004B3E 59                  <1> 	pop	ecx
   393 00004B3F 5B                  <1> 	pop	ebx
   394                              <1> 	;
   395                              <1> out_of_memory:
   396 00004B40 E85B040000          <1> 	call	swap_out
   397 00004B45 7325                <1> 	jnc	short al_p_ok  ; [free_pages] = 0, re-allocation by swap_out
   398                              <1> 	;
   399 00004B47 29C0                <1> 	sub 	eax, eax ; 0
   400 00004B49 F9                  <1> 	stc
   401 00004B4A C3                  <1> 	retn
   402                              <1> 
   403                              <1> al_p_found:
   404 00004B4B 89D9                <1> 	mov	ecx, ebx
   405 00004B4D 81E900001000        <1> 	sub	ecx, MEM_ALLOC_TBL
   406 00004B53 890D[EC300100]      <1> 	mov	[next_page], ecx ; Set first free page searching start
   407                              <1> 				 ; address/offset (to the next)
   408 00004B59 FF0D[E8300100]      <1>         dec     dword [free_pages] ; 1 page has been allocated (X = X-1) 
   409                              <1> 	;
   410 00004B5F 0FB303              <1> 	btr	[ebx], eax	 ; The destination bit indexed by the source value
   411                              <1> 				 ; is copied into the Carry Flag and then cleared
   412                              <1> 				 ; in the destination.
   413                              <1> 				 ;
   414                              <1> 				 ; Reset the bit which is corresponding to the 
   415                              <1> 				 ; (just) allocated page.
   416                              <1> 	; 01/07/2015 (4*8 = 32, 1 allocation byte = 8 pages)	
   417 00004B62 C1E103              <1> 	shl	ecx, 3		 ; (page block offset * 32) + page index
   418 00004B65 01C8                <1> 	add	eax, ecx	 ; = page number
   419 00004B67 C1E00C              <1> 	shl	eax, 12		 ; physical address of the page (flat/real value)
   420                              <1> 	; EAX = physical address of memory page
   421                              <1> 	;
   422                              <1> 	; NOTE: The relevant page directory and page table entry will be updated
   423                              <1> 	;       according to this EAX value...
   424 00004B6A 59                  <1> 	pop	ecx
   425 00004B6B 5B                  <1> 	pop	ebx
   426                              <1> al_p_ok:
   427 00004B6C C3                  <1> 	retn
   428                              <1> 
   429                              <1> 
   430                              <1> make_page_dir:
   431                              <1> 	; 18/04/2015
   432                              <1> 	; 12/04/2015
   433                              <1> 	; 23/10/2014
   434                              <1> 	; 16/10/2014
   435                              <1> 	; 09/10/2014 ; (Retro UNIX 386 v1 - beginning)
   436                              <1> 	;
   437                              <1> 	; INPUT ->
   438                              <1> 	;	none
   439                              <1> 	; OUTPUT ->
   440                              <1> 	;	(EAX = 0)
   441                              <1> 	;	cf = 1 -> insufficient (out of) memory error
   442                              <1> 	;	cf = 0 ->
   443                              <1> 	;	u.pgdir = page directory (physical) address of the current
   444                              <1> 	;		  process/user.
   445                              <1> 	;
   446                              <1> 	; Modified Registers -> EAX
   447                              <1> 	;
   448 00004B6D E88DFFFFFF          <1> 	call	allocate_page
   449 00004B72 7216                <1> 	jc	short mkpd_error
   450                              <1> 	;
   451 00004B74 A3[70470100]        <1> 	mov	[u.pgdir], eax    ; Page dir address for current user/process
   452                              <1> 				  ; (Physical address)
   453                              <1> clear_page:
   454                              <1> 	; 18/04/2015
   455                              <1> 	; 09/10/2014 ; (Retro UNIX 386 v1 - beginning)
   456                              <1> 	;
   457                              <1> 	; INPUT ->
   458                              <1> 	;	EAX = physical address of the page
   459                              <1> 	; OUTPUT ->
   460                              <1> 	;	all bytes of the page will be cleared
   461                              <1> 	;
   462                              <1> 	; Modified Registers -> none
   463                              <1> 	;
   464 00004B79 57                  <1> 	push	edi
   465 00004B7A 51                  <1> 	push	ecx
   466 00004B7B 50                  <1> 	push	eax
   467 00004B7C B900040000          <1> 	mov	ecx, PAGE_SIZE / 4
   468 00004B81 89C7                <1> 	mov	edi, eax
   469 00004B83 31C0                <1> 	xor	eax, eax
   470 00004B85 F3AB                <1> 	rep	stosd
   471 00004B87 58                  <1> 	pop	eax
   472 00004B88 59                  <1> 	pop	ecx
   473 00004B89 5F                  <1> 	pop	edi
   474                              <1> mkpd_error:
   475                              <1> mkpt_error:
   476 00004B8A C3                  <1> 	retn
   477                              <1> 
   478                              <1> make_page_table:
   479                              <1> 	; 23/06/2015
   480                              <1> 	; 18/04/2015
   481                              <1> 	; 12/04/2015
   482                              <1> 	; 16/10/2014
   483                              <1> 	; 09/10/2014 ; (Retro UNIX 386 v1 - beginning)
   484                              <1> 	;
   485                              <1> 	; INPUT ->
   486                              <1> 	;	EBX = virtual (linear) address
   487                              <1> 	;	ECX = page table attributes (lower 12 bits)
   488                              <1> 	;	      (higher 20 bits must be ZERO)
   489                              <1> 	;	      (bit 0 must be 1)	 
   490                              <1> 	;	u.pgdir = page directory (physical) address
   491                              <1> 	; OUTPUT ->
   492                              <1> 	;	EDX = Page directory entry address
   493                              <1> 	;	EAX = Page table address
   494                              <1> 	;	cf = 1 -> insufficient (out of) memory error
   495                              <1> 	;	cf = 0 -> page table address in the PDE (EDX)
   496                              <1> 	;
   497                              <1> 	; Modified Registers -> EAX, EDX
   498                              <1> 	;
   499 00004B8B E86FFFFFFF          <1> 	call	allocate_page
   500 00004B90 72F8                <1> 	jc	short mkpt_error
   501 00004B92 E811000000          <1> 	call	set_pde	
   502 00004B97 EBE0                <1> 	jmp	short clear_page
   503                              <1> 
   504                              <1> make_page:
   505                              <1> 	; 24/07/2015
   506                              <1> 	; 23/06/2015 ; (Retro UNIX 386 v1 - beginning)
   507                              <1> 	;
   508                              <1> 	; INPUT ->
   509                              <1> 	;	EBX = virtual (linear) address
   510                              <1> 	;	ECX = page attributes (lower 12 bits)
   511                              <1> 	;	      (higher 20 bits must be ZERO)
   512                              <1> 	;	      (bit 0 must be 1)	 
   513                              <1> 	;	u.pgdir = page directory (physical) address
   514                              <1> 	; OUTPUT ->
   515                              <1> 	;	EBX = Virtual address
   516                              <1> 	;	(EDX = PTE value)
   517                              <1> 	;	EAX = Physical address
   518                              <1> 	;	cf = 1 -> insufficient (out of) memory error
   519                              <1> 	;
   520                              <1> 	; Modified Registers -> EAX, EDX
   521                              <1> 	;
   522 00004B99 E861FFFFFF          <1> 	call	allocate_page
   523 00004B9E 7207                <1> 	jc	short mkp_err
   524 00004BA0 E821000000          <1> 	call	set_pte	
   525 00004BA5 73D2                <1> 	jnc	short clear_page ; 18/04/2015
   526                              <1> mkp_err:
   527 00004BA7 C3                  <1> 	retn
   528                              <1> 
   529                              <1> 
   530                              <1> set_pde:	; Set page directory entry (PDE)
   531                              <1> 	; 20/07/2015
   532                              <1> 	; 18/04/2015
   533                              <1> 	; 12/04/2015
   534                              <1> 	; 23/10/2014
   535                              <1> 	; 10/10/2014 ; (Retro UNIX 386 v1 - beginning)
   536                              <1> 	;
   537                              <1> 	; INPUT ->
   538                              <1> 	;	EAX = physical address
   539                              <1> 	;	      (use present value if EAX = 0)
   540                              <1> 	;	EBX = virtual (linear) address
   541                              <1> 	;	ECX = page table attributes (lower 12 bits)
   542                              <1> 	;	      (higher 20 bits must be ZERO)
   543                              <1> 	;	      (bit 0 must be 1)	 
   544                              <1> 	;	u.pgdir = page directory (physical) address
   545                              <1> 	; OUTPUT ->
   546                              <1> 	;	EDX = PDE address
   547                              <1> 	;	EAX = page table address (physical)
   548                              <1> 	;	;(CF=1 -> Invalid page address)
   549                              <1> 	;
   550                              <1> 	; Modified Registers -> EDX
   551                              <1> 	;
   552 00004BA8 89DA                <1> 	mov	edx, ebx
   553 00004BAA C1EA16              <1> 	shr	edx, PAGE_D_SHIFT ; 22
   554 00004BAD C1E202              <1> 	shl	edx, 2 ; offset to page directory (1024*4)
   555 00004BB0 0315[70470100]      <1> 	add	edx, [u.pgdir]
   556                              <1> 	;
   557 00004BB6 21C0                <1> 	and	eax, eax
   558 00004BB8 7506                <1> 	jnz	short spde_1
   559                              <1> 	;
   560 00004BBA 8B02                <1> 	mov	eax, [edx]  ; old PDE value
   561                              <1> 	;test	al, 1
   562                              <1> 	;jz	short spde_2
   563 00004BBC 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h  ; clear lower 12 bits
   564                              <1> spde_1:
   565                              <1> 	;and	cx, 0FFFh
   566 00004BC0 8902                <1> 	mov	[edx], eax
   567 00004BC2 66090A              <1> 	or	[edx], cx
   568 00004BC5 C3                  <1> 	retn
   569                              <1> ;spde_2: ; error
   570                              <1> ;	stc
   571                              <1> ;	retn
   572                              <1> 
   573                              <1> set_pte:	; Set page table entry (PTE)
   574                              <1> 	; 24/07/2015
   575                              <1> 	; 20/07/2015
   576                              <1> 	; 23/06/2015
   577                              <1> 	; 18/04/2015
   578                              <1> 	; 12/04/2015
   579                              <1> 	; 10/10/2014 ; (Retro UNIX 386 v1 - beginning)
   580                              <1> 	;
   581                              <1> 	; INPUT ->
   582                              <1> 	;	EAX = physical page address
   583                              <1> 	;	      (use present value if EAX = 0)
   584                              <1> 	;	EBX = virtual (linear) address
   585                              <1> 	;	ECX = page attributes (lower 12 bits)
   586                              <1> 	;	      (higher 20 bits must be ZERO)
   587                              <1> 	;	      (bit 0 must be 1)	 
   588                              <1> 	;	u.pgdir = page directory (physical) address
   589                              <1> 	; OUTPUT ->
   590                              <1> 	;	EAX = physical page address
   591                              <1> 	;	(EDX = PTE value)
   592                              <1> 	;	EBX = virtual address
   593                              <1> 	;
   594                              <1> 	;	CF = 1 -> error
   595                              <1> 	;
   596                              <1> 	; Modified Registers -> EAX, EDX
   597                              <1> 	;
   598 00004BC6 50                  <1> 	push	eax
   599 00004BC7 A1[70470100]        <1> 	mov	eax, [u.pgdir] ; 20/07/2015
   600 00004BCC E837000000          <1> 	call 	get_pde
   601                              <1> 		; EDX = PDE address
   602                              <1> 		; EAX = PDE value
   603 00004BD1 5A                  <1> 	pop	edx ; physical page address
   604 00004BD2 722A                <1> 	jc	short spte_err ; PDE not present
   605                              <1> 	;
   606 00004BD4 53                  <1> 	push	ebx ; 24/07/2015
   607 00004BD5 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 bits
   608                              <1> 			    ; EDX = PT address (physical)	
   609 00004BD9 C1EB0C              <1> 	shr	ebx, PAGE_SHIFT ; 12
   610 00004BDC 81E3FF030000        <1> 	and	ebx, PTE_MASK	; 03FFh
   611                              <1> 			 ; clear higher 10 bits (PD bits)
   612 00004BE2 C1E302              <1> 	shl	ebx, 2   ; offset to page table (1024*4)
   613 00004BE5 01C3                <1> 	add	ebx, eax
   614                              <1> 	;
   615 00004BE7 8B03                <1> 	mov	eax, [ebx] ; Old PTE value
   616 00004BE9 A801                <1> 	test	al, 1
   617 00004BEB 740C                <1> 	jz	short spte_0
   618 00004BED 09D2                <1> 	or	edx, edx
   619 00004BEF 750F                <1> 	jnz	short spte_1
   620 00004BF1 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 bits
   621 00004BF5 89C2                <1> 	mov	edx, eax
   622 00004BF7 EB09                <1> 	jmp	short spte_2	
   623                              <1> spte_0:
   624                              <1> 	; If this PTE contains a swap (disk) address,
   625                              <1> 	; it can be updated by using 'swap_in' procedure
   626                              <1> 	; only!
   627 00004BF9 21C0                <1> 	and	eax, eax
   628 00004BFB 7403                <1> 	jz	short spte_1
   629                              <1> 	; 24/07/2015
   630                              <1> 	; swapped page ! (on disk)
   631 00004BFD 5B                  <1> 	pop	ebx
   632                              <1> spte_err:
   633 00004BFE F9                  <1> 	stc
   634 00004BFF C3                  <1> 	retn
   635                              <1> spte_1: 
   636 00004C00 89D0                <1> 	mov	eax, edx
   637                              <1> spte_2:
   638 00004C02 09CA                <1> 	or	edx, ecx
   639                              <1> 	; 23/06/2015
   640 00004C04 8913                <1> 	mov	[ebx], edx ; PTE value in EDX
   641                              <1> 	; 24/07/2015
   642 00004C06 5B                  <1> 	pop	ebx
   643 00004C07 C3                  <1> 	retn
   644                              <1> 
   645                              <1> get_pde:	; Get present value of the relevant PDE
   646                              <1> 	; 20/07/2015
   647                              <1> 	; 18/04/2015
   648                              <1> 	; 12/04/2015
   649                              <1> 	; 10/10/2014 ; (Retro UNIX 386 v1 - beginning)
   650                              <1> 	;
   651                              <1> 	; INPUT ->
   652                              <1> 	;	EBX = virtual (linear) address
   653                              <1> 	;	EAX = page directory (physical) address
   654                              <1> 	; OUTPUT ->
   655                              <1> 	;	EDX = Page directory entry address
   656                              <1> 	;	EAX = Page directory entry value
   657                              <1> 	;	CF = 1 -> PDE not present or invalid ? 
   658                              <1> 	; Modified Registers -> EDX, EAX
   659                              <1> 	;
   660 00004C08 89DA                <1> 	mov	edx, ebx
   661 00004C0A C1EA16              <1> 	shr	edx, PAGE_D_SHIFT ; 22  (12+10)
   662 00004C0D C1E202              <1> 	shl 	edx, 2 ; offset to page directory (1024*4)
   663 00004C10 01C2                <1> 	add	edx, eax ; page directory address (physical)
   664 00004C12 8B02                <1> 	mov	eax, [edx]
   665 00004C14 A801                <1> 	test	al, PDE_A_PRESENT ; page table is present or not !
   666 00004C16 751F                <1> 	jnz	short gpte_retn
   667 00004C18 F9                  <1> 	stc
   668                              <1> gpde_retn:	
   669 00004C19 C3                  <1> 	retn
   670                              <1> 
   671                              <1> get_pte:
   672                              <1> 		; Get present value of the relevant PTE
   673                              <1> 	; 29/07/2015
   674                              <1> 	; 20/07/2015
   675                              <1> 	; 18/04/2015
   676                              <1> 	; 12/04/2015
   677                              <1> 	; 10/10/2014 ; (Retro UNIX 386 v1 - beginning)
   678                              <1> 	;
   679                              <1> 	; INPUT ->
   680                              <1> 	;	EBX = virtual (linear) address
   681                              <1> 	;	EAX = page directory (physical) address
   682                              <1> 	; OUTPUT ->
   683                              <1> 	;	EDX = Page table entry address (if CF=0)
   684                              <1> 	;	      Page directory entry address (if CF=1)
   685                              <1> 	;            (Bit 0 value is 0 if PT is not present)
   686                              <1> 	;	EAX = Page table entry value (page address)
   687                              <1> 	;	CF = 1 -> PDE not present or invalid ? 
   688                              <1> 	; Modified Registers -> EAX, EDX
   689                              <1> 	;
   690 00004C1A E8E9FFFFFF          <1> 	call 	get_pde
   691 00004C1F 72F8                <1> 	jc	short gpde_retn	; page table is not present
   692                              <1> 	;jnc	short gpte_1
   693                              <1> 	;retn
   694                              <1> ;gpte_1:
   695 00004C21 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 bits
   696 00004C25 89DA                <1> 	mov	edx, ebx
   697 00004C27 C1EA0C              <1> 	shr	edx, PAGE_SHIFT ; 12
   698 00004C2A 81E2FF030000        <1> 	and	edx, PTE_MASK	; 03FFh
   699                              <1> 			 ; clear higher 10 bits (PD bits)
   700 00004C30 C1E202              <1> 	shl	edx, 2 ; offset from start of page table (1024*4)
   701 00004C33 01C2                <1> 	add	edx, eax
   702 00004C35 8B02                <1> 	mov	eax, [edx]
   703                              <1> gpte_retn:
   704 00004C37 C3                  <1> 	retn
   705                              <1> 
   706                              <1> deallocate_page_dir:
   707                              <1> 	; 15/09/2015
   708                              <1> 	; 05/08/2015
   709                              <1> 	; 30/04/2015
   710                              <1> 	; 28/04/2015
   711                              <1> 	; 17/10/2014
   712                              <1> 	; 12/10/2014 (Retro UNIX 386 v1 - beginning)
   713                              <1> 	;
   714                              <1> 	; INPUT ->
   715                              <1> 	;	EAX = PHYSICAL ADDRESS OF THE PAGE DIRECTORY (CHILD)
   716                              <1> 	;	EBX = PHYSICAL ADDRESS OF THE PARENT'S PAGE DIRECTORY
   717                              <1> 	; OUTPUT ->
   718                              <1> 	;	All of page tables in the page directory
   719                              <1> 	;	and page dir's itself will be deallocated
   720                              <1> 	;	except 'read only' duplicated pages (will be converted
   721                              <1> 	;	to writable pages).
   722                              <1> 	;
   723                              <1> 	; Modified Registers -> EAX
   724                              <1> 	;
   725                              <1> 	;
   726 00004C38 56                  <1> 	push	esi
   727 00004C39 51                  <1> 	push	ecx
   728 00004C3A 50                  <1> 	push	eax
   729 00004C3B 89C6                <1> 	mov	esi, eax 
   730 00004C3D 31C9                <1> 	xor	ecx, ecx
   731                              <1> 	; The 1st PDE points to Kernel Page Table 0 (the 1st 4MB),
   732                              <1> 	; it must not be deallocated
   733 00004C3F 890E                <1> 	mov	[esi], ecx ; 0 ; clear PDE 0
   734                              <1> dapd_0:
   735 00004C41 AD                  <1> 	lodsd
   736 00004C42 A801                <1> 	test	al, PDE_A_PRESENT ; bit 0, present flag (must be 1)
   737 00004C44 7409                <1> 	jz	short dapd_1	
   738 00004C46 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
   739 00004C4A E812000000          <1> 	call	deallocate_page_table			
   740                              <1> dapd_1:
   741 00004C4F 41                  <1> 	inc	ecx ; page directory entry index
   742 00004C50 81F900040000        <1> 	cmp	ecx, PAGE_SIZE / 4 ; 1024
   743 00004C56 72E9                <1> 	jb	short dapd_0
   744                              <1> dapd_2:
   745 00004C58 58                  <1> 	pop	eax
   746 00004C59 E87F000000          <1> 	call	deallocate_page	; deallocate the page dir's itself
   747 00004C5E 59                  <1> 	pop	ecx
   748 00004C5F 5E                  <1> 	pop	esi
   749 00004C60 C3                  <1> 	retn
   750                              <1> 
   751                              <1> deallocate_page_table:
   752                              <1> 	; 12/07/2016
   753                              <1> 	; 19/09/2015
   754                              <1> 	; 15/09/2015
   755                              <1> 	; 05/08/2015
   756                              <1> 	; 30/04/2015
   757                              <1> 	; 28/04/2015
   758                              <1> 	; 24/10/2014
   759                              <1> 	; 23/10/2014
   760                              <1> 	; 12/10/2014 (Retro UNIX 386 v1 - beginning)
   761                              <1> 	;
   762                              <1> 	; INPUT ->
   763                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF THE PAGE TABLE
   764                              <1> 	;	EBX = PHYSICAL ADDRESS OF THE PARENT'S PAGE DIRECTORY
   765                              <1> 	;	(ECX = page directory entry index)
   766                              <1> 	; OUTPUT ->
   767                              <1> 	;	All of pages in the page table and page table's itself
   768                              <1> 	;	will be deallocated except 'read only' duplicated pages
   769                              <1> 	;	(will be converted to writable pages).
   770                              <1> 	;
   771                              <1> 	; Modified Registers -> EAX
   772                              <1> 	;
   773 00004C61 56                  <1> 	push	esi
   774 00004C62 57                  <1> 	push	edi
   775 00004C63 52                  <1> 	push	edx
   776 00004C64 50                  <1> 	push	eax ; *
   777 00004C65 89C6                <1> 	mov	esi, eax 
   778 00004C67 31FF                <1> 	xor	edi, edi ; 0
   779                              <1> dapt_0:
   780 00004C69 AD                  <1> 	lodsd
   781 00004C6A A801                <1> 	test	al, PTE_A_PRESENT ; bit 0, present flag (must be 1)
   782 00004C6C 7441                <1> 	jz	short dapt_1
   783                              <1> 	;
   784 00004C6E A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
   785                              <1> 				  ; (must be 1)
   786 00004C70 754C                <1> 	jnz	short dapt_3
   787                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
   788 00004C72 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
   789                              <1> 				   ; as child's page ?
   790 00004C76 7451                <1> 	jz	short dapt_4 ; Clear PTE but don't deallocate the page!
   791                              <1> 	; check the parent's PTE value is read only & same page or not.. 
   792                              <1> 	; ECX = page directory entry index (0-1023)
   793 00004C78 53                  <1> 	push	ebx
   794 00004C79 51                  <1> 	push	ecx
   795 00004C7A 66C1E102            <1> 	shl	cx, 2 ; *4 
   796 00004C7E 01CB                <1> 	add	ebx, ecx ; PDE offset (for the parent)
   797 00004C80 8B0B                <1> 	mov	ecx, [ebx]
   798 00004C82 F6C101              <1> 	test	cl, PDE_A_PRESENT ; present (valid) or not ?
   799 00004C85 7435                <1> 	jz	short dapt_2	; parent process does not use this page
   800 00004C87 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
   801                              <1> 	; EDI = page table entry index (0-1023)
   802 00004C8C 89FA                <1> 	mov	edx, edi 
   803 00004C8E 66C1E202            <1> 	shl	dx, 2 ; *4 
   804 00004C92 01CA                <1> 	add	edx, ecx ; PTE offset (for the parent)
   805 00004C94 8B1A                <1> 	mov	ebx, [edx]
   806 00004C96 F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
   807 00004C99 7421                <1> 	jz	short dapt_2	; parent process does not use this page
   808 00004C9B 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
   809 00004C9F 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
   810 00004CA4 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
   811 00004CA6 7514                <1> 	jne	short dapt_2	; not same page
   812                              <1> 				; deallocate the child's page
   813 00004CA8 800A02              <1>         or      byte [edx], PTE_A_WRITE ; convert to writable page (parent)
   814 00004CAB 59                  <1> 	pop	ecx
   815 00004CAC 5B                  <1> 	pop	ebx
   816 00004CAD EB1A                <1> 	jmp	short dapt_4
   817                              <1> dapt_1:
   818 00004CAF 09C0                <1> 	or	eax, eax	; swapped page ?
   819 00004CB1 741D                <1> 	jz	short dapt_5	; no
   820                              <1> 				; yes
   821 00004CB3 D1E8                <1> 	shr	eax, 1
   822 00004CB5 E8CD040000          <1> 	call	unlink_swap_block ; Deallocate swapped page block
   823                              <1> 				  ; on the swap disk (or in file)
   824 00004CBA EB14                <1> 	jmp	short dapt_5
   825                              <1> dapt_2:
   826 00004CBC 59                  <1> 	pop	ecx
   827 00004CBD 5B                  <1> 	pop	ebx
   828                              <1> dapt_3:	
   829                              <1> 	; 12/07/2016
   830 00004CBE 66A90004            <1> 	test	ax, PTE_SHARED ; shared or direct memory access indicator
   831 00004CC2 7505                <1> 	jnz	short dapt_4   ; AVL bit 1 = 1, do not deallocate this page!
   832                              <1> 	;
   833                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
   834 00004CC4 E814000000          <1> 	call	deallocate_page ; set the mem allocation bit of this page
   835                              <1> dapt_4:
   836 00004CC9 C746FC00000000      <1> 	mov	dword [esi-4], 0 ; clear/reset PTE (child, dupl. as parent)
   837                              <1> dapt_5:
   838 00004CD0 47                  <1> 	inc	edi ; page table entry index
   839 00004CD1 81FF00040000        <1> 	cmp	edi, PAGE_SIZE / 4 ; 1024
   840 00004CD7 7290                <1> 	jb	short dapt_0
   841                              <1> 	;
   842 00004CD9 58                  <1> 	pop	eax ; *
   843 00004CDA 5A                  <1> 	pop	edx
   844 00004CDB 5F                  <1> 	pop	edi	
   845 00004CDC 5E                  <1> 	pop	esi
   846                              <1> 	;
   847                              <1> 	;call	deallocate_page	; deallocate the page table's itself
   848                              <1> 	;retn
   849                              <1> 
   850                              <1> deallocate_page:
   851                              <1> 	; 15/09/2015
   852                              <1> 	; 28/04/2015
   853                              <1> 	; 10/03/2015
   854                              <1> 	; 17/10/2014
   855                              <1> 	; 12/10/2014 (Retro UNIX 386 v1 - beginning)
   856                              <1> 	;
   857                              <1> 	; INPUT -> 
   858                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF THE ALLOCATED PAGE
   859                              <1> 	; OUTPUT ->
   860                              <1> 	;	[free_pages] is increased
   861                              <1> 	;	(corresponding MEMORY ALLOCATION TABLE bit is SET)
   862                              <1> 	;	CF = 1 if the page is already deallocated
   863                              <1> 	; 	       (or not allocated) before.  
   864                              <1> 	;
   865                              <1> 	; Modified Registers -> EAX
   866                              <1> 	;
   867 00004CDD 53                  <1> 	push	ebx
   868 00004CDE 52                  <1> 	push	edx
   869                              <1> 	;
   870 00004CDF C1E80C              <1> 	shr	eax, PAGE_SHIFT      ; shift physical address to 
   871                              <1> 				     ; 12 bits right
   872                              <1> 				     ; to get page number
   873 00004CE2 89C2                <1> 	mov	edx, eax
   874                              <1> 	; 15/09/2015
   875 00004CE4 C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
   876                              <1> 				     ; (1 allocation bit = 1 page)
   877                              <1> 				     ; (1 allocation bytes = 8 pages)
   878 00004CE7 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
   879                              <1> 				     ; (to get 32 bit position)			
   880                              <1> 	;
   881 00004CEA BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table address
   882 00004CEF 01D3                <1> 	add	ebx, edx
   883 00004CF1 83E01F              <1> 	and	eax, 1Fh	     ; lower 5 bits only
   884                              <1> 				     ; (allocation bit position)	 
   885 00004CF4 3B15[EC300100]      <1> 	cmp 	edx, [next_page]     ; is the new free page address lower
   886                              <1> 				     ; than the address in 'next_page' ?
   887                              <1> 				     ; (next/first free page value)		
   888 00004CFA 7306                <1> 	jnb	short dap_1	     ; no	
   889 00004CFC 8915[EC300100]      <1> 	mov	[next_page], edx     ; yes
   890                              <1> dap_1:
   891 00004D02 0FAB03              <1> 	bts	[ebx], eax	     ; unlink/release/deallocate page
   892                              <1> 				     ; set relevant bit to 1.
   893                              <1> 				     ; set CF to the previous bit value	
   894                              <1> 	;cmc			     ; complement carry flag	
   895                              <1> 	;jc	short dap_2	     ; do not increase free_pages count
   896                              <1> 				     ; if the page is already deallocated
   897                              <1> 				     ; before.	
   898 00004D05 FF05[E8300100]      <1>         inc     dword [free_pages]
   899                              <1> dap_2:
   900 00004D0B 5A                  <1> 	pop	edx
   901 00004D0C 5B                  <1> 	pop	ebx
   902 00004D0D C3                  <1> 	retn
   903                              <1> 
   904                              <1> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   905                              <1> ;;                                                              ;;
   906                              <1> ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
   907                              <1> ;; Distributed under terms of the GNU General Public License    ;;
   908                              <1> ;;                                                              ;;
   909                              <1> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   910                              <1> 
   911                              <1> ;;$Revision: 5057 $
   912                              <1> 
   913                              <1> 
   914                              <1> ;;align 4
   915                              <1> ;;proc alloc_page
   916                              <1> 
   917                              <1> ;;        pushfd
   918                              <1> ;;        cli
   919                              <1> ;;        push    ebx
   920                              <1> ;;;//-
   921                              <1> ;;        cmp     [pg_data.pages_free], 1
   922                              <1> ;;        jle     .out_of_memory
   923                              <1> ;;;//-
   924                              <1> ;;
   925                              <1> ;;        mov     ebx, [page_start]
   926                              <1> ;;        mov     ecx, [page_end]
   927                              <1> ;;.l1:
   928                              <1> ;;        bsf     eax, [ebx];
   929                              <1> ;;        jnz     .found
   930                              <1> ;;        add     ebx, 4
   931                              <1> ;;        cmp     ebx, ecx
   932                              <1> ;;        jb      .l1
   933                              <1> ;;        pop     ebx
   934                              <1> ;;        popfd
   935                              <1> ;;        xor     eax, eax
   936                              <1> ;;        ret
   937                              <1> ;;.found:
   938                              <1> ;;;//-
   939                              <1> ;;        dec     [pg_data.pages_free]
   940                              <1> ;;        jz      .out_of_memory
   941                              <1> ;;;//-
   942                              <1> ;;        btr     [ebx], eax
   943                              <1> ;;        mov     [page_start], ebx
   944                              <1> ;;        sub     ebx, sys_pgmap
   945                              <1> ;;        lea     eax, [eax+ebx*8]
   946                              <1> ;;        shl     eax, 12
   947                              <1> ;;;//-       dec [pg_data.pages_free]
   948                              <1> ;;        pop     ebx
   949                              <1> ;;        popfd
   950                              <1> ;;        ret
   951                              <1> ;;;//-
   952                              <1> ;;.out_of_memory:
   953                              <1> ;;        mov     [pg_data.pages_free], 1
   954                              <1> ;;        xor     eax, eax
   955                              <1> ;;        pop     ebx
   956                              <1> ;;        popfd
   957                              <1> ;;        ret
   958                              <1> ;;;//-
   959                              <1> ;;endp
   960                              <1> 
   961                              <1> duplicate_page_dir:
   962                              <1> 	; 21/09/2015
   963                              <1> 	; 31/08/2015
   964                              <1> 	; 20/07/2015
   965                              <1> 	; 28/04/2015
   966                              <1> 	; 27/04/2015
   967                              <1> 	; 18/04/2015
   968                              <1> 	; 12/04/2015
   969                              <1> 	; 18/10/2014
   970                              <1> 	; 16/10/2014 (Retro UNIX 386 v1 - beginning)
   971                              <1> 	;
   972                              <1> 	; INPUT -> 
   973                              <1> 	;	[u.pgdir] = PHYSICAL (real/flat) ADDRESS of the parent's
   974                              <1> 	;		    page directory.
   975                              <1> 	; OUTPUT ->
   976                              <1> 	;	EAX =  PHYSICAL (real/flat) ADDRESS of the child's
   977                              <1> 	;	       page directory.
   978                              <1> 	;	(New page directory with new page table entries.)
   979                              <1> 	;	(New page tables with read only copies of the parent's
   980                              <1> 	;	pages.)
   981                              <1> 	;	EAX = 0 -> Error (CF = 1)
   982                              <1> 	;
   983                              <1> 	; Modified Registers -> none (except EAX)
   984                              <1> 	;
   985 00004D0E E8ECFDFFFF          <1> 	call	allocate_page
   986 00004D13 723E                <1> 	jc	short dpd_err
   987                              <1> 	;
   988 00004D15 55                  <1> 	push	ebp ; 20/07/2015
   989 00004D16 56                  <1> 	push	esi
   990 00004D17 57                  <1> 	push	edi
   991 00004D18 53                  <1> 	push	ebx
   992 00004D19 51                  <1> 	push	ecx
   993 00004D1A 8B35[70470100]      <1> 	mov	esi, [u.pgdir]
   994 00004D20 89C7                <1> 	mov	edi, eax
   995 00004D22 50                  <1> 	push	eax ; save child's page directory address
   996                              <1> 	; 31/08/2015
   997                              <1> 	; copy PDE 0 from the parent's page dir to the child's page dir
   998                              <1> 	; (use same system space for all user page tables) 
   999 00004D23 A5                  <1> 	movsd
  1000 00004D24 BD00004000          <1> 	mov	ebp, 1024*4096 ; pass the 1st 4MB (system space)
  1001 00004D29 B9FF030000          <1> 	mov	ecx, (PAGE_SIZE / 4) - 1 ; 1023
  1002                              <1> dpd_0:	
  1003 00004D2E AD                  <1> 	lodsd
  1004                              <1> 	;or	eax, eax
  1005                              <1>         ;jnz     short dpd_1
  1006 00004D2F A801                <1> 	test	al, PDE_A_PRESENT ;  bit 0 =  1
  1007 00004D31 7508                <1> 	jnz	short dpd_1
  1008                              <1>  	; 20/07/2015 (virtual address at the end of the page table)	
  1009 00004D33 81C500004000        <1> 	add	ebp, 1024*4096 ; page size * PTE count
  1010 00004D39 EB0F                <1> 	jmp	short dpd_2
  1011                              <1> dpd_1:	
  1012 00004D3B 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear attribute bits
  1013 00004D3F 89C3                <1> 	mov	ebx, eax
  1014                              <1> 	; EBX = Parent's page table address
  1015 00004D41 E81F000000          <1> 	call	duplicate_page_table
  1016 00004D46 720C                <1> 	jc	short dpd_p_err
  1017                              <1> 	; EAX = Child's page table address
  1018 00004D48 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER
  1019                              <1> 			 ; set bit 0, bit 1 and bit 2 to 1
  1020                              <1> 			 ; (present, writable, user)
  1021                              <1> dpd_2:
  1022 00004D4A AB                  <1> 	stosd
  1023 00004D4B E2E1                <1> 	loop	dpd_0
  1024                              <1> 	;
  1025 00004D4D 58                  <1> 	pop	eax  ; restore child's page directory address
  1026                              <1> dpd_3:
  1027 00004D4E 59                  <1> 	pop	ecx
  1028 00004D4F 5B                  <1> 	pop	ebx
  1029 00004D50 5F                  <1> 	pop	edi
  1030 00004D51 5E                  <1> 	pop	esi
  1031 00004D52 5D                  <1> 	pop	ebp ; 20/07/2015
  1032                              <1> dpd_err:
  1033 00004D53 C3                  <1> 	retn
  1034                              <1> dpd_p_err:
  1035                              <1> 	; release the allocated pages missing (recover free space)
  1036 00004D54 58                  <1> 	pop	eax  ; the new page directory address (physical)
  1037 00004D55 8B1D[70470100]      <1> 	mov	ebx, [u.pgdir] ; parent's page directory address 
  1038 00004D5B E8D8FEFFFF          <1> 	call 	deallocate_page_dir
  1039 00004D60 29C0                <1> 	sub	eax, eax ; 0
  1040 00004D62 F9                  <1> 	stc
  1041 00004D63 EBE9                <1> 	jmp	short dpd_3	
  1042                              <1> 
  1043                              <1> duplicate_page_table:
  1044                              <1> 	; 21/09/2015
  1045                              <1> 	; 20/07/2015
  1046                              <1> 	; 05/05/2015
  1047                              <1> 	; 28/04/2015
  1048                              <1> 	; 27/04/2015
  1049                              <1> 	; 18/04/2015
  1050                              <1> 	; 18/10/2014
  1051                              <1> 	; 16/10/2014 (Retro UNIX 386 v1 - beginning)
  1052                              <1> 	;
  1053                              <1> 	; INPUT -> 
  1054                              <1> 	;	EBX = PHYSICAL (real/flat) ADDRESS of the parent's page table.
  1055                              <1> 	;	EBP = page table entry index (from 'duplicate_page_dir')
  1056                              <1> 	; OUTPUT ->
  1057                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS of the child's page table.
  1058                              <1> 	;	      (with 'read only' attribute of page table entries)
  1059                              <1> 	;	EBP = (recent) page table index (for 'add_to_swap_queue')	
  1060                              <1> 	;	CF = 1 -> error 
  1061                              <1> 	;
  1062                              <1> 	; Modified Registers -> EBP (except EAX)
  1063                              <1> 	;
  1064 00004D65 E895FDFFFF          <1> 	call	allocate_page
  1065 00004D6A 726A                <1> 	jc	short dpt_err
  1066                              <1> 	;
  1067 00004D6C 50                  <1> 	push	eax ; *
  1068 00004D6D 56                  <1> 	push	esi
  1069 00004D6E 57                  <1> 	push	edi
  1070 00004D6F 52                  <1> 	push	edx
  1071 00004D70 51                  <1> 	push	ecx
  1072                              <1> 	;
  1073 00004D71 89DE                <1> 	mov	esi, ebx
  1074 00004D73 89C7                <1> 	mov	edi, eax
  1075 00004D75 89C2                <1> 	mov	edx, eax
  1076 00004D77 81C200100000        <1> 	add	edx, PAGE_SIZE 	
  1077                              <1> dpt_0:
  1078 00004D7D AD                  <1> 	lodsd
  1079 00004D7E 21C0                <1> 	and	eax, eax
  1080 00004D80 7444                <1> 	jz	short dpt_3
  1081 00004D82 A801                <1> 	test	al, PTE_A_PRESENT ;  bit 0 =  1
  1082 00004D84 7507                <1> 	jnz	short dpt_1
  1083                              <1> 	; 20/07/2015
  1084                              <1> 	; ebp = virtual (linear) address of the memory page
  1085 00004D86 E806050000          <1> 	call	reload_page ; 28/04/2015
  1086 00004D8B 7244                <1> 	jc	short dpt_p_err
  1087                              <1> dpt_1:
  1088                              <1> 	; 21/09/2015
  1089 00004D8D 89C1                <1> 	mov	ecx, eax
  1090 00004D8F 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  1091 00004D93 F6C102              <1> 	test	cl, PTE_A_WRITE ; writable page ?
  1092 00004D96 7525                <1> 	jnz	short dpt_2
  1093                              <1> 	; Read only (parent) page
  1094                              <1> 	; 	- there is a third process which uses this page -
  1095                              <1> 	; Allocate a new page for the child process
  1096 00004D98 E862FDFFFF          <1> 	call	allocate_page
  1097 00004D9D 7232                <1> 	jc	short dpt_p_err
  1098 00004D9F 57                  <1> 	push	edi
  1099 00004DA0 56                  <1> 	push	esi
  1100 00004DA1 89CE                <1> 	mov	esi, ecx
  1101 00004DA3 89C7                <1> 	mov	edi, eax
  1102 00004DA5 B900040000          <1> 	mov	ecx, PAGE_SIZE/4
  1103 00004DAA F3A5                <1> 	rep	movsd	; copy page (4096 bytes)
  1104 00004DAC 5E                  <1> 	pop	esi
  1105 00004DAD 5F                  <1> 	pop	edi
  1106                              <1> 	; 
  1107 00004DAE 53                  <1> 	push	ebx
  1108 00004DAF 50                  <1> 	push	eax
  1109                              <1> 	; 20/07/2015
  1110 00004DB0 89EB                <1> 	mov	ebx, ebp
  1111                              <1> 	; ebx = virtual address of the memory page
  1112 00004DB2 E88A030000          <1> 	call	add_to_swap_queue
  1113 00004DB7 58                  <1> 	pop	eax
  1114 00004DB8 5B                  <1> 	pop	ebx
  1115                              <1> 	; 21/09/2015
  1116 00004DB9 0C07                <1> 	or	al, PTE_A_USER+PTE_A_WRITE+PTE_A_PRESENT 
  1117                              <1> 		; user + writable + present page
  1118 00004DBB EB09                <1> 	jmp	short dpt_3
  1119                              <1> dpt_2:
  1120                              <1> 	;or	ax, PTE_A_USER+PTE_A_PRESENT 
  1121 00004DBD 0C05                <1> 	or	al, PTE_A_USER+PTE_A_PRESENT 
  1122                              <1> 		    ; (read only page!)
  1123 00004DBF 8946FC              <1> 	mov	[esi-4], eax ; update parent's PTE
  1124 00004DC2 660D0002            <1> 	or      ax, PTE_DUPLICATED  ; (read only page & duplicated PTE!)
  1125                              <1> dpt_3:
  1126 00004DC6 AB                  <1> 	stosd  ; EDI points to child's PTE  	 
  1127                              <1> 	;
  1128 00004DC7 81C500100000        <1> 	add	ebp, 4096 ; 20/07/2015 (next page)
  1129                              <1> 	;
  1130 00004DCD 39D7                <1> 	cmp	edi, edx
  1131 00004DCF 72AC                <1> 	jb	short dpt_0
  1132                              <1> dpt_p_err:
  1133 00004DD1 59                  <1> 	pop	ecx
  1134 00004DD2 5A                  <1> 	pop	edx
  1135 00004DD3 5F                  <1> 	pop	edi
  1136 00004DD4 5E                  <1> 	pop	esi
  1137 00004DD5 58                  <1> 	pop	eax ; *
  1138                              <1> dpt_err:
  1139 00004DD6 C3                  <1> 	retn
  1140                              <1> 
  1141                              <1> page_fault_handler:	; CPU EXCEPTION 0Eh (14) : Page Fault !
  1142                              <1> 	; 21/09/2015
  1143                              <1> 	; 19/09/2015
  1144                              <1> 	; 17/09/2015
  1145                              <1> 	; 28/08/2015
  1146                              <1> 	; 20/07/2015
  1147                              <1> 	; 28/06/2015
  1148                              <1> 	; 03/05/2015
  1149                              <1> 	; 30/04/2015
  1150                              <1> 	; 18/04/2015
  1151                              <1> 	; 12/04/2015
  1152                              <1> 	; 30/10/2014
  1153                              <1> 	; 11/09/2014
  1154                              <1> 	; 10/09/2014 (Retro UNIX 386 v1 - beginning)
  1155                              <1> 	;
  1156                              <1> 	; Note: This is not an interrupt/exception handler.
  1157                              <1> 	;	This is a 'page fault remedy' subroutine 
  1158                              <1> 	;	which will be called by standard/uniform
  1159                              <1> 	;	exception handler.
  1160                              <1> 	;
  1161                              <1> 	; INPUT -> 
  1162                              <1> 	;	[error_code] = 32 bit ERROR CODE (lower 5 bits are valid)
  1163                              <1> 	;
  1164                              <1> 	;	cr2 = the virtual (linear) address 
  1165                              <1> 	;	      which has caused to page fault (19/09/2015)
  1166                              <1> 	;
  1167                              <1> 	; OUTPUT ->
  1168                              <1> 	;	(corresponding PAGE TABLE ENTRY is mapped/set)
  1169                              <1> 	;	EAX = 0 -> no error
  1170                              <1> 	;	EAX > 0 -> error code in EAX (also CF = 1)
  1171                              <1> 	;
  1172                              <1> 	; Modified Registers -> none (except EAX)
  1173                              <1> 	;	
  1174                              <1>         ;
  1175                              <1>         ; ERROR CODE:
  1176                              <1> 	;	 31  .....	4   3	2   1	0
  1177                              <1> 	;	+---+-- --+---+---+---+---+---+---+
  1178                              <1> 	;	|   Reserved  | I | R | U | W | P |
  1179                              <1> 	;	+---+-- --+---+---+---+---+---+---+
  1180                              <1> 	;
  1181                              <1> 	; P : PRESENT -	When set, the page fault was caused by 
  1182                              <1>     	;		a page-protection violation. When not set,
  1183                              <1> 	;		it was caused by a non-present page.
  1184                              <1> 	; W : WRITE   -	When set, the page fault was caused by
  1185                              <1> 	;		a page write. When not set, it was caused
  1186                              <1> 	;		by a page read.
  1187                              <1> 	; U : USER    -	When set, the page fault was caused 
  1188                              <1> 	;		while CPL = 3. 
  1189                              <1> 	;		This does not necessarily mean that
  1190                              <1> 	;		the page fault was a privilege violation.
  1191                              <1> 	; R : RESERVD -	When set, the page fault was caused by
  1192                              <1> 	;     WRITE	reading a 1 in a reserved field.
  1193                              <1> 	; I : INSTRUC -	When set, the page fault was caused by
  1194                              <1> 	;     FETCH	an instruction fetch
  1195                              <1> 	;
  1196                              <1> 	;; x86 (32 bit) VIRTUAL ADDRESS TRANSLATION
  1197                              <1> 	;  31               22                  12 11                    0
  1198                              <1> 	; +-------------------+-------------------+-----------------------+
  1199                              <1>        	; | PAGE DIR. ENTRY # | PAGE TAB. ENTRY # |        OFFSET         |
  1200                              <1>        	; +-------------------+-------------------+-----------------------+
  1201                              <1> 	;
  1202                              <1> 
  1203                              <1> 	;; CR3 REGISTER (Control Register 3)
  1204                              <1> 	;  31                                   12             5 4 3 2   0
  1205                              <1> 	; +---------------------------------------+-------------+---+-----+
  1206                              <1>       	; |                                       |  		|P|P|     |
  1207                              <1>       	; |   PAGE DIRECTORY TABLE BASE ADDRESS   |  reserved	|C|W|rsvrd|
  1208                              <1>       	; |                                       | 		|D|T|     |
  1209                              <1>    	; +---------------------------------------+-------------+---+-----+
  1210                              <1> 	;
  1211                              <1> 	;	PWT    - WRITE THROUGH
  1212                              <1> 	;	PCD    - CACHE DISABLE		
  1213                              <1> 	;
  1214                              <1> 	;
  1215                              <1> 	;; x86 PAGE DIRECTORY ENTRY (4 KByte Page)
  1216                              <1> 	;  31                                   12 11  9 8 7 6 5 4 3 2 1 0
  1217                              <1> 	; +---------------------------------------+-----+---+-+-+---+-+-+-+
  1218                              <1>       	; |                                       |     | | | | |P|P|U|R| |
  1219                              <1>       	; |     PAGE TABLE BASE ADDRESS 31..12    | AVL |G|0|D|A|C|W|/|/|P|
  1220                              <1>       	; |                                       |     | | | | |D|T|S|W| |
  1221                              <1>    	; +---------------------------------------+-----+---+-+-+---+-+-+-+
  1222                              <1> 	;
  1223                              <1>         ;       P      - PRESENT
  1224                              <1>         ;       R/W    - READ/WRITE
  1225                              <1>         ;       U/S    - USER/SUPERVISOR
  1226                              <1> 	;	PWT    - WRITE THROUGH
  1227                              <1> 	;	PCD    - CACHE DISABLE	
  1228                              <1> 	;	A      - ACCESSED	
  1229                              <1>         ;       D      - DIRTY (IGNORED)
  1230                              <1> 	;	PAT    - PAGE ATTRIBUTE TABLE INDEX (CACHE BEHAVIOR)
  1231                              <1> 	;	G      - GLOBAL	(IGNORED) 
  1232                              <1>         ;       AVL    - AVAILABLE FOR SYSTEMS PROGRAMMER USE
  1233                              <1> 	;
  1234                              <1> 	;
  1235                              <1> 	;; x86 PAGE TABLE ENTRY (4 KByte Page)
  1236                              <1> 	;  31                                   12 11  9 8 7 6 5 4 3 2 1 0
  1237                              <1> 	; +---------------------------------------+-----+---+-+-+---+-+-+-+
  1238                              <1>       	; |                                       |     | |P| | |P|P|U|R| |
  1239                              <1>       	; |     PAGE FRAME BASE ADDRESS 31..12    | AVL |G|A|D|A|C|W|/|/|P|
  1240                              <1>       	; |                                       |     | |T| | |D|T|S|W| |
  1241                              <1>    	; +---------------------------------------+-----+---+-+-+---+-+-+-+
  1242                              <1> 	;
  1243                              <1>         ;       P      - PRESENT
  1244                              <1>         ;       R/W    - READ/WRITE
  1245                              <1>         ;       U/S    - USER/SUPERVISOR
  1246                              <1> 	;	PWT    - WRITE THROUGH
  1247                              <1> 	;	PCD    - CACHE DISABLE	
  1248                              <1> 	;	A      - ACCESSED	
  1249                              <1>         ;       D      - DIRTY
  1250                              <1> 	;	PAT    - PAGE ATTRIBUTE TABLE INDEX (CACHE BEHAVIOR)
  1251                              <1> 	;	G      - GLOBAL	 
  1252                              <1>         ;       AVL    - AVAILABLE FOR SYSTEMS PROGRAMMER USE
  1253                              <1> 	;
  1254                              <1> 	;
  1255                              <1> 	;; 80386 PAGE TABLE ENTRY (4 KByte Page)
  1256                              <1> 	;  31                                   12 11  9 8 7 6 5 4 3 2 1 0
  1257                              <1> 	; +---------------------------------------+-----+-+-+-+-+---+-+-+-+
  1258                              <1>       	; |                                       |     | | | | | | |U|R| |
  1259                              <1>       	; |     PAGE FRAME BASE ADDRESS 31..12    | AVL |0|0|D|A|0|0|/|/|P|
  1260                              <1>       	; |                                       |     | | | | | | |S|W| |
  1261                              <1>       	; +---------------------------------------+-----+-+-+-+-+---+-+-+-+
  1262                              <1> 	;
  1263                              <1>         ;       P      - PRESENT
  1264                              <1>         ;       R/W    - READ/WRITE
  1265                              <1>         ;       U/S    - USER/SUPERVISOR
  1266                              <1>         ;       D      - DIRTY
  1267                              <1>         ;       AVL    - AVAILABLE FOR SYSTEMS PROGRAMMER USE
  1268                              <1> 	;
  1269                              <1>         ;       NOTE: 0 INDICATES INTEL RESERVED. DO NOT DEFINE.
  1270                              <1> 	;
  1271                              <1> 	;
  1272                              <1> 	;; Invalid Page Table Entry
  1273                              <1> 	; 31                                                           1 0
  1274                              <1>       	; +-------------------------------------------------------------+-+
  1275                              <1>       	; |                                                             | |
  1276                              <1>       	; |                          AVAILABLE                          |0|
  1277                              <1>       	; |                                                             | |
  1278                              <1>       	; +-------------------------------------------------------------+-+
  1279                              <1> 	;
  1280                              <1> 
  1281 00004DD7 53                  <1> 	push	ebx
  1282 00004DD8 52                  <1> 	push	edx
  1283 00004DD9 51                  <1> 	push	ecx
  1284                              <1> 	;
  1285                              <1> 	; 21/09/2015 (debugging)
  1286 00004DDA FF05[84470100]      <1> 	inc	dword [u.pfcount] ; page fault count for running process
  1287 00004DE0 FF05[D4480100]      <1> 	inc	dword [PF_Count] ; total page fault count	
  1288                              <1> 	; 28/06/2015
  1289                              <1> 	;mov	edx, [error_code] ; Lower 5 bits are valid
  1290 00004DE6 8A15[CC480100]      <1> 	mov	dl, [error_code]
  1291                              <1> 	;
  1292 00004DEC F6C201              <1> 	test	dl, 1	; page fault was caused by a non-present page
  1293                              <1> 			; sign
  1294 00004DEF 7422                <1> 	jz	short pfh_alloc_np
  1295                              <1> 	; 
  1296                              <1> 	; If it is not a 'write on read only page' type page fault
  1297                              <1> 	; major page fault error with minor reason must be returned without 
  1298                              <1> 	; fixing the problem. 'sys_exit with error' will be needed
  1299                              <1> 	; after return here!
  1300                              <1> 	; Page fault will be remedied, by copying page contents
  1301                              <1> 	; to newly allocated page with write permission;
  1302                              <1> 	; sys_fork -> sys_exec -> copy on write, demand paging method is 
  1303                              <1> 	; used for working with minimum possible memory usage. 
  1304                              <1> 	; sys_fork will duplicate page directory and tables of parent  
  1305                              <1> 	; process with 'read only' flag. If the child process attempts to
  1306                              <1> 	; write on these read only pages, page fault will be directed here
  1307                              <1> 	; for allocating a new page with same data/content. 
  1308                              <1> 	;
  1309                              <1> 	; IMPORTANT : Retro UNIX 386 v1 (and SINGLIX and TR-DOS)
  1310                              <1> 	; will not force to separate CODE and DATA space 
  1311                              <1> 	; in a process/program... 
  1312                              <1> 	; CODE segment/section may contain DATA!
  1313                              <1> 	; It is flat, smoth and simplest programming method already as in 
  1314                              <1> 	; Retro UNIX 8086 v1 and MS-DOS programs.
  1315                              <1> 	;	
  1316 00004DF1 F6C202              <1> 	test	dl, 2	; page fault was caused by a page write
  1317                              <1> 			; sign
  1318 00004DF4 0F84AB000000        <1>         jz      pfh_p_err
  1319                              <1> 	; 31/08/2015
  1320 00004DFA F6C204              <1> 	test	dl, 4	; page fault was caused while CPL = 3 (user mode)
  1321                              <1> 			; sign.  (U+W+P = 4+2+1 = 7)
  1322 00004DFD 0F84A2000000        <1>         jz	pfh_pv_err
  1323                              <1> 	;
  1324                              <1> 	; make a new page and copy the parent's page content
  1325                              <1> 	; as the child's new page content
  1326                              <1> 	;
  1327 00004E03 0F20D3              <1> 	mov	ebx, cr2 ; CR2 contains the linear address 
  1328                              <1> 			 ; which has caused to page fault
  1329 00004E06 E8A2000000          <1> 	call 	copy_page
  1330 00004E0B 0F828D000000        <1>         jc      pfh_im_err ; insufficient memory
  1331                              <1> 	;
  1332 00004E11 EB7D                <1>         jmp     pfh_cpp_ok
  1333                              <1> 	;
  1334                              <1> pfh_alloc_np:
  1335 00004E13 E8E7FCFFFF          <1> 	call	allocate_page	; (allocate a new page)
  1336 00004E18 0F8280000000        <1>         jc      pfh_im_err	; 'insufficient memory' error
  1337                              <1> pfh_chk_cpl:
  1338                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  1339                              <1> 		; (Lower 12 bits are ZERO, because 
  1340                              <1> 		;	the address is on a page boundary)
  1341 00004E1E 80E204              <1> 	and	dl, 4	; CPL = 3 ?
  1342 00004E21 7505                <1> 	jnz	short pfh_um
  1343                              <1> 			; Page fault handler for kernel/system mode (CPL=0)		
  1344 00004E23 0F20DB              <1> 	mov	ebx, cr3 ; CR3 (Control Register 3) contains physical address
  1345                              <1> 			 ; of the current/active page directory
  1346                              <1> 			 ; (Always kernel/system mode page directory, here!)
  1347                              <1> 			 ; Note: Lower 12 bits are 0. (page boundary)
  1348 00004E26 EB06                <1> 	jmp	short pfh_get_pde
  1349                              <1> 	;
  1350                              <1> pfh_um:			; Page fault handler for user/appl. mode (CPL=3)
  1351 00004E28 8B1D[70470100]      <1>  	mov	ebx, [u.pgdir] ; Page directory of current/active process
  1352                              <1> 			; Physical address of the USER's page directory
  1353                              <1> 			; Note: Lower 12 bits are 0. (page boundary)
  1354                              <1> pfh_get_pde:
  1355 00004E2E 80CA03              <1> 	or	dl, 3	; USER + WRITE + PRESENT or SYSTEM + WRITE + PRESENT
  1356 00004E31 0F20D1              <1> 	mov	ecx, cr2 ; CR2 contains the virtual address 
  1357                              <1> 			 ; which has been caused to page fault
  1358                              <1> 			 ;
  1359 00004E34 C1E914              <1> 	shr	ecx, 20	 ; shift 20 bits right
  1360 00004E37 80E1FC              <1> 	and	cl, 0FCh ; mask lower 2 bits to get PDE offset		
  1361                              <1> 	;
  1362 00004E3A 01CB                <1> 	add	ebx, ecx ; now, EBX points to the relevant page dir entry 
  1363 00004E3C 8B0B                <1> 	mov	ecx, [ebx] ; physical (base) address of the page table 	
  1364 00004E3E F6C101              <1> 	test	cl, 1	 ; check bit 0 is set (1) or not (0).
  1365 00004E41 740B                <1> 	jz	short pfh_set_pde ; Page directory entry is not valid,
  1366                              <1> 			  	  ; set/validate page directory entry
  1367 00004E43 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  1368 00004E48 89CB                <1> 	mov	ebx, ecx ; Physical address of the page table
  1369 00004E4A 89C1                <1> 	mov	ecx, eax ; new page address (physical) 	
  1370 00004E4C EB16                <1> 	jmp	short pfh_get_pte
  1371                              <1> pfh_set_pde:
  1372                              <1> 	;; NOTE: Page directories and page tables never be swapped out!
  1373                              <1> 	;;	 (So, we know this PDE is empty or invalid)
  1374                              <1> 	;
  1375 00004E4E 08D0                <1> 	or	al, dl	 ; lower 3 bits are used as U/S, R/W, P flags
  1376 00004E50 8903                <1> 	mov	[ebx], eax ; Let's put the new page directory entry here !
  1377 00004E52 30C0                <1> 	xor	al, al	 ; clear lower (3..8) bits
  1378 00004E54 89C3                <1> 	mov	ebx, eax
  1379 00004E56 E8A4FCFFFF          <1> 	call	allocate_page	 ; (allocate a new page)
  1380 00004E5B 7241                <1> 	jc	short pfh_im_err   ; 'insufficient memory' error
  1381                              <1> pfh_spde_1:
  1382                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  1383 00004E5D 89C1                <1> 	mov	ecx, eax
  1384 00004E5F E815FDFFFF          <1> 	call	clear_page ; Clear page content
  1385                              <1> pfh_get_pte:
  1386 00004E64 0F20D0              <1> 	mov	eax, cr2 ; virtual address
  1387                              <1> 			 ; which has been caused to page fault
  1388 00004E67 89C7                <1> 	mov	edi, eax ; 20/07/2015
  1389 00004E69 C1E80C              <1> 	shr	eax, 12	 ; shift 12 bit right to get 
  1390                              <1> 			 ; higher 20 bits of the page fault address 
  1391 00004E6C 25FF030000          <1> 	and	eax, 3FFh ; mask PDE# bits, the result is PTE# (0 to 1023)
  1392 00004E71 C1E002              <1> 	shl	eax, 2	; shift 2 bits left to get PTE offset
  1393 00004E74 01C3                <1> 	add	ebx, eax ; now, EBX points to the relevant page table entry 
  1394 00004E76 8B03                <1> 	mov	eax, [ebx] ; get previous value of pte
  1395                              <1> 		; bit 0 of EAX is always 0 (otherwise we would not be here)
  1396 00004E78 21C0                <1> 	and	eax, eax
  1397 00004E7A 7410                <1> 	jz	short pfh_gpte_1
  1398                              <1> 	; 20/07/2015
  1399 00004E7C 87D9                <1> 	xchg	ebx, ecx ; new page address (physical)
  1400 00004E7E 55                  <1> 	push	ebp ; 20/07/2015
  1401 00004E7F 0F20D5              <1> 	mov	ebp, cr2
  1402                              <1> 		; ECX = physical address of the page table entry
  1403                              <1> 		; EBX = Memory page address (physical!)
  1404                              <1> 		; EAX = Swap disk (offset) address
  1405                              <1> 		; EBP = virtual address (page fault address)
  1406 00004E82 E8B7000000          <1> 	call	swap_in
  1407 00004E87 5D                  <1> 	pop	ebp
  1408 00004E88 7210                <1> 	jc      short pfh_err_retn
  1409 00004E8A 87CB                <1> 	xchg	ecx, ebx
  1410                              <1> 		; EBX = physical address of the page table entry
  1411                              <1> 		; ECX = new page
  1412                              <1> pfh_gpte_1:
  1413 00004E8C 08D1                <1> 	or	cl, dl	; lower 3 bits are used as U/S, R/W, P flags
  1414 00004E8E 890B                <1> 	mov	[ebx], ecx ; Let's put the new page table entry here !
  1415                              <1> pfh_cpp_ok:
  1416                              <1> 	; 20/07/2015
  1417 00004E90 0F20D3              <1> 	mov	ebx, cr2
  1418 00004E93 E8A9020000          <1> 	call 	add_to_swap_queue
  1419                              <1> 	;
  1420                              <1> 	; The new PTE (which contains the new page) will be added to 
  1421                              <1> 	; the swap queue, here. 
  1422                              <1> 	; (Later, if memory will become insufficient, 
  1423                              <1> 	; one page will be swapped out which is at the head of 
  1424                              <1> 	; the swap queue by using FIFO and access check methods.)
  1425                              <1> 	;
  1426 00004E98 31C0                <1> 	xor	eax, eax  ; 0
  1427                              <1> 	;
  1428                              <1> pfh_err_retn:
  1429 00004E9A 59                  <1> 	pop	ecx
  1430 00004E9B 5A                  <1> 	pop	edx
  1431 00004E9C 5B                  <1> 	pop	ebx
  1432 00004E9D C3                  <1> 	retn 
  1433                              <1> 	
  1434                              <1> pfh_im_err:
  1435 00004E9E B8E4000000          <1> 	mov	eax, ERR_MAJOR_PF + ERR_MINOR_IM ; Error code in AX
  1436                              <1> 			; Major (Primary) Error: Page Fault
  1437                              <1> 			; Minor (Secondary) Error: Insufficient Memory !
  1438 00004EA3 EBF5                <1> 	jmp	short pfh_err_retn
  1439                              <1> 
  1440                              <1> 
  1441                              <1> pfh_p_err: ; 09/03/2015
  1442                              <1> pfh_pv_err:
  1443                              <1> 	; Page fault was caused by a protection-violation
  1444 00004EA5 B8E6000000          <1> 	mov	eax, ERR_MAJOR_PF + ERR_MINOR_PV ; Error code in AX
  1445                              <1> 			; Major (Primary) Error: Page Fault
  1446                              <1> 			; Minor (Secondary) Error: Protection violation !
  1447 00004EAA F9                  <1> 	stc
  1448 00004EAB EBED                <1> 	jmp	short pfh_err_retn
  1449                              <1> 
  1450                              <1> copy_page:
  1451                              <1> 	; 22/09/2015
  1452                              <1> 	; 21/09/2015
  1453                              <1> 	; 19/09/2015
  1454                              <1> 	; 07/09/2015
  1455                              <1> 	; 31/08/2015
  1456                              <1> 	; 20/07/2015
  1457                              <1> 	; 05/05/2015
  1458                              <1> 	; 03/05/2015
  1459                              <1> 	; 18/04/2015
  1460                              <1> 	; 12/04/2015
  1461                              <1> 	; 30/10/2014
  1462                              <1> 	; 18/10/2014 (Retro UNIX 386 v1 - beginning)
  1463                              <1> 	;
  1464                              <1> 	; INPUT -> 
  1465                              <1> 	;	EBX = Virtual (linear) address of source page
  1466                              <1> 	;	     (Page fault address)
  1467                              <1> 	; OUTPUT ->
  1468                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF THE ALLOCATED PAGE
  1469                              <1> 	;	(corresponding PAGE TABLE ENTRY is mapped/set)
  1470                              <1> 	;	EAX = 0 (CF = 1) 
  1471                              <1> 	;		if there is not a free page to be allocated
  1472                              <1> 	;	(page content of the source page will be copied
  1473                              <1> 	;	onto the target/new page) 	
  1474                              <1> 	;
  1475                              <1> 	; Modified Registers -> ecx, ebx (except EAX)
  1476                              <1> 	;	
  1477 00004EAD 56                  <1> 	push	esi
  1478 00004EAE 57                  <1> 	push	edi
  1479                              <1> 	;push	ebx
  1480                              <1> 	;push	ecx
  1481 00004EAF 31F6                <1> 	xor 	esi, esi
  1482 00004EB1 C1EB0C              <1> 	shr	ebx, 12 ; shift 12 bits right to get PDE & PTE numbers
  1483 00004EB4 89D9                <1> 	mov	ecx, ebx ; save page fault address (as 12 bit shifted)
  1484 00004EB6 C1EB08              <1> 	shr	ebx, 8	 ; shift 8 bits right and then
  1485 00004EB9 80E3FC              <1> 	and	bl, 0FCh ; mask lower 2 bits to get PDE offset	
  1486 00004EBC 89DF                <1> 	mov 	edi, ebx ; save it for the parent of current process
  1487 00004EBE 031D[70470100]      <1> 	add	ebx, [u.pgdir] ; EBX points to the relevant page dir entry 
  1488 00004EC4 8B03                <1> 	mov	eax, [ebx] ; physical (base) address of the page table
  1489 00004EC6 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits 	
  1490 00004ECA 89CB                <1> 	mov	ebx, ecx   ; (restore higher 20 bits of page fault address)
  1491 00004ECC 81E3FF030000        <1> 	and	ebx, 3FFh  ; mask PDE# bits, the result is PTE# (0 to 1023)
  1492 00004ED2 66C1E302            <1> 	shl	bx, 2	   ; shift 2 bits left to get PTE offset
  1493 00004ED6 01C3                <1> 	add	ebx, eax   ; EBX points to the relevant page table entry 
  1494                              <1> 	; 07/09/2015
  1495 00004ED8 66F7030002          <1>         test    word [ebx], PTE_DUPLICATED ; (Does current process share this
  1496                              <1> 				     ; read only page as a child process?)	
  1497 00004EDD 7509                <1> 	jnz	short cpp_0 ; yes
  1498 00004EDF 8B0B                <1> 	mov	ecx, [ebx] ; PTE value
  1499 00004EE1 6681E100F0          <1> 	and	cx, PTE_A_CLEAR ; 0F000h  ; clear page attributes
  1500 00004EE6 EB32                <1> 	jmp	short cpp_1
  1501                              <1> cpp_0:
  1502 00004EE8 89FE                <1> 	mov	esi, edi
  1503 00004EEA 0335[74470100]      <1> 	add	esi, [u.ppgdir] ; the parent's page directory entry
  1504 00004EF0 8B06                <1> 	mov	eax, [esi] ; physical (base) address of the page table
  1505 00004EF2 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  1506 00004EF6 89CE                <1> 	mov	esi, ecx   ; (restore higher 20 bits of page fault address)	
  1507 00004EF8 81E6FF030000        <1> 	and	esi, 3FFh  ; mask PDE# bits, the result is PTE# (0 to 1023)
  1508 00004EFE 66C1E602            <1> 	shl	si, 2	   ; shift 2 bits left to get PTE offset
  1509 00004F02 01C6                <1> 	add	esi, eax   ; EDX points to the relevant page table entry  	
  1510 00004F04 8B0E                <1> 	mov	ecx, [esi] ; PTE value of the parent process
  1511                              <1> 	; 21/09/2015
  1512 00004F06 8B03                <1> 	mov	eax, [ebx] ; PTE value of the child process
  1513 00004F08 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear page attributes	
  1514                              <1> 	;
  1515 00004F0C F6C101              <1> 	test	cl, PTE_A_PRESENT ; is it a present/valid page ?
  1516 00004F0F 7424                <1> 	jz	short cpp_3 ; the parent's page is not same page  	
  1517                              <1> 	;
  1518 00004F11 6681E100F0          <1> 	and	cx, PTE_A_CLEAR ; 0F000h ; clear page attributes
  1519 00004F16 39C8                <1> 	cmp	eax, ecx   ; Same page?	
  1520 00004F18 751B                <1> 	jne	short cpp_3 ; Parent page and child page are not same 
  1521                              <1> 			    ; Convert child's page to writable page
  1522                              <1> cpp_1:
  1523 00004F1A E8E0FBFFFF          <1> 	call	allocate_page
  1524 00004F1F 721A                <1> 	jc	short cpp_4 ; 'insufficient memory' error
  1525 00004F21 21F6                <1> 	and	esi, esi    ; check ESI is valid or not
  1526 00004F23 7405                <1> 	jz	short cpp_2
  1527                              <1> 		; Convert read only page to writable page 
  1528                              <1> 		;(for the parent of the current process)
  1529                              <1> 	;and	word [esi], PTE_A_CLEAR ; 0F000h
  1530                              <1> 	; 22/09/2015
  1531 00004F25 890E                <1> 	mov	[esi], ecx
  1532 00004F27 800E07              <1> 	or	byte [esi], PTE_A_PRESENT + PTE_A_WRITE + PTE_A_USER
  1533                              <1> 				 ; 1+2+4 = 7
  1534                              <1> cpp_2:
  1535 00004F2A 89C7                <1> 	mov	edi, eax ; new page address of the child process
  1536                              <1> 	; 07/09/2015
  1537 00004F2C 89CE                <1> 	mov	esi, ecx ; the page address of the parent process
  1538 00004F2E B900040000          <1> 	mov	ecx, PAGE_SIZE / 4
  1539 00004F33 F3A5                <1> 	rep	movsd ; 31/08/2015
  1540                              <1> cpp_3:		
  1541 00004F35 0C07                <1> 	or	al, PTE_A_PRESENT + PTE_A_WRITE + PTE_A_USER ; 1+2+4 = 7
  1542 00004F37 8903                <1> 	mov	[ebx], eax ; Update PTE
  1543 00004F39 28C0                <1> 	sub	al, al ; clear attributes
  1544                              <1> cpp_4:
  1545                              <1> 	;pop	ecx
  1546                              <1> 	;pop	ebx
  1547 00004F3B 5F                  <1> 	pop	edi
  1548 00004F3C 5E                  <1> 	pop	esi
  1549 00004F3D C3                  <1> 	retn
  1550                              <1> 
  1551                              <1> ;; 28/04/2015
  1552                              <1> ;; 24/10/2014
  1553                              <1> ;; 21/10/2014 (Retro UNIX 386 v1 - beginning)
  1554                              <1> ;; SWAP_PAGE_QUEUE (4096 bytes)
  1555                              <1> ;;
  1556                              <1> ;;   0000   0001   0002   0003   ....   1020   1021   1022   1023	
  1557                              <1> ;; +------+------+------+------+-    -+------+------+------+------+
  1558                              <1> ;; |  pg1 |  pg2 |  pg3 |  pg4 | .... |pg1021|pg1022|pg1023|pg1024|
  1559                              <1> ;; +------+------+------+------+-    -+------+------+------+------+    
  1560                              <1> ;;
  1561                              <1> ;; [swpq_last] = 0 to 4096 (step 4) -> the last position on the queue
  1562                              <1> ;;
  1563                              <1> ;; Method:
  1564                              <1> ;;	Swap page queue is a list of allocated pages with physical
  1565                              <1> ;;	addresses (system mode virtual adresses = physical addresses).
  1566                              <1> ;;	It is used for 'swap_in' and 'swap_out' procedures.
  1567                              <1> ;;	When a new page is being allocated, swap queue is updated
  1568                              <1> ;;	by 'swap_queue_shift' procedure, header of the queue (offset 0)
  1569                              <1> ;;	is checked for 'accessed' flag. If the 1st page on the queue
  1570                              <1> ;;	is 'accessed' or 'read only', it is dropped from the list;
  1571                              <1> ;;	other pages from the 2nd to the last (in [swpq_last]) shifted
  1572                              <1> ;; 	to head then the 2nd page becomes the 1st and '[swpq_last]' 
  1573                              <1> ;;	offset value becomes it's previous offset value - 4.
  1574                              <1> ;;	If the 1st page of the swap page queue is not 'accessed'	
  1575                              <1> ;;	the queue/list is not shifted.
  1576                              <1> ;;	After the queue/list shift, newly allocated page is added
  1577                              <1> ;;	to the tail of the queue at the [swpq_count*4] position.
  1578                              <1> ;;	But, if [swpq_count] > 1023, the newly allocated page
  1579                              <1> ;;	will not be added to the tail of swap page queue.  		 
  1580                              <1> ;;	
  1581                              <1> ;;	During 'swap_out' procedure, swap page queue is checked for
  1582                              <1> ;;	the first non-accessed, writable page in the list, 
  1583                              <1> ;;	from the head to the tail. The list is shifted to left 
  1584                              <1> ;;	(to the head) till a non-accessed page will be found in the list.
  1585                              <1> ;;	Then, this page	is swapped out (to disk) and then it is dropped
  1586                              <1> ;;	from the list by a final swap queue shift. [swpq_count] value
  1587                              <1> ;;	is changed. If all pages on the queue' are 'accessed', 
  1588                              <1> ;;	'insufficient memory' error will be returned ('swap_out' 
  1589                              <1> ;;	procedure will be failed)...
  1590                              <1> ;;
  1591                              <1> ;;	Note: If the 1st page of the queue is an 'accessed' page,
  1592                              <1> ;;	'accessed' flag of the page will be reset (0) and that page
  1593                              <1> ;;	(PTE) will be added to the tail of the queue after
  1594                              <1> ;;	the check, if [swpq_count] < 1023. If [swpq_count] = 1024
  1595                              <1> ;;	the queue will be rotated and the PTE in the head will be
  1596                              <1> ;;	added to the tail after resetting 'accessed' bit. 
  1597                              <1> ;;
  1598                              <1> ;;
  1599                              <1> ;;	
  1600                              <1> ;; SWAP DISK/FILE (with 4096 bytes swapped page blocks)
  1601                              <1> ;;
  1602                              <1> ;;  00000000  00000004  00000008  0000000C   ...   size-8    size-4
  1603                              <1> ;; +---------+---------+---------+---------+-- --+---------+---------+
  1604                              <1> ;; |descriptr| page(1) | page(2) | page(3) | ... |page(n-1)| page(n) |
  1605                              <1> ;; +---------+---------+---------+---------+-- --+---------+---------+    
  1606                              <1> ;;
  1607                              <1> ;; [swpd_next] = the first free block address in swapped page records
  1608                              <1> ;;    		 for next free block search by 'swap_out' procedure.
  1609                              <1> ;; [swpd_size] = swap disk/file size in sectors (512 bytes)
  1610                              <1> ;;		 NOTE: max. possible swap disk size is 1024 GB
  1611                              <1> ;; 		 (entire swap space must be accessed by using
  1612                              <1> ;;		 31 bit offset address) 
  1613                              <1> ;; [swpd_free] = free block (4096 bytes) count in swap disk/file space
  1614                              <1> ;; [swpd_start] = absolute/start address of the swap disk/file
  1615                              <1> ;;		  0 for file, or beginning sector of the swap partition
  1616                              <1> ;; [swp_drv] = logical drive description table addr. of swap disk/file
  1617                              <1> ;;
  1618                              <1> ;; 					
  1619                              <1> ;; Method:
  1620                              <1> ;;	When the memory (ram) becomes insufficient, page allocation
  1621                              <1> ;;	procedure swaps out a page from memory to the swap disk 
  1622                              <1> ;;	(partition) or swap file to get a new free page at the memory.
  1623                              <1> ;;	Swapping out is performed by using swap page queue.
  1624                              <1> ;;
  1625                              <1> ;; 	Allocation block size of swap disk/file is equal to page size
  1626                              <1> ;;	(4096 bytes). Swapping address (in sectors) is recorded
  1627                              <1> ;;	into relevant page file entry as 31 bit physical (logical)
  1628                              <1> ;;	offset address as 1 bit shifted to left for present flag (0).
  1629                              <1> ;;	Swapped page address is between 1 and swap disk/file size - 4.	  
  1630                              <1> ;;	Absolute physical (logical) address of the swapped page is 
  1631                              <1> ;;	calculated by adding offset value to the swap partition's 
  1632                              <1> ;;	start address. If the swap device (disk) is a virtual disk 
  1633                              <1> ;;	or it is a file, start address of the swap disk/volume is 0, 
  1634                              <1> ;;	and offset value is equal to absolute (physical or logical)
  1635                              <1> ;;	address/position. (It has not to be ZERO if the swap partition 
  1636                              <1> ;;	is in a partitioned virtual hard disk.) 
  1637                              <1> ;;
  1638                              <1> ;;	Note: Swap addresses are always specified/declared in sectors, 
  1639                              <1> ;;	not in bytes or	in blocks/zones/clusters (4096 bytes) as unit.
  1640                              <1> ;;
  1641                              <1> ;;	Swap disk/file allocation is mapped via 'Swap Allocation Table'
  1642                              <1> ;;	at memory as similar to 'Memory Allocation Table'.
  1643                              <1> ;;
  1644                              <1> ;;	Every bit of Swap Allocation Table repsesents one swap block
  1645                              <1> ;;	(equal to page size) respectively. Bit 0 of the S.A.T. byte 0
  1646                              <1> ;;	is reserved for swap disk/file block 0 as descriptor block
  1647                              <1> ;;	(also for compatibility with PTE). If bit value is ZERO,
  1648                              <1> ;;	it means relevant (respective) block is in use, and, 
  1649                              <1> ;;	of course, if bit value is 1, it means relevant (respective)
  1650                              <1> ;;      swap disk/file block is free.
  1651                              <1> ;;	For example: bit 1 of the byte 128 repsesents block 1025 
  1652                              <1> ;;	(128*8+1) or sector (offset) 8200 on the swap disk or
  1653                              <1> ;;	byte (offset/position) 4198400 in the swap file. 
  1654                              <1> ;;	4GB swap space is represented via 128KB Swap Allocation Table.
  1655                              <1> ;;	Initial layout of Swap Allocation Table is as follows:
  1656                              <1> ;;	------------------------------------------------------------
  1657                              <1> ;;	0111111111111111111111111 .... 11111111111111111111111111111
  1658                              <1> ;;	------------------------------------------------------------
  1659                              <1> ;;	(0 is reserved block, 1s represent free blocks respectively.)
  1660                              <1> ;;	(Note: Allocation cell/unit of the table is bit, not byte)
  1661                              <1> ;;
  1662                              <1> ;;	..............................................................
  1663                              <1> ;;
  1664                              <1> ;;	'swap_out' procedure checks 'free_swap_blocks' count at first,
  1665                              <1> ;;	then it searches Swap Allocation Table if free count is not
  1666                              <1> ;;	zero. From begining the [swpd_next] dword value, the first bit 
  1667                              <1> ;;	position with value of 1 on the table is converted to swap
  1668                              <1> ;;	disk/file offset address, in sectors (not 4096 bytes block).
  1669                              <1> ;;	'ldrv_write' procedure is called with ldrv (logical drive
  1670                              <1> ;;	number of physical swap disk or virtual swap disk)
  1671                              <1> ;;	number, sector offset (not absolute sector -LBA- number),
  1672                              <1> ;;	and sector count (8, 512*8 = 4096) and buffer adress
  1673                              <1> ;;	(memory page). That will be a direct disk write procedure.
  1674                              <1> ;;	(for preventing late memory allocation, significant waiting). 
  1675                              <1> ;;	If disk write procedure returns with error or free count of 
  1676                              <1> ;;	swap blocks is ZERO, 'swap_out' procedure will return with
  1677                              <1> ;;	'insufficient memory error' (cf=1). 
  1678                              <1> ;;
  1679                              <1> ;;	(Note: Even if free swap disk/file blocks was not zero,
  1680                              <1> ;;	any disk write error will not be fixed by 'swap_out' procedure,
  1681                              <1> ;;	in other words, 'swap_out' will not check the table for other
  1682                              <1> ;;	free blocks after a disk write error. It will return to 
  1683                              <1> ;;	the caller with error (CF=1) which means swapping is failed. 
  1684                              <1> ;;
  1685                              <1> ;;	After writing the page on to swap disk/file address/sector,
  1686                              <1> ;;	'swap_out' procesure returns with that swap (offset) sector
  1687                              <1> ;;	address (cf=0). 
  1688                              <1> ;;
  1689                              <1> ;;	..............................................................
  1690                              <1> ;;
  1691                              <1> ;;	'swap_in' procedure loads addressed (relevant) swap disk or
  1692                              <1> ;;	file sectors at specified memory page. Then page allocation
  1693                              <1> ;;	procedure updates relevant page table entry with 'present' 
  1694                              <1> ;;	attribute. If swap disk or file reading fails there is nothing
  1695                              <1> ;;	to do, except to terminate the process which is the owner of
  1696                              <1> ;;	the swapped page.
  1697                              <1> ;;
  1698                              <1> ;;	'swap_in' procedure sets the relevant/respective bit value
  1699                              <1> ;;	in the Swap Allocation Table (as free block). 'swap_in' also
  1700                              <1> ;;	updates [swpd_first] pointer if it is required.
  1701                              <1> ;;
  1702                              <1> ;;	..............................................................	 
  1703                              <1> ;;
  1704                              <1> ;;	Note: If [swap_enabled] value is ZERO, that means there is not
  1705                              <1> ;;	a swap disk or swap file in use... 'swap_in' and 'swap_out'
  1706                              <1> ;;	procedures ans 'swap page que' procedures will not be active...
  1707                              <1> ;;	'Insufficient memory' error will be returned by 'swap_out'
  1708                              <1> ;;	and 'general protection fault' will be returned by 'swap_in'
  1709                              <1> ;;	procedure, if it is called mistakenly (a wrong value in a PTE).		
  1710                              <1> ;;
  1711                              <1> 
  1712                              <1> swap_in:
  1713                              <1> 	; 31/08/2015
  1714                              <1> 	; 20/07/2015
  1715                              <1> 	; 28/04/2015
  1716                              <1> 	; 18/04/2015
  1717                              <1> 	; 24/10/2014 (Retro UNIX 386 v1 - beginning)
  1718                              <1> 	;
  1719                              <1> 	; INPUT -> 
  1720                              <1> 	;	EBX = PHYSICAL (real/flat) ADDRESS OF THE MEMORY PAGE
  1721                              <1> 	;	EBP = VIRTUAL (LINEAR) ADDRESS (page fault address)
  1722                              <1> 	;	EAX = Offset Address for the swapped page on the
  1723                              <1> 	;	      swap disk or in the swap file.
  1724                              <1> 	;
  1725                              <1> 	; OUTPUT ->
  1726                              <1> 	;	EAX = 0 if loading at memory has been successful
  1727                              <1> 	;
  1728                              <1> 	;	CF = 1 -> swap disk reading error (disk/file not present
  1729                              <1> 	;		  or sector not present or drive not ready
  1730                              <1> 	;	     EAX = Error code
  1731                              <1> 	;	     [u.error] = EAX 
  1732                              <1> 	;		       = The last error code for the process
  1733                              <1> 	;		         (will be reset after returning to user)	  
  1734                              <1> 	;
  1735                              <1> 	; Modified Registers -> EAX
  1736                              <1> 	;
  1737                              <1> 
  1738 00004F3E 833D[B6480100]00    <1>         cmp     dword [swp_drv], 0
  1739 00004F45 7646                <1> 	jna	short swpin_dnp_err
  1740                              <1> 
  1741 00004F47 3B05[BA480100]      <1> 	cmp	eax, [swpd_size]
  1742 00004F4D 734A                <1> 	jnb	short swpin_snp_err
  1743                              <1> 
  1744 00004F4F 56                  <1> 	push	esi
  1745 00004F50 53                  <1> 	push	ebx
  1746 00004F51 51                  <1> 	push	ecx
  1747 00004F52 8B35[B6480100]      <1> 	mov	esi, [swp_drv]	
  1748 00004F58 B908000000          <1> 	mov	ecx, PAGE_SIZE / LOGIC_SECT_SIZE  ; 8 !
  1749                              <1> 		; Note: Even if corresponding physical disk's sector 
  1750                              <1> 		; size different than 512 bytes, logical disk sector
  1751                              <1> 		; size is 512 bytes and disk reading procedure
  1752                              <1> 		; will be performed for reading 4096 bytes
  1753                              <1> 		; (2*2048, 8*512). 
  1754                              <1> 	; ESI = Logical disk description table address
  1755                              <1> 	; EBX = Memory page (buffer) address (physical!)
  1756                              <1> 	; EAX = Sector adress (offset address, logical sector number)
  1757                              <1> 	; ECX = Sector count ; 8 sectors
  1758 00004F5D 50                  <1> 	push	eax
  1759 00004F5E E8B2020000          <1> 	call	logical_disk_read
  1760 00004F63 58                  <1> 	pop	eax
  1761 00004F64 730C                <1> 	jnc	short swpin_read_ok
  1762                              <1> 	;
  1763 00004F66 B828000000          <1> 	mov	eax, SWP_DISK_READ_ERR ; drive not ready or read error
  1764 00004F6B A3[80470100]        <1> 	mov	[u.error], eax
  1765 00004F70 EB17                <1> 	jmp	short swpin_retn
  1766                              <1> 	;
  1767                              <1> swpin_read_ok:
  1768                              <1> 	; EAX = Offset address (logical sector number)
  1769 00004F72 E810020000          <1> 	call	unlink_swap_block  ; Deallocate swap block	
  1770                              <1> 	;
  1771                              <1> 	; EBX = Memory page (buffer) address (physical!)
  1772                              <1> 	; 20/07/2015
  1773 00004F77 89EB                <1> 	mov	ebx, ebp ; virtual address (page fault address)
  1774 00004F79 6681E300F0          <1>         and     bx, ~PAGE_OFF ; ~0FFFh ; reset bits, 0 to 11
  1775 00004F7E 8A1D[6B470100]      <1> 	mov	bl, [u.uno] ; current process number
  1776                              <1> 	; EBX = Virtual address & process number combination
  1777 00004F84 E8DB000000          <1> 	call	swap_queue_shift
  1778                              <1> 	; eax = 0 ; 10/06/2016 (if ebx input > 0, eax output = 0)
  1779                              <1> 	;sub	eax, eax  ; 0 ; Error Code = 0  (no error)
  1780                              <1> 	; zf = 1
  1781                              <1> swpin_retn:
  1782 00004F89 59                  <1> 	pop	ecx
  1783 00004F8A 5B                  <1> 	pop	ebx
  1784 00004F8B 5E                  <1> 	pop	esi
  1785 00004F8C C3                  <1> 	retn
  1786                              <1> 
  1787                              <1> swpin_dnp_err:
  1788 00004F8D B829000000          <1> 	mov	eax, SWP_DISK_NOT_PRESENT_ERR
  1789                              <1> swpin_err_retn:
  1790 00004F92 A3[80470100]        <1> 	mov	[u.error], eax
  1791 00004F97 F9                  <1> 	stc
  1792 00004F98 C3                  <1> 	retn
  1793                              <1> 
  1794                              <1> swpin_snp_err:
  1795 00004F99 B82A000000          <1> 	mov	eax, SWP_SECTOR_NOT_PRESENT_ERR
  1796 00004F9E EBF2                <1> 	jmp	short swpin_err_retn
  1797                              <1> 
  1798                              <1> swap_out:
  1799                              <1> 	; 10/06/2016
  1800                              <1> 	; 07/06/2016
  1801                              <1>         ; 23/05/2016
  1802                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  1803                              <1> 	; 24/10/2014 - 31/08/2015 (Retro UNIX 386 v1)
  1804                              <1> 	;
  1805                              <1> 	; INPUT -> 
  1806                              <1> 	;	none
  1807                              <1> 	;
  1808                              <1> 	; OUTPUT ->
  1809                              <1> 	;	EAX = Physical page address (which is swapped out
  1810                              <1> 	;	      for allocating a new page)
  1811                              <1> 	;	CF = 1 -> swap disk writing error (disk/file not present
  1812                              <1> 	;		  or sector not present or drive not ready
  1813                              <1> 	;	     EAX = Error code
  1814                              <1> 	;	     [u.error] = EAX 
  1815                              <1> 	;		       = The last error code for the process
  1816                              <1> 	;		         (will be reset after returning to user)	  
  1817                              <1> 	;
  1818                              <1> 	; Modified Registers -> none (except EAX)
  1819                              <1> 	;
  1820 00004FA0 66833D[B4480100]01  <1> 	cmp 	word [swpq_count], 1
  1821 00004FA8 0F82AF000000        <1>         jc      swpout_im_err ; 'insufficient memory'
  1822                              <1> 
  1823                              <1>         ;cmp    dword [swp_drv], 1
  1824                              <1> 	;jc	short swpout_dnp_err ; 'swap disk/file not present'
  1825                              <1> 
  1826 00004FAE 833D[BE480100]01    <1>         cmp     dword [swpd_free], 1
  1827 00004FB5 0F828F000000        <1>         jc      swpout_nfspc_err ; 'no free space on swap disk'
  1828                              <1> 
  1829 00004FBB 53                  <1> 	push	ebx ; *
  1830                              <1> swpout_1:
  1831                              <1> 	; 10/06/2016
  1832 00004FBC 31DB                <1> 	xor	ebx, ebx ; shift the queue and return a PTE value
  1833 00004FBE E8A1000000          <1> 	call	swap_queue_shift
  1834 00004FC3 21C0                <1> 	and	eax, eax	; 0 = empty queue (improper entries)
  1835 00004FC5 0F848A000000        <1>         jz      swpout_npts_err        ; There is not any proper PTE
  1836                              <1> 				       ; pointer in the swap queue
  1837                              <1> 	; EAX = PTE value of the page
  1838                              <1> 	; EBX = PTE address of the page
  1839 00004FCB 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  1840                              <1> 	;
  1841                              <1> 	; 07/06/2016
  1842                              <1> 	; 19/05/2016
  1843                              <1> 	; check this page is in timer events or not
  1844                              <1> 	
  1845                              <1> swpout_timer_page_0:
  1846 00004FCF 52                  <1> 	push	edx ; **
  1847                              <1> 
  1848                              <1> 	; 07/06/2016
  1849 00004FD0 803D[773E0100]00    <1> 	cmp	byte [timer_events], 0 
  1850 00004FD7 762F                <1> 	jna	short swpout_2
  1851                              <1> 	;
  1852 00004FD9 8A15[773E0100]      <1> 	mov	dl, [timer_events]
  1853                              <1> 
  1854 00004FDF 51                  <1> 	push	ecx ; ***
  1855 00004FE0 53                  <1> 	push	ebx ; ****
  1856 00004FE1 BB[B4470100]        <1> 	mov	ebx, timer_set ; beginning address of timer event
  1857                              <1> 			       ; structures 
  1858                              <1> swpout_timer_page_1:
  1859 00004FE6 8A0B                <1> 	mov	cl, [ebx]
  1860 00004FE8 08C9                <1> 	or	cl, cl ; 0 = free, >0 = process number
  1861 00004FEA 7415                <1> 	jz	short swpout_timer_page_3
  1862 00004FEC 8B4B0C              <1> 	mov	ecx, [ebx+12] ; response (signal return) address
  1863 00004FEF 6681E100F0          <1> 	and	cx, PTE_A_CLEAR ; clear offset part (right 12 bits)
  1864                              <1> 				; of the response byte address, to
  1865                              <1> 				; get beginning of the page address)
  1866 00004FF4 39C8                <1> 	cmp	eax, ecx
  1867 00004FF6 7505                <1> 	jne	short swpout_timer_page_2 ; not same page
  1868                              <1> 	
  1869                              <1> 	; !same page!
  1870                              <1> 	;
  1871                              <1> 	; NOTE: // 19/05/2016 // - TRDOS 386 feature only ! -
  1872                              <1> 	; This page will be used by the kernel to put timer event
  1873                              <1> 	; response (signal return) byte at the requested address;
  1874                              <1> 	; in order to prevent a possible wrong write (while
  1875                              <1> 	; this page is swapped out) on physical memory,
  1876                              <1> 	; we must protect this page against to be swapped out!
  1877                              <1> 	;
  1878 00004FF8 5B                  <1> 	pop	ebx ; ****
  1879 00004FF9 59                  <1> 	pop	ecx ; ***
  1880 00004FFA 5A                  <1> 	pop	edx ; **
  1881 00004FFB EBBF                <1> 	jmp	short swpout_1	; do not swap out this page !
  1882                              <1>  
  1883                              <1> swpout_timer_page_2:
  1884                              <1> 	; 07/06/2016
  1885 00004FFD FECA                <1> 	dec	dl
  1886 00004FFF 7405                <1> 	jz	short swpout_timer_page_4
  1887                              <1> swpout_timer_page_3:
  1888                              <1> 	;cmp	ebx, timer_set + 240 ; last timer event (15*16) 
  1889                              <1> 	;jnb	short swpout_timer_page_4
  1890 00005001 83C310              <1> 	add	ebx, 16
  1891 00005004 EBE0                <1> 	jmp	short swpout_timer_page_1	
  1892                              <1> 
  1893                              <1> swpout_timer_page_4:
  1894 00005006 5B                  <1> 	pop	ebx ; ****
  1895 00005007 59                  <1> 	pop	ecx ; ***
  1896                              <1> swpout_2:
  1897 00005008 89DA                <1> 	mov	edx, ebx	       ; Page table entry address	
  1898 0000500A 89C3                <1> 	mov	ebx, eax	       ; Buffer (Page) Address				
  1899                              <1> 	;
  1900 0000500C E8A9010000          <1> 	call	link_swap_block
  1901 00005011 7304                <1> 	jnc	short swpout_3	       ; It may not be needed here	
  1902                              <1> 				       ; because [swpd_free] value
  1903                              <1> 				       ; was checked at the beginging. 	
  1904 00005013 5A                  <1> 	pop	edx ; **
  1905 00005014 5B                  <1> 	pop	ebx ; *
  1906 00005015 EB33                <1> 	jmp	short swpout_nfspc_err 
  1907                              <1> swpout_3:
  1908 00005017 A900000080          <1> 	test	eax, 80000000h ; test bit 31 (this may not be needed!)
  1909 0000501C 752C                <1> 	jnz	short swpout_nfspc_err  ; 10/06/2016 (bit 31 = 1 !)
  1910                              <1> 	;	
  1911 0000501E 56                  <1> 	push	esi ; **
  1912 0000501F 51                  <1> 	push	ecx ; ***
  1913 00005020 50                  <1> 	push	eax ; sector address ; (31 bit !, bit 31 = 0)
  1914 00005021 8B35[B6480100]      <1> 	mov	esi, [swp_drv]	
  1915 00005027 B908000000          <1> 	mov	ecx, PAGE_SIZE / LOGIC_SECT_SIZE  ; 8 !
  1916                              <1> 		; Note: Even if corresponding physical disk's sector 
  1917                              <1> 		; size different than 512 bytes, logical disk sector
  1918                              <1> 		; size is 512 bytes and disk writing procedure
  1919                              <1> 		; will be performed for writing 4096 bytes
  1920                              <1> 		; (2*2048, 8*512). 
  1921                              <1> 	; ESI = Logical disk description table address
  1922                              <1> 	; EBX = Buffer (Page) address
  1923                              <1> 	; EAX = Sector adress (offset address, logical sector number)
  1924                              <1> 	; ECX = Sector count ; 8 sectors
  1925                              <1> 	; edx = PTE address
  1926 0000502C E8E5010000          <1> 	call	logical_disk_write
  1927                              <1> 	; edx = PTE address
  1928 00005031 59                  <1> 	pop	ecx ; sector address	
  1929 00005032 730C                <1> 	jnc	short swpout_write_ok
  1930                              <1> 	;
  1931                              <1> 	;; call	unlink_swap_block ; this block must be left as 'in use'
  1932                              <1> swpout_dw_err:
  1933 00005034 B82C000000          <1> 	mov	eax, SWP_DISK_WRITE_ERR ; drive not ready or write error
  1934 00005039 A3[80470100]        <1> 	mov	[u.error], eax
  1935 0000503E EB06                <1> 	jmp	short swpout_retn
  1936                              <1> 	;
  1937                              <1> swpout_write_ok:
  1938                              <1> 	; EBX = Buffer (page) address
  1939                              <1> 	; EDX = Page Table Entry address
  1940                              <1> 	; ECX = Swap disk sector (file block) address (31 bit)
  1941 00005040 D1E1                <1> 	shl 	ecx, 1  ; 31 bit sector address from bit 1 to bit 31 
  1942 00005042 890A                <1> 	mov 	[edx], ecx 
  1943                              <1> 		; bit 0 = 0 (swapped page)
  1944 00005044 89D8                <1> 	mov	eax, ebx
  1945                              <1> swpout_retn:
  1946 00005046 59                  <1> 	pop	ecx ; ***
  1947 00005047 5E                  <1> 	pop	esi ; **
  1948 00005048 5B                  <1> 	pop	ebx ; *
  1949 00005049 C3                  <1> 	retn
  1950                              <1> 
  1951                              <1> ;swpout_dnp_err:
  1952                              <1> ;	mov	eax, SWP_DISK_NOT_PRESENT_ERR ; disk not present
  1953                              <1> ;	jmp	short swpout_err_retn
  1954                              <1> swpout_nfspc_err:
  1955 0000504A B82B000000          <1> 	mov	eax, SWP_NO_FREE_SPACE_ERR ; no free space
  1956                              <1> swpout_err_retn:
  1957 0000504F A3[80470100]        <1> 	mov	[u.error], eax
  1958                              <1> 	;stc
  1959 00005054 C3                  <1> 	retn
  1960                              <1> swpout_npts_err:
  1961 00005055 B82D000000          <1> 	mov	eax, SWP_NO_PAGE_TO_SWAP_ERR
  1962 0000505A 5B                  <1> 	pop	ebx
  1963 0000505B EBF2                <1> 	jmp	short swpout_err_retn
  1964                              <1> swpout_im_err:
  1965 0000505D B804000000          <1> 	mov	eax, ERR_MINOR_IM ; insufficient (out of) memory
  1966 00005062 EBEB                <1> 	jmp	short swpout_err_retn
  1967                              <1> 
  1968                              <1> swap_queue_shift:
  1969                              <1> 	; 10/06/2016
  1970                              <1> 	; 09/06/2016 - TRDOS 386 (TRDOS v2.0)
  1971                              <1> 	; 23/10/2014 - 20/07/2015 (Retro UNIX 386 v1)
  1972                              <1> 	;
  1973                              <1> 	; INPUT ->
  1974                              <1> 	;	EBX = Virtual (linear) address (bit 12 to 31) 
  1975                              <1> 	;	      and process number combination (bit 0 to 11)
  1976                              <1> 	;	EBX = 0 -> shift/drop from the head (offset 0)
  1977                              <1> 	;	
  1978                              <1> 	; OUTPUT ->
  1979                              <1> 	;	If EBX input > 0 
  1980                              <1> 	;	   the queue will be shifted 4 bytes (dword),
  1981                              <1> 	; 	   from the tail to the head, up to entry offset
  1982                              <1> 	; 	   which points to EBX input value or nothing
  1983                              <1> 	;	   to do if EBX value is not found in the queue.
  1984                              <1> 	;	   (The entry -with EBX value- will be removed
  1985                              <1> 	;	   from the queue if it is found.)
  1986                              <1> 	;
  1987                              <1> 	;	   EAX = 0		
  1988                              <1> 	;
  1989                              <1> 	;	If EBX input = 0
  1990                              <1> 	;	   the queue will be shifted 4 bytes (dword),
  1991                              <1> 	; 	   from the tail to the head, if the PTE address
  1992                              <1> 	;	   which is pointed in head of the queue is marked
  1993                              <1> 	;	   as "accessed" or it is marked as "non present".
  1994                              <1> 	;	   (If "accessed" flag of the PTE -which is pointed
  1995                              <1> 	;	   in the head- is set -to 1-, it will be reset
  1996                              <1> 	;	   -to 0- and then, the queue will be rotated 
  1997                              <1> 	;	   -without dropping pointer of the PTE from 
  1998                              <1> 	;	   the queue- for 4 bytes on head to tail direction.
  1999                              <1> 	;	   Pointer in the head will be moved into the tail,
  2000                              <1> 	;	   other PTEs will be shifted on head direction.)
  2001                              <1> 	;
  2002                              <1> 	;	   Swap queue will be shifted up to the first
  2003                              <1> 	;	   'present' or 'non accessed' page will be found
  2004                              <1> 	;	   (as pointed) in the queue head (then it will be
  2005                              <1>         ;          removed/dropped from the queue).
  2006                              <1> 	;
  2007                              <1> 	;	   EAX (> 0) = PTE value of the page which is
  2008                              <1> 	;		 (it's pointer -virtual address-) dropped
  2009                              <1> 	;		 (removed) from swap queue.
  2010                              <1> 	;	   EBX = PTE address of the page (if EAX > 0)
  2011                              <1> 	;	         which is (it's pointer -virtual address-)
  2012                              <1> 	;		 dropped (removed) from swap queue.
  2013                              <1> 	;
  2014                              <1> 	;	   EAX = 0 -> empty swap queue ! 
  2015                              <1> 	;
  2016                              <1> 	; Modified Registers -> EAX, EBX (if EAX > 0)
  2017                              <1> 	;
  2018 00005064 0FB705[B4480100]    <1> 	movzx   eax, word [swpq_count]  ; Max. 1024
  2019 0000506B 6621C0              <1> 	and	ax, ax
  2020 0000506E 7433                <1> 	jz	short swpqs_retn
  2021 00005070 57                  <1> 	push	edi
  2022 00005071 56                  <1> 	push	esi
  2023 00005072 51                  <1> 	push	ecx
  2024 00005073 53                  <1> 	push	ebx
  2025 00005074 BE00E00800          <1> 	mov	esi, swap_queue
  2026 00005079 89C1                <1> 	mov	ecx, eax
  2027 0000507B 09DB                <1> 	or	ebx, ebx
  2028 0000507D 7425                <1> 	jz	short swpqs_7
  2029                              <1> swpqs_1:
  2030 0000507F AD                  <1> 	lodsd
  2031 00005080 39D8                <1> 	cmp	eax, ebx
  2032 00005082 7406                <1> 	je	short swpqs_2
  2033 00005084 E2F9                <1> 	loop	swpqs_1
  2034                              <1> 	; 10/06/2016
  2035 00005086 29C0                <1> 	sub	eax, eax 
  2036 00005088 EB15                <1> 	jmp	short swpqs_6
  2037                              <1> swpqs_2:
  2038 0000508A 89F7                <1> 	mov	edi, esi
  2039 0000508C 83EF04              <1> 	sub 	edi, 4
  2040                              <1> swpqs_3:
  2041 0000508F 66FF0D[B4480100]    <1> 	dec	word [swpq_count]
  2042 00005096 7403                <1> 	jz	short swpqs_5
  2043                              <1> swpqs_4:
  2044 00005098 49                  <1> 	dec 	ecx
  2045 00005099 F3A5                <1> 	rep	movsd	; shift up (to the head)
  2046                              <1> swpqs_5:
  2047 0000509B 31C0                <1> 	xor	eax, eax
  2048 0000509D 8907                <1> 	mov	[edi], eax
  2049                              <1> swpqs_6:
  2050 0000509F 5B                  <1> 	pop	ebx
  2051                              <1> swpqs_14:
  2052 000050A0 59                  <1> 	pop	ecx
  2053 000050A1 5E                  <1> 	pop	esi
  2054 000050A2 5F                  <1> 	pop	edi
  2055                              <1> swpqs_retn:
  2056 000050A3 C3                  <1> 	retn		
  2057                              <1> swpqs_7:
  2058 000050A4 89F7                <1> 	mov	edi, esi ; head
  2059 000050A6 AD                  <1> 	lodsd
  2060                              <1> 	; 20/07/2015
  2061 000050A7 89C3                <1> 	mov	ebx, eax
  2062 000050A9 81E300F0FFFF        <1> 	and	ebx, ~PAGE_OFF ; ~0FFFh 
  2063                              <1> 		      ; ebx = virtual address (at page boundary)	
  2064 000050AF 25FF0F0000          <1> 	and	eax, PAGE_OFF ; 0FFFh
  2065                              <1> 		      ; ax = process number (1 to 4095)
  2066 000050B4 3A05[6B470100]      <1> 	cmp	al, [u.uno]
  2067                              <1> 		; Max. 16 (nproc) processes for Retro UNIX 386 v1
  2068 000050BA 7507                <1> 	jne	short swpqs_8
  2069 000050BC A1[70470100]        <1> 	mov	eax, [u.pgdir]
  2070 000050C1 EB28                <1> 	jmp	short swpqs_9
  2071                              <1> swpqs_8:
  2072                              <1> 	; 09/06/2016
  2073 000050C3 80B8[67440100]00    <1> 	cmp	byte [eax+p.stat-1], 0
  2074 000050CA 76C3                <1> 	jna	short swpqs_3     ; free (or terminated) process
  2075 000050CC 80B8[67440100]02    <1> 	cmp	byte [eax+p.stat-1], 2 ; waiting
  2076 000050D3 77BA                <1> 	ja	short swpqs_3 	  ; zombie (3) or undefined ?	
  2077                              <1> 
  2078                              <1> 	;shl	ax, 2
  2079 000050D5 C0E002              <1> 	shl	al, 2
  2080 000050D8 8B80[74440100]      <1> 	mov 	eax, [eax+p.upage-4]
  2081 000050DE 09C0                <1> 	or	eax, eax
  2082 000050E0 74AD                <1> 	jz	short swpqs_3 ; invalid upage
  2083 000050E2 83C05C              <1> 	add	eax, u.pgdir - user
  2084                              <1> 			 ; u.pgdir value for the process
  2085                              <1> 			 ; is in [eax]
  2086 000050E5 8B00                <1> 	mov	eax, [eax]
  2087 000050E7 21C0                <1> 	and	eax, eax
  2088 000050E9 74A4                <1> 	jz	short swpqs_3 ; invalid page directory
  2089                              <1> swpqs_9:
  2090 000050EB 52                  <1> 	push	edx
  2091                              <1> 	; eax = page directory
  2092                              <1> 	; ebx = virtual address
  2093 000050EC E829FBFFFF          <1> 	call	get_pte
  2094 000050F1 89D3                <1> 	mov	ebx, edx	; PTE address
  2095 000050F3 5A                  <1> 	pop	edx
  2096                              <1> 	; 10/06/2016
  2097 000050F4 723B                <1> 	jc	short swpqs_13 ; empty PDE
  2098                              <1> 	; EAX = PTE value
  2099 000050F6 A801                <1> 	test	al, PTE_A_PRESENT ; bit 0 = 1
  2100 000050F8 7437                <1> 	jz	short swpqs_13  ; Drop non-present page
  2101                              <1> 			        ; from the queue (head)
  2102 000050FA A802                <1> 	test	al, PTE_A_WRITE	; bit 1 = 0 (read only)
  2103 000050FC 7433                <1> 	jz	short swpqs_13  ; Drop read only page
  2104                              <1> 			        ; from the queue (head) 	
  2105                              <1> 	;test	al, PTE_A_ACCESS ; bit 5 = 1 (Accessed)
  2106                              <1> 	;jnz	short swpqs_11  ; present
  2107                              <1> 			        ; accessed page
  2108 000050FE 0FBAF005            <1>         btr     eax, PTE_A_ACCESS_BIT ; reset 'accessed' bit
  2109 00005102 7211                <1> 	jc	short swpqs_11  ; accessed page
  2110                              <1> 
  2111 00005104 49                  <1> 	dec	ecx
  2112 00005105 66890D[B4480100]    <1> 	mov	[swpq_count], cx
  2113 0000510C 7402                <1>         jz      short swpqs_10
  2114                              <1> 		; esi = head + 4
  2115                              <1> 		; edi = head
  2116 0000510E F3A5                <1> 	rep	movsd	 ; n = 1 to k-1, [n - 1] = [n]
  2117                              <1> swpqs_10:
  2118 00005110 890F                <1> 	mov	[edi], ecx ; 0
  2119 00005112 59                  <1> 	pop	ecx       	;  EBX (input) in stack
  2120                              <1> 				;  EBX = PTE address	
  2121 00005113 EB8B                <1> 	jmp	short swpqs_14 
  2122                              <1> 
  2123                              <1> swpqs_11:
  2124 00005115 8903                <1> 	mov	[ebx], eax     ; save changed attribute
  2125                              <1> 	; Rotation (head -> tail)
  2126 00005117 49                  <1> 	dec	ecx     ; entry count -> last entry number		
  2127 00005118 74F6                <1> 	jz	short swpqs_10
  2128                              <1> 		; esi = head + 4
  2129                              <1> 		; edi = head
  2130 0000511A 8B07                <1> 	mov	eax, [edi] ; 20/07/2015
  2131 0000511C F3A5                <1> 	rep	movsd	 ; n = 1 to k-1, [n - 1] = [n]
  2132 0000511E 8907                <1> 	mov	[edi], eax ; head -> tail ; [k] = [1]
  2133                              <1> 
  2134 00005120 668B0D[B4480100]    <1> 	mov	cx, [swpq_count]
  2135                              <1> 
  2136                              <1> swpqs_12:
  2137 00005127 BE00E00800          <1> 	mov	esi, swap_queue ; head
  2138 0000512C E973FFFFFF          <1>         jmp     swpqs_7
  2139                              <1> 
  2140                              <1> swpqs_13:
  2141 00005131 49                  <1> 	dec	ecx
  2142 00005132 66890D[B4480100]    <1> 	mov	[swpq_count], cx
  2143 00005139 0F845CFFFFFF        <1>         jz      swpqs_5
  2144 0000513F EBE6                <1> 	jmp	short swpqs_12
  2145                              <1> 
  2146                              <1> add_to_swap_queue:
  2147                              <1> ; temporary - 16/09/2015
  2148 00005141 C3                  <1> retn
  2149                              <1> 	; 20/07/2015
  2150                              <1> 	; 24/10/2014 (Retro UNIX 386 v1 - beginning)
  2151                              <1> 	;
  2152                              <1> 	; Adds new page to swap queue
  2153                              <1> 	; (page directories and page tables must not be added
  2154                              <1> 	; to swap queue)	
  2155                              <1> 	;
  2156                              <1> 	; INPUT ->
  2157                              <1> 	;	EBX = Virtual address (for current process, [u.uno])
  2158                              <1> 	;
  2159                              <1> 	; OUTPUT ->
  2160                              <1> 	;	EAX = [swpq_count]
  2161                              <1> 	;	      (after the PTE has been added)
  2162                              <1> 	;	EAX = 0 -> Swap queue is full, (1024 entries)
  2163                              <1> 	;	      the PTE could not be added.
  2164                              <1> 	;
  2165                              <1> 	; Modified Registers -> EAX
  2166                              <1> 	;
  2167 00005142 53                  <1> 	push	ebx
  2168 00005143 6681E300F0          <1>         and     bx, ~PAGE_OFF ; ~0FFFh ; reset bits, 0 to 11
  2169 00005148 8A1D[6B470100]      <1> 	mov	bl, [u.uno] ; current process number
  2170 0000514E E811FFFFFF          <1> 	call	swap_queue_shift ; drop from the queue if
  2171                              <1> 				 ; it is already in the queue
  2172                              <1> 		; then add it to the tail of the queue
  2173 00005153 0FB705[B4480100]    <1> 	movzx	eax, word [swpq_count]
  2174 0000515A 663D0004            <1> 	cmp	ax, 1024
  2175 0000515E 7205                <1> 	jb	short atsq_1
  2176 00005160 6629C0              <1> 	sub	ax, ax
  2177 00005163 5B                  <1> 	pop	ebx
  2178 00005164 C3                  <1> 	retn
  2179                              <1> atsq_1:
  2180 00005165 56                  <1> 	push	esi
  2181 00005166 BE00E00800          <1> 	mov	esi, swap_queue
  2182 0000516B 6621C0              <1> 	and	ax, ax
  2183 0000516E 740A                <1> 	jz	short atsq_2
  2184 00005170 66C1E002            <1> 	shl	ax, 2	; convert to offset
  2185 00005174 01C6                <1> 	add	esi, eax
  2186 00005176 66C1E802            <1> 	shr	ax, 2
  2187                              <1> atsq_2:
  2188 0000517A 6640                <1> 	inc	ax
  2189 0000517C 891E                <1> 	mov	[esi], ebx ; Virtual address + [u.uno] combination
  2190 0000517E 66A3[B4480100]      <1> 	mov	[swpq_count], ax
  2191 00005184 5E                  <1> 	pop	esi
  2192 00005185 5B                  <1> 	pop	ebx
  2193 00005186 C3                  <1> 	retn
  2194                              <1> 
  2195                              <1> unlink_swap_block:
  2196                              <1> 	; 15/09/2015
  2197                              <1> 	; 30/04/2015
  2198                              <1> 	; 18/04/2015
  2199                              <1> 	; 24/10/2014 (Retro UNIX 386 v1 - beginning)
  2200                              <1> 	;
  2201                              <1> 	; INPUT -> 
  2202                              <1> 	;	EAX = swap disk/file offset address
  2203                              <1> 	;	      (bit 1 to bit 31)
  2204                              <1> 	; OUTPUT ->
  2205                              <1> 	;	[swpd_free] is increased
  2206                              <1> 	;	(corresponding SWAP DISK ALLOC. TABLE bit is SET)
  2207                              <1> 	;
  2208                              <1> 	; Modified Registers -> EAX
  2209                              <1> 	;
  2210 00005187 53                  <1> 	push	ebx
  2211 00005188 52                  <1> 	push	edx
  2212                              <1> 	;
  2213 00005189 C1E804              <1> 	shr	eax, SECTOR_SHIFT+1  ;3+1 ; shift sector address to 
  2214                              <1> 				     ; 3 bits right
  2215                              <1> 				     ; to get swap block/page number
  2216 0000518C 89C2                <1> 	mov	edx, eax
  2217                              <1> 	; 15/09/2015
  2218 0000518E C1EA03              <1> 	shr	edx, 3		     ; to get offset to S.A.T.
  2219                              <1> 				     ; (1 allocation bit = 1 page)
  2220                              <1> 				     ; (1 allocation bytes = 8 pages)
  2221 00005191 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  2222                              <1> 				     ; (to get 32 bit position)			
  2223                              <1> 	;
  2224 00005194 BB00000D00          <1> 	mov	ebx, swap_alloc_table ; Swap Allocation Table address
  2225 00005199 01D3                <1> 	add	ebx, edx
  2226 0000519B 83E01F              <1> 	and	eax, 1Fh	     ; lower 5 bits only
  2227                              <1> 				     ; (allocation bit position)	 
  2228 0000519E 3B05[C2480100]      <1> 	cmp 	eax, [swpd_next]     ; is the new free block addr. lower
  2229                              <1> 				     ; than the address in 'swpd_next' ?
  2230                              <1> 				     ; (next/first free block value)		
  2231 000051A4 7305                <1> 	jnb	short uswpbl_1	     ; no	
  2232 000051A6 A3[C2480100]        <1> 	mov	[swpd_next], eax     ; yes	
  2233                              <1> uswpbl_1:
  2234 000051AB 0FAB03              <1> 	bts	[ebx], eax	     ; unlink/release/deallocate block
  2235                              <1> 				     ; set relevant bit to 1.
  2236                              <1> 				     ; set CF to the previous bit value	
  2237 000051AE F5                  <1> 	cmc			     ; complement carry flag	
  2238 000051AF 7206                <1> 	jc	short uswpbl_2	     ; do not increase swfd_free count
  2239                              <1> 				     ; if the block is already deallocated
  2240                              <1> 				     ; before.	
  2241 000051B1 FF05[BE480100]      <1>         inc     dword [swpd_free]
  2242                              <1> uswpbl_2:
  2243 000051B7 5A                  <1> 	pop	edx
  2244 000051B8 5B                  <1> 	pop	ebx
  2245 000051B9 C3                  <1> 	retn
  2246                              <1> 
  2247                              <1> link_swap_block:
  2248                              <1> 	; 01/07/2015
  2249                              <1> 	; 18/04/2015
  2250                              <1> 	; 24/10/2014 (Retro UNIX 386 v1 - beginning)
  2251                              <1> 	;
  2252                              <1> 	; INPUT -> none
  2253                              <1> 	;
  2254                              <1> 	; OUTPUT ->
  2255                              <1> 	;	EAX = OFFSET ADDRESS OF THE ALLOCATED BLOCK (4096 bytes)
  2256                              <1> 	;	      in sectors (corresponding 
  2257                              <1> 	;	      SWAP DISK ALLOCATION TABLE bit is RESET)
  2258                              <1> 	;
  2259                              <1> 	;	CF = 1 and EAX = 0 
  2260                              <1> 	; 		   if there is not a free block to be allocated	
  2261                              <1> 	;
  2262                              <1> 	; Modified Registers -> none (except EAX)
  2263                              <1> 	;
  2264                              <1> 
  2265                              <1> 	;mov	eax, [swpd_free]
  2266                              <1> 	;and	eax, eax
  2267                              <1> 	;jz	short out_of_swpspc
  2268                              <1> 	;
  2269 000051BA 53                  <1> 	push	ebx
  2270 000051BB 51                  <1> 	push	ecx
  2271                              <1> 	;
  2272 000051BC BB00000D00          <1> 	mov	ebx, swap_alloc_table ; Swap Allocation Table offset
  2273 000051C1 89D9                <1> 	mov	ecx, ebx
  2274 000051C3 031D[C2480100]      <1> 	add	ebx, [swpd_next] ; Free block searching starts from here
  2275                              <1> 				 ; next_free_swap_block >> 5
  2276 000051C9 030D[C6480100]      <1> 	add	ecx, [swpd_last] ; Free block searching ends here
  2277                              <1> 				 ; (total_swap_blocks - 1) >> 5
  2278                              <1> lswbl_scan:
  2279 000051CF 39CB                <1> 	cmp	ebx, ecx
  2280 000051D1 770A                <1> 	ja	short lswbl_notfound
  2281                              <1> 	;
  2282 000051D3 0FBC03              <1> 	bsf	eax, [ebx] ; Scans source operand for first bit set (1).
  2283                              <1> 			   ; Clears ZF if a bit is found set (1) and 
  2284                              <1> 			   ; loads the destination with an index to
  2285                              <1> 			   ; first set bit. (0 -> 31) 
  2286                              <1> 			   ; Sets ZF to 1 if no bits are found set.
  2287                              <1> 	; 01/07/2015
  2288 000051D6 751C                <1> 	jnz	short lswbl_found ; ZF = 0 -> a free block has been found
  2289                              <1> 			 ;
  2290                              <1> 			 ; NOTE:  a Swap Disk Allocation Table bit 
  2291                              <1> 			 ;	  with value of 1 means 
  2292                              <1> 			 ;	  the corresponding page is free 
  2293                              <1> 			 ;	  (Retro UNIX 386 v1 feaure only!)
  2294 000051D8 83C304              <1> 	add	ebx, 4
  2295                              <1> 			 ; We return back for searching next page block
  2296                              <1> 			 ; NOTE: [swpd_free] is not ZERO; so, 
  2297                              <1> 			 ;	 we always will find at least 1 free block here.
  2298 000051DB EBF2                <1> 	jmp    	short lswbl_scan
  2299                              <1> 	;
  2300                              <1> lswbl_notfound:	
  2301 000051DD 81E900000D00        <1> 	sub	ecx, swap_alloc_table
  2302 000051E3 890D[C2480100]      <1> 	mov	[swpd_next], ecx ; next/first free page = last page 
  2303                              <1> 				 ; (unlink_swap_block procedure will change it)
  2304 000051E9 31C0                <1> 	xor	eax, eax
  2305 000051EB A3[BE480100]        <1> 	mov	[swpd_free], eax
  2306 000051F0 F9                  <1> 	stc
  2307                              <1> lswbl_ok:
  2308 000051F1 59                  <1> 	pop	ecx
  2309 000051F2 5B                  <1> 	pop	ebx
  2310 000051F3 C3                  <1> 	retn
  2311                              <1> 	;
  2312                              <1> ;out_of_swpspc:
  2313                              <1> ;	stc
  2314                              <1> ;	retn
  2315                              <1> 
  2316                              <1> lswbl_found:
  2317 000051F4 89D9                <1> 	mov	ecx, ebx
  2318 000051F6 81E900000D00        <1> 	sub	ecx, swap_alloc_table
  2319 000051FC 890D[C2480100]      <1> 	mov	[swpd_next], ecx ; Set first free block searching start
  2320                              <1> 				 ; address/offset (to the next)
  2321 00005202 FF0D[BE480100]      <1>         dec     dword [swpd_free] ; 1 block has been allocated (X = X-1) 
  2322                              <1> 	;
  2323 00005208 0FB303              <1> 	btr	[ebx], eax	 ; The destination bit indexed by the source value
  2324                              <1> 				 ; is copied into the Carry Flag and then cleared
  2325                              <1> 				 ; in the destination.
  2326                              <1> 				 ;
  2327                              <1> 				 ; Reset the bit which is corresponding to the 
  2328                              <1> 				 ; (just) allocated block.
  2329 0000520B C1E105              <1> 	shl	ecx, 5		 ; (block offset * 32) + block index
  2330 0000520E 01C8                <1> 	add	eax, ecx	 ; = block number
  2331 00005210 C1E003              <1> 	shl	eax, SECTOR_SHIFT ; 3, sector (offset) address of the block
  2332                              <1> 				 ; 1 block =  8 sectors
  2333                              <1> 	;
  2334                              <1> 	; EAX = offset address of swap disk/file sector (beginning of the block)
  2335                              <1> 	;
  2336                              <1> 	; NOTE: The relevant page table entry will be updated
  2337                              <1> 	;       according to this EAX value...
  2338                              <1> 	;
  2339 00005213 EBDC                <1> 	jmp	short lswbl_ok
  2340                              <1> 
  2341                              <1> logical_disk_read:
  2342                              <1> 	; 20/07/2015
  2343                              <1> 	; 09/03/2015 (temporary code here)
  2344                              <1> 	;
  2345                              <1> 	; INPUT ->
  2346                              <1> 	; 	ESI = Logical disk description table address
  2347                              <1> 	; 	EBX = Memory page (buffer) address (physical!)
  2348                              <1> 	; 	EAX = Sector adress (offset address, logical sector number)
  2349                              <1> 	; 	ECX = Sector count
  2350                              <1> 	;
  2351                              <1> 	;
  2352 00005215 C3                  <1> 	retn
  2353                              <1> 
  2354                              <1> logical_disk_write:
  2355                              <1> 	; 20/07/2015
  2356                              <1> 	; 09/03/2015 (temporary code here)
  2357                              <1> 	;
  2358                              <1> 	; INPUT ->
  2359                              <1> 	; 	ESI = Logical disk description table address
  2360                              <1> 	; 	EBX = Memory page (buffer) address (physical!)
  2361                              <1> 	; 	EAX = Sector adress (offset address, logical sector number)
  2362                              <1> 	; 	ECX = Sector count
  2363                              <1> 	;
  2364 00005216 C3                  <1> 	retn
  2365                              <1> 
  2366                              <1> get_physical_addr:
  2367                              <1> 	; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
  2368                              <1> 	; 18/10/2015
  2369                              <1> 	; 29/07/2015
  2370                              <1> 	; 20/07/2015
  2371                              <1> 	; 04/06/2015
  2372                              <1> 	; 20/05/2015
  2373                              <1> 	; 28/04/2015
  2374                              <1> 	; 18/04/2015
  2375                              <1> 	; Get physical address
  2376                              <1> 	;     (allocates a new page for user if it is not present)
  2377                              <1> 	;	
  2378                              <1> 	; (This subroutine is needed for mapping user's virtual 
  2379                              <1> 	; (buffer) address to physical address (of the buffer).)
  2380                              <1> 	; ('sys write', 'sys read' system calls...)
  2381                              <1> 	;
  2382                              <1> 	; INPUT ->
  2383                              <1> 	;	EBX = virtual address
  2384                              <1> 	;	u.pgdir = page directory (physical) address
  2385                              <1> 	;
  2386                              <1> 	; OUTPUT ->
  2387                              <1> 	;	EAX = physical address 
  2388                              <1> 	;	EBX = linear address	
  2389                              <1> 	;	EDX = physical address of the page frame
  2390                              <1> 	;	      (with attribute bits)
  2391                              <1> 	;	ECX = byte count within the page frame
  2392                              <1> 	;
  2393                              <1> 	; Modified Registers -> EAX, EBX, ECX, EDX
  2394                              <1> 	;
  2395 00005217 81C300004000        <1> 	add	ebx, CORE ; 18/10/2015
  2396                              <1> get_physical_addr_x: ; 27/05/2016
  2397 0000521D A1[70470100]        <1> 	mov	eax, [u.pgdir]
  2398 00005222 E8F3F9FFFF          <1> 	call	get_pte
  2399                              <1> 		; EDX = Page table entry address (if CF=0)
  2400                              <1> 	        ;       Page directory entry address (if CF=1)
  2401                              <1> 		;       (Bit 0 value is 0 if PT is not present)
  2402                              <1> 		; EAX = Page table entry value (page address)
  2403                              <1> 		;	CF = 1 -> PDE not present or invalid ? 
  2404 00005227 731C                <1> 	jnc	short gpa_1
  2405                              <1> 	;
  2406 00005229 E8D1F8FFFF          <1> 	call	allocate_page
  2407 0000522E 725B                <1> 	jc	short gpa_im_err  ; 'insufficient memory' error
  2408                              <1> gpa_0:
  2409 00005230 E844F9FFFF          <1> 	call 	clear_page
  2410                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  2411 00005235 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER ; 4+2+1 = 7
  2412                              <1> 			   ; lower 3 bits are used as U/S, R/W, P flags
  2413                              <1> 			   ; (user, writable, present page)	
  2414 00005237 8902                <1> 	mov	[edx], eax ; Let's put the new page directory entry here !
  2415 00005239 A1[70470100]        <1> 	mov	eax, [u.pgdir]	
  2416 0000523E E8D7F9FFFF          <1> 	call	get_pte
  2417 00005243 7246                <1> 	jc	short gpa_im_err ; 'insufficient memory' error
  2418                              <1> gpa_1:
  2419                              <1> 	; EAX = PTE value, EDX = PTE address
  2420 00005245 A801                <1> 	test 	al, PTE_A_PRESENT
  2421 00005247 751A                <1> 	jnz	short gpa_3
  2422 00005249 09C0                <1> 	or	eax, eax
  2423 0000524B 7430                <1> 	jz	short gpa_4  ; Allocate a new page
  2424                              <1> 	; 20/07/2015
  2425 0000524D 55                  <1> 	push	ebp
  2426 0000524E 89DD                <1> 	mov	ebp, ebx ; virtual (linear) address
  2427                              <1> 	; reload swapped page
  2428 00005250 E83C000000          <1> 	call	reload_page ; 28/04/2015
  2429 00005255 5D                  <1> 	pop	ebp
  2430 00005256 7224                <1> 	jc	short gpa_retn
  2431                              <1> gpa_2:
  2432                              <1> 	; 20/07/2015
  2433                              <1> 	; 20/05/2015
  2434                              <1> 	; add this page to swap queue
  2435 00005258 50                  <1> 	push	eax 
  2436                              <1> 	; EBX = virtual address
  2437 00005259 E8E3FEFFFF          <1> 	call 	add_to_swap_queue
  2438 0000525E 58                  <1> 	pop	eax
  2439                              <1> 		; PTE address in EDX
  2440                              <1> 		; virtual address in EBX
  2441                              <1> 	; EAX = memory page address
  2442 0000525F 0C07                <1> 	or	al, PTE_A_PRESENT + PTE_A_USER + PTE_A_WRITE
  2443                              <1> 				  ; present flag, bit 0 = 1
  2444                              <1> 				  ; user flag, bit 2 = 1	
  2445                              <1> 				  ; writable flag, bit 1 = 1
  2446 00005261 8902                <1> 	mov	[edx], eax  ; Update PTE value
  2447                              <1> gpa_3:
  2448                              <1> 	; 18/10/2015
  2449 00005263 89D9                <1> 	mov	ecx, ebx
  2450 00005265 81E1FF0F0000        <1> 	and	ecx, PAGE_OFF
  2451 0000526B 89C2                <1> 	mov 	edx, eax
  2452 0000526D 662500F0            <1> 	and	ax, PTE_A_CLEAR
  2453 00005271 01C8                <1> 	add	eax, ecx
  2454 00005273 F7D9                <1> 	neg	ecx ; 1 -> -1 (0FFFFFFFFh), 4095 (0FFFh) -> -4095
  2455 00005275 81C100100000        <1> 	add	ecx, PAGE_SIZE
  2456 0000527B F8                  <1> 	clc
  2457                              <1> gpa_retn:
  2458 0000527C C3                  <1> 	retn	
  2459                              <1> gpa_4:	
  2460 0000527D E87DF8FFFF          <1> 	call	allocate_page
  2461 00005282 7207                <1> 	jc	short gpa_im_err ; 'insufficient memory' error
  2462 00005284 E8F0F8FFFF          <1> 	call	clear_page
  2463 00005289 EBCD                <1> 	jmp	short gpa_2
  2464                              <1> 
  2465                              <1> gpa_im_err:	
  2466 0000528B B804000000          <1> 	mov	eax, ERR_MINOR_IM ; Insufficient memory (minor) error!
  2467                              <1> 				  ; Major error = 0 (No protection fault)	
  2468 00005290 C3                  <1> 	retn
  2469                              <1> 
  2470                              <1> reload_page:
  2471                              <1> 	; 20/07/2015
  2472                              <1> 	; 28/04/2015 (Retro UNIX 386 v1 - beginning)
  2473                              <1> 	;
  2474                              <1> 	; Reload (Restore) swapped page at memory
  2475                              <1> 	;
  2476                              <1> 	; INPUT -> 
  2477                              <1> 	;	EBP = Virtual (linear) memory address
  2478                              <1> 	;	EAX = PTE value (swap disk sector address)
  2479                              <1> 	;	(Swap disk sector address = bit 1 to bit 31 of EAX)	
  2480                              <1> 	; OUTPUT ->
  2481                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF RELOADED PAGE
  2482                              <1> 	;
  2483                              <1> 	;	CF = 1 and EAX = error code
  2484                              <1> 	;
  2485                              <1> 	; Modified Registers -> none (except EAX)
  2486                              <1> 	;
  2487 00005291 D1E8                <1> 	shr	eax, 1   ; Convert PTE value to swap disk address 
  2488 00005293 53                  <1> 	push	ebx      ;
  2489 00005294 89C3                <1> 	mov	ebx, eax ; Swap disk (offset) address	
  2490 00005296 E864F8FFFF          <1> 	call	allocate_page
  2491 0000529B 720C                <1> 	jc	short rlp_im_err
  2492 0000529D 93                  <1> 	xchg 	eax, ebx	
  2493                              <1> 	; EBX = Physical memory (page) address
  2494                              <1> 	; EAX = Swap disk (offset) address
  2495                              <1> 	; EBP = Virtual (linear) memory address
  2496 0000529E E89BFCFFFF          <1> 	call	swap_in
  2497 000052A3 720B                <1> 	jc	short rlp_swp_err  ; (swap disk/file read error)
  2498 000052A5 89D8                <1> 	mov	eax, ebx	
  2499                              <1> rlp_retn:
  2500 000052A7 5B                  <1> 	pop	ebx
  2501 000052A8 C3                  <1> 	retn
  2502                              <1> 	
  2503                              <1> rlp_im_err:	
  2504 000052A9 B804000000          <1> 	mov	eax, ERR_MINOR_IM ; Insufficient memory (minor) error!
  2505                              <1> 				  ; Major error = 0 (No protection fault)	
  2506 000052AE EBF7                <1> 	jmp	short rlp_retn
  2507                              <1> 
  2508                              <1> rlp_swp_err:
  2509 000052B0 B828000000          <1> 	mov 	eax, SWP_DISK_READ_ERR ; Swap disk read error !
  2510 000052B5 EBF0                <1> 	jmp	short rlp_retn
  2511                              <1> 
  2512                              <1> 
  2513                              <1> copy_page_dir:
  2514                              <1> 	; 19/09/2015
  2515                              <1> 	; temporary - 07/09/2015
  2516                              <1> 	; 07/09/2015 (Retro UNIX 386 v1 - beginning)
  2517                              <1> 	;
  2518                              <1> 	; INPUT -> 
  2519                              <1> 	;	[u.pgdir] = PHYSICAL (real/flat) ADDRESS of the parent's
  2520                              <1> 	;		    page directory.
  2521                              <1> 	; OUTPUT ->
  2522                              <1> 	;	EAX =  PHYSICAL (real/flat) ADDRESS of the child's
  2523                              <1> 	;	       page directory.
  2524                              <1> 	;	(New page directory with new page table entries.)
  2525                              <1> 	;	(New page tables with read only copies of the parent's
  2526                              <1> 	;	pages.)
  2527                              <1> 	;	EAX = 0 -> Error (CF = 1)
  2528                              <1> 	;
  2529                              <1> 	; Modified Registers -> none (except EAX)
  2530                              <1> 	;
  2531 000052B7 E843F8FFFF          <1> 	call	allocate_page
  2532 000052BC 723E                <1> 	jc	short cpd_err
  2533                              <1> 	;
  2534 000052BE 55                  <1> 	push	ebp ; 20/07/2015
  2535 000052BF 56                  <1> 	push	esi
  2536 000052C0 57                  <1> 	push	edi
  2537 000052C1 53                  <1> 	push	ebx
  2538 000052C2 51                  <1> 	push	ecx
  2539 000052C3 8B35[70470100]      <1> 	mov	esi, [u.pgdir]
  2540 000052C9 89C7                <1> 	mov	edi, eax
  2541 000052CB 50                  <1> 	push	eax ; save child's page directory address
  2542                              <1> 	; copy PDE 0 from the parent's page dir to the child's page dir
  2543                              <1> 	; (use same system space for all user page tables) 
  2544 000052CC A5                  <1> 	movsd
  2545 000052CD BD00004000          <1> 	mov	ebp, 1024*4096 ; pass the 1st 4MB (system space)
  2546 000052D2 B9FF030000          <1> 	mov	ecx, (PAGE_SIZE / 4) - 1 ; 1023
  2547                              <1> cpd_0:	
  2548 000052D7 AD                  <1> 	lodsd
  2549                              <1> 	;or	eax, eax
  2550                              <1>         ;jnz     short cpd_1
  2551 000052D8 A801                <1> 	test	al, PDE_A_PRESENT ;  bit 0 =  1
  2552 000052DA 7508                <1> 	jnz	short cpd_1
  2553                              <1>  	; (virtual address at the end of the page table)	
  2554 000052DC 81C500004000        <1> 	add	ebp, 1024*4096 ; page size * PTE count
  2555 000052E2 EB0F                <1> 	jmp	short cpd_2
  2556                              <1> cpd_1:	
  2557 000052E4 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear attribute bits
  2558 000052E8 89C3                <1> 	mov	ebx, eax
  2559                              <1> 	; EBX = Parent's page table address
  2560 000052EA E81F000000          <1> 	call	copy_page_table
  2561 000052EF 720C                <1> 	jc	short cpd_p_err
  2562                              <1> 	; EAX = Child's page table address
  2563 000052F1 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER
  2564                              <1> 			 ; set bit 0, bit 1 and bit 2 to 1
  2565                              <1> 			 ; (present, writable, user)
  2566                              <1> cpd_2:
  2567 000052F3 AB                  <1> 	stosd
  2568 000052F4 E2E1                <1> 	loop	cpd_0
  2569                              <1> 	;
  2570 000052F6 58                  <1> 	pop	eax  ; restore child's page directory address
  2571                              <1> cpd_3:
  2572 000052F7 59                  <1> 	pop	ecx
  2573 000052F8 5B                  <1> 	pop	ebx
  2574 000052F9 5F                  <1> 	pop	edi
  2575 000052FA 5E                  <1> 	pop	esi
  2576 000052FB 5D                  <1> 	pop	ebp
  2577                              <1> cpd_err:
  2578 000052FC C3                  <1> 	retn
  2579                              <1> cpd_p_err:
  2580                              <1> 	; release the allocated pages missing (recover free space)
  2581 000052FD 58                  <1> 	pop	eax  ; the new page directory address (physical)
  2582 000052FE 8B1D[70470100]      <1> 	mov	ebx, [u.pgdir] ; parent's page directory address 
  2583 00005304 E82FF9FFFF          <1> 	call 	deallocate_page_dir
  2584 00005309 29C0                <1> 	sub	eax, eax ; 0
  2585 0000530B F9                  <1> 	stc
  2586 0000530C EBE9                <1> 	jmp	short cpd_3	
  2587                              <1> 
  2588                              <1> copy_page_table:
  2589                              <1> 	; 19/09/2015
  2590                              <1> 	; temporary - 07/09/2015
  2591                              <1> 	; 07/09/2015 (Retro UNIX 386 v1 - beginning)
  2592                              <1> 	;
  2593                              <1> 	; INPUT -> 
  2594                              <1> 	;	EBX = PHYSICAL (real/flat) ADDRESS of the parent's page table.
  2595                              <1> 	;	EBP = page table entry index (from 'copy_page_dir')
  2596                              <1> 	; OUTPUT ->
  2597                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS of the child's page table.
  2598                              <1> 	;	EBP = (recent) page table index (for 'add_to_swap_queue')	
  2599                              <1> 	;	CF = 1 -> error 
  2600                              <1> 	;
  2601                              <1> 	; Modified Registers -> EBP (except EAX)
  2602                              <1> 	;
  2603 0000530E E8ECF7FFFF          <1> 	call	allocate_page
  2604 00005313 725A                <1> 	jc	short cpt_err
  2605                              <1> 	;
  2606 00005315 50                  <1> 	push	eax ; *
  2607                              <1> 	;push 	ebx
  2608 00005316 56                  <1> 	push	esi
  2609 00005317 57                  <1> 	push	edi
  2610 00005318 52                  <1> 	push	edx
  2611 00005319 51                  <1> 	push	ecx
  2612                              <1> 	;
  2613 0000531A 89DE                <1> 	mov	esi, ebx
  2614 0000531C 89C7                <1> 	mov	edi, eax
  2615 0000531E 89C2                <1> 	mov	edx, eax
  2616 00005320 81C200100000        <1> 	add	edx, PAGE_SIZE 	
  2617                              <1> cpt_0:
  2618 00005326 AD                  <1> 	lodsd
  2619 00005327 A801                <1> 	test	al, PTE_A_PRESENT ;  bit 0 =  1
  2620 00005329 750B                <1> 	jnz	short cpt_1
  2621 0000532B 21C0                <1> 	and	eax, eax
  2622 0000532D 7430                <1> 	jz	short cpt_2
  2623                              <1> 	; ebp = virtual (linear) address of the memory page
  2624 0000532F E85DFFFFFF          <1> 	call	reload_page ; 28/04/2015
  2625 00005334 7234                <1> 	jc	short cpt_p_err
  2626                              <1> cpt_1:
  2627 00005336 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  2628 0000533A 89C1                <1> 	mov	ecx, eax
  2629                              <1> 	; Allocate a new page for the child process
  2630 0000533C E8BEF7FFFF          <1> 	call	allocate_page
  2631 00005341 7227                <1> 	jc	short cpt_p_err
  2632 00005343 57                  <1> 	push	edi
  2633 00005344 56                  <1> 	push	esi
  2634 00005345 89CE                <1> 	mov	esi, ecx
  2635 00005347 89C7                <1> 	mov	edi, eax
  2636 00005349 B900040000          <1> 	mov	ecx, PAGE_SIZE/4
  2637 0000534E F3A5                <1> 	rep	movsd	; copy page (4096 bytes)
  2638 00005350 5E                  <1> 	pop	esi
  2639 00005351 5F                  <1> 	pop	edi
  2640                              <1> 	; 
  2641 00005352 53                  <1> 	push	ebx
  2642 00005353 50                  <1> 	push	eax
  2643 00005354 89EB                <1> 	mov	ebx, ebp
  2644                              <1> 	; ebx = virtual address of the memory page
  2645 00005356 E8E6FDFFFF          <1> 	call	add_to_swap_queue
  2646 0000535B 58                  <1> 	pop	eax
  2647 0000535C 5B                  <1> 	pop	ebx
  2648                              <1> 	;
  2649                              <1> 	;or	ax, PTE_A_USER+PTE_A_PRESENT 
  2650 0000535D 0C07                <1> 	or	al, PTE_A_USER+PTE_A_WRITE+PTE_A_PRESENT 
  2651                              <1> cpt_2:
  2652 0000535F AB                  <1> 	stosd  ; EDI points to child's PTE  	 
  2653                              <1> 	;
  2654 00005360 81C500100000        <1> 	add	ebp, 4096 ; 20/07/2015 (next page)
  2655                              <1> 	;
  2656 00005366 39D7                <1> 	cmp	edi, edx
  2657 00005368 72BC                <1> 	jb	short cpt_0
  2658                              <1> cpt_p_err:
  2659 0000536A 59                  <1> 	pop	ecx
  2660 0000536B 5A                  <1> 	pop	edx
  2661 0000536C 5F                  <1> 	pop	edi
  2662 0000536D 5E                  <1> 	pop	esi
  2663                              <1> 	;pop	ebx
  2664 0000536E 58                  <1> 	pop	eax ; *
  2665                              <1> cpt_err:
  2666 0000536F C3                  <1> 	retn
  2667                              <1> 
  2668                              <1> 
  2669                              <1> allocate_memory_block:
  2670                              <1> 	; 03/04/2016
  2671                              <1> 	; 02/04/2016
  2672                              <1> 	; 01/04/2016
  2673                              <1> 	; 14/03/2016
  2674                              <1> 	; 13/03/2016
  2675                              <1> 	; 12/03/2016 (TRDOS 386 = TRDOS v2.0)
  2676                              <1> 	; Allocating contiguous memory pages (in the kernel's memory space)
  2677                              <1> 	;
  2678                              <1> 	; INPUT -> 
  2679                              <1> 	;	EAX = Beginning address (physical)
  2680                              <1> 	;	EAX = 0 -> Allocate memory block from the first proper aperture	
  2681                              <1> 	;	ECX = Number of bytes to be allocated
  2682                              <1> 	;
  2683                              <1> 	; OUTPUT ->
  2684                              <1> 	; 	1) cf = 0 -> successful
  2685                              <1> 	;	EAX = Beginning (physical) address of the allocated memory block
  2686                              <1> 	;	ECX = Number of allocated bytes (rounded up to page borders) 
  2687                              <1> 	;	2) cf = 1 -> unsuccessful
  2688                              <1> 	;	 2.1) If EAX > 0 -> 
  2689                              <1> 	;	      (Number of requested pages is more than # of free pages
  2690                              <1> 	;	       but contiguous free pages -the aperture- is not enough!)	   	
  2691                              <1> 	;	      EAX = Beginning address of available aperture
  2692                              <1> 	;		    (one of all aperture with max. aperture size/length)		
  2693                              <1> 	;	      ECX = Size of available aperture (memory block) in bytes
  2694                              <1> 	;	 2.2) If EAX = 0 -> Out of memory error 
  2695                              <1> 	;	            (number of free pages is less than requested number)
  2696                              <1> 	;	      ECX = Total number of free bytes (free pages * 4096) 
  2697                              <1> 	;		    (It is not number of contiguous free bytes)	
  2698                              <1> 	;
  2699                              <1> 	; (Modified Registers -> EAX, ECX)
  2700                              <1> 	;
  2701                              <1> 	; PURPOSE: Loading a file at memory for copying or running etc.
  2702                              <1> 	; If this procedure returns with cf is set, ECX contains maximum
  2703                              <1> 	; available space and EAX contains the beginning address of it.
  2704                              <1> 	; If EAX has zero, ECX contains total number of free bytes.
  2705                              <1> 	; If requested block has been successfully allocated (by rounding up to
  2706                              <1> 	; the last page border), it must be deallocated later by using
  2707                              <1> 	; 'dealloacate_memory_block' procedure.    
  2708                              <1> 
  2709 00005370 52                  <1> 	push	edx ; *
  2710 00005371 BAFF0F0000          <1> 	mov	edx, PAGE_SIZE - 1   ; 4095
  2711 00005376 01D1                <1> 	add	ecx, edx
  2712 00005378 01D0                <1> 	add	eax, edx
  2713 0000537A C1E90C              <1> 	shr	ecx, PAGE_SHIFT	     ; 12
  2714                              <1> 
  2715                              <1> 	; ECX = number of contiguous pages to be allocated
  2716 0000537D 8B15[E8300100]      <1> 	mov	edx, [free_pages]
  2717 00005383 39D1                <1> 	cmp	ecx, edx
  2718 00005385 7775                <1> 	ja	short amb_6
  2719                              <1> 
  2720 00005387 C1E80C              <1> 	shr	eax, PAGE_SHIFT      ; 12
  2721                              <1> 
  2722 0000538A 89C2                <1> 	mov	edx, eax 	     ; page number
  2723 0000538C C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
  2724                              <1> 				     ; (1 allocation bit = 1 page)
  2725                              <1> 				     ; (1 allocation bytes = 8 pages)
  2726 0000538F 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  2727                              <1> 				     ; (to get 32 bit position)	
  2728 00005392 53                  <1> 	push	ebx ; **
  2729                              <1> amb_0:
  2730 00005393 890D[A03D0100]      <1> 	mov	[mem_ipg_count], ecx ; initial (reset) value of page count
  2731 00005399 890D[A43D0100]      <1> 	mov	[mem_pg_count], ecx
  2732 0000539F 31C9                <1> 	xor	ecx, ecx ; 0
  2733 000053A1 890D[A83D0100]      <1> 	mov	[mem_aperture], ecx ; 0
  2734 000053A7 890D[AC3D0100]      <1> 	mov	[mem_max_aperture], ecx ; 0
  2735                              <1> 	
  2736 000053AD BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table address.
  2737 000053B2 3B15[EC300100]      <1> 	cmp	edx, [next_page]     ; Is the beginning page address lower
  2738                              <1> 				     ; than the address in 'next_page' ?
  2739                              <1> 				     ; (the first/next free page of user space)		
  2740 000053B8 7208                <1> 	jb	short amb_1
  2741 000053BA 3B15[F0300100]      <1> 	cmp 	edx, [last_page]     ; is the beginning page address higher
  2742                              <1> 				     ; than the address in 'last_page' ?
  2743                              <1> 				     ; (end of the memory)		
  2744 000053C0 7606                <1> 	jna	short amb_2	     ; no	
  2745                              <1> amb_1:
  2746 000053C2 8B15[EC300100]      <1> 	mov	edx, [next_page]     ; yes (reset to the first page of user space)
  2747                              <1> amb_2:
  2748 000053C8 01D3                <1> 	add	ebx, edx
  2749                              <1> 
  2750 000053CA A3[B03D0100]        <1> 	mov	[mem_pg_pos], eax    ; beginning page no (for curr. mem. aperture)
  2751 000053CF A3[B43D0100]        <1>  	mov	[mem_max_pg_pos], eax ; beginning page no for max. mem. aperture
  2752                              <1> 
  2753 000053D4 83E01F              <1> 	and	eax, 1Fh	     ; lower 5 bits only (0 to 31)
  2754                              <1> 				     ; (allocation bit position)	 
  2755 000053D7 744B                <1> 	jz	short amb_10	     ; 0	
  2756                              <1> amb_3:
  2757 000053D9 8B13                <1> 	mov	edx, [ebx]
  2758 000053DB 88C1                <1> 	mov	cl, al ; 1 to 31
  2759 000053DD D3EA                <1> 	shr	edx, cl
  2760 000053DF 89D0                <1> 	mov	eax, edx
  2761                              <1> amb_4:
  2762 000053E1 D1E8                <1> 	shr	eax, 1 ; (***)
  2763 000053E3 7321                <1> 	jnc	short amb_7
  2764 000053E5 FF05[A83D0100]      <1> 	inc	dword [mem_aperture]
  2765 000053EB FF0D[A43D0100]      <1> 	dec	dword [mem_pg_count]
  2766 000053F1 747B                <1> 	jz	short amb_15
  2767                              <1> amb_5:
  2768 000053F3 80F91F              <1> 	cmp	cl, 31
  2769 000053F6 7317                <1> 	jnb	short amb_8
  2770 000053F8 FEC1                <1> 	inc	cl
  2771 000053FA EBE5                <1> 	jmp	short amb_4
  2772                              <1> 
  2773                              <1> amb_6:	; out_of_memory
  2774 000053FC 31C0                <1> 	xor	eax, eax ; 0
  2775 000053FE 89D1                <1> 	mov	ecx, edx ; free pages
  2776 00005400 C1E10C              <1> 	shl	ecx, PAGE_SHIFT
  2777 00005403 5A                  <1> 	pop	edx ; *
  2778 00005404 F9                  <1> 	stc
  2779 00005405 C3                  <1> 	retn
  2780                              <1> amb_7:
  2781 00005406 50                  <1> 	push	eax ; (***) allocation bits (in shifted status)
  2782 00005407 E819010000          <1> 	call	amb_26 ; set maximum memory aperture (free memory block size)
  2783 0000540C 58                  <1> 	pop	eax ; (***)
  2784 0000540D EBE4                <1> 	jmp	short amb_5
  2785                              <1> amb_8:
  2786 0000540F 28C9                <1> 	sub	cl, cl ; 0
  2787                              <1> amb_9:
  2788 00005411 89DA                <1> 	mov	edx, ebx
  2789 00005413 81EA00001000        <1> 	sub	edx, MEM_ALLOC_TBL
  2790 00005419 3B15[F0300100]      <1> 	cmp	edx, [last_page]
  2791 0000541F 7336                <1> 	jnb	short amb_14 ; contiguous pages not enough
  2792 00005421 83C304              <1> 	add	ebx, 4
  2793                              <1> amb_10:
  2794 00005424 8B03                <1> 	mov	eax, [ebx]
  2795 00005426 21C0                <1> 	and 	eax, eax
  2796 00005428 7406                <1>         jz      short amb_11 ; there is not a free page bit in this alloc dword
  2797 0000542A 40                  <1> 	inc	eax ; 0FFFFFFFFh -> 0
  2798 0000542B 740A                <1> 	jz	short amb_12 ; all of bits are set (32 free pages)
  2799 0000542D 48                  <1> 	dec	eax
  2800 0000542E EBB1                <1> 	jmp	short amb_4
  2801                              <1> amb_11:
  2802 00005430 E8F0000000          <1> 	call	amb_26 ; set maximum memory aperture (free memory block size)
  2803 00005435 EBDA                <1> 	jmp	short amb_9	
  2804                              <1> amb_12:
  2805 00005437 B120                <1> 	mov	cl, 32
  2806 00005439 390D[A43D0100]      <1> 	cmp	[mem_pg_count], ecx ; 32
  2807 0000543F 7306                <1> 	jnb	short amb_13
  2808 00005441 8B0D[A43D0100]      <1> 	mov	ecx, [mem_pg_count]
  2809                              <1> amb_13:
  2810 00005447 010D[A83D0100]      <1> 	add	[mem_aperture], ecx
  2811 0000544D 290D[A43D0100]      <1> 	sub	[mem_pg_count], ecx
  2812 00005453 7619                <1> 	jna	short amb_15
  2813 00005455 EBB8                <1> 	jmp	short amb_8
  2814                              <1> amb_14:
  2815 00005457 A1[B43D0100]        <1> 	mov	eax, [mem_max_pg_pos] ; begin address of max. mem aperture	
  2816 0000545C 8B0D[AC3D0100]      <1> 	mov	ecx, [mem_max_aperture] ; max. (largest) memory aperture
  2817 00005462 C1E00C              <1> 	shl	eax, PAGE_SHIFT	     ; convert to phy. address in bytes
  2818 00005465 C1E10C              <1> 	shl	ecx, PAGE_SHIFT	     ; convert to byte counts
  2819 00005468 F9                  <1> 	stc
  2820 00005469 E9AC000000          <1>         jmp     amb_25
  2821                              <1> 
  2822                              <1> amb_15: ; OK !
  2823 0000546E A1[B03D0100]        <1> 	mov	eax, [mem_pg_pos]    ; Beginning address as page number
  2824 00005473 8B0D[A83D0100]      <1> 	mov	ecx, [mem_aperture]  ; Free contiguous page count
  2825                              <1> amb_16:
  2826                              <1> 	; allocate contiguous memory pages (via memory allocation table bits)
  2827 00005479 89C2                <1> 	mov	edx, eax
  2828 0000547B C1EA05              <1> 	shr	edx, 5 ; 32 pages in one allocation dword (32 bits)
  2829 0000547E BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  2830 00005483 01D3                <1> 	add	ebx, edx
  2831 00005485 83E01F              <1> 	and	eax, 1Fh ; 31
  2832                              <1> 	; 03/04/2016
  2833 00005488 BA20000000          <1> 	mov	edx, 32
  2834 0000548D 28C2                <1> 	sub	dl, al
  2835 0000548F 39CA                <1> 	cmp	edx, ecx
  2836 00005491 7602                <1> 	jna	short amb_17
  2837 00005493 89CA                <1> 	mov	edx, ecx
  2838                              <1> amb_17:
  2839 00005495 29D1                <1> 	sub	ecx, edx
  2840 00005497 51                  <1> 	push	ecx ; ***
  2841 00005498 89D1                <1> 	mov	ecx, edx
  2842                              <1> amb_18:		
  2843 0000549A 0FB303              <1> 	btr	[ebx], eax	 ; The destination bit indexed by the source value
  2844                              <1> 				 ; is copied into the Carry Flag and then cleared
  2845                              <1> 				 ; in the destination.
  2846 0000549D FF0D[E8300100]      <1> 	dec     dword [free_pages] ; 1 page has been allocated (X = X-1) 
  2847 000054A3 49                  <1> 	dec	ecx
  2848 000054A4 7404                <1> 	jz	short amb_19
  2849 000054A6 FEC0                <1> 	inc	al
  2850 000054A8 EBF0                <1> 	jmp	short amb_18
  2851                              <1> amb_19:	
  2852 000054AA 59                  <1> 	pop	ecx ; ***
  2853 000054AB 21C9                <1> 	and	ecx, ecx ; 0 ?
  2854 000054AD 741E                <1> 	jz	short amb_22	
  2855                              <1> 	; 01/04/2016
  2856 000054AF B020                <1> 	mov	al, 32
  2857                              <1> amb_20:
  2858 000054B1 83C304              <1> 	add	ebx, 4
  2859 000054B4 39C1                <1> 	cmp	ecx, eax ; 32
  2860 000054B6 7305                <1> 	jnb	short amb_21
  2861                              <1> 	; ECX < 32
  2862 000054B8 28C0                <1> 	sub	al, al ; 0
  2863 000054BA 50                  <1> 	push	eax ; 0 ***
  2864 000054BB EBDD                <1> 	jmp	short amb_18
  2865                              <1> amb_21:
  2866 000054BD 2905[E8300100]      <1> 	sub	[free_pages], eax ; [free_pages] = [free_pages] - 32
  2867 000054C3 C70300000000        <1> 	mov	dword [ebx], 0 ; reset 32 bits
  2868 000054C9 29C1                <1> 	sub	ecx, eax ; 32
  2869 000054CB 75E4                <1> 	jnz	short amb_20
  2870                              <1> amb_22:
  2871 000054CD A1[B03D0100]        <1> 	mov	eax, [mem_pg_pos]   ; Beginning address as page number
  2872 000054D2 8B0D[A83D0100]      <1> 	mov	ecx, [mem_aperture] ; Free contiguous page count
  2873                              <1> 	; [next_page] update
  2874 000054D8 89C2                <1> 	mov	edx, eax
  2875                              <1> 	; 03/04/2016
  2876 000054DA C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
  2877                              <1> 				     ; (1 allocation bit = 1 page)
  2878                              <1> 				     ; (1 allocation bytes = 8 pages)
  2879 000054DD 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  2880                              <1> 				     ; (to get 32 bit position)	
  2881 000054E0 3B15[EC300100]      <1> 	cmp	edx, [next_page] ; first free page pointer offset
  2882 000054E6 7732                <1> 	ja	short amb_25
  2883 000054E8 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  2884 000054ED 833C1300            <1> 	cmp	dword [ebx+edx], 0
  2885 000054F1 7721                <1> 	ja	short amb_24
  2886 000054F3 89C2                <1> 	mov	edx, eax
  2887 000054F5 01CA                <1> 	add	edx, ecx
  2888 000054F7 C1EA03              <1> 	shr	edx, 3
  2889 000054FA 80E2FC              <1> 	and	dl, 0FCh
  2890                              <1> amb_23:
  2891 000054FD 833C1300            <1> 	cmp	dword [ebx+edx], 0
  2892 00005501 7711                <1> 	ja	short amb_24
  2893 00005503 83C204              <1> 	add	edx, 4
  2894 00005506 3B15[F0300100]      <1> 	cmp	edx, [last_page]    ; last page pointer offset
  2895 0000550C 76EF                <1> 	jna	short amb_23
  2896 0000550E 8B15[F4300100]      <1> 	mov	edx, [first_page]   ; (for) beginning of user's space
  2897                              <1> amb_24:
  2898 00005514 8915[EC300100]      <1> 	mov	[next_page], edx
  2899                              <1> amb_25:
  2900 0000551A 9C                  <1> 	pushf
  2901 0000551B C1E00C              <1> 	shl	eax, PAGE_SHIFT	     ; convert to phy. address in bytes
  2902 0000551E C1E10C              <1> 	shl	ecx, PAGE_SHIFT	     ; convert to byte counts
  2903 00005521 9D                  <1> 	popf
  2904 00005522 5B                  <1> 	pop	ebx ; **
  2905 00005523 5A                  <1> 	pop	edx ; *
  2906 00005524 C3                  <1> 	retn
  2907                              <1> 
  2908                              <1> amb_26:	; set maximum free memory aperture (free memory block size) 
  2909 00005525 89DA                <1> 	mov	edx, ebx ; current address
  2910 00005527 81EA00001000        <1> 	sub	edx, MEM_ALLOC_TBL ; MAT beginning address
  2911                              <1> 	; 02/04/2016 
  2912 0000552D C1E203              <1> 	shl	edx, 3 ; MAT byte offset * 8 = page number base
  2913 00005530 01CA                <1> 	add	edx, ecx ; current page number (ecx =  0 to 31)
  2914                              <1> 	;
  2915 00005532 A1[A83D0100]        <1> 	mov	eax, [mem_aperture]
  2916 00005537 21C0                <1> 	and	eax, eax
  2917 00005539 7424                <1>         jz      short amb_27
  2918 0000553B C705[A83D0100]0000- <1>         mov     dword [mem_aperture], 0
  2918 00005543 0000                <1>
  2919 00005545 3B05[AC3D0100]      <1> 	cmp	eax, [mem_max_aperture]
  2920 0000554B 7612                <1> 	jna	short amb_27
  2921 0000554D A3[AC3D0100]        <1> 	mov	[mem_max_aperture], eax
  2922                              <1> 	;
  2923 00005552 89D0                <1> 	mov	eax, edx
  2924 00005554 2B05[AC3D0100]      <1> 	sub	eax, [mem_max_aperture] ; the last aperture size in pages
  2925                              <1> 	; EAX = Beginning page number of the max. aperture 
  2926 0000555A A3[B43D0100]        <1> 	mov	[mem_max_pg_pos], eax
  2927                              <1> amb_27: 
  2928 0000555F 42                  <1> 	inc	edx	
  2929 00005560 8915[B03D0100]      <1> 	mov	[mem_pg_pos], edx ; next page
  2930                              <1> 
  2931 00005566 A1[A03D0100]        <1> 	mov	eax, [mem_ipg_count] ; initial (reset) value of page count
  2932 0000556B A3[A43D0100]        <1> 	mov	[mem_pg_count], eax
  2933                              <1> 
  2934 00005570 C3                  <1> 	retn
  2935                              <1> 
  2936                              <1> deallocate_memory_block:
  2937                              <1> 	; 03/04/2016
  2938                              <1> 	; 14/03/2016 (TRDOS 386 = TRDOS v2.0)
  2939                              <1> 	; Deallocating contiguous memory pages (in the kernel's memory space)
  2940                              <1> 	;
  2941                              <1> 	; INPUT -> 
  2942                              <1> 	;	EAX = Beginning address (physical)
  2943                              <1> 	;	ECX = Number of bytes to be deallocated
  2944                              <1> 	;
  2945                              <1> 	; OUTPUT ->
  2946                              <1> 	;	Mememory Allocation Table bits will be updated
  2947                              <1> 	;	[free_pages] will be changed (increased)
  2948                              <1> 	;
  2949                              <1> 	; (Modified Registers -> EAX, ECX)
  2950                              <1> 	;
  2951                              <1> 	; PURPOSE: Unloading/Freeing a file -or an allocated memory block- 
  2952                              <1> 	; at memory after copying, running, saving, reading, writing etc.
  2953                              <1> 	;
  2954                              <1> 
  2955 00005571 52                  <1> 	push	edx ; *
  2956 00005572 53                  <1> 	push	ebx ; **
  2957                              <1> 
  2958 00005573 C1E80C              <1> 	shr	eax, PAGE_SHIFT	     ; 12
  2959 00005576 C1E90C              <1> 	shr	ecx, PAGE_SHIFT	     ; 12
  2960                              <1> 
  2961                              <1> 	; EAX = Beginning page number
  2962                              <1> 	; ECX = Number of contiguous pages to be deallocated
  2963                              <1> damb_0:
  2964                              <1> 	; deallocate contiguous memory pages (via memory allocation table bits)
  2965 00005579 89C2                <1> 	mov	edx, eax
  2966 0000557B C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
  2967                              <1> 				     ; (1 allocation bit = 1 page)
  2968                              <1> 				     ; (1 allocation bytes = 8 pages)
  2969 0000557E 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  2970                              <1> 				     ; (to get 32 bit position)	
  2971 00005581 3B15[EC300100]      <1> 	cmp	edx, [next_page] ; next free page
  2972 00005587 7306                <1> 	jnb	short damb_1
  2973 00005589 8915[EC300100]      <1> 	mov	[next_page], edx
  2974                              <1> damb_1:
  2975 0000558F BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  2976 00005594 01D3                <1> 	add	ebx, edx
  2977 00005596 83E01F              <1> 	and	eax, 1Fh ; 31
  2978                              <1> 
  2979                              <1> 	; 03/04/2016
  2980 00005599 BA20000000          <1> 	mov	edx, 32
  2981 0000559E 28C2                <1> 	sub	dl, al
  2982 000055A0 39CA                <1> 	cmp	edx, ecx
  2983 000055A2 7602                <1> 	jna	short damb_2
  2984 000055A4 89CA                <1> 	mov	edx, ecx
  2985                              <1> damb_2:
  2986 000055A6 29D1                <1> 	sub	ecx, edx
  2987 000055A8 51                  <1> 	push	ecx ; ***
  2988 000055A9 89D1                <1> 	mov	ecx, edx
  2989                              <1> damb_3:		
  2990 000055AB 0FAB03              <1> 	bts	[ebx], eax	     ; unlink/release/deallocate page
  2991                              <1> 				     ; set relevant bit to 1.
  2992                              <1> 				     ; set CF to the previous bit value	
  2993 000055AE FF05[E8300100]      <1> 	inc     dword [free_pages]   ; 1 page has been deallocated (X = X+1) 
  2994 000055B4 49                  <1> 	dec	ecx
  2995 000055B5 7404                <1> 	jz	short damb_4
  2996 000055B7 FEC0                <1> 	inc	al
  2997 000055B9 EBF0                <1> 	jmp	short damb_3
  2998                              <1> damb_4:	
  2999 000055BB 59                  <1> 	pop	ecx ; ***
  3000 000055BC 21C9                <1> 	and	ecx, ecx ; 0 ?
  3001 000055BE 741E                <1> 	jz	short damb_7
  3002                              <1> 	; 03/04/2016
  3003 000055C0 B020                <1> 	mov	al, 32
  3004                              <1> damb_5:
  3005 000055C2 83C304              <1> 	add	ebx, 4
  3006 000055C5 39C1                <1> 	cmp	ecx, eax ; 32
  3007 000055C7 7305                <1> 	jnb	short damb_6
  3008                              <1> 	; ECX < 32
  3009 000055C9 28C0                <1> 	sub	al, al ; 0
  3010 000055CB 50                  <1> 	push	eax ; 0 ***
  3011 000055CC EBDD                <1> 	jmp	short damb_3
  3012                              <1> damb_6:
  3013 000055CE 0105[E8300100]      <1> 	add	[free_pages], eax ; [free_pages] = [free_pages] + 32
  3014 000055D4 C703FFFFFFFF        <1> 	mov	dword [ebx], 0FFFFFFFFh ; set 32 bits
  3015 000055DA 29C1                <1> 	sub	ecx, eax ; 32
  3016 000055DC 75E4                <1> 	jnz	short damb_5
  3017                              <1> damb_7:
  3018 000055DE 5B                  <1> 	pop	ebx ; **
  3019 000055DF 5A                  <1> 	pop	edx ; *
  3020 000055E0 C3                  <1> 	retn
  3021                              <1> 
  3022                              <1> direct_memory_access:
  3023                              <1> 	; 16/07/2016
  3024                              <1> 	; 12/07/2016 (TRDOS 386 = TRDOS v2.0)
  3025                              <1> 	; This processure will be called to map
  3026                              <1> 	; user's (ring 3) page tables to access phsical
  3027                              <1> 	; (flat/linear) memory addresses, directy (without
  3028                              <1> 	;  kernel's data transfer functions).
  3029                              <1> 	; 
  3030                              <1> 	; Purpose: Video memory access and shared memory access.
  3031                              <1> 	;
  3032                              <1> 	; INPUT -> 
  3033                              <1> 	;	EAX = Beginning address (physical).
  3034                              <1> 	;	ECX = Number of contiguous pages to be mapped.
  3035                              <1> 	; OUTPUT ->
  3036                              <1> 	;	User's page directory and pages tables
  3037                              <1> 	;	will be updated.
  3038                              <1> 	;	
  3039                              <1> 	;	If an old page table entry has valid page address, 
  3040                              <1> 	;	that page will be deallocated just before PTE will
  3041                              <1> 	;	be changed for direct (1 to 1) memory page access.
  3042                              <1> 	;
  3043                              <1> 	;	If old PTE value points to a swapped page,
  3044                              <1>         ;       that page (block) will be unlinked on swap disk. 
  3045                              <1> 	;
  3046                              <1> 	;	Newly allocated pages (except page tables) will not
  3047                              <1> 	;	be applied to Memory Allocation Table.
  3048                              <1> 	;	AVL bit 1 (PTE bit 10) of page table entry will be
  3049                              <1> 	;	used to indicate shared (direct) memory page; then,
  3050                              <1> 	;	this page will not be deallocated later during
  3051                              <1> 	;	process termination. (Memory Allocation Table and
  3052                              <1> 	;	free memory count will not be affected.
  3053                              <1> 	;	(Except deallocating page table's itself.)
  3054                              <1> 	;	
  3055                              <1> 	;      CF = 1 -> error (EAX = error code)
  3056                              <1> 	;      CF = 0 -> success (EAX = beginning address)
  3057                              <1> 	;
  3058                              <1> 	;; (Modified Registers -> none)
  3059                              <1> 	; Modified registers: ebp, edx, ecx, ebx, esi, edi	
  3060                              <1> 	;
  3061                              <1> 
  3062                              <1> 	;push	ebp
  3063                              <1> 	;push	ebx
  3064                              <1> 	;push	ecx
  3065                              <1> 	;push	edx
  3066 000055E1 662500F0            <1> 	and	ax, PTE_A_CLEAR ; clear page offset
  3067 000055E5 50                  <1> 	push	eax
  3068 000055E6 89C5                <1> 	mov	ebp, eax
  3069                              <1> dmem_acc_0: 
  3070 000055E8 89C3                <1> 	mov	ebx, eax
  3071 000055EA 81C300004000        <1> 	add	ebx, CORE
  3072 000055F0 A1[70470100]        <1> 	mov	eax, [u.pgdir] ; page dir address (physical)
  3073 000055F5 E820F6FFFF          <1> 	call	get_pte
  3074                              <1> 		; EDX = Page table entry address (if CF=0)
  3075                              <1> 	        ;       Page directory entry address (if CF=1)
  3076                              <1> 		;       (Bit 0 value is 0 if PT is not present)
  3077                              <1> 		; EAX = Page table entry value (page address)
  3078                              <1> 		;	CF = 1 -> PDE not present or invalid ? 	
  3079 000055FA 7324                <1> 	jnc	short dmem_acc_1
  3080                              <1> 	;
  3081 000055FC E8FEF4FFFF          <1> 	call	allocate_page
  3082 00005601 0F82A1000000        <1>         jc      dmem_acc_7  ; 'insufficient memory' error
  3083                              <1> 	;
  3084 00005607 E86DF5FFFF          <1> 	call 	clear_page
  3085                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  3086 0000560C 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER ; 4+2+1 = 7
  3087                              <1> 			   ; lower 3 bits are used as U/S, R/W, P flags
  3088                              <1> 			   ; (user, writable, present page)	
  3089 0000560E 8902                <1> 	mov	[edx], eax ; Let's put the new page directory entry here !
  3090 00005610 A1[70470100]        <1> 	mov	eax, [u.pgdir]	
  3091 00005615 E800F6FFFF          <1> 	call	get_pte
  3092 0000561A 0F8288000000        <1>         jc      dmem_acc_7 ; 'insufficient memory' error
  3093                              <1> dmem_acc_1:
  3094                              <1> 	; EAX = PTE value, EDX = PTE address
  3095 00005620 A801                <1> 	test 	al, PTE_A_PRESENT
  3096 00005622 750D                <1> 	jnz	short dmem_acc_2
  3097 00005624 09C0                <1> 	or	eax, eax
  3098 00005626 7468                <1> 	jz	short dmem_acc_6   ; Change PTE
  3099 00005628 D1E8                <1> 	shr	eax, 1		; swap disk block (8 sectors) address
  3100                              <1> 	; unlink swap disk block
  3101 0000562A E858FBFFFF          <1> 	call	unlink_swap_block
  3102 0000562F EB5F                <1> 	jmp	short dmem_acc_6
  3103                              <1> 
  3104                              <1> dmem_acc_2:
  3105 00005631 A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
  3106                              <1> 				  ; (must be 1)
  3107 00005633 7550                <1> 	jnz	short dmem_acc_4
  3108                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
  3109 00005635 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
  3110                              <1> 				   ; as child's page ?
  3111 00005639 7455                <1> 	jz	short dmem_acc_5 ; Change PTE but don't deallocate the page!
  3112                              <1> 
  3113                              <1> 	;push	edi
  3114                              <1> 	;push	esi
  3115                              <1> 
  3116 0000563B 51                  <1> 	push	ecx
  3117                              <1> 	;push	ebx
  3118 0000563C 8B1D[74470100]      <1> 	mov	ebx, [u.ppgdir] ; parent's page dir address (physical)
  3119                              <1> 	
  3120                              <1> 	; check the parent's PTE value is read only & same page or not.. 
  3121 00005642 89EF                <1> 	mov	edi, ebp
  3122 00005644 C1EF16              <1> 	shr	edi, PAGE_D_SHIFT ; 22
  3123                              <1> 	; EDI = page directory entry index (0-1023)
  3124 00005647 89EE                <1> 	mov	esi, ebp
  3125 00005649 C1EE0C              <1> 	shr	esi, PAGE_SHIFT ; 12	
  3126 0000564C 81E6FF030000        <1> 	and	esi, PTE_MASK
  3127                              <1> 	; ESI = page table entry index (0-1023)
  3128                              <1> 
  3129 00005652 66C1E702            <1> 	shl	di, 2 ; * 4
  3130 00005656 01FB                <1> 	add	ebx, edi ; PDE offset (for the parent)
  3131 00005658 8B0F                <1> 	mov	ecx, [edi]
  3132 0000565A F6C101              <1> 	test	cl, PDE_A_PRESENT ; present (valid) or not ?
  3133 0000565D 7425                <1> 	jz	short dmem_acc_3	; parent process does not use this page
  3134 0000565F 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  3135 00005664 66C1E602            <1> 	shl	si, 2 ; *4 
  3136 00005668 01CE                <1> 	add	esi, ecx ; PTE offset (for the parent)
  3137 0000566A 8B1E                <1> 	mov	ebx, [esi]
  3138 0000566C F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
  3139 0000566F 7413                <1> 	jz	short dmem_acc_3	; parent process does not use this page
  3140 00005671 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
  3141 00005675 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
  3142 0000567A 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
  3143 0000567C 7506                <1> 	jne	short dmem_acc_3	; not same page
  3144                              <1> 				; deallocate the child's page
  3145 0000567E 800E02              <1>         or      byte [esi], PTE_A_WRITE ; convert to writable page (parent)
  3146                              <1> 	;pop	ebx
  3147 00005681 59                  <1> 	pop	ecx
  3148 00005682 EB0C                <1> 	jmp	short dmem_acc_5
  3149                              <1> dmem_acc_3:
  3150                              <1> 	;pop	ebx
  3151 00005684 59                  <1> 	pop	ecx
  3152                              <1> dmem_acc_4:	
  3153 00005685 66A90004            <1> 	test	ax, PTE_SHARED ; shared or direct memory access indicator
  3154 00005689 7505                <1> 	jnz	short dmem_acc_5   ; AVL bit 1 = 1, do not deallocate this page!
  3155                              <1> 	;
  3156                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3157 0000568B E84DF6FFFF          <1> 	call	deallocate_page
  3158                              <1> dmem_acc_5:
  3159                              <1> 	;pop	esi
  3160                              <1> 	;pop	edi
  3161                              <1> dmem_acc_6:
  3162 00005690 89E8                <1> 	mov	eax, ebp ; physical page (offset=0) address
  3163                              <1> 	; EAX = memory page address
  3164                              <1> 	; EDX = PTE entry address (physical)
  3165 00005692 660D0704            <1> 	or	ax, PTE_A_PRESENT+PTE_A_USER+PTE_A_WRITE+PTE_SHARED
  3166                              <1> 			; present flag, bit 0 = 1
  3167                              <1> 			; user flag, bit 2 = 1	
  3168                              <1> 			; writable flag, bit 1 = 1
  3169                              <1> 			; direct memory access flag, bit 10 = 1
  3170                              <1> 			; (This page must not be deallocated!)
  3171 00005696 8902                <1> 	mov	[edx], eax  ; Update PTE value
  3172 00005698 49                  <1> 	dec	ecx ; remain count of contiguous pages
  3173 00005699 7414                <1> 	jz	short dmem_acc_8
  3174 0000569B 81C500100000        <1> 	add	ebp, PAGE_SIZE ; next virtual (=pysical) page address
  3175 000056A1 89E8                <1> 	mov	eax, ebp
  3176 000056A3 E940FFFFFF          <1>         jmp     dmem_acc_0
  3177                              <1> dmem_acc_7:  ; ERROR ! 
  3178 000056A8 C7042404000000      <1> 	mov	dword [esp], ERR_MINOR_IM 
  3179                              <1> 		; Insufficient memory (minor) error!
  3180                              <1> 		; Major error = 0 (No protection fault)	
  3181                              <1> 	; cf = 1
  3182                              <1> dmem_acc_8:
  3183 000056AF 58                  <1> 	pop	eax
  3184                              <1> 	;pop	edx
  3185                              <1> 	;pop	ecx
  3186                              <1> 	;pop	ebx
  3187                              <1> 	;pop	ebp
  3188 000056B0 C3                  <1> 	retn
  3189                              <1> 
  3190                              <1> ; /// End Of MEMORY MANAGEMENT FUNCTIONS ///
  3191                              <1> 
  3192                              <1> ;; Data:
  3193                              <1> 
  3194                              <1> ; 09/03/2015
  3195                              <1> ;swpq_count: dw 0 ; count of pages on the swap que
  3196                              <1> ;swp_drv:    dd 0 ; logical drive description table address of the swap drive/disk
  3197                              <1> ;swpd_size:  dd 0 ; size of swap drive/disk (volume) in sectors (512 bytes). 		  				
  3198                              <1> ;swpd_free:  dd 0 ; free page blocks (4096 bytes) on swap disk/drive (logical)
  3199                              <1> ;swpd_next:  dd 0 ; next free page block
  3200                              <1> ;swpd_last:  dd 0 ; last swap page block		 		
  2130                                  %include 'timer.s'   ; 17/01/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - timer.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 15/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 17/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ;
    15                              <1> ; Derived from 'IBM PC-AT' BIOS source code (1985) 
    16                              <1> ; ****************************************************************************
    17                              <1> 
    18                              <1> ; TRDOS 386  (TRDOS v2.0) Kernel - TIMER & REAL TIME CLOCK (BIOS) FUNCTIONS
    19                              <1> 
    20                              <1> ; IBM PC-AT BIOS Source Code ('BIOS2.ASM')
    21                              <1> ; TITLE BIOS2 ---- 06/10/85 BIOS INTERRUPT ROUTINES
    22                              <1> 
    23                              <1> ;
    24                              <1> ; ///////// TIMER (& REAL TIME CLOCK) FUNCTIONS ///////////////
    25                              <1> 
    26                              <1> int1Ah:
    27                              <1> 	; 29/01/2016
    28                              <1> 	; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
    29 000056B1 9C                  <1> 	pushfd
    30 000056B2 0E                  <1> 	push 	cs
    31 000056B3 E801000000          <1> 	call 	TIME_OF_DAY_1
    32 000056B8 C3                  <1> 	retn
    33                              <1> 
    34                              <1> ;--- INT  1A H -- (TIME OF DAY) -------------------------------------------------
    35                              <1> ;       THIS BIOS ROUTINE ALLOWS THE CLOCKS TO BE SET OR READ			:
    36                              <1> ;										:
    37                              <1> ; PARAMETERS:									:
    38                              <1> ;     (AH) = 00H  READ THE CURRENT SETTING AND RETURN WITH,			:
    39                              <1> ;                      (CX) = HIGH PORTION OF COUNT				:
    40                              <1> ;                      (DX) = LOW PORTION OF COUNT				:
    41                              <1> ;                      (AL) = 0 TIMER HAS NOT PASSED 24 HOURS SINCE LAST READ	:
    42                              <1> ;                             1 IF ON ANOTHER DAY. (RESET TO ZERO AFTER READ)	:
    43                              <1> ;										:
    44                              <1> ;     (AH) = 01H  SET THE CURRENT CLOCK USING,					:
    45                              <1> ;		     (CX) = HIGH PORTION OF COUNT				:
    46                              <1> ;		     (DX) = LOW PORTION OF COUNT.				:
    47                              <1> ;										:
    48                              <1> ;               NOTE: COUNTS OCCUR AT THE RATE OF 1193180/65536 COUNTS/SECOND	:
    49                              <1> ;                            (OR ABOUT 18.2 PER SECOND -- SEE EQUATES)		:
    50                              <1> ;										:
    51                              <1> ;     (AH) = 02H  READ THE REAL TIME CLOCK AND RETURN WITH,			:
    52                              <1> ;                      (CH) = HOURS IN BCD (00-23)				:
    53                              <1> ;                      (CL) = MINUTES IN BCD (00-59)				:
    54                              <1> ;                      (DH) = SECONDS IN BCD (00-59)				:
    55                              <1> ;                      (DL) = DAYLIGHT SAVINGS ENABLE (00-01)			:
    56                              <1> ;										:
    57                              <1> ;     (AH) = 03H  SET THE REAL TIME CLOCK USING,				:
    58                              <1> ;                     (CH) = HOURS IN BCD (00-23)				:
    59                              <1> ;                     (CL) = MINUTES IN BCD (00-59)				:
    60                              <1> ;                     (DH) = SECONDS IN BCD (00-59)				:
    61                              <1> ;                     (DL) = 01 IF DAYLIGHT SAVINGS ENABLE OPTION, ELSE 00.	:
    62                              <1> ;										:
    63                              <1> ;             NOTE: (DL) = 00 IF DAYLIGHT SAVINGS TIME ENABLE IS NOT ENABLED.	:
    64                              <1> ;                   (DL) = 01 ENABLES TWO SPECIAL UPDATES THE LAST SUNDAY IN	:
    65                              <1> ;	           APRIL   (1:59:59 --> 3:00:00 AM) AND THE LAST SUNDAY IN	:
    66                              <1> ;                   OCTOBER (1:59:59 --> 1:00:00 AM) THE FIRST TIME.		:
    67                              <1> ;										:
    68                              <1> ;     (AH) = 04H  READ THE DATE FROM THE REAL TIME CLOCK AND RETURN WITH,	:
    69                              <1> ;                      (CH) = CENTURY IN BCD (19 OR 20)				:
    70                              <1> ;                      (CL) = YEAR IN BCD (00-99)				:
    71                              <1> ;                      (DH) = MONTH IN BCD (01-12)				:
    72                              <1> ;                      (DL) = DAY IN BCD (01-31).				:
    73                              <1> ;										:
    74                              <1> ;     (AH) = 05H  SET THE DATE INTO THE REAL TIME CLOCK USING,			:
    75                              <1> ;                     (CH) = CENTURY IN BCD (19 OR 20)				:
    76                              <1> ;                     (CL) = YEAR IN BCD (00-99)				:
    77                              <1> ;                     (DH) = MONTH IN BCD (01-12)				:
    78                              <1> ;                     (DL) = DAY IN BCD (01-31).				:
    79                              <1> ;										:
    80                              <1> ;     (AH) = 06H  SET THE ALARM TO INTERRUPT AT SPECIFIED TIME,			:
    81                              <1> ;                     (CH) = HOURS IN BCD (00-23 (OR FFH))			:
    82                              <1> ;                     (CL) = MINUTES IN BCD (00-59 (OR FFH))			:
    83                              <1> ;                     (DH) = SECONDS IN BCD (00-59 (OR FFH))			:
    84                              <1> ;										:
    85                              <1> ;     (AH) = 07H  RESET THE ALARM INTERRUPT FUNCTION.				:
    86                              <1> ;										:
    87                              <1> ; NOTES: FOR ALL RETURNS CY= 0 FOR SUCCESSFUL OPERATION.			:
    88                              <1> ;        FOR (AH)= 2, 4, 6 - CARRY FLAG SET IF REAL TIME CLOCK NOT OPERATING.	:
    89                              <1> ;        FOR (AH)= 6 - CARRY FLAG SET IF ALARM ALREADY ENABLED. 		:
    90                              <1> ;        FOR THE ALARM FUNCTION (AH = 6) THE USER MUST SUPPLY A ROUTINE AND	:
    91                              <1> ;         INTERCEPT THE CORRECT ADDRESS IN THE VECTOR TABLE FOR INTERRUPT 4AH.	:
    92                              <1> ;         USE 0FFH FOR ANY "DO NOT CARE" POSITION FOR INTERVAL INTERRUPTS.	:
    93                              <1> ;        INTERRUPTS ARE DISABLED DURING DATA MODIFICATION. 			:
    94                              <1> ;        AH & AL ARE RETURNED MODIFIED AND NOT DEFINED EXCEPT WHERE INDICATED.	:
    95                              <1> ;--------------------------------------------------------------------------------
    96                              <1> 
    97                              <1> ; 15/01/2017
    98                              <1> ; 14/01/2017
    99                              <1> ; 07/01/2017
   100                              <1> ; 02/01/2017
   101                              <1> ; 29/05/2016
   102                              <1> ; 29/01/2016
   103                              <1> ; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
   104                              <1> 
   105                              <1> ; 29/05/2016
   106                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   107                              <1> int35h:  ; Date/Time functions
   108                              <1> 
   109                              <1> TIME_OF_DAY_1:
   110                              <1> 	;sti				; INTERRUPTS BACK ON
   111                              <1> 	; 29/05/2016
   112 000056B9 80642408FE          <1> 	and	byte [esp+8], 11111110b	; clear carry bit of eflags register
   113                              <1> 	;
   114 000056BE 80FC08              <1> 	cmp	ah, (RTC_TBE-RTC_TB)/4	; CHECK IF COMMAND IN VALID RANGE (0-7)
   115 000056C1 F5                  <1> 	cmc				; COMPLEMENT CARRY FOR ERROR EXIT
   116                              <1> 	; (*) jc short TIME_9		; EXIT WITH CARRY = 1 IF NOT VALID
   117 000056C2 721A                <1> 	jc	short _TIME_9 ; 29/05/2016
   118                              <1> 
   119 000056C4 1E                  <1> 	push	ds
   120 000056C5 56                  <1> 	push	esi
   121 000056C6 66BE1000            <1> 	mov	si, KDATA		; kernel data segment
   122 000056CA 8EDE                <1> 	mov	ds, si
   123                              <1> 
   124                              <1> 	;;15/01/2017
   125                              <1> 	; 14/01/2017
   126                              <1> 	; 02/01/2017
   127                              <1> 	;;mov	byte [intflg], 35h	; date & time interrupt 
   128                              <1> 	;sti
   129                              <1> 	;
   130 000056CC C0E402              <1> 	shl	ah, 2			; convert function to dword offset
   131 000056CF 0FB6F4              <1> 	movzx	esi, ah			; PLACE INTO ADDRESSING REGISTER
   132                              <1> 	;cli				; NO INTERRUPTS DURING TIME FUNCTIONS
   133 000056D2 FF96[E4560000]      <1> 	call	[esi+RTC_TB]		; VECTOR TO FUNCTION REQUESTED WITH CY=0
   134                              <1> 					; RETURN WITH CARRY FLAG SET FOR RESULT
   135                              <1> 	;sti				; INTERRUPTS BACK ON
   136 000056D8 B400                <1> 	mov	ah, 0			; CLEAR (AH) TO ZERO
   137 000056DA 5E                  <1> 	pop	esi			; RECOVER USERS REGISTER
   138 000056DB 1F                  <1> 	pop	ds			; RECOVER USERS SEGMENT SELECTOR
   139                              <1> 
   140                              <1> 	;;15/01/2017
   141                              <1> 	; 02/01/2017
   142                              <1> 	;;mov	byte [ss:intflg], 0 ; 07/01/2017
   143                              <1> 
   144                              <1> ;TIME_9:
   145                              <1> 					; RETURN WITH CY= 0 IF NO ERROR
   146                              <1> 	; (*) 29/05/2016
   147                              <1> 	; (*) retf 4 ; skip eflags on stack
   148 000056DC 7305                <1> 	jnc	short _TIME_10
   149                              <1> _TIME_9:
   150                              <1> 	; 29/05/2016 -set carry flag on stack-
   151                              <1> 	; [esp] = EIP
   152                              <1> 	; [esp+4] = CS
   153                              <1> 	; [esp+8] = E-FLAGS
   154 000056DE 804C240801          <1> 	or	byte [esp+8], 1	 ; set carry bit of eflags register
   155                              <1> 	; [esp+12] = ESP (user)
   156                              <1> 	; [esp+16] = SS (User)
   157                              <1> _TIME_10:
   158 000056E3 CF                  <1> 	iretd
   159                              <1> 	
   160                              <1> 	; (*) 29/05/2016 - 'ref 4' intruction causes to stack fault
   161                              <1> 	; (OUTER-PRIVILEGE-LEVEL)
   162                              <1> 	; INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986
   163                              <1> 	; // RETF instruction:
   164                              <1> 	;
   165                              <1> 	; IF OperandMode=32 THEN
   166                              <1>  	;    Load CS:EIP from stack;
   167                              <1>  	;    Set CS RPL to CPL;
   168                              <1>  	;    Increment eSP by 8 plus the immediate offset if it exists;
   169                              <1>  	;    Load SS:eSP from stack;
   170                              <1>  	; ELSE (* OperandMode=16 *)
   171                              <1>  	;    Load CS:IP from stack;
   172                              <1>  	;    Set CS RPL to CPL;
   173                              <1>  	;    Increment eSP by 4 plus the immediate offset if it exists;
   174                              <1> 	;    Load SS:eSP from stack;
   175                              <1>  	; FI;
   176                              <1> 	;
   177                              <1> 	; //					
   178                              <1> 					; ROUTINE VECTOR TABLE (AH)=
   179                              <1> RTC_TB:
   180 000056E4 [04570000]          <1> 	dd	RTC_00			; 0 = READ CURRENT CLOCK COUNT
   181 000056E8 [17570000]          <1> 	dd	RTC_10			; 1 = SET CLOCK COUNT
   182 000056EC [25570000]          <1> 	dd	RTC_20			; 2 = READ THE REAL TIME CLOCK TIME
   183 000056F0 [54570000]          <1> 	dd	RTC_30			; 3 = SET REAL TIME CLOCK TIME
   184 000056F4 [96570000]          <1> 	dd	RTC_40			; 4 = READ THE REAL TIME CLOCK DATE
   185 000056F8 [C3570000]          <1> 	dd	RTC_50			; 5 = SET REAL TIME CLOCK DATE
   186 000056FC [10580000]          <1> 	dd	RTC_60			; 6 = SET THE REAL TIME CLOCK ALARM
   187 00005700 [63580000]          <1> 	dd	RTC_70			; 7 = RESET ALARM
   188                              <1> 
   189                              <1> RTC_TBE	equ	$
   190                              <1> 
   191                              <1> RTC_00:				; READ TIME COUNT
   192 00005704 A0[64310100]        <1> 	mov	al, [TIMER_OFL]		; GET THE OVERFLOW FLAG
   193 00005709 C605[64310100]00    <1> 	mov	byte [TIMER_OFL], 0	; AND THEN RESET THE OVERFLOW FLAG
   194 00005710 8B0D[60310100]      <1>         mov     ecx, [TIMER_LH]         ; GET COUNT OF TIME
   195 00005716 C3                  <1> 	retn
   196                              <1> 
   197                              <1> RTC_10:				; SET TIME COUNT
   198 00005717 890D[60310100]      <1>         mov     [TIMER_LH], ecx         ; SET TIME COUNT
   199 0000571D C605[64310100]00    <1> 	mov	byte [TIMER_OFL], 0	; RESET OVERFLOW FLAG
   200 00005724 C3                  <1> 	retn				; RETURN WITH NO CARRY
   201                              <1> 
   202                              <1> RTC_20:				; GET RTC TIME
   203 00005725 E8EB010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   204 0000572A 7227                <1> 	jc	short RTC_29		; EXIT IF ERROR (CY= 1)
   205                              <1> 
   206 0000572C B000                <1> 	mov	al, CMOS_SECONDS	; SET ADDRESS OF SECONDS
   207 0000572E E8FD010000          <1> 	call	CMOS_READ		; GET SECONDS
   208 00005733 88C6                <1> 	mov	dh, al			; SAVE
   209 00005735 B00B                <1> 	mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   210 00005737 E8F4010000          <1> 	call	CMOS_READ		; READ CURRENT VALUE OF DSE BIT
   211 0000573C 2401                <1> 	and	al, 00000001b		; MASK FOR VALID DSE BIT
   212 0000573E 88C2                <1> 	mov	dl, al			; SET [DL] TO ZERO FOR NO DSE BIT
   213 00005740 B002                <1> 	mov	al, CMOS_MINUTES	; SET ADDRESS OF MINUTES
   214 00005742 E8E9010000          <1> 	call	CMOS_READ		; GET MINUTES
   215 00005747 88C1                <1> 	mov	cl, al			; SAVE
   216 00005749 B004                <1>         mov     al, CMOS_HOURS          ; SET ADDRESS OF HOURS
   217 0000574B E8E0010000          <1> 	call	CMOS_READ		; GET HOURS
   218 00005750 88C5                <1> 	mov	ch, al			; SAVE
   219 00005752 F8                  <1> 	clc				; SET CY= 0
   220                              <1> RTC_29:
   221 00005753 C3                  <1> 	retn				; RETURN WITH RESULT IN CARRY FLAG
   222                              <1> 
   223                              <1> RTC_30:				; SET RTC TIME
   224 00005754 E8BC010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   225 00005759 7305                <1> 	jnc	short RTC_35		; GO AROUND IF CLOCK OPERATING
   226 0000575B E817010000          <1> 	call	RTC_STA			; ELSE TRY INITIALIZING CLOCK
   227                              <1> RTC_35:
   228 00005760 88F4                <1> 	mov	ah, dh			; GET TIME BYTE - SECONDS
   229 00005762 B000                <1> 	mov	al, CMOS_SECONDS	; ADDRESS SECONDS
   230 00005764 E8E0010000          <1> 	call	CMOS_WRITE		; UPDATE SECONDS
   231 00005769 88CC                <1> 	mov	ah, cl			; GET TIME BYTE - MINUTES
   232 0000576B B002                <1> 	mov	al, CMOS_MINUTES	; ADDRESS MINUTES
   233 0000576D E8D7010000          <1> 	call	CMOS_WRITE		; UPDATE MINUTES
   234 00005772 88EC                <1> 	mov	ah, ch			; GET TIME BYTE - HOURS
   235 00005774 B004                <1> 	mov	al, CMOS_HOURS		; ADDRESS HOURS
   236 00005776 E8CE010000          <1> 	call	CMOS_WRITE		; UPDATE ADDRESS
   237                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   238                              <1> 	;mov	ah, al
   239 0000577B 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   240 0000577F E8AC010000          <1> 	call	CMOS_READ		; READ CURRENT TIME
   241 00005784 2462                <1> 	and	al, 01100010b		; MASK FOR VALID BIT POSITIONS
   242 00005786 0C02                <1> 	or	al, 00000010b		; TURN ON 24 HOUR MODE
   243 00005788 80E201              <1> 	and	dl, 00000001b		; USE ONLY THE DSE BIT
   244 0000578B 08D0                <1> 	or	al, dl			; GET DAY LIGHT SAVINGS TIME BIT (OSE)
   245 0000578D 86E0                <1> 	xchg	ah, al			; PLACE IN WORK REGISTER AND GET ADDRESS
   246 0000578F E8B5010000          <1> 	call	CMOS_WRITE		; SET NEW ALARM SITS
   247 00005794 F8                  <1> 	clc				; SET CY= 0
   248 00005795 C3                  <1> 	retn				; RETURN WITH CY= 0
   249                              <1> 
   250                              <1> RTC_40:				; GET RTC DATE
   251 00005796 E87A010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   252 0000579B 7225                <1> 	jc	short RTC_49		; EXIT IF ERROR (CY= 1)
   253                              <1> 
   254 0000579D B007                <1> 	mov	al, CMOS_DAY_MONTH	; ADDRESS DAY OF MONTH
   255 0000579F E88C010000          <1> 	call	CMOS_READ		; READ DAY OF MONTH
   256 000057A4 88C2                <1> 	mov	dl, al			; SAVE
   257 000057A6 B008                <1> 	mov	al, CMOS_MONTH		; ADDRESS MONTH
   258 000057A8 E883010000          <1> 	call	CMOS_READ		; READ MONTH
   259 000057AD 88C6                <1> 	mov	dh, al			; SAVE
   260 000057AF B009                <1> 	mov	al, CMOS_YEAR		; ADDRESS YEAR
   261 000057B1 E87A010000          <1> 	call	CMOS_READ		; READ YEAR
   262 000057B6 88C1                <1> 	mov	cl, al			; SAVE
   263 000057B8 B032                <1> 	mov	al, CMOS_CENTURY	; ADDRESS CENTURY LOCATION
   264 000057BA E871010000          <1> 	call	CMOS_READ		; GET CENTURY BYTE
   265 000057BF 88C5                <1> 	mov	ch, al			; SAVE
   266 000057C1 F8                  <1> 	clc				; SET CY=0
   267                              <1> RTC_49:
   268 000057C2 C3                  <1> 	retn				; RETURN WITH RESULTS IN CARRY FLAG
   269                              <1> 
   270                              <1> RTC_50:				; SET RTC DATE
   271 000057C3 E84D010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   272 000057C8 7305                <1> 	jnc	short RTC_55		; GO AROUND IF NO ERROR
   273 000057CA E8A8000000          <1> 	call	RTC_STA			; ELSE INITIALIZE CLOCK
   274                              <1> RTC_55:
   275 000057CF 66B80600            <1> 	mov	ax, CMOS_DAY_WEEK	; ADDRESS OF DAY OF WEEK BYTE
   276 000057D3 E871010000          <1> 	call	CMOS_WRITE		; LOAD ZEROS TO DAY OF WEEK
   277 000057D8 88D4                <1> 	mov	ah, dl			; GET DAY OF MONTH BYTE
   278 000057DA B007                <1> 	mov	al, CMOS_DAY_MONTH	; ADDRESS DAY OF MONTH BYTE
   279 000057DC E868010000          <1> 	call	CMOS_WRITE		; WRITE OF DAY OF MONTH REGISTER
   280 000057E1 88F4                <1> 	mov	ah, dh			; GET MONTH
   281 000057E3 B008                <1> 	mov	al, CMOS_MONTH		; ADDRESS MONTH BYTE
   282 000057E5 E85F010000          <1> 	call	CMOS_WRITE		; WRITE MONTH REGISTER
   283 000057EA 88CC                <1> 	mov	ah, cl			; GET YEAR BYTE
   284 000057EC B009                <1> 	mov	al, CMOS_YEAR		; ADDRESS YEAR REGISTER
   285 000057EE E856010000          <1> 	call	CMOS_WRITE		; WRITE YEAR REGISTER
   286 000057F3 88EC                <1> 	mov	ah, ch			; GET CENTURY BYTE
   287 000057F5 B032                <1> 	mov	al, CMOS_CENTURY	; ADDRESS CENTURY BYTE
   288 000057F7 E84D010000          <1> 	call	CMOS_WRITE		; WRITE CENTURY LOCATION
   289                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   290                              <1> 	;mov	ah, al
   291 000057FC 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   292 00005800 E82B010000          <1> 	call	CMOS_READ		; READ WIRRENT SETTINGS
   293 00005805 247F                <1> 	and	al, 07Fh		; CLEAR 'SET BIT'
   294 00005807 86E0                <1> 	xchg	ah, al			; MOVE TO WORK REGISTER
   295 00005809 E83B010000          <1> 	call	CMOS_WRITE		; AND START CLOCK UPDATING
   296 0000580E F8                  <1> 	clc				; SET CY= 0
   297 0000580F C3                  <1> 	retn				; RETURN CY=0
   298                              <1> 
   299                              <1> RTC_60:				; SET RTC ALARM
   300 00005810 B00B                <1> 	mov	al, CMOS_REG_B		; ADDRESS ALARM
   301 00005812 E819010000          <1> 	call	CMOS_READ		; READ ALARM REGISTER
   302 00005817 A820                <1> 	test	al, 20h			; CHECK FOR ALARM ALREADY ENABLED
   303 00005819 F9                  <1> 	stc				; SET CARRY IN CASE OF ERROR
   304 0000581A 7542                <1> 	jnz	short RTC_69		; ERROR EXIT IF ALARM SET
   305 0000581C E8F4000000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   306 00005821 7305                <1> 	jnc	short RTC_65		; SKIP INITIALIZATION IF NO ERROR
   307 00005823 E84F000000          <1> 	call	RTC_STA			; ELSE INITIALIZE CLOCK
   308                              <1> RTC_65:	
   309 00005828 88F4                <1> 	mov	ah, dh			; GET SECONDS BYTE
   310 0000582A B001                <1> 	mov	al, CMOS_SEC_ALARM	; ADDRESS THE SECONDS ALARM REGISTER
   311 0000582C E818010000          <1> 	call	CMOS_WRITE		; INSERT SECONDS
   312 00005831 88CC                <1> 	mov	ah, cl			; GET MINUTES PARAMETER
   313 00005833 B003                <1> 	mov	al, CMOS_MIN_ALARM	; ADDRESS MINUTES ALARM REGISTER
   314 00005835 E80F010000          <1> 	call	CMOS_WRITE		; INSERT MINUTES
   315 0000583A 88EC                <1> 	mov	ah, ch			; GET HOURS PARAMETER
   316 0000583C B005                <1> 	mov	al, CMOS_HR_ALARM	; ADDRESS HOUR ALARM REGISTER
   317 0000583E E806010000          <1> 	call	CMOS_WRITE		; INSERT HOURS
   318 00005843 E4A1                <1> 	in	al, INTB01		; READ SECOND INTERRUPT MASK REGISTER
   319 00005845 24FE                <1> 	and	al, 0FEh		; ENABLE ALARM TIMER BIT (CY= 0)
   320 00005847 E6A1                <1> 	out	INTB01, al		; WRITE UPDATED MASK
   321                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   322                              <1> 	;mov	ah, al
   323 00005849 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   324 0000584D E8DE000000          <1> 	call	CMOS_READ		; READ CURRENT ALARM REGISTER
   325 00005852 247F                <1> 	and	al, 07Fh		; ENSURE SET BIT TURNED OFF
   326 00005854 0C20                <1> 	or	al, 20h			; TURN ON ALARM ENABLE
   327 00005856 86E0                <1> 	xchg	ah, al			; MOVE MASK TO OUTPUT REGISTER
   328 00005858 E8EC000000          <1> 	call	CMOS_WRITE		; WRITE NEW ALARM MASK
   329 0000585D F8                  <1> 	clc				; SET CY= 0
   330                              <1> RTC_69:
   331 0000585E 66B80000            <1> 	mov	ax, 0			; CLEAR AX REGISTER
   332 00005862 C3                  <1> 	retn				; RETURN WITH RESULTS IN CARRY FLAC
   333                              <1> 
   334                              <1> RTC_70:				; RESET ALARM
   335                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   336                              <1> 	;mov	ah, al
   337 00005863 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257	; ADDRESS ALARM REGISTER (TO BOTH AH,AL)
   338 00005867 E8C4000000          <1> 	call	CMOS_READ		; READ ALARM REGISTER
   339 0000586C 2457                <1> 	and	al, 57h			; TURN OFF ALARM ENABLE
   340 0000586E 86E0                <1> 	xchg	ah, al			; SAVE DATA AND RECOVER ADDRESS
   341 00005870 E8D4000000          <1> 	call	CMOS_WRITE		; RESTORE NEW VALUE
   342 00005875 F8                  <1> 	clc				; SET CY= 0
   343 00005876 C3                  <1> 	retn				; RETURN WITH NO CARRY
   344                              <1> 
   345                              <1> RTC_STA:			; INITIALIZE REAL TIME CLOCK
   346                              <1> 	;mov	al, CMOS_REG_A		; ADDRESS REGISTER A AND LOAD DATA MASK		
   347                              <1> 	;mov	ah, 26h
   348 00005877 66B80A26            <1> 	mov	ax, (26h*100h)+CMOS_REG_A
   349 0000587B E8C9000000          <1> 	call	CMOS_WRITE		; INITIALIZE STATUS REGISTER A
   350                              <1> 	;mov	al, CMOS_REG_B		; SET "SET BIT" FOR CLOCK INITIALIZATION	
   351                              <1> 	;mov	ah, 82h
   352 00005880 66B80B82            <1> 	mov	ax, (82h*100h)+CMOS_REG_B
   353 00005884 E8C0000000          <1> 	call	CMOS_WRITE		; AND 24 HOUR MODE TO REGISTER B
   354 00005889 B00C                <1> 	mov	al, CMOS_REG_C		; ADDRESS REGISTER C
   355 0000588B E8A0000000          <1> 	call	CMOS_READ		; READ REGISTER C TO INITIALIZE
   356 00005890 B00D                <1> 	mov	al, CMOS_REG_D		; ADDRESS REGISTER D
   357 00005892 E899000000          <1> 	call	CMOS_READ		; READ REGISTER D TO INITIALIZE
   358 00005897 C3                  <1> 	retn
   359                              <1> 
   360                              <1> ; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
   361                              <1> 
   362                              <1> ;--- HARDWARE INT  70 H -- ( IRQ LEVEL  8) --------------------------------------
   363                              <1> ; ALARM INTERRUPT HANDLER (RTC)							:
   364                              <1> ;       THIS ROUTINE HANDLES THE PERIODIC AND ALARM INTERRUPTS FROM THE CMOS	:
   365                              <1> ;       TIMER. INPUT FREQUENCY IS 1.024 KHZ OR APPROXIMATELY 1024 INTERRUPTS	:
   366                              <1> ;       EVERY SECOND FOR THE PERIODIC INTERRUPT. FOR THE ALARM FUNCTION,	:
   367                              <1> ;       THE INTERRUPT WILL OCCUR AT THE DESIGNATED TIME.			:
   368                              <1> ;										:
   369                              <1> ;       INTERRUPTS ARE ENABLED WHEN THE EVENT OR ALARM FUNCTION IS ACTIVATED.	:
   370                              <1> ;       FOR THE EVENT INTERRUPT, THE HANDLER WILL DECREMENT THE WAIT COUNTER	:
   371                              <1> ;       AND WHEN IT EXPIRES WILL SET THE DESIGNATED LOCATION TO 80H. FOR	:
   372                              <1> ;       THE ALARM INTERRUPT. THE USER MUST PROVIDE A ROUTINE TO INTERCEPT	:
   373                              <1> ;       THE CORRECT ADDRESS FROM THE VECTOR TABLE INVOKED BY INTERRUPT 4AH	:
   374                              <1> ;       PRIOR TO SETTING THE REAL TIME CLOCK ALARM (INT 1AH, AH= 06H).		:
   375                              <1> ;--------------------------------------------------------------------------------
   376                              <1> 
   377                              <1> RTC_A_INT: ; 07/01/2017
   378                              <1> ;RTC_INT:				; ALARM INTERRUPT
   379 00005898 1E                  <1> 	push	ds			; LEAVE INTERRUPTS DISABLED
   380 00005899 50                  <1> 	push	eax			; SAVE REGISTERS
   381 0000589A 57                  <1> 	push	edi
   382                              <1> RTC_I_1:				; CHECK FOR SECOND INTERRUPT
   383 0000589B 66B88C8B            <1> 	mov	ax, 256*(CMOS_REG_B+NMI)+CMOS_REG_C+NMI ; ALARM AND STATUS
   384 0000589F E670                <1> 	out	CMOS_PORT, al		; WRITE ALARM FLAG MASK ADDRESS
   385 000058A1 90                  <1> 	nop				; I/O DELAY
   386 000058A2 EB00                <1> 	jmp	short $+2
   387 000058A4 E471                <1> 	in	al, CMOS_DATA		; READ AND RESET INTERRUPT REQUEST FLAGS
   388 000058A6 A860                <1> 	test	al, 01100000b		; CHECK FOR EITHER INTERRUPT PENDING
   389 000058A8 745D                <1> 	jz	short	RTC_I_9		; EXIT IF NOT A VALID RTC INTERRUPT
   390                              <1> 
   391 000058AA 86E0                <1> 	xchg	ah, al			; SAVE FLAGS AND GET ENABLE ADDRESS
   392 000058AC E670                <1> 	out	CMOS_PORT, al		; WRITE ALARM ENABLE MASK ADDRESS
   393 000058AE 90                  <1> 	nop				; I/O DELAY
   394 000058AF EB00                <1> 	jmp	short $+2	
   395 000058B1 E471                <1> 	in	al, CMOS_DATA		; READ CURRENT ALARM ENABLE MASK
   396 000058B3 20E0                <1> 	and	al, ah			; ALLOW ONLY SOURCES THAT ARE ENABLED
   397 000058B5 A840                <1> 	test	al, 01000000b		; CHECK FOR PERIODIC INTERRUPT
   398 000058B7 743B                <1> 	jz	short RTC_I_5		; SKIP IF NOT A PERIODIC INTERRUPT
   399                              <1> 
   400                              <1> ;-----	DECREMENT WAIT COUNT BY INTERRUPT INTERVAL
   401                              <1> 
   402 000058B9 66BF1000            <1> 	mov	di, KDATA		; kernel data segment
   403 000058BD 8EDF                <1> 	mov	ds, di
   404                              <1> 	
   405 000058BF 812D[58310100]D003- <1> 	sub	dword [RTC_LH], 976	; DECREMENT COUNT BY 1/1024
   405 000058C7 0000                <1>
   406 000058C9 7329                <1> 	jnc	short RTC_I_5		; SKIP TILL 32 BIT WORD LESS THAN ZERO
   407                              <1> 
   408                              <1> ;-----	TURN OFF PERIODIC INTERRUPT ENABLE
   409                              <1> 
   410 000058CB 6650                <1> 	push	ax			; SAVE INTERRUPT FLAG MASK
   411 000058CD 66B88B8B            <1> 	mov	ax, 257*(CMOS_REG_B+NMI) ; INTERRUPT ENABLE REGISTER
   412 000058D1 E670                <1> 	out	CMOS_PORT, al		; WRITE ADDRESS TO CMOS CLOCK
   413 000058D3 90                  <1> 	nop				; I/O DELAY
   414 000058D4 EB00                <1> 	jmp	short $+2
   415 000058D6 E471                <1> 	in	al, CMOS_DATA		; READ CURRENT ENABLES
   416 000058D8 24BF                <1> 	and	al, 0BFh		; TURN OFF PIE
   417 000058DA 86C4                <1> 	xchg	al, ah			; GET CMOS ADDRESS AND SAVE VALUE
   418 000058DC E670                <1> 	out	CMOS_PORT, al		; ADDRESS REGISTER B
   419 000058DE 86C4                <1> 	xchg	al, ah			; GET NEW INTERRUPT ENABLE MASK
   420 000058E0 E671                <1> 	out	CMOS_DATA, al		; SET MASK IN INTERRUPT ENABLE REGISTER
   421 000058E2 C605[5C310100]00    <1> 	mov	byte [RTC_WAIT_FLAG], 0	; SET FUNCTION ACTIVE FLAG OFF
   422 000058E9 8B3D[5D310100]      <1> 	mov	edi, [USER_FLAG]	; SET UP (DS:DI) TO POINT TO USER FLAG
   423 000058EF C60780              <1> 	mov	byte [edi], 80h		; TURN ON USERS FLAG
   424 000058F2 6658                <1> 	pop	ax			; GET INTERRUPT SOURCE BACK
   425                              <1> RTC_I_5:
   426 000058F4 A820                <1> 	test	al, 00100000b		; TEST FOR ALARM INTERRUPT
   427 000058F6 740D                <1> 	jz	short RTC_I_7		; SKIP USER INTERRUPT CALL IF NOT ALARM
   428                              <1> 
   429 000058F8 B00D                <1> 	mov	al, CMOS_REG_D		; POINT TO DEFAULT READ ONLY REGISTER
   430 000058FA E670                <1> 	out	CMOS_PORT, al		; ENABLE NMI AND CMOS ADDRESS TO DEFAULT
   431 000058FC FB                  <1> 	sti				; INTERRUPTS BACK ON NOW
   432 000058FD 52                  <1> 	push	edx
   433 000058FE E84D8F0000          <1> 	call	INT4Ah			; TRANSFER TO USER ROUTINE
   434 00005903 5A                  <1> 	pop	edx
   435 00005904 FA                  <1> 	cli				; BLOCK INTERRUPT FOR RETRY
   436                              <1> RTC_I_7:				; RESTART ROUTINE TO HANDLE DELAYED
   437 00005905 EB94                <1> 	jmp	short RTC_I_1		;  ENTRY AND SECOND EVENT BEFORE DONE
   438                              <1> 
   439                              <1> RTC_I_9:				; EXIT - NO PENDING INTERRUPTS
   440 00005907 B00D                <1> 	mov	al, CMOS_REG_D		; POINT TO DEFAULT READ ONLY REGISTER
   441 00005909 E670                <1> 	out	CMOS_PORT, al		; ENABLE NMI AND CMOS ADDRESS TO DEFAULT
   442 0000590B B020                <1> 	mov	al, EOI			; END OF INTERRUPT MASK TO 8259 - 2
   443 0000590D E6A0                <1> 	out	INTB00, al		; TO 8259 - 2
   444 0000590F E620                <1> 	out	INTA00,	al		; TO 8259 - 1
   445 00005911 5F                  <1> 	pop	edi			; RESTORE REGISTERS
   446 00005912 58                  <1> 	pop	eax
   447 00005913 1F                  <1> 	pop	ds
   448 00005914 CF                  <1> 	iretd				; END OF INTERRUPT
   449                              <1> 
   450                              <1> 	
   451                              <1> 	; 29/05/2016 - TRDOS 386 (TRDOS v2.0)
   452                              <1> 	; 22/08/2014 (Retro UNIX 386 v1)
   453                              <1> 	; IBM PC/AT BIOS source code ----- 10/06/85 (bios2.asm)
   454                              <1> UPD_IPR:				; WAIT TILL UPDATE NOT IN PROGRESS
   455 00005915 51                  <1> 	push	ecx
   456                              <1> 
   457                              <1> 	; 29/05/2016
   458 00005916 B968110000          <1> 	mov	ecx, ((1984+244)*4)/2	; AWARD BIOS 1999, ATIME.ASM		
   459                              <1> 					; 'WAITCPU_CK_UD_STAT'
   460                              <1> 					; (244Us + 1984Us)
   461                              <1> 					; (assume each read takes
   462                              <1> 					;  2 microseconds).
   463                              <1> 	;mov	ecx, 65535		
   464                              <1> 		;mov cx, 800		; SET TIMEOUT LOOP COUNT (= 800)	
   465                              <1> UPD_10:
   466 0000591B B00A                <1> 	mov	al, CMOS_REG_A		; ADDRESS STATUS REGISTER A
   467 0000591D FA                  <1> 	cli				; NO TIMER INTERRUPTS DURING UPDATES
   468 0000591E E80D000000          <1> 	call	CMOS_READ		; READ UPDATE IN PROCESS FLAG
   469 00005923 A880                <1> 	test	al, 80h			; IF UIP BIT IS ON ( CANNOT READ TIME )
   470 00005925 7406                <1> 	jz	short UPD_90		; EXIT WITH CY= 0 IF CAN READ CLOCK NOW
   471 00005927 FB                  <1> 	sti				; ALLOW INTERRUPTS WHILE WAITING
   472 00005928 E2F1                <1> 	loop	UPD_10			; LOOP TILL READY OR TIMEOUT
   473 0000592A 31C0                <1> 	xor	eax, eax		; CLEAR RESULTS IF ERROR
   474                              <1> 		; xor ax, ax
   475 0000592C F9                  <1> 	stc				; SET CARRY FOR ERROR
   476                              <1> UPD_90:
   477 0000592D 59                  <1> 	pop	ecx			; RESTORE CALLERS REGISTER
   478 0000592E FA                  <1> 	cli				; INTERRUPTS OFF DURING SET
   479 0000592F C3                  <1> 	retn				; RETURN WITH CY FLAG SET
   480                              <1> 
   481                              <1> 
   482                              <1> 	; 29/05/2016 - TRDOS 386 (TRDOS v2.0) 
   483                              <1> 	; 22/08/2014 (Retro UNIX 386 v1)
   484                              <1> 	; IBM PC/AT BIOS source code ----- 10/06/85 (test4.asm)
   485                              <1> 
   486                              <1> ;--- CMOS_READ -----------------------------------------------------------------
   487                              <1> ;		READ BYTE FROM CMOS_SYSTEM CLOCK CONFIGURATION TABLE	       :
   488                              <1> ;									       :
   489                              <1> ; INPUT: (AL)=	CMOS_TABLE ADDRESS TO BE READ				       :
   490                              <1> ;		BIT    7 = 0 FOR NMI ENABLED AND 1 FOR NMI DISABLED ON EXIT    :
   491                              <1> ;		BITS 6-0 = ADDRESS OF TABLE LOCATION TO READ		       :
   492                              <1> ;									       :
   493                              <1> ; OUTPUT: (AL)	VALUE AT LOCATION (AL) MOVED INTO (AL). IF BIT 7 OF (AL) WAS   :
   494                              <1> ;		ON THEN NMI LEFT DISABLED, DURING THE CMOS READ BOTH NMI AND   :
   495                              <1> ;		NORMAL INTERRUPTS ARE DISABLED TO PROTECT CMOS DATA INTEGRITY. :
   496                              <1> ;		THE CMOS ADDRESS REGISTER IS POINTED TO A DEFAULT VALUE AND    :
   497                              <1> ;		THE INTERRUPT FLAG RESTORED TO THE ENTRY STATE ON RETURN.      :
   498                              <1> ;		ONLY THE (AL) REGISTER AND THE NMI STATE IS CHANGED.	       :
   499                              <1> ;-------------------------------------------------------------------------------
   500                              <1> 
   501                              <1> CMOS_READ:
   502 00005930 9C                  <1> 	pushf				; SAVE INTERRUPT ENABLE STATUS AND FLAGS
   503 00005931 D0C0                <1> 	rol	al, 1			; MOVE NMI BIT TO LOW POSITION
   504 00005933 F9                  <1> 	stc				; FORCE NMI BIT ON IN CARRY FLAG
   505 00005934 D0D8                <1> 	rcr	al, 1			; HIGH BIT ON TO DISABLE NMI - OLD IN CY
   506 00005936 FA                  <1> 	cli				; DISABLE INTERRUPTS
   507 00005937 E670                <1> 	out	CMOS_PORT, al		; ADDRESS LOCATION AND DISABLE NMI
   508                              <1> 	; 29/05/2016
   509                              <1> 	;nop				; I/O DELAY
   510 00005939 E6EB                <1> 	out	0ebh,al	; NEWIODELAY ; AWARD BIOS 1999, ATIME.ASM
   511                              <1> 	;
   512 0000593B E471                <1> 	in	al, CMOS_DATA		; READ THE REQUESTED CMOS LOCATION
   513 0000593D 6650                <1> 	push	ax			; SAVE (AH) REGISTER VALUE AND CMOS BYTE
   514                              <1> 	; 15/03/2015 ; IBM PC/XT Model 286 BIOS source code 
   515                              <1> 		     ; ----- 10/06/85 (test4.asm)
   516 0000593F B01E                <1> 	mov	al, CMOS_SHUT_DOWN*2 	; GET ADDRESS OF DEFAULT LOCATION
   517                              <1> 	;mov	al, CMOS_REG_D*2 	; GET ADDRESS OF DEFAULT LOCATION
   518 00005941 D0D8                <1> 	rcr	al, 1			; PUT ORIGINAL NMI MASK BIT INTO ADDRESS
   519 00005943 E670                <1> 	out	CMOS_PORT, al		; SET DEFAULT TO READ ONLY REGISTER
   520 00005945 6658                <1> 	pop	ax			; RESTORE (AH) AND (AL), CMOS BYTE
   521 00005947 9D                  <1> 	popf	
   522 00005948 C3                  <1> 	retn				; RETURN WITH FLAGS RESTORED
   523                              <1> 
   524                              <1> ; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
   525                              <1> 
   526                              <1> ;--- CMOS_WRITE ----------------------------------------------------------------
   527                              <1> ;	WRITE BYTE TO CMOS SYSTEM CLOCK CONFIGURATION TABLE		       :
   528                              <1> ;									       :
   529                              <1> ; INPUT: (AL)=	CMOS TABLE ADDRESS TO BE WRITTEN TO			       :
   530                              <1> ;		BIT    7 = 0 FOR NMI ENABLED AND 1 FOR NMI DISABLED ON EXIT    :
   531                              <1> ;		BITS 6-0 = ADDRESS OF TABLE LOCATION TO WRITE		       :
   532                              <1> ;	 (AH)=	NEW VALUE TO BE PLACED IN THE ADDRESSED TABLE LOCATION	       :
   533                              <1> ;									       :
   534                              <1> ; OUTPUT:	VALUE IN (AH) PLACED IN LOCATION (AL) WITH NMI LEFT DISABLED   :
   535                              <1> ;		IF BIT 7 OF (AL) IS ON, DURING THE CMOS UPDATE BOTH NMI AND    :
   536                              <1> ;		NORMAL INTERRUPTS ARE DISABLED TO PROTECT CMOS DATA INTEGRITY. :
   537                              <1> ;		THE CMOS ADDRESS REGISTER IS POINTED TO A DEFAULT VALUE AND    :
   538                              <1> ;		THE INTERRUPT FLAG RESTORED TO THE ENTRY STATE ON RETURN.      :
   539                              <1> ;		ONLY THE CMOS LOCATION AND THE NMI STATE IS CHANGED.	       :
   540                              <1> ;-------------------------------------------------------------------------------
   541                              <1> 
   542                              <1> CMOS_WRITE:				; WRITE (AH) TO LOCATION (AL)
   543 00005949 9C                  <1> 	pushf				; SAVE INTERRUPT ENABLE STATUS AND FLAGS
   544 0000594A 6650                <1> 	push	ax			; SAVE WORK REGISTER VALUES
   545 0000594C D0C0                <1> 	rol	al, 1			; MOVE NMI BIT TO LOW POSITION
   546 0000594E F9                  <1> 	stc				; FORCE NMI BIT ON IN CARRY FLAG
   547 0000594F D0D8                <1> 	rcr	al, 1			; HIGH BIT ON TO DISABLE NMI - OLD IN CY
   548 00005951 FA                  <1> 	cli				; DISABLE INTERRUPTS
   549 00005952 E670                <1> 	out	CMOS_PORT, al		; ADDRESS LOCATION AND DISABLE NMI
   550 00005954 88E0                <1> 	mov	al, ah			; GET THE DATA BYTE TO WRITE
   551 00005956 E671                <1> 	out	CMOS_DATA, al		; PLACE IN REQUESTED CMOS LOCATION
   552 00005958 B01E                <1> 	mov	al, CMOS_SHUT_DOWN*2	; GET ADDRESS OF DEFAULT LOCATION
   553                              <1> 	;mov	al, CMOS_REG_D*2 	; GET ADDRESS OF DEFAULT LOCATION
   554 0000595A D0D8                <1> 	rcr	al, 1			; PUT ORIGINAL NMI MASK BIT INTO ADDRESS
   555 0000595C E670                <1> 	out	CMOS_PORT, al		; SET DEFAULT TO READ ONLY REGISTER
   556 0000595E 90                  <1> 	nop				; I/O DELAY
   557 0000595F E471                <1> 	in	al, CMOS_DATA		; OPEN STANDBY LATCH
   558 00005961 6658                <1> 	pop	ax			; RESTORE WORK REGISTERS
   559 00005963 9D                  <1> 	popf
   560 00005964 C3                  <1> 	retn
   561                              <1> 
   562                              <1> ; /// End Of TIMER FUNCTIONS ///
  2131                                  %include 'sysdefs.s' ; 24/01/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - SYSTEM DEFINITIONS : sysdefs.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 25/12/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    11                              <1> ; sysdefs.inc (14/11/2015)
    12                              <1> ; ****************************************************************************
    13                              <1> 
    14                              <1> ; Retro UNIX 386 v1 Kernel - SYSDEFS.INC
    15                              <1> ; Last Modification: 14/11/2015
    16                              <1> ;
    17                              <1> ; ///////// RETRO UNIX 386 V1 SYSTEM DEFINITIONS ///////////////
    18                              <1> ; (Modified from 
    19                              <1> ;	Retro UNIX 8086 v1 system definitions in 'UNIX.ASM', 01/09/2014)
    20                              <1> ; ((UNIX.ASM (RETRO UNIX 8086 V1 Kernel), 11/03/2013 - 01/09/2014))
    21                              <1> ; 	UNIX.ASM (MASM 6.11) --> SYSDEFS.INC (NASM 2.11)
    22                              <1> ; ----------------------------------------------------------------------------
    23                              <1> ;
    24                              <1> ; Derived from UNIX Operating System (v1.0 for PDP-11) 
    25                              <1> ; (Original) Source Code by Ken Thompson (1971-1972)
    26                              <1> ; <Bell Laboratories (17/3/1972)>
    27                              <1> ; <Preliminary Release of UNIX Implementation Document>
    28                              <1> ;
    29                              <1> ; ****************************************************************************
    30                              <1> 
    31                              <1> nproc 	equ	16  ; number of processes
    32                              <1> nfiles 	equ	50
    33                              <1> ntty	equ     8   ; 8+1 -> 8 (10/05/2013)
    34                              <1> nbuf	equ	4   ; 6 ;; 21/08/2015 - 'namei' buffer problem when nbuf > 4 	
    35                              <1> 		; NOTE: If fd0 super block buffer addres is beyond of the 1st
    36                              <1> 		; 32K, DMA r/w routine or someting else causes a jump to 
    37                              <1> 		; kernel panic routine (in 'alloc' routine, in u5.s)
    38                              <1> 		; because of invalid buffer content (r/w error). 
    39                              <1> 		; When all buffers are set before the end of the 1st 32k,
    40                              <1> 		; there is no problem!? (14/11/2015) 
    41                              <1> 
    42                              <1> ;csgmnt	equ	2000h	; 26/05/2013 (segment of process 1)
    43                              <1> ;core	equ 	0  	    ; 19/04/2013	
    44                              <1> ;ecore	equ	32768 - 64  ; 04/06/2013 (24/05/2013)
    45                              <1> 	; (if total size of argument list and arguments is 128 bytes)
    46                              <1> 	; maximum executable file size = 32768-(64+40+128-6) = 32530 bytes
    47                              <1> 	; maximum stack size = 40 bytes (+6 bytes for 'IRET' at 32570)	
    48                              <1> 	; initial value of user's stack pointer = 32768-64-128-2 = 32574
    49                              <1> 	; 	(sp=32768-args_space-2 at the beginning of execution)
    50                              <1> 	; argument list offset = 32768-64-128 = 32576 (if it is 128 bytes)
    51                              <1> 	; 'u' structure offset (for the '/core' dump file) = 32704
    52                              <1> 	; '/core' dump file size = 32768 bytes
    53                              <1>  
    54                              <1> ; 08/03/2014 
    55                              <1> ;sdsegmnt equ	6C0h  ; 256*16 bytes (swap data segment size for 16 processes)		 	 
    56                              <1> ; 19/04/2013 Retro UNIX 8086 v1 feaure only !
    57                              <1> ;;sdsegmnt equ 	740h  ; swap data segment (for user structures and registers)
    58                              <1> 
    59                              <1> ; 30/08/2013
    60                              <1> time_count equ 4 ; 10 --> 4 01/02/2014
    61                              <1> 
    62                              <1> ; 05/02/2014
    63                              <1> ; process status
    64                              <1> ;SFREE 	equ 0
    65                              <1> ;SRUN	equ 1
    66                              <1> ;SWAIT	equ 2
    67                              <1> ;SZOMB	equ 3
    68                              <1> ;SSLEEP	equ 4 ; Retro UNIX 8086 V1 extension (for sleep and wakeup)
    69                              <1> 
    70                              <1> ; 09/03/2015
    71                              <1> userdata equ 80000h ; user structure data address for current user ; temporary
    72                              <1> swap_queue equ 90000h - 2000h ; swap queue address ; temporary
    73                              <1> swap_alloc_table equ 0D0000h  ;  swap allocation table address ; temporary
    74                              <1> 
    75                              <1> ; 17/09/2015
    76                              <1> ESPACE equ 48 ; [u.usp] (at 'sysent') - [u.sp] value for error return
    77                              <1> 
    78                              <1> ; 15/10/2016
    79                              <1> ; 20/05/2016
    80                              <1> ; 19/05/2016
    81                              <1> ; 18/05/2016
    82                              <1> ; 29/04/2016 
    83                              <1> ; TRDOS 386 (TRDOS v2.0) system calls - temporary List 
    84                              <1> ; 14/07/2013 - 21/09/2015 (Retro UNIX 8086 & 386 system calls) 
    85                              <1> ; UNIX v1 system calls
    86                              <1> ;_rele	equ 0
    87                              <1> _ver 	equ 0 ; Get TRDOS version (v2.0)
    88                              <1> _exit 	equ 1
    89                              <1> _fork 	equ 2
    90                              <1> _read 	equ 3
    91                              <1> _write	equ 4
    92                              <1> _open	equ 5
    93                              <1> _close 	equ 6
    94                              <1> _wait 	equ 7
    95                              <1> _creat 	equ 8
    96                              <1> _link 	equ 9
    97                              <1> _unlink	equ 10
    98                              <1> _exec	equ 11
    99                              <1> _chdir	equ 12
   100                              <1> _time 	equ 13
   101                              <1> _mkdir 	equ 14
   102                              <1> _chmod	equ 15
   103                              <1> _chown	equ 16
   104                              <1> _break	equ 17
   105                              <1> _stat	equ 18
   106                              <1> _seek	equ 19
   107                              <1> _tell 	equ 20
   108                              <1> _mount	equ 21
   109                              <1> _umount	equ 22
   110                              <1> _setuid	equ 23
   111                              <1> _getuid	equ 24
   112                              <1> _stime	equ 25
   113                              <1> _quit	equ 26	
   114                              <1> _intr	equ 27
   115                              <1> _fstat	equ 28
   116                              <1> _emt 	equ 29
   117                              <1> _mdate 	equ 30
   118                              <1> ;_stty 	equ 31
   119                              <1> _video  equ 31 ; TRDOS 386 Video Functions (16/05/2016)
   120                              <1> ;_gtty	equ 32
   121                              <1> _audio	equ 32 ; TRDOS 386 Video Functions (16/05/2016)
   122                              <1> ;_ilgins equ 33
   123                              <1> _timer	equ 33 ; TRDOS 386 Timer Functions (18/05/2016)
   124                              <1> _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
   125                              <1> _msg	equ 35 ; Retro UNIX 386 v1 feature only !
   126                              <1> _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
   127                              <1> _reserved1 equ 37 ;; TRDOS 386 (19/05/2016)
   128                              <1> _pri 	equ 38 ; change priority - TRDOS 386 (20/05/2016)
   129                              <1> _rele	equ 39 ; TRDOS 386 (19/05/2016)
   130                              <1> _fff	equ 40 ; Find First File - TRDOS 386 (15/10/2016)
   131                              <1> _fnf	equ 41 ; Find Next File - TRDOS 386 (15/10/2016)	
   132                              <1> 
   133                              <1> %macro sys 1-4
   134                              <1>     ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
   135                              <1>     ; 03/09/2015	
   136                              <1>     ; 13/04/2015
   137                              <1>     ; Retro UNIX 386 v1 system call.		
   138                              <1>     %if %0 >= 2   
   139                              <1>         mov ebx, %2
   140                              <1>         %if %0 >= 3    
   141                              <1>             mov ecx, %3
   142                              <1>             %if %0 = 4
   143                              <1>                mov edx, %4   
   144                              <1>             %endif
   145                              <1>         %endif
   146                              <1>     %endif
   147                              <1>     mov eax, %1
   148                              <1>     ;int 30h
   149                              <1>     int 40h ; TRDOS 386 (TRDOS v2.0)		   
   150                              <1> %endmacro
   151                              <1> 
   152                              <1> 
   153                              <1> ; TRDOS 386 system calls, interrupt number
   154                              <1> ; 25/12/2016
   155                              <1> SYSCALL_INT_NUM   equ '40' ; '40h'
   156                              <1> 
   157                              <1> ; 13/05/2015 - ERROR CODES
   158                              <1> ERR_FILE_NOT_OPEN  equ 10 ; 'file not open !' error
   159                              <1> ERR_FILE_ACCESS    equ 11 ; 'permission denied !' error
   160                              <1> ; 14/05/2015
   161                              <1> ERR_DIR_ACCESS     equ 11 ; 'permission denied !' error
   162                              <1> ERR_FILE_NOT_FOUND equ 12 ; 'file not found !' error
   163                              <1> ERR_TOO_MANY_FILES equ 13 ; 'too many open files !' error
   164                              <1> ERR_DIR_EXISTS     equ 14 ; 'directory already exists !' error 	
   165                              <1> ; 16/05/2015		
   166                              <1> ERR_DRV_NOT_RDY    equ 15 ; 'drive not ready !' error
   167                              <1> ; 18/05/2015
   168                              <1> ERR_DEV_NOT_RDY    equ 15 ; 'device not ready !' error
   169                              <1> ERR_DEV_ACCESS     equ 11 ; 'permission denied !' error 
   170                              <1> ERR_DEV_NOT_OPEN   equ 10 ; 'device not open !' error	
   171                              <1> ; 07/06/2015
   172                              <1> ERR_FILE_EOF	   equ 16 ; 'end of file !' error
   173                              <1> ERR_DEV_VOL_SIZE   equ 16 ; 'out of volume !' error
   174                              <1> ; 09/06/2015
   175                              <1> ERR_DRV_READ	   equ 17 ; 'disk read error !'
   176                              <1> ERR_DRV_WRITE	   equ 18 ; 'disk write error !'
   177                              <1> ; 16/06/2015
   178                              <1> ERR_NOT_DIR	   equ 19 ; 'not a (valid) directory !' error
   179                              <1> ERR_FILE_SIZE	   equ 20 ; 'file size error !'	
   180                              <1> ; 22/06/2015
   181                              <1> ERR_NOT_SUPERUSER  equ 11 ; 'permission denied !' error
   182                              <1> ERR_NOT_OWNER      equ 11 ; 'permission denied !' error
   183                              <1> ERR_NOT_FILE       equ 11 ; 'permission denied !' error	
   184                              <1> ; 23/06/2015
   185                              <1> ERR_FILE_EXISTS    equ 14 ; 'file already exists !' error
   186                              <1> ERR_DRV_NOT_SAME   equ 21 ; 'not same drive !' error
   187                              <1> ERR_DIR_NOT_FOUND  equ 12 ; 'directory not found !' error
   188                              <1> ERR_NOT_EXECUTABLE equ 22 ; 'not executable file !' error
   189                              <1> ; 27/06/2015
   190                              <1> ERR_INV_PARAMETER  equ 23 ; 'invalid parameter !' error
   191                              <1> ERR_INV_DEV_NAME   equ 24 ; 'invalid device name !' error
   192                              <1> ; 29/06/2015
   193                              <1> ERR_TIME_OUT	   equ 25 ; 'time out !' error			
   194                              <1> ERR_DEV_NOT_RESP   equ 25 ; 'device not responding !' error
   195                              <1> ; 10/10/2016
   196                              <1> ERR_INV_FILE_NAME  equ 26 ; 'invalid file name !' error
   197                              <1> ERR_INV_FLAGS	   equ 23 ; 'invalid flags !' error
   198                              <1> ; For code compatibility with previous version of TRDOS (2011)
   199                              <1> ; (Temporary error codes for current TRDOS 386 -2016- version) 
   200                              <1> ERR_NO_MORE_FILES  equ 12 ; 'no more files !' error
   201                              <1> ERR_PATH_NOT_FOUND equ  3 ; 'path not found !' error 
   202                              <1> 			  ; 'dir not found !' ; TRDOS 8086
   203                              <1> ERR_NOT_FOUND:	   equ  2 ; 'file not found !' ; TRDOS 8086
   204                              <1> ERR_DISK_SPACE	   equ 39 ; 'out of volume !' TRDOS 8086
   205                              <1> 			  ; 'insfufficient disk space !' ; 27h
   206                              <1> ERR_DISK_WRITE	   equ 30 ; 'disk write protected !' ; 16/10/2016
   207                              <1> ERR_ACCESS_DENIED  equ  5 ; 'access denied !' ; TRDOS 8086 	 	
   208                              <1> ; 18/05/2016
   209                              <1> ERR_MISC	   equ 27 ; miscellaneous/other errors
   210                              <1> ; 15/10/2016
   211                              <1> ; TRDOS 8086 -> TRDOS 386 (0Bh -> 28)
   212                              <1> ERR_INV_FORMAT	   equ 28 ; 'invalid format !' error
   213                              <1> ; TRDOS 8086 -> TRDOS 386 (0Dh -> 29)
   214                              <1> ERR_INV_DATA	   equ 29 ; 'invalid data !' error
   215                              <1> ; TRDOS 8086 -> TRDOS 386 (0Eh -> 20)
   216                              <1> ERR_ZERO_LENGTH	   equ 20  ; 'zero length !' error 	
   217                              <1> ; TRDOS 8086 -> TRDOS 386 (15h -> 17, 1Dh -> 18, 1Eh -> 17) 	
   218                              <1> ERR_DRV_NR_READ	   equ 17 ; 'drive not ready or read error !'
   219                              <1> ERR_DRV_NR_WRITE   equ 18 ; 'drive not ready or write error !'		
   220                              <1> ; 15/10/2016
   221                              <1> ERR_INV_PATH_NAME  equ 19 ; 'bad path name !' error
   222                              <1> ERR_BAD_CMD_ARG	   equ  1 ; 'bad command argument !' ; TRDOS 8086
   223                              <1> ERR_INV_FNUMBER	   equ  1 ; 'invalid function number !' ; TRDOS 8086
   224                              <1> ERR_BIG_FILE	   equ  8 ; 'big file & out of memory ! ; TRDOS 8086 	
   225                              <1> ERR_BIG_DATA	   equ  8 ; 'big data & out of memory ! ; TRDOS 8086
   226                              <1> ERR_CLUSTER	   equ 35 ; 'cluster not available !' ; TRDOS 8086
   227                              <1> ERR_OUT_OF_MEMORY  equ  4 ; 'out of memory !'
   228                              <1> 			  ; 'insufficient memory !'
   229                              <1> ERR_P_VIOLATION	   equ	6 ; 'protection violation !'
   230                              <1> ERR_PAGE_FAULT	   equ 224 ;'page fault !' ;0E0h						 
   231                              <1> ERR_SWP_DISK_READ  	   equ 40
   232                              <1> ERR_SWP_DISK_NOT_PRESENT   equ 41
   233                              <1> ERR_SWP_SECTOR_NOT_PRESENT equ 42
   234                              <1> ERR_SWP_NO_FREE_SPACE      equ 43
   235                              <1> ERR_SWP_DISK_WRITE         equ 44
   236                              <1> ERR_SWP_NO_PAGE_TO_SWAP    equ 45
   237                              <1> 
   238                              <1> ; 26/08/2015
   239                              <1> ; 24/07/2015
   240                              <1> ; 24/06/2015
   241                              <1> MAX_ARG_LEN	   equ 256 ; max. length of sys exec arguments
   242                              <1> ; 01/07/2015
   243                              <1> MAX_MSG_LEN	   equ 255 ; max. msg length for 'sysmsg'
   244                              <1> ;	
   245                              <1> ; 06/10/2016
   246                              <1> OPENFILES	   equ 10  ; max. number of open files (system)
   247                              <1> ; 07/10/2016
   248                              <1> ;NUMOFDEVICES	   equ 20  ; max. num of available devices (sys)
   249                              <1> 			 		
  2132                                  %include 'trdosk0.s' ; 04/01/2016 
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - DEFINITIONS : trdosk0.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 29/02/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 04/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    11                              <1> ; TRDOS2.ASM (09/11/2011)
    12                              <1> ; ****************************************************************************
    13                              <1> ; TRDOS2.ASM (c) 2004-2011 Erdogan TAN [ 17/01/2004 ] Last Update: 09/11/2011
    14                              <1> ;
    15                              <1> ; Masterboot / Partition Table at Beginning+1BEh
    16                              <1> ptBootable       equ 0
    17                              <1> ptBeginHead      equ 1
    18                              <1> ptBeginSector    equ 2
    19                              <1> ptBeginCylinder  equ 3
    20                              <1> ptFileSystemID   equ 4
    21                              <1> ptEndHead        equ 5
    22                              <1> ptEndSector      equ 6
    23                              <1> ptEndCylinder    equ 7
    24                              <1> ptStartSector    equ 8
    25                              <1> ptSectors        equ 12
    26                              <1> 
    27                              <1> ; Boot Sector Parameters at 7C00h
    28                              <1> DataArea1     equ -4
    29                              <1> DataArea2     equ -2
    30                              <1> BootStart     equ 0h
    31                              <1> OemName       equ 03h
    32                              <1> BytesPerSec   equ 0Bh
    33                              <1> SecPerClust   equ 0Dh
    34                              <1> ResSectors    equ 0Eh
    35                              <1> FATs          equ 10h
    36                              <1> RootDirEnts   equ 11h
    37                              <1> Sectors       equ 13h
    38                              <1> Media         equ 15h
    39                              <1> FATSecs       equ 16h
    40                              <1> SecPerTrack   equ 18h
    41                              <1> Heads         equ 1Ah 
    42                              <1> Hidden1       equ 1Ch
    43                              <1> Hidden2       equ 1Eh
    44                              <1> HugeSec1      equ 20h
    45                              <1> HugeSec2      equ 22h
    46                              <1> DriveNumber   equ 24h
    47                              <1> Reserved1     equ 25h
    48                              <1> bootsignature equ 26h                 
    49                              <1> VolumeID      equ 27h
    50                              <1> VolumeLabel   equ 2Bh
    51                              <1> FileSysType   equ 36h          
    52                              <1> Reserved2     equ 3Eh                           ; Starting cluster of P2000
    53                              <1> 
    54                              <1> ; FAT32 BPB Structure
    55                              <1> FAT32_FAT_Size equ 36
    56                              <1> FAT32_RootFClust equ 44
    57                              <1> FAT32_FSInfoSec equ 48
    58                              <1> FAT32_DrvNum equ 64
    59                              <1> FAT32_BootSig equ 66
    60                              <1> FAT32_VolID equ 67
    61                              <1> FAT32_VolLab equ 71
    62                              <1> FAT32_FilSysType equ 82
    63                              <1> 
    64                              <1> ; BIOS Disk Parameters
    65                              <1> DPDiskNumber  equ 0h
    66                              <1> DPDType       equ 1h
    67                              <1> DPReturn      equ 2h
    68                              <1> DPHeads       equ 3h
    69                              <1> DPCylinders   equ 4h
    70                              <1> DPSecPerTrack equ 6h
    71                              <1> DPDisks       equ 7h
    72                              <1> DPTableOff    equ 8h
    73                              <1> DPTableSeg    equ 0Ah
    74                              <1> DPNumOfSecs   equ 0Ch
    75                              <1> 
    76                              <1> ; BIOS INT 13h Extensions (LBA extensions)
    77                              <1> ; Just After DP Data (DPDiskNumber+)
    78                              <1> DAP_PacketSize equ 10h  ; If extensions present, this byte will be >=10h
    79                              <1> DAP_Reserved1 equ 11h   ; Reserved Byte 
    80                              <1> DAP_NumOfBlocks equ 12h ; Value of this byte must be 0 to 127
    81                              <1> DAP_Reserved2 equ 13h   ; Reserved Byte
    82                              <1> DAP_Destination equ 14h ; Address of Transfer Buffer as SEGMENT:OFFSET
    83                              <1> DAP_LBA_Address equ 18h ; LBA=(C1*H0+H1)*S0+S1-1
    84                              <1>                         ; C1= Selected Cylinder Number
    85                              <1>                         ; H0= Number Of Heads (Maximum Head Number + 1)
    86                              <1>                         ; H1= Selected Head Number
    87                              <1>                         ; S0= Maximum Sector Number
    88                              <1>                         ; S1= Selected Sector Number
    89                              <1>                         ; QUAD WORD
    90                              <1> ; DAP_Flat_Destination equ 20h ; 64 bit address, if value in 4h is FFFF:FFFFh
    91                              <1>                              ; QUAD WORD (Also, value in 0h must be 18h) 
    92                              <1>                              ; TR-DOS will not use 64 bit Flat Address
    93                              <1> 
    94                              <1> ; INT 13h Function 48h "Get Enhanced Disk Drive Parameters"
    95                              <1> ; Just After DP Data (DPDiskNumber+)
    96                              <1> GetDParams_48h equ 20h ; Word. Data Length, must be 26 (1Ah) for short data.
    97                              <1> GDP_48h_InfoFlag equ 22h ; Word
    98                              <1> ; Bit 1 = 1 -> The geometry returned in bytes 4-15 is valid.
    99                              <1> GDP_48h_NumOfPCyls equ 24h ; Double Word. Number physical cylinders.
   100                              <1> GDP_48h_NumOfPHeads equ 28h ; Double Word. Number of physical heads.
   101                              <1> GDP_48h_NumOfPSpT equ 2Ch ; Double word. Num of physical sectors per track.
   102                              <1> GDP_48h_LBA_Sectors equ 30h ; 8 bytes. Number of physical/LBA sectors.
   103                              <1> GDP_48h_BytesPerSec equ 38h ; Word. Number of bytes in a sector.
   104                              <1> 
   105                              <1> ; TR-DOS Standalone Program Extensions to the DiskParams Block
   106                              <1> ; Just After DP Data (DPDiskNumber+)
   107                              <1> TRDP_CurrentSector equ 3Ah  ; DX:AX (LBA)
   108                              <1> TRDP_SectorCount equ 3Eh    ; CX (or Counter)
   109                              <1> 
   110                              <1> 
   111                              <1> ; DOS Logical Disks
   112                              <1> LD_Name equ 0
   113                              <1> LD_DiskType equ 1
   114                              <1> LD_PhyDrvNo equ 2
   115                              <1> LD_FATType equ 3
   116                              <1> LD_FSType equ 4
   117                              <1> LD_LBAYes equ 5
   118                              <1> LD_BPB equ 6
   119                              <1> LD_FATBegin equ 96
   120                              <1> LD_ROOTBegin equ 100
   121                              <1> LD_DATABegin equ 104
   122                              <1> LD_StartSector equ 108
   123                              <1> LD_TotalSectors equ 112
   124                              <1> LD_FreeSectors equ 116
   125                              <1> LD_Clusters equ 120
   126                              <1> LD_PartitionEntry equ 124
   127                              <1> LD_DParamEntry equ 125
   128                              <1> LD_MediaChanged equ 126
   129                              <1> LD_CDirLevel equ 127
   130                              <1> LD_CurrentDirectory equ 128
   131                              <1> 
   132                              <1> ; Singlix FS Extensions to DOS Logical Disks
   133                              <1> ; 03/01/2010 (LD_BPB compatibility for CHS r/w)
   134                              <1> 
   135                              <1> LD_FS_Name equ 0
   136                              <1> LD_FS_DiskType equ 1
   137                              <1> LD_FS_PhyDrvNo equ 2
   138                              <1> LD_FS_FATType equ 3
   139                              <1> LD_FS_FSType equ 4
   140                              <1> LD_FS_LBAYes equ 5
   141                              <1> LD_FS_BPB equ 6
   142                              <1> LD_FS_MediaAttrib equ 6
   143                              <1> LD_FS_VersionMajor equ 7
   144                              <1> LD_FS_RootDirD equ 8
   145                              <1> LD_FS_MATLocation equ 12
   146                              <1> LD_FS_Reserved1 equ 16 ;1 reserved byte
   147                              <1> LD_FS_BytesPerSec equ 17 ; LD_BPB + 0Bh
   148                              <1> LD_FS_Reserved2 equ 19 ;2 reserved byte
   149                              <1> LD_FS_DATLocation equ 20
   150                              <1> LD_FS_DATSectors equ 24
   151                              <1> LD_FS_Reserved3 equ 28 ;3 reserved word
   152                              <1> LD_FS_SecPerTrack equ 30 ; LD_BPB + 18h
   153                              <1> LD_FS_NumHeads equ 32    ; LD_BPB + 1Ah
   154                              <1> LD_FS_UnDelDirD equ 34
   155                              <1> LD_FS_Reserved4 equ 38 ;4 reserved word
   156                              <1> LD_FS_VolumeSerial equ 40
   157                              <1> LD_FS_VolumeName equ 44
   158                              <1> LD_FS_BeginSector equ 108
   159                              <1> LD_FS_VolumeSize equ 112
   160                              <1> LD_FS_FreeSectors equ 116
   161                              <1> LD_FS_FirstFreeSector equ 120
   162                              <1> LD_FS_PartitionEntry equ 124
   163                              <1> LD_FS_DParamEntry equ 125
   164                              <1> LD_FS_MediaChanged equ 126
   165                              <1> LD_FS_CDirLevel equ 127
   166                              <1> LD_FS_CDIR_Converted equ 128
   167                              <1> 
   168                              <1> ; Valid FAT Types
   169                              <1> FS_FAT12 equ 1
   170                              <1> FS_FAT16_CHS equ 2
   171                              <1> FS_FAT32_CHS equ 3
   172                              <1> FS_FAT16_LBA equ 4
   173                              <1> FS_FAT32_LBA equ 5
   174                              <1> 
   175                              <1> ; Cursor Location
   176                              <1> CCCpointer equ  0450h   ; BIOS data, current cursor column
   177                              <1> ; FAT Clusters EOC sign
   178                              <1> FAT12EOC equ 0FFFh
   179                              <1> FAT16EOC equ 0FFFFh
   180                              <1> ;FAT32EOC equ 0FFFFFFFh ; It is not direct usable for 8086 code
   181                              <1> ; BAD Cluster
   182                              <1> FAT12BADC equ 0FF7h
   183                              <1> FAT16BADC equ 0FFF7h
   184                              <1> ;FAT32BADC equ 0FFFFFF7h ; It is not direct usable for 8086 code
   185                              <1> ; MS-DOS FAT16 FS (Maximum Possible) Last Cluster Number= 0FFF6h 
   186                              <1> 
   187                              <1> ; TRFS
   188                              <1> 
   189                              <1> bs_FS_JmpBoot equ 0 ; jmp short bsBootCode
   190                              <1>                 ; db 0EBh, db 3Fh, db 90h
   191                              <1> bs_FS_Identifier equ 3  ; db 'FS', db 0
   192                              <1> bs_FS_BytesPerSec equ 6 ; dw 512
   193                              <1> bs_FS_MediaAttrib equ 8 ; db 3
   194                              <1> bs_FS_PartitionID equ 9 ; db 0A1h
   195                              <1> bs_FS_VersionMaj equ 10 ; db 01h
   196                              <1> bs_FS_VersionMin equ 11 ; db 0
   197                              <1> bs_FS_BeginSector equ 12   ; dd 0 
   198                              <1> bs_FS_VolumeSize equ 16 ; dd 2880
   199                              <1> bs_FS_StartupFD equ 20 ; dd 0
   200                              <1> bs_FS_MATLocation equ 24 ; dd 1
   201                              <1> bs_FS_RootDirD equ 28 ; dd 8
   202                              <1> bs_FS_SystemConfFD equ 32 ; dd 0
   203                              <1> bs_FS_SwapFD equ 36 ; dd 0
   204                              <1> bs_FS_UnDelDirD equ 40 ; dd 0
   205                              <1> bs_FS_DriveNumber equ 44 ; db 0
   206                              <1> bs_FS_LBA_Ready equ 45 ; db 0
   207                              <1> bs_FS_MagicWord equ 46 
   208                              <1> bs_FS_SecPerTrack equ 46 ; db 0A1h
   209                              <1> bs_FS_Heads equ 47 ; db 01h 
   210                              <1> bs_FS_OperationSys equ 48 ; db "TR-SINGLIX v1.0b"
   211                              <1> bs_FS_Terminator equ 64 ; db 0
   212                              <1> bs_FS_BootCode equ 65 
   213                              <1> 
   214                              <1> FS_MAT_DATLocation equ 12
   215                              <1> FS_MAT_DATScount equ 16
   216                              <1> FS_MAT_FreeSectors equ 20
   217                              <1> FS_MAT_FirstFreeSector equ 24
   218                              <1> FS_RDT_VolumeSerialNo equ 28
   219                              <1> FS_RDT_VolumeName equ 64
   220                              <1> 
   221                              <1> ; FAT12 + FAT16 + FAT32
   222                              <1> BS_JmpBoot equ 0
   223                              <1> BS_OEMName equ 3
   224                              <1> BPB_BytsPerSec equ 11
   225                              <1> BPB_SecPerClust equ 13
   226                              <1> BPB_RsvdSecCnt equ 14
   227                              <1> BPB_NumFATs equ 16
   228                              <1> BPB_RootEntCnt equ 17
   229                              <1> BPB_TotalSec16 equ 19
   230                              <1> BPB_Media equ 21
   231                              <1> BPB_FATSz16 equ 22
   232                              <1> BPB_SecPerTrk equ 24
   233                              <1> BPB_NumHeads equ 26
   234                              <1> BPB_HiddSec equ 28
   235                              <1> BPB_TotalSec32 equ 32
   236                              <1> 
   237                              <1> ; FAT12 and FAT16 only
   238                              <1> BS_DrvNum equ 36
   239                              <1> BS_Reserved1 equ 37
   240                              <1> BS_BootSig equ 38
   241                              <1> BS_VolID equ 39
   242                              <1> BS_VolLab equ 43
   243                              <1> BS_FilSysType equ 54 ; 8 bytes
   244                              <1> BS_BootCode equ 62
   245                              <1> 
   246                              <1> ; FAT32 only
   247                              <1> BPB_FATSz32 equ 36 ; FAT32, 4 bytes
   248                              <1> BPB_ExtFlags equ 40 ; FAT32, 2 bytes
   249                              <1> BPB_FSVer equ 42 ; FAT32, 2 bytes
   250                              <1> BPB_RootClus equ 44 ; FAT32, 4 bytes
   251                              <1> BPB_FSInfo equ 48 ; FAT 32, 2 bytes 
   252                              <1> BPB_BkBootSec equ 50 ; FAT32, 2 bytes
   253                              <1> BPB_Reserved equ 52 ; FAT32, 12 bytes
   254                              <1> BS_FAT32_DrvNum equ 64 ; FAT32, 1 byte
   255                              <1> BS_FAT32_Reserved1 equ 65 ; FAT32, 1 byte
   256                              <1> BS_FAT32_BootSig equ 66 ; FAT32, 1 byte
   257                              <1> BS_FAT32_VolID equ 67 ; FAT32, 4 bytes
   258                              <1> BS_FAT32_VolLab equ 71 ; FAT32, 11 bytes
   259                              <1> BS_FAT32_FilSysType equ 82 ; FAT32, 8 bytes
   260                              <1> BS_FAT32_BootCode equ 90
   261                              <1> 
   262                              <1> ; 29/02/2016
   263                              <1> ;(FAT32 Free Cluster Count & First Free Cluster values)
   264                              <1> ;[BPB_Reserved] = Free Cluster Count (offset 52)
   265                              <1> ;[BPB_Reserved+4] = First Free Cluster (offset 56)
   266                              <1> 
   267                              <1> BS_Validation equ 510
   268                              <1> 
   269                              <1> ; 15/02/2016
   270                              <1> ; FILE.ASM - 09/10/2011
   271                              <1> ; Directory Entry Structure
   272                              <1> ; 29/10/2009 (According to Microsoft FAT32 File System Specification)
   273                              <1> DirEntry_Name equ 0
   274                              <1> DirEntry_Attr equ 11
   275                              <1> DirEntry_NTRes equ 12
   276                              <1> DirEntry_CrtTimeTenth equ 13
   277                              <1> DirEntry_CrtTime equ 14
   278                              <1> DirEntry_CrtDate equ 16
   279                              <1> DirEntry_LastAccDate equ 18
   280                              <1> DirEntry_FstClusHI equ 20
   281                              <1> DirEntry_WrtTime equ 22
   282                              <1> DirEntry_WrtDate equ 24
   283                              <1> DirEntry_FstClusLO equ 26
   284                              <1> DirEntry_FileSize equ 28
  2133                                  %include 'trdosk1.s' ; 04/01/2016 
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - SYS INIT : trdosk1.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 07/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 04/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    11                              <1> ; TRDOS2.ASM (09/11/2011)
    12                              <1> ; ****************************************************************************
    13                              <1> ; TRDOS2.ASM (c) 2004-2011 Erdogan TAN [ 17/01/2004 ] Last Update: 09/11/2011
    14                              <1> ;
    15                              <1> 
    16                              <1> sys_init:
    17                              <1> 	; 07/05/2016
    18                              <1> 	; 02/05/2016
    19                              <1> 	; 24/04/2016
    20                              <1> 	; 14/04/2016
    21                              <1> 	; 13/04/2016
    22                              <1> 	; 30/03/2016
    23                              <1> 	; 24/01/2016
    24                              <1> 	; 06/01/2016
    25                              <1> 	; 04/01/2016
    26                              <1> 
    27                              <1> 	; 30/03/2016
    28                              <1> 	; Clear Logical DOS Disk Description Tables Area
    29 00005965 31C0                <1> 	xor	eax, eax
    30 00005967 BF00010900          <1> 	mov	edi, Logical_DOSDisks
    31 0000596C B980060000          <1> 	mov	ecx, 6656/4 ; 26*256 = 6656 bytes
    32 00005971 F3AB                <1> 	rep	stosd ; 1664 times 4 bytes
    33                              <1> 
    34 00005973 B83F3A2F00          <1> 	mov	eax, '?:/'
    35 00005978 A3[A7310100]        <1> 	mov	[Current_Dir_Drv], eax
    36                              <1> 
    37                              <1> 	; Logical DRV INIT (only for hard disks)
    38 0000597D E8B3010000          <1> 	call 	ldrv_init  ; trdosk2.s
    39                              <1> 	
    40                              <1> 	; When floppy_drv_init call is disabled
    41                              <1> 	; media changed sign is needed
    42                              <1> 	; for proper drive initialization
    43                              <1>         
    44 00005982 BE00010900          <1> 	mov 	esi, Logical_DOSDisks
    45 00005987 B001                <1> 	mov 	al, 1 ; Initialization sign (invalid_fd_parameter)
    46 00005989 83C67E              <1> 	add 	esi, LD_MediaChanged ; Media Change Status = 1 (init needed)
    47 0000598C 8806                <1> 	mov 	[esi], al ; A:
    48 0000598E 81C600010000        <1> 	add 	esi, 100h 
    49 00005994 8806                <1> 	mov 	[esi], al ; B: 
    50                              <1>            
    51                              <1> _current_drive_bootdisk:
    52 00005996 8A15[00FC0000]      <1> 	mov 	dl, [boot_drv] ; physical drive number
    53 0000599C 80FAFF              <1> 	cmp 	dl, 0FFh
    54 0000599F 740A                <1> 	je 	short _last_dos_diskno_check
    55                              <1> _boot_drive_check:
    56 000059A1 80FA80              <1> 	cmp 	dl, 80h
    57 000059A4 7218                <1> 	jb 	short _current_drive_a
    58 000059A6 80EA7E              <1> 	sub 	dl, 7Eh ; C = 2 , D = 3
    59 000059A9 EB13                <1> 	jmp 	short _current_drive_a 
    60                              <1> 
    61                              <1> _last_dos_diskno_check:
    62 000059AB 8A15[0CED0000]      <1> 	mov 	dl, [Last_DOS_DiskNo]
    63 000059B1 80FA02              <1> 	cmp 	dl, 2
    64 000059B4 7706                <1> 	ja 	short _current_drive_c
    65 000059B6 7406                <1> 	je 	short _current_drive_a
    66 000059B8 30D2                <1> 	xor 	dl, dl ; A:
    67 000059BA EB02                <1> 	jmp 	short _current_drive_a
    68                              <1> 
    69                              <1> _current_drive_c:
    70 000059BC B202                <1> 	mov 	dl, 2 ; C:
    71                              <1> 
    72                              <1> _current_drive_a:
    73 000059BE 8815[01FC0000]      <1> 	mov	[drv], dl
    74 000059C4 BE[0EED0000]        <1>         mov     esi, msg_CRLF_temp
    75 000059C9 E89E000000          <1> 	call 	print_msg
    76                              <1> 
    77 000059CE 8A15[01FC0000]      <1> 	mov	dl, [drv]
    78 000059D4 E893090000          <1> 	call 	change_current_drive
    79 000059D9 730C                <1> 	jnc 	short _start_mainprog
    80                              <1> 
    81                              <1> _drv_not_ready_error: 
    82 000059DB BE[C9EF0000]        <1> 	mov 	esi, msgl_drv_not_ready
    83 000059E0 E887000000          <1> 	call 	print_msg
    84 000059E5 EB63                <1>         jmp     _end_of_mainprog
    85                              <1> 
    86                              <1> _start_mainprog:
    87                              <1> 	; 07/01/2017
    88                              <1> 	; 07/05/2016
    89                              <1> 	; 02/05/2016
    90                              <1> 	; 24/04/2016
    91                              <1> 	; Retro UNIX 386 v1, 'sys_init' (u0.s)
    92                              <1> 	; 23/06/2015
    93                              <1> 
    94                              <1> 	; 02/05/2016
    95                              <1> 	; 24/04/2016
    96 000059E7 66B80100            <1> 	mov	ax, 1
    97 000059EB A2[6B470100]        <1> 	mov	[u.uno], al
    98 000059F0 66A3[06470100]      <1> 	mov	[mpid], ax
    99 000059F6 66A3[D8430100]      <1> 	mov	[p.pid], ax
   100 000059FC A2[68440100]        <1> 	mov	[p.stat], al
   101 00005A01 C605[60470100]04    <1> 	mov	byte [u.quant], time_count  ; 07/01/2017
   102                              <1> 	;
   103 00005A08 A1[E0300100]        <1> 	mov	eax, [k_page_dir]
   104 00005A0D A3[70470100]        <1> 	mov	[u.pgdir], eax ; reset
   105                              <1> 	;
   106 00005A12 E8E8F0FFFF          <1> 	call	allocate_page
   107 00005A17 0F82A3000000        <1> 	jc	panic
   108 00005A1D A3[6C470100]        <1> 	mov	[u.upage], eax ; user structure page	
   109 00005A22 A3[78440100]        <1> 	mov	[p.upage], eax
   110 00005A27 E84DF1FFFF          <1> 	call	clear_page
   111                              <1> 	;
   112                              <1> 	; 24/08/2015
   113 00005A2C FE0D[13470100]      <1> 	dec 	byte [sysflg] ; FFh = ready for system call
   114                              <1> 			      ; 0 = executing a system call
   115                              <1> 	; 13/04/2016
   116                              <1> 	; Clear Environment Variables Page/Area
   117 00005A32 BF00300900          <1> 	mov	edi, Env_Page ; 93000h
   118 00005A37 B980000000          <1> 	mov	ecx, Env_Page_Size / 4 	; 512/4  (4096/4)				 	  		 	  
   119 00005A3C 31C0                <1> 	xor	eax, eax
   120 00005A3E F3AB                <1> 	rep	stosd
   121                              <1> 
   122                              <1> 	; 14/04/2016
   123 00005A40 E8C3320000          <1>  	call	mainprog_startup_configuration
   124                              <1> 
   125 00005A45 E8630A0000          <1>         call    dos_prompt
   126                              <1>               
   127                              <1> _end_of_mainprog:
   128 00005A4A BE[0EED0000]        <1>         mov     esi, msg_CRLF_temp
   129 00005A4F E818000000          <1> 	call 	print_msg
   130 00005A54 BE[14ED0000]        <1> 	mov 	esi, mainprog_Version
   131 00005A59 E80E000000          <1> 	call 	print_msg
   132                              <1> 	; 24/01/2016
   133 00005A5E 28E4                <1> 	sub	ah, ah
   134 00005A60 E837B1FFFF          <1> 	call	int16h ; call getch
   135 00005A65 E917B6FFFF          <1> 	jmp	cpu_reset
   136                              <1> 
   137 00005A6A EBFE                <1> infinitiveloop: jmp short infinitiveloop
   138                              <1> 
   139                              <1> print_msg:
   140                              <1> 	; 13/05/2016
   141                              <1> 	; 04/01/2016
   142                              <1> 	; 01/07/2015
   143                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   144                              <1> 	; 07/03/2014 (Retro UNIX 8086 v1)
   145                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, ESI, EDI)
   146                              <1> 	;
   147 00005A6C 8A3D[0E310100]      <1> 	mov	bh, [ACTIVE_PAGE] ; 04/01/2016 (ptty)
   148                              <1> 	;mov	bl, 07h ; Black background, light gray forecolor
   149                              <1> 
   150 00005A72 AC                  <1> 	lodsb
   151                              <1> pmsg1:
   152 00005A73 56                  <1> 	push 	esi
   153                              <1> 	;mov	bh, [ACTIVE_PAGE] ; 04/01/2016 (ptty)
   154 00005A74 B307                <1> 	mov	bl, 07h ; Black background, light gray forecolor
   155 00005A76 E8BDC1FFFF          <1> 	call 	_write_tty
   156 00005A7B 5E                  <1> 	pop	esi
   157 00005A7C AC                  <1> 	lodsb
   158 00005A7D 20C0                <1> 	and 	al, al
   159 00005A7F 75F2                <1> 	jnz 	short pmsg1
   160 00005A81 C3                  <1> 	retn
   161                              <1> 
   162                              <1> clear_screen:
   163                              <1> 	; 13/05/2016
   164                              <1> 	; 30/01/2016
   165                              <1> 	; 24/01/2016
   166                              <1> 	; 04/01/2016
   167 00005A82 0FB61D[0E310100]    <1> 	movzx	ebx, byte [ACTIVE_PAGE] ; video page number (0 to 7)
   168 00005A89 8AA3[FFF70000]      <1> 	mov 	ah, [ebx+vmode] ; default = 03h (80x25 text)
   169 00005A8F 80FC04              <1> 	cmp	ah, 4
   170 00005A92 7205                <1> 	jb	short cls1
   171 00005A94 80FC07              <1> 	cmp	ah, 7
   172 00005A97 7526                <1> 	jne	short vga_clear
   173                              <1> cls1:
   174                              <1> 	;mov	bh, bl
   175                              <1> 	;mov	bl, 7
   176 00005A99 3A25[EEF70000]      <1> 	cmp	ah, [CRT_MODE] ; current video mode ? 
   177                              <1> 	;je	short cls2 ; yes (current video mode = 3)
   178                              <1> 	;;call	set_mode_3 ; set video mode to 3 (& clear screen)
   179                              <1> 	;;retn
   180                              <1> 	;jmp	set_mode_3
   181 00005A9F 0F859DC1FFFF        <1> 	jne	set_mode_3
   182                              <1> cls2:
   183 00005AA5 88DF                <1> 	mov	bh, bl ; video page (0 to 7)
   184 00005AA7 B307                <1> 	mov	bl, 07h ; attribute to be used on blanked line
   185 00005AA9 28C0                <1> 	sub 	al, al ; 0 =  entire window
   186 00005AAB 6631C9              <1> 	xor 	cx, cx
   187 00005AAE 66BA4F18            <1> 	mov 	dx, 184Fh
   188 00005AB2 E8D9BEFFFF          <1> 	call	_scroll_up ; 24/01/2016
   189                              <1> 	;
   190                              <1> 	;mov	bh, [ACTIVE_PAGE] ; video page number (0 to 7)
   191 00005AB7 6631D2              <1> 	xor 	dx, dx
   192 00005ABA E80FC2FFFF          <1> 	call	_set_cpos ; 24/01/2016 
   193                              <1> 	;retn
   194                              <1> vga_clear:
   195 00005ABF C3                  <1> 	retn	
   196                              <1> 
   197                              <1> panic:
   198                              <1> 	; 13/05/2016 (TRDOS 386 = TRDOS v2)
   199                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   200                              <1> 	; 07/03/2014 (Retro UNIX 8086 v1)
   201 00005AC0 BE[C6FF0000]        <1> 	mov 	esi, panic_msg
   202 00005AC5 E8A2FFFFFF          <1> 	call 	print_msg
   203                              <1> key_to_reboot:
   204                              <1>         ; 24/01/2016
   205 00005ACA 28E4                <1>         sub     ah, ah
   206 00005ACC E8CBB0FFFF          <1>         call    int16h ; call   getch
   207                              <1>         ; wait for a character from the current tty
   208                              <1> 	;
   209 00005AD1 B00A                <1> 	mov	al, 0Ah
   210 00005AD3 8A3D[0E310100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
   211 00005AD9 B307                <1> 	mov	bl, 07h ; Black background, 
   212                              <1> 			; light gray forecolor
   213 00005ADB E858C1FFFF          <1> 	call 	_write_tty
   214 00005AE0 E99CB5FFFF          <1> 	jmp	cpu_reset 
   215                              <1> 
   216                              <1> ctrlbrk:
   217                              <1> 	; 12/11/2015
   218                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   219                              <1> 	; 06/12/2013 (Retro UNIX 8086 v1)
   220                              <1> 	;
   221                              <1> 	; INT 1Bh (control+break) handler		
   222                              <1> 	;
   223                              <1>       	; Retro Unix 8086 v1 feature only!
   224                              <1>       	;
   225 00005AE5 66833D[62470100]00  <1> 	cmp 	word [u.intr], 0
   226 00005AED 7645                <1> 	jna 	short cbrk4
   227                              <1> cbrk0:
   228                              <1> 	; 12/11/2015
   229                              <1> 	; 06/12/2013
   230 00005AEF 66833D[64470100]00  <1> 	cmp 	word [u.quit], 0
   231 00005AF7 743B                <1> 	jz	short cbrk4
   232                              <1> 	;
   233                              <1> 	; 20/09/2013	
   234 00005AF9 6650                <1> 	push 	ax
   235 00005AFB A0[0E310100]        <1> 	mov	al, [ptty]
   236                              <1> 	;
   237                              <1> 	; 12/11/2015
   238                              <1> 	;
   239                              <1> 	; ctrl+break (EOT, CTRL+D) from serial port
   240                              <1> 	; or ctrl+break from console (pseudo) tty
   241                              <1> 	; (!redirection!)
   242                              <1> 	;
   243 00005B00 3C08                <1> 	cmp	al, 8 ; serial port tty nums > 7
   244 00005B02 7211                <1>         jb      short cbrk1 ; console (pseudo) tty
   245                              <1> 	;	
   246                              <1> 	; Serial port interrupt handler sets [ptty]
   247                              <1> 	; to the port's tty number (as temporary).
   248                              <1> 	;
   249                              <1> 	; If active process is using a stdin or 
   250                              <1> 	; stdout redirection (by the shell),
   251                              <1>         ; console tty keyboard must be available
   252                              <1> 	; to terminate running process,
   253                              <1> 	; in order to prevent a deadlock. 
   254                              <1> 	;
   255 00005B04 52                  <1> 	push	edx
   256 00005B05 0FB615[6B470100]    <1> 	movzx	edx, byte [u.uno]
   257 00005B0C 3A82[37440100]      <1> 	cmp     al, [edx+p.ttyc-1] ; console tty (rw)
   258 00005B12 5A                  <1> 	pop	edx
   259 00005B13 7412                <1> 	je	short cbrk2
   260                              <1> cbrk1:
   261 00005B15 FEC0                <1> 	inc 	al  ; [u.ttyp] : 1 based tty number
   262                              <1> 	; 06/12/2013
   263 00005B17 3A05[4C470100]      <1> 	cmp	al, [u.ttyp] ; recent open tty (r)
   264 00005B1D 7408                <1> 	je	short cbrk2	
   265 00005B1F 3A05[4D470100]      <1>         cmp     al, [u.ttyp+1] ; recent open tty (w)
   266 00005B25 750B                <1> 	jne	short cbrk3	
   267                              <1> cbrk2:
   268                              <1> 	;; 06/12/2013
   269                              <1> 	;mov	ax, [u.quit]
   270                              <1> 	;and	ax, ax
   271                              <1> 	;jz	short cbrk3
   272                              <1> 	;
   273 00005B27 6631C0              <1> 	xor	ax, ax ; 0
   274 00005B2A 6648                <1> 	dec	ax
   275                              <1> 	; 0FFFFh = 'ctrl+brk' keystroke
   276 00005B2C 66A3[64470100]      <1> 	mov	[u.quit], ax
   277                              <1> cbrk3:
   278 00005B32 6658                <1> 	pop	ax
   279                              <1> cbrk4:
   280 00005B34 C3                  <1> 	retn
  2134                                  %include 'trdosk2.s' ; 04/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - DRV INIT : trdosk2.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 06/07/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 04/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    11                              <1> ; TRDOS2.ASM (09/11/2011)
    12                              <1> ; ****************************************************************************
    13                              <1> ; DRV_INIT.ASM (c) 2009-2011 Erdogan TAN  [26/09/2009] Last Update: 07/08/2011
    14                              <1> ;
    15                              <1> 
    16                              <1> ldrv_init: ; Logical Drive Initialization
    17                              <1> 	; 12/02/2016
    18                              <1> 	; 06/01/2016
    19                              <1> 	;  	('diskinit.inc', 'diskio.inc' integration)
    20                              <1> 	; 04/01/2016 (TRDOS 386 = TRDOS v2.0)
    21                              <1> 	; 07/08/2011
    22                              <1> 	; 20/09/2009
    23                              <1> 	; 2005
    24 00005B35 0FB60D[7C310100]    <1> 	movzx	ecx, byte [HF_NUM] ; number of fixed disks
    25 00005B3C 80F901              <1> 	cmp	cl, 1
    26 00005B3F 7301                <1> 	jnb	short load_hd_partition_tables
    27                              <1> 	; No hard disks
    28 00005B41 C3                  <1> 	retn
    29                              <1> load_hd_partition_tables:
    30 00005B42 8B35[80310100]      <1> 	mov	esi, [HDPM_TBL_VEC] ; primary master disk FDPT
    31 00005B48 BF[A6350100]        <1> 	mov 	edi, PTable_hd0
    32 00005B4D B280                <1> 	mov 	dl, 80h
    33                              <1> load_next_hd_partition_table:
    34 00005B4F 51                  <1> 	push	ecx
    35 00005B50 57                  <1> 	push	edi
    36 00005B51 56                  <1> 	push	esi ; FDPT (+ DPTE) address
    37 00005B52 8A4614              <1> 	mov	al, [esi+20] ; DPTE offset 4
    38 00005B55 2440                <1> 	and	al, 40h ;  LBA bit (bit 6)
    39                              <1> 	;shr	al, 6
    40 00005B57 A2[A7370100]        <1> 	mov 	[HD_LBA_yes], al
    41 00005B5C E81C040000          <1> 	call	load_masterboot
    42 00005B61 7275                <1> 	jc	short pass_pt_this_hard_disk
    43                              <1> 
    44 00005B63 BE[64350100]        <1> 	mov	esi, PartitionTable
    45 00005B68 89F3                <1> 	mov	ebx, esi
    46                              <1> 	;mov	ecx, 16
    47 00005B6A B110                <1> 	mov	cl, 16
    48 00005B6C F3A5                <1> 	rep 	movsd
    49 00005B6E 89DE                <1> 	mov 	esi, ebx 
    50 00005B70 C605[03FC0000]04    <1> 	mov 	byte [hdc], 4 ; 4 - partition index
    51                              <1> loc_validate_hdp_partition:
    52 00005B77 807E0400            <1> 	cmp 	byte [esi+ptFileSystemID], 0
    53 00005B7B 7641                <1> 	jna	short loc_validate_next_hdp_partition2
    54 00005B7D 56                  <1> 	push	esi ; Masterboot partition table offset
    55 00005B7E 52                  <1> 	push	edx ; dl = Physical drive number 
    56 00005B7F FE05[A8370100]      <1> 	inc	byte [PP_Counter]
    57 00005B85 31FF                <1>         xor	edi, edi ; 0  
    58                              <1> 	; Input -> ESI = PartitionTable offset
    59                              <1> 	; DL = Hard disk drive number 
    60                              <1> 	; EDI = 0 -> Primary Partition
    61                              <1> 	; EDI > 0 -> Extended Partition's Start Sector   
    62 00005B87 E879010000          <1> 	call 	validate_hd_fat_partition
    63 00005B8C 730A                <1> 	jnc 	short loc_set_valid_hdp_partition_entry
    64                              <1> 	;pop	edx
    65                              <1> 	;push	edx
    66 00005B8E 8B1424              <1> 	mov	edx, [esp] 
    67 00005B91 E8C5020000          <1> 	call	validate_hd_fs_partition
    68 00005B96 7224                <1> 	jc	short loc_validate_next_hdp_partition1
    69                              <1> loc_set_valid_hdp_partition_entry:
    70 00005B98 8A0D[0CED0000]      <1> 	mov 	cl, [Last_DOS_DiskNo] 
    71 00005B9E 80C141              <1> 	add 	cl, 'A'
    72                              <1> 	; ESI = Logical dos drive description table address
    73 00005BA1 880E                <1> 	mov	[esi+LD_Name], cl
    74 00005BA3 8A6602              <1> 	mov	ah, [esi+LD_PhyDrvNo]
    75 00005BA6 88E0                <1> 	mov	al, ah ; Physical drive number
    76 00005BA8 2C80                <1> 	sub	al, 80h
    77 00005BAA C0E002              <1> 	shl	al, 2
    78 00005BAD 0404                <1> 	add	al, 4 ; 0 Based
    79 00005BAF 2A05[03FC0000]      <1> 	sub	al, [hdc] ; 4 - partition index
    80                              <1> 	; AL = Partition entry/index, 0 based
    81                              <1> 	;  0 -> hd 0, Partition Table offset = 0
    82                              <1> 	; 15 -> hd 3, Partition Table offset = 3
    83                              <1> 	;mov	[esi+LD_PartitionEntry], al 
    84 00005BB5 80EC7E              <1> 	sub 	ah, 7Eh
    85                              <1> 	; AH = Physical drive index, zero based
    86                              <1> 	;  0 for drive A:, 2 for drive C:
    87                              <1> 	;mov 	[esi+LD_DParamEntry], ah 
    88 00005BB8 6689467C            <1> 	mov 	[esi+LD_PartitionEntry], ax
    89                              <1> loc_validate_next_hdp_partition1:
    90 00005BBC 5A                  <1> 	pop 	edx ; dl = Physical drive number 
    91 00005BBD 5E                  <1> 	pop	esi ; Masterboot partition table offset
    92                              <1> loc_validate_next_hdp_partition2:
    93                              <1> 	; ESI = PartitionTable offset
    94                              <1> 	; DL = Hard/Fixed disk drive number
    95 00005BBE FE0D[03FC0000]      <1> 	dec	byte [hdc] ; 4 - partition index
    96 00005BC4 7412                <1> 	jz	short pass_pt_this_hard_disk
    97 00005BC6 83C610              <1> 	add	esi, 16 ; 10h
    98 00005BC9 EBAC                <1> 	jmp	short loc_validate_hdp_partition
    99                              <1> loc_next_hd_partition_table:
   100 00005BCB FEC2                <1> 	inc	dl
   101 00005BCD 83C620              <1> 	add	esi, 32 ; next FDPT address
   102 00005BD0 83C740              <1> 	add	edi, 64 ; next partition table destination
   103 00005BD3 E977FFFFFF          <1>         jmp     load_next_hd_partition_table
   104                              <1> pass_pt_this_hard_disk:
   105 00005BD8 5E                  <1> 	pop	esi ; FDPT (+ DPTE) address
   106 00005BD9 5F                  <1> 	pop	edi ; Ptable_hd?
   107 00005BDA 59                  <1> 	pop	ecx
   108 00005BDB E2EE                <1> 	loop	loc_next_hd_partition_table
   109 00005BDD 803D[A8370100]01    <1> 	cmp	byte [PP_Counter], 1
   110 00005BE4 7301                <1> 	jnb	short load_extended_dos_partitions
   111                              <1> 	; Empty partition table
   112 00005BE6 C3                  <1> 	retn 
   113                              <1> load_extended_dos_partitions:
   114 00005BE7 BE[A6350100]        <1> 	mov	esi, PTable_hd0
   115 00005BEC BF[A6360100]        <1> 	mov	edi, PTable_ep0
   116 00005BF1 C605[03FC0000]80    <1> 	mov	byte [hdc], 80h
   117                              <1> next_hd_extd_partition:
   118 00005BF8 56                  <1> 	push	esi ; PTable_hd? offset
   119 00005BF9 57                  <1> 	push	edi ; PTable_ep?
   120                              <1> 	;mov	ecx, 4
   121 00005BFA B104                <1> 	mov	cl, 4
   122 00005BFC 8A15[03FC0000]      <1> 	mov	dl, byte [hdc]
   123                              <1> hd_check_fs_id_05h:
   124 00005C02 8A4604              <1> 	mov	al, [esi+ptFileSystemID]
   125 00005C05 3C05                <1> 	cmp	al, 05h ; Is it an extended dos partition ?
   126 00005C07 7404                <1> 	je	short loc_set_ep_start_sector
   127 00005C09 3C0F                <1> 	cmp	al, 0Fh ; Is it an extended win4 (LBA mode) partition ?
   128 00005C0B 7546                <1> 	jne	short continue_to_check_ep
   129                              <1> loc_set_ep_start_sector:
   130 00005C0D FE05[A9370100]      <1> 	inc	byte [EP_Counter]
   131 00005C13 88D4                <1> 	mov	ah, dl ; byte [hdc]
   132 00005C15 86E0                <1> 	xchg	ah, al ; al = Drv Number, ah = Partition Identifier
   133 00005C17 50                  <1> 	push	eax 
   134 00005C18 30E4                <1> 	xor	ah, ah  
   135 00005C1A 2C80                <1> 	sub	al, 80h
   136 00005C1C 50                  <1> 	push	eax
   137 00005C1D C0E002              <1> 	shl	al, 2 ; al = al * 4
   138 00005C20 0FB6D8              <1> 	movzx	ebx, al
   139 00005C23 81C3[AA370100]      <1> 	add	ebx, EP_StartSector
   140 00005C29 8B4608              <1> 	mov	eax, [esi+ptStartSector]
   141                              <1>         ; EAX = Extended partition's start sector
   142 00005C2C 8903                <1>         mov	[ebx], eax
   143 00005C2E 58                  <1> 	pop	eax ; AL = Drv number - 80h, AH = 0 
   144 00005C2F 5A                  <1> 	pop	edx ; DL = Drv number, DH = Partition ID
   145 00005C30 BB[A6330100]        <1> 	mov	ebx, MasterBootBuff
   146 00005C35 803D[A7370100]01    <1> 	cmp	byte [HD_LBA_yes], 1 ; LBA ready = Yes
   147 00005C3C 7240                <1> 	jb	short loc_hd_load_ep_05h
   148 00005C3E 80FE05              <1> 	cmp	dh, 05h
   149 00005C41 743B                <1> 	je	short loc_hd_load_ep_05h
   150                              <1> loc_hd_load_ep_0Fh:
   151                              <1> 	; 04/01/2016
   152 00005C43 51                  <1> 	push	ecx
   153 00005C44 8B4E08              <1> 	mov	ecx, [esi+ptStartSector] ; sector number
   154                              <1> 	;mov	ebx, MasterBootBuff ; buffer address
   155                              <1> 	; LBA read/write (with private LBA function) 
   156                              <1> 	;((Retro UNIX 386 v1 - DISK I/O code by Erdogan Tan))
   157                              <1> 	; dl = physical drive number (0,1, 80h, 81h, 82h, 83h)
   158 00005C47 B41B                <1> 	mov	ah, 1Bh ; LBA read
   159 00005C49 B001                <1> 	mov	al, 1 ; sector count
   160 00005C4B E83CE5FFFF          <1> 	call	int13h
   161 00005C50 59                  <1> 	pop	ecx
   162 00005C51 733F                <1> 	jnc	short loc_hd_move_ep_table
   163                              <1> continue_to_check_ep:
   164 00005C53 83C610              <1> 	add	esi, 16
   165 00005C56 E2AA                <1> 	loop	hd_check_fs_id_05h
   166                              <1> continue_check_ep_next_disk:
   167 00005C58 5F                  <1> 	pop	edi ; PTable_ep?
   168 00005C59 5E                  <1> 	pop	esi ; PTable_hd?
   169 00005C5A A0[7C310100]        <1> 	mov	al, [HF_NUM] ; number of hard disks
   170 00005C5F 047F                <1> 	add	al, 7Fh
   171 00005C61 3805[03FC0000]      <1> 	cmp	[hdc], al
   172 00005C67 0F8392000000        <1> 	jnb	loc_validating_hd_partitions_ok
   173 00005C6D 83C640              <1> 	add	esi, 64
   174 00005C70 83C740              <1> 	add	edi, 64
   175 00005C73 FE05[03FC0000]      <1> 	inc	byte [hdc]
   176 00005C79 E97AFFFFFF          <1> 	jmp	next_hd_extd_partition
   177                              <1> loc_hd_load_ep_05h:
   178 00005C7E 51                  <1> 	push	ecx 
   179 00005C7F 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   180 00005C82 668B4E02            <1>         mov     cx, word [esi+ptBeginSector]
   181 00005C86 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   182                              <1> 	;mov	ebx, MasterBootBuff
   183 00005C8A E8FDE4FFFF          <1> 	call	int13h
   184 00005C8F 59                  <1> 	pop	ecx  
   185 00005C90 72C1                <1> 	jc	short continue_to_check_ep
   186                              <1> loc_hd_move_ep_table:
   187                              <1>         ;pop	edi
   188                              <1> 	;push	edi  ; PTable_ep?
   189 00005C92 8B3C24              <1> 	mov	edi, [esp]        
   190 00005C95 BE[64350100]        <1>         mov	esi, PartitionTable ; Extended
   191 00005C9A 89F3                <1> 	mov	ebx, esi
   192                              <1> 	;mov	ecx, 16
   193 00005C9C B110                <1> 	mov	cl, 16
   194 00005C9E F3A5                <1>        	rep	movsd
   195 00005CA0 89DE                <1> 	mov	esi, ebx 
   196                              <1> loc_set_hde_sub_partition_count:
   197 00005CA2 C605[A8370100]04    <1> 	mov	byte [PP_Counter], 4
   198                              <1> loc_validate_hde_partition:
   199 00005CA9 807E0400            <1> 	cmp	byte [esi+ptFileSystemID], 0
   200 00005CAD 763F                <1> 	jna	short loc_validate_next_hde_partition2
   201 00005CAF 56                  <1> 	push	esi ; Extended partition table offset
   202 00005CB0 8A15[03FC0000]      <1> 	mov	dl, byte [hdc]
   203 00005CB6 0FB6C2              <1> 	movzx	eax, dl
   204 00005CB9 2C80                <1> 	sub	al, 80h
   205 00005CBB C0E002              <1> 	shl	al, 2
   206                              <1> 	; 06/01/2016 
   207                              <1> 	; (TRDOS v1.0 had a bug here, in 'DRV_INIT.ASM')
   208                              <1> 	; BUGFIX *
   209                              <1> 	;mov	ecx, eax
   210 00005CBE 88C1                <1> 	mov	cl, al
   211 00005CC0 80C104              <1> 	add	cl, 4
   212 00005CC3 2A0D[A8370100]      <1> 	sub	cl, [PP_Counter] ; 4 to 1
   213                              <1> 	; CL = Partition entry/index, 0 based
   214                              <1>         ;  0 -> hd 0, Partition Table offset = 0
   215                              <1>         ; 15 -> hd 3, Partition Table offset = 3
   216 00005CC9 88D5                <1>       	mov	ch, dl   
   217 00005CCB 80ED7E              <1> 	sub	ch, 7Eh ;
   218                              <1> 	; CH = Physical drive index, zero based
   219                              <1> 	;  0 for drive A:, 2 for drive C:	
   220                              <1> 	; BUGFIX *
   221 00005CCE 51                  <1> 	push	ecx ; *
   222 00005CCF BF[AA370100]        <1> 	mov	edi, EP_StartSector
   223 00005CD4 01C7                <1> 	add	edi, eax
   224                              <1> 	; Input -> ESI = PartitionTable offset
   225                              <1> 	; DL = Hard disk drive number   
   226                              <1> 	; EDI = Extended partition start sector pointer
   227 00005CD6 E82A000000          <1> 	call	validate_hd_fat_partition
   228 00005CDB 59                  <1> 	pop	ecx ; *
   229 00005CDC 720F                <1> 	jc	short loc_validate_next_hde_partition1
   230                              <1> loc_set_valid_hde_partition_entry:
   231                              <1> 	; 06/01/2016 (TRDOS v2.0)
   232                              <1> 	; BUGFIX *
   233                              <1> 	;mov	[esi+LD_PartitionEntry], cl 
   234                              <1> 	;mov	[esi+LD_DParamEntry], ch 
   235 00005CDE 66894E7C            <1> 	mov	[esi+LD_PartitionEntry], cx 
   236                              <1> 	;
   237 00005CE2 8A0D[0CED0000]      <1> 	mov	cl, [Last_DOS_DiskNo] 
   238 00005CE8 80C141              <1> 	add	cl, 'A'
   239 00005CEB 880E                <1> 	mov	[esi+LD_Name], cl
   240                              <1> loc_validate_next_hde_partition1:
   241 00005CED 5E                  <1> 	pop	esi ; Extended partition table offset
   242                              <1> loc_validate_next_hde_partition2:
   243                              <1> 	; ESI = Extended partition table offset
   244                              <1> 	; DL = Hard disk drive number
   245 00005CEE FE0D[A8370100]      <1> 	dec	byte [PP_Counter]
   246 00005CF4 0F845EFFFFFF        <1> 	jz	continue_check_ep_next_disk
   247 00005CFA 83C610              <1> 	add 	esi, 16 ; 10h
   248 00005CFD EBAA                <1> 	jmp	short loc_validate_hde_partition
   249                              <1> loc_validating_hd_partitions_ok:
   250 00005CFF A0[0CED0000]        <1> 	mov	al, [Last_DOS_DiskNo]
   251                              <1> loc_drv_init_retn:
   252 00005D04 C3                  <1> 	retn
   253                              <1> 
   254                              <1> validate_hd_fat_partition:
   255                              <1> 	; 12/02/2016
   256                              <1> 	; 07/01/2016 (TRDOS 386 = TRDOS v2.0)
   257                              <1> 	; 07/08/2011
   258                              <1> 	; 23/07/2011
   259                              <1> 	; Input
   260                              <1> 	;   DL = Hard/Fixed Disk Drive Number
   261                              <1> 	;   ESI = PartitionTable offset
   262                              <1> 	;   EDI = Extend. Part. Start Sector Pointer
   263                              <1> 	;   EDI = 0 -> Primary Partition 
   264                              <1> 	;   byte [Last_DOS_DiskNo]
   265                              <1>  	; Output
   266                              <1> 	;  cf=0 -> Validated
   267                              <1> 	;   ESI = Logical dos drv desc. table
   268                              <1> 	;   EBX = FAT boot sector buffer
   269                              <1> 	;   byte [Last_DOS_DiskNo]
   270                              <1> 	;  cf=1 -> Not a valid FAT partition
   271                              <1> 	; EAX, EDX, ECX, EDI -> changed 
   272                              <1> 	
   273                              <1> 	;mov 	esi, PartitionTable
   274 00005D05 8A6604              <1> 	mov 	ah, [esi+ptFileSystemID]
   275 00005D08 80FC06              <1> 	cmp 	ah, 06h ; FAT16 CHS partition
   276                              <1> 	; 12/02/2016
   277                              <1> 	;jb	short loc_not_a_valid_fat_partition2
   278 00005D0B 7305                <1>  	jnb	short vhdp_FAT16_32
   279                              <1> 	;
   280 00005D0D 80FC04              <1> 	cmp	ah, 04h ; FAT16 CHS partition (< 32MB)		
   281 00005D10 7519                <1> 	jne	short loc_not_a_valid_fat_partition1
   282                              <1> vhdp_FAT16_32:
   283 00005D12 B002                <1> 	mov	al, 2
   284 00005D14 7417                <1> 	je	short loc_set_valid_hd_partition_params
   285 00005D16 80FC0E              <1> 	cmp	ah, 0Eh ; FAT16 LBA partition
   286 00005D19 7710                <1> 	ja	short loc_not_a_valid_fat_partition1
   287 00005D1B 7410                <1> 	je	short loc_set_valid_hd_partition_params
   288                              <1> 
   289 00005D1D FEC0                <1> 	inc	al ; 3
   290 00005D1F 80FC0B              <1> 	cmp	ah, 0Bh ; FAT32 CHS partition 
   291 00005D22 7409                <1> 	je	short loc_set_valid_hd_partition_params
   292 00005D24 7206                <1> 	jb	short loc_not_a_valid_fat_partition2
   293 00005D26 80FC0C              <1> 	cmp	ah, 0Ch ; FAT32 LBA partition
   294 00005D29 7402                <1> 	je	short loc_set_valid_hd_partition_params
   295                              <1> loc_not_a_valid_fat_partition1:
   296 00005D2B F9                  <1> 	stc
   297                              <1> loc_not_a_valid_fat_partition2:
   298 00005D2C C3                  <1> 	retn
   299                              <1> 
   300                              <1> loc_set_valid_hd_partition_params:
   301 00005D2D FE05[0CED0000]      <1> 	inc 	byte [Last_DOS_DiskNo] ; > 1
   302                              <1> 	;
   303 00005D33 31DB                <1> 	xor	ebx, ebx
   304 00005D35 8A3D[0CED0000]      <1> 	mov	bh, [Last_DOS_DiskNo] ; * 256	
   305 00005D3B 81C300010900        <1> 	add	ebx, Logical_DOSDisks
   306                              <1> 	;
   307 00005D41 C6430102            <1> 	mov	byte [ebx+LD_DiskType], 2
   308 00005D45 885302              <1> 	mov	byte [ebx+LD_PhyDrvNo], dl
   309                              <1> 	;mov	byte [ebx+LD_FATType], al ; 2 or 3
   310                              <1> 	;mov	byte [ebx+LD_FSType], ah ; 06h, 0Eh, 0Bh, 0Ch
   311 00005D48 66894303            <1> 	mov	word [ebx+LD_FATType], ax
   312                              <1> 	;
   313 00005D4C 8B4E08              <1> 	mov	ecx, [esi+ptStartSector]
   314 00005D4F 09FF                <1> 	or	edi, edi 
   315 00005D51 7402                <1> 	jz	short pass_hd_FAT_ep_start_sector_adding
   316                              <1> loc_add_hd_FAT_ep_start_sector:
   317 00005D53 030F                <1> 	add	ecx, [edi]
   318                              <1> pass_hd_FAT_ep_start_sector_adding:
   319 00005D55 894B6C              <1> 	mov	[ebx+LD_StartSector], ecx
   320                              <1> loc_hd_FAT_logical_drv_init:
   321 00005D58 89DD                <1> 	mov	ebp, ebx
   322                              <1> 	;mov	dl, [ebx+LD_PhyDrvNo]
   323 00005D5A A0[A7370100]        <1> 	mov	al, [HD_LBA_yes] ; 07/01/2016
   324 00005D5F 884305              <1> 	mov	[ebx+LD_LBAYes], al
   325 00005D62 BB[BA370100]        <1> 	mov	ebx, DOSBootSectorBuff ; buffer address
   326 00005D67 08C0                <1> 	or	al, al
   327 00005D69 740C                <1> 	jz	short loc_hd_FAT_drv_init_load_bs_chs
   328                              <1> loc_hd_FAT_drv_init_load_bs_lba:
   329                              <1> 	; DL = Physical drive number
   330                              <1>    	;mov	ecx, [esi+ptStartSector] ; sector number
   331                              <1> 	;mov	ebx, DOSBootSectorBuff ; buffer address
   332                              <1> 	; LBA read/write (with private LBA function) 
   333                              <1> 	;((Retro UNIX 386 v1 - DISK I/O code by Erdogan Tan))
   334                              <1> 	; dl = physical drive number (0,1, 80h, 81h, 82h, 83h)
   335 00005D6B B41B                <1> 	mov	ah, 1Bh ; LBA read
   336 00005D6D B001                <1> 	mov	al, 1 ; sector count
   337 00005D6F E818E4FFFF          <1> 	call	int13h
   338 00005D74 7313                <1> 	jnc	short loc_hd_drv_FAT_boot_validation
   339                              <1> loc_not_a_valid_fat_partition3:
   340 00005D76 C3                  <1> 	retn
   341                              <1> loc_hd_FAT_drv_init_load_bs_chs:
   342 00005D77 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   343 00005D7A 668B4E02            <1> 	mov	cx, [esi+ptBeginSector]
   344 00005D7E 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   345                              <1> 	;mov	ebx, DOSBootSectorBuff
   346 00005D82 E805E4FFFF          <1> 	call	int13h
   347 00005D87 72ED                <1> 	jc	short loc_not_a_valid_fat_partition3
   348                              <1> loc_hd_drv_FAT_boot_validation:
   349                              <1> 	;mov	esi, DOSBootSectorBuff
   350 00005D89 89DE                <1> 	mov	esi, ebx
   351 00005D8B 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
   352 00005D94 751A                <1> 	jne	short loc_not_a_valid_fat_partition4
   353 00005D96 807E15F8            <1> 	cmp	byte [esi+BPB_Media], 0F8h
   354 00005D9A 7514                <1> 	jne	short loc_not_a_valid_fat_partition4
   355 00005D9C 66837E1600          <1> 	cmp	word [esi+BPB_FATSz16], 0
   356 00005DA1 770F                <1> 	ja	short loc_hd_FAT16_BPB
   357 00005DA3 807E4229            <1> 	cmp	byte [esi+BS_FAT32_BootSig], 29h
   358 00005DA7 7507                <1> 	jne	short loc_not_a_valid_fat_partition4
   359                              <1> loc_hd_FAT32_BPB:
   360 00005DA9 B92D000000          <1> 	mov	ecx, 45
   361 00005DAE EB0D                <1> 	jmp	short loc_hd_move_FAT_BPB
   362                              <1> 	;
   363                              <1> loc_not_a_valid_fat_partition4:
   364 00005DB0 F9                  <1> 	stc
   365 00005DB1 C3                  <1> 	retn
   366                              <1> 	;
   367                              <1> loc_hd_FAT16_BPB:
   368 00005DB2 807E2629            <1> 	cmp	byte [esi+BS_BootSig], 29h
   369 00005DB6 75F8                <1> 	jne	short loc_not_a_valid_fat_partition4
   370 00005DB8 B920000000          <1> 	mov	ecx, 32
   371                              <1> loc_hd_move_FAT_BPB:
   372 00005DBD 89EF                <1> 	mov 	edi, ebp
   373                              <1> 	;mov	esi, ebx ; Boot sector
   374 00005DBF 57                  <1> 	push	edi
   375 00005DC0 83C706              <1> 	add	edi, LD_BPB
   376 00005DC3 F366A5              <1> 	rep	movsw 
   377 00005DC6 5E                  <1> 	pop	esi
   378 00005DC7 0FB74614            <1> 	movzx	eax, word [esi+LD_BPB+BPB_RsvdSecCnt]
   379 00005DCB 03466C              <1> 	add	eax, [esi+LD_StartSector]
   380 00005DCE 894660              <1> 	mov	[esi+LD_FATBegin], eax
   381 00005DD1 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3
   382 00005DD5 7224                <1> 	jb	short loc_set_FAT16_RootDirLoc
   383                              <1> loc_set_FAT32_RootDirLoc:
   384 00005DD7 8B462A              <1> 	mov	eax, [esi+LD_BPB+BPB_FATSz32]
   385 00005DDA 0FB65E16            <1>         movzx	ebx, byte [esi+LD_BPB+BPB_NumFATs]
   386 00005DDE F7E3                <1> 	mul	ebx
   387 00005DE0 034660              <1> 	add	eax, [esi+LD_FATBegin]
   388                              <1> loc_set_FAT32_data_begin:
   389 00005DE3 894668              <1> 	mov	[esi+LD_DATABegin], eax
   390 00005DE6 894664              <1> 	mov	[esi+LD_ROOTBegin], eax
   391                              <1> 	; If Root Directory Cluster <> 2 then
   392                              <1> 	; change the beginning sector value 
   393                              <1> 	; of the root dir by adding sector offset.
   394 00005DE9 8B4632              <1> 	mov	eax, [esi+LD_BPB+BPB_RootClus]
   395 00005DEC 83E802              <1> 	sub	eax, 2
   396 00005DEF 7442                <1> 	jz	short short loc_set_32bit_FAT_total_sectors  
   397                              <1> 	;movzx	ebx, byte [esi+LD_BPB+BPB_SecPerClust]
   398 00005DF1 8A5E13              <1> 	mov	bl, byte [esi+LD_BPB+BPB_SecPerClust] 
   399 00005DF4 F7E3                <1> 	mul	ebx
   400 00005DF6 014664              <1> 	add	[esi+LD_ROOTBegin], eax
   401 00005DF9 EB38                <1> 	jmp	short loc_set_32bit_FAT_total_sectors
   402                              <1> 	;
   403                              <1> loc_set_FAT16_RootDirLoc:
   404 00005DFB 0FB64616            <1> 	movzx	eax, byte [esi+LD_BPB+BPB_NumFATs]
   405 00005DFF 0FB7561C            <1> 	movzx	edx, word [esi+LD_BPB+BPB_FATSz16]
   406 00005E03 F7E2                <1> 	mul	edx
   407 00005E05 034660              <1> 	add	eax, [esi+LD_FATBegin]  
   408 00005E08 894664              <1> 	mov	[esi+LD_ROOTBegin], eax
   409                              <1> loc_set_FAT16_data_begin:
   410 00005E0B 894668              <1> 	mov	[esi+LD_DATABegin], eax 
   411 00005E0E B820000000          <1> 	mov	eax, 20h  ; Size of a directory entry
   412                              <1> 	;movzx	edx, word [esi+LD_BPB+BPB_RootEntCnt]
   413 00005E13 668B5617            <1>         mov     dx, [esi+LD_BPB+BPB_RootEntCnt]
   414 00005E17 F7E2                <1>         mul	edx
   415                              <1> 	;mov	ecx, 511
   416 00005E19 66B9FF01            <1> 	mov	cx, 511
   417 00005E1D 01C8                <1> 	add	eax, ecx
   418 00005E1F 41                  <1> 	inc	ecx ; 512
   419 00005E20 F7F1                <1> 	div	ecx
   420 00005E22 014668              <1> 	add	[esi+LD_DATABegin], eax
   421 00005E25 0FB74619            <1> 	movzx	eax, word [esi+LD_BPB+BPB_TotalSec16]
   422 00005E29 6685C0              <1> 	test	ax, ax
   423 00005E2C 7405                <1> 	jz	short loc_set_32bit_FAT_total_sectors
   424                              <1> loc_set_16bit_FAT_total_sectors:
   425 00005E2E 894670              <1> 	mov	[esi+LD_TotalSectors], eax
   426 00005E31 EB06                <1> 	jmp	short loc_set_hd_FAT_cluster_count
   427                              <1> loc_set_32bit_FAT_total_sectors:
   428 00005E33 8B4626              <1> 	mov	eax, [esi+LD_BPB+BPB_TotalSec32]
   429 00005E36 894670              <1> 	mov	[esi+LD_TotalSectors], eax
   430                              <1> loc_set_hd_FAT_cluster_count:
   431 00005E39 8B5668              <1> 	mov	edx, [esi+LD_DATABegin]
   432 00005E3C 2B566C              <1> 	sub	edx, [esi+LD_StartSector]
   433 00005E3F 29D0                <1> 	sub	eax, edx
   434 00005E41 31D2                <1> 	xor	edx, edx ; 0
   435 00005E43 0FB64E13            <1>         movzx   ecx, byte [esi+LD_BPB+BPB_SecPerClust]
   436 00005E47 F7F1                <1>         div	ecx 
   437 00005E49 894678              <1> 	mov	[esi+LD_Clusters], eax
   438                              <1> 	; Maximum Valid Cluster Number= EAX +1
   439                              <1> 	; with 2 reserved clusters= EAX +2
   440                              <1> loc_set_hd_FAT_fs_free_sectors:
   441                              <1> 	;mov	dword [esi+LD_FreeSectors], 0
   442 00005E4C E859010000          <1> 	call	get_free_FAT_sectors
   443 00005E51 7207                <1> 	jc	short loc_validate_hd_FAT_partition_retn
   444 00005E53 894674              <1> 	mov	[esi+LD_FreeSectors], eax
   445 00005E56 C6467E06            <1> 	mov	byte [esi+LD_MediaChanged], 6  ; Volume Name Reset
   446                              <1> 	;mov	cl, [Last_DOS_DiskNo] 
   447                              <1> 	;add	cl, 'A'
   448                              <1> 	;mov	[esi+LD_FS_Name], cl
   449                              <1> 
   450                              <1> loc_validate_hd_FAT_partition_retn:         
   451 00005E5A C3                  <1> 	retn
   452                              <1> 
   453                              <1> validate_hd_fs_partition:
   454                              <1> 	; 13/02/2016
   455                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
   456                              <1> 	; 29/01/2011
   457                              <1> 	; 23/07/2011
   458                              <1> 	; Input
   459                              <1> 	;   DL = Hard/Fixed Disk Drive Number
   460                              <1> 	;   ESI = PartitionTable offset
   461                              <1> 	;   byte [Last_DOS_DiskNo]
   462                              <1> 	; Output
   463                              <1> 	;  cf=0 -> Validated
   464                              <1> 	;   ESI = Logical dos drv desc. table
   465                              <1> 	;   EBX = Singlix FS boot sector buffer
   466                              <1> 	;   byte [Last_DOS_DiskNo]
   467                              <1> 	;  cf=1 -> Not a valid 'Singlix FS' partition
   468                              <1> 	; EAX, EDX, ECX, EDI -> changed 
   469                              <1> 
   470                              <1> 	;mov	esi, PartitionTable
   471 00005E5B 8A6604              <1> 	mov	ah, [esi+ptFileSystemID]
   472 00005E5E 80FCA1              <1> 	cmp	ah, 0A1h ; SINGLIX FS1 (trfs1) partition
   473 00005E61 7549                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   474                              <1> loc_set_valid_hd_fs_partition_params:
   475 00005E63 FE05[0CED0000]      <1> 	inc	byte [Last_DOS_DiskNo] ; > 1
   476 00005E69 30C0                <1> 	xor	al, al ; mov al, 0
   477                              <1> 	;mov	[drv], dl
   478 00005E6B 29DB                <1> 	sub	ebx, ebx ; 0
   479 00005E6D 8A3D[0CED0000]      <1> 	mov	bh, [Last_DOS_DiskNo] 
   480 00005E73 81C300010900        <1> 	add	ebx, Logical_DOSDisks
   481 00005E79 C6430102            <1> 	mov	byte [ebx+LD_DiskType], 2
   482 00005E7D 885302              <1> 	mov	[ebx+LD_PhyDrvNo], dl
   483                              <1> 	;mov	[ebx+LD_FATType], al ; 0
   484                              <1> 	;mov	[ebx+LD_FSType], ah
   485 00005E80 66894303            <1> 	mov	[ebx+LD_FATType], ax
   486                              <1> 	;mov	eax, [esi+ptStartSector]
   487                              <1> 	;mov	[ebx+LD_StartSector], eax
   488                              <1> loc_hd_fs_logical_drv_init:
   489 00005E84 89DD                <1> 	mov	ebp, ebx ; 10/01/2016
   490                              <1> 	;mov	dl, [ebx+LD_PhyDrvNo]
   491 00005E86 A0[A7370100]        <1> 	mov	al, [HD_LBA_yes] ; 10/01/2016
   492 00005E8B 884305              <1> 	mov	[ebx+LD_LBAYes], al
   493 00005E8E 89DE                <1> 	mov	esi, ebx
   494 00005E90 BB[BA370100]        <1> 	mov	ebx, DOSBootSectorBuff ; buffer address
   495 00005E95 08C0                <1> 	or	al, al
   496 00005E97 7515                <1> 	jnz	short loc_hd_fs_drv_init_load_bs_lba
   497                              <1> loc_hd_fs_drv_init_load_bs_chs:
   498 00005E99 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   499 00005E9C 668B4E02            <1> 	mov	cx, [esi+ptBeginSector]
   500 00005EA0 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   501                              <1> 	;mov	ebx, DOSBootSectorBuff
   502 00005EA4 E8E3E2FFFF          <1> 	call	int13h
   503 00005EA9 7311                <1> 	jnc	short loc_hd_drv_fs_boot_validation
   504                              <1> loc_validate_hd_fs_partition_err_retn:
   505 00005EAB C3                  <1> 	retn
   506                              <1> loc_validate_hd_fs_partition_stc_retn:
   507 00005EAC F9                  <1> 	stc
   508 00005EAD C3                  <1> 	retn
   509                              <1> loc_hd_fs_drv_init_load_bs_lba:
   510                              <1> 	; DL = Physical drive number
   511                              <1> 	;mov	esi, ebx
   512 00005EAE 8B4E08              <1>    	mov	ecx, [esi+ptStartSector] ; sector number
   513                              <1> 	;mov	ebx, DOSBootSectorBuff ; buffer address
   514                              <1> 	; LBA read/write (with private LBA function) 
   515                              <1> 	;((Retro UNIX 386 v1 - DISK I/O code by Erdogan Tan))
   516                              <1> 	; dl = physical drive number (0,1, 80h, 81h, 82h, 83h)
   517 00005EB1 B41B                <1> 	mov	ah, 1Bh ; LBA read
   518 00005EB3 B001                <1> 	mov	al, 1 ; sector count
   519 00005EB5 E8D2E2FFFF          <1> 	call	int13h
   520 00005EBA 72EF                <1> 	jc	short loc_validate_hd_fs_partition_err_retn
   521                              <1> loc_hd_drv_fs_boot_validation:
   522                              <1> 	;mov	esi, DOSBootSectorBuff
   523 00005EBC 89DE                <1> 	mov	esi, ebx ; Boot sector buffer
   524 00005EBE 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
   525 00005EC7 75E3                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   526                              <1>         ;
   527                              <1> 	;Singlix FS Extensions to TR-DOS (7/6/2009) 
   528 00005EC9 66817E035346        <1> 	cmp	word [esi+bs_FS_Identifier], 'SF'
   529 00005ECF 75DB                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   530                              <1>         ;'A1h' check is not necessary
   531                              <1> 	;  if 'FS' check is passed as OK/Yes.
   532 00005ED1 807E09A1            <1> 	cmp	byte [esi+bs_FS_PartitionID], 0A1h
   533 00005ED5 75D5                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   534                              <1> 	;
   535 00005ED7 89EF                <1> 	mov	edi, ebp ; 10/01/2016
   536                              <1> 	;
   537 00005ED9 8A462D              <1> 	mov	al, byte [esi+bs_FS_LBA_Ready]
   538 00005EDC 884705              <1> 	mov	[edi+LD_FS_LBAYes], al
   539                              <1> 	;
   540                              <1> 	; 03/01/2010 CHS -> DOS FAT/BPB compatibility fix
   541 00005EDF 8A4608              <1> 	mov	al, [esi+bs_FS_MediaAttrib]
   542 00005EE2 884706              <1> 	mov	byte [edi+LD_FS_MediaAttrib], al
   543                              <1> 	;
   544 00005EE5 8A460A              <1> 	mov	al, [esi+bs_FS_VersionMaj]
   545 00005EE8 884707              <1> 	mov	[edi+LD_FS_VersionMajor], al
   546                              <1> 	;
   547 00005EEB 668B4606            <1> 	mov	ax, [esi+bs_FS_BytesPerSec]
   548 00005EEF 66894711            <1> 	mov	[edi+LD_FS_BytesPerSec], ax
   549 00005EF3 8A462E              <1> 	mov	al, [esi+bs_FS_SecPerTrack]
   550 00005EF6 6698                <1> 	cbw
   551 00005EF8 6689471E            <1> 	mov	[edi+LD_FS_SecPerTrack], ax
   552 00005EFC 8A462F              <1> 	mov	al, [esi+bs_FS_Heads]
   553                              <1> 	;cbw
   554 00005EFF 66894720            <1> 	mov	[edi+LD_FS_NumHeads], ax
   555                              <1> 	;
   556 00005F03 8B4628              <1> 	mov	eax, [esi+bs_FS_UnDelDirD]
   557 00005F06 894722              <1> 	mov	[edi+LD_FS_UnDelDirD], eax
   558 00005F09 8B5618              <1> 	mov	edx, [esi+bs_FS_MATLocation]
   559 00005F0C 89570C              <1> 	mov	[edi+LD_FS_MATLocation], edx
   560 00005F0F 8B461C              <1> 	mov	eax, [esi+bs_FS_RootDirD]
   561 00005F12 894708              <1> 	mov	[edi+LD_FS_RootDirD], eax
   562 00005F15 8B460C              <1> 	mov	eax, [esi+bs_FS_BeginSector]
   563 00005F18 89476C              <1> 	mov	[edi+LD_FS_BeginSector], eax
   564 00005F1B 8B4710              <1> 	mov	eax, [edi+bs_FS_VolumeSize]
   565 00005F1E 894770              <1> 	mov	[edi+LD_FS_VolumeSize], eax
   566                              <1> 	;
   567 00005F21 89D0                <1> 	mov	eax, edx ; [edi+LD_FS_MATLocation]
   568 00005F23 03476C              <1> 	add	eax, [edi+LD_FS_BeginSector]
   569 00005F26 89FE                <1> 	mov	esi, edi
   570                              <1> mread_hd_fs_MAT_sector:
   571                              <1>        ;mov	ebx, DOSBootSectorBuff
   572 00005F28 B901000000          <1> 	mov	ecx, 1
   573 00005F2D E83F870000          <1> 	call	disk_read
   574 00005F32 7248                <1> 	jc	short loc_validate_hd_fs_partition_retn
   575                              <1> 	; EDI will not be changed
   576 00005F34 89DE                <1> 	mov	esi, ebx
   577                              <1> use_hdfs_mat_sector_params:
   578 00005F36 8B460C              <1> 	mov	eax, [esi+FS_MAT_DATLocation]
   579 00005F39 894714              <1> 	mov	[edi+LD_FS_DATLocation], eax
   580 00005F3C 8B4610              <1> 	mov	eax, [esi+FS_MAT_DATScount]
   581 00005F3F 894718              <1> 	mov	[edi+LD_FS_DATSectors], eax
   582 00005F42 8B4614              <1> 	mov	eax, [esi+FS_MAT_FreeSectors]
   583 00005F45 894774              <1>         mov     [edi+LD_FS_FreeSectors], eax
   584 00005F48 8B4618              <1> 	mov	eax, [esi+FS_MAT_FirstFreeSector]
   585 00005F4B 894778              <1> 	mov	[edi+LD_FS_FirstFreeSector], eax
   586 00005F4E 8B4708              <1> 	mov	eax, [edi+LD_FS_RootDirD]
   587 00005F51 03476C              <1> 	add	eax, [edi+LD_FS_BeginSector]
   588 00005F54 89FE                <1> 	mov	esi, edi   
   589                              <1> read_hd_fs_RDT_sector:
   590 00005F56 BB[BA370100]        <1> 	mov	ebx, DOSBootSectorBuff
   591                              <1> 	;mov	ecx, 1
   592 00005F5B B101                <1> 	mov	cl, 1
   593 00005F5D E80F870000          <1> 	call	disk_read
   594 00005F62 7218                <1> 	jc	short loc_validate_hd_fs_partition_retn
   595                              <1> 	; EDI will not be changed
   596 00005F64 89DE                <1> 	mov	esi, ebx
   597                              <1> use_hdfs_RDT_sector_params:
   598 00005F66 8B461C              <1> 	mov	eax, [esi+FS_RDT_VolumeSerialNo]
   599 00005F69 894728              <1> 	mov	[edi+LD_FS_VolumeSerial], eax
   600 00005F6C 57                  <1> 	push	edi
   601                              <1> 	;mov	ecx, 16
   602 00005F6D B110                <1> 	mov	cl, 16
   603 00005F6F 83C640              <1> 	add	esi, FS_RDT_VolumeName
   604 00005F72 83C72C              <1> 	add	edi, LD_FS_VolumeName
   605 00005F75 F3A5                <1> 	rep	movsd ; 64 bytes
   606 00005F77 5E                  <1> 	pop	esi
   607                              <1> 		; Volume Name Reset
   608 00005F78 C6467E06            <1>         mov     byte [esi+LD_FS_MediaChanged], 6
   609                              <1> 	;
   610                              <1>         ;mov	cl, [Last_DOS_DiskNo] 
   611                              <1> 	;add	cl, 'A'
   612                              <1> 	;mov	[esi+LD_FS_Name], cl
   613                              <1> 
   614                              <1> loc_validate_hd_fs_partition_retn:
   615 00005F7C C3                  <1> 	retn
   616                              <1> 
   617                              <1> load_masterboot:
   618                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
   619                              <1> 	; 2005 - 2011
   620                              <1> 	; input -> DL = drive number
   621 00005F7D B40D                <1> 	mov	ah, 0Dh ; Alternate disk reset
   622 00005F7F E808E2FFFF          <1> 	call	int13h
   623 00005F84 7301                <1> 	jnc	short pass_reset_error
   624                              <1> harddisk_error:
   625 00005F86 C3                  <1>   	retn
   626                              <1> pass_reset_error:
   627 00005F87 BB[A6330100]        <1> 	mov	ebx, MasterBootBuff
   628 00005F8C 66B80102            <1> 	mov	ax, 0201h
   629 00005F90 66B90100            <1> 	mov	cx, 1
   630 00005F94 30F6                <1> 	xor	dh, dh
   631 00005F96 E8F1E1FFFF          <1>  	call	int13h
   632 00005F9B 72E9                <1> 	jc	short harddisk_error
   633                              <1> 	;
   634 00005F9D 66813D[A4350100]55- <1> 	cmp	word [MBIDCode], 0AA55h
   634 00005FA5 AA                  <1>
   635 00005FA6 7401                <1> 	je	short load_masterboot_ok
   636 00005FA8 F9                  <1> 	stc
   637                              <1> load_masterboot_ok:
   638 00005FA9 C3                  <1> 	retn
   639                              <1> 
   640                              <1> get_free_FAT_sectors:
   641                              <1> 	; 29/02/2016
   642                              <1> 	; 13/02/2016
   643                              <1> 	; 04/02/2016
   644                              <1> 	; 07/01/2016 (TRDOS 386 = TRDOS v2.0)
   645                              <1> 	; 11/07/2010
   646                              <1> 	; 21/06/2009
   647                              <1> 	; INPUT: ESI = Logical DOS Drive Description Table address
   648                              <1> 	; OUTPUT: STC => Error
   649                              <1>         ;	cf = 0 and EAX = Free FAT sectors
   650                              <1> 	; Also, related parameters and FAT buffer will be reset and updated
   651                              <1> 
   652 00005FAA 31C0                <1> 	xor	eax, eax
   653                              <1> 	;mov	[esi+LD_FreeSectors], eax ; Reset
   654                              <1> 	
   655 00005FAC 807E0302            <1>         cmp     byte [esi+LD_FATType], 2
   656 00005FB0 7650                <1> 	jna	short loc_gfc_get_fat_free_clusters
   657                              <1> 
   658                              <1> 	; 29/02/2016
   659 00005FB2 48                  <1> 	dec	eax ; 0FFFFFFFFh
   660 00005FB3 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count (reset)
   661 00005FB6 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; First Free Cluster (reset)
   662 00005FB9 40                  <1> 	inc	eax ; 0
   663                              <1> 	;
   664 00005FBA 668B4636            <1> 	mov	ax, [esi+LD_BPB+BPB_FSInfo]
   665 00005FBE 03466C              <1> 	add	eax, [esi+LD_StartSector]
   666                              <1> 
   667 00005FC1 BB[BA370100]        <1> 	mov	ebx, DOSBootSectorBuff
   668 00005FC6 B901000000          <1> 	mov	ecx, 1
   669 00005FCB E8A1860000          <1>  	call	disk_read
   670 00005FD0 7301                <1> 	jnc	short loc_gfc_check_fsinfo_signs
   671                              <1> retn_gfc_get_fsinfo_sec:
   672 00005FD2 C3                  <1> 	retn
   673                              <1> 
   674                              <1> loc_gfc_check_fsinfo_signs:
   675 00005FD3 BB[BA370100]        <1> 	mov 	ebx, DOSBootSectorBuff ; 13/02/2016
   676 00005FD8 813B52526141        <1>         cmp     dword [ebx], 41615252h
   677 00005FDE 7520                <1> 	jne	short retn_gfc_get_fsinfo_stc
   678                              <1> 	;add	ebx, 484
   679                              <1> 	;cmp	dword [ebx], 61417272h
   680 00005FE0 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
   680 00005FE9 61                  <1>
   681 00005FEA 7514                <1> 	jne	short retn_gfc_get_fsinfo_stc
   682                              <1> 	;add	ebx, 4
   683                              <1> 	;mov	eax, [ebx]
   684 00005FEC 8B83E8010000        <1> 	mov	eax, [ebx+488]
   685                              <1> 	; 29/02/2016
   686 00005FF2 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count
   687 00005FF5 8B93EC010000        <1> 	mov	edx,  [ebx+492] 
   688 00005FFB 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; First Free Cluster
   689                              <1> 	;
   690 00005FFE EB12                <1> 	jmp	short retn_from_get_free_fat32_clusters
   691                              <1> 
   692                              <1> retn_gfc_get_fsinfo_stc:
   693 00006000 F9                  <1> 	stc
   694 00006001 C3                  <1> 	retn
   695                              <1> 
   696                              <1> loc_gfc_get_fat_free_clusters:
   697                              <1> 	;mov	eax, 2
   698 00006002 B002                <1> 	mov	al, 2
   699                              <1> 	;mov	[FAT_CurrentCluster], eax
   700                              <1> loc_gfc_loop_get_next_cluster:
   701 00006004 E823500000          <1> 	call	get_next_cluster
   702 00006009 730E                <1> 	jnc	short loc_gfc_free_fat_clusters_cont
   703 0000600B 21C0                <1> 	and	eax, eax
   704 0000600D 7411                <1> 	jz	short loc_gfc_pass_inc_free_cluster_count
   705                              <1>  
   706                              <1> retn_from_get_free_fat_clusters:
   707 0000600F 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors] ; Free clusters !
   708                              <1> retn_from_get_free_fat32_clusters:
   709 00006012 0FB65E13            <1>         movzx	ebx, byte [esi+LD_BPB+BPB_SecPerClust]
   710 00006016 F7E3                <1>       	mul	ebx
   711                              <1> 	;mov	[esi+LD_FreeSectors], eax ; Free sectors
   712                              <1> retn_get_free_sectors_calc:
   713 00006018 C3                  <1> 	retn
   714                              <1> 
   715                              <1> loc_gfc_free_fat_clusters_cont:
   716 00006019 09C0                <1> 	or	eax, eax
   717 0000601B 7503                <1> 	jnz	short loc_gfc_pass_inc_free_cluster_count
   718 0000601D FF4674              <1> 	inc	dword [esi+LD_FreeSectors] ; Free clusters !
   719                              <1>    
   720                              <1> loc_gfc_pass_inc_free_cluster_count:
   721                              <1> 	;mov	eax, [FAT_CurrentCluster]
   722 00006020 89C8                <1> 	mov	eax, ecx ; [FAT_CurrentCluster]
   723 00006022 3B4678              <1> 	cmp	eax, [esi+LD_Clusters]
   724 00006025 77E8                <1> 	ja	short retn_from_get_free_fat_clusters
   725 00006027 40                  <1> 	inc	eax
   726                              <1> 	;mov	[FAT_CurrentCluster], eax
   727 00006028 EBDA                <1> 	jmp	short loc_gfc_loop_get_next_cluster
   728                              <1> 
   729                              <1> floppy_drv_init:
   730                              <1> 	; 06/07/2016
   731                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
   732                              <1> 	; 24/07/2011
   733                              <1> 	; 04/07/2009
   734                              <1> 	; INPUT ->
   735                              <1> 	;	DL = Drive number (0,1)
   736                              <1> 	; OUTPUT ->
   737                              <1> 	;	BL = drive name
   738                              <1> 	;	BH = drive number
   739                              <1> 	;	ESI = Logical DOS drv description table
   740                              <1> 	;	EAX = Volume serial number
   741                              <1>  
   742 0000602A BE[04FC0000]        <1> 	mov	esi, fd0_type ; 10/01/2016
   743 0000602F BF00010900          <1> 	mov	edi, Logical_DOSDisks
   744 00006034 08D2                <1> 	or	dl, dl
   745 00006036 7407                <1> 	jz	short loc_drv_init_fd0_fd1
   746 00006038 81C700010000        <1> 	add	edi, 100h
   747 0000603E 46                  <1> 	inc	esi ; fd1_type ; 10/01/2016
   748                              <1> loc_drv_init_fd0_fd1:
   749 0000603F C6477E00            <1> 	mov	byte [edi+LD_MediaChanged], 0
   750 00006043 803E01              <1> 	cmp	byte [esi], 1 ; type (>0 if it is existing) 
   751                              <1> 		; 4 = 1.44 MB, 80 track, 3 1/2"
   752 00006046 7221                <1> 	jb	short read_fd_boot_sector_retn
   753 00006048 885702              <1> 	mov	[edi+LD_PhyDrvNo], dl
   754                              <1> read_fd_boot_sector:
   755 0000604B 30F6                <1> 	xor	dh, dh
   756 0000604D B904000000          <1> 	mov	ecx, 4 ; Retry Count
   757                              <1> read_fd_boot_sector_again:
   758 00006052 51                  <1> 	push 	ecx
   759                              <1> 	;mov	cx, 1
   760 00006053 B101                <1> 	mov	cl, 1
   761 00006055 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   762 00006059 BB[BA370100]        <1> 	mov	ebx, DOSBootSectorBuff
   763 0000605E E829E1FFFF          <1> 	call	int13h
   764 00006063 59                  <1> 	pop	ecx
   765 00006064 7304                <1> 	jnc	short use_fd_boot_sector_params
   766 00006066 E2EA                <1> 	loop	read_fd_boot_sector_again
   767                              <1> 
   768                              <1> read_fd_boot_sector_stc_retn:
   769 00006068 F9                  <1> 	stc
   770                              <1> read_fd_boot_sector_retn:
   771 00006069 C3                  <1> 	retn
   772                              <1> 
   773                              <1> use_fd_boot_sector_params:
   774                              <1> 	;mov	esi, DOSBootSectorBuff
   775 0000606A 89DE                <1> 	mov	esi, ebx
   776 0000606C 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
   777 00006075 75F1                <1> 	jne	short read_fd_boot_sector_stc_retn
   778 00006077 66817E035346        <1>         cmp     word [esi+bs_FS_Identifier], 'SF'
   779 0000607D 0F85A2000000        <1>         jne     use_fd_fatfs_boot_sector_params
   780                              <1> 	;
   781 00006083 8A462D              <1> 	mov	al, [esi+bs_FS_LBA_Ready]
   782 00006086 884705              <1> 	mov	[edi+LD_FS_LBAYes], al
   783                              <1> 	;
   784                              <1> 	; 03/01/2010 CHS -> DOS FAT/BPB compatibility fix
   785 00006089 8A4608              <1> 	mov	al, [esi+bs_FS_MediaAttrib]
   786 0000608C 884706              <1> 	mov	[edi+LD_FS_MediaAttrib], al
   787                              <1> 	;
   788 0000608F 8A460A              <1>         mov	al, [esi+bs_FS_VersionMaj]
   789 00006092 884707              <1> 	mov	byte [edi+LD_FS_VersionMajor], al
   790 00006095 668B4606            <1> 	mov	ax, [esi+bs_FS_BytesPerSec]
   791 00006099 66894711            <1> 	mov	[edi+LD_FS_BytesPerSec], ax
   792 0000609D 8A462E              <1> 	mov	al, [esi+bs_FS_SecPerTrack]
   793 000060A0 6698                <1> 	cbw
   794 000060A2 6689471E            <1> 	mov	[edi+LD_FS_SecPerTrack], ax
   795 000060A6 8A462F              <1> 	mov	al, [esi+bs_FS_Heads]
   796                              <1> 	;cbw
   797 000060A9 66894720            <1> 	mov	[edi+LD_FS_NumHeads], ax
   798                              <1> 	;
   799 000060AD 8B4628              <1> 	mov	eax, [esi+bs_FS_UnDelDirD]
   800 000060B0 894722              <1> 	mov	[edi+LD_FS_UnDelDirD], eax
   801 000060B3 8B4618              <1> 	mov	eax, [esi+bs_FS_MATLocation]
   802 000060B6 89470C              <1> 	mov	[edi+LD_FS_MATLocation], eax
   803 000060B9 8B461C              <1> 	mov	eax, [esi+bs_FS_RootDirD]
   804 000060BC 894708              <1> 	mov	[edi+LD_FS_RootDirD], eax
   805 000060BF 8B460C              <1> 	mov	eax, [esi+bs_FS_BeginSector]
   806 000060C2 89476C              <1> 	mov	[edi+LD_FS_BeginSector], eax
   807 000060C5 8B4610              <1> 	mov	eax, [esi+bs_FS_VolumeSize]
   808 000060C8 894770              <1> 	mov	[edi+LD_FS_VolumeSize], eax
   809                              <1> 	;		
   810 000060CB 89FE                <1> 	mov	esi, edi
   811 000060CD 8B460C              <1>  	mov	eax, [esi+LD_FS_MATLocation]
   812                              <1> 	;add	eax, [edi+LD_FS_BeginSector]
   813                              <1> read_fd_MAT_sector_again:
   814                              <1> 	;mov	ebx, DOSBootSectorBuff
   815                              <1> 	;mov	ecx, 1
   816 000060D0 B101                <1> 	mov	cl, 1
   817 000060D2 E8A0850000          <1> 	call	chs_read
   818 000060D7 89DE                <1> 	mov	esi, ebx
   819 000060D9 7301                <1> 	jnc	short use_fdfs_mat_sector_params
   820                              <1> 	;jmp	short read_fd_boot_sector_retn
   821 000060DB C3                  <1> 	retn
   822                              <1> use_fdfs_mat_sector_params:
   823 000060DC 8B460C              <1> 	mov	eax, [esi+FS_MAT_DATLocation]
   824 000060DF 894714              <1> 	mov	[edi+LD_FS_DATLocation], eax
   825 000060E2 8B4610              <1> 	mov	eax, [esi+FS_MAT_DATScount]
   826 000060E5 894718              <1> 	mov	[edi+LD_FS_DATSectors], eax
   827 000060E8 8B4714              <1> 	mov	eax, [edi+FS_MAT_FreeSectors]
   828 000060EB 894774              <1> 	mov	[edi+LD_FS_FreeSectors], eax
   829 000060EE 8B4618              <1> 	mov	eax, [esi+FS_MAT_FirstFreeSector]
   830 000060F1 894778              <1> 	mov	[edi+LD_FS_FirstFreeSector], eax
   831                              <1> 	;
   832 000060F4 89FE                <1> 	mov	esi, edi
   833 000060F6 8B4608              <1>  	mov	eax, [esi+LD_FS_RootDirD]
   834                              <1> read_fd_RDT_sector_again:
   835                              <1> 	;mov	ebx, DOSBootSectorBuff
   836                              <1> 	;mov	cx, 1
   837 000060F9 B101                <1> 	mov	cl, 1
   838 000060FB E877850000          <1> 	call	chs_read
   839 00006100 89DE                <1> 	mov	esi, ebx
   840 00006102 7220                <1> 	jc	short read_fd_RDT_sector_retn
   841                              <1> use_fdfs_RDT_sector_params:
   842 00006104 8B461C              <1> 	mov	eax, [esi+FS_RDT_VolumeSerialNo]
   843 00006107 894728              <1> 	mov	[edi+LD_FS_VolumeSerial], eax
   844 0000610A 57                  <1> 	push	edi
   845                              <1> 	;mov	ecx, 16
   846 0000610B B110                <1> 	mov	cl, 16	
   847 0000610D 83C640              <1> 	add	esi, FS_RDT_VolumeName
   848 00006110 83C72C              <1> 	add	edi, LD_FS_VolumeName
   849 00006113 F3A5                <1> 	rep	movsd ; 64 bytes
   850 00006115 5E                  <1> 	pop	esi
   851 00006116 C6460300            <1> 	mov	byte [esi+LD_FATType], 0
   852 0000611A C64604A1            <1> 	mov	byte [esi+LD_FSType], 0A1h  
   853 0000611E E9A5000000          <1>         jmp     loc_cont_use_fd_boot_sector_params
   854                              <1> 
   855                              <1> read_fd_RDT_sector_stc_retn:
   856 00006123 F9                  <1> 	stc
   857                              <1> read_fd_RDT_sector_retn:
   858 00006124 C3                  <1> 	retn
   859                              <1> 
   860                              <1> use_fd_fatfs_boot_sector_params:
   861 00006125 807E2629            <1> 	cmp	byte [esi+BS_BootSig], 29h
   862 00006129 75F8                <1> 	jne	short read_fd_RDT_sector_stc_retn
   863 0000612B 807E15F0            <1> 	cmp	byte [esi+BPB_Media], 0F0h
   864 0000612F 72F3                <1> 	jb	short read_fd_RDT_sector_retn
   865 00006131 57                  <1> 	push	edi
   866 00006132 83C706              <1> 	add	edi, LD_BPB
   867                              <1> 	;mov	ecx, 16
   868 00006135 B110                <1> 	mov	cl, 16
   869 00006137 F3A5                <1> 	rep	movsd ; 64 bytes 
   870 00006139 5E                  <1> 	pop	esi
   871 0000613A 31C0                <1> 	xor	eax, eax
   872 0000613C 89466C              <1> 	mov	[esi+LD_StartSector], eax ; 0
   873 0000613F 668B461C            <1> 	mov	ax, [esi+LD_BPB+BPB_FATSz16]
   874 00006143 8A4E16              <1> 	mov	cl, [esi+LD_BPB+BPB_NumFATs] 
   875 00006146 F7E1                <1>   	mul	ecx
   876                              <1> 	; edx = 0 !
   877 00006148 668B5614            <1> 	mov	dx, [esi+LD_BPB+BPB_RsvdSecCnt]
   878 0000614C 66895660            <1> 	mov	[esi+LD_FATBegin], dx
   879                              <1> 	;add	eax, edx
   880 00006150 6601D0              <1> 	add	ax, dx
   881 00006153 894664              <1> 	mov	[esi+LD_ROOTBegin], eax
   882 00006156 894668              <1> 	mov	[esi+LD_DATABegin], eax 
   883 00006159 668B5617            <1> 	mov	dx, [esi+LD_BPB+BPB_RootEntCnt]
   884                              <1> 	;;shl	edx, 5 ; * 32 (Size of a directory entry)
   885                              <1> 	;shl	dx, 5
   886                              <1> 	;;add	edx, 511
   887                              <1> 	;add	dx, 511
   888                              <1> 	;;shr	edx, 9 ; edx = ((edx*32)+511) / 512
   889                              <1> 	;shr	dx, 9
   890 0000615D 6683C20F            <1> 	add	dx, 15 ; 06/07/2016 (+(512/32)-1)
   891 00006161 66C1EA04            <1> 	shr	dx, 4 ; / 16 (==16 entries per sector)
   892 00006165 015668              <1> 	add 	[esi+LD_DATABegin], edx ; + rd sectors
   893                              <1> 	;movzx	eax, word [esi+LD_BPB+BPB_TotalSec16]
   894 00006168 668B4619            <1> 	mov	ax, [esi+LD_BPB+BPB_TotalSec16]
   895 0000616C 894670              <1> 	mov	[esi+LD_TotalSectors], eax
   896 0000616F 2B4668              <1> 	sub	eax, [esi+LD_DATABegin]
   897                              <1>   	;movzx	ecx, byte [esi+LD_BPB+BPB_SecPerClust]
   898 00006172 8A4E13              <1> 	mov	cl, [esi+LD_BPB+BPB_SecPerClust]  
   899 00006175 80F901              <1> 	cmp	cl, 1
   900 00006178 7605                <1> 	jna	short save_fd_fatfs_cluster_count
   901                              <1> 	;sub	edx, edx
   902 0000617A 6629D2              <1> 	sub	dx, dx ; 0
   903                              <1> 	;sub	dl, dl ; 06/07/2016
   904 0000617D F7F1                <1> 	div	ecx
   905                              <1> save_fd_fatfs_cluster_count:
   906 0000617F 894678              <1> 	mov	[esi+LD_Clusters], eax
   907                              <1> 
   908                              <1>       ; Maximum Valid Cluster Number = EAX +1
   909                              <1>       ; with 2 reserved clusters= EAX +2
   910                              <1>  
   911                              <1> reset_FAT_buffer_decriptors:
   912 00006182 29C0                <1> 	sub	eax, eax ; 0  
   913 00006184 A2[BE390100]        <1> 	mov	[FAT_BuffValidData], al ; 0
   914 00006189 A2[BF390100]        <1> 	mov	[FAT_BuffDrvName], al ; 0
   915 0000618E A3[C2390100]        <1> 	mov	[FAT_BuffSector], eax ; 0
   916                              <1> 
   917                              <1> read_fd_FAT_sectors:
   918 00006193 BB001C0900          <1>   	mov	ebx, FAT_Buffer
   919 00006198 668B4614            <1> 	mov	ax, [esi+LD_BPB+BPB_RsvdSecCnt]
   920                              <1> 	;mov	ecx, 3
   921 0000619C B103                <1> 	mov	cl, 3 ; 3 sectors
   922 0000619E E8D4840000          <1> 	call	chs_read
   923 000061A3 7240                <1> 	jc	short read_fd_FAT_sectors_retn
   924                              <1> use_fd_FAT_sectors:
   925 000061A5 8A4602              <1> 	mov	al, [esi+LD_PhyDrvNo]
   926 000061A8 0441                <1> 	add	al, 'A' 
   927 000061AA A2[BF390100]        <1> 	mov	[FAT_BuffDrvName], al 
   928 000061AF C605[BE390100]01    <1>  	mov	byte [FAT_BuffValidData], 1
   929 000061B6 E82B000000          <1> 	call	fd_init_calculate_free_clusters
   930 000061BB 7228                <1> 	jc	short read_fd_FAT_sectors_retn
   931                              <1>   
   932                              <1> loc_use_fd_boot_sector_params_FAT:
   933 000061BD C6460301            <1> 	mov	byte [esi+LD_FATType], 1 ; FAT 12
   934 000061C1 C6460401            <1> 	mov	byte [esi+LD_FSType], 1
   935 000061C5 8B462D              <1>         mov     eax, [esi+LD_BPB+VolumeID]
   936                              <1> loc_cont_use_fd_boot_sector_params:
   937 000061C8 8A7E02              <1> 	mov	bh, [esi+LD_PhyDrvNo]
   938 000061CB 887E7D              <1> 	mov	[esi+LD_DParamEntry], bh
   939 000061CE 88FB                <1> 	mov	bl, bh
   940 000061D0 80C341              <1> 	add	bl, 'A'
   941 000061D3 881E                <1> 	mov	byte [esi+LD_Name], bl
   942 000061D5 C6460101            <1> 	mov	byte [esi+LD_DiskType], 1
   943 000061D9 C6460500            <1> 	mov	byte [esi+LD_LBAYes], 0
   944 000061DD C6467C00            <1> 	mov	byte [esi+LD_PartitionEntry], 0
   945 000061E1 C6467E06            <1> 	mov	byte [esi+LD_MediaChanged], 6 ; Volume Name Reset
   946                              <1> 
   947                              <1> read_fd_FAT_sectors_retn:
   948 000061E5 C3                  <1> 	retn   
   949                              <1> 
   950                              <1> fd_init_calculate_free_clusters:
   951                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
   952                              <1> 	; 04/07/2009
   953                              <1> 	; INPUT ->
   954                              <1> 	;     ESI = Logical DOS drive description table address
   955                              <1> 	; OUTPUT ->
   956                              <1> 	;    [ESI+LD_FreeSectors] will be set
   957                              <1> 	
   958 000061E6 29C0                <1> 	sub	eax, eax
   959 000061E8 894674              <1> 	mov	[esi+LD_FreeSectors], eax ; 0
   960 000061EB B002                <1> 	mov	al, 2 ; eax = 2
   961                              <1> 
   962                              <1> fd_init_loop_get_next_cluster:
   963 000061ED E830000000          <1> 	call	fd_init_get_next_cluster
   964 000061F2 722D                <1> 	jc	short fd_init_calculate_free_clusters_retn
   965                              <1> 
   966                              <1> fd_init_free_fat_clusters:
   967                              <1> 	;cmp 	eax, 0
   968                              <1> 	;ja	short fd_init_pass_inc_free_cluster_count
   969                              <1> 	;and	eax, eax
   970                              <1> 	;jnz	short fd_init_pass_inc_free_cluster_count
   971 000061F4 6621C0              <1> 	and	ax, ax
   972 000061F7 7504                <1> 	jnz	short fd_init_pass_inc_free_cluster_count
   973                              <1> 	;inc	dword [esi+LD_FreeSectors]
   974 000061F9 66FF4674            <1>         inc	word [esi+LD_FreeSectors]
   975                              <1>     
   976                              <1> fd_init_pass_inc_free_cluster_count:
   977                              <1>   	;mov	eax, [FAT_CurrentCluster]
   978 000061FD 66A1[BA390100]      <1> 	mov	ax, [FAT_CurrentCluster]
   979                              <1> 	;cmp	eax, [esi+LD_Clusters]
   980 00006203 663B4678            <1> 	cmp	ax, [esi+LD_Clusters]
   981 00006207 7704                <1> 	ja	short short retn_from_fd_init_calculate_free_clusters
   982                              <1> 	;inc	eax
   983 00006209 6640                <1> 	inc	ax
   984 0000620B EBE0                <1> 	jmp	short fd_init_loop_get_next_cluster
   985                              <1> 
   986                              <1> retn_from_fd_init_calculate_free_clusters:
   987 0000620D 8A4613              <1>   	mov	al, [esi+LD_BPB+BPB_SecPerClust]
   988 00006210 3C01                <1>   	cmp	al, 1
   989 00006212 760D                <1> 	jna	short fd_init_calculate_free_clusters_retn
   990                              <1> 	;movzx	eax, al
   991 00006214 6698                <1> 	cbw
   992                              <1> 	;mov	ecx, [esi+LD_FreeSectors]
   993 00006216 668B4E74            <1> 	mov	cx, [esi+LD_FreeSectors] ; Count of free clusters
   994                              <1>   	;mul	ecx
   995 0000621A 66F7E1              <1> 	mul	cx
   996                              <1> 	;mov	[esi+LD_FreeSectors], eax
   997 0000621D 66894674            <1> 	mov	[esi+LD_FreeSectors], ax
   998                              <1> fd_init_calculate_free_clusters_retn:
   999 00006221 C3                  <1> 	retn
  1000                              <1> 
  1001                              <1> fd_init_get_next_cluster:
  1002                              <1> 	; 04/02/2016
  1003                              <1> 	; 02/02/2016
  1004                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1005                              <1> 	; 04/07/2009
  1006                              <1> 	; INPUT ->
  1007                              <1> 	;    EAX = Current cluster
  1008                              <1> 	;    ESI = Logical DOS drive description table address
  1009                              <1> 	;    EDX = 0
  1010                              <1> 	; OUTPUT ->
  1011                              <1> 	;    EAX = Next cluster
  1012                              <1> 
  1013 00006222 A3[BA390100]        <1> 	mov	[FAT_CurrentCluster], eax
  1014                              <1> fd_init_get_next_cluster_readnext:
  1015 00006227 29D2                <1> 	sub	edx, edx ; 0
  1016 00006229 BB00040000          <1>   	mov	ebx, 1024 ; 400h
  1017 0000622E F7F3                <1>   	div	ebx
  1018                              <1>   	; EAX = Count of 3 FAT sectors
  1019                              <1>   	; EDX = Buffer entry index
  1020 00006230 89C1                <1> 	mov	ecx, eax
  1021                              <1> 	;mov	eax, 3
  1022 00006232 B003                <1> 	mov	al, 3
  1023 00006234 F7E2                <1> 	mul	edx ; Multiply by 3
  1024 00006236 66D1E8              <1> 	shr	ax, 1 ; Divide by 2
  1025 00006239 89C3                <1> 	mov	ebx, eax ; Buffer byte offset
  1026 0000623B 81C3001C0900        <1> 	add	ebx, FAT_Buffer
  1027 00006241 89C8                <1> 	mov	eax, ecx
  1028                              <1> 	;mov	edx, 3
  1029 00006243 66BA0300            <1> 	mov	dx, 3
  1030 00006247 F7E2                <1> 	mul	edx 
  1031                              <1>   	; EAX = FAT Beginning Sector
  1032                              <1> 	; EDX = 0
  1033 00006249 8A0E                <1> 	mov	cl, [esi+LD_Name]
  1034                              <1> 	;cmp	byte [FAT_BuffValidData], 0
  1035                              <1> 	;jna	short fd_init_load_FAT_sectors0
  1036 0000624B 3A0D[BF390100]      <1> 	cmp	cl, [FAT_BuffDrvName]
  1037 00006251 751E                <1> 	jne	short fd_init_load_FAT_sectors0
  1038 00006253 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
  1039 00006259 751C                <1> 	jne	short fd_init_load_FAT_sectors1
  1040                              <1> 	;mov	eax, [FAT_CurrentCluster]
  1041 0000625B A0[BA390100]        <1> 	mov	al, [FAT_CurrentCluster]
  1042                              <1> 	;shr	eax, 1
  1043 00006260 D0E8                <1> 	shr	al, 1
  1044 00006262 668B03              <1> 	mov	ax, [ebx]
  1045 00006265 7306                <1>   	jnc	short fd_init_gnc_even
  1046 00006267 66C1E804            <1> 	shr	ax, 4
  1047                              <1> fd_init_gnc_clc_retn:
  1048 0000626B F8                  <1> 	clc
  1049 0000626C C3                  <1> 	retn
  1050                              <1> 
  1051                              <1> fd_init_gnc_even:
  1052 0000626D 80E40F              <1> 	and	ah, 0Fh
  1053 00006270 C3                  <1> 	retn
  1054                              <1> 
  1055                              <1> fd_init_load_FAT_sectors0:
  1056 00006271 880D[BF390100]      <1> 	mov 	[FAT_BuffDrvName], cl
  1057                              <1> fd_init_load_FAT_sectors1:
  1058 00006277 C605[BE390100]00    <1> 	mov	byte [FAT_BuffValidData], 0
  1059 0000627E A3[C2390100]        <1> 	mov	[FAT_BuffSector], eax
  1060 00006283 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1061 00006286 BB001C0900          <1>  	mov	ebx, FAT_Buffer
  1062                              <1> 	;movzx	ecx, word [esi+LD_BPB+BPB_FATSz16]
  1063 0000628B 668B4E1C            <1> 	mov	cx, [esi+LD_BPB+BPB_FATSz16]
  1064 0000628F 662B0D[C2390100]    <1> 	sub	cx, [FAT_BuffSector]
  1065                              <1>         ;cmp	ecx, 3
  1066 00006296 6683F903            <1> 	cmp	cx, 3
  1067 0000629A 7605                <1> 	jna	short fdinit_pass_fix_sector_count_3
  1068                              <1> 	;mov	ecx, 3
  1069 0000629C B903000000          <1> 	mov	ecx, 3
  1070                              <1> fdinit_pass_fix_sector_count_3:  
  1071 000062A1 E8D1830000          <1> 	call	chs_read
  1072 000062A6 730D                <1> 	jnc	short fd_init_FAT_sectors_no_load_error
  1073 000062A8 C605[BE390100]00    <1> 	mov	byte [FAT_BuffValidData], 0
  1074                              <1> 		; Drv not ready or read Error !
  1075 000062AF B80F000000          <1> 	mov	eax, ERR_DRV_NOT_RDY ; 15
  1076                              <1> 	;xor	edx, edx
  1077 000062B4 C3                  <1> 	retn
  1078                              <1> 
  1079                              <1> fd_init_FAT_sectors_no_load_error:
  1080 000062B5 C605[BE390100]01    <1> 	mov	byte [FAT_BuffValidData], 1
  1081 000062BC A1[BA390100]        <1> 	mov	eax, [FAT_CurrentCluster]
  1082 000062C1 E961FFFFFF          <1>         jmp     fd_init_get_next_cluster_readnext
  1083                              <1> 
  1084                              <1> get_FAT_volume_name:
  1085                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1086                              <1> 	; 12/09/2009
  1087                              <1> 	; INPUT ->
  1088                              <1> 	;	BH = Logical DOS drive number (0,1,2,3,4 ...)
  1089                              <1> 	;       BL = 0
  1090                              <1> 	; OUTPUT ->
  1091                              <1> 	;	CF = 0 -> ESI = Volume name address
  1092                              <1> 	; 	CF = 1 -> Root volume name not found
  1093                              <1> 
  1094                              <1> 	;mov 	ah, 0FFh
  1095                              <1> 	;mov 	al, [Last_Dos_DiskNo]
  1096                              <1> 	;cmp 	al, bh
  1097                              <1> 	;jb     short loc_gfvn_dir_load_err
  1098                              <1> 
  1099 000062C6 89DE                <1> 	mov	esi, ebx
  1100 000062C8 81E600FF0000        <1> 	and	esi, 0FF00h ; esi = bh
  1101 000062CE 81C600010900        <1> 	add	esi, Logical_DOSDisks
  1102 000062D4 8A06                <1> 	mov     al, [esi+LD_Name]
  1103 000062D6 8A6603              <1> 	mov     ah, [esi+LD_FATType]
  1104 000062D9 80FC01              <1> 	cmp     ah, 1
  1105 000062DC 7210                <1> 	jb    	short loc_gfvn_dir_load_err
  1106 000062DE 3C41                <1> 	cmp 	al, 'A'
  1107 000062E0 720C                <1> 	jb      short loc_gfvn_dir_load_err
  1108 000062E2 80FC02              <1> 	cmp 	ah, 2 
  1109 000062E5 7708                <1> 	ja      short get_FAT32_root_cluster
  1110                              <1> 	
  1111 000062E7 E89B4E0000          <1> 	call    load_FAT_root_directory
  1112 000062EC 730B                <1> 	jnc     short loc_get_volume_name
  1113                              <1> 
  1114                              <1> loc_gfvn_dir_load_err:
  1115 000062EE C3                  <1> 	retn
  1116                              <1> 
  1117                              <1> get_FAT32_root_cluster:
  1118 000062EF 8B4632              <1> 	mov	eax, [esi+LD_BPB+BPB_RootClus]
  1119 000062F2 E81B4F0000          <1> 	call    load_FAT_sub_directory
  1120 000062F7 7224                <1> 	jc	short loc_get_volume_name_retn
  1121                              <1> 
  1122                              <1> loc_get_volume_name:
  1123 000062F9 BE00000800          <1>         mov     esi, Directory_Buffer
  1124 000062FE 6631C9              <1> 	xor	cx, cx ; 0
  1125                              <1> check_root_volume_name:
  1126 00006301 8A06                <1> 	mov	al, [esi]
  1127 00006303 08C0                <1> 	or      al, al
  1128 00006305 7416                <1> 	jz      short loc_get_volume_name_retn
  1129 00006307 807E0B08            <1> 	cmp     byte [esi+0Bh], 08h
  1130 0000630B 7410                <1> 	je      short loc_get_volume_name_retn
  1131 0000630D 663B0D[D3390100]    <1> 	cmp     cx, [DirBuff_LastEntry]
  1132 00006314 7308                <1> 	jnb     short pass_check_root_volume_name
  1133 00006316 6641                <1> 	inc     cx
  1134 00006318 83C620              <1> 	add     esi, 32
  1135 0000631B EBE4                <1> 	jmp     short check_root_volume_name
  1136                              <1> 
  1137                              <1> loc_get_volume_name_retn:
  1138 0000631D C3                  <1> 	retn
  1139                              <1>     
  1140                              <1> pass_check_root_volume_name:
  1141 0000631E 803D[CF390100]03    <1> 	cmp	byte [DirBuff_FATType], 3
  1142 00006325 7230                <1> 	jb	short loc_get_volume_name_retn_xor
  1143                              <1> 
  1144 00006327 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1145 0000632C BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1146 00006331 31C0                <1> 	xor	eax, eax
  1147 00006333 8A25[CE390100]      <1> 	mov	ah, [DirBuff_DRV]
  1148 00006339 80EC41              <1> 	sub	ah, 'A' 
  1149 0000633C 01C6                <1> 	add	esi, eax
  1150 0000633E A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
  1151 00006343 E8E44C0000          <1> 	call	get_next_cluster
  1152 00006348 7305                <1> 	jnc 	short loc_gfvn_load_FAT32_dir_cluster
  1153                              <1>   	
  1154 0000634A 83F801              <1> 	cmp     eax, 1
  1155 0000634D F5                  <1> 	cmc
  1156 0000634E C3                  <1> 	retn
  1157                              <1>   
  1158                              <1> loc_gfvn_load_FAT32_dir_cluster:
  1159 0000634F E8BE4E0000          <1> 	call	load_FAT_sub_directory
  1160 00006354 73A3                <1> 	jnc	short loc_get_volume_name
  1161 00006356 C3                  <1> 	retn
  1162                              <1> 
  1163                              <1> loc_get_volume_name_retn_xor:
  1164 00006357 31C0                <1> 	xor 	eax, eax
  1165 00006359 C3                  <1> 	retn
  1166                              <1> 
  1167                              <1> get_media_change_status:
  1168                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1169                              <1> 	; 09/09/2009
  1170                              <1> 	; INPUT:
  1171                              <1> 	;     DL = Drive number (physical)
  1172                              <1> 	; OUTPUT: clc & AH = 6 media changed
  1173                              <1> 	;     clc & AH = 0 media not changed         
  1174                              <1> 	;     stc -> Drive not ready or an error 
  1175                              <1>   
  1176 0000635A B416                <1> 	mov	ah, 16h
  1177 0000635C E82BDEFFFF          <1>   	call	int13h
  1178 00006361 80FC06              <1> 	cmp	ah, 06h
  1179 00006364 7405                <1> 	je	short loc_gmc_status_retn
  1180 00006366 08E4                <1> 	or	ah, ah
  1181 00006368 7401                <1> 	jz	short loc_gmc_status_retn
  1182                              <1> loc_gmc_status_stc_retn:    
  1183 0000636A F9                  <1> 	stc
  1184                              <1> loc_gmc_status_retn:
  1185 0000636B C3                  <1> 	retn
  2135                                  %include 'trdosk3.s' ; 06/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - MAIN PROGRAM : trdosk3.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 07/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 06/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    11                              <1> ; MAINPROG.ASM (09/11/2011)
    12                              <1> ; ****************************************************************************
    13                              <1> ; MAINPROG.ASM [ TRDOS KERNEL - COMMAND EXECUTER SECTION - MAIN PROGRAM ]
    14                              <1> ; (c) 2004-2011  Erdogan TAN  [ 17/01/2004 ]  Last Update: 09/11/2011
    15                              <1> ; CMD_INTR.ASM [ TRDOS Command Interpreter Procedure ] Last Update: 09/11/2011
    16                              <1> ; DIR.ASM [ DIRECTORY FUNCTIONS ] Last Update: 09/10/2011
    17                              <1> ; FILE.ASM [ FILE FUNCTIONS ] Last Update: 09/10/2011
    18                              <1> 
    19                              <1> change_current_drive:
    20                              <1> 	; 16/10/2016
    21                              <1> 	; 02/02/2016
    22                              <1> 	; 15/01/2016 (TRDOS 386 = TRDOS v2.0)
    23                              <1> 	; 18/08/2011
    24                              <1> 	; 09/09/2009
    25                              <1> 	; INPUT:
    26                              <1> 	;   DL = Logical DOS Drive Number
    27                              <1> 	; OUTPUT:
    28                              <1> 	;  cf=1 -> Not successful
    29                              <1> 	;   EAX = Error code
    30                              <1> 	;  cf=0 ->
    31                              <1> 	;   EAX = 0 (successful)
    32                              <1> 
    33 0000636C 31DB                <1> 	xor	ebx, ebx
    34 0000636E 88D7                <1> 	mov	bh, dl
    35                              <1> 
    36                              <1> 	;cmp	dl, 1
    37                              <1> 	;jna	short loc_ccdrv_initial_media_change_check
    38                              <1> 	;cmp	bh, [Last_Dos_DiskNo]
    39                              <1> 	;ja	short loc_ccdrv_drive_not_ready_err
    40                              <1> 
    41                              <1> loc_ccdrv_initial_media_change_check:
    42 00006370 BE00010900          <1> 	mov	esi, Logical_DOSDisks
    43 00006375 01DE                <1> 	add	esi, ebx
    44                              <1> loc_ccdrv_dos_drive_name_check:
    45 00006377 80FA02              <1> 	cmp	dl, 2
    46 0000637A 720F                <1> 	jb	short loc_ccdrv_dos_drive_name_check_ok
    47                              <1> 
    48 0000637C 8A06                <1> 	mov	al, [esi+LD_Name]
    49 0000637E 2C41                <1> 	sub	al, 'A'
    50 00006380 38D0                <1> 	cmp	al, dl
    51 00006382 7407                <1> 	je	short loc_ccdrv_dos_drive_name_check_ok
    52                              <1> 
    53                              <1> loc_ccdrv_drive_not_ready_err:
    54                              <1> 	; 16/10/2016 (15h -> 15)
    55 00006384 B80F000000          <1> 	mov	eax, 15 ; Drive not ready
    56                              <1> loc_change_current_drive_stc_retn:
    57 00006389 F9                  <1> 	stc
    58 0000638A C3                  <1> 	retn  
    59                              <1> 
    60                              <1> loc_ccdrv_dos_drive_name_check_ok:
    61 0000638B 8A667E              <1> 	mov	ah, [esi+LD_MediaChanged]
    62 0000638E 80FC06              <1> 	cmp	ah, 6  ; VOLUME NAME CHECK/MOVE SIGN
    63 00006391 7455                <1> 	je	short loc_ccdrv_get_FAT_volume_name_0
    64                              <1> 
    65 00006393 80FA01              <1> 	cmp	dl, 1
    66 00006396 777D                <1> 	ja	short loc_gmcs_init_drv_hd
    67                              <1> 
    68                              <1> loc_gmcs_init_drv_fd:
    69 00006398 08E4                <1> 	or	ah, ah 
    70                              <1> 	; AH = 1 is initialization sign (invalid_fd_parameter)
    71 0000639A 7517                <1> 	jnz	short loc_ccdrv_call_fd_init
    72                              <1> 
    73 0000639C E8B9FFFFFF          <1> 	call	get_media_change_status
    74 000063A1 72E1                <1> 	jc	short loc_ccdrv_drive_not_ready_err
    75                              <1> 
    76 000063A3 20E4                <1> 	and	ah, ah
    77 000063A5 7476                <1> 	jz	short loc_change_current_drv3
    78                              <1> 
    79 000063A7 80F406              <1> 	xor	ah, 6
    80 000063AA 75D8                <1> 	jnz	short loc_ccdrv_drive_not_ready_err
    81                              <1> 
    82                              <1> loc_ccdrv_call_fd_init_check_vol_id:
    83 000063AC E8490A0000          <1> 	call	get_volume_serial_number
    84 000063B1 730D                <1> 	jnc	short loc_ccdrv_check_vol_serial
    85                              <1> 
    86                              <1> loc_ccdrv_call_fd_init:
    87 000063B3 E872FCFFFF          <1> 	call	floppy_drv_init
    88 000063B8 731A                <1> 	jnc	short loc_reset_drv_fd_current_dir
    89                              <1> 
    90                              <1> loc_ccdrv_fdinit_fail_retn:
    91                              <1> 	; 16/10/2016
    92 000063BA B80F000000          <1> 	mov	eax, 15 ; Drive not ready
    93 000063BF C3                  <1> 	retn
    94                              <1> 
    95                              <1> loc_ccdrv_check_vol_serial:
    96 000063C0 A3[9C310100]        <1> 	mov	[Current_VolSerial], eax
    97                              <1> 	;mov	dl, bh
    98 000063C5 E860FCFFFF          <1> 	call	floppy_drv_init
    99 000063CA 72EE                <1> 	jc	short loc_ccdrv_fdinit_fail_retn
   100                              <1> 
   101 000063CC 3B05[9C310100]      <1> 	cmp	eax, [Current_VolSerial]
   102 000063D2 7445                <1> 	je	short loc_change_current_drv2
   103                              <1> 
   104                              <1> loc_reset_drv_fd_current_dir:
   105 000063D4 31C0                <1> 	xor	eax, eax              
   106 000063D6 88467F              <1>         mov	[esi+LD_CDirLevel], al
   107 000063D9 89F7                <1> 	mov	edi, esi
   108 000063DB 81C780000000        <1> 	add	edi, LD_CurrentDirectory
   109 000063E1 B920000000          <1> 	mov	ecx, 32
   110 000063E6 F3AB                <1> 	rep	stosd   
   111                              <1>  
   112                              <1> loc_ccdrv_get_FAT_volume_name_0:
   113 000063E8 8A4603              <1> 	mov	al, [esi+LD_FATType]
   114 000063EB 08C0                <1> 	or	al, al
   115 000063ED 742A                <1> 	jz	short loc_change_current_drv2
   116                              <1> 
   117 000063EF 56                  <1> 	push	esi 
   118 000063F0 3C02                <1> 	cmp	al, 2
   119 000063F2 7705                <1> 	ja	short loc_ccdrv_get_FAT32_vol_name
   120                              <1>              
   121                              <1> loc_ccdrv_get_FAT2_16_vol_name:
   122 000063F4 83C631              <1> 	add	esi, LD_BPB + VolumeLabel
   123 000063F7 EB03                <1> 	jmp	short loc_ccdrv_get_FAT_volume_name_1
   124                              <1> 
   125                              <1> loc_ccdrv_get_FAT32_vol_name:
   126 000063F9 83C64D              <1> 	add	esi, LD_BPB + FAT32_VolLab
   127                              <1> loc_ccdrv_get_FAT_volume_name_1:
   128 000063FC 53                  <1> 	push	ebx
   129 000063FD 56                  <1> 	push	esi
   130 000063FE E8C3FEFFFF          <1> 	call	get_FAT_volume_name
   131 00006403 5F                  <1> 	pop	edi
   132 00006404 5B                  <1> 	pop	ebx
   133                              <1> 	; BL = 0
   134 00006405 720B                <1> 	jc	short loc_change_current_drv1
   135 00006407 20C0                <1> 	and	al, al
   136 00006409 7407                <1> 	jz	short loc_change_current_drv1
   137                              <1> 
   138                              <1> loc_ccdrv_move_FAT_volume_name:
   139 0000640B B90B000000          <1> 	mov	ecx, 11
   140 00006410 F3A4                <1> 	rep	movsb
   141                              <1> 
   142                              <1> loc_change_current_drv1:
   143 00006412 5E                  <1> 	pop	esi
   144 00006413 EB04                <1> 	jmp	short loc_change_current_drv2
   145                              <1> 
   146                              <1> loc_gmcs_init_drv_hd:
   147 00006415 08E4                <1> 	or	ah, ah
   148 00006417 7404                <1> 	jz	short loc_change_current_drv3
   149                              <1> 	; BL = 0, BH = Logical DOS drive number
   150                              <1> loc_change_current_drv2:
   151 00006419 C6467E00            <1> 	mov	byte [esi+LD_MediaChanged], 0
   152                              <1> loc_change_current_drv3:
   153 0000641D 883D[A6310100]      <1> 	mov	[Current_Drv], bh
   154                              <1> 
   155                              <1> 	;call	restore_current_directory
   156                              <1> 	;retn
   157                              <1> 
   158                              <1> restore_current_directory:
   159                              <1> 	; 11/02/2016
   160                              <1> 	; 15/01/2016 (TRDOS 386 = TRDOS v2.0)
   161                              <1> 	; 25/01/2010
   162                              <1> 	; 12/10/2009
   163                              <1> 	;
   164                              <1> 	; INPUT:
   165                              <1> 	;   ESI = Logical DOS Drive Description Table
   166                              <1> 	;
   167                              <1> 	; OUTPUT:
   168                              <1> 	;   ESI = Logical DOS Drive Description Table
   169                              <1> 	;   EDI = offset Current_Dir_Drv 
   170                              <1> 
   171 00006423 8A4603              <1> 	mov	al, [esi+LD_FATType]
   172 00006426 A2[A5310100]        <1> 	mov	[Current_FATType], al
   173                              <1> 
   174 0000642B 8A26                <1> 	mov	ah, [esi+LD_Name] 
   175 0000642D 8825[A7310100]      <1> 	mov	[Current_Dir_Drv], ah
   176                              <1> 
   177 00006433 20C0                <1> 	and	al, al
   178 00006435 741D                <1> 	jz	short loc_restore_FS_current_directory
   179                              <1> 
   180                              <1> loc_restore_FAT_current_directory:
   181 00006437 8A667F              <1> 	mov	ah, [esi+LD_CDirLevel]
   182 0000643A 8825[A4310100]      <1> 	mov	[Current_Dir_Level], ah
   183 00006440 08E4                <1> 	or	ah, ah
   184 00006442 7416                <1>         jz	short loc_ccdrv_reset_cdir_FAT_12_16_32_fcluster
   185                              <1> 
   186 00006444 0FB6D4              <1> 	movzx	edx, ah
   187 00006447 C0E204              <1> 	shl	dl, 4 ; * 16
   188 0000644A 01F2                <1>         add	edx, esi
   189 0000644C 8B828C000000        <1> 	mov	eax, [edx+LD_CurrentDirectory+12]
   190 00006452 EB2C                <1> 	jmp	short loc_ccdrv_reset_cdir_FAT_fcluster
   191                              <1> 
   192                              <1> loc_restore_FS_current_directory:
   193 00006454 E8F44D0000          <1> 	call	load_current_FS_directory 
   194 00006459 C3                  <1> 	retn 
   195                              <1> 
   196                              <1> loc_ccdrv_reset_cdir_FAT_12_16_32_fcluster:
   197 0000645A 3C03                <1> 	cmp	al, 3
   198 0000645C 7205                <1> 	jb	short loc_ccdrv_reset_cdir_FAT_12_16_fcluster
   199                              <1> loc_ccdrv_reset_cdir_FAT32_fcluster:
   200 0000645E 8B4632              <1> 	mov	eax, [esi+LD_BPB+FAT32_RootFClust]
   201 00006461 EB04                <1> 	jmp	short loc_ccdrv_check_rootdir_sign
   202                              <1> loc_ccdrv_reset_cdir_FAT_12_16_fcluster:   
   203 00006463 30C0                <1> 	xor	al, al  ; xor eax, eax
   204 00006465 31D2                <1> 	xor	edx, edx
   205                              <1> loc_ccdrv_check_rootdir_sign:
   206 00006467 80BE8000000000      <1> 	cmp	byte [esi+LD_CurrentDirectory], 0
   207 0000646E 7510                <1> 	jne	short loc_ccdrv_reset_cdir_FAT_fcluster
   208                              <1> loc_ccdrv_set_rootdir_FAT_fcluster:
   209 00006470 89868C000000        <1>         mov     [esi+LD_CurrentDirectory+12], eax
   210 00006476 C78680000000524F4F- <1> 	mov	dword [esi+LD_CurrentDirectory], 'ROOT'
   210 0000647F 54                  <1>
   211                              <1> 
   212                              <1> loc_ccdrv_reset_cdir_FAT_fcluster:
   213 00006480 A3[A0310100]        <1> 	mov	[Current_Dir_FCluster], eax
   214                              <1> 
   215 00006485 BF[073A0100]        <1> 	mov	edi, PATH_Array
   216 0000648A 89F2                <1> 	mov	edx, esi
   217 0000648C 81C680000000        <1> 	add	esi, LD_CurrentDirectory
   218 00006492 B920000000          <1> 	mov	ecx, 32
   219 00006497 F3A5                <1> 	rep	movsd
   220                              <1> 
   221 00006499 E8832D0000          <1> 	call	change_prompt_dir_string
   222                              <1> 	
   223 0000649E 89D6                <1> 	mov	esi, edx
   224                              <1> 	
   225 000064A0 29C0                <1>         sub	eax, eax
   226                              <1>        ;sub	edx, edx
   227 000064A2 BF[A7310100]        <1> 	mov	edi, Current_Dir_Drv
   228                              <1> 
   229 000064A7 A2[0DED0000]        <1> 	mov	[Restore_CDIR], al ; 0
   230 000064AC C3                  <1> 	retn
   231                              <1> 
   232                              <1> dos_prompt:
   233                              <1> 	; 06/05/2016
   234                              <1> 	; 30/01/2016
   235                              <1> 	; 29/01/2016
   236                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
   237                              <1> 	; 15/09/2011
   238                              <1> 	; 13/09/2009
   239                              <1> 	; 2004-2005
   240                              <1> 
   241                              <1> 	; 06/05/2016
   242 000064AD C705[643E0100]-     <1> 	mov	dword [mainprog_return_addr], return_from_cmd_interpreter
   242 000064B3 [61650000]          <1>
   243                              <1> 
   244                              <1> loc_TRDOS_prompt:
   245 000064B7 BF[A6320100]        <1> 	mov	edi, TextBuffer
   246 000064BC C6075B              <1> 	mov	byte [edi], "["
   247 000064BF 47                  <1> 	inc	edi
   248 000064C0 BE[60ED0000]        <1> 	mov	esi, TRDOSPromptLabel
   249                              <1> get_next_prompt_label_char:
   250 000064C5 803E20              <1> 	cmp	byte [esi], 20h
   251 000064C8 7203                <1> 	jb	short pass_prompt_label
   252 000064CA A4                  <1> 	movsb
   253 000064CB EBF8                <1> 	jmp	short get_next_prompt_label_char
   254                              <1> pass_prompt_label:
   255 000064CD C6075D              <1> 	mov	byte [edi], "]"
   256 000064D0 47                  <1> 	inc	edi
   257 000064D1 C60720              <1> 	mov	byte [edi], 20h
   258 000064D4 47                  <1> 	inc	edi
   259 000064D5 BE[A7310100]        <1> 	mov	esi, Current_Dir_Drv
   260 000064DA 66A5                <1> 	movsw
   261 000064DC A4                  <1> 	movsb 
   262                              <1> loc_prompt_current_directory:
   263 000064DD 803E20              <1> 	cmp	byte [esi], 20h
   264 000064E0 7203                <1> 	jb	short pass_prompt_current_directory
   265 000064E2 A4                  <1> 	movsb
   266 000064E3 EBF8                <1> 	jmp	short loc_prompt_current_directory  
   267                              <1> pass_prompt_current_directory:
   268 000064E5 C6073E              <1> 	mov	byte [edi], '>'
   269 000064E8 47                  <1> 	inc	edi
   270 000064E9 C60700              <1> 	mov	byte [edi], 0  
   271 000064EC BE[A6320100]        <1> 	mov	esi, TextBuffer
   272 000064F1 E876F5FFFF          <1> 	call	print_msg
   273                              <1>         
   274                              <1> 	;sub	bh, bh ; video page = 0
   275                              <1> 	;call	get_cpos ; get cursor position
   276 000064F6 668B15[FE300100]    <1> 	mov	dx, [CURSOR_POSN] ; video page 0
   277 000064FD 8815[06320100]      <1> 	mov	[CursorColumn], dl
   278                              <1> 
   279                              <1> 	; 30/01/2016 (to show cursor on the row, again)
   280                              <1> 	; (Initial color attributes of video page 0 is 0)
   281                              <1> 	; (see: 'StartPMP' in trdos386.s)
   282                              <1> 	; 
   283                              <1> 	;mov	edi, 0B8000h ; start of video page 0
   284                              <1> 	;movzx	ecx, dl ; column	 
   285                              <1> 	;mov	al, 80
   286                              <1> 	;mul	dh
   287                              <1> 	;add	ax, cx
   288                              <1> 	;shl	ax, 1 ; character + attribute
   289                              <1> 	;add	di, ax ; (2*80*row) + (2*column)
   290                              <1> 	;neg	cl
   291                              <1> 	;add	cl, 80
   292                              <1> 	;mov	ax, 700h ;  ah = 7 (color attribute)
   293                              <1> 	;rep	stosw	
   294                              <1> 
   295                              <1> loc_rw_char:
   296 00006503 E899000000          <1> 	call	rw_char
   297                              <1> loc_move_command:
   298 00006508 BE[56320100]        <1> 	mov	esi, CommandBuffer
   299 0000650D 89F7                <1> 	mov	edi, esi
   300 0000650F 31C9                <1> 	xor	ecx, ecx
   301                              <1> first_command_char:
   302 00006511 AC                  <1> 	lodsb
   303 00006512 3C20                <1> 	cmp	al, 20h
   304 00006514 772E                <1> 	ja	short pass_space_control
   305 00006516 7241                <1> 	jb	short loc_move_cmd_arguments_ok
   306 00006518 81FE[A5320100]      <1> 	cmp	esi, CommandBuffer + 79
   307 0000651E 72F1                <1> 	jb	short first_command_char
   308 00006520 EB37                <1> 	jmp	short loc_move_cmd_arguments_ok
   309                              <1> 
   310                              <1> next_command_char:
   311 00006522 AC                  <1> 	lodsb
   312 00006523 3C20                <1> 	cmp	al, 20h
   313 00006525 771D                <1> 	ja	short pass_space_control
   314 00006527 7230                <1> 	jb	short loc_move_cmd_arguments_ok
   315                              <1> 
   316                              <1> loc_1st_cmd_arg: ; 30/01/2016
   317 00006529 AC                  <1> 	lodsb
   318 0000652A 3C20                <1> 	cmp	al, 20h
   319 0000652C 74FB                <1> 	je	short loc_1st_cmd_arg
   320 0000652E 7229                <1> 	jb	short loc_move_cmd_arguments_ok
   321                              <1> 	
   322 00006530 C60700              <1>         mov     byte [edi], 0
   323 00006533 47                  <1> 	inc	edi
   324                              <1> 
   325                              <1> loc_move_cmd_arguments:
   326 00006534 AA                  <1> 	stosb
   327 00006535 81FE[A5320100]      <1> 	cmp	esi, CommandBuffer + 79
   328 0000653B 731C                <1> 	jnb	short loc_move_cmd_arguments_ok
   329 0000653D AC                  <1>         lodsb
   330 0000653E 3C20                <1> 	cmp	al, 20h
   331 00006540 73F2                <1> 	jnb	short loc_move_cmd_arguments
   332 00006542 EB15                <1> 	jmp	short loc_move_cmd_arguments_ok
   333                              <1> 
   334                              <1> pass_space_control:
   335 00006544 3C61                <1> 	cmp	al, 61h
   336 00006546 7206                <1> 	jb	short pass_capitalize
   337 00006548 3C7A                <1> 	cmp	al, 7Ah
   338 0000654A 7702                <1> 	ja	short pass_capitalize
   339 0000654C 24DF                <1> 	and	al, 0DFh
   340                              <1> pass_capitalize:
   341 0000654E AA                  <1> 	stosb   
   342 0000654F FEC1                <1> 	inc     cl
   343 00006551 81FE[A5320100]      <1>         cmp     esi, CommandBuffer + 79
   344 00006557 72C9                <1> 	jb      short next_command_char 
   345                              <1> 
   346                              <1> loc_move_cmd_arguments_ok:
   347 00006559 C60700              <1>         mov     byte [edi], 0
   348                              <1> 
   349                              <1> call_command_interpreter:
   350 0000655C E8D4080000          <1> 	call    command_interpreter
   351                              <1> 
   352                              <1> return_from_cmd_interpreter:
   353 00006561 B950000000          <1>         mov	ecx, 80
   354                              <1> 	;mov	cx, 80
   355 00006566 BF[56320100]        <1> 	mov	edi, CommandBuffer
   356 0000656B 30C0                <1> 	xor	al, al
   357 0000656D F3AA                <1> 	rep	stosb
   358                              <1> 	;cmp	byte [Program_Exit], 0
   359                              <1> 	;ja	short loc_terminate_trdos
   360                              <1>         
   361                              <1> 	; 16/01/2016
   362 0000656F 803D[EEF70000]03    <1> 	cmp	byte [CRT_MODE], 3 ; 80*25 color
   363 00006576 741D                <1> 	je	short pass_set_txt_mode
   364                              <1> 
   365 00006578 E86CAFFFFF          <1> 	call	set_txt_mode ; set vide mode to 03h
   366                              <1> 	; 07/01/2017
   367 0000657D 30C0                <1> 	xor	al, al
   368                              <1> 
   369                              <1> loc_check_active_page:
   370                              <1> 	;xor	al, al
   371 0000657F 3805[0E310100]      <1> 	cmp	[ACTIVE_PAGE], al ; 0
   372 00006585 0F842CFFFFFF        <1>         je      loc_TRDOS_prompt 
   373                              <1> 	; AL = 0 = video page 0
   374 0000658B E872B3FFFF          <1> 	call	set_active_page
   375 00006590 E922FFFFFF          <1>         jmp     loc_TRDOS_prompt ; infinitive loop
   376                              <1> 
   377                              <1> pass_set_txt_mode: 
   378 00006595 BE[C3FF0000]        <1> 	mov	esi, nextline
   379 0000659A E8CDF4FFFF          <1> 	call	print_msg
   380 0000659F EBDE                <1> 	jmp     short loc_check_active_page
   381                              <1> 
   382                              <1> rw_char:
   383                              <1> 	; 13/05/2016
   384                              <1> 	; 30/01/2016
   385                              <1> 	; 29/01/2016
   386                              <1> 	; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
   387                              <1> 	; 2004-2005
   388                              <1> 	
   389                              <1> 	; DH = cursor row, DL = cursor column
   390                              <1> 	; BH = 0 = video page number (active page)
   391                              <1> 
   392                              <1> 	;xor	bh, bh ; 0 = video page 0
   393                              <1> 
   394                              <1> readnextchar:
   395 000065A1 30E4                <1> 	xor     ah, ah
   396 000065A3 E8F4A5FFFF          <1> 	call	int16h
   397 000065A8 20C0                <1> 	and	al, al
   398 000065AA 7434                <1> 	jz	short loc_arrow    
   399 000065AC 3CE0                <1> 	cmp	al, 0E0h          
   400 000065AE 7430                <1> 	je	short loc_arrow
   401 000065B0 3C08                <1> 	cmp	al, 08h             
   402 000065B2 7544                <1> 	jne	short char_return
   403                              <1> loc_back:
   404 000065B4 3A15[06320100]      <1> 	cmp	dl, [CursorColumn]
   405 000065BA 76E5                <1> 	jna     short readnextchar
   406                              <1> prev_column:
   407 000065BC FECA                <1> 	dec	dl
   408                              <1> set_cursor_pos:
   409 000065BE 6652                <1> 	push	dx
   410                              <1> 	;xor	bh, bh ; 0 = video page 0
   411                              <1> 	; DH = Row, DL = Column
   412 000065C0 E809B7FFFF          <1> 	call	_set_cpos ; 17/01/2016
   413 000065C5 665A                <1>         pop	dx
   414                              <1> 	;movzx	ebx, dl
   415 000065C7 88D3                <1> 	mov	bl, dl
   416 000065C9 2A1D[06320100]      <1> 	sub	bl, [CursorColumn] 
   417 000065CF B020                <1> 	mov	al, 20h
   418 000065D1 8883[56320100]      <1> 	mov	[CommandBuffer+ebx], al
   419                              <1> 	;sub	bh, bh ; video page 0
   420                              <1> 	;mov	cx, 1
   421 000065D7 B307                <1> 	mov	bl, 7 ; color attribute
   422 000065D9 E8E1B5FFFF          <1> 	call	_write_c_current ; 17/01/2016
   423                              <1> 	;mov	dx, [CURSOR_POSN]
   424 000065DE EBC1                <1> 	jmp	short readnextchar
   425                              <1> loc_arrow:    
   426 000065E0 80FC4B              <1> 	cmp	ah, 4Bh
   427 000065E3 74CF                <1> 	je	short loc_back
   428 000065E5 80FC53              <1> 	cmp	ah, 53h
   429 000065E8 74CA                <1> 	je      short loc_back
   430 000065EA 80FC4D              <1> 	cmp	ah, 4Dh
   431 000065ED 75B2                <1> 	jne	short readnextchar
   432 000065EF 80FA4F              <1> 	cmp	dl, 79
   433 000065F2 73AD                <1> 	jnb	short readnextchar
   434 000065F4 FEC2                <1> 	inc	dl
   435 000065F6 EBC6                <1> 	jmp	short set_cursor_pos
   436                              <1> char_return:
   437 000065F8 0FB6DA              <1> 	movzx	ebx, dl
   438 000065FB 2A1D[06320100]      <1> 	sub	bl, [CursorColumn] 
   439 00006601 3C20                <1> 	cmp	al, 20h
   440 00006603 7220                <1> 	jb	short loc_escape
   441 00006605 8883[56320100]      <1> 	mov	[CommandBuffer+ebx], al
   442 0000660B 80FA4F              <1> 	cmp	dl, 79
   443 0000660E 7391                <1> 	jnb	short readnextchar
   444 00006610 66BB0700            <1> 	mov	bx, 7 ; color attribute
   445 00006614 E81FB6FFFF          <1> 	call	_write_tty
   446 00006619 668B15[FE300100]    <1> 	mov	dx, [CURSOR_POSN] ; video page 0
   447 00006620 E97CFFFFFF          <1>         jmp     readnextchar
   448                              <1> loc_escape:
   449 00006625 3C1B                <1> 	cmp	al, 1Bh
   450 00006627 7418                <1> 	je	short rw_char_retn
   451                              <1> 	;
   452 00006629 3C0D                <1> 	cmp	al, 0Dh ; CR
   453 0000662B 0F8570FFFFFF        <1>         jne     readnextchar
   454                              <1> 	; 13/05/2016
   455 00006631 66BB0700            <1> 	mov	bx, 7 ; attribute/color (bl)
   456                              <1> 		      ; video page 0 (bh=0)	
   457 00006635 E8FEB5FFFF          <1> 	call	_write_tty
   458                              <1> 	;mov	bx, 7  ; attribute/color
   459                              <1> 		      ; video page 0 (bh=0)
   460 0000663A B00A                <1> 	mov	al, 0Ah ; LF
   461 0000663C E8F7B5FFFF          <1> 	call	_write_tty
   462                              <1> rw_char_retn:
   463 00006641 C3                  <1> 	retn
   464                              <1> 
   465                              <1> show_date:
   466                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   467                              <1>         ; 2004-2005
   468                              <1> 
   469                              <1> 	;mov	ah, 04h
   470                              <1> 	;call	int1Ah
   471 00006642 E84FF1FFFF          <1> 	call	RTC_40	; GET RTC DATE
   472                              <1> 
   473 00006647 88D0                <1> 	mov	al, dl
   474 00006649 E845A5FFFF          <1>   	call	bcd_to_ascii
   475 0000664E 66A3[4CEE0000]      <1> 	mov	[Day], ax
   476                              <1> 
   477 00006654 88F0                <1> 	mov	al, dh
   478 00006656 E838A5FFFF          <1>   	call	bcd_to_ascii
   479 0000665B 66A3[4FEE0000]      <1> 	mov	[Month], ax
   480                              <1> 
   481 00006661 88E8                <1> 	mov	al, ch
   482 00006663 E82BA5FFFF          <1>   	call	bcd_to_ascii
   483 00006668 66A3[52EE0000]      <1> 	mov	[Century], ax
   484                              <1> 
   485 0000666E 88C8                <1> 	mov	al, cl
   486 00006670 E81EA5FFFF          <1>   	call	bcd_to_ascii
   487 00006675 66A3[54EE0000]      <1> 	mov	word [Year], ax
   488                              <1> 
   489 0000667B BE[3CEE0000]        <1> 	mov	esi, Msg_Show_Date
   490 00006680 E8E7F3FFFF          <1> 	call	print_msg
   491                              <1> 
   492 00006685 C3                  <1> 	retn
   493                              <1> 
   494                              <1> set_date:
   495                              <1> 	; 13/05/2016
   496                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   497                              <1>         ; 2004-2005
   498                              <1> 
   499 00006686 BE[20EE0000]        <1> 	mov	esi, Msg_Enter_Date
   500 0000668B E8DCF3FFFF          <1> 	call	print_msg
   501                              <1> 
   502                              <1> loc_enter_day_1:
   503 00006690 30E4                <1> 	xor     ah, ah
   504 00006692 E805A5FFFF          <1> 	call	int16h
   505                              <1> 	; AL = ASCII Code of the Character
   506 00006697 3C0D                <1> 	cmp	al, 13
   507 00006699 0F84B7010000        <1> 	je	loc_set_date_retn
   508 0000669F 3C1B                <1> 	cmp	al, 27
   509 000066A1 0F84AF010000        <1> 	je	loc_set_date_retn
   510 000066A7 A2[4CEE0000]        <1> 	mov	[Day], al
   511 000066AC 3C30                <1> 	cmp	al, '0'
   512 000066AE 0F82AD010000        <1> 	jb	loc_set_date_stc_0
   513 000066B4 3C33                <1> 	cmp	al, '3'
   514 000066B6 0F87A5010000        <1> 	ja	loc_set_date_stc_0
   515                              <1> 	; 13/05/2016
   516                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   517                              <1> 		      ; video page 0 (bh)	
   518 000066BC B307                <1> 	mov	bl, 7
   519 000066BE E875B5FFFF          <1> 	call	_write_tty
   520                              <1> loc_enter_day_2:
   521 000066C3 30E4                <1> 	xor     ah, ah
   522 000066C5 E8D2A4FFFF          <1> 	call	int16h
   523                              <1> 	; AL = ASCII Code of the Character
   524 000066CA 3C1B                <1> 	cmp	al, 27
   525 000066CC 0F8484010000        <1>         je      loc_set_date_retn
   526 000066D2 A2[4DEE0000]        <1> 	mov	[Day+1], al
   527 000066D7 3C30                <1> 	cmp	al, '0'
   528 000066D9 0F828C010000        <1>         jb      loc_set_date_stc_1
   529 000066DF 3C39                <1> 	cmp	al, '9'
   530 000066E1 0F8784010000        <1>         ja      loc_set_date_stc_1
   531 000066E7 803D[4CEE0000]33    <1> 	cmp	byte [Day], '3'
   532 000066EE 7208                <1> 	jb	short pass_set_day_31
   533 000066F0 3C31                <1> 	cmp	al, '1'
   534 000066F2 0F8773010000        <1>         ja      loc_set_date_stc_1
   535                              <1> pass_set_day_31:
   536                              <1> 	; 13/05/2016
   537                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   538                              <1> 		      ; video page 0 (bh)	
   539 000066F8 B307                <1> 	mov	bl, 7
   540 000066FA E839B5FFFF          <1> 	call	_write_tty
   541                              <1> loc_enter_separator_1:
   542 000066FF 28E4                <1> 	sub     ah, ah ; 0
   543 00006701 E896A4FFFF          <1> 	call	int16h
   544                              <1> 	; AL = ASCII Code of the Character
   545 00006706 3C1B                <1> 	cmp	al, 27
   546 00006708 0F8448010000        <1>         je      loc_set_date_retn
   547 0000670E 3C2D                <1> 	cmp	al, '-'
   548 00006710 7408                <1> 	je	short pass_set_date_separator_1
   549 00006712 3C2F                <1> 	cmp	al, '/'
   550 00006714 0F856C010000        <1>         jne     loc_set_date_stc_2
   551                              <1> pass_set_date_separator_1:
   552                              <1> 	; 13/05/2016
   553                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   554                              <1> 		      ; video page 0 (bh)
   555 0000671A B307                <1> 	mov	bl, 7	
   556 0000671C E817B5FFFF          <1> 	call	_write_tty
   557                              <1> loc_enter_month_1:
   558 00006721 30E4                <1> 	xor     ah, ah ; 0
   559 00006723 E874A4FFFF          <1> 	call	int16h
   560                              <1> 	; AL = ASCII Code of the Character
   561 00006728 3C1B                <1> 	cmp	al, 27
   562 0000672A 0F8426010000        <1>         je      loc_set_date_retn
   563 00006730 A2[4FEE0000]        <1> 	mov	[Month], al
   564 00006735 3C30                <1> 	cmp	al, '0'
   565 00006737 0F8264010000        <1>         jb      loc_set_date_stc_3
   566 0000673D 3C31                <1> 	cmp	al, '1'
   567 0000673F 0F875C010000        <1>         ja      loc_set_date_stc_3
   568                              <1> 	; 13/05/2016
   569                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   570                              <1> 		      ; video page 0 (bh)	
   571 00006745 B307                <1> 	mov	bl, 7
   572 00006747 E8ECB4FFFF          <1> 	call	_write_tty
   573                              <1> loc_enter_month_2:
   574 0000674C 30E4                <1> 	xor     ah, ah
   575 0000674E E849A4FFFF          <1> 	call	int16h
   576                              <1> 	; AL = ASCII Code of the Character
   577 00006753 3C1B                <1> 	cmp	al, 27
   578 00006755 0F84FB000000        <1>         je      loc_set_date_retn
   579 0000675B A2[50EE0000]        <1> 	mov	[Month+1], al
   580 00006760 3C30                <1> 	cmp	al, '0'
   581 00006762 0F8254010000        <1>         jb      loc_set_date_stc_4
   582 00006768 3C39                <1> 	cmp	al, '9'
   583 0000676A 0F874C010000        <1>         ja      loc_set_date_stc_4
   584 00006770 803D[4FEE0000]31    <1> 	cmp	byte [Month], '1'
   585 00006777 7208                <1> 	jb	short pass_set_month_12
   586 00006779 3C32                <1> 	cmp	al, '2'
   587 0000677B 0F873B010000        <1>         ja      loc_set_date_stc_4
   588                              <1> pass_set_month_12:
   589                              <1> 	; 13/05/2016
   590                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   591                              <1> 		      ; video page 0 (bh)
   592 00006781 B307                <1> 	mov	bl, 7	
   593 00006783 E8B0B4FFFF          <1> 	call	_write_tty
   594                              <1> loc_enter_separator_2:
   595 00006788 28E4                <1> 	sub     ah, ah
   596 0000678A E80DA4FFFF          <1> 	call	int16h
   597                              <1> 	; AL = ASCII Code of the Character
   598 0000678F 3C1B                <1> 	cmp	al, 27
   599 00006791 0F84BF000000        <1>         je      loc_set_date_retn
   600 00006797 3C2D                <1> 	cmp	al, '-'
   601 00006799 7408                <1> 	je	short pass_set_date_separator_2
   602 0000679B 3C2F                <1> 	cmp	al, '/'
   603 0000679D 0F8534010000        <1>         jne     loc_set_date_stc_5
   604                              <1> pass_set_date_separator_2:
   605                              <1> 	; 13/05/2016
   606                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   607                              <1> 		      ; video page 0 (bh)	
   608 000067A3 B307                <1> 	mov	bl, 7
   609 000067A5 E88EB4FFFF          <1> 	call	_write_tty
   610                              <1> loc_enter_year_1:
   611 000067AA 30E4                <1> 	xor    ah, ah
   612 000067AC E8EBA3FFFF          <1> 	call	int16h
   613                              <1> 	; AL = ASCII Code of the Character
   614 000067B1 3C1B                <1> 	cmp	al, 27
   615 000067B3 0F849D000000        <1>         je      loc_set_date_retn
   616 000067B9 A2[54EE0000]        <1> 	mov	[Year], al
   617 000067BE 3C30                <1> 	cmp	al, '0'
   618 000067C0 0F822C010000        <1>         jb      loc_set_date_stc_6
   619 000067C6 3C39                <1> 	cmp	al, '9'
   620 000067C8 0F8724010000        <1>         ja      loc_set_date_stc_6
   621                              <1> 	; 13/05/2016
   622                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   623                              <1> 		      ; video page 0 (bh)
   624 000067CE B307                <1> 	mov	bl, 7	
   625 000067D0 E863B4FFFF          <1> 	call	_write_tty
   626                              <1> loc_enter_year_2:
   627 000067D5 30E4                <1> 	xor	ah, ah
   628 000067D7 E8C0A3FFFF          <1> 	call	int16h
   629                              <1> 	; AL = ASCII Code of the Character
   630 000067DC 3C1B                <1> 	cmp	al, 27
   631 000067DE 7476                <1> 	je	short loc_set_date_retn
   632 000067E0 A2[55EE0000]        <1> 	mov	byte [Year+1], al
   633 000067E5 3C30                <1> 	cmp	al, '0'
   634 000067E7 0F8220010000        <1>         jb      loc_set_date_stc_7
   635 000067ED 3C39                <1> 	cmp	al, '9'
   636 000067EF 0F8718010000        <1>         ja      loc_set_date_stc_7
   637                              <1> 	; 13/05/2016
   638                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   639                              <1> 		      ; video page 0 (bh)
   640 000067F5 B307                <1> 	mov	bl, 7	
   641 000067F7 E83CB4FFFF          <1> 	call	_write_tty
   642                              <1> loc_set_date_get_lchar_again:
   643 000067FC 28E4                <1> 	sub	ah, ah ; 0
   644 000067FE E899A3FFFF          <1> 	call	int16h
   645                              <1> 	; AL = ASCII Code of the Character
   646 00006803 3C0D                <1> 	cmp	al, 13 ; ENTER key
   647 00006805 7412                <1> 	je	short loc_set_date_progress
   648 00006807 3C1B                <1> 	cmp	al, 27 ; ESC key
   649 00006809 744B                <1> 	je	short loc_set_date_retn
   650                              <1> 	;
   651 0000680B E82A010000          <1> 	call	check_for_backspace
   652 00006810 75EA                <1> 	jne	short loc_set_date_get_lchar_again
   653                              <1> 
   654                              <1> loc_set_date_bs_8:
   655 00006812 E811010000          <1> 	call	write_backspace
   656 00006817 EBBC                <1> 	jmp	short loc_enter_year_2
   657                              <1> 
   658                              <1> loc_set_date_progress:
   659                              <1> 	; Get Current Date
   660                              <1> 	;mov	ah, 04h
   661                              <1> 	;call	int1Ah
   662 00006819 E878EFFFFF          <1> 	call	RTC_40	; GET RTC DATE
   663                              <1> 	; CH = century (in BCD)
   664                              <1> 
   665 0000681E 66A1[54EE0000]      <1> 	mov	ax, [Year]
   666 00006824 662D3030            <1> 	sub	ax, '00'
   667 00006828 C0E004              <1> 	shl	al, 4 ; * 16
   668 0000682B 88C1                <1> 	mov	cl, al
   669 0000682D 00E1                <1> 	add	cl, ah
   670 0000682F 66A1[4FEE0000]      <1> 	mov	ax, [Month]
   671 00006835 662D3030            <1> 	sub	ax, '00'
   672 00006839 C0E004              <1> 	shl	al, 4 ; * 16
   673 0000683C 88C6                <1> 	mov	dh, al
   674 0000683E 00E6                <1> 	add	dh, ah
   675 00006840 66A1[4CEE0000]      <1> 	mov	ax, [Day]
   676 00006846 662D3030            <1> 	sub	ax, '00'
   677 0000684A C0E004              <1> 	shl	al, 4 ; * 16
   678 0000684D 88C2                <1> 	mov	dl, al
   679 0000684F 00E2                <1> 	add	dl, ah
   680                              <1> 
   681                              <1> 	;mov	ah, 05h
   682                              <1> 	;call	int1Ah
   683 00006851 E86DEFFFFF          <1> 	call	RTC_50	; SET RTC DATE
   684                              <1> 
   685                              <1> loc_set_date_retn:
   686 00006856 BE[C3FF0000]        <1> 	mov	esi, nextline
   687 0000685B E80CF2FFFF          <1> 	call	print_msg
   688 00006860 C3                  <1> 	retn
   689                              <1> 
   690                              <1> loc_set_date_stc_0:
   691                              <1> 	;xor	bh, bh ; video page 0
   692 00006861 E8B2B4FFFF          <1> 	call	beeper ; BEEP !
   693 00006866 E925FEFFFF          <1>         jmp     loc_enter_day_1
   694                              <1> loc_set_date_stc_1:
   695 0000686B E8CA000000          <1> 	call	check_for_backspace
   696 00006870 740A                <1> 	je	short loc_set_date_bs_1
   697                              <1> 	;xor	bh, bh ; video page 0
   698 00006872 E8A1B4FFFF          <1> 	call	beeper ; BEEP !
   699 00006877 E947FEFFFF          <1>         jmp     loc_enter_day_2
   700                              <1> loc_set_date_bs_1:
   701 0000687C E8A7000000          <1> 	call	write_backspace
   702 00006881 E90AFEFFFF          <1>         jmp     loc_enter_day_1
   703                              <1> loc_set_date_stc_2:
   704 00006886 E8AF000000          <1> 	call	check_for_backspace
   705 0000688B 740A                <1> 	je	short loc_set_date_bs_2
   706                              <1> 	;xor	bh, bh ; video page 0
   707 0000688D E886B4FFFF          <1> 	call	beeper ; BEEP !
   708 00006892 E968FEFFFF          <1>         jmp     loc_enter_separator_1
   709                              <1> loc_set_date_bs_2:
   710 00006897 E88C000000          <1> 	call	write_backspace
   711 0000689C E922FEFFFF          <1>         jmp     loc_enter_day_2
   712                              <1> loc_set_date_stc_3:
   713 000068A1 E894000000          <1> 	call	check_for_backspace	
   714 000068A6 740A                <1> 	je short loc_set_date_bs_3
   715                              <1> 	;xor	bh, bh ; video page 0
   716 000068A8 E86BB4FFFF          <1> 	call	beeper ; BEEP !
   717 000068AD E96FFEFFFF          <1>         jmp     loc_enter_month_1
   718                              <1> loc_set_date_bs_3:
   719 000068B2 E871000000          <1> 	call	write_backspace
   720 000068B7 E943FEFFFF          <1>         jmp     loc_enter_separator_1
   721                              <1> loc_set_date_stc_4:
   722 000068BC E879000000          <1> 	call	check_for_backspace	
   723 000068C1 740A                <1> 	je	short loc_set_date_bs_4
   724                              <1> 	;xor	bh, bh ; video page 0
   725 000068C3 E850B4FFFF          <1> 	call	beeper ; BEEP !
   726 000068C8 E97FFEFFFF          <1>         jmp     loc_enter_month_2
   727                              <1> loc_set_date_bs_4:
   728 000068CD E856000000          <1> 	call	write_backspace
   729 000068D2 E94AFEFFFF          <1>         jmp     loc_enter_month_1
   730                              <1> loc_set_date_stc_5:
   731 000068D7 E85E000000          <1> 	call	check_for_backspace
   732 000068DC 740A                <1> 	je	short loc_set_date_bs_5
   733                              <1> 	;xor	bh, bh ; video page 0
   734 000068DE E835B4FFFF          <1> 	call	beeper ; BEEP !
   735 000068E3 E9A0FEFFFF          <1>         jmp     loc_enter_separator_2
   736                              <1> loc_set_date_bs_5:
   737 000068E8 E83B000000          <1> 	call	write_backspace
   738 000068ED E95AFEFFFF          <1>         jmp     loc_enter_month_2
   739                              <1> loc_set_date_stc_6:
   740 000068F2 E843000000          <1> 	call	check_for_backspace
   741 000068F7 740A                <1>         je      short  loc_set_date_bs_6
   742                              <1> 	;xor	bh, bh ; video page 0
   743 000068F9 E81AB4FFFF          <1> 	call	beeper ; BEEP !
   744 000068FE E9A7FEFFFF          <1>         jmp     loc_enter_year_1
   745                              <1> loc_set_date_bs_6:
   746 00006903 E820000000          <1> 	call	write_backspace
   747 00006908 E97BFEFFFF          <1>         jmp     loc_enter_separator_2
   748                              <1> loc_set_date_stc_7:
   749 0000690D E828000000          <1> 	call	check_for_backspace
   750 00006912 740A                <1> 	je	short loc_set_date_bs_7
   751                              <1> 	;xor	bh, bh ; video page 0
   752 00006914 E8FFB3FFFF          <1> 	call	beeper ; BEEP !
   753 00006919 E9B7FEFFFF          <1>         jmp     loc_enter_year_2
   754                              <1> loc_set_date_bs_7:
   755 0000691E E805000000          <1> 	call	write_backspace
   756 00006923 E982FEFFFF          <1>         jmp     loc_enter_year_1
   757                              <1> 
   758                              <1> write_backspace:
   759                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   760 00006928 B008                <1> 	mov	al, 08h ; BACKSPACE
   761                              <1> 	; 13/05/2016
   762 0000692A 66BB0700            <1> 	mov	bx, 7 ; bl = attribute/color
   763                              <1> 		      ; bh = video page = 0	
   764 0000692E E805B3FFFF          <1> 	call	_write_tty
   765 00006933 B020                <1> 	mov	al, 20h ; BLANK/SPACE char 
   766                              <1> 	;mov	bx, 7 ; attribute/color
   767                              <1> 	;call	_write_c_current
   768                              <1> 	;retn
   769 00006935 E985B2FFFF          <1> 	jmp	_write_c_current
   770                              <1> 
   771                              <1> check_for_backspace:
   772                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   773 0000693A 663D080E            <1> 	cmp	ax, 0E08h
   774 0000693E 7410                <1> 	je	short cfbs_retn
   775 00006940 663DE04B            <1> 	cmp	ax, 4BE0h
   776 00006944 740A                <1> 	je	short cfbs_retn
   777 00006946 663D004B            <1> 	cmp	ax, 4B00h
   778 0000694A 7404                <1> 	je	short cfbs_retn
   779 0000694C 663DE053            <1> 	cmp	ax, 53E0h
   780                              <1> cfbs_retn:
   781 00006950 C3                  <1> 	retn
   782                              <1> 
   783                              <1> show_time:
   784                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   785                              <1>         ; 2004-2005
   786                              <1> 
   787                              <1> 	;mov	ah, 02h
   788                              <1> 	;call	int1Ah
   789 00006951 E8CFEDFFFF          <1> 	call	RTC_20	; GET RTC TIME
   790                              <1> 	
   791 00006956 88E8                <1> 	mov	al, ch
   792 00006958 E836A2FFFF          <1> 	call	bcd_to_ascii
   793 0000695D 66A3[7AEE0000]      <1> 	mov	[Hour], ax
   794                              <1> 
   795 00006963 88C8                <1> 	mov	al, cl
   796 00006965 E829A2FFFF          <1> 	call	bcd_to_ascii
   797 0000696A 66A3[7DEE0000]      <1> 	mov	[Minute], ax
   798                              <1> 
   799 00006970 88F0                <1> 	mov	al, dh
   800 00006972 E81CA2FFFF          <1> 	call	bcd_to_ascii
   801 00006977 66A3[80EE0000]      <1> 	mov	[Second], ax
   802                              <1> 
   803 0000697D BE[6AEE0000]        <1> 	mov	esi, Msg_Show_Time
   804 00006982 E8E5F0FFFF          <1> 	call	print_msg
   805 00006987 C3                  <1> 	retn
   806                              <1> 
   807                              <1> set_time:
   808                              <1> 	; 13/05/2016
   809                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   810                              <1>         ; 2004-2005
   811                              <1> 
   812 00006988 BE[59EE0000]        <1> 	mov 	esi, Msg_Enter_Time
   813 0000698D E8DAF0FFFF          <1> 	call	print_msg
   814                              <1> 
   815                              <1> loc_enter_hour_1:
   816 00006992 30E4                <1> 	xor     ah, ah
   817 00006994 E803A2FFFF          <1> 	call	int16h
   818                              <1> 	; AL = ASCII Code of the Character
   819 00006999 3C0D                <1> 	cmp	al, 13 ; ENTER key
   820 0000699B 0F84AE010000        <1>         je      loc_set_time_retn
   821 000069A1 3C1B                <1> 	cmp	al, 27 ; ESC key
   822 000069A3 0F84A6010000        <1>         je      loc_set_time_retn
   823 000069A9 A2[7AEE0000]        <1> 	mov	[Hour], al
   824 000069AE 3C30                <1> 	cmp	al, '0'
   825 000069B0 0F82A4010000        <1>         jb      loc_set_time_stc_0
   826 000069B6 3C32                <1> 	cmp	al, '2'
   827 000069B8 0F879C010000        <1>         ja      loc_set_time_stc_0
   828                              <1> 	; 13/05/2016
   829                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   830                              <1> 		      ; video page 0 (bh)
   831 000069BE B307                <1> 	mov	bl, 7	
   832 000069C0 E873B2FFFF          <1> 	call	_write_tty
   833                              <1> loc_enter_hour_2:
   834 000069C5 30E4                <1> 	xor     ah, ah
   835 000069C7 E8D0A1FFFF          <1> 	call	int16h
   836                              <1> 	; AL = ASCII Code of the Character
   837 000069CC 3C1B                <1> 	cmp	al, 27
   838 000069CE 0F847B010000        <1>         je      loc_set_time_retn
   839 000069D4 A2[7BEE0000]        <1> 	mov	[Hour+1], al
   840 000069D9 3C30                <1> 	cmp	al, '0'
   841 000069DB 0F8283010000        <1>         jb      loc_set_time_stc_1
   842 000069E1 3C39                <1> 	cmp	al, '9'
   843 000069E3 0F877B010000        <1> 	ja	loc_set_time_stc_1
   844 000069E9 803D[7AEE0000]32    <1>         cmp     byte [Hour], '2'
   845 000069F0 7208                <1> 	jb	short pass_set_time_24
   846 000069F2 3C34                <1> 	cmp	al, '4'
   847 000069F4 0F876A010000        <1>         ja      loc_set_time_stc_1
   848                              <1> pass_set_time_24:
   849                              <1> 	; 13/05/2016
   850                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   851                              <1> 		      ; video page 0 (bh)
   852 000069FA B307                <1> 	mov	bl, 7	
   853 000069FC E837B2FFFF          <1> 	call	_write_tty
   854                              <1> loc_enter_time_separator_1:
   855 00006A01 28E4                <1> 	sub    ah, ah ; 0
   856 00006A03 E894A1FFFF          <1> 	call	int16h
   857                              <1> 	; AL = ASCII Code of the Character
   858 00006A08 3C1B                <1> 	cmp	al, 27
   859 00006A0A 0F843F010000        <1>         je      loc_set_time_retn
   860 00006A10 3C3A                <1> 	cmp	al, ':'
   861 00006A12 0F8567010000        <1>         jne     loc_set_time_stc_2
   862                              <1> 	; 13/05/2016
   863                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   864                              <1> 		      ; video page 0 (bh)
   865 00006A18 B307                <1> 	mov	bl, 7	
   866 00006A1A E819B2FFFF          <1> 	call	_write_tty
   867                              <1> loc_enter_minute_1:
   868 00006A1F 30E4                <1> 	xor     ah, ah
   869 00006A21 E876A1FFFF          <1> 	call	int16h
   870                              <1> 	; AL = ASCII Code of the Character
   871 00006A26 3C1B                <1> 	cmp	al, 27
   872 00006A28 0F8421010000        <1>         je      loc_set_time_retn
   873 00006A2E A2[7DEE0000]        <1> 	mov	[Minute], al
   874 00006A33 3C30                <1> 	cmp	al, '0'
   875 00006A35 0F825F010000        <1>         jb      loc_set_time_stc_3
   876 00006A3B 3C35                <1> 	cmp	al, '5'
   877 00006A3D 0F8757010000        <1>         ja      loc_set_time_stc_3
   878                              <1> 	; 13/05/2016
   879                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   880                              <1> 		      ; video page 0 (bh)
   881 00006A43 B307                <1> 	mov	bl, 7	
   882 00006A45 E8EEB1FFFF          <1> 	call	_write_tty
   883                              <1> loc_enter_minute_2:
   884 00006A4A 30E4                <1> 	xor     ah, ah
   885 00006A4C E84BA1FFFF          <1> 	call	int16h
   886                              <1> 	; AL = ASCII Code of the Character
   887 00006A51 3C1B                <1> 	cmp	al, 27
   888 00006A53 0F84F6000000        <1>         je      loc_set_time_retn
   889 00006A59 A2[7EEE0000]        <1> 	mov	[Minute+1], al
   890 00006A5E 3C30                <1> 	cmp	al, '0'
   891 00006A60 0F824F010000        <1>         jb      loc_set_time_stc_4
   892 00006A66 3C39                <1> 	cmp	al, '9'
   893 00006A68 0F8747010000        <1>         ja      loc_set_time_stc_4
   894                              <1> 	; 13/05/2016
   895                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   896                              <1> 		      ; video page 0 (bh)
   897 00006A6E B307                <1> 	mov	bl, 7	
   898 00006A70 E8C3B1FFFF          <1> 	call	_write_tty
   899                              <1> loc_enter_time_separator_2:
   900 00006A75 66C705[80EE0000]30- <1> 	mov	word [Second], 3030h
   900 00006A7D 30                  <1>
   901 00006A7E 28E4                <1> 	sub     ah, ah
   902 00006A80 E817A1FFFF          <1> 	call	int16h
   903                              <1> 	; AL = ASCII Code of the Character
   904 00006A85 3C0D                <1> 	cmp	al, 13
   905 00006A87 0F8485000000        <1>         je      loc_set_time_progress
   906 00006A8D 3C1B                <1> 	cmp	al, 27
   907 00006A8F 0F84BA000000        <1>         je      loc_set_time_retn
   908 00006A95 3C3A                <1> 	cmp	al, ':'
   909 00006A97 0F8533010000        <1>         jne     loc_set_time_stc_5
   910                              <1> 	; 13/05/2016
   911                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   912                              <1> 		      ; video page 0 (bh)
   913 00006A9D B307                <1> 	mov	bl, 7	
   914 00006A9F E894B1FFFF          <1> 	call	_write_tty
   915                              <1> loc_enter_second_1:
   916 00006AA4 30E4                <1> 	xor     ah, ah
   917 00006AA6 E8F1A0FFFF          <1> 	call	int16h
   918                              <1> 	; AL = ASCII Code of the Character
   919 00006AAB 3C0D                <1> 	cmp	al, 13
   920 00006AAD 7463                <1> 	je	short loc_set_time_progress
   921 00006AAF 3C1B                <1> 	cmp	al, 27
   922 00006AB1 0F8498000000        <1>         je      loc_set_time_retn
   923 00006AB7 A2[80EE0000]        <1> 	mov	[Second], al
   924 00006ABC 3C30                <1> 	cmp	al, '0'
   925 00006ABE 0F8227010000        <1>         jb      loc_set_time_stc_6
   926 00006AC4 3C35                <1> 	cmp	al, '5'
   927 00006AC6 0F871F010000        <1>         ja      loc_set_time_stc_6
   928                              <1> 	; 13/05/2016
   929                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   930                              <1> 		      ; video page 0 (bh)
   931 00006ACC B307                <1> 	mov	bl, 7	
   932 00006ACE E865B1FFFF          <1> 	call	_write_tty
   933                              <1> loc_enter_second_2:
   934 00006AD3 30E4                <1> 	xor     ah, ah
   935 00006AD5 E8C2A0FFFF          <1> 	call	int16h
   936                              <1> 	; AL = ASCII Code of the Character
   937 00006ADA 3C1B                <1> 	cmp	al, 27
   938 00006ADC 7471                <1> 	je	short loc_set_time_retn
   939 00006ADE 3C30                <1> 	cmp	al, '0'
   940 00006AE0 0F8229010000        <1>         jb      loc_set_time_stc_7
   941 00006AE6 3C39                <1> 	cmp	al, '9'
   942 00006AE8 0F8721010000        <1>         ja      loc_set_time_stc_7
   943                              <1> 	; 13/05/2016
   944                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   945                              <1> 		      ; video page 0 (bh)
   946 00006AEE B307                <1> 	mov	bl, 7	
   947 00006AF0 E843B1FFFF          <1> 	call	_write_tty
   948                              <1> loc_set_time_get_lchar_again:
   949 00006AF5 28E4                <1> 	sub	ah, ah ; 0
   950 00006AF7 E8A0A0FFFF          <1> 	call	int16h
   951                              <1> 	; AL = ASCII Code of the Character
   952 00006AFC 3C0D                <1> 	cmp	al, 13
   953 00006AFE 7412                <1> 	je	short loc_set_time_progress
   954 00006B00 3C1B                <1> 	cmp	al, 27
   955 00006B02 744B                <1> 	je	short loc_set_time_retn
   956                              <1> 	;
   957 00006B04 E831FEFFFF          <1> 	call	check_for_backspace
   958 00006B09 75EA                <1> 	jne	short loc_set_time_get_lchar_again
   959                              <1> 
   960                              <1> loc_set_time_bs_8:
   961 00006B0B E818FEFFFF          <1> 	call	write_backspace
   962 00006B10 EBC1                <1> 	jmp	short loc_enter_second_2
   963                              <1> 
   964                              <1> loc_set_time_progress:
   965                              <1> 	; Get Current Time
   966                              <1> 	;mov 	ah, 02h
   967                              <1> 	;call	int1Ah
   968 00006B12 E80EECFFFF          <1> 	call	RTC_20	; GET RTC TIME
   969                              <1> 	;DL = Daylight Savings Enable option (0-1)	
   970                              <1> 
   971 00006B17 66A1[7AEE0000]      <1> 	mov	ax, [Hour]
   972 00006B1D 662D3030            <1> 	sub	ax, '00'
   973 00006B21 C0E004              <1> 	shl	al, 4 ; * 16
   974 00006B24 88C5                <1> 	mov	ch, al
   975 00006B26 00E5                <1> 	add	ch, ah
   976 00006B28 66A1[7DEE0000]      <1> 	mov	ax, [Minute]
   977 00006B2E 662D3030            <1> 	sub	ax, '00'
   978 00006B32 C0E004              <1> 	shl	al, 4 ; * 16
   979 00006B35 88C1                <1> 	mov	cl, al
   980 00006B37 00E1                <1> 	add	cl, ah
   981 00006B39 66A1[80EE0000]      <1> 	mov	ax, [Second]
   982 00006B3F 662D3030            <1> 	sub	ax, '00'
   983 00006B43 C0E004              <1> 	shl	al, 4 ; * 16
   984 00006B46 88C6                <1> 	mov	dh, al
   985 00006B48 00E6                <1> 	add	dh, ah
   986                              <1> 	
   987                              <1> 	;mov	ah, 03h
   988                              <1> 	;call	int1Ah
   989 00006B4A E805ECFFFF          <1> 	call	RTC_30	; SET RTC TIME
   990                              <1> 
   991                              <1> loc_set_time_retn:
   992 00006B4F BE[C3FF0000]        <1> 	mov 	esi, nextline
   993 00006B54 E813EFFFFF          <1> 	call	print_msg
   994 00006B59 C3                  <1> 	retn
   995                              <1> 
   996                              <1> loc_set_time_stc_0:
   997                              <1> 	;xor	bh, bh ; video page 0
   998 00006B5A E8B9B1FFFF          <1> 	call	beeper ; BEEP !
   999 00006B5F E92EFEFFFF          <1>         jmp     loc_enter_hour_1
  1000                              <1> loc_set_time_stc_1:
  1001 00006B64 E8D1FDFFFF          <1> 	call	check_for_backspace
  1002 00006B69 740A                <1> 	je	short loc_set_time_bs_1
  1003                              <1> 	;xor	bh, bh ; video page 0
  1004 00006B6B E8A8B1FFFF          <1> 	call	beeper ; BEEP !
  1005 00006B70 E950FEFFFF          <1>         jmp     loc_enter_hour_2
  1006                              <1> loc_set_time_bs_1:
  1007 00006B75 E8AEFDFFFF          <1> 	call	write_backspace
  1008 00006B7A E913FEFFFF          <1>         jmp     loc_enter_hour_1
  1009                              <1> loc_set_time_stc_2:
  1010 00006B7F E8B6FDFFFF          <1> 	call	check_for_backspace
  1011 00006B84 740A                <1> 	je	short loc_set_time_bs_2
  1012                              <1> 	;xor	bh, bh ; video page 0
  1013 00006B86 E88DB1FFFF          <1> 	call	beeper ; BEEP !
  1014 00006B8B E971FEFFFF          <1>         jmp     loc_enter_time_separator_1
  1015                              <1> loc_set_time_bs_2:
  1016 00006B90 E893FDFFFF          <1> 	call	write_backspace
  1017 00006B95 E92BFEFFFF          <1>         jmp     loc_enter_hour_2
  1018                              <1> loc_set_time_stc_3:
  1019 00006B9A E89BFDFFFF          <1> 	call	check_for_backspace
  1020 00006B9F 740A                <1> 	je	short loc_set_time_bs_3
  1021                              <1> 	;xor	bh, bh ; video page 0
  1022 00006BA1 E872B1FFFF          <1> 	call	beeper ; BEEP !6
  1023 00006BA6 E974FEFFFF          <1>         jmp     loc_enter_minute_1
  1024                              <1> loc_set_time_bs_3:
  1025 00006BAB E878FDFFFF          <1> 	call	write_backspace
  1026 00006BB0 E94CFEFFFF          <1>         jmp     loc_enter_time_separator_1
  1027                              <1> loc_set_time_stc_4:
  1028 00006BB5 E880FDFFFF          <1> 	call	check_for_backspace
  1029 00006BBA 740A                <1> 	je	short loc_set_time_bs_4
  1030                              <1> 	;xor	bh, bh ; video page 0
  1031 00006BBC E857B1FFFF          <1> 	call	beeper ; BEEP !
  1032 00006BC1 E984FEFFFF          <1>         jmp     loc_enter_minute_2
  1033                              <1> loc_set_time_bs_4:
  1034 00006BC6 E85DFDFFFF          <1> 	call	write_backspace
  1035 00006BCB E94FFEFFFF          <1>         jmp     loc_enter_minute_1
  1036                              <1> loc_set_time_stc_5:
  1037 00006BD0 E865FDFFFF          <1> 	call	check_for_backspace
  1038 00006BD5 740A                <1> 	je	short loc_set_time_bs_5
  1039                              <1> 	;xor	bh, bh ; video page 0
  1040 00006BD7 E83CB1FFFF          <1> 	call	beeper ; BEEP !
  1041 00006BDC E994FEFFFF          <1>         jmp     loc_enter_time_separator_2
  1042                              <1> loc_set_time_bs_5:
  1043 00006BE1 E842FDFFFF          <1> 	call	write_backspace
  1044 00006BE6 E95FFEFFFF          <1>         jmp     loc_enter_minute_2
  1045                              <1> loc_set_time_stc_6:
  1046 00006BEB E84AFDFFFF          <1> 	call	check_for_backspace
  1047 00006BF0 7413                <1> 	je	short loc_set_time_bs_6
  1048                              <1> 	;xor	bh, bh ; video page 0
  1049 00006BF2 E821B1FFFF          <1> 	call	beeper ; BEEP !
  1050 00006BF7 66C705[80EE0000]30- <1> 	mov	word [Second], 3030h
  1050 00006BFF 30                  <1>
  1051 00006C00 E99FFEFFFF          <1>         jmp     loc_enter_second_1
  1052                              <1> loc_set_time_bs_6:
  1053 00006C05 E81EFDFFFF          <1> 	call	write_backspace
  1054 00006C0A E966FEFFFF          <1>         jmp     loc_enter_time_separator_2
  1055                              <1> loc_set_time_stc_7:
  1056 00006C0F E826FDFFFF          <1> 	call	check_for_backspace
  1057 00006C14 740A                <1> 	je	short loc_set_time_bs_7
  1058                              <1> 	;xor	bh, bh ; video page 0
  1059 00006C16 E8FDB0FFFF          <1> 	call	beeper ; BEEP !
  1060 00006C1B E9B3FEFFFF          <1>         jmp     loc_enter_second_2
  1061                              <1> loc_set_time_bs_7:
  1062 00006C20 E803FDFFFF          <1> 	call	write_backspace
  1063 00006C25 E97AFEFFFF          <1>         jmp     loc_enter_second_1
  1064                              <1> 
  1065                              <1> print_volume_info:
  1066                              <1> 	; 01/03/2016
  1067                              <1> 	; 08/02/2016
  1068                              <1> 	; 06/02/2016
  1069                              <1> 	; 04/02/2016
  1070                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
  1071                              <1> 	; 25/10/2009
  1072                              <1> 	;
  1073                              <1> 	; "Volume Serial No: "
  1074                              <1>  	;
  1075                              <1> 	; INPUT  : AL = DOS Drive Number
  1076                              <1> 	; OUTPUT : AH = FS Type
  1077                              <1> 	;          AL = DOS Drive Name
  1078                              <1> 	; CF = 0 -> OK
  1079                              <1> 	; CF = 1 -> Drive not ready 
  1080                              <1> 
  1081 00006C2A 88C4                <1> 	mov	ah, al
  1082 00006C2C 28C0                <1> 	sub	al, al
  1083 00006C2E 0FB7F0              <1> 	movzx	esi, ax	
  1084 00006C31 81C600010900        <1> 	add	esi, Logical_DOSDisks
  1085 00006C37 8A06                <1> 	mov	al, [esi]
  1086 00006C39 3C41                <1> 	cmp	al, 'A'  
  1087 00006C3B 7304                <1> 	jnb	short loc_pvi_set_vol_name
  1088 00006C3D 8A6604              <1> 	mov	ah, [esi+LD_FSType]
  1089 00006C40 C3                  <1> 	retn
  1090                              <1> 
  1091                              <1> loc_pvi_set_vol_name:
  1092 00006C41 A2[B4EE0000]        <1> 	mov	[Vol_Drv_Name], al
  1093 00006C46 56                  <1> 	push	esi
  1094 00006C47 E858010000          <1> 	call	move_volume_name_and_serial_no ;;;
  1095 00006C4C 7302                <1> 	jnc	short loc_pvi_mvn_ok
  1096 00006C4E 5E                  <1> 	pop	esi
  1097 00006C4F C3                  <1> 	retn
  1098                              <1> 
  1099                              <1> loc_pvi_mvn_ok:
  1100 00006C50 8B3424              <1> 	mov	esi, [esp]
  1101 00006C53 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  1102 00006C57 7509                <1> 	jne	short loc_pvi_fat_vol_size
  1103 00006C59 8B4670              <1> 	mov	eax, [esi+LD_FS_VolumeSize]
  1104 00006C5C 0FB75E11            <1> 	movzx	ebx, word [esi+LD_FS_BytesPerSec]
  1105 00006C60 EB07                <1> 	jmp	short loc_vol_size_mul32
  1106                              <1> loc_pvi_fat_vol_size:
  1107 00006C62 8B4670              <1> 	mov	eax, [esi+LD_TotalSectors]
  1108 00006C65 0FB75E11            <1> 	movzx	ebx, word [esi+LD_BPB+BPB_BytsPerSec]
  1109                              <1> loc_vol_size_mul32:
  1110 00006C69 F7E3                <1> 	mul	ebx
  1111 00006C6B 09D2                <1> 	or	edx, edx
  1112 00006C6D 7507                <1> 	jnz	short loc_vol_size_in_kbytes
  1113                              <1> loc_vol_size_in_bytes:
  1114 00006C6F B9[92EE0000]        <1> 	mov	ecx, VolSize_Bytes
  1115 00006C74 EB0D                <1> 	jmp	short loc_write_vol_size_str
  1116                              <1> loc_vol_size_in_kbytes:
  1117 00006C76 66BB0004            <1> 	mov	bx, 1024
  1118 00006C7A F7F3                <1> 	div	ebx
  1119 00006C7C B9[85EE0000]        <1> 	mov 	ecx, VolSize_KiloBytes
  1120 00006C81 31D2                <1> 	xor	edx, edx ; 0
  1121                              <1> loc_write_vol_size_str:
  1122 00006C83 890D[DF390100]      <1> 	mov	[VolSize_Unit1], ecx
  1123                              <1> 	; 
  1124 00006C89 BF[F5390100]        <1> 	mov	edi, Vol_Tot_Sec_Str_End
  1125                              <1>         ;mov	byte [edi], 0
  1126 00006C8E B90A000000          <1> 	mov	ecx, 10
  1127                              <1> loc_write_vol_size_chr:
  1128 00006C93 F7F1                <1> 	div	ecx
  1129 00006C95 80C230              <1> 	add	dl, '0'
  1130 00006C98 4F                  <1> 	dec	edi	
  1131 00006C99 8817                <1> 	mov	[edi], dl
  1132 00006C9B 85C0                <1> 	test	eax, eax
  1133 00006C9D 7404                <1> 	jz	short loc_write_vol_size_str_ok
  1134 00006C9F 28D2                <1> 	sub	dl, dl ; 0
  1135 00006CA1 EBF0                <1> 	jmp	short loc_write_vol_size_chr
  1136                              <1> 
  1137                              <1> loc_write_vol_size_str_ok:
  1138 00006CA3 893D[E7390100]      <1> 	mov	[Vol_Tot_Sec_Str_Start], edi
  1139                              <1> 	;
  1140 00006CA9 BF[9DEE0000]        <1> 	mov	edi, Vol_FS_Name
  1141 00006CAE 8A4E03              <1> 	mov	cl, [esi+LD_FATType]
  1142 00006CB1 20C9                <1> 	and	cl, cl ; 0 ?
  1143 00006CB3 7515                <1> 	jnz	short loc_write_vol_FAT_str_1
  1144 00006CB5 66C7075452          <1> 	mov	word [edi], 'TR'
  1145 00006CBA C7470420465331      <1> 	mov	dword [edi+4], ' FS1'
  1146                              <1> 	;movzx	ebx, word [esi+LD_FS_BytesPerSec]
  1147 00006CC1 668B5E11            <1> 	mov	bx, [esi+LD_FS_BytesPerSec]
  1148 00006CC5 8B4674              <1> 	mov	eax, [esi+LD_FS_FreeSectors]
  1149 00006CC8 EB36                <1> 	jmp	short loc_vol_freespace_mul32
  1150                              <1> 
  1151                              <1> loc_write_vol_FAT_str_1:
  1152 00006CCA 66B83332            <1> 	mov	ax, '32' ; FAT32
  1153 00006CCE 80F902              <1> 	cmp	cl, 2 ; [esi+LD_FATType]
  1154 00006CD1 7708                <1> 	ja	short loc_write_vol_FAT_str_2
  1155 00006CD3 66B83132            <1> 	mov	ax, '12' ; FAT12
  1156 00006CD7 7202                <1> 	jb	short loc_write_vol_FAT_str_2
  1157 00006CD9 B436                <1> 	mov	ah, '6'  ; FAT16
  1158                              <1> loc_write_vol_FAT_str_2:
  1159 00006CDB C70746415420        <1> 	mov	dword [edi], 'FAT '
  1160 00006CE1 66894704            <1> 	mov	word [edi+4], ax
  1161                              <1> 	;
  1162                              <1> 	;movzx	ebx, word [esi+LD_BPB+BPB_BytsPerSec]
  1163 00006CE5 668B5E11            <1> 	mov	bx, [esi+LD_BPB+BPB_BytsPerSec]
  1164 00006CE9 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors]
  1165                              <1> 
  1166                              <1> loc_vol_freespace_recalc0:
  1167                              <1> 	; 01/03/2016
  1168 00006CEC 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh
  1169 00006CEF 720F                <1> 	jb	short loc_vol_freespace_mul32
  1170                              <1> 	;inc	eax ; 0
  1171 00006CF1 20C9                <1> 	and	cl, cl ; byte [esi+LD_FATType]
  1172 00006CF3 740B                <1> 	jz	short loc_vol_freespace_mul32 	
  1173 00006CF5 53                  <1> 	push	ebx
  1174 00006CF6 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free sectors
  1175 00006CFA E8A9490000          <1> 	call	calculate_fat_freespace
  1176 00006CFF 5B                  <1> 	pop	ebx
  1177                              <1> 
  1178                              <1> loc_vol_freespace_mul32:
  1179 00006D00 F7E3                <1> 	mul	ebx
  1180 00006D02 09D2                <1> 	or	edx, edx
  1181 00006D04 7507                <1> 	jnz	short loc_vol_fspace_in_kbytes
  1182                              <1> loc_vol_fspace_in_bytes:
  1183 00006D06 B9[92EE0000]        <1> 	mov	ecx, VolSize_Bytes
  1184 00006D0B EB0D                <1> 	jmp	short loc_write_vol_fspace_str
  1185                              <1> loc_vol_fspace_in_kbytes:
  1186 00006D0D 66BB0004            <1> 	mov	bx, 1024
  1187 00006D11 F7F3                <1> 	div	ebx
  1188 00006D13 B9[85EE0000]        <1> 	mov 	ecx, VolSize_KiloBytes
  1189 00006D18 31D2                <1> 	xor	edx, edx ; 0
  1190                              <1> loc_write_vol_fspace_str:
  1191 00006D1A 890D[E3390100]      <1> 	mov	[VolSize_Unit2], ecx
  1192                              <1> 	;	
  1193 00006D20 BF[053A0100]        <1> 	mov	edi, Vol_Free_Sectors_Str_End
  1194                              <1>         ;mov	byte [edi], 0
  1195 00006D25 B90A000000          <1> 	mov	ecx, 10
  1196                              <1> loc_write_vol_fspace_chr:
  1197 00006D2A F7F1                <1> 	div	ecx
  1198 00006D2C 80C230              <1> 	add	dl, '0'
  1199 00006D2F 4F                  <1> 	dec	edi	
  1200 00006D30 8817                <1> 	mov	[edi], dl
  1201 00006D32 85C0                <1> 	test	eax, eax
  1202 00006D34 7404                <1> 	jz	short loc_write_vol_fspace_str_ok
  1203 00006D36 28D2                <1> 	sub	dl, dl ; 0
  1204 00006D38 EBF0                <1> 	jmp	short loc_write_vol_fspace_chr
  1205                              <1> 
  1206                              <1> loc_write_vol_fspace_str_ok:
  1207 00006D3A 893D[F7390100]      <1> 	mov	[Vol_Free_Sectors_Str_Start], edi
  1208                              <1> 	;
  1209 00006D40 BE[9BEE0000]        <1> 	mov	esi, Volume_in_drive
  1210 00006D45 E822EDFFFF          <1> 	call	print_msg
  1211 00006D4A BE[DBEE0000]        <1> 	mov	esi, Vol_Name
  1212 00006D4F E818EDFFFF          <1> 	call	print_msg
  1213 00006D54 BE[C3FF0000]        <1> 	mov	esi, nextline
  1214 00006D59 E80EEDFFFF          <1> 	call	print_msg
  1215                              <1> 	;
  1216 00006D5E BE[3CEF0000]        <1> 	mov	esi, Vol_Total_Sector_Header
  1217 00006D63 E804EDFFFF          <1> 	call	print_msg
  1218 00006D68 8B35[E7390100]      <1> 	mov	esi, [Vol_Tot_Sec_Str_Start]
  1219 00006D6E E8F9ECFFFF          <1> 	call	print_msg
  1220 00006D73 8B35[DF390100]      <1> 	mov	esi, [VolSize_Unit1]
  1221 00006D79 E8EEECFFFF          <1> 	call	print_msg
  1222                              <1> 	;
  1223 00006D7E BE[4DEF0000]        <1> 	mov	esi, Vol_Free_Sectors_Header
  1224 00006D83 E8E4ECFFFF          <1> 	call	print_msg
  1225 00006D88 8B35[F7390100]      <1> 	mov	esi, [Vol_Free_Sectors_Str_Start]
  1226 00006D8E E8D9ECFFFF          <1> 	call	print_msg
  1227 00006D93 8B35[E3390100]      <1> 	mov	esi, [VolSize_Unit2]
  1228 00006D99 E8CEECFFFF          <1> 	call	print_msg
  1229                              <1> 	;
  1230 00006D9E 5E                  <1> 	pop	esi
  1231                              <1> 	
  1232                              <1> 	;mov	ah, [esi+LD_FSType]
  1233                              <1> 	;mov	al, [esi+LD_FATType]
  1234 00006D9F 668B4603            <1> 	mov	ax, [esi+LD_FATType]
  1235                              <1> 
  1236 00006DA3 C3                  <1> 	retn
  1237                              <1> 
  1238                              <1> move_volume_name_and_serial_no:
  1239                              <1> 	; 08/02/2016  (TRDOS 386 = TRDOS v2.0)
  1240                              <1> 	; this routine will be called by
  1241                              <1> 	; "print_volume_info" and "print_directory"
  1242                              <1> 	; INPUT ->
  1243                              <1> 	;	ESI = Logical DOS drv descripton table address
  1244                              <1> 	; OUTPUT ->
  1245                              <1> 	;	*Volume name will be moved to text area
  1246                              <1> 	;	*Volume serial number will be converted to
  1247                              <1> 	;	 text and will be moved to text area
  1248                              <1> 	;   cf = 1 -> invalid/unknown dos drive
  1249                              <1> 	;   cf = 0 -> ecx = 0
  1250                              <1> 	;
  1251                              <1> 	; (eax, edx, ecx, esi, edi will be changed)
  1252                              <1> 
  1253 00006DA4 BF[DBEE0000]        <1> 	mov 	edi, Vol_Name
  1254                              <1> 
  1255                              <1> 	;mov	ah, [esi+LD_FSType]
  1256                              <1> 	;mov	al, [esi+LD_FATType]
  1257 00006DA9 668B4603            <1> 	mov	ax, [esi+LD_FATType]
  1258 00006DAD 80FCA1              <1> 	cmp	ah, 0A1h
  1259 00006DB0 7418                <1> 	je	short mvn_2
  1260 00006DB2 08E4                <1> 	or	ah, ah
  1261 00006DB4 7404                <1> 	jz	short mvn_0
  1262 00006DB6 08C0                <1> 	or	al, al
  1263 00006DB8 7504                <1> 	jnz	short mvn_1
  1264                              <1> mvn_0:
  1265 00006DBA 8A06                <1> 	mov	al, [esi]
  1266 00006DBC F9                  <1> 	stc
  1267 00006DBD C3                  <1> 	retn
  1268                              <1> mvn_1:
  1269 00006DBE 3C02                <1> 	cmp	al, 2
  1270 00006DC0 7717                <1> 	ja	short mvn_3 
  1271                              <1> 	;or	al, al
  1272                              <1> 	;jz	short mvn_2
  1273 00006DC2 8B462D              <1> 	mov	eax, [esi+LD_BPB+VolumeID]
  1274 00006DC5 83C631              <1> 	add	esi, LD_BPB+VolumeLabel
  1275 00006DC8 EB15                <1> 	jmp	short mvn_4
  1276                              <1> mvn_2:
  1277 00006DCA 8B4628              <1> 	mov	eax, [esi+LD_FS_VolumeSerial]
  1278 00006DCD 83C62C              <1> 	add	esi, LD_FS_VolumeName
  1279 00006DD0 B910000000          <1> 	mov	ecx, 16
  1280 00006DD5 F3A5                <1> 	rep	movsd
  1281 00006DD7 EB10                <1> 	jmp	short mvn_5
  1282                              <1> mvn_3:
  1283 00006DD9 8B4649              <1> 	mov	eax, [esi+LD_BPB+FAT32_VolID]
  1284 00006DDC 83C64D              <1> 	add	esi, LD_BPB+FAT32_VolLab
  1285                              <1> mvn_4:
  1286 00006DDF B90B000000          <1> 	mov	ecx, 11
  1287 00006DE4 F3A4                <1> 	rep	movsb
  1288 00006DE6 C60700              <1> 	mov	byte [edi], 0
  1289                              <1> mvn_5:
  1290                              <1> 	;mov	[Current_VolSerial], eax  
  1291 00006DE9 E8A1C4FFFF          <1> 	call	dwordtohex
  1292 00006DEE 8915[30EF0000]      <1> 	mov	[Vol_Serial1], edx
  1293 00006DF4 A3[35EF0000]        <1> 	mov	[Vol_Serial2], eax
  1294                              <1> 	; ecx = 0
  1295 00006DF9 C3                  <1> 	retn
  1296                              <1> 
  1297                              <1> get_volume_serial_number:
  1298                              <1> 	; 19/01/2016 (TRDOS 386 = TRDOS v2.0)
  1299                              <1> 	; 08/08/2010
  1300                              <1> 	;
  1301                              <1> 	; INPUT -> DL = Logical DOS Drive number
  1302                              <1> 	; OUTPUT -> EAX = Volume serial number
  1303                              <1> 	;          BL= FAT Type	    
  1304                              <1> 	;          BH = Logical DOS drv Number (DL input)
  1305                              <1> 	; cf = 1 -> Drive not ready
  1306                              <1> 
  1307 00006DFA 31DB                <1> 	xor	ebx, ebx
  1308 00006DFC 88D7                <1> 	mov	bh, dl
  1309 00006DFE 3815[0CED0000]      <1> 	cmp	[Last_DOS_DiskNo], dl
  1310 00006E04 7304                <1> 	jnb	short loc_gvsn_start
  1311                              <1> loc_gvsn_stc_retn:
  1312 00006E06 31C0                <1> 	xor	eax, eax
  1313 00006E08 F9                  <1> 	stc 
  1314 00006E09 C3                  <1>         retn 
  1315                              <1> loc_gvsn_start:
  1316 00006E0A 56                  <1> 	push	esi
  1317 00006E0B BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1318 00006E10 01DE                <1> 	add	esi, ebx
  1319 00006E12 8A5E03              <1> 	mov	bl, [esi+LD_FATType]
  1320 00006E15 20DB                <1> 	and	bl, bl
  1321 00006E17 740F                <1> 	jz	short loc_gvsn_fs
  1322 00006E19 80FB02              <1> 	cmp	bl, 2
  1323 00006E1C 7705                <1> 	ja	short loc_gvsn_fat32
  1324                              <1> loc_gvsn_fat:
  1325 00006E1E 83C62D              <1> 	add	esi, LD_BPB + VolumeID
  1326 00006E21 EB0E                <1> 	jmp	short loc_gvsn_return
  1327                              <1> loc_gvsn_fat32: 
  1328 00006E23 83C649              <1> 	add	esi, LD_BPB + FAT32_VolID
  1329 00006E26 EB09                <1> 	jmp	short loc_gvsn_return 
  1330                              <1> loc_gvsn_fs:
  1331 00006E28 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  1332 00006E2C 75D8                <1> 	jne	short loc_gvsn_stc_retn 
  1333 00006E2E 83C628              <1> 	add	esi, LD_FS_VolumeSerial
  1334                              <1> loc_gvsn_return:
  1335 00006E31 8B06                <1> 	mov	eax, [esi]
  1336 00006E33 5E                  <1> 	pop	esi
  1337 00006E34 C3                  <1> 	retn
  1338                              <1> 
  1339                              <1> ; CMD_INTR.ASM [ TRDOS Command Interpreter Procedure ]
  1340                              <1> ; 09/11/2011
  1341                              <1> ; 29/01/2005
  1342                              <1> 
  1343                              <1> command_interpreter:
  1344                              <1> 	; 16/10/2016
  1345                              <1> 	; 12/10/2016
  1346                              <1> 	; 13/05/2016
  1347                              <1> 	; 07/05/2016
  1348                              <1> 	; 04/03/2016
  1349                              <1> 	; 04/02/2016
  1350                              <1> 	; 03/02/2016
  1351                              <1> 	; 30/01/2016
  1352                              <1> 	; 29/01/2016 (TRDOS 386 = TRDOS 2.0)
  1353                              <1> 	; 15/09/2011         
  1354                              <1> 	; 29/01/2005
  1355                              <1>         
  1356                              <1> 	; Input: ecx = command word length (CL)
  1357                              <1> 	;	 CommandBuffer = Command string offset
  1358                              <1>  
  1359 00006E35 C605[983A0100]00    <1> 	mov	byte [Program_Exit],0
  1360 00006E3C 80F904              <1> 	cmp	cl, 4
  1361 00006E3F 0F87AE020000        <1>         ja      c_6
  1362 00006E45 0F822E010000        <1>         jb      c_2
  1363                              <1> c_4:
  1364                              <1> 
  1365                              <1> cmp_cmd_exit:
  1366 00006E4B BF[7AED0000]        <1> 	mov	edi, Cmd_Exit
  1367 00006E50 E8BA030000          <1> 	call	cmp_cmd	
  1368 00006E55 7208                <1> 	jc	short cmp_cmd_date
  1369                              <1> 
  1370 00006E57 C605[983A0100]01    <1>         mov     byte [Program_Exit], 1
  1371 00006E5E C3                  <1>         retn
  1372                              <1> 
  1373                              <1> cmp_cmd_date:
  1374 00006E5F B104                <1> 	mov	cl, 4
  1375 00006E61 BF[96ED0000]        <1> 	mov	edi, Cmd_Date
  1376 00006E66 E8A4030000          <1> 	call	cmp_cmd	
  1377 00006E6B 720B                <1>         jc	short cmp_cmd_time
  1378                              <1> 	
  1379 00006E6D E8D0F7FFFF          <1> 	call	show_date
  1380 00006E72 E80FF8FFFF          <1> 	call	set_date
  1381 00006E77 C3                  <1> 	retn
  1382                              <1> 
  1383                              <1> cmp_cmd_time:
  1384 00006E78 B104                <1> 	mov	cl, 4
  1385 00006E7A BF[9BED0000]        <1> 	mov	edi, Cmd_Time
  1386 00006E7F E88B030000          <1>    	call	cmp_cmd	
  1387 00006E84 720B                <1> 	jc	short cmp_cmd_show
  1388                              <1> 
  1389 00006E86 E8C6FAFFFF          <1> 	call	show_time
  1390 00006E8B E8F8FAFFFF          <1> 	call	set_time
  1391 00006E90 C3                  <1> 	retn
  1392                              <1> 
  1393                              <1> cmp_cmd_show:
  1394 00006E91 B104                <1> 	mov	cl, 4
  1395 00006E93 BF[ACED0000]        <1> 	mov	edi, Cmd_Show
  1396 00006E98 E872030000          <1>    	call	cmp_cmd	
  1397 00006E9D 0F83EF090000        <1>         jnc     show_file
  1398                              <1> 
  1399                              <1> cmp_cmd_echo:
  1400 00006EA3 B104                <1> 	mov	cl, 4
  1401 00006EA5 BF[E8ED0000]        <1> 	mov	edi, Cmd_Echo
  1402 00006EAA E860030000          <1>    	call	cmp_cmd	
  1403 00006EAF 721B                <1> 	jc	short cmp_cmd_copy
  1404                              <1> 
  1405                              <1> 	; 14/04/2016
  1406 00006EB1 56                  <1> 	push	esi
  1407                              <1> cmd_echo_asciiz:
  1408 00006EB2 46                  <1>         inc	esi
  1409 00006EB3 8A06                <1> 	mov	al, [esi]
  1410 00006EB5 3C20                <1> 	cmp	al, 20h
  1411 00006EB7 73F9                <1> 	jnb	short cmd_echo_asciiz
  1412 00006EB9 C60600              <1> 	mov	byte [esi], 0                 
  1413 00006EBC 5E                  <1> 	pop	esi  
  1414 00006EBD E8AAEBFFFF          <1> 	call	print_msg
  1415 00006EC2 BE[0C000100]        <1> 	mov	esi, NextLine
  1416                              <1> 	;call	print_msg   
  1417                              <1> 	;retn
  1418 00006EC7 E9A0EBFFFF          <1> 	jmp	print_msg
  1419                              <1> 
  1420                              <1> cmp_cmd_copy:
  1421 00006ECC B104                <1> 	mov	cl, 4
  1422 00006ECE BF[CFED0000]        <1> 	mov	edi, Cmd_Copy
  1423 00006ED3 E837030000          <1>    	call	cmp_cmd	
  1424 00006ED8 0F8305180000        <1> 	jnc	copy_file
  1425                              <1> 
  1426                              <1> cmp_cmd_move:
  1427 00006EDE B104                <1> 	mov	cl, 4
  1428 00006EE0 BF[D4ED0000]        <1> 	mov	edi, Cmd_Move
  1429 00006EE5 E825030000          <1>    	call	cmp_cmd	
  1430 00006EEA 0F8399160000        <1> 	jnc	move_file
  1431                              <1> 
  1432                              <1> cmp_cmd_path:
  1433 00006EF0 B104                <1> 	mov	cl, 4
  1434 00006EF2 BF[D9ED0000]        <1> 	mov	edi, Cmd_Path
  1435 00006EF7 E813030000          <1>    	call	cmp_cmd	
  1436 00006EFC 0F83391A0000        <1> 	jnc	set_get_path
  1437                              <1> 
  1438                              <1> cmp_cmd_beep:
  1439 00006F02 B104                <1> 	mov	cl, 4
  1440 00006F04 BF[06EE0000]        <1> 	mov	edi, Cmd_Beep
  1441 00006F09 E801030000          <1>    	call	cmp_cmd	
  1442 00006F0E 720B                <1> 	jc	short cmp_cmd_find
  1443                              <1> 	; 13/05/2016
  1444 00006F10 8A3D[0E310100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
  1445 00006F16 E9FDADFFFF          <1> 	jmp	beeper
  1446                              <1> 
  1447                              <1> cmp_cmd_find:
  1448 00006F1B B104                <1> 	mov	cl, 4
  1449 00006F1D BF[E3ED0000]        <1> 	mov	edi, Cmd_Find
  1450 00006F22 E8E8020000          <1>    	call	cmp_cmd	
  1451 00006F27 0F82C5020000        <1>         jc      cmp_cmd_external
  1452                              <1> 
  1453                              <1> 	;call	find_and_list_files
  1454 00006F2D E9EA220000          <1> 	jmp	find_and_list_files
  1455                              <1> 	;retn
  1456                              <1> 
  1457                              <1> c_1:
  1458 00006F32 AD                  <1> 	lodsd
  1459                              <1> cmp_cmd_help:
  1460 00006F33 3C3F                <1> 	cmp	al, '?'
  1461 00006F35 751D                <1>         jne     short cmp_cmd_remark
  1462                              <1> 
  1463 00006F37 BE[6CED0000]        <1> 	mov	esi, Command_List
  1464                              <1> cmd_help_next_w:
  1465 00006F3C E82BEBFFFF          <1> 	call	print_msg
  1466                              <1> 
  1467 00006F41 803E20              <1> 	cmp	byte [esi], 20h ; 0
  1468 00006F44 7232                <1> 	jb	short cmd_help_retn
  1469                              <1> 	
  1470 00006F46 56                  <1> 	push	esi
  1471 00006F47 BE[C3FF0000]        <1> 	mov	esi, nextline
  1472 00006F4C E81BEBFFFF          <1> 	call	print_msg
  1473 00006F51 5E                  <1> 	pop	esi
  1474 00006F52 EBE8                <1> 	jmp	short cmd_help_next_w	
  1475                              <1> 
  1476                              <1> cmp_cmd_remark:
  1477 00006F54 3C2A                <1> 	cmp	al, '*'
  1478 00006F56 0F8596020000        <1>         jne     cmp_cmd_external
  1479 00006F5C 46                  <1> 	inc	esi
  1480 00006F5D BF[08320100]        <1> 	mov	edi, Remark
  1481 00006F62 8A06                <1> 	mov	al, [esi]
  1482 00006F64 3C20                <1> 	cmp	al, 20h
  1483 00006F66 7707                <1> 	ja	short cmd_remark_write
  1484 00006F68 89FE                <1> 	mov	esi, edi ; Remark
  1485 00006F6A E9FDEAFFFF          <1> 	jmp	print_msg
  1486                              <1> 
  1487                              <1> cmd_remark_write:
  1488 00006F6F AA                  <1> 	stosb
  1489 00006F70 AC                  <1> 	lodsb
  1490 00006F71 3C20                <1> 	cmp	al, 20h
  1491 00006F73 73FA                <1> 	jnb	short cmd_remark_write
  1492 00006F75 C60700              <1> 	mov	byte [edi], 0
  1493                              <1> 
  1494                              <1> cmd_help_retn:
  1495                              <1> cmd_remark_retn:
  1496                              <1> cd_retn:
  1497 00006F78 C3                  <1> 	retn
  1498                              <1> 
  1499                              <1> c_2:
  1500 00006F79 80F902              <1> 	cmp	cl, 2
  1501 00006F7C 0F87B1000000        <1>         ja      c_3
  1502 00006F82 BE[56320100]        <1> 	mov	esi, CommandBuffer
  1503 00006F87 72A9                <1> 	jb	short c_1
  1504                              <1> 
  1505                              <1> cmp_cmd_cd:
  1506 00006F89 66AD                <1> 	lodsw
  1507 00006F8B 663D4344            <1> 	cmp	ax, 'CD'
  1508 00006F8F 7553                <1> 	jne	short cmp_cmd_drive
  1509 00006F91 46                  <1>         inc	esi
  1510                              <1> cd_0:
  1511 00006F92 668B06              <1> 	mov	ax, [esi]	
  1512 00006F95 3C20                <1> 	cmp	al, 20h
  1513 00006F97 76DF                <1> 	jna	short cd_retn
  1514                              <1> 	; 10/02/2016
  1515 00006F99 80FC3A              <1> 	cmp	ah, ':'
  1516 00006F9C 7504                <1> 	jne	short cd_1
  1517 00006F9E 46                  <1> 	inc	esi
  1518 00006F9F 46                  <1> 	inc	esi
  1519 00006FA0 EB4B                <1> 	jmp	short cd_2
  1520                              <1> 
  1521                              <1> cd_1:	; change current directory
  1522                              <1> 	; 29/11/2009
  1523                              <1> 	; AH = CDh	; to separate 'CD' command from others
  1524                              <1> 			; for restoring current directory
  1525                              <1> 			; 0CDh sign is for saving cdir into 
  1526                              <1> 			; DOS drv description table cdir area
  1527                              <1> 	
  1528 00006FA2 B4CD                <1> 	mov	ah, 0CDh ; mov byte [CD_COMMAND], 0CDh 
  1529                              <1> 
  1530 00006FA4 E858230000          <1> 	call	change_current_directory
  1531 00006FA9 0F8372220000        <1>         jnc     change_prompt_dir_string
  1532                              <1> 
  1533                              <1> cd_error_messages:
  1534 00006FAF 3C03                <1> 	cmp	al, 3
  1535 00006FB1 740C                <1> 	je	short cd_path_not_found
  1536                              <1> 	; 16/10/2016 (15h -> 15)
  1537 00006FB3 3C0F                <1> 	cmp	al, 15 ; drive not ready error 
  1538 00006FB5 745B                <1> 	je	short cd_drive_not_ready
  1539 00006FB7 3C11                <1> 	cmp	al, 17 ; read error
  1540 00006FB9 7457                <1> 	je	short cd_drive_not_ready	
  1541 00006FBB 3C13                <1> 	cmp	al, 19 ; ; Bad directory/path name 
  1542 00006FBD 7468                <1> 	je	short cd_command_failed
  1543                              <1> 
  1544                              <1> cd_path_not_found:
  1545 00006FBF 6650                <1> 	push	ax	
  1546 00006FC1 BE[0FF00000]        <1> 	mov	esi, Msg_Dir_Not_Found
  1547 00006FC6 E8A1EAFFFF          <1> 	call	print_msg
  1548 00006FCB 6658                <1> 	pop	ax
  1549 00006FCD 3A25[A4310100]      <1> 	cmp	ah, [Current_Dir_Level]
  1550 00006FD3 0F8348220000        <1>         jnb     change_prompt_dir_string
  1551 00006FD9 8825[A4310100]      <1> 	mov	[Current_Dir_Level], ah
  1552 00006FDF E93D220000          <1>         jmp     change_prompt_dir_string   
  1553                              <1> 
  1554                              <1> cmp_cmd_drive: ; change current drive
  1555                              <1> 	; C:, D:, E: etc.
  1556 00006FE4 80FC3A              <1> 	cmp	ah, ':'
  1557 00006FE7 0F8505020000        <1>         jne     cmp_cmd_external
  1558                              <1> 
  1559                              <1> cd_2:	; 'CD C:', 'CD D:' ...
  1560 00006FED 803E20              <1> 	cmp	byte [esi], 20h
  1561 00006FF0 0F8706020000        <1>         ja      loc_cmd_failed
  1562                              <1> 
  1563 00006FF6 24DF                <1> 	and	al, 0DFh
  1564 00006FF8 2C41                <1> 	sub	al, 'A'
  1565 00006FFA 0F82FC010000        <1>         jc      loc_cmd_failed
  1566                              <1> 
  1567 00007000 3A05[0CED0000]      <1>         cmp     al, [Last_DOS_DiskNo]
  1568 00007006 770A                <1>         ja	short cd_drive_not_ready
  1569                              <1> 	
  1570 00007008 88C2                <1> 	mov	dl, al
  1571 0000700A E85DF3FFFF          <1> 	call 	change_current_drive
  1572 0000700F 7201                <1> 	jc	short cd_drive_not_ready	
  1573 00007011 C3                  <1> 	retn
  1574                              <1> 
  1575                              <1> cd_drive_not_ready:
  1576 00007012 BE[CCEF0000]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  1577 00007017 E850EAFFFF          <1> 	call	print_msg
  1578                              <1> 
  1579                              <1> cd_fail_drive_restart:
  1580 0000701C 8A15[A6310100]      <1> 	mov	dl, [Current_Drv]
  1581                              <1> 	;call 	change_current_drive
  1582 00007022 E945F3FFFF          <1>         jmp     change_current_drive
  1583                              <1> 	;retn
  1584                              <1> 
  1585                              <1> cd_command_failed:
  1586 00007027 BE[ADEF0000]        <1> 	mov	esi, Msg_Bad_Command
  1587 0000702C E83BEAFFFF          <1> 	call	print_msg
  1588 00007031 EBE9                <1> 	jmp	short cd_fail_drive_restart
  1589                              <1> 
  1590                              <1> c_3:
  1591                              <1> cmp_cmd_dir:
  1592 00007033 BF[6CED0000]        <1> 	mov	edi, Cmd_Dir
  1593 00007038 E8D2010000          <1> 	call	cmp_cmd	
  1594 0000703D 0F8371020000        <1> 	jnc	print_directory_list
  1595                              <1> 
  1596                              <1> cmp_cmd_cls:
  1597 00007043 B103                <1> 	mov	cl, 3
  1598 00007045 BF[A8ED0000]        <1> 	mov	edi, Cmd_Cls
  1599 0000704A E8C0010000          <1> 	call	cmp_cmd	
  1600 0000704F 0F832DEAFFFF        <1>         jnc	clear_screen
  1601                              <1> 
  1602                              <1> cmp_cmd_ver:
  1603 00007055 B103                <1> 	mov	cl, 3
  1604 00007057 BF[76ED0000]        <1> 	mov	edi, Cmd_Ver
  1605 0000705C E8AE010000          <1> 	call	cmp_cmd	
  1606 00007061 720A                <1> 	jc	short cmp_cmd_mem
  1607                              <1> 
  1608 00007063 BE[14ED0000]        <1> 	mov	esi, mainprog_Version
  1609                              <1> 	;call	print_msg
  1610 00007068 E9FFE9FFFF          <1> 	jmp	print_msg
  1611                              <1> 	;retn
  1612                              <1> 
  1613                              <1> cmp_cmd_mem:
  1614 0000706D B103                <1> 	mov	cl, 3
  1615 0000706F BF[DEED0000]        <1> 	mov	edi, Cmd_Mem
  1616 00007074 E896010000          <1> 	call	cmp_cmd	
  1617 00007079 0F835BC1FFFF        <1> 	jnc	memory_info
  1618                              <1> 
  1619                              <1> cmp_cmd_del:
  1620 0000707F B103                <1> 	mov	cl, 3
  1621 00007081 BF[B1ED0000]        <1> 	mov	edi, Cmd_Del
  1622 00007086 E884010000          <1> 	call	cmp_cmd	
  1623 0000708B 0F832D0F0000        <1>         jnc     delete_file
  1624                              <1> 
  1625                              <1> cmp_cmd_set:
  1626 00007091 B103                <1> 	mov	cl, 3
  1627 00007093 BF[A4ED0000]        <1> 	mov	edi, Cmd_Set
  1628 00007098 E872010000          <1> 	call	cmp_cmd	
  1629 0000709D 0F8310180000        <1>         jnc     set_get_env
  1630                              <1> 
  1631                              <1> cmp_cmd_run:
  1632 000070A3 B103                <1> 	mov	cl, 3
  1633 000070A5 BF[A0ED0000]        <1> 	mov	edi, Cmd_Run
  1634 000070AA E860010000          <1> 	call	cmp_cmd	
  1635                              <1> 	; 07/05/2016
  1636 000070AF 0F823D010000        <1>         jc      cmp_cmd_external
  1637 000070B5 E9471E0000          <1> 	jmp	load_and_execute_file
  1638                              <1> c_5:
  1639                              <1> cmp_cmd_mkdir:
  1640 000070BA BF[C9ED0000]        <1> 	mov	edi, Cmd_Mkdir
  1641 000070BF E84B010000          <1> 	call	cmp_cmd	
  1642 000070C4 0F838C0A0000        <1>         jnc     make_directory
  1643                              <1> 
  1644                              <1> cmp_cmd_rmdir:
  1645 000070CA B105                <1> 	mov	cl, 5
  1646 000070CC BF[C3ED0000]        <1> 	mov	edi, Cmd_Rmdir
  1647 000070D1 E839010000          <1> 	call	cmp_cmd	
  1648 000070D6 0F83990B0000        <1>         jnc     delete_directory
  1649                              <1> 
  1650                              <1> cmp_cmd_chdir:
  1651 000070DC B105                <1> 	mov	cl, 5
  1652 000070DE BF[00EE0000]        <1> 	mov	edi, Cmd_Chdir
  1653 000070E3 E827010000          <1> 	call	cmp_cmd	
  1654 000070E8 0F8204010000        <1>         jc      cmp_cmd_external
  1655                              <1> 
  1656 000070EE E99FFEFFFF          <1> 	jmp	cd_0
  1657                              <1> 
  1658                              <1> c_6:
  1659 000070F3 80F906              <1> 	cmp	cl, 6
  1660 000070F6 0F87DF000000        <1>         ja      c_8
  1661 000070FC 72BC                <1> 	jb	short c_5
  1662                              <1> cmp_cmd_prompt:
  1663 000070FE BF[7FED0000]        <1> 	mov	edi, Cmd_Prompt
  1664 00007103 E807010000          <1> 	call	cmp_cmd	
  1665 00007108 722E                <1>         jc	short cmp_cmd_volume
  1666                              <1> get_prompt_name_fchar:
  1667 0000710A AC                  <1> 	lodsb
  1668 0000710B 3C20                <1> 	cmp	al, 20h
  1669 0000710D 74FB                <1> 	je	short get_prompt_name_fchar
  1670 0000710F 7712                <1> 	ja	short loc_change_prompt_label
  1671 00007111 BE[60ED0000]        <1> 	mov	esi, TRDOSPromptLabel
  1672 00007116 C7065452444F        <1> 	mov	dword [esi], "TRDO"
  1673 0000711C 66C746045300        <1>        	mov	word [esi+4], "S" 
  1674                              <1> loc_cmd_prompt_return:
  1675 00007122 C3                  <1> 	retn
  1676                              <1> loc_change_prompt_label:
  1677 00007123 66B90B00            <1> 	mov	cx, 11
  1678 00007127 BF[60ED0000]        <1> 	mov	edi, TRDOSPromptLabel
  1679                              <1> put_char_new_prompt_label:
  1680 0000712C AA                  <1> 	stosb
  1681 0000712D AC                  <1> 	lodsb
  1682 0000712E 3C20                <1> 	cmp	al, 20h
  1683 00007130 7202                <1> 	jb	short pass_put_new_prompt_label
  1684 00007132 E2F8                <1> 	loop	put_char_new_prompt_label
  1685                              <1> pass_put_new_prompt_label:
  1686 00007134 C60700              <1> 	mov	byte [edi], 0
  1687 00007137 C3                  <1> 	retn
  1688                              <1> 
  1689                              <1> cmp_cmd_volume:
  1690 00007138 B106                <1> 	mov	cl, 6
  1691 0000713A BF[86ED0000]        <1> 	mov	edi, Cmd_Volume
  1692 0000713F E8CB000000          <1> 	call	cmp_cmd	
  1693 00007144 7255                <1>         jc	short cmp_cmd_attrib
  1694                              <1> 
  1695                              <1> cmd_vol1:
  1696 00007146 AC                  <1> 	lodsb
  1697 00007147 3C20                <1> 	cmp	al, 20h
  1698 00007149 7707                <1> 	ja	short cmd_vol2
  1699 0000714B A0[A6310100]        <1> 	mov	al, [Current_Drv]
  1700 00007150 EB3D                <1> 	jmp	short cmd_vol4
  1701                              <1> cmd_vol2:
  1702 00007152 3C41                <1> 	cmp	al, 'A'
  1703 00007154 0F82A2000000        <1>         jb      loc_cmd_failed
  1704 0000715A 3C7A                <1> 	cmp	al, 'z'
  1705 0000715C 0F879A000000        <1>         ja      loc_cmd_failed
  1706 00007162 3C5A                <1> 	cmp	al, 'Z'
  1707 00007164 760A                <1> 	jna	short cmd_vol3
  1708 00007166 3C61                <1> 	cmp	al, 'a'
  1709 00007168 0F828E000000        <1>         jb      loc_cmd_failed
  1710 0000716E 24DF                <1> 	and	al, 0DFh
  1711                              <1> cmd_vol3:
  1712 00007170 8A26                <1> 	mov	ah, [esi]
  1713 00007172 80FC3A              <1> 	cmp	ah, ':'
  1714 00007175 0F8581000000        <1>         jne     loc_cmd_failed
  1715 0000717B 2C41                <1> 	sub	al, 'A'
  1716 0000717D 3A05[0CED0000]      <1>         cmp     al, [Last_DOS_DiskNo]
  1717 00007183 760A                <1> 	jna	short cmd_vol4
  1718                              <1> 
  1719 00007185 BE[CCEF0000]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  1720 0000718A E9DDE8FFFF          <1> 	jmp	print_msg
  1721                              <1> 	
  1722                              <1> cmd_vol4:
  1723 0000718F E896FAFFFF          <1> 	call	print_volume_info
  1724 00007194 0F8278FEFFFF        <1>         jc      cd_drive_not_ready
  1725 0000719A C3                  <1> 	retn
  1726                              <1> 
  1727                              <1> cmp_cmd_attrib:
  1728 0000719B B106                <1> 	mov	cl, 6
  1729 0000719D BF[B5ED0000]        <1> 	mov	edi, Cmd_Attrib
  1730 000071A2 E868000000          <1> 	call	cmp_cmd	
  1731 000071A7 0F83310F0000        <1>         jnc     set_file_attributes
  1732                              <1> 
  1733                              <1> cmp_cmd_rename:
  1734 000071AD B106                <1> 	mov	cl, 6
  1735 000071AF BF[BCED0000]        <1> 	mov	edi, Cmd_Rename
  1736 000071B4 E856000000          <1> 	call	cmp_cmd	
  1737 000071B9 0F8367110000        <1>         jnc     rename_file
  1738                              <1> 
  1739                              <1> cmp_cmd_device:
  1740 000071BF B106                <1> 	mov	cl, 6
  1741 000071C1 BF[F1ED0000]        <1> 	mov	edi, Cmd_Device
  1742 000071C6 E844000000          <1> 	call	cmp_cmd	
  1743 000071CB 7225                <1>         jc	short cmp_cmd_external
  1744                              <1> 
  1745 000071CD C3                  <1> 	retn
  1746                              <1> 
  1747                              <1> c_7:
  1748                              <1> cmp_cmd_devlist:
  1749 000071CE BF[F8ED0000]        <1> 	mov	edi, Cmd_DevList
  1750 000071D3 E837000000          <1> 	call	cmp_cmd	
  1751 000071D8 7218                <1>         jc	short cmp_cmd_external
  1752                              <1> 
  1753                              <1> loc_cmd_return:
  1754 000071DA C3                  <1> 	retn
  1755                              <1> 
  1756                              <1> c_8:
  1757 000071DB 80F908              <1>         cmp	cl, 8
  1758 000071DE 7712                <1> 	ja	short cmp_cmd_external
  1759 000071E0 72EC                <1> 	jb	short c_7
  1760                              <1> 
  1761                              <1> cmp_cmd_longname:
  1762 000071E2 BF[8DED0000]        <1> 	mov	edi, Cmd_LongName
  1763 000071E7 E823000000          <1> 	call	cmp_cmd	
  1764 000071EC 0F8342060000        <1>         jnc     get_and_print_longname
  1765                              <1> 
  1766                              <1> cmp_cmd_external:
  1767                              <1> 	; 07/05/2016
  1768                              <1> 	; 22/04/2016
  1769 000071F2 BE[56320100]        <1> 	mov	esi, CommandBuffer
  1770 000071F7 E9051D0000          <1> 	jmp	loc_run_check_filename 
  1771                              <1> 
  1772                              <1> loc_cmd_failed:
  1773 000071FC 803D[56320100]20    <1> 	cmp	byte [CommandBuffer], 20h
  1774 00007203 76D5                <1> 	jna	short loc_cmd_return
  1775 00007205 BE[ADEF0000]        <1> 	mov	esi, Msg_Bad_Command
  1776                              <1> ;	call	print_msg
  1777                              <1> ;loc_cmd_return:
  1778                              <1> ;	retn
  1779 0000720A E95DE8FFFF          <1> 	jmp	print_msg
  1780                              <1> 
  1781                              <1> cmp_cmd:
  1782                              <1> 	 ; 29/01/2016 (TRDOS 386 = TRDOS v2.0)
  1783 0000720F BE[56320100]        <1>          mov	esi, CommandBuffer
  1784                              <1>          ; edi = internal command word (ASCIIZ)
  1785                              <1> 	 ; ecx = command length (<=8)
  1786                              <1> cmp_cmd_1:
  1787 00007214 AC                  <1> 	lodsb
  1788 00007215 AE                  <1> 	scasb
  1789 00007216 750D                <1> 	jne	short cmp_cmd_3
  1790 00007218 E2FA                <1> 	loop	cmp_cmd_1
  1791 0000721A AC                  <1>  	lodsb
  1792 0000721B 3C20                <1> 	cmp	al, 20h
  1793 0000721D 7703                <1> 	ja	short cmp_cmd_2
  1794 0000721F 30C0                <1> 	xor	al, al
  1795                              <1> 	; ZF = 1 -> internal command word matches
  1796 00007221 C3                  <1> 	retn
  1797                              <1> cmp_cmd_2:
  1798                              <1> 	; ZF = 0 (CF = 0) -> external command word 	
  1799 00007222 58                  <1> 	pop	eax ; no return to the caller from here 
  1800 00007223 EBCD                <1> 	jmp	cmp_cmd_external	
  1801                              <1> cmp_cmd_3:
  1802 00007225 F9                  <1> 	stc
  1803                              <1> 	; CF = 1 -> internal command word does not match
  1804 00007226 C3                  <1> 	retn
  1805                              <1> 
  1806                              <1> loc_run_cmd_failed:
  1807                              <1> 	; 15/03/2016
  1808                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
  1809                              <1> 	; 07/12/2009 (CMD_INTR.ASM)	
  1810                              <1> 	; 29/11/2009
  1811                              <1> 
  1812 00007227 E855000000          <1> 	call	restore_cdir_after_cmd_fail
  1813                              <1> 
  1814                              <1> loc_run_cmd_failed_cmp_al:
  1815                              <1> 	; End of Restore_CDIR code (29/11/2009)
  1816                              <1> 
  1817 0000722C 3C01                <1> 	cmp	al, 1 ; Bad command or file name
  1818 0000722E 74CC                <1> 	je	loc_cmd_failed
  1819                              <1> loc_run_dir_not_found:
  1820 00007230 3C03                <1> 	cmp	al, 3
  1821 00007232 750A                <1> 	jne	short loc_run_file_notfound_msg
  1822                              <1> 	; Path not found (MS-DOS Error Code = 3)
  1823 00007234 BE[0FF00000]        <1> 	mov	esi, Msg_Dir_Not_Found
  1824 00007239 E92EE8FFFF          <1> 	jmp	print_msg
  1825                              <1> 
  1826                              <1> loc_run_file_notfound_msg:
  1827 0000723E 3C02                <1> 	cmp	al, 2 ; File not found
  1828 00007240 750A                <1> 	jne	short loc_run_file_drv_read_err
  1829                              <1> 
  1830                              <1> loc_print_file_notfound_msg: 
  1831 00007242 BE[26F00000]        <1>         mov     esi, Msg_File_Not_Found
  1832                              <1> 	;call	proc_printmsg
  1833                              <1> 	;retn
  1834 00007247 E920E8FFFF          <1> 	jmp	print_msg
  1835                              <1> 
  1836                              <1> loc_run_file_drv_read_err:
  1837                              <1> 	; Err: 17 (Read fault)
  1838 0000724C 3C11                <1> 	cmp	al, 17 ; Drive not ready or read error
  1839 0000724E 7404                <1> 	je	short loc_run_file_print_drv_read_err
  1840                              <1> 	;
  1841 00007250 3C0F                <1> 	cmp	al, 15 ; Drive not ready (or read error)
  1842 00007252 750A                <1> 	jne	short loc_run_file_toobig
  1843                              <1> 
  1844                              <1> loc_run_file_print_drv_read_err:
  1845 00007254 BE[CCEF0000]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  1846 00007259 E90EE8FFFF          <1> 	jmp	print_msg
  1847                              <1> 
  1848                              <1> loc_run_file_toobig:
  1849 0000725E 3C08                <1> 	cmp	al, 8 ; Not enough free memory to load&run file
  1850 00007260 750A                <1> 	jne	short loc_run_misc_error
  1851 00007262 BE[6EF00000]        <1> 	mov	esi, Msg_Insufficient_Memory
  1852 00007267 E900E8FFFF          <1> 	jmp	print_msg
  1853                              <1> 
  1854                              <1> 	; 15/03/2016
  1855                              <1> print_misc_error_msg:
  1856                              <1> loc_run_misc_error:
  1857                              <1> 	; AL = Error code
  1858 0000726C E8DEBFFFFF          <1> 	call	bytetohex
  1859 00007271 66A3[A2F00000]      <1>         mov     [error_code_hex], ax
  1860                              <1> 	
  1861 00007277 BE[85F00000]        <1> 	mov	esi, Msg_Error_Code 
  1862                              <1> 	;call	print_msg 
  1863                              <1> 	;retn
  1864                              <1> 
  1865 0000727C E9EBE7FFFF          <1> 	jmp	print_msg
  1866                              <1> 
  1867                              <1> restore_cdir_after_cmd_fail:
  1868                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
  1869 00007281 50                  <1> 	push	eax
  1870 00007282 8A3D[063A0100]      <1> 	mov	bh, [RUN_CDRV] ; it is set at the beginning
  1871                              <1> 				; of the 'run' command.
  1872 00007288 3A3D[A6310100]      <1> 	cmp	bh, [Current_Drv]
  1873 0000728E 7409                <1> 	je	short loc_run_restore_cdir
  1874 00007290 88FA                <1> 	mov	dl, bh
  1875 00007292 E8D5F0FFFF          <1> 	call	change_current_drive 
  1876 00007297 EB19                <1> 	jmp	short loc_run_err_pass_restore_cdir
  1877                              <1> 
  1878                              <1> loc_run_restore_cdir:
  1879 00007299 803D[0DED0000]00    <1> 	cmp	byte [Restore_CDIR], 0
  1880 000072A0 7610                <1> 	jna	short loc_run_err_pass_restore_cdir
  1881 000072A2 30DB                <1> 	xor	bl, bl
  1882 000072A4 0FB7F3              <1> 	movzx	esi, bx
  1883 000072A7 81C600010900        <1> 	add	esi, Logical_DOSDisks
  1884 000072AD E871F1FFFF          <1> 	call	restore_current_directory
  1885                              <1> 
  1886                              <1> loc_run_err_pass_restore_cdir:
  1887 000072B2 58                  <1> 	pop	eax
  1888 000072B3 C3                  <1> 	retn
  1889                              <1> 
  1890                              <1> print_directory_list:
  1891                              <1> 	; 10/02/2016
  1892                              <1> 	; 08/02/2016 (TRDOS 386 =  TRDOS v2.0)
  1893                              <1> 	; 06/12/2009 ('cmp_cmd_dir')	
  1894                              <1> 	;
  1895 000072B4 66C705[483B0100]00- <1> 	mov	word [AttributesMask], 0800h ; ..except volume names..
  1895 000072BC 08                  <1>
  1896 000072BD A0[A6310100]        <1> 	mov	al, [Current_Drv]
  1897 000072C2 A2[063A0100]        <1> 	mov	[RUN_CDRV], al
  1898                              <1> get_dfname_fchar:
  1899 000072C7 AC                  <1> 	lodsb
  1900 000072C8 3C20                <1> 	cmp	al, 20h
  1901 000072CA 74FB                <1> 	je	short get_dfname_fchar
  1902 000072CC 0F82A4000000        <1>         jb      loc_print_dir_call_all
  1903 000072D2 3C2D                <1> 	cmp	al, '-'
  1904 000072D4 7542                <1> 	jne	short loc_print_dir_call_flt
  1905                              <1> get_next_attr_char:
  1906 000072D6 AC                  <1> 	lodsb
  1907 000072D7 3C20                <1> 	cmp	al, 20h
  1908 000072D9 74FB                <1> 	je	short get_next_attr_char
  1909 000072DB 0F821BFFFFFF        <1>         jb      loc_cmd_failed
  1910 000072E1 24DF                <1> 	and	al, 0DFh
  1911 000072E3 3C44                <1> 	cmp	al, 'D' ; directories only ?
  1912 000072E5 7512                <1> 	jne	short pass_only_directories
  1913 000072E7 AC                  <1> 	lodsb
  1914 000072E8 3C20                <1> 	cmp	al, 20h
  1915 000072EA 0F870CFFFFFF        <1>         ja      loc_cmd_failed
  1916 000072F0 800D[483B0100]10    <1> 	or	byte [AttributesMask], 10h ; ..directory..
  1917 000072F7 EB18                <1> 	jmp	short get_dfname_fchar_attr
  1918                              <1> pass_only_directories:
  1919 000072F9 3C46                <1> 	cmp	al, 'F'	; files only ?
  1920 000072FB 0F85B0000000        <1>         jne     check_attr_s
  1921 00007301 AC                  <1> 	lodsb
  1922 00007302 3C20                <1> 	cmp	al, 20h
  1923 00007304 0F87F2FEFFFF        <1>         ja      loc_cmd_failed
  1924 0000730A 800D[493B0100]10    <1> 	or	byte [AttributesMask+1], 10h ; ..except directories..
  1925                              <1> get_dfname_fchar_attr:
  1926 00007311 AC                  <1> 	lodsb
  1927 00007312 3C20                <1> 	cmp	al, 20h
  1928 00007314 74FB                <1> 	je	short get_dfname_fchar_attr
  1929 00007316 725E                <1> 	jb	short loc_print_dir_call_all
  1930                              <1> 
  1931                              <1> loc_print_dir_call_flt:
  1932 00007318 4E                  <1> 	dec	esi
  1933 00007319 BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  1934 0000731E E8F2250000          <1> 	call	parse_path_name
  1935 00007323 7308                <1>  	jnc	short loc_print_dir_change_drv_1
  1936 00007325 3C01                <1> 	cmp	al, 1
  1937 00007327 0F87FAFEFFFF        <1>         ja      loc_run_cmd_failed
  1938                              <1> 
  1939                              <1> loc_print_dir_change_drv_1:
  1940 0000732D 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  1941                              <1> loc_print_dir_change_drv_2:
  1942 00007333 3A15[063A0100]      <1> 	cmp	dl, [RUN_CDRV]
  1943 00007339 740B                <1> 	je	short loc_print_dir_change_directory 
  1944 0000733B E82CF0FFFF          <1> 	call	change_current_drive
  1945 00007340 0F82E1FEFFFF        <1>         jc      loc_run_cmd_failed
  1946                              <1> loc_print_dir_change_directory:
  1947 00007346 803D[4B3B0100]20    <1> 	cmp	byte [FindFile_Directory], 20h ; 0 or 20h ?
  1948 0000734D 761D                <1> 	jna	short pass_print_dir_change_directory
  1949                              <1> 
  1950 0000734F FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  1951 00007355 BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  1952 0000735A 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  1953 0000735C E8A01F0000          <1> 	call	change_current_directory
  1954 00007361 0F82C0FEFFFF        <1>         jc      loc_run_cmd_failed
  1955                              <1> 
  1956                              <1> loc_print_dir_change_prompt_dir_string:
  1957 00007367 E8B51E0000          <1> 	call	change_prompt_dir_string
  1958                              <1> 
  1959                              <1> pass_print_dir_change_directory:
  1960 0000736C BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  1961 00007371 803E20              <1> 	cmp	byte [esi], 20h ; ; 0 or 20h ?
  1962 00007374 7706                <1> 	ja	short loc_print_dir_call
  1963                              <1> 
  1964                              <1> loc_print_dir_call_all:
  1965 00007376 C7062A2E2A00        <1> 	mov	dword [esi], '*.*'
  1966                              <1> loc_print_dir_call:
  1967 0000737C E87E000000          <1> 	call	print_directory
  1968                              <1> 
  1969 00007381 8A15[063A0100]      <1> 	mov	dl, [RUN_CDRV]  ; it is set at the beginning
  1970 00007387 3A15[A6310100]      <1> 	cmp	dl, [Current_Drv]
  1971 0000738D 7406                <1> 	je	short loc_print_dir_call_restore_cdir_retn
  1972 0000738F E8D8EFFFFF          <1> 	call	change_current_drive 
  1973 00007394 C3                  <1> 	retn
  1974                              <1> 
  1975                              <1> loc_print_dir_call_restore_cdir_retn:
  1976 00007395 803D[0DED0000]00    <1> 	cmp	byte [Restore_CDIR], 0
  1977 0000739C 7610                <1> 	jna	short pass_print_dir_call_restore_cdir_retn
  1978                              <1> 
  1979 0000739E BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1980 000073A3 31C0                <1> 	xor	eax, eax
  1981 000073A5 88D4                <1> 	mov	ah, dl
  1982 000073A7 01C6                <1> 	add	esi, eax
  1983                              <1> 
  1984 000073A9 E875F0FFFF          <1> 	call	restore_current_directory
  1985                              <1> 
  1986                              <1> pass_print_dir_call_restore_cdir_retn:
  1987 000073AE C3                  <1> 	retn
  1988                              <1> 
  1989                              <1> check_attr_s_cap:
  1990 000073AF 24DF                <1> 	and	al, 0DFh
  1991                              <1> check_attr_s:
  1992 000073B1 3C53                <1> 	cmp	al, 'S'
  1993 000073B3 7514                <1> 	jne	short pass_attr_s
  1994 000073B5 800D[483B0100]04    <1> 	or	byte [AttributesMask], 4 ; system
  1995 000073BC AC                  <1> 	lodsb
  1996 000073BD 3C20                <1> 	cmp	al, 20h
  1997 000073BF 0F844CFFFFFF        <1>         je      get_dfname_fchar_attr
  1998 000073C5 72AF                <1> 	jb	short loc_print_dir_call_all
  1999 000073C7 24DF                <1> 	and	al, 0DFh
  2000                              <1> pass_attr_s:
  2001 000073C9 3C48                <1> 	cmp	al, 'H'
  2002 000073CB 7514                <1> 	jne	short pass_attr_h
  2003 000073CD 800D[483B0100]02    <1> 	or	byte [AttributesMask], 2 ; hidden
  2004                              <1> pass_attr_shr:
  2005 000073D4 AC                  <1> 	lodsb
  2006 000073D5 3C20                <1> 	cmp	al, 20h
  2007 000073D7 0F8434FFFFFF        <1>         je      get_dfname_fchar_attr
  2008 000073DD 7297                <1> 	jb	short loc_print_dir_call_all
  2009 000073DF EBCE                <1> 	jmp	short check_attr_s_cap
  2010                              <1> 
  2011                              <1> pass_attr_h:
  2012 000073E1 3C52                <1> 	cmp	al, 'R'
  2013 000073E3 7509                <1> 	jne	short pass_attr_r
  2014 000073E5 800D[483B0100]01    <1> 	or	byte [AttributesMask], 1 ; read only
  2015 000073EC EBE6                <1> 	jmp	short pass_attr_shr
  2016                              <1> 
  2017                              <1> pass_attr_r:
  2018 000073EE 3C41                <1> 	cmp	al, 'A'
  2019 000073F0 0F8506FEFFFF        <1>         jne     loc_cmd_failed
  2020 000073F6 800D[483B0100]20    <1> 	or	byte [AttributesMask], 20h ; archive
  2021 000073FD EBD5                <1> 	jmp	short pass_attr_shr
  2022                              <1> 
  2023                              <1> print_directory:
  2024                              <1> 	; 13/05/2016
  2025                              <1> 	; 11/02/2016
  2026                              <1> 	; 10/02/2016
  2027                              <1> 	; 08/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2028                              <1> 	; 30/10/2010 ('proc_print_directory')	
  2029                              <1> 	; 19/09/2009
  2030                              <1> 	; 2005 
  2031                              <1> 	; INPUT ->
  2032                              <1> 	;	ESI = Asciiz File/Dir Name Address
  2033                              <1> 
  2034 000073FF 56                  <1> 	push	esi
  2035                              <1> 
  2036 00007400 29C0                <1> 	sub	eax, eax
  2037                              <1> 
  2038 00007402 66A3[D43B0100]      <1> 	mov	word [Dir_Count], ax ; 0
  2039 00007408 66A3[D23B0100]      <1> 	mov 	word [File_Count], ax ; 0
  2040 0000740E A3[D63B0100]        <1> 	mov 	dword [Total_FSize], eax ; 0
  2041                              <1> 
  2042 00007413 E86AE6FFFF          <1> 	call    clear_screen
  2043                              <1> 	
  2044 00007418 31C9                <1> 	xor	ecx, ecx	
  2045 0000741A 8A2D[A6310100]      <1> 	mov     ch, [Current_Drv] ; DirBuff_Drv - 'A'
  2046 00007420 A0[A7310100]        <1> 	mov     al, [Current_Dir_Drv] 
  2047 00007425 A2[CAEE0000]        <1> 	mov     [Dir_Drive_Name], al
  2048 0000742A BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2049 0000742F 01CE                <1> 	add	esi, ecx
  2050                              <1> 
  2051 00007431 E86EF9FFFF          <1> 	call	move_volume_name_and_serial_no
  2052 00007436 730C                <1> 	jnc	short print_dir_strlen_check
  2053                              <1> 
  2054 00007438 5E                  <1> 	pop	esi
  2055 00007439 8A3D[0E310100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
  2056                              <1> 	;call	beeper
  2057                              <1> 	;retn
  2058 0000743F E9D4A8FFFF          <1> 	jmp	beeper  ; beep ! and return
  2059                              <1> 
  2060                              <1> print_dir_strlen_check:
  2061 00007444 BE[A9310100]        <1> 	mov	esi, Current_Dir_Root
  2062 00007449 BF[67EF0000]        <1> 	mov	edi, Dir_Str_Root
  2063                              <1> 	
  2064                              <1> 	;xor	ecx, ecx
  2065 0000744E 8A0D[05320100]      <1>         mov     cl, [Current_Dir_StrLen]
  2066 00007454 FEC1                <1> 	inc	cl
  2067 00007456 80F940              <1> 	cmp	cl, 64
  2068 00007459 760D                <1> 	jna	short pass_print_dir_strlen_shorting
  2069 0000745B 46                  <1> 	inc	esi
  2070 0000745C 01CE                <1> 	add	esi, ecx
  2071 0000745E 83EE40              <1> 	sub	esi, 64 
  2072 00007461 47                  <1> 	inc	edi
  2073 00007462 B82E2E2E20          <1> 	mov	eax, '... ' 
  2074 00007467 AB                  <1> 	stosd
  2075                              <1>  
  2076                              <1> pass_print_dir_strlen_shorting:
  2077 00007468 F3A4                <1> 	rep	movsb
  2078                              <1> 
  2079 0000746A BE[BDEE0000]        <1> 	mov	esi, Dir_Drive_Str
  2080 0000746F E8F8E5FFFF          <1> 	call	print_msg
  2081                              <1> 
  2082 00007474 BE[1CEF0000]        <1> 	mov	esi, Vol_Serial_Header
  2083 00007479 E8EEE5FFFF          <1> 	call	print_msg
  2084                              <1> 
  2085 0000747E BE[5CEF0000]        <1> 	mov	esi, Dir_Str_Header
  2086 00007483 E8E4E5FFFF          <1> 	call	print_msg
  2087                              <1> 	
  2088 00007488 BE[C1FF0000]        <1> 	mov	esi, next2line
  2089 0000748D E8DAE5FFFF          <1> 	call	print_msg
  2090                              <1> 
  2091                              <1> loc_print_dir_first_file:
  2092 00007492 C605[E93B0100]10    <1> 	mov	byte [PrintDir_RowCounter], 16
  2093 00007499 66A1[483B0100]      <1> 	mov	ax, [AttributesMask]
  2094 0000749F 5E                  <1> 	pop	esi
  2095                              <1> 
  2096 000074A0 E859020000          <1> 	call	find_first_file
  2097 000074A5 0F826F010000        <1>         jc      loc_dir_ok
  2098                              <1> 	 
  2099                              <1> loc_dfname_use_this:
  2100                              <1> 	; bl =	File Attributes (bh = Long Name Entry Length)
  2101 000074AB F6C310              <1> 	test	bl, 10h  ; Is it a directory?
  2102 000074AE 741B                <1> 	jz	short loc_not_dir
  2103                              <1> 
  2104 000074B0 66FF05[D43B0100]    <1> 	inc	word [Dir_Count]
  2105 000074B7 89F2                <1> 	mov	edx, esi 	; FindFile_DirEntry address
  2106 000074B9 BE[A8F00000]        <1>  	mov	esi, Type_Dir	; '<DIR>     '
  2107 000074BE BF[BFF00000]        <1> 	mov	edi, Dir_Or_FileSize
  2108                              <1> 	; move 10 bytes
  2109 000074C3 A5                  <1> 	movsd
  2110 000074C4 A5                  <1> 	movsd
  2111 000074C5 66A5                <1> 	movsw	    	
  2112 000074C7 89D6                <1> 	mov	esi, edx
  2113 000074C9 EB36                <1> 	jmp     short loc_dir_attribute
  2114                              <1> 
  2115                              <1> loc_not_dir:
  2116 000074CB 66FF05[D23B0100]    <1> 	inc	word [File_Count]
  2117 000074D2 0105[D63B0100]      <1> 	add	[Total_FSize], eax
  2118                              <1> 
  2119 000074D8 B90A000000          <1> 	mov	ecx, 10  ; 32 bit divisor
  2120 000074DD 89CF                <1> 	mov	edi, ecx
  2121 000074DF 81C7[BFF00000]      <1> 	add	edi, Dir_Or_FileSize
  2122                              <1> loc_dir_rdivide:
  2123 000074E5 29D2                <1> 	sub	edx, edx
  2124 000074E7 F7F1                <1> 	div	ecx 	 ; remainder in dl (< 10)
  2125 000074E9 80C230              <1> 	add     dl, '0'	 ; to make visible (ascii)
  2126 000074EC 4F                  <1> 	dec	edi
  2127 000074ED 8817                <1> 	mov     [edi], dl
  2128 000074EF 21C0                <1> 	and	eax, eax
  2129 000074F1 75F2                <1> 	jnz	short loc_dir_rdivide
  2130                              <1> 
  2131                              <1> loc_dir_fill_space:
  2132 000074F3 81FF[BFF00000]      <1> 	cmp     edi, Dir_Or_FileSize
  2133 000074F9 7606                <1> 	jna     short loc_dir_attribute
  2134 000074FB 4F                  <1> 	dec     edi
  2135 000074FC C60720              <1> 	mov     byte [edi], 20h
  2136 000074FF EBF2                <1> 	jmp     short loc_dir_fill_space
  2137                              <1> 
  2138                              <1> loc_dir_attribute:
  2139 00007501 C705[CAF00000]2020- <1> 	mov	dword [File_Attribute], 20202020h
  2139 00007509 2020                <1>
  2140                              <1> 
  2141 0000750B 80FB20              <1> 	cmp	bl, 20h  ; Is it an archive file?
  2142 0000750E 7207                <1> 	jb	short loc_dir_pass_arch
  2143 00007510 C605[CDF00000]41    <1> 	mov	byte [File_Attribute+3], 'A'
  2144                              <1> 
  2145                              <1> loc_dir_pass_arch:
  2146 00007517 80E307              <1> 	and	bl, 7
  2147 0000751A 7428                <1> 	jz	short loc_dir_file_name
  2148 0000751C 88DF                <1> 	mov	bh, bl
  2149 0000751E 80E303              <1> 	and	bl, 3
  2150 00007521 38DF                <1> 	cmp	bh, bl
  2151 00007523 7607                <1> 	jna	short loc_dir_pass_s
  2152 00007525 C605[CAF00000]53    <1> 	mov	byte [File_Attribute], 'S'
  2153                              <1> 
  2154                              <1> loc_dir_pass_s:
  2155 0000752C 80E302              <1> 	and     bl,2
  2156 0000752F 7407                <1> 	jz      short loc_dir_pass_h
  2157 00007531 C605[CBF00000]48    <1> 	mov     byte [File_Attribute+1], 'H'
  2158                              <1> loc_dir_pass_h:
  2159 00007538 80E701              <1> 	and     bh,1
  2160 0000753B 7407                <1> 	jz      short loc_dir_file_name
  2161 0000753D C605[CCF00000]52    <1> 	mov     byte [File_Attribute+2], 'R'
  2162                              <1> loc_dir_file_name:
  2163                              <1> 	;mov     bx, [esi+18h] ; Date
  2164                              <1> 	;mov     dx, [esi+16h] ; Time
  2165 00007544 8B5E16              <1> 	mov	ebx, [esi+16h]
  2166 00007547 89F1                <1> 	mov	ecx, esi ; FindFile_DirEntry address
  2167 00007549 BF[B2F00000]        <1> 	mov     edi, File_Name
  2168                              <1> 	; move 8 bytes
  2169 0000754E A5                  <1> 	movsd
  2170 0000754F A5                  <1> 	movsd
  2171 00007550 C60720              <1> 	mov	byte [edi], 20h
  2172 00007553 47                  <1> 	inc	edi
  2173                              <1> 	; move 3 bytes
  2174 00007554 66A5                <1> 	movsw
  2175 00007556 A4                  <1> 	movsb
  2176 00007557 89CE                <1> 	mov	esi, ecx
  2177                              <1> 
  2178                              <1> Dir_Time_start:
  2179                              <1> 	;mov	ax, dx		; Time
  2180 00007559 6689D8              <1> 	mov	ax, bx
  2181 0000755C 66C1E805            <1> 	shr	ax, 5		; shift right 5 times
  2182 00007560 6683E03F            <1> 	and	ax, 0000111111b	; Minute Mask
  2183 00007564 D40A                <1> 	aam			; Q([AL]/10)->AH
  2184                              <1> 				; R([AL]/10)->AL
  2185                              <1> 				; [AL]+[AH]= Minute as BCD
  2186 00007566 660D3030            <1> 	or	ax, '00'	; Convert to ASCII
  2187 0000756A 86E0                <1> 	xchg	ah, al
  2188 0000756C 66A3[DDF00000]      <1> 	mov	[File_Minute], ax
  2189                              <1> 
  2190                              <1> 	;mov	al, dh
  2191 00007572 88F8                <1> 	mov	al, bh
  2192 00007574 C0E803              <1> 	shr	al, 3		; shift right 3 times
  2193 00007577 D40A                <1> 	aam			; [AL]+[AH]= Hours as BCD
  2194 00007579 660D3030            <1> 	or	ax, '00'
  2195 0000757D 86E0                <1> 	xchg	ah, al
  2196 0000757F 66A3[DAF00000]      <1> 	mov     [File_Hour], ax
  2197                              <1> 
  2198 00007585 C1EB10              <1> 	shr	ebx, 16		; BX = Date
  2199                              <1> 	
  2200                              <1> Dir_Date_start:
  2201 00007588 6689D8              <1> 	mov	ax, bx		; Date
  2202 0000758B 6683E01F            <1> 	and	ax, 00011111b	; Day Mask
  2203 0000758F D40A                <1> 	aam			; Q([AL]/10)->AH
  2204                              <1> 				; R([AL]/10)->AL
  2205                              <1> 				; [AL]+[AH]= Day as BCD
  2206 00007591 660D3030            <1> 	or	ax, '00'	; Convert to ASCII
  2207 00007595 86C4                <1> 	xchg	al, ah
  2208                              <1> 
  2209 00007597 66A3[CFF00000]      <1> 	mov	[File_Day], ax
  2210                              <1> 
  2211 0000759D 6689D8              <1> 	mov	ax, bx
  2212 000075A0 66C1E805            <1> 	shr	ax, 5		; shift right 5 times
  2213 000075A4 6683E00F            <1> 	and	ax, 00001111b	; Month Mask
  2214 000075A8 D40A                <1> 	aam
  2215 000075AA 660D3030            <1> 	or	ax, '00'
  2216 000075AE 86E0                <1> 	xchg	ah, al
  2217 000075B0 66A3[D2F00000]      <1> 	mov	[File_Month], ax
  2218                              <1> 
  2219 000075B6 6689D8              <1> 	mov	ax, bx
  2220 000075B9 66C1E809            <1> 	shr     ax, 9
  2221 000075BD 6683E07F            <1> 	and	ax, 01111111b	; Result = Year - 1980
  2222 000075C1 6605BC07            <1> 	add	ax, 1980
  2223                              <1> 
  2224 000075C5 B10A                <1> 	mov	cl, 10
  2225 000075C7 F6F1                <1> 	div	cl		; Q -> AL, R -> AH 
  2226 000075C9 80CC30              <1> 	or	ah, '0'
  2227 000075CC 8825[D8F00000]      <1> 	mov	[File_Year+3], ah
  2228 000075D2 D40A                <1> 	aam
  2229 000075D4 86E0                <1> 	xchg	ah, al
  2230 000075D6 80CC30              <1> 	or	ah, '0'	  ; Convert to ASCII
  2231 000075D9 8825[D7F00000]      <1> 	mov	[File_Year+2], ah
  2232 000075DF D40A                <1> 	aam
  2233 000075E1 86C4                <1> 	xchg	al, ah
  2234 000075E3 660D3030            <1> 	or	ax, '00'
  2235 000075E7 66A3[D5F00000]      <1> 	mov	[File_Year], ax
  2236                              <1> 
  2237                              <1> loc_show_line:
  2238 000075ED 56                  <1> 	push	esi
  2239 000075EE BE[B2F00000]        <1> 	mov     esi, File_Name
  2240 000075F3 E874E4FFFF          <1> 	call	print_msg
  2241 000075F8 BE[C3FF0000]        <1> 	mov	esi, nextline
  2242 000075FD E86AE4FFFF          <1> 	call	print_msg
  2243 00007602 5E                  <1> 	pop	esi
  2244                              <1> 
  2245 00007603 FE0D[E93B0100]      <1> 	dec	byte [PrintDir_RowCounter]
  2246 00007609 0F84D4000000        <1>         jz      pause_dir_scroll
  2247                              <1> 
  2248                              <1> loc_next_entry:
  2249 0000760F E899010000          <1> 	call	find_next_file
  2250 00007614 0F8391FEFFFF        <1>         jnc     loc_dfname_use_this
  2251                              <1> 
  2252                              <1> loc_dir_ok:
  2253 0000761A B90A000000          <1> 	mov     ecx, 10
  2254 0000761F 66A1[D43B0100]      <1> 	mov	ax, [Dir_Count]
  2255 00007625 BF[F3F00000]        <1> 	mov	edi, Decimal_Dir_Count
  2256 0000762A 6639C8              <1> 	cmp	ax, cx ; 10
  2257 0000762D 7216                <1> 	jb	short pass_ddc
  2258 0000762F 47                  <1> 	inc	edi
  2259 00007630 6683F864            <1> 	cmp	ax, 100
  2260 00007634 720F                <1> 	jb	short pass_ddc
  2261 00007636 47                  <1> 	inc	edi
  2262 00007637 663DE803            <1> 	cmp	ax, 1000
  2263 0000763B 7208                <1> 	jb	short pass_ddc
  2264 0000763D 47                  <1> 	inc	edi
  2265 0000763E 663D1027            <1> 	cmp	ax, 10000
  2266 00007642 7201                <1> 	jb	short pass_ddc
  2267 00007644 47                  <1> 	inc	edi
  2268                              <1> pass_ddc:
  2269 00007645 886F01              <1> 	mov     [edi+1], ch ; 0
  2270                              <1> loc_ddc_rediv:
  2271 00007648 31D2                <1> 	xor     edx, edx
  2272 0000764A 66F7F1              <1> 	div     cx	; 10
  2273 0000764D 80C230              <1> 	add     dl, '0'
  2274 00007650 8817                <1> 	mov     [edi], dl
  2275 00007652 4F                  <1> 	dec     edi
  2276 00007653 6609C0              <1> 	or	ax, ax
  2277 00007656 75F0                <1> 	jnz	short loc_ddc_rediv
  2278                              <1> 
  2279 00007658 66A1[D23B0100]      <1> 	mov     ax, [File_Count]
  2280 0000765E BF[E2F00000]        <1> 	mov     edi, Decimal_File_Count
  2281 00007663 6639C8              <1> 	cmp     ax, cx ; 10
  2282 00007666 7216                <1> 	jb      short pass_dfc
  2283 00007668 47                  <1> 	inc     edi
  2284 00007669 6683F864            <1> 	cmp     ax, 100
  2285 0000766D 720F                <1> 	jb      short pass_dfc
  2286 0000766F 47                  <1> 	inc     edi
  2287 00007670 663DE803            <1> 	cmp     ax, 1000
  2288 00007674 7208                <1> 	jb      short pass_dfc
  2289 00007676 47                  <1> 	inc     edi
  2290 00007677 663D1027            <1> 	cmp     ax, 10000
  2291 0000767B 7201                <1> 	jb      short pass_dfc
  2292 0000767D 47                  <1> 	inc     edi
  2293                              <1> pass_dfc:
  2294                              <1> 	;mov    cx, 10
  2295 0000767E 886F01              <1> 	mov     [edi+1], ch ; 00
  2296                              <1> loc_dfc_rediv:
  2297                              <1> 	;xor	dx, dx
  2298 00007681 30D2                <1> 	xor	dl, dl
  2299 00007683 66F7F1              <1> 	div	cx
  2300 00007686 80C230              <1> 	add	dl, '0'
  2301 00007689 8817                <1> 	mov	[edi], dl
  2302 0000768B 4F                  <1> 	dec	edi
  2303 0000768C 6609C0              <1> 	or	ax, ax
  2304 0000768F 75F0                <1> 	jnz	short loc_dfc_rediv
  2305                              <1> 
  2306 00007691 BF[E83B0100]        <1> 	mov     edi, TFS_Dec_End
  2307                              <1>         ;mov    byte [edi], 0
  2308 00007696 A1[D63B0100]        <1> 	mov     eax, [Total_FSize]
  2309                              <1> 	;mov    ecx, 10
  2310                              <1> rediv_tfs_hex:
  2311                              <1> 	;sub	edx, edx
  2312 0000769B 28D2                <1> 	sub	dl, dl
  2313 0000769D F7F1                <1> 	div	ecx
  2314 0000769F 80C230              <1> 	add	dl, '0'
  2315 000076A2 4F                  <1> 	dec     edi
  2316 000076A3 8817                <1> 	mov     [edi], dl
  2317 000076A5 21C0                <1> 	and	eax, eax
  2318 000076A7 75F2                <1> 	jnz	short rediv_tfs_hex
  2319                              <1> 	
  2320 000076A9 893D[DA3B0100]      <1> 	mov	[TFS_Dec_Begin], edi
  2321 000076AF BE[E0F00000]        <1> 	mov	esi, Decimal_File_Count_Header
  2322 000076B4 E8B3E3FFFF          <1> 	call	print_msg
  2323 000076B9 BE[E8F00000]        <1> 	mov	esi, str_files
  2324 000076BE E8A9E3FFFF          <1> 	call	print_msg
  2325 000076C3 BE[F9F00000]        <1> 	mov	esi, str_dirs
  2326 000076C8 E89FE3FFFF          <1> 	call	print_msg
  2327 000076CD 8B35[DA3B0100]      <1> 	mov	esi, [TFS_Dec_Begin]
  2328 000076D3 E894E3FFFF          <1> 	call	print_msg
  2329 000076D8 BE[0AF10000]        <1> 	mov	esi, str_bytes
  2330 000076DD E88AE3FFFF          <1> 	call	print_msg
  2331                              <1> 
  2332 000076E2 C3                  <1> 	retn
  2333                              <1> 
  2334                              <1> pause_dir_scroll:
  2335 000076E3 28E4                <1> 	sub	ah, ah           
  2336 000076E5 E8B294FFFF          <1> 	call	int16h
  2337 000076EA 3C1B                <1> 	cmp	al, 1Bh
  2338 000076EC 0F8428FFFFFF        <1>         je      loc_dir_ok
  2339 000076F2 C605[E93B0100]10    <1> 	mov	byte [PrintDir_RowCounter], 16 ; Reset counter
  2340 000076F9 E911FFFFFF          <1>         jmp     loc_next_entry
  2341                              <1> 
  2342                              <1> find_first_file:
  2343                              <1> 	; 11/02/2016
  2344                              <1> 	; 10/02/2016
  2345                              <1> 	; 08/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2346                              <1> 	; 09/10/2011
  2347                              <1> 	; 17/09/2009
  2348                              <1> 	; 2005
  2349                              <1> 	; INPUT ->
  2350                              <1> 	;	ESI = ASCIIZ File/Dir Name Address (in Current Directory)
  2351                              <1> 	;	AL = Attributes AND mask (The AND result must be equal to AL)
  2352                              <1> 	;	      bit 0 = Read Only
  2353                              <1> 	;	      bir 1 = Hidden
  2354                              <1> 	;	      bit 2 = System
  2355                              <1> 	;	      bit 3 = Volume Label
  2356                              <1> 	;	      bit 4 = Directory
  2357                              <1> 	;	      bit 5 = Archive
  2358                              <1> 	;	      bit 6 = Reserved, must be 0
  2359                              <1> 	;	      bit 7 = Reserved, must be 0
  2360                              <1> 	;       AH = Attributes Negative AND mask (The AND result must be ZERO)
  2361                              <1> 	;
  2362                              <1> 	; OUTPUT ->
  2363                              <1> 	;	CF = 1 -> Error, Error Code in EAX (AL)
  2364                              <1> 	;	CF = 0 ->
  2365                              <1> 	;	     ESI = Directory Entry (FindFile_DirEntry) Location
  2366                              <1> 	;	     EDI = Directory Buffer Directory Entry Location
  2367                              <1> 	;	     EAX = File Size
  2368                              <1> 	;	      BL = Attributes of The File/Directory
  2369                              <1> 	;	      BH = Long Name Yes/No Status (>0 is YES)
  2370                              <1> 	;             DX > 0 : Ambiguous filename chars are used
  2371                              <1> 	;
  2372                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
  2373                              <1> 
  2374 000076FE 66A3[9A3B0100]      <1> 	mov	[FindFile_AttributesMask], ax
  2375 00007704 BF[9C3B0100]        <1> 	mov	edi, FindFile_DirEntry ; TR-DOS Fullfilename formatted buffer
  2376 00007709 31C0                <1> 	xor	eax, eax
  2377 0000770B B90B000000          <1> 	mov	ecx, 11
  2378 00007710 F3AB                <1> 	rep	stosd	; 44 bytes
  2379                              <1> 	;stosw		; +2 bytes 
  2380                              <1> 	    
  2381 00007712 BF[8C3B0100]        <1> 	mov	edi, FindFile_Name ; FFF structure, offset 66
  2382 00007717 39FE                <1> 	cmp	esi, edi
  2383 00007719 7408                <1> 	je	short loc_fff_mfn_ok
  2384 0000771B 89FA                <1> 	mov	edx, edi 
  2385                              <1> 	 ; move 13 bytes
  2386 0000771D A5                  <1> 	movsd
  2387 0000771E A5                  <1> 	movsd
  2388 0000771F A5                  <1> 	movsd
  2389 00007720 AA                  <1> 	stosb
  2390 00007721 89D6                <1> 	mov	esi, edx
  2391                              <1> loc_fff_mfn_ok:
  2392 00007723 BF[3B3B0100]        <1> 	mov	edi, Dir_Entry_Name ; Dir Entry Format File Name
  2393 00007728 E81D210000          <1> 	call	convert_file_name
  2394 0000772D 89FE                <1> 	mov	esi, edi ; offset Dir_Entry_Name
  2395                              <1> 
  2396 0000772F 66A1[9A3B0100]      <1> 	mov	ax, [FindFile_AttributesMask]
  2397                              <1> 	;xor	ecx, ecx
  2398 00007735 30C9                <1> 	xor	cl, cl  
  2399 00007737 E8191E0000          <1> 	call	locate_current_dir_file
  2400 0000773C 726E                <1> 	jc	short loc_fff_retn
  2401                              <1> 	; EDI = Directory Entry
  2402                              <1> 	; EBX = Directory Buffer Entry Index/Number
  2403                              <1> 
  2404                              <1> loc_fff_fnf_ln_check:
  2405 0000773E 30ED                <1> 	xor	ch, ch 
  2406 00007740 80F60F              <1> 	xor	dh, 0Fh
  2407 00007743 7408                <1> 	jz	short loc_fff_longname_yes
  2408 00007745 882D[993B0100]      <1> 	mov	[FindFile_LongNameYes], ch ; 0
  2409 0000774B EB0C                <1> 	jmp	short loc_fff_longname_no
  2410                              <1> 
  2411                              <1> loc_fff_longname_yes:
  2412                              <1> 	;inc	byte [FindFile_LongNameYes]
  2413 0000774D 8A0D[A63A0100]      <1> 	mov	cl, [LFN_EntryLength]  
  2414 00007753 880D[993B0100]      <1> 	mov	[FindFile_LongNameEntryLength], cl ; FindFile_LongNameYes
  2415                              <1> 
  2416                              <1> loc_fff_longname_no:
  2417                              <1> 	;mov	bx, [DirBuff_CurrentEntry]
  2418 00007759 66891D[C43B0100]    <1> 	mov	[FindFile_DirEntryNumber], bx
  2419 00007760 6689C2              <1> 	mov	dx, ax ; Ambigouos Filename chars used sign > 0
  2420                              <1> 
  2421 00007763 A0[A6310100]        <1> 	mov	al, [Current_Drv]
  2422 00007768 A2[4A3B0100]        <1> 	mov	[FindFile_Drv], al 
  2423                              <1> 
  2424 0000776D A1[A0310100]        <1> 	mov	eax, [Current_Dir_FCluster]
  2425 00007772 A3[BC3B0100]        <1> 	mov	[FindFile_DirFirstCluster], eax
  2426                              <1> 
  2427 00007777 A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
  2428 0000777C A3[C03B0100]        <1> 	mov	[FindFile_DirCluster], eax
  2429                              <1> 
  2430 00007781 66FF05[C63B0100]    <1> 	inc	word [FindFile_MatchCounter]
  2431                              <1> 
  2432 00007788 89FB                <1> 	mov	ebx, edi
  2433 0000778A 89FE                <1> 	mov	esi, edi
  2434 0000778C BF[9C3B0100]        <1> 	mov	edi, FindFile_DirEntry
  2435 00007791 89F8                <1> 	mov	eax, edi
  2436 00007793 B108                <1> 	mov	cl, 8
  2437 00007795 F3A5                <1> 	rep	movsd
  2438 00007797 89C6                <1> 	mov	esi, eax
  2439 00007799 89DF                <1> 	mov	edi, ebx
  2440                              <1> 
  2441 0000779B A1[B83B0100]        <1> 	mov	eax, [FindFile_DirEntry+28] ; File Size
  2442                              <1> 
  2443 000077A0 8A1D[A73B0100]      <1> 	mov	bl, [FindFile_DirEntry+11] ; File Attributes 
  2444 000077A6 8A3D[993B0100]      <1> 	mov	bh, [FindFile_LongNameYes]
  2445                              <1> 
  2446                              <1> 	;mov	cx, [DirBuff_EntryCounter]
  2447                              <1> 	;mov	[FindFile_DirEntryNumber], cx
  2448                              <1> 	;mov	cx, [FindFile_DirEntryNumber]
  2449                              <1> 	; ecx = 0
  2450                              <1> 
  2451                              <1> loc_fff_retn:
  2452 000077AC C3                  <1> 	retn
  2453                              <1> 
  2454                              <1> find_next_file:
  2455                              <1> 	; 15/10/2016
  2456                              <1> 	; 10/02/2016
  2457                              <1> 	; 08/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2458                              <1> 	; 06/02/2011
  2459                              <1> 	; 17/09/2009
  2460                              <1> 	; 2005
  2461                              <1> 	; INPUT ->
  2462                              <1> 	;	NONE, Find First File Parameters
  2463                              <1> 	; OUTPUT ->
  2464                              <1> 	;	CF = 1 -> Error, Error Code in EAX (AL)
  2465                              <1> 	;	CF = 0 -> 
  2466                              <1> 	;	    ESI = Directory Entry (FindFile_DirEntry) Location
  2467                              <1> 	;	    EDI = Directory Buffer Directory Entry Location
  2468                              <1> 	;	    EAX = File Size
  2469                              <1> 	;	      BL = Attributes of The File/Directory
  2470                              <1> 	;	      BH = Long Name Yes/No Status (>0 is YES)
  2471                              <1> 	;             DX > 0 : Ambiguous filename chars are used 
  2472                              <1> 	;
  2473                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
  2474                              <1> 
  2475 000077AD 66833D[C63B0100]00  <1> 	cmp	word [FindFile_MatchCounter], 0
  2476 000077B5 7707                <1> 	ja	short loc_start_search_next_file
  2477                              <1> 
  2478                              <1> loc_fnf_stc_retn:
  2479 000077B7 F9                  <1> 	stc
  2480                              <1> loc_fnf_ax12h_retn:
  2481 000077B8 B80C000000          <1> 	mov	eax, 12 ; No More files
  2482                              <1> ;loc_fnf_retn:
  2483 000077BD C3                  <1> 	retn
  2484                              <1> 
  2485                              <1> loc_start_search_next_file:
  2486 000077BE 668B1D[C43B0100]    <1> 	mov	bx, [FindFile_DirEntryNumber]
  2487 000077C5 6643                <1> 	inc	bx
  2488 000077C7 663B1D[D3390100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  2489 000077CE 7719                <1> 	ja	short loc_cont_search_next_file
  2490                              <1> 
  2491                              <1> loc_fnf_search:
  2492 000077D0 BE[3B3B0100]        <1> 	mov	esi, Dir_Entry_Name
  2493 000077D5 66A1[9A3B0100]      <1> 	mov	ax, [FindFile_AttributesMask]
  2494 000077DB 6631C9              <1> 	xor	cx, cx
  2495 000077DE E8741E0000          <1> 	call	find_directory_entry
  2496 000077E3 0F8355FFFFFF        <1>         jnc     loc_fff_fnf_ln_check
  2497                              <1> 
  2498                              <1> loc_cont_search_next_file:
  2499 000077E9 31DB                <1> 	xor	ebx, ebx
  2500 000077EB 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
  2501 000077F1 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2502 000077F6 01DE                <1> 	add	esi, ebx
  2503                              <1> 
  2504 000077F8 803D[A4310100]00    <1> 	cmp	byte [Current_Dir_Level], 0
  2505 000077FF 7608                <1> 	jna	short loc_fnf_check_FAT_type
  2506 00007801 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  2507 00007805 72B1                <1> 	jb	short loc_fnf_ax12h_retn
  2508 00007807 EB06                <1> 	jmp	short loc_fnf_check_next_cluster
  2509                              <1>  
  2510                              <1> loc_fnf_check_FAT_type:
  2511 00007809 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3
  2512 0000780D 72A9                <1> 	jb	short loc_fnf_ax12h_retn
  2513                              <1> 
  2514                              <1> loc_fnf_check_next_cluster:
  2515 0000780F A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
  2516 00007814 E813380000          <1> 	call	get_next_cluster
  2517 00007819 7306                <1> 	jnc	short loc_fnf_load_next_dir_cluster
  2518 0000781B 09C0                <1> 	or	eax, eax
  2519 0000781D 7498                <1> 	jz	short loc_fnf_stc_retn
  2520                              <1> 	;mov	eax, 17 ;Drive not ready or read error
  2521 0000781F F5                  <1>  	cmc	;stc
  2522                              <1> loc_fnf_retn:
  2523 00007820 C3                  <1> 	retn
  2524                              <1> 
  2525                              <1> loc_fnf_load_next_dir_cluster:
  2526 00007821 E8EC390000          <1> 	call	load_FAT_sub_directory
  2527 00007826 72F8                <1> 	jc	short loc_fnf_retn
  2528 00007828 6631DB              <1> 	xor	bx, bx
  2529 0000782B 66891D[C43B0100]    <1> 	mov	[FindFile_DirEntryNumber], bx
  2530 00007832 EB9C                <1> 	jmp	short loc_fnf_search
  2531                              <1> 
  2532                              <1> get_and_print_longname:
  2533                              <1> 	; 16/10/2016
  2534                              <1> 	; 13/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2535                              <1> 	; 24/01/2010
  2536                              <1> 	; 17/10/2009 (CMD_INTR.ASM, 'cmp_cmd_longname')
  2537                              <1> get_longname_fchar:
  2538 00007834 803E20              <1> 	cmp	byte [esi], 20h
  2539 00007837 7701                <1> 	ja	short loc_find_longname
  2540                              <1> 	;jb	short loc_longname_retn
  2541                              <1> 	;inc	esi
  2542                              <1> 	;je	short get_longname_fchar
  2543                              <1> ;loc_longname_retn:
  2544 00007839 C3                  <1> 	retn
  2545                              <1> loc_find_longname:
  2546 0000783A E87F210000          <1> 	call	find_longname
  2547 0000783F 7328                <1> 	jnc	short loc_print_longname
  2548                              <1> 	
  2549 00007841 08C0                <1> 	or	al, al
  2550 00007843 741A                <1> 	jz	short loc_longname_not_found
  2551                              <1> 	  
  2552                              <1> 	; 16/10/2016 (15h -> 15, 17)
  2553 00007845 3C0F                <1> 	cmp	al, 15
  2554 00007847 0F84C5F7FFFF        <1> 	je	cd_drive_not_ready ; drive not ready
  2555                              <1> 				   ; or
  2556 0000784D 3C11                <1> 	cmp	al, 17		   ; read error	
  2557 0000784F 0F84BDF7FFFF        <1> 	je	cd_drive_not_ready 
  2558                              <1> 
  2559                              <1> loc_ln_file_dir_not_found:
  2560 00007855 BE[38F00000]        <1> 	mov	esi, Msg_File_Directory_Not_Found
  2561                              <1> 	;call	print_msg	
  2562                              <1>         ;retn
  2563 0000785A E90DE2FFFF          <1> 	jmp	print_msg
  2564                              <1> 
  2565                              <1> loc_longname_not_found:
  2566 0000785F BE[57F00000]        <1>         mov     esi, Msg_LongName_Not_Found
  2567                              <1> 	;call	print_msg	
  2568                              <1>         ;retn
  2569 00007864 E903E2FFFF          <1> 	jmp	print_msg
  2570                              <1> 
  2571                              <1> loc_print_longname:
  2572                              <1> 	;mov	esi, LongFileName
  2573 00007869 BF[A6320100]        <1> 	mov	edi, TextBuffer
  2574 0000786E 57                  <1> 	push	edi 
  2575 0000786F 3C00                <1> 	cmp	al, 0
  2576 00007871 7708                <1> 	ja	short loc_print_longname_1
  2577                              <1> loc_print_FS_longname: ; Singlix FS (64 byte ASCIIZ file name)
  2578 00007873 AC                  <1> 	lodsb
  2579 00007874 AA                  <1> 	stosb  
  2580 00007875 08C0                <1> 	or	al, al
  2581 00007877 75FA                <1> 	jnz	short loc_print_FS_longname
  2582 00007879 EB07                <1> 	jmp	short loc_print_longname_2
  2583                              <1> 	;
  2584                              <1> loc_print_longname_1: ; MS Windows long name (UNICODE chars)
  2585 0000787B 66AD                <1> 	lodsw
  2586 0000787D AA                  <1> 	stosb  
  2587 0000787E 08C0                <1> 	or	al, al
  2588 00007880 75F9                <1> 	jnz	short loc_print_longname_1
  2589                              <1> 	;
  2590                              <1> loc_print_longname_2:	
  2591 00007882 5E                  <1> 	pop	esi
  2592 00007883 E8E4E1FFFF          <1> 	call	print_msg
  2593 00007888 BE[C3FF0000]        <1>   	mov	esi, nextline
  2594                              <1> 	;call	print_msg
  2595                              <1> 	;retn
  2596 0000788D E9DAE1FFFF          <1> 	jmp	print_msg	
  2597                              <1> 
  2598                              <1> show_file:
  2599                              <1> 	; 18/02/2016
  2600                              <1> 	; 17/02/2016
  2601                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2602                              <1> 	; 13/09/2011 (CMD_INTR.ASM, 'cmp_cmd_show')
  2603                              <1> 	; 08/11/2009
  2604                              <1> 
  2605                              <1> loc_show_parse_path_name:
  2606 00007892 BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  2607 00007897 E879200000          <1> 	call	parse_path_name
  2608 0000789C 0F825AF9FFFF        <1> 	jc	loc_cmd_failed
  2609                              <1> 
  2610                              <1> loc_show_check_filename_exists:
  2611 000078A2 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  2612 000078A7 803E20              <1> 	cmp	byte [esi], 20h
  2613 000078AA 0F864CF9FFFF        <1> 	jna	loc_cmd_failed
  2614                              <1> 
  2615                              <1> 	; 15/02/2016 (invalid file name check)
  2616 000078B0 E809020000          <1> 	call	check_filename 	
  2617 000078B5 730A                <1> 	jnc	short loc_show_change_drv
  2618                              <1> 
  2619 000078B7 BE[20F10000]        <1> 	mov	esi, Msg_invalid_name_chars
  2620 000078BC E9ABE1FFFF          <1> 	jmp	print_msg
  2621                              <1>    
  2622                              <1> loc_show_change_drv:
  2623 000078C1 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  2624 000078C7 8835[063A0100]      <1> 	mov	[RUN_CDRV], dh
  2625 000078CD 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  2626 000078D3 38F2                <1> 	cmp	dl, dh
  2627 000078D5 740B                <1> 	je	short loc_show_change_directory
  2628 000078D7 E890EAFFFF          <1> 	call	change_current_drive
  2629                              <1> 	;jc	loc_file_rw_cmd_failed
  2630 000078DC 0F8245F9FFFF        <1> 	jc	loc_run_cmd_failed
  2631                              <1> 
  2632                              <1> loc_show_change_directory:
  2633 000078E2 803D[4B3B0100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  2634 000078E9 7618                <1> 	jna	short loc_findload_showfile
  2635                              <1> 
  2636 000078EB FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  2637 000078F1 BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  2638 000078F6 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  2639 000078F8 E8041A0000          <1> 	call	change_current_directory
  2640                              <1> 	;jc	loc_file_rw_cmd_failed
  2641 000078FD 0F8224F9FFFF        <1> 	jc	loc_run_cmd_failed
  2642                              <1> 
  2643                              <1> ;loc_show_change_prompt_dir_string:
  2644                              <1> 	;call	change_prompt_dir_string
  2645                              <1> 
  2646                              <1> loc_findload_showfile:
  2647                              <1> 	; 15/02/2016
  2648 00007903 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  2649 00007908 BF[3B3B0100]        <1> 	mov	edi, Dir_Entry_Name ; Dir Entry Format File Name
  2650 0000790D E8381F0000          <1> 	call	convert_file_name
  2651 00007912 89FE                <1> 	mov	esi, edi ; offset Dir_Entry_Name
  2652                              <1> 
  2653 00007914 28C0                <1> 	sub	al, al	; Attrib AND mask = 0
  2654                              <1> 	; Directory attribute : 10h
  2655                              <1> 	; Volume name attribute: 8h
  2656 00007916 B418                <1> 	mov	ah, 00011000b ; 18h (Attrib NAND, AND --> zero mask)
  2657                              <1> 	;
  2658 00007918 6631C9              <1> 	xor	cx, cx  
  2659 0000791B E8351C0000          <1> 	call	locate_current_dir_file
  2660                              <1> 	;jc	loc_file_rw_cmd_failed
  2661 00007920 0F8201F9FFFF        <1> 	jc	loc_run_cmd_failed
  2662                              <1> 
  2663                              <1> loc_show_load_file:
  2664                              <1> 	; EDI = Directory Entry
  2665 00007926 668B4714            <1> 	mov	ax, [edi+DirEntry_FstClusHI] ; First Cluster High Word
  2666 0000792A C1E010              <1> 	shl	eax, 16
  2667 0000792D 668B471A            <1> 	mov	ax, [edi+DirEntry_FstClusLO] ; First Cluster Low Word
  2668 00007931 A3[F43B0100]        <1> 	mov	[Show_Cluster], eax
  2669 00007936 8B471C              <1> 	mov	eax, [edi+DirEntry_FileSize] ; File Size
  2670 00007939 21C0                <1> 	and	eax, eax ; Empty file !
  2671 0000793B 0F8491000000        <1>         jz      end_of_show_file 
  2672 00007941 A3[F83B0100]        <1> 	mov	[Show_FileSize], eax
  2673 00007946 31C0                <1> 	xor	eax, eax
  2674 00007948 A3[FC3B0100]        <1> 	mov	[Show_FilePointer], eax ; 0
  2675 0000794D 66A3[003C0100]      <1> 	mov	[Show_ClusterPointer], ax ; 0
  2676 00007953 29DB                <1> 	sub	ebx, ebx
  2677 00007955 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
  2678 0000795B BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2679 00007960 01DE                <1> 	add	esi, ebx
  2680 00007962 8935[F03B0100]      <1> 	mov	[Show_LDDDT], esi ; Logical DOS Drv Description Table addr
  2681                              <1> 
  2682 00007968 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0	
  2683 0000796C 7713                <1> 	ja	short loc_show_calculate_cluster_size
  2684                              <1> 	; Singlix FS
  2685                              <1> 	; First Cluster Number is FDT number (in compatibility buffer)
  2686 0000796E 8B15[F43B0100]      <1> 	mov	edx, [Show_Cluster] ; Compatibility dir. buffer value (FDT)	
  2687 00007974 8915[EC3B0100]      <1> 	mov	[Show_FDT], edx
  2688 0000797A 31C0                <1> 	xor	eax, eax
  2689 0000797C A3[F43B0100]        <1> 	mov	[Show_Cluster], eax ; Sector index  = 0
  2690                              <1> 				    ; (next time it will be 1)			
  2691                              <1> loc_show_calculate_cluster_size:
  2692 00007981 668B5E11            <1> 	mov	bx, [esi+LD_BPB+BPB_BytsPerSec] ; FAT 12-16-32 (512)
  2693                              <1> 	; BX = 512 = [esi+LD_FS_BytesPerSec] ; Singlix FS	
  2694 00007985 8A4613              <1> 	mov	al, [esi+LD_BPB+BPB_SecPerClust] ; FAT 12-16-32 (<= 128)
  2695                              <1> 	; AL = 1 = [esi+LD_FS_Reserved2] ; SectPerClust for Singlix FS
  2696 00007988 F7E3                <1> 	mul	ebx	
  2697                              <1> 
  2698                              <1> 	;cmp	eax, 65536 ; non-compatible (very big) cluster size
  2699                              <1> 	;ja	short end_of_show_file	
  2700 0000798A 66A3[023C0100]      <1> 	mov	[Show_ClusterSize], ax
  2701                              <1> 
  2702                              <1> loc_start_show_file:
  2703 00007990 BE[C3FF0000]        <1> 	mov	esi, nextline
  2704 00007995 E8D2E0FFFF          <1> 	call	print_msg
  2705                              <1> 
  2706 0000799A A1[F43B0100]        <1> 	mov	eax, [Show_Cluster]
  2707 0000799F C605[043C0100]17    <1> 	mov	byte [Show_RowCount], 23
  2708                              <1> 
  2709                              <1> 	; 17/02/2016
  2710 000079A6 8B35[F03B0100]      <1> 	mov	esi, [Show_LDDDT]
  2711                              <1> 
  2712                              <1> loc_show_next_cluster:
  2713                              <1> 	; 15/02/2016
  2714 000079AC BB00000700          <1> 	mov	ebx, Cluster_Buffer ; 70000h (for current TRDOS 386 version)
  2715                              <1> 	; ESI = Logical DOS drv description table address
  2716 000079B1 E89A380000          <1> 	call	read_cluster
  2717                              <1> 	;jc	loc_file_rw_cmd_failed
  2718 000079B6 0F826BF8FFFF        <1> 	jc	loc_run_cmd_failed
  2719                              <1> 
  2720 000079BC 31DB                <1> 	xor 	ebx, ebx
  2721                              <1> loc_show_next_byte:
  2722 000079BE 803D[043C0100]00    <1> 	cmp	byte [Show_RowCount], 0
  2723 000079C5 7521                <1> 	jne	short pass_show_wait_for_key
  2724 000079C7 30E4                <1> 	xor	ah, ah
  2725 000079C9 E8CE91FFFF          <1> 	call	int16h
  2726 000079CE 3C1B                <1> 	cmp	al, 1Bh
  2727 000079D0 750F                <1> 	jne	short pass_exit_show
  2728                              <1> end_of_show_file:
  2729                              <1> pass_show_file:
  2730 000079D2 BE[C3FF0000]        <1> 	mov	esi, nextline
  2731 000079D7 E890E0FFFF          <1> 	call	print_msg
  2732 000079DC E94D010000          <1> 	jmp	loc_file_rw_restore_retn
  2733                              <1> 
  2734                              <1> pass_exit_show:
  2735 000079E1 C605[043C0100]14    <1> 	mov	byte [Show_RowCount], 20
  2736                              <1> pass_show_wait_for_key:
  2737 000079E8 81C300000700        <1> 	add	ebx, Cluster_Buffer
  2738 000079EE 8A03                <1> 	mov	al, [ebx]
  2739 000079F0 3C0D                <1> 	cmp	al, 0Dh
  2740 000079F2 0F8590000000        <1>         jne     loc_show_check_tab_space
  2741 000079F8 FE0D[043C0100]      <1> 	dec	byte [Show_RowCount]
  2742                              <1> pass_show_dec_rowcount:
  2743 000079FE B307                <1> 	mov	bl, 7 ; (light gray character color, black background)
  2744 00007A00 8A3D[0E310100]      <1> 	mov	bh, [ACTIVE_PAGE] ; [ptty]
  2745 00007A06 E82DA2FFFF          <1> 	call	_write_tty
  2746                              <1> loc_show_check_eof:
  2747 00007A0B FF05[FC3B0100]      <1> 	inc	dword [Show_FilePointer]
  2748 00007A11 A1[FC3B0100]        <1> 	mov	eax, [Show_FilePointer]
  2749 00007A16 3B05[F83B0100]      <1> 	cmp	eax, [Show_FileSize]
  2750 00007A1C 73B4                <1> 	jnb	short end_of_show_file
  2751 00007A1E 66FF05[003C0100]    <1> 	inc	word [Show_ClusterPointer]
  2752 00007A25 0FB71D[003C0100]    <1> 	movzx	ebx, word [Show_ClusterPointer]
  2753                              <1> 
  2754                              <1> 	; 17/02/2016
  2755                              <1> 	; (sector boundary -9 bits- check, 512 = 0)
  2756 00007A2C 66F7C3FF01          <1>         test    bx, 1FFh ;  1 to 511
  2757 00007A31 758B                <1> 	jnz	short loc_show_next_byte
  2758                              <1> 
  2759                              <1> 	; 16/02/2016
  2760 00007A33 8B35[F03B0100]      <1> 	mov	esi, [Show_LDDDT]
  2761                              <1> 	;
  2762 00007A39 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  2763 00007A3D 7719                <1> 	ja	short loc_show_check_fat_cluster_size
  2764                              <1> 
  2765                              <1> 	; Singlix FS
  2766                              <1> 	; 1 sector, more... (cluster size = 1 sector)
  2767 00007A3F A1[F43B0100]        <1> 	mov	eax, [Show_Cluster]
  2768 00007A44 40                  <1> 	inc	eax
  2769 00007A45 A3[F43B0100]        <1> 	mov	[Show_Cluster], eax
  2770                              <1> 
  2771 00007A4A 6621DB              <1> 	and	bx, bx ; 65536 -> 0
  2772 00007A4D 0F856BFFFFFF        <1>         jnz	loc_show_next_byte
  2773 00007A53 E954FFFFFF          <1> 	jmp     loc_show_next_cluster
  2774                              <1> 	 
  2775                              <1> loc_show_check_fat_cluster_size:
  2776                              <1> 	; 17/02/2016
  2777 00007A58 663B1D[023C0100]    <1> 	cmp	bx, [Show_ClusterSize] ; cluster size in bytes
  2778 00007A5F 0F8259FFFFFF        <1>         jb	loc_show_next_byte
  2779 00007A65 66C705[003C0100]00- <1> 	mov	word [Show_ClusterPointer], 0
  2779 00007A6D 00                  <1>
  2780                              <1> 
  2781 00007A6E A1[F43B0100]        <1> 	mov	eax, [Show_Cluster]
  2782                              <1> 	;mov	esi, [Show_LDDDT]
  2783                              <1> loc_show_get_next_cluster:
  2784 00007A73 E8B4350000          <1> 	call	get_next_cluster
  2785                              <1> 	;jc	loc_file_rw_cmd_failed
  2786 00007A78 0F82A9F7FFFF        <1> 	jc	loc_run_cmd_failed
  2787                              <1> loc_show_update_ccluster:
  2788 00007A7E A3[F43B0100]        <1> 	mov	[Show_Cluster], eax			
  2789 00007A83 E924FFFFFF          <1>         jmp     loc_show_next_cluster
  2790                              <1> 
  2791                              <1> loc_show_check_tab_space:
  2792 00007A88 3C09                <1> 	cmp	al, 09h
  2793 00007A8A 0F856EFFFFFF        <1>         jne     pass_show_dec_rowcount
  2794                              <1> loc_show_put_tab_space:
  2795 00007A90 8A3D[0E310100]      <1> 	mov	bh, [ACTIVE_PAGE] ; [ptty]
  2796 00007A96 E82C9EFFFF          <1> 	call	get_cpos
  2797                              <1> 	; dl = cursor column
  2798 00007A9B 80E207              <1> 	and	dl, 7 ; 18/02/2016
  2799                              <1> 	;shr	bh, 1 ; [ACTIVE_PAGE]
  2800 00007A9E 8A3D[0E310100]      <1> 	mov	bh, [ACTIVE_PAGE]
  2801 00007AA4 B307                <1> 	mov	bl, 7 ; color attribute
  2802                              <1> loc_show_put_space_chars:
  2803 00007AA6 B020                <1> 	mov	al, 20h ; space
  2804                              <1> 	;mov	bh, [ACTIVE_PAGE] ; [ptty]
  2805                              <1> 	;mov	bl, 7 ; color attribute
  2806 00007AA8 6652                <1> 	push	dx
  2807 00007AAA E889A1FFFF          <1> 	call	_write_tty
  2808 00007AAF 665A                <1> 	pop	dx
  2809                              <1> 	; 18/02/2016
  2810 00007AB1 80FA07              <1> 	cmp	dl, 7
  2811 00007AB4 0F8351FFFFFF        <1> 	jnb	loc_show_check_eof
  2812 00007ABA FEC2                <1> 	inc	dl
  2813 00007ABC EBE8                <1> 	jmp	short loc_show_put_space_chars
  2814                              <1> 
  2815                              <1> check_filename:
  2816                              <1> 	; 10/10/2016
  2817                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2818                              <1> 	; 07/08/2010 (FILE.ASM, 'proc_check_filename')
  2819                              <1> 	; 10/07/2010
  2820                              <1> 	; Derived from 'proc_check_filename'
  2821                              <1> 	; in the old TRDOS.ASM (09/02/2005).
  2822                              <1> 	;
  2823                              <1> 	; INPUT -> 
  2824                              <1> 	;	ESI = Dot File Name Location
  2825                              <1> 	; OUTPUT ->
  2826                              <1> 	;	cf = 1 -> error code in AL
  2827                              <1> 	;	     AL = ERR_INV_FILE_NAME (=26)
  2828                              <1> 	;		  Invalid file name chars   
  2829                              <1> 	;	cf = 0 -> valid file name
  2830                              <1> 	; 
  2831                              <1> 	;(EAX, ECX, EDI will be changed)
  2832                              <1> 
  2833                              <1> check_invalid_filename_chars:
  2834                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2835                              <1> 	; 10/07/2010 (FILE.ASM, 'proc_check_invalid_filename_chars')
  2836                              <1> 	; 10/02/2010
  2837                              <1> 	; Derived from 'proc_check_invalid_filename_chars'
  2838                              <1> 	; in the old TRDOS.ASM (09/02/2005).
  2839                              <1> 	;
  2840                              <1> 	; INPUT -> 
  2841                              <1> 	;	ESI = ASCIIZ FileName
  2842                              <1> 	; OUTPUT ->
  2843                              <1> 	;	cf = 1 -> invalid
  2844                              <1> 	;	cf = 0 -> valid
  2845                              <1> 	; 
  2846                              <1> 	;(EAX, ECX, EDI will be changed)
  2847                              <1>   
  2848 00007ABE 56                  <1> 	push	esi
  2849                              <1> 
  2850 00007ABF BF[0CEE0000]        <1>         mov     edi, invalid_fname_chars
  2851 00007AC4 AC                  <1> 	lodsb
  2852                              <1> check_filename_next_char:
  2853 00007AC5 B914000000          <1> 	mov	ecx, sizeInvFnChars
  2854 00007ACA BF[0CEE0000]        <1> 	mov	edi, invalid_fname_chars
  2855                              <1> loc_scan_invalid_filename_char:
  2856 00007ACF AE                  <1> 	scasb 
  2857 00007AD0 741F                <1> 	je	short loc_invalid_filename_stc 
  2858 00007AD2 E2FB                <1> 	loop	loc_scan_invalid_filename_char
  2859 00007AD4 AC                  <1> 	lodsb
  2860 00007AD5 3C1F                <1> 	cmp	al, 1Fh  ; 20h and above 
  2861 00007AD7 77EC                <1> 	ja	short check_filename_next_char
  2862                              <1> 
  2863                              <1> check_filename_dot:
  2864 00007AD9 8B3424              <1> 	mov	esi, [esp]
  2865                              <1> 
  2866 00007ADC B421                <1> 	mov	ah, 21h
  2867 00007ADE B908000000          <1> 	mov	ecx, 8
  2868                              <1> loc_check_filename_next_char:
  2869 00007AE3 AC                  <1> 	lodsb
  2870 00007AE4 3C2E                <1> 	cmp	al, 2Eh
  2871 00007AE6 7511                <1> 	jne	short pass_check_fn_dot_check
  2872                              <1> loc_check_filename_ext_0:
  2873 00007AE8 AC                  <1> 	lodsb
  2874 00007AE9 38E0                <1> 	cmp	al, ah ; 21h
  2875 00007AEB 7205                <1> 	jb	short loc_invalid_filename
  2876 00007AED 3C2E                <1> 	cmp	al, 2Eh
  2877 00007AEF 7519                <1> 	jne	short loc_check_filename_ext_1
  2878                              <1> 
  2879                              <1> loc_invalid_filename_stc:
  2880                              <1> loc_check_fn_stc_rtn:
  2881 00007AF1 F9                  <1> 	stc
  2882                              <1> loc_invalid_filename:
  2883                              <1> 	; 10/10/2016 (0Bh -> 26)
  2884 00007AF2 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; (=26)
  2885                              <1> 	; Invalid file name chars
  2886                              <1> loc_check_fn_rtn:
  2887 00007AF7 5E                  <1> 	pop	esi
  2888 00007AF8 C3                  <1> 	retn
  2889                              <1> 
  2890                              <1> pass_check_fn_dot_check:
  2891 00007AF9 38E0                <1> 	cmp	al, ah ; 21h
  2892 00007AFB 7224                <1> 	jb	short loc_check_fn_clc_rtn
  2893 00007AFD E2E4                <1> 	loop	loc_check_filename_next_char
  2894 00007AFF AC                  <1> 	lodsb
  2895 00007B00 38E0                <1> 	cmp	al, ah ; 21h
  2896 00007B02 721D                <1> 	jb	short loc_check_fn_clc_rtn
  2897 00007B04 3C2E                <1> 	cmp	al, 2Eh
  2898 00007B06 75E9                <1> 	jne	short loc_check_fn_stc_rtn
  2899 00007B08 EBDE                <1> 	jmp	short loc_check_filename_ext_0
  2900                              <1> 
  2901                              <1> loc_check_filename_ext_1:
  2902 00007B0A AC                  <1> 	lodsb
  2903 00007B0B 38E0                <1> 	cmp	al, ah ; 21h
  2904 00007B0D 7212                <1> 	jb	short loc_check_fn_clc_rtn
  2905 00007B0F 3C2E                <1> 	cmp	al, 2Eh
  2906 00007B11 74DE                <1> 	je	short loc_check_fn_stc_rtn
  2907 00007B13 AC                  <1> 	lodsb
  2908 00007B14 38E0                <1> 	cmp	al, ah ; 21h
  2909 00007B16 7209                <1> 	jb	short loc_check_fn_clc_rtn
  2910 00007B18 3C2E                <1> 	cmp	al, 2Eh
  2911 00007B1A 74D5                <1> 	je	short loc_check_fn_stc_rtn
  2912 00007B1C AC                  <1> 	lodsb
  2913 00007B1D 38E0                <1> 	cmp	al, ah ; 21h
  2914 00007B1F 73D0                <1> 	jnb	short loc_check_fn_stc_rtn
  2915                              <1> 
  2916                              <1> loc_check_fn_clc_rtn:
  2917 00007B21 5E                  <1> 	pop	esi
  2918 00007B22 F8                  <1> 	clc
  2919 00007B23 C3                  <1> 	retn
  2920                              <1> 
  2921                              <1> loc_print_deleted_message:
  2922 00007B24 BE[F5F10000]        <1> 	mov	esi, Msg_Deleted
  2923 00007B29 E83EDFFFFF          <1> 	call	print_msg
  2924                              <1> 
  2925                              <1> 	;clc
  2926                              <1> 
  2927                              <1> loc_file_rw_restore_retn:
  2928                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2929                              <1> 	; 28/02/2010 (CMD_INTR.ASM)
  2930                              <1> loc_file_rw_cmd_failed:
  2931 00007B2E 9C                  <1> 	pushf 
  2932 00007B2F E84DF7FFFF          <1> 	call	restore_cdir_after_cmd_fail	
  2933 00007B34 9D                  <1> 	popf
  2934 00007B35 720D                <1> 	jc	short loc_file_rw_check_write_fault
  2935 00007B37 C3                  <1> 	retn
  2936                              <1> 
  2937                              <1> loc_permission_denied:
  2938                              <1> 	; 27/02/2016
  2939 00007B38 BE[02F20000]        <1> 	mov	esi, Msg_Permission_Denied
  2940 00007B3D E82ADFFFFF          <1> 	call	print_msg
  2941 00007B42 EBEA                <1> 	jmp	short loc_file_rw_restore_retn
  2942                              <1> 
  2943                              <1> loc_file_rw_check_write_fault:
  2944                              <1> 	;cmp	al, 1Dh ; Write Fault
  2945 00007B44 3C12                <1>         cmp	al, 18 ; 05/11/2016
  2946 00007B46 0F85E0F6FFFF        <1> 	jne     loc_run_cmd_failed_cmp_al
  2947 00007B4C BE[EDEF0000]        <1> 	mov	esi, Msg_Not_Ready_Write_Err
  2948                              <1> 	;call	print_msg
  2949                              <1> 	;retn
  2950 00007B51 E916DFFFFF          <1> 	jmp	print_msg
  2951                              <1> 
  2952                              <1> make_directory:
  2953                              <1> 	; 21/02/2016 (TRDOS 386 =  TRDOS v2.0)
  2954                              <1> 	; 12/03/2011 (CMD_INTR.ASM, 'cmp_cmd_mkdir')
  2955                              <1> 	; 14/08/2010
  2956                              <1> 	; 10/07/2010
  2957                              <1> 	; 29/11/2009
  2958                              <1> 	;
  2959                              <1> get_mkdir_fchar:
  2960                              <1> 	; esi = directory name
  2961 00007B56 803E20              <1> 	cmp	byte [esi], 20h
  2962 00007B59 7701                <1>         ja	short loc_mkdir_parse_path_name
  2963                              <1> 
  2964                              <1> loc_mkdir_nodirname_retn:
  2965 00007B5B C3                  <1> 	retn
  2966                              <1> 
  2967                              <1> loc_mkdir_parse_path_name:
  2968 00007B5C BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  2969 00007B61 E8AF1D0000          <1>         call    parse_path_name
  2970 00007B66 0F8290F6FFFF        <1> 	jc	loc_cmd_failed
  2971                              <1> 
  2972                              <1> loc_mkdir_check_dirname_exists:
  2973 00007B6C BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  2974 00007B71 803E20              <1> 	cmp	byte [esi], 20h
  2975 00007B74 0F8682F6FFFF        <1> 	jna	loc_cmd_failed
  2976 00007B7A 8935[083C0100]      <1> 	mov	[DelFile_FNPointer], esi
  2977 00007B80 E839FFFFFF          <1> 	call	check_filename
  2978 00007B85 7259                <1> 	jc	short loc_mkdir_invalid_dir_name_chars
  2979                              <1> 
  2980                              <1> loc_mkdir_drv:
  2981 00007B87 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  2982 00007B8D 8835[063A0100]      <1> 	mov	[RUN_CDRV], dh
  2983                              <1> 	
  2984 00007B93 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  2985 00007B99 38F2                <1> 	cmp	dl, dh
  2986 00007B9B 7407                <1> 	je	short loc_mkdir_change_directory
  2987                              <1> 
  2988 00007B9D E8CAE7FFFF          <1> 	call	change_current_drive
  2989 00007BA2 728A                <1> 	jc	loc_file_rw_cmd_failed
  2990                              <1> 
  2991                              <1> loc_mkdir_change_directory:
  2992 00007BA4 803D[4B3B0100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  2993 00007BAB 7614                <1> 	jna	short loc_mkdir_find_directory
  2994                              <1> 
  2995 00007BAD FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  2996 00007BB3 BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  2997 00007BB8 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  2998 00007BBA E842170000          <1> 	call	change_current_directory
  2999 00007BBF 722E                <1> 	jc	short loc_mkdir_check_error_code
  3000                              <1> 
  3001                              <1> ;loc_mkdir_change_prompt_dir_string:
  3002                              <1> 	;call	change_prompt_dir_string
  3003                              <1> 
  3004                              <1> loc_mkdir_find_directory:
  3005                              <1> 	;mov	esi, FindFile_Name
  3006 00007BC1 8B35[083C0100]      <1> 	mov	esi, [DelFile_FNPointer]
  3007                              <1> 	;xor	eax, eax
  3008 00007BC7 6631C0              <1> 	xor	ax, ax ; any name (dir, file, volume)
  3009 00007BCA E82FFBFFFF          <1> 	call	find_first_file
  3010 00007BCF 721E                <1> 	jc	short loc_mkdir_check_error_code
  3011                              <1> 
  3012                              <1> loc_mkdir_directory_found:
  3013 00007BD1 BE[4DF10000]        <1> 	mov	esi, Msg_Name_Exists
  3014 00007BD6 E891DEFFFF          <1> 	call	print_msg
  3015                              <1> 
  3016 00007BDB E94EFFFFFF          <1>         jmp     loc_file_rw_restore_retn
  3017                              <1> 
  3018                              <1> loc_mkdir_invalid_dir_name_chars:
  3019 00007BE0 BE[20F10000]        <1> 	mov	esi, Msg_invalid_name_chars
  3020 00007BE5 E882DEFFFF          <1> 	call	print_msg
  3021                              <1> 
  3022 00007BEA E93FFFFFFF          <1>         jmp     loc_file_rw_restore_retn
  3023                              <1> 
  3024                              <1> loc_mkdir_check_error_code:
  3025 00007BEF 3C02                <1> 	cmp	al, 2
  3026                              <1> 	;je	short loc_mkdir_directory_not_found
  3027 00007BF1 7406                <1> 	je	short loc_mkdir_ask_for_yes_no
  3028 00007BF3 F9                  <1> 	stc
  3029 00007BF4 E935FFFFFF          <1>         jmp     loc_file_rw_cmd_failed
  3030                              <1> 
  3031                              <1> loc_mkdir_directory_not_found:
  3032                              <1> loc_mkdir_ask_for_yes_no:
  3033 00007BF9 BE[6EF10000]        <1> 	mov	esi, Msg_DoYouWantMkdir
  3034 00007BFE E869DEFFFF          <1> 	call	print_msg
  3035 00007C03 8B35[083C0100]      <1> 	mov	esi, [DelFile_FNPointer]
  3036 00007C09 E85EDEFFFF          <1> 	call	print_msg
  3037 00007C0E BE[8DF10000]        <1> 	mov	esi, Msg_YesNo
  3038 00007C13 E854DEFFFF          <1> 	call	print_msg
  3039                              <1> 
  3040 00007C18 C605[97F10000]20    <1> 	mov	byte [Y_N_nextline], 20h
  3041                              <1> 
  3042                              <1> loc_mkdir_ask_again:
  3043 00007C1F 30E4                <1> 	xor	ah, ah
  3044 00007C21 E8768FFFFF          <1> 	call	int16h
  3045 00007C26 3C1B                <1> 	cmp	al, 1Bh
  3046                              <1> 	;je	short loc_do_not_make_directory
  3047 00007C28 7447                <1> 	je	short loc_mkdir_y_n_escape
  3048 00007C2A 24DF                <1> 	and	al, 0DFh ; y -> Y, n -> N
  3049 00007C2C 3C59                <1> 	cmp	al, 'Y' ; 'yes'
  3050 00007C2E 7404                <1> 	je	short loc_mkdir_yes_make_directory
  3051 00007C30 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3052 00007C32 75EB                <1> 	jne	short loc_mkdir_ask_again
  3053                              <1> 
  3054                              <1> loc_do_not_make_directory:
  3055                              <1> loc_mkdir_yes_make_directory:
  3056 00007C34 A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  3057 00007C39 6650                <1> 	push	ax
  3058 00007C3B BE[97F10000]        <1> 	mov	esi, Y_N_nextline
  3059 00007C40 E827DEFFFF          <1> 	call	print_msg
  3060 00007C45 6658                <1> 	pop	ax
  3061                              <1> 	;cmp	al, 'Y' ; 'yes'
  3062                              <1> 	;cmc
  3063                              <1>         ;jnc	loc_file_rw_restore_retn
  3064 00007C47 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3065 00007C49 0F84DFFEFFFF        <1>         je	loc_file_rw_restore_retn  
  3066                              <1> 
  3067                              <1> loc_mkdir_call_make_sub_directory:
  3068 00007C4F 8B35[083C0100]      <1> 	mov	esi, [DelFile_FNPointer]
  3069 00007C55 B110                <1> 	mov	cl, 10h ; Directory attributes 
  3070 00007C57 E8B81D0000          <1> 	call	make_sub_directory
  3071                              <1> loc_rename_file_ok: ; 06/03/2016
  3072 00007C5C 0F82CCFEFFFF        <1>         jc	loc_file_rw_cmd_failed
  3073                              <1> move_source_file_to_destination_OK:
  3074 00007C62 BE[9BF10000]        <1> 	mov	esi, Msg_OK
  3075 00007C67 E800DEFFFF          <1> 	call	print_msg
  3076 00007C6C E9BDFEFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3077                              <1> 
  3078                              <1> loc_mkdir_y_n_escape:
  3079 00007C71 B04E                <1> 	mov	al, 'N' ; 'no'
  3080 00007C73 EBBF                <1> 	jmp	short loc_do_not_make_directory
  3081                              <1> 
  3082                              <1> delete_directory:
  3083                              <1> 	; 15/10/2016
  3084                              <1> 	; 06/03/2016
  3085                              <1> 	; 01/03/2016
  3086                              <1> 	; 29/02/2016
  3087                              <1> 	; 28/02/2016
  3088                              <1> 	; 27/02/2016
  3089                              <1> 	; 26/02/2016 (TRDOS 386 =  TRDOS v2.0)
  3090                              <1> 	; 16/10/2010 (CMD_INTR.ASM, 'cmp_cmd_rmdir')
  3091                              <1> 	; 05/06/2010
  3092                              <1> 	;
  3093                              <1> get_rmdir_fchar:
  3094                              <1> 	; esi = directory name
  3095 00007C75 803E20              <1> 	cmp	byte [esi], 20h
  3096 00007C78 7701                <1>         ja	short loc_rmdir_parse_path_name
  3097                              <1> 
  3098                              <1> loc_rmdir_nodirname_retn:
  3099 00007C7A C3                  <1> 	retn
  3100                              <1> 
  3101                              <1> loc_rmdir_parse_path_name:
  3102 00007C7B BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  3103 00007C80 E8901C0000          <1> 	call	parse_path_name
  3104 00007C85 0F8271F5FFFF        <1> 	jc	loc_cmd_failed
  3105                              <1> 
  3106                              <1> loc_rmdir_check_dirname_exists:
  3107 00007C8B BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  3108 00007C90 803E20              <1> 	cmp	byte [esi], 20h
  3109 00007C93 0F8663F5FFFF        <1> 	jna	loc_cmd_failed
  3110 00007C99 8935[083C0100]      <1> 	mov	[DelFile_FNPointer], esi 
  3111                              <1> 
  3112                              <1> loc_rmdir_drv:
  3113 00007C9F 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  3114 00007CA5 8835[063A0100]      <1> 	mov	[RUN_CDRV], dh
  3115                              <1> 
  3116 00007CAB 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  3117 00007CB1 38F2                <1> 	cmp	dl, dh
  3118 00007CB3 740B                <1> 	je	short loc_rmdir_change_directory
  3119                              <1> 
  3120 00007CB5 E8B2E6FFFF          <1> 	call	change_current_drive
  3121 00007CBA 0F826EFEFFFF        <1> 	jc	loc_file_rw_cmd_failed
  3122                              <1> 
  3123                              <1> loc_rmdir_change_directory:
  3124 00007CC0 803D[4B3B0100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3125 00007CC7 7614                <1> 	jna	short loc_rmdir_find_directory
  3126                              <1> 
  3127 00007CC9 FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  3128 00007CCF BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  3129 00007CD4 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3130 00007CD6 E826160000          <1> 	call	change_current_directory
  3131 00007CDB 7211                <1> 	jc	short loc_rmdir_check_error_code
  3132                              <1> 
  3133                              <1> ;loc_rmdir_change_prompt_dir_string:
  3134                              <1> 	;call	change_prompt_dir_string
  3135                              <1> 
  3136                              <1> loc_rmdir_find_directory:
  3137                              <1> 	;mov	esi, FindFile_Name
  3138 00007CDD 8B35[083C0100]      <1> 	mov	esi, [DelFile_FNPointer]
  3139 00007CE3 66B81008            <1> 	mov	ax, 0810h ; Only directories
  3140 00007CE7 E812FAFFFF          <1> 	call	find_first_file
  3141 00007CEC 730A                <1> 	jnc	short loc_rmdir_ambgfn_check
  3142                              <1> 
  3143                              <1> loc_rmdir_check_error_code:
  3144 00007CEE 3C02                <1> 	cmp	al, 2
  3145 00007CF0 740B                <1> 	je	short loc_rmdir_directory_not_found
  3146 00007CF2 F9                  <1> 	stc
  3147 00007CF3 E936FEFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3148                              <1> 
  3149                              <1> loc_rmdir_ambgfn_check:
  3150 00007CF8 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3151 00007CFB 740F                <1> 	jz	short loc_rmdir_directory_found
  3152                              <1> 
  3153                              <1> loc_rmdir_directory_not_found:
  3154 00007CFD BE[0FF00000]        <1> 	mov	esi, Msg_Dir_Not_Found
  3155 00007D02 E865DDFFFF          <1> 	call	print_msg
  3156                              <1> 
  3157 00007D07 E922FEFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3158                              <1> 
  3159                              <1> loc_rmdir_directory_found:
  3160 00007D0C 80E307              <1> 	and	bl, 07h ; Attributes
  3161 00007D0F 0F8523FEFFFF        <1> 	jnz	loc_permission_denied
  3162                              <1> 
  3163                              <1> loc_rmdir_save_lnel: ; 28/02/2016
  3164                              <1>        ;mov	bh, [LongName_EntryLength]
  3165 00007D15 883D[123C0100]      <1> 	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
  3166                              <1> 	; edi = Directory Entry Offset (DirBuff)
  3167                              <1> 	; esi = Directory Entry (FFF Structure)
  3168                              <1> 	;mov	[DelFile_DirEntryAddr], edi ; not required
  3169                              <1> 	;mov	ax, [edi+20] ; First Cluster High Word
  3170                              <1>         ;shl	eax, 16
  3171                              <1> 	;mov	ax, [edi+26] ; First Cluster Low Word
  3172                              <1> 	; ROOT Dir First Cluster = 0
  3173                              <1>         ;cmp	eax, 2
  3174                              <1> 	;jb	loc_update_direntry_1
  3175                              <1> 
  3176                              <1> pass_rmdir_fc_check:
  3177 00007D1B 57                  <1> 	push	edi ; * (29/02/2016)
  3178                              <1> 
  3179 00007D1C BE[A1F10000]        <1> 	mov	esi, Msg_DoYouWantRmDir
  3180 00007D21 E846DDFFFF          <1> 	call	print_msg
  3181 00007D26 8B35[083C0100]      <1> 	mov	esi, [DelFile_FNPointer]
  3182 00007D2C E83BDDFFFF          <1> 	call	print_msg
  3183 00007D31 BE[8DF10000]        <1> 	mov	esi, Msg_YesNo
  3184 00007D36 E831DDFFFF          <1> 	call	print_msg
  3185                              <1> 
  3186                              <1> loc_rmdir_ask_again:
  3187 00007D3B 30E4                <1> 	xor	ah, ah
  3188 00007D3D E85A8EFFFF          <1> 	call	int16h
  3189 00007D42 3C1B                <1> 	cmp	al, 1Bh
  3190                              <1> 	;je	short loc_do_not_delete_directory
  3191 00007D44 0F8498000000        <1>         je      loc_rmdir_y_n_escape ; 06/03/2016
  3192 00007D4A 24DF                <1> 	and	al, 0DFh
  3193 00007D4C A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  3194 00007D51 3C59                <1> 	cmp	al, 'Y'
  3195 00007D53 7404                <1> 	je	short loc_rmdir_yes_delete_directory
  3196 00007D55 3C4E                <1> 	cmp	al, 'N'
  3197 00007D57 75E2                <1> 	jne	short loc_rmdir_ask_again
  3198                              <1> 
  3199                              <1> loc_do_not_delete_directory:
  3200                              <1> loc_rmdir_yes_delete_directory:
  3201 00007D59 A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  3202 00007D5E 6650                <1> 	push	ax
  3203 00007D60 BE[97F10000]        <1> 	mov	esi, Y_N_nextline
  3204 00007D65 E802DDFFFF          <1> 	call	print_msg
  3205 00007D6A 6658                <1> 	pop	ax
  3206 00007D6C 5F                  <1> 	pop	edi ; * (29/02/2016)
  3207                              <1> 	;cmp	al, 'Y' ; 'yes'
  3208                              <1> 	;cmc
  3209                              <1>         ;jnc	loc_file_rw_restore_retn
  3210 00007D6D 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3211 00007D6F 0F84B9FDFFFF        <1>         je	loc_file_rw_restore_retn  
  3212                              <1> 
  3213                              <1> loc_rmdir_delete_short_name_check_dir_empty:
  3214                              <1> 	; EDI = Directory buffer entry offset/address 
  3215 00007D75 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  3216 00007D79 C1E010              <1>         shl	eax, 16
  3217 00007D7C 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  3218                              <1> 
  3219 00007D80 A3[0C3C0100]        <1> 	mov 	[DelFile_FCluster], eax
  3220                              <1> 
  3221                              <1> 	;mov	bx, [DirBuff_EntryCounter]
  3222 00007D85 668B1D[C43B0100]    <1> 	mov	bx, [FindFile_DirEntryNumber] ; 27/02/2016
  3223 00007D8C 66891D[103C0100]    <1> 	mov	[DelFile_EntryCounter], bx
  3224                              <1> 
  3225 00007D93 29DB                <1>     	sub	ebx, ebx
  3226 00007D95 8A3D[4A3B0100]      <1> 	mov	bh, [FindFile_Drv]
  3227 00007D9B BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3228 00007DA0 01DE                <1> 	add	esi, ebx
  3229                              <1> 
  3230 00007DA2 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h
  3231 00007DA8 743F                <1> 	je	short loc_rmdir_delete_fs_directory
  3232                              <1> 
  3233                              <1> 	;cmp	byte [esi+LD_FATType], 1
  3234                              <1> 	;jnb	short loc_rmdir_get__last_cluster_0
  3235                              <1> 	;mov	eax, 0Bh ; Invalid Format
  3236                              <1> 	;jmp	loc_file_rw_cmd_failed
  3237                              <1>   
  3238                              <1> ;loc_rmdir_get_last_cluster_0:
  3239 00007DAA 8B15[D5390100]      <1> 	mov	edx, [DirBuff_Cluster]
  3240 00007DB0 8915[3C3C0100]      <1> 	mov	[RmDir_ParentDirCluster], edx
  3241                              <1> 
  3242 00007DB6 893D[383C0100]      <1> 	mov	[RmDir_DirEntryOffset], edi
  3243                              <1> 
  3244                              <1> 	; 01/03/2016
  3245 00007DBC C705[C6390100]0000- <1> 	mov	dword [FAT_ClusterCounter], 0 ; Reset
  3245 00007DC4 0000                <1>
  3246                              <1> 
  3247                              <1> loc_rmdir_get_last_cluster:
  3248 00007DC6 E85C3A0000          <1> 	call	get_last_cluster
  3249 00007DCB 0F82B8000000        <1>         jc      loc_rmdir_cmd_failed
  3250                              <1> 	
  3251 00007DD1 3B05[0C3C0100]      <1> 	cmp	eax, [DelFile_FCluster]
  3252 00007DD7 752F                <1> 	jne	short loc_rmdir_multi_dir_clusters
  3253                              <1> 
  3254 00007DD9 C605[373C0100]00    <1> 	mov	byte [RmDir_MultiClusters], 0
  3255 00007DE0 EB2D                <1> 	jmp	short pass_rmdir_multi_dir_clusters
  3256                              <1> 
  3257                              <1> loc_rmdir_y_n_escape:
  3258 00007DE2 B04E                <1> 	mov	al, 'N' ; 'no'
  3259 00007DE4 E970FFFFFF          <1>         jmp     loc_do_not_delete_directory
  3260                              <1> 
  3261                              <1> loc_rmdir_delete_fs_directory:
  3262 00007DE9 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  3263 00007DED 0F8545FDFFFF        <1> 	jne	loc_permission_denied
  3264                              <1> 
  3265 00007DF3 E826140000          <1> 	call	delete_fs_directory
  3266 00007DF8 0F8326FDFFFF        <1> 	jnc	loc_print_deleted_message
  3267                              <1> 
  3268 00007DFE 09C0                <1> 	or	eax, eax
  3269 00007E00 745D                <1> 	jz	loc_rmdir_directory_not_empty_2         
  3270 00007E02 F9                  <1> 	stc
  3271 00007E03 E926FDFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3272                              <1>  
  3273                              <1> loc_rmdir_multi_dir_clusters:
  3274 00007E08 C605[373C0100]01    <1> 	mov	byte [RmDir_MultiClusters], 1
  3275                              <1> 
  3276                              <1> pass_rmdir_multi_dir_clusters:
  3277 00007E0F A3[403C0100]        <1> 	mov 	[RmDir_DirLastCluster], eax
  3278 00007E14 890D[443C0100]      <1> 	mov	[RmDir_PreviousCluster], ecx
  3279                              <1> 
  3280                              <1> loc_rmdir_load_fat_sub_directory:
  3281 00007E1A E8F3330000          <1> 	call	load_FAT_sub_directory
  3282 00007E1F 7268                <1> 	jc	loc_rmdir_cmd_failed
  3283                              <1> 
  3284                              <1> loc_rmdir_find_last_dir_entry:
  3285 00007E21 56                  <1> 	push	esi
  3286 00007E22 BE[2E3B0100]        <1> 	mov	esi, Dir_File_Name
  3287 00007E27 C6062A              <1> 	mov	byte [esi], '*'
  3288 00007E2A C646082A            <1> 	mov	byte [esi+8], '*'
  3289 00007E2E 31DB                <1> 	xor	ebx, ebx ; Entry offset  = 0
  3290                              <1> loc_rmdir_find_last_dir_entry_next:
  3291 00007E30 66B80008            <1> 	mov	ax, 0800h ; Except volume/long names
  3292 00007E34 6631C9              <1> 	xor	cx, cx ; 0 = Find a valid file or dir name
  3293 00007E37 E81B180000          <1> 	call	find_directory_entry
  3294 00007E3C 7271                <1> 	jc	short loc_rmdir_empty_dir_cluster
  3295 00007E3E 83FB01              <1> 	cmp	ebx, 1
  3296 00007E41 771B                <1> 	ja	short loc_rmdir_directory_not_empty_1
  3297                              <1> loc_rmdir_dot_entry_check:
  3298 00007E43 80FD2E              <1> 	cmp	ch, '.' ; The first char of the dir entry
  3299 00007E46 7516                <1> 	jne	short loc_rmdir_directory_not_empty_1
  3300 00007E48 08DB                <1> 	or	bl, bl
  3301 00007E4A 7506                <1> 	jnz	short loc_rmdir_dotdot_entry_check
  3302 00007E4C 807F0120            <1> 	cmp	byte [edi+1], 20h
  3303 00007E50 EB06                <1> 	jmp	short pass_rmdir_dot_entry_check
  3304                              <1> 
  3305                              <1> loc_rmdir_dotdot_entry_check:
  3306 00007E52 66817F012E20        <1> 	cmp	word [edi+1], '. '
  3307                              <1> pass_rmdir_dot_entry_check:	
  3308 00007E58 7504                <1> 	jne	short loc_rmdir_directory_not_empty_1 
  3309 00007E5A FEC3                <1> 	inc	bl
  3310 00007E5C EBD2                <1> 	jmp	short loc_rmdir_find_last_dir_entry_next 
  3311                              <1> 
  3312                              <1> 
  3313                              <1> loc_rmdir_directory_not_empty_1:
  3314 00007E5E 58                  <1> 	pop	eax ; pushed esi 
  3315                              <1> 
  3316                              <1> loc_rmdir_directory_not_empty_2:
  3317 00007E5F BE[C2F10000]        <1> 	mov	esi, Msg_Dir_Not_Empty
  3318 00007E64 E803DCFFFF          <1> 	call	print_msg
  3319                              <1> 	; 01/03/2016
  3320 00007E69 A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter]
  3321 00007E6E 09C0                <1> 	or	eax, eax ; 0 ?
  3322 00007E70 0F84B8FCFFFF        <1> 	jz	loc_file_rw_restore_retn
  3323                              <1> 	; ESI = Logical DOS Drive Description Table address	
  3324                              <1> 
  3325 00007E76 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> use ESI for Drive parameters
  3326                              <1> 	           ; BL = 1 -> add free clusters
  3327 00007E7A E829380000          <1> 	call	calculate_fat_freespace
  3328 00007E7F 09C9                <1> 	or	ecx, ecx
  3329 00007E81 0F84A7FCFFFF        <1>         jz      loc_file_rw_restore_retn ; ecx = 0 -> OK
  3330                              <1> 	; ecx > 0 -> Error (Recalculation is neeeded)
  3331 00007E87 EB0E                <1> 	jmp	short loc_rmdir_cmd_return
  3332                              <1> 
  3333                              <1> 
  3334                              <1> loc_rmdir_cmd_failed:
  3335 00007E89 833D[C6390100]01    <1> 	cmp	dword [FAT_ClusterCounter], 1
  3336 00007E90 0F8298FCFFFF        <1> 	jb	loc_file_rw_cmd_failed	
  3337 00007E96 F9                  <1> 	stc
  3338                              <1> loc_rmdir_cmd_return:
  3339                              <1> 	; 01/03/2016
  3340 00007E97 9C                  <1> 	pushf
  3341                              <1> 	; ESI = Logical DOS Drive Description Table address	
  3342 00007E98 66BB00FF            <1> 	mov	bx, 0FF00h ; BH = FFh -> use ESI for Drive parameters
  3343                              <1> 	           ; BL = 0 -> Recalculate free cluster count
  3344 00007E9C 50                  <1> 	push	eax
  3345 00007E9D E806380000          <1> 	call	calculate_fat_freespace	
  3346 00007EA2 58                  <1> 	pop	eax
  3347 00007EA3 9D                  <1> 	popf
  3348 00007EA4 0F8284FCFFFF        <1> 	jc	loc_file_rw_cmd_failed
  3349 00007EAA E97FFCFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3350                              <1> 
  3351                              <1> 
  3352                              <1> loc_rmdir_empty_dir_cluster:
  3353 00007EAF 5E                  <1> 	pop	esi
  3354                              <1> 
  3355                              <1> loc_rmdir_set_prev_cluster_dir_last_cluster:
  3356 00007EB0 803D[373C0100]00    <1> 	cmp	byte [RmDir_MultiClusters], 0
  3357 00007EB7 761D                <1> 	jna	short loc_rmdir_unlink_dir_last_cluster
  3358                              <1> 
  3359 00007EB9 A1[443C0100]        <1> 	mov	eax, [RmDir_PreviousCluster]
  3360                              <1> 	;xor	ecx, ecx
  3361 00007EBE 49                  <1> 	dec	ecx ; FFFFFFFFh
  3362 00007EBF E892340000          <1> 	call	update_cluster
  3363 00007EC4 7310                <1> 	jnc	short loc_rmdir_unlink_dir_last_cluster
  3364                              <1> 
  3365                              <1> loc_rmdir_unlink_stc_retn:
  3366                              <1> 	; 01/03/2016
  3367 00007EC6 83F801              <1> 	cmp	eax, 1  ; eax = 0 -> end of cluster chain
  3368 00007EC9 F5                  <1> 	cmc 
  3369 00007ECA 72BD                <1> 	jc	short loc_rmdir_cmd_failed
  3370 00007ECC EB1D                <1> 	jmp	short loc_rmdir_save_fat_buffer 
  3371                              <1> 	
  3372                              <1> loc_rmdir_unlink_stc_retn_0Bh:
  3373 00007ECE B81C000000          <1> 	mov	eax, 28 ; Invalid format ; 15/10/2016
  3374 00007ED3 F9                  <1> 	stc
  3375 00007ED4 EBB3                <1> 	jmp	short loc_rmdir_cmd_failed
  3376                              <1>  
  3377                              <1> loc_rmdir_unlink_dir_last_cluster:
  3378 00007ED6 A1[403C0100]        <1> 	mov	eax, [RmDir_DirLastCluster]
  3379 00007EDB 31C9                <1> 	xor	ecx, ecx ; 0
  3380 00007EDD E874340000          <1> 	call	update_cluster
  3381 00007EE2 73EA                <1> 	jnc	short loc_rmdir_unlink_stc_retn_0Bh
  3382                              <1> 	; Because of it is the last cluster
  3383                              <1> 	; 'update_cluster' must return with eocc error 
  3384 00007EE4 09C0                <1> 	or	eax, eax
  3385 00007EE6 7403                <1> 	jz	short loc_rmdir_save_fat_buffer ; eocc	
  3386 00007EE8 F9                  <1> 	stc
  3387 00007EE9 EB9E                <1>         jmp     short loc_rmdir_cmd_failed
  3388                              <1> 	 
  3389                              <1> loc_rmdir_save_fat_buffer:
  3390 00007EEB 803D[BE390100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
  3391 00007EF2 7525                <1> 	jne	short loc_rmdir_calculate_FAT_freespace
  3392 00007EF4 E81A370000          <1> 	call	save_fat_buffer
  3393 00007EF9 728E                <1> 	jc	short loc_rmdir_cmd_failed
  3394                              <1> 
  3395                              <1> 	; 01/03/2016
  3396 00007EFB 803D[373C0100]00    <1> 	cmp	byte [RmDir_MultiClusters], 0
  3397 00007F02 7615                <1> 	jna	short loc_rmdir_calculate_FAT_freespace
  3398                              <1> 
  3399 00007F04 A1[0C3C0100]        <1> 	mov	eax, [DelFile_FCluster]
  3400 00007F09 E9B8FEFFFF          <1>         jmp     loc_rmdir_get_last_cluster
  3401                              <1> 
  3402                              <1> loc_rmdir_delete_short_name_invalid_data:
  3403 00007F0E B81D000000          <1> 	mov	eax, 29 ; Invalid data (15/10/2016)
  3404 00007F13 F9                  <1> 	stc
  3405 00007F14 E970FFFFFF          <1>         jmp     loc_rmdir_cmd_failed
  3406                              <1> 
  3407                              <1> loc_rmdir_calculate_FAT_freespace:
  3408 00007F19 A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter]
  3409 00007F1E 66BB01FF            <1> 	mov	bx, 0FF01h
  3410                              <1> 	; BL = 1 -> Add EAX to free space count
  3411                              <1> 	; BH = FFh ->
  3412                              <1> 	; ESI = Logical DOS Drive Description Table address
  3413 00007F22 E881370000          <1> 	call	calculate_fat_freespace
  3414                              <1> 
  3415 00007F27 21C9                <1> 	and	ecx, ecx ; ecx = 0 -> valid free sector count
  3416 00007F29 7409                <1> 	jz 	short loc_rmdir_delete_short_name_continue
  3417                              <1> 
  3418                              <1> loc_rmdir_recalculate_FAT_freespace:
  3419 00007F2B 66BB00FF            <1>         mov     bx, 0FF00h ; BL = 0 -> Recalculate free space
  3420 00007F2F E874370000          <1> 	call	calculate_fat_freespace
  3421                              <1> 	          
  3422                              <1> loc_rmdir_delete_short_name_continue:
  3423 00007F34 A1[3C3C0100]        <1> 	mov	eax, [RmDir_ParentDirCluster]
  3424 00007F39 83F802              <1> 	cmp	eax, 2
  3425 00007F3C 730D                <1> 	jnb	short loc_rmdir_del_short_name_load_sub_dir
  3426 00007F3E E844320000          <1> 	call	load_FAT_root_directory
  3427 00007F43 0F82E5FBFFFF        <1> 	jc	loc_file_rw_cmd_failed
  3428 00007F49 EB0B                <1> 	jmp	short loc_rmdir_del_short_name_ld_chk_fclust
  3429                              <1> 
  3430                              <1> loc_rmdir_del_short_name_load_sub_dir:	
  3431 00007F4B E8C2320000          <1> 	call	load_FAT_sub_directory
  3432 00007F50 0F82D8FBFFFF        <1> 	jc	loc_file_rw_cmd_failed
  3433                              <1> 
  3434                              <1> loc_rmdir_del_short_name_ld_chk_fclust:
  3435 00007F56 0FB73D[383C0100]    <1> 	movzx	edi, word [RmDir_DirEntryOffset]
  3436 00007F5D 81C700000800        <1> 	add	edi, Directory_Buffer
  3437                              <1> 
  3438 00007F63 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  3439 00007F67 C1E010              <1> 	shl	eax, 16
  3440 00007F6A 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  3441                              <1>         ; Not necessary... 
  3442 00007F6E 3B05[0C3C0100]      <1> 	cmp	eax, [DelFile_FCluster]
  3443 00007F74 7598                <1> 	jne	short loc_rmdir_delete_short_name_invalid_data
  3444                              <1> 	;
  3445 00007F76 C607E5              <1> 	mov	byte [edi], 0E5h ; 'Deleted' sign
  3446                              <1> 	; 27/02/2016
  3447                              <1> 	; TRDOS v1 has a bug here! it does not set
  3448                              <1> 	; 'DirBuff_ValidData' to 2; as result of this bug,
  3449                              <1> 	; 'save_directory_buffer' would not save the change ! 
  3450 00007F79 C605[D0390100]02    <1>   	mov	byte [DirBuff_ValidData], 2 ; change sign
  3451                              <1> 	;
  3452 00007F80 E8F41D0000          <1> 	call	save_directory_buffer
  3453 00007F85 0F82A3FBFFFF        <1> 	jc	loc_file_rw_cmd_failed 
  3454                              <1> 
  3455                              <1> loc_rmdir_del_long_name:
  3456 00007F8B 0FB615[123C0100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  3457 00007F92 08D2                <1> 	or	dl, dl
  3458 00007F94 7414                <1> 	jz	short loc_rmdir_update_parent_dir_lmdt
  3459                              <1>              
  3460 00007F96 0FB705[103C0100]    <1> 	movzx	eax, word [DelFile_EntryCounter]
  3461 00007F9D 29D0                <1> 	sub	eax, edx
  3462 00007F9F 0F8289FBFFFF        <1> 	jc	loc_file_rw_cmd_failed
  3463                              <1>  
  3464                              <1>  	; EAX = Directory Entry Number of the long name last entry
  3465 00007FA5 E82F1F0000          <1> 	call	delete_longname
  3466                              <1> 	;jc	short loc_file_rw_cmd_failed
  3467                              <1> 
  3468                              <1> loc_rmdir_update_parent_dir_lmdt:
  3469 00007FAA E8651E0000          <1> 	call	update_parent_dir_lmdt
  3470                              <1> 	;jc	short loc_file_rw_cmd_failed
  3471                              <1> 
  3472                              <1> loc_rmdir_ok:
  3473 00007FAF BE[9BF10000]        <1> 	mov	esi, Msg_OK
  3474 00007FB4 E8B3DAFFFF          <1> 	call	print_msg
  3475 00007FB9 E970FBFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3476                              <1> 
  3477                              <1> 
  3478                              <1> delete_file:
  3479                              <1> 	; 29/02/2016
  3480                              <1> 	; 28/02/2016 (TRDOS 386 =  TRDOS v2.0)
  3481                              <1> 	; 09/08/2010 (CMD_INTR.ASM, 'cmp_cmd_del')
  3482                              <1> 	; 28/02/2010
  3483                              <1> 
  3484                              <1> get_delfile_fchar:
  3485                              <1> 	; esi = file name
  3486 00007FBE 803E20              <1> 	cmp	byte [esi], 20h
  3487 00007FC1 7701                <1>         ja	short loc_delfile_parse_path_name
  3488                              <1> 
  3489                              <1> loc_delfile_nofilename_retn:
  3490 00007FC3 C3                  <1> 	retn
  3491                              <1> 
  3492                              <1> loc_delfile_parse_path_name:
  3493 00007FC4 BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  3494 00007FC9 E847190000          <1> 	call	parse_path_name
  3495 00007FCE 0F8228F2FFFF        <1> 	jc	loc_cmd_failed
  3496                              <1> 
  3497                              <1> loc_delfile_check_filename_exists:
  3498 00007FD4 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  3499 00007FD9 803E20              <1> 	cmp	byte [esi], 20h
  3500 00007FDC 0F861AF2FFFF        <1> 	jna	loc_cmd_failed
  3501 00007FE2 8935[083C0100]      <1> 	mov	[DelFile_FNPointer], esi 
  3502                              <1> 
  3503                              <1> loc_delfile_drv:
  3504 00007FE8 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  3505 00007FEE 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  3506 00007FF4 8835[063A0100]      <1> 	mov	[RUN_CDRV], dh
  3507 00007FFA 38F2                <1> 	cmp	dl, dh
  3508 00007FFC 740B                <1> 	je	short loc_delfile_change_directory
  3509                              <1> 
  3510 00007FFE E869E3FFFF          <1> 	call	change_current_drive
  3511 00008003 0F8225FBFFFF        <1> 	jc	loc_file_rw_cmd_failed
  3512                              <1> 
  3513                              <1> loc_delfile_change_directory:
  3514 00008009 803D[4B3B0100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3515 00008010 7618                <1> 	jna	short loc_delfile_find
  3516                              <1> 
  3517 00008012 FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  3518 00008018 BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  3519 0000801D 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3520 0000801F E8DD120000          <1> 	call	change_current_directory
  3521 00008024 0F8204FBFFFF        <1> 	jc	loc_file_rw_cmd_failed
  3522                              <1> 
  3523                              <1> ;loc_delfile_change_prompt_dir_string:
  3524                              <1> 	;call	change_prompt_dir_string
  3525                              <1> 
  3526                              <1> loc_delfile_find:
  3527                              <1> 	;mov	esi, FindFile_Name
  3528 0000802A 8B35[083C0100]      <1> 	mov	esi, [DelFile_FNPointer]
  3529 00008030 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  3530 00008034 E8C5F6FFFF          <1> 	call	find_first_file
  3531 00008039 0F82EFFAFFFF        <1> 	jc	loc_file_rw_cmd_failed
  3532                              <1> 
  3533                              <1> loc_delfile_ambgfn_check:
  3534 0000803F 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3535 00008042 740B                <1> 	jz	short loc_delfile_found
  3536                              <1> 
  3537                              <1> loc_file_not_found:
  3538 00008044 B802000000          <1> 	mov	eax, 2 ; File not found sign
  3539 00008049 F9                  <1> 	stc
  3540 0000804A E9DFFAFFFF          <1> 	jmp	loc_file_rw_cmd_failed   
  3541                              <1> 
  3542                              <1> loc_delfile_found:
  3543 0000804F 80E307              <1> 	and	bl, 07h ; Attributes
  3544 00008052 0F85E0FAFFFF        <1>         jnz     loc_permission_denied
  3545                              <1> 
  3546                              <1> ;loc_delfile_found_save_lnel:
  3547                              <1> ;	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
  3548                              <1> 
  3549                              <1> loc_delfile_ask_for_delete:
  3550 00008058 57                  <1> 	push	edi ; * (29/02/2016)
  3551                              <1> 
  3552 00008059 BE[D9F10000]        <1> 	mov	esi, Msg_DoYouWantDelete
  3553 0000805E E809DAFFFF          <1> 	call	print_msg
  3554 00008063 8B35[083C0100]      <1> 	mov	esi, [DelFile_FNPointer]
  3555 00008069 E8FED9FFFF          <1> 	call	print_msg
  3556 0000806E BE[8DF10000]        <1> 	mov	esi, Msg_YesNo
  3557 00008073 E8F4D9FFFF          <1> 	call	print_msg
  3558                              <1> 
  3559                              <1> loc_delfile_ask_again:
  3560 00008078 30E4                <1> 	xor	ah, ah
  3561 0000807A E81D8BFFFF          <1> 	call	int16h
  3562 0000807F 3C1B                <1> 	cmp	al, 1Bh
  3563                              <1> 	;je	short loc_do_not_delete_file
  3564 00008081 7457                <1> 	je	short loc_delfile_y_n_escape ; 06/03/2016
  3565 00008083 24DF                <1> 	and	al, 0DFh
  3566 00008085 A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  3567 0000808A 3C59                <1> 	cmp	al, 'Y'
  3568 0000808C 7404                <1> 	je	short loc_yes_delete_file
  3569 0000808E 3C4E                <1> 	cmp	al, 'N'
  3570 00008090 75E6                <1> 	jne	short loc_delfile_ask_again
  3571                              <1> 
  3572                              <1> loc_do_not_delete_file:
  3573                              <1> loc_yes_delete_file:
  3574 00008092 A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  3575 00008097 6650                <1> 	push	ax
  3576 00008099 BE[97F10000]        <1> 	mov	esi, Y_N_nextline
  3577 0000809E E8C9D9FFFF          <1> 	call	print_msg
  3578 000080A3 6658                <1> 	pop	ax
  3579 000080A5 5F                  <1> 	pop	edi ; * (29/02/2016)
  3580                              <1> 	;cmp	al, 'Y' ; 'yes'
  3581                              <1> 	;cmc
  3582                              <1>         ;jnc	loc_file_rw_restore_retn
  3583 000080A6 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3584 000080A8 0F8480FAFFFF        <1>         je	loc_file_rw_restore_retn  
  3585                              <1> 
  3586                              <1> loc_delete_file:
  3587 000080AE 8A3D[4A3B0100]      <1> 	mov	bh, [FindFile_Drv]
  3588                              <1> 	;mov	bl, [DelFile_LNEL]
  3589 000080B4 8A1D[993B0100]      <1> 	mov	bl, [FindFile_LongNameEntryLength]
  3590                              <1> 	;mov	cx, [DirBuff_EntryCounter]
  3591 000080BA 668B0D[C43B0100]    <1> 	mov	cx, [FindFile_DirEntryNumber]
  3592                              <1> 	; (*) EDI = Directory buffer entry offset/address 
  3593 000080C1 E8FD1F0000          <1> 	call	remove_file ; (FILE.ASM, 'proc_delete_file')
  3594 000080C6 0F8358FAFFFF        <1> 	jnc	loc_print_deleted_message
  3595                              <1> 
  3596 000080CC 3C05                <1> 	cmp	al, 05h
  3597 000080CE 0F8464FAFFFF        <1> 	je	loc_permission_denied
  3598 000080D4 F9                  <1> 	stc
  3599 000080D5 E954FAFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3600                              <1> 
  3601                              <1> loc_delfile_y_n_escape:
  3602 000080DA B04E                <1> 	mov	al, 'N' ; 'no'
  3603 000080DC EBB4                <1> 	jmp	short loc_do_not_delete_file
  3604                              <1> 
  3605                              <1> set_file_attributes:
  3606                              <1> 	; 06/03/2016
  3607                              <1> 	; 04/03/2016 (TRDOS 386 =  TRDOS v2.0)
  3608                              <1> 	; 10/07/2010 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_attrib')
  3609                              <1> 	; 23/05/2010 
  3610                              <1> 	; 17/12/2000 (P2000.ASM)
  3611                              <1> 
  3612                              <1> 	; esi = file or directory name
  3613 000080DE 6631C0              <1> 	xor	ax, ax
  3614 000080E1 66A3[2AF20000]      <1> 	mov	[Attr_Chars], ax
  3615 000080E7 A2[603C0100]        <1> 	mov	[Attributes], al
  3616                              <1> 
  3617                              <1> get_attrib_fchar:
  3618                              <1> 	; esi = file name
  3619 000080EC 8A06                <1> 	mov	al, [esi]
  3620 000080EE 3C20                <1> 	cmp	al, 20h
  3621 000080F0 7623                <1> 	jna	short loc_attr_file_nofilename_retn
  3622                              <1> 
  3623                              <1> loc_scan_attrib_params:
  3624 000080F2 3C2D                <1> 	cmp	al, '-'
  3625 000080F4 0F871C010000        <1> 	ja	loc_attr_file_parse_path_name
  3626 000080FA 7408                <1> 	je	short loc_attr_space
  3627                              <1> 
  3628 000080FC 3C2B                <1> 	cmp	al, '+'
  3629 000080FE 0F85F8F0FFFF        <1> 	jne	loc_cmd_failed
  3630                              <1> 
  3631                              <1> loc_attr_space:
  3632 00008104 8A6601              <1> 	mov	ah, [esi+1]
  3633 00008107 80FC20              <1>  	cmp	ah, 20h
  3634 0000810A 770A                <1> 	ja	short pass_attr_space
  3635 0000810C 0F82EAF0FFFF        <1> 	jb	loc_cmd_failed
  3636 00008112 46                  <1> 	inc	esi
  3637 00008113 EBEF                <1> 	jmp	short loc_attr_space
  3638                              <1> 
  3639                              <1> loc_attr_file_nofilename_retn:
  3640 00008115 C3                  <1> 	retn
  3641                              <1> 
  3642                              <1> pass_attr_space:
  3643 00008116 80E4DF              <1> 	and	ah, 0DFh
  3644 00008119 80FC53              <1> 	cmp	ah, 'S'
  3645 0000811C 0F87DAF0FFFF        <1> 	ja	loc_cmd_failed
  3646 00008122 7204                <1> 	jb	short pass_attr_system
  3647 00008124 B404                <1> 	mov	ah, 04h   ; System
  3648 00008126 EB21                <1> 	jmp	short pass_attr_archive
  3649                              <1> 
  3650                              <1> pass_attr_system:
  3651 00008128 80FC48              <1> 	cmp	ah, 'H'
  3652 0000812B 7706                <1> 	ja	short pass_attr_hidden
  3653 0000812D 7213                <1> 	jb	short pass_attr_read_only
  3654 0000812F B402                <1> 	mov	ah, 02h    ; Hidden
  3655 00008131 EB16                <1> 	jmp	short pass_attr_archive
  3656                              <1> 
  3657                              <1> pass_attr_hidden:
  3658 00008133 80FC52              <1> 	cmp	ah, 'R'
  3659 00008136 0F87C0F0FFFF        <1> 	ja	loc_cmd_failed
  3660 0000813C 7204                <1> 	jb	short pass_attr_read_only ; Read only
  3661 0000813E B401                <1> 	mov	ah, 01h
  3662 00008140 EB07                <1> 	jmp	short pass_attr_archive
  3663                              <1> 
  3664                              <1> pass_attr_read_only:
  3665 00008142 80FC41              <1> 	cmp	ah, 'A'
  3666 00008145 753B                <1> 	jne	short loc_chk_attr_enter
  3667 00008147 B420                <1> 	mov	ah, 20h    ; Archive
  3668                              <1> 
  3669                              <1> pass_attr_archive:
  3670 00008149 3C2D                <1> 	cmp	al, '-'
  3671 0000814B 7508                <1> 	jne	short pass_reducing_attributes
  3672 0000814D 0825[2AF20000]      <1> 	or	[Attr_Chars], ah
  3673 00008153 EB06                <1> 	jmp	short loc_change_attributes_inc
  3674                              <1> 
  3675                              <1> pass_reducing_attributes:
  3676 00008155 0825[2BF20000]      <1> 	or	[Attr_Chars+1], ah
  3677                              <1> 
  3678                              <1> loc_change_attributes_inc:
  3679 0000815B 46                  <1> 	inc	esi
  3680 0000815C 8A6601              <1> 	mov	ah, [esi+1]
  3681 0000815F 80FC20              <1> 	cmp	ah, 20h
  3682 00008162 7227                <1> 	jb	short pass_change_attr
  3683 00008164 74F5                <1> 	je	short loc_change_attributes_inc
  3684 00008166 80FC2D              <1> 	cmp	ah, '-'
  3685 00008169 770D                <1> 	ja	short loc_chk_next_attr_char1
  3686 0000816B 7405                <1> 	je	short loc_chk_next_attr_char0
  3687 0000816D 80FC2B              <1> 	cmp	ah, '+'
  3688 00008170 7506                <1> 	jne	short loc_chk_next_attr_char1
  3689                              <1> 
  3690                              <1> loc_chk_next_attr_char0:
  3691 00008172 46                  <1> 	inc	esi
  3692 00008173 668B06              <1> 	mov	ax, [esi]
  3693 00008176 EB9E                <1> 	jmp	short pass_attr_space
  3694                              <1> 
  3695                              <1> loc_chk_next_attr_char1:
  3696 00008178 803E2D              <1> 	cmp	byte [esi], '-'
  3697 0000817B 7799                <1> 	ja	short pass_attr_space
  3698 0000817D E988000000          <1>         jmp     loc_attr_file_check_fname_fchar
  3699                              <1> 
  3700                              <1> loc_chk_attr_enter:
  3701 00008182 80FC0D              <1> 	cmp	ah, 0Dh
  3702 00008185 0F8571F0FFFF        <1> 	jne	loc_cmd_failed
  3703                              <1> 
  3704                              <1> pass_change_attr:
  3705 0000818B A0[2AF20000]        <1> 	mov	al, [Attr_Chars]
  3706 00008190 F6D0                <1> 	not	al
  3707 00008192 2005[603C0100]      <1> 	and	[Attributes], al
  3708 00008198 A0[2BF20000]        <1> 	mov	al, [Attr_Chars+1]
  3709 0000819D 0805[603C0100]      <1> 	or	[Attributes], al
  3710                              <1> 
  3711                              <1> loc_show_attributes:
  3712 000081A3 BE[C3FF0000]        <1> 	mov	esi, nextline
  3713 000081A8 E8BFD8FFFF          <1> 	call	print_msg
  3714                              <1> 
  3715                              <1> loc_show_attributes_no_nextline:
  3716 000081AD C705[2AF20000]4E4F- <1> 	mov	dword [Attr_Chars], 'NORM'
  3716 000081B5 524D                <1>
  3717 000081B7 66C705[2EF20000]41- <1> 	mov	word [Attr_Chars+4], 'AL'
  3717 000081BF 4C                  <1>
  3718 000081C0 BE[2AF20000]        <1> 	mov	esi, Attr_Chars
  3719 000081C5 A0[603C0100]        <1> 	mov	al, [Attributes]
  3720 000081CA A804                <1> 	test	al, 04h
  3721 000081CC 7406                <1> 	jz	short pass_put_attr_s
  3722 000081CE 66C7065300          <1> 	mov	word [esi], 0053h     ; S
  3723 000081D3 46                  <1> 	inc	esi
  3724                              <1> 
  3725                              <1> pass_put_attr_s:
  3726 000081D4 A802                <1> 	test	al, 02h
  3727 000081D6 7406                <1> 	jz	short pass_put_attr_h
  3728 000081D8 66C7064800          <1> 	mov	word [esi], 0048h     ; H
  3729 000081DD 46                  <1> 	inc	esi
  3730                              <1> 
  3731                              <1> pass_put_attr_h:
  3732 000081DE A801                <1> 	test	al, 01h
  3733 000081E0 7406                <1> 	jz	short pass_put_attr_r
  3734 000081E2 66C7065200          <1> 	mov	word [esi], 0052h     ; R
  3735 000081E7 46                  <1> 	inc	esi
  3736                              <1> 
  3737                              <1> pass_put_attr_r:
  3738 000081E8 3C20                <1> 	cmp	al, 20h
  3739 000081EA 7205                <1> 	jb	short pass_put_attr_a
  3740 000081EC 66C7064100          <1> 	mov	word [esi], 0041h     ; A
  3741                              <1> 
  3742                              <1> pass_put_attr_a:
  3743 000081F1 BE[1DF20000]        <1> 	mov	esi, Str_Attributes
  3744 000081F6 E871D8FFFF          <1> 	call	print_msg
  3745 000081FB BE[C3FF0000]        <1> 	mov	esi, nextline
  3746 00008200 E867D8FFFF          <1> 	call	print_msg
  3747 00008205 E924F9FFFF          <1> 	jmp	loc_file_rw_restore_retn 
  3748                              <1> 
  3749                              <1> loc_attr_file_check_fname_fchar:
  3750 0000820A 46                  <1> 	inc	esi
  3751 0000820B 803E20              <1> 	cmp	byte [esi], 20h
  3752 0000820E 74FA                <1> 	je	short loc_attr_file_check_fname_fchar
  3753 00008210 0F8275FFFFFF        <1>         jb      pass_change_attr
  3754                              <1> 		   
  3755                              <1> loc_attr_file_parse_path_name:
  3756 00008216 BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  3757 0000821B E8F5160000          <1> 	call	parse_path_name
  3758 00008220 0F82D6EFFFFF        <1> 	jc	loc_cmd_failed
  3759                              <1> 
  3760                              <1> loc_attr_file_check_filename_exists:
  3761 00008226 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  3762 0000822B 803E20              <1> 	cmp	byte [esi], 20h
  3763 0000822E 0F86C8EFFFFF        <1> 	jna	loc_cmd_failed
  3764 00008234 8935[083C0100]      <1> 	mov	[DelFile_FNPointer], esi 
  3765                              <1> 
  3766                              <1> loc_attr_file_drv:
  3767 0000823A 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  3768 00008240 8835[063A0100]      <1> 	mov	[RUN_CDRV], dh
  3769                              <1> 
  3770 00008246 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  3771 0000824C 38F2                <1> 	cmp	dl, dh
  3772 0000824E 740B                <1> 	je	short loc_attr_file_change_directory
  3773                              <1> 
  3774 00008250 E817E1FFFF          <1> 	call	change_current_drive
  3775 00008255 0F82D3F8FFFF        <1> 	jc	loc_file_rw_cmd_failed
  3776                              <1> 
  3777                              <1> loc_attr_file_change_directory:
  3778 0000825B 803D[4B3B0100]20    <1>         cmp     byte [FindFile_Directory], 20h
  3779 00008262 7618                <1> 	jna	short loc_attr_file_find
  3780                              <1> 
  3781 00008264 FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  3782                              <1> 	
  3783 0000826A BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  3784 0000826F 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3785 00008271 E88B100000          <1> 	call	change_current_directory
  3786 00008276 0F82B2F8FFFF        <1> 	jc	loc_file_rw_cmd_failed
  3787                              <1> 
  3788                              <1> ;loc_attr_file_change_prompt_dir_string:
  3789                              <1> 	;call	change_prompt_dir_string
  3790                              <1> 
  3791                              <1> loc_attr_file_find:
  3792                              <1> 	;mov	esi, FindFile_Name
  3793 0000827C 8B35[083C0100]      <1> 	mov	esi, [DelFile_FNPointer]
  3794 00008282 66B80008            <1> 	mov	ax, 0800h ; Except volume labels
  3795 00008286 E873F4FFFF          <1> 	call	find_first_file
  3796 0000828B 0F829DF8FFFF        <1> 	jc	loc_file_rw_cmd_failed
  3797                              <1> 
  3798                              <1> loc_attr_file_ambgfn_check:
  3799 00008291 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3800                              <1> 	;	(Note: It was BX in TRDOS v1)
  3801                              <1> 	;jz	short loc_attr_file_found
  3802 00008294 0F85AAFDFFFF        <1>         jnz     loc_file_not_found ; 06/03/2016 
  3803                              <1> 
  3804                              <1> 	;mov	eax, 2 ; File not found sign
  3805                              <1> 	;stc
  3806                              <1> 	;jmp	loc_file_rw_cmd_failed   
  3807                              <1> 
  3808                              <1> loc_attr_file_found:
  3809                              <1> 	; EDI = Directory buffer entry offset/address
  3810                              <1> 	; BL = File (or Directory) Attributes 
  3811                              <1> 	;	(Note: It was 'CL' in TRDOS v1)
  3812                              <1> 	; mov	bl, [EDI+0Bh]
  3813                              <1> 	
  3814 0000829A 66833D[2AF20000]00  <1> 	cmp	word [Attr_Chars], 0
  3815 000082A2 770B                <1> 	ja	short loc_attr_file_change_attributes
  3816 000082A4 881D[603C0100]      <1> 	mov	[Attributes], bl
  3817 000082AA E9F4FEFFFF          <1> 	jmp	loc_show_attributes
  3818                              <1> 
  3819                              <1> loc_attr_file_change_attributes:
  3820 000082AF A0[2AF20000]        <1> 	mov	al, [Attr_Chars]
  3821 000082B4 F6D0                <1> 	not	al
  3822 000082B6 20C3                <1> 	and	bl, al
  3823 000082B8 A0[2BF20000]        <1> 	mov	al, [Attr_Chars+1]
  3824 000082BD 08C3                <1> 	or	bl, al
  3825                              <1> 
  3826 000082BF 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h ; Singlix FS
  3827 000082C5 741D                <1> 	je	short loc_attr_file_fs_check
  3828                              <1> 
  3829 000082C7 881D[603C0100]      <1> 	mov	[Attributes], bl
  3830 000082CD 885F0B              <1> 	mov	[edi+0Bh], bl    ; Attributes (New!)
  3831                              <1> 
  3832                              <1> 	; 04/03/2016
  3833                              <1> 	; TRDOS v1 has a bug here! it does not set
  3834                              <1> 	; 'DirBuff_ValidData' to 2; as result of this bug,
  3835                              <1> 	; 'save_directory_buffer' would not save the new attributes ! 
  3836                              <1> 	
  3837 000082D0 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  3838                              <1> 
  3839 000082D7 E89D1A0000          <1> 	call 	save_directory_buffer
  3840 000082DC 0F824CF8FFFF        <1> 	jc	loc_file_rw_cmd_failed
  3841                              <1> 
  3842 000082E2 EB33                <1> 	jmp	short loc_print_attr_changed_message
  3843                              <1> 
  3844                              <1> loc_attr_file_fs_check:
  3845 000082E4 29C0                <1> 	sub	eax, eax
  3846 000082E6 8A25[CE390100]      <1>         mov     ah, [DirBuff_DRV]
  3847 000082EC BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3848 000082F1 01C6                <1>         add     esi, eax
  3849 000082F3 807E04A1            <1>         cmp     byte [esi+LD_FSType], 0A1h
  3850 000082F7 7309                <1> 	jnc	short loc_attr_file_change_fs_file_attributes
  3851 000082F9 66B80D00            <1> 	mov	ax, 0Dh ; Invalid Data
  3852 000082FD E92CF8FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3853                              <1> 
  3854                              <1> loc_attr_file_change_fs_file_attributes:
  3855                              <1> 	; BL = New MS-DOS File Attributes
  3856 00008302 88D8                <1> 	mov	al, bl ; File/Directory Attributes
  3857 00008304 30E4                <1> 	xor	ah, ah ; Attributes in MS-DOS format sign	  
  3858 00008306 E8A7050000          <1> 	call	change_fs_file_attributes
  3859 0000830B 0F821DF8FFFF        <1> 	jc	loc_file_rw_cmd_failed
  3860                              <1> 
  3861 00008311 881D[603C0100]      <1> 	mov	[Attributes], bl 
  3862                              <1> 
  3863                              <1> loc_print_attr_changed_message:
  3864 00008317 BE[18F20000]        <1> 	mov	esi, Msg_New
  3865 0000831C E84BD7FFFF          <1> 	call	print_msg
  3866 00008321 E987FEFFFF          <1> 	jmp	loc_show_attributes_no_nextline
  3867                              <1> 
  3868                              <1> rename_file:
  3869                              <1> 	; 06/11/2016
  3870                              <1> 	; 05/11/2016
  3871                              <1> 	; 16/10/2016
  3872                              <1> 	; 08/03/2016
  3873                              <1> 	; 06/03/2016 (TRDOS 386 =  TRDOS v2.0)
  3874                              <1> 	; 20/11/2010 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_rename')
  3875                              <1> 	; 16/11/2010 
  3876                              <1> 
  3877                              <1> get_rename_source_fchar:
  3878                              <1> 	; esi = file name
  3879 00008326 803E20              <1> 	cmp	byte [esi], 20h
  3880 00008329 7614                <1>         jna	short loc_rename_nofilename_retn
  3881                              <1> 
  3882 0000832B 8935[883C0100]      <1> 	mov	[SourceFilePath], esi
  3883                              <1> 
  3884                              <1> rename_scan_source_file:
  3885 00008331 46                  <1> 	inc	esi
  3886 00008332 803E20              <1> 	cmp	byte [esi], 20h
  3887 00008335 7409                <1> 	je	short rename_scan_destination_file_1
  3888                              <1> 	;jb	short loc_rename_nofilename_retn
  3889 00008337 0F82BFEEFFFF        <1> 	jb	loc_cmd_failed
  3890 0000833D EBF2                <1> 	jmp	short rename_scan_source_file
  3891                              <1> 
  3892                              <1> loc_rename_nofilename_retn: ; 08/03/2016
  3893 0000833F C3                  <1> 	retn
  3894                              <1> 
  3895                              <1> rename_scan_destination_file_1:
  3896 00008340 C60600              <1> 	mov	byte [esi], 0
  3897                              <1> 
  3898                              <1> rename_scan_destination_file_2:
  3899 00008343 46                  <1> 	inc	esi  
  3900 00008344 803E20              <1> 	cmp	byte [esi], 20h
  3901 00008347 74FA                <1> 	je	short rename_scan_destination_file_2
  3902                              <1> 	;jb	short loc_rename_nofilename_retn
  3903 00008349 0F82ADEEFFFF        <1> 	jb	loc_cmd_failed
  3904                              <1> 
  3905 0000834F 8935[8C3C0100]      <1> 	mov	[DestinationFilePath], esi
  3906                              <1> 
  3907                              <1> rename_scan_destination_file_3:
  3908 00008355 46                  <1> 	inc	esi  
  3909 00008356 803E20              <1> 	cmp	byte [esi], 20h
  3910 00008359 77FA                <1> 	ja	short rename_scan_destination_file_3
  3911                              <1> 
  3912 0000835B C60600              <1> 	mov	byte [esi], 0
  3913                              <1> 
  3914                              <1> loc_rename_save_current_drive:
  3915 0000835E 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  3916 00008364 8835[063A0100]      <1> 	mov	byte [RUN_CDRV], dh
  3917                              <1> 
  3918                              <1> loc_rename_sf_parse_path_name:
  3919 0000836A 8B35[883C0100]      <1> 	mov	esi, [SourceFilePath] 
  3920 00008370 BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  3921 00008375 E89B150000          <1> 	call	parse_path_name
  3922 0000837A 0F827CEEFFFF        <1> 	jc	loc_cmd_failed
  3923                              <1> 
  3924                              <1> loc_rename_sf_check_filename_exists:
  3925 00008380 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  3926 00008385 803E20              <1> 	cmp	byte [esi], 20h
  3927 00008388 0F866EEEFFFF        <1> 	jna	loc_cmd_failed
  3928                              <1> 
  3929                              <1> 	;mov	[DelFile_FNPointer], esi 
  3930                              <1> 
  3931                              <1> loc_rename_sf_drv:
  3932                              <1> 	;mov	dh, [Current_Drv]
  3933                              <1> 	;mov	[RUN_CDRV], dh
  3934                              <1> 
  3935 0000838E 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  3936 00008394 38F2                <1> 	cmp	dl, dh ; dh = [Current_Drv]
  3937 00008396 740B                <1> 	je	short rename_sf_change_directory
  3938                              <1> 
  3939 00008398 E8CFDFFFFF          <1> 	call	change_current_drive
  3940 0000839D 0F828BF7FFFF        <1> 	jc	loc_file_rw_cmd_failed
  3941                              <1> 
  3942                              <1> rename_sf_change_directory:
  3943 000083A3 803D[4B3B0100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3944 000083AA 7618                <1> 	jna	short rename_sf_find
  3945                              <1> 
  3946 000083AC FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  3947 000083B2 BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  3948 000083B7 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3949 000083B9 E8430F0000          <1> 	call	change_current_directory
  3950 000083BE 0F826AF7FFFF        <1>  	jc	loc_file_rw_cmd_failed
  3951                              <1> 
  3952                              <1> ;rename_sf_change_prompt_dir_string:
  3953                              <1> 	;call	change_prompt_dir_string
  3954                              <1> 
  3955                              <1> rename_sf_find:
  3956                              <1> 	;mov	esi, [DelFile_FNPointer]
  3957 000083C4 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  3958                              <1> 
  3959 000083C9 66B80008            <1> 	mov	ax, 0800h ; Except volume labels
  3960 000083CD E82CF3FFFF          <1> 	call	find_first_file
  3961 000083D2 0F8256F7FFFF        <1> 	jc	loc_file_rw_cmd_failed
  3962                              <1> 
  3963                              <1> loc_rename_sf_ambgfn_check:
  3964 000083D8 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3965                              <1> 	;	(Note: It was BX in TRDOS v1)
  3966                              <1> 	;jz	short loc_rename_sf_found
  3967 000083DB 0F8563FCFFFF        <1> 	jnz	loc_file_not_found
  3968                              <1> 
  3969                              <1> 	;mov	eax, 2 ; File not found sign
  3970                              <1> 	;stc
  3971                              <1> 	;jmp	loc_file_rw_cmd_failed   
  3972                              <1> 
  3973                              <1> loc_rename_sf_found:
  3974                              <1> 	; EDI = Directory buffer entry offset/address
  3975                              <1> 	; BL = File (or Directory) Attributes 
  3976                              <1> 	;	(Note: It was 'CL' in TRDOS v1)
  3977                              <1> 	; mov	bl, [EDI+0Bh]
  3978                              <1> 
  3979 000083E1 F6C307              <1> 	test	bl, 07h ; Attributes, S-H-R
  3980 000083E4 0F854EF7FFFF        <1> 	jnz	loc_permission_denied
  3981                              <1> 	
  3982 000083EA BE[4A3B0100]        <1>         mov     esi, FindFile_Drv
  3983 000083EF BF[903C0100]        <1>         mov     edi, SourceFile_Drv
  3984 000083F4 B920000000          <1> 	mov	ecx, 32
  3985 000083F9 F3A5                <1> 	rep	movsd
  3986                              <1> 
  3987                              <1> loc_rename_df_parse_path_name:
  3988 000083FB 8B35[8C3C0100]      <1> 	mov	esi, [DestinationFilePath]
  3989 00008401 BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  3990 00008406 E80A150000          <1> 	call	parse_path_name
  3991 0000840B 7219                <1> 	jc	short loc_rename_df_cmd_failed
  3992                              <1> 
  3993                              <1> 	;mov	dh, [RUN_CDRV]
  3994 0000840D 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  3995                              <1> 
  3996                              <1> 	; 'rename' command is valid only for same dos drive and same dir!
  3997                              <1> 	; ('move' command must be used if source file and destination file
  3998                              <1> 	; directories are not same!) 
  3999 00008413 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  4000 00008419 38F2                <1> 	cmp	dl, dh ; are source and destination drives different ?!
  4001 0000841B 7509                <1> 	jne	short loc_rename_df_cmd_failed ; yes! 
  4002                              <1> 
  4003                              <1> rename_df_check_dirname_exists:
  4004 0000841D 803D[4B3B0100]00    <1> 	cmp	byte [FindFile_Directory], 0
  4005 00008424 760B                <1> 	jna	short rename_df_check_filename_exists
  4006                              <1> 
  4007                              <1> 	; different source file and destination file directories !
  4008                              <1> loc_rename_df_cmd_failed:
  4009 00008426 B801000000          <1> 	mov	eax, 1 ; TRDOS 'Bad command or file name' error
  4010 0000842B F9                  <1> 	stc
  4011 0000842C E9FDF6FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4012                              <1> 	  
  4013                              <1> rename_df_check_filename_exists:
  4014 00008431 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  4015 00008436 E883F6FFFF          <1> 	call	check_filename
  4016 0000843B 0F829FF7FFFF        <1> 	jc	loc_mkdir_invalid_dir_name_chars
  4017                              <1> 
  4018                              <1> 	;mov	[DelFile_FNPointer], esi 
  4019                              <1> 	;cmp	byte [esi], 20h
  4020                              <1> 	;ja	short loc_rename_df_find
  4021                              <1> 
  4022                              <1> 	;mov	dh, [Current_Drv] ; dh has not been changed
  4023                              <1> 
  4024                              <1> rename_df_drv_check_writable:
  4025 00008441 0FB6F6              <1> 	movzx	esi, dh
  4026                              <1> 	;movzx	esi, byte [Current_Drv]
  4027 00008444 81C600010900        <1> 	add	esi, Logical_DOSDisks
  4028                              <1> 
  4029 0000844A 88F2                <1> 	mov	dl, dh ; dl = [Current_Drv]
  4030 0000844C 8A7601              <1> 	mov	dh, [esi+LD_DiskType]
  4031                              <1> 
  4032 0000844F 80FE01              <1> 	cmp	dh, 1 ; 0 = Invalid
  4033 00008452 7310                <1> 	jnb	short rename_df_compare_sf_df_name
  4034                              <1> 
  4035                              <1> 	; 16/10/2016 (13h -> 30)
  4036 00008454 B81E000000          <1> 	mov	eax, 30 ; 'Disk write-protected' error
  4037 00008459 8B1D[8C3C0100]      <1> 	mov	ebx, [DestinationFilePath] 
  4038 0000845F E9CAF6FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4039                              <1> 
  4040                              <1> rename_df_compare_sf_df_name:
  4041 00008464 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  4042 00008469 BF[D23C0100]        <1> 	mov	edi, SourceFile_Name
  4043 0000846E B90C000000          <1> 	mov	ecx, 12
  4044                              <1> rename_df_compare_sf_df_name_next: 
  4045 00008473 AC                  <1> 	lodsb
  4046 00008474 AE                  <1> 	scasb
  4047 00008475 7506                <1> 	jne	short loc_rename_df_find
  4048 00008477 08C0                <1> 	or	al, al
  4049 00008479 74AB                <1> 	jz	short loc_rename_df_cmd_failed
  4050 0000847B E2F6                <1> 	loop	rename_df_compare_sf_df_name_next 
  4051                              <1> 
  4052                              <1> loc_rename_df_find:
  4053                              <1> 	;mov	esi, [DelFile_FNPointer]
  4054 0000847D BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  4055                              <1> 
  4056 00008482 6631C0              <1> 	xor	ax, ax ; Any
  4057 00008485 E874F2FFFF          <1> 	call	find_first_file
  4058 0000848A 730A                <1> 	jnc	short loc_rename_df_found
  4059                              <1> 
  4060                              <1> loc_rename_df_check_error_code:
  4061                              <1> 	;cmp	eax, 2
  4062 0000848C 3C02                <1> 	cmp	al, 2 ; Not found error
  4063 0000848E 7411                <1> 	je	short rename_df_move_find_struct_to_dest
  4064 00008490 F9                  <1> 	stc
  4065 00008491 E998F6FFFF          <1> 	jmp loc_file_rw_cmd_failed
  4066                              <1> 
  4067                              <1> loc_rename_df_found:
  4068                              <1> 	; 05/11/2016
  4069 00008496 B805000000          <1> 	mov	eax, 05h ; permission denied error
  4070 0000849B F9                  <1> 	stc
  4071 0000849C E997F6FFFF          <1> 	jmp	loc_permission_denied  ; 06/11/2016
  4072                              <1> 
  4073                              <1> rename_df_move_find_struct_to_dest:
  4074 000084A1 BE[4A3B0100]        <1>         mov     esi, FindFile_Drv
  4075 000084A6 BF[103D0100]        <1>         mov     edi, DestinationFile_Drv
  4076 000084AB B920000000          <1> 	mov	ecx, 32
  4077 000084B0 F3A5                <1> 	rep	movsd
  4078                              <1> 
  4079                              <1> loc_rename_df_process_q_sf:
  4080                              <1> 	;mov	ecx, 12
  4081 000084B2 B10C                <1> 	mov	cl, 12
  4082 000084B4 BE[D23C0100]        <1>  	mov	esi, SourceFile_Name
  4083 000084B9 BF[59F20000]        <1> 	mov	edi, Rename_OldName
  4084                              <1> rename_df_process_q_nml_1_sf:
  4085 000084BE AC                  <1> 	lodsb
  4086 000084BF 3C20                <1>         cmp	al, 20h
  4087 000084C1 7603                <1>         jna	short rename_df_process_q_nml_2_sf
  4088 000084C3 AA                  <1> 	stosb
  4089 000084C4 E2F8                <1> 	loop	rename_df_process_q_nml_1_sf
  4090                              <1> 
  4091                              <1> rename_df_process_q_nml_2_sf:
  4092 000084C6 C60700              <1> 	mov	byte [edi], 0
  4093                              <1> 
  4094                              <1> loc_rename_df_process_q_df:
  4095                              <1> 	;mov	ecx, 12
  4096 000084C9 B10C                <1> 	mov	cl, 12
  4097 000084CB BE[523D0100]        <1> 	mov	esi, DestinationFile_Name
  4098 000084D0 BF[6AF20000]        <1> 	mov	edi, Rename_NewName
  4099                              <1> rename_df_process_q_nml_1_df:
  4100 000084D5 AC                  <1> 	lodsb
  4101 000084D6 3C20                <1> 	cmp	al, 20h
  4102 000084D8 7603                <1> 	jna	short loc_rename_df_process_q_nml_2_df
  4103 000084DA AA                  <1> 	stosb
  4104 000084DB E2F8                <1> 	loop	rename_df_process_q_nml_1_df
  4105                              <1> 
  4106                              <1> loc_rename_df_process_q_nml_2_df:
  4107 000084DD C60700              <1> 	mov	byte [edi], 0
  4108                              <1> 
  4109                              <1> loc_rename_confirmation_question:
  4110 000084E0 BE[31F20000]        <1> 	mov	esi, Msg_DoYouWantRename
  4111 000084E5 E882D5FFFF          <1> 	call	print_msg
  4112                              <1> 
  4113 000084EA A0[ED3C0100]        <1> 	mov	al, [SourceFile_DirEntry+11] ; Attributes
  4114 000084EF 2410                <1> 	and	al, 10h
  4115 000084F1 750C                <1> 	jnz	short rename_confirmation_question_dir
  4116                              <1> 
  4117                              <1> rename_confirmation_question_file:
  4118 000084F3 BE[48F20000]        <1> 	mov	esi, Rename_File
  4119 000084F8 E86FD5FFFF          <1> 	call	print_msg 
  4120 000084FD EB0A                <1> 	jmp	short rename_confirmation_question_as 
  4121                              <1> 
  4122                              <1> rename_confirmation_question_dir:
  4123 000084FF BE[4EF20000]        <1> 	mov	esi, Rename_Directory
  4124 00008504 E863D5FFFF          <1> 	call	print_msg
  4125                              <1> 
  4126                              <1> rename_confirmation_question_as:
  4127 00008509 BE[59F20000]        <1> 	mov	esi, Rename_OldName
  4128 0000850E E859D5FFFF          <1> 	call	print_msg
  4129 00008513 BE[66F20000]        <1> 	mov	esi, Msg_File_rename_as
  4130 00008518 E84FD5FFFF          <1> 	call	print_msg
  4131 0000851D BE[8DF10000]        <1> 	mov	esi, Msg_YesNo
  4132 00008522 E845D5FFFF          <1> 	call	print_msg
  4133                              <1> 
  4134                              <1> loc_rename_ask_again:
  4135 00008527 30E4                <1> 	xor	ah, ah
  4136 00008529 E86E86FFFF          <1> 	call	int16h
  4137 0000852E 3C1B                <1> 	cmp	al, 1Bh
  4138 00008530 740F                <1> 	je	short loc_do_not_rename_file
  4139 00008532 24DF                <1> 	and	al, 0DFh
  4140 00008534 A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  4141 00008539 3C59                <1> 	cmp	al, 'Y'
  4142 0000853B 7404                <1> 	je	short loc_yes_rename_file
  4143 0000853D 3C4E                <1> 	cmp	al, 'N'
  4144 0000853F 75E6                <1> 	jne	short loc_rename_ask_again
  4145                              <1> 
  4146                              <1> loc_do_not_rename_file:
  4147                              <1> loc_yes_rename_file:
  4148 00008541 A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  4149 00008546 6650                <1> 	push	ax
  4150 00008548 BE[97F10000]        <1> 	mov	esi, Y_N_nextline
  4151 0000854D E81AD5FFFF          <1> 	call	print_msg
  4152 00008552 6658                <1> 	pop	ax
  4153                              <1> 	;cmp	al, 'Y' ; 'yes'
  4154                              <1> 	;cmc
  4155                              <1>         ;jnc	loc_file_rw_restore_retn
  4156 00008554 3C4E                <1> 	cmp	al, 'N' ; 'no'
  4157 00008556 0F84D2F5FFFF        <1>         je	loc_file_rw_restore_retn  
  4158                              <1> 
  4159 0000855C BE[6AF20000]        <1> 	mov	esi, Rename_NewName
  4160 00008561 668B0D[0A3D0100]    <1> 	mov	cx, [SourceFile_DirEntryNumber] 
  4161 00008568 66A1[F63C0100]      <1> 	mov	ax, [SourceFile_DirEntry+20] ; First Cluster, HW 
  4162 0000856E 66C1E010            <1> 	shl	ax, 16
  4163 00008572 66A1[FC3C0100]      <1> 	mov	ax, [SourceFile_DirEntry+26] ; First Cluster, LW 
  4164                              <1> 
  4165 00008578 0FB61D[DF3C0100]    <1>   	movzx	ebx, byte [SourceFile_LongNameEntryLength]  
  4166 0000857F E8DB1B0000          <1>    	call	rename_directory_entry
  4167 00008584 E9D3F6FFFF          <1> 	jmp	loc_rename_file_ok	
  4168                              <1> ;loc_rename_file_ok:
  4169                              <1> ;	jc	loc_run_cmd_failed
  4170                              <1> ;	mov	esi, Msg_OK
  4171                              <1> ;	call	proc_printmsg
  4172                              <1> ;	jmp	loc_file_rw_restore_retn
  4173                              <1> 
  4174                              <1> move_file:
  4175                              <1> 	; 11/03/2016
  4176                              <1> 	; 09/03/2016
  4177                              <1> 	; 08/03/2016 (TRDOS 386 =  TRDOS v2.0)
  4178                              <1> 	; 21/05/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_move')
  4179                              <1> 	; 23/04/2011
  4180                              <1> 
  4181                              <1> get_move_source_fchar:
  4182                              <1> 	; esi = file name
  4183 00008589 803E20              <1> 	cmp	byte [esi], 20h
  4184 0000858C 7614                <1>         jna	short loc_move_nofilename_retn
  4185                              <1> 
  4186 0000858E 8935[883C0100]      <1> 	mov	[SourceFilePath], esi
  4187                              <1> 
  4188                              <1> move_scan_source_file:
  4189 00008594 46                  <1> 	inc	esi
  4190 00008595 803E20              <1> 	cmp	byte [esi], 20h
  4191 00008598 7409                <1>         je      short move_scan_destination_1
  4192                              <1> 	;jb	short loc_move_nofilename_retn
  4193 0000859A 0F825CECFFFF        <1> 	jb	loc_cmd_failed
  4194 000085A0 EBF2                <1> 	jmp	short move_scan_source_file
  4195                              <1> 
  4196                              <1> loc_move_nofilename_retn:
  4197 000085A2 C3                  <1> 	retn
  4198                              <1> 
  4199                              <1> move_scan_destination_1:
  4200 000085A3 C60600              <1> 	mov	byte [esi], 0
  4201                              <1> 
  4202                              <1> move_scan_destination_2:
  4203 000085A6 46                  <1> 	inc	esi  
  4204 000085A7 803E20              <1> 	cmp	byte [esi], 20h
  4205 000085AA 74FA                <1> 	je	short move_scan_destination_2
  4206                              <1> 	;jb	short loc_move_nofilename_retn
  4207 000085AC 0F824AECFFFF        <1> 	jb	loc_cmd_failed
  4208                              <1> 
  4209 000085B2 8935[8C3C0100]      <1> 	mov	[DestinationFilePath], esi
  4210                              <1> 
  4211                              <1> move_scan_destination_3:
  4212 000085B8 46                  <1> 	inc	esi  
  4213 000085B9 803E20              <1> 	cmp	byte [esi], 20h
  4214 000085BC 77FA                <1> 	ja	short move_scan_destination_3
  4215 000085BE C60600              <1> 	mov	byte [esi], 0
  4216                              <1> 
  4217                              <1> loc_move_scan_destination_OK:
  4218 000085C1 8B35[883C0100]      <1> 	mov	esi, [SourceFilePath]
  4219 000085C7 8B3D[8C3C0100]      <1> 	mov	edi, [DestinationFilePath]
  4220                              <1> 
  4221 000085CD B001                <1> 	mov	al, 1  ; move procedure Phase 1
  4222 000085CF E8081C0000          <1> 	call	move_source_file_to_destination_file
  4223 000085D4 7328                <1> 	jnc	short move_source_file_to_destination_question
  4224                              <1> 
  4225                              <1> loc_move_cmd_failed_1:
  4226 000085D6 08C0                <1> 	or	al, al
  4227 000085D8 0F841EECFFFF        <1> 	jz	loc_cmd_failed 
  4228 000085DE 3C11                <1> 	cmp	al, 11h
  4229 000085E0 740D                <1> 	je	short loc_msg_not_same_device   
  4230 000085E2 3C05                <1> 	cmp	al, 05h
  4231 000085E4 0F853DECFFFF        <1> 	jne	loc_run_cmd_failed
  4232                              <1> 
  4233 000085EA E949F5FFFF          <1> 	jmp	loc_permission_denied
  4234                              <1> 
  4235                              <1> 	;mov	esi, Msg_Permission_denied
  4236                              <1> 	;call	print_msg
  4237                              <1> 	;jmp	loc_file_rw_restore_retn
  4238                              <1> 
  4239                              <1> loc_msg_not_same_device:
  4240 000085EF BE[77F20000]        <1> 	mov	esi, msg_not_same_drv 
  4241 000085F4 E873D4FFFF          <1> 	call	print_msg
  4242 000085F9 E930F5FFFF          <1> 	jmp	loc_file_rw_restore_retn
  4243                              <1> 
  4244                              <1> move_source_file_to_destination_question:
  4245 000085FE A0[903C0100]        <1>         mov     al, [SourceFile_Drv]
  4246 00008603 0441                <1> 	add	al, 'A'
  4247 00008605 A2[D9F20000]        <1> 	mov	[msg_source_file_drv], al
  4248 0000860A A0[103D0100]        <1>         mov     al, [DestinationFile_Drv]
  4249 0000860F 0441                <1> 	add	al, 'A'
  4250 00008611 A2[F8F20000]        <1> 	mov	[msg_destination_file_drv], al
  4251                              <1> 
  4252 00008616 57                  <1> 	push	edi ; *
  4253                              <1> 
  4254 00008617 BE[BDF20000]        <1> 	mov	esi, msg_source_file
  4255 0000861C E84BD4FFFF          <1> 	call	print_msg
  4256 00008621 BE[913C0100]        <1> 	mov	esi, SourceFile_Directory
  4257 00008626 803E20              <1> 	cmp	byte [esi], 20h
  4258 00008629 7605                <1> 	jna	short msftdfq_sfn
  4259 0000862B E83CD4FFFF          <1> 	call	print_msg
  4260                              <1> msftdfq_sfn:
  4261 00008630 BE[D23C0100]        <1> 	mov	esi, SourceFile_Name
  4262 00008635 E832D4FFFF          <1> 	call	print_msg
  4263 0000863A BE[DCF20000]        <1> 	mov	esi, msg_destination_file
  4264 0000863F E828D4FFFF          <1> 	call	print_msg
  4265 00008644 BE[113D0100]        <1> 	mov	esi, DestinationFile_Directory
  4266 00008649 803E20              <1> 	cmp	byte [esi], 20h
  4267 0000864C 7605                <1> 	jna	short msftdfq_dfn
  4268 0000864E E819D4FFFF          <1> 	call	print_msg
  4269                              <1> msftdfq_dfn:
  4270 00008653 BE[523D0100]        <1> 	mov	esi, DestinationFile_Name
  4271 00008658 E80FD4FFFF          <1> 	call	print_msg
  4272 0000865D BE[FBF20000]        <1> 	mov	esi, msg_copy_nextline
  4273 00008662 E805D4FFFF          <1> 	call	print_msg
  4274 00008667 BE[FBF20000]        <1> 	mov	esi, msg_copy_nextline
  4275 0000866C E8FBD3FFFF          <1> 	call	print_msg
  4276                              <1> 
  4277                              <1> loc_move_ask_for_new_file_yes_no:
  4278 00008671 BE[89F20000]        <1> 	mov	esi, Msg_DoYouWantMoveFile
  4279 00008676 E8F1D3FFFF          <1> 	call	print_msg
  4280 0000867B BE[8DF10000]        <1> 	mov	esi, Msg_YesNo
  4281 00008680 E8E7D3FFFF          <1> 	call	print_msg
  4282                              <1> loc_move_ask_for_new_file_again:
  4283 00008685 30E4                <1> 	xor	ah, ah
  4284 00008687 E81085FFFF          <1> 	call	int16h
  4285 0000868C 3C1B                <1> 	cmp	al, 1Bh
  4286                              <1> 	;je	short loc_do_not_move_file
  4287 0000868E 744F                <1> 	je	short loc_move_y_n_escape
  4288 00008690 24DF                <1> 	and	al, 0DFh
  4289 00008692 A2[97F10000]        <1>         mov     [Y_N_nextline], al
  4290 00008697 3C59                <1> 	cmp	al, 'Y'
  4291 00008699 7404                <1> 	je	short loc_yes_move_file
  4292 0000869B 3C4E                <1> 	cmp	al, 'N'
  4293 0000869D 75E6                <1> 	jne	short loc_move_ask_for_new_file_again
  4294                              <1> 
  4295                              <1> loc_do_not_move_file:
  4296                              <1> loc_yes_move_file:
  4297 0000869F A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  4298 000086A4 6650                <1> 	push	ax
  4299 000086A6 BE[97F10000]        <1> 	mov	esi, Y_N_nextline
  4300 000086AB E8BCD3FFFF          <1> 	call	print_msg
  4301 000086B0 6658                <1> 	pop	ax
  4302 000086B2 5F                  <1> 	pop	edi ; *
  4303                              <1> 	;cmp	al, 'Y' ; 'yes'
  4304                              <1> 	;cmc
  4305                              <1>         ;jnc	loc_file_rw_restore_retn
  4306 000086B3 3C4E                <1> 	cmp	al, 'N' ; 'no'
  4307 000086B5 0F8473F4FFFF        <1>         je	loc_file_rw_restore_retn
  4308                              <1> 
  4309                              <1> loc_move_yes_move_file:
  4310 000086BB B002                <1> 	mov	al, 2 ; move procedure Phase 2
  4311 000086BD E81A1B0000          <1> 	call	move_source_file_to_destination_file
  4312                              <1> 	;jc	short loc_move_cmd_failed_2
  4313 000086C2 0F839AF5FFFF        <1>         jnc     move_source_file_to_destination_OK
  4314                              <1> 
  4315                              <1> ;move_source_file_to_destination_OK:
  4316                              <1> ;	mov	esi, Msg_OK
  4317                              <1> ;	call	print_msg
  4318                              <1> ;	jmp	loc_file_rw_restore_retn
  4319                              <1> 
  4320                              <1> loc_move_cmd_failed_2:
  4321 000086C8 3C27                <1> 	cmp	al, 27h
  4322 000086CA 0F8557EBFFFF        <1> 	jne	loc_run_cmd_failed
  4323                              <1> 
  4324 000086D0 BE[A2F20000]        <1> 	mov	esi, msg_insufficient_disk_space
  4325 000086D5 E892D3FFFF          <1> 	call	print_msg
  4326                              <1> 
  4327 000086DA E94FF4FFFF          <1> 	jmp	loc_file_rw_restore_retn
  4328                              <1> 
  4329                              <1> loc_move_y_n_escape:
  4330 000086DF B04E                <1> 	mov	al, 'N' ; 'no'
  4331 000086E1 EBBC                <1> 	jmp	short loc_do_not_move_file
  4332                              <1> 
  4333                              <1> copy_file:
  4334                              <1> 	; 15/10/2016
  4335                              <1> 	; 24/03/2016
  4336                              <1> 	; 21/03/2016
  4337                              <1> 	; 15/03/2016 (TRDOS 386 =  TRDOS v2.0)
  4338                              <1> 	; 21/05/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_copy')
  4339                              <1> 	; 01/08/2010
  4340                              <1> 
  4341                              <1> get_copy_source_fchar:
  4342                              <1> 	; esi = file name
  4343 000086E3 803E20              <1> 	cmp	byte [esi], 20h
  4344 000086E6 7614                <1>         jna     short loc_copy_nofilename_retn
  4345                              <1> 
  4346 000086E8 8935[883C0100]      <1> 	mov	[SourceFilePath], esi
  4347                              <1> 
  4348                              <1> copy_scan_source_file:
  4349 000086EE 46                  <1> 	inc	esi  
  4350 000086EF 803E20              <1> 	cmp	byte [esi], 20h
  4351 000086F2 7409                <1> 	je	short copy_scan_destination_1
  4352                              <1> 	;jb	short loc_copy_nofilename_retn
  4353 000086F4 0F8202EBFFFF        <1> 	jb	loc_cmd_failed
  4354 000086FA EBF2                <1> 	jmp	short copy_scan_source_file
  4355                              <1> 
  4356                              <1> loc_copy_nofilename_retn:
  4357 000086FC C3                  <1> 	retn
  4358                              <1> 
  4359                              <1> copy_scan_destination_1:
  4360 000086FD C60600              <1> 	mov	byte [esi], 0
  4361                              <1> 
  4362                              <1> copy_scan_destination_2:
  4363 00008700 46                  <1> 	inc	esi  
  4364 00008701 803E20              <1> 	cmp	byte [esi], 20h
  4365 00008704 74FA                <1> 	je	short copy_scan_destination_2
  4366                              <1> 	;jb	short loc_copy_nofilename_retn
  4367 00008706 0F82F0EAFFFF        <1> 	jb	loc_cmd_failed
  4368                              <1> 
  4369 0000870C 8935[8C3C0100]      <1> 	mov	[DestinationFilePath], esi
  4370                              <1> 
  4371                              <1> copy_scan_destination_3:
  4372 00008712 46                  <1> 	inc	esi  
  4373 00008713 803E20              <1> 	cmp	byte [esi], 20h
  4374 00008716 77FA                <1> 	ja	short copy_scan_destination_3
  4375 00008718 C60600              <1> 	mov	byte [esi], 0
  4376                              <1> 
  4377                              <1> loc_copy_save_current_drive:
  4378 0000871B 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  4379 00008721 8835[063A0100]      <1> 	mov	[RUN_CDRV], dh
  4380                              <1> 
  4381                              <1> copy_source_file_to_destination_phase_1:
  4382 00008727 8B35[883C0100]      <1> 	mov	esi, [SourceFilePath]
  4383 0000872D 8B3D[8C3C0100]      <1> 	mov	edi, [DestinationFilePath]
  4384                              <1> 
  4385 00008733 B001                <1> 	mov	al, 1  ; copy procedure Phase 1
  4386 00008735 E83F1D0000          <1> 	call	copy_source_file_to_destination_file
  4387 0000873A 732B                <1> 	jnc	short copy_source_file_to_destination_question
  4388                              <1> 
  4389                              <1> loc_copy_cmd_failed_1:
  4390                              <1> 	; 18/03/2016 (restore current drive and directory)
  4391 0000873C 08C0                <1> 	or	al, al
  4392 0000873E 7507                <1> 	jnz	short loc_copy_cmd_failed_2
  4393                              <1> 
  4394 00008740 FEC0                <1>         inc     al ; mov al, 1 ; Bad command or file name !
  4395 00008742 E9E0EAFFFF          <1> 	jmp	loc_run_cmd_failed
  4396                              <1> 
  4397                              <1> loc_copy_cmd_failed_2:
  4398 00008747 3C27                <1> 	cmp	al, 27h ; Insufficient disk space 
  4399 00008749 740D                <1> 	je	short loc_file_write_insuff_disk_space_msg
  4400                              <1>  
  4401 0000874B 3C05                <1> 	cmp	al, 05h
  4402 0000874D 0F85D4EAFFFF        <1> 	jne	loc_run_cmd_failed
  4403                              <1> 	
  4404 00008753 E9E0F3FFFF          <1> 	jmp	loc_permission_denied
  4405                              <1> 
  4406                              <1> loc_file_write_insuff_disk_space_msg:
  4407 00008758 BE[A2F20000]        <1> 	mov	esi, msg_insufficient_disk_space
  4408 0000875D E80AD3FFFF          <1> 	call	print_msg
  4409 00008762 E9C7F3FFFF          <1>         jmp     loc_file_rw_restore_retn 
  4410                              <1> 
  4411                              <1> copy_source_file_to_destination_question:
  4412 00008767 57                  <1> 	push	edi ; *
  4413                              <1> 
  4414                              <1> 	; dh = source file attributes
  4415                              <1> 	; dl > 0 -> destination file found
  4416 00008768 20D2                <1> 	and	dl, dl            
  4417 0000876A 7449                <1> 	jz	short copy_source_file_to_destination_pass_owrq
  4418                              <1> 
  4419                              <1> loc_copy_ask_for_owr_yes_no:
  4420 0000876C BE[FEF20000]        <1> 	mov	esi, Msg_DoYouWantOverWriteFile
  4421 00008771 E8F6D2FFFF          <1> 	call	print_msg
  4422 00008776 BE[523D0100]        <1> 	mov	esi, DestinationFile_Name
  4423 0000877B E8ECD2FFFF          <1> 	call	print_msg
  4424 00008780 BE[8DF10000]        <1> 	mov	esi, Msg_YesNo
  4425 00008785 E8E2D2FFFF          <1> 	call	print_msg
  4426                              <1> 
  4427                              <1> loc_copy_ask_for_owr_again:
  4428 0000878A 30E4                <1> 	xor	ah, ah
  4429 0000878C E80B84FFFF          <1> 	call	int16h
  4430 00008791 3C1B                <1> 	cmp	al, 1Bh
  4431                              <1>         ;je     loc_do_not_copy_file
  4432 00008793 7419                <1>         je      short loc_copy_y_n_escape
  4433 00008795 24DF                <1> 	and	al, 0DFh
  4434 00008797 A2[97F10000]        <1>         mov     [Y_N_nextline], al
  4435 0000879C 3C59                <1> 	cmp	al, 'Y'
  4436 0000879E 0F84B1000000        <1>         je      loc_yes_copy_file
  4437 000087A4 3C4E                <1> 	cmp	al, 'N'
  4438 000087A6 0F84A9000000        <1>         je      loc_do_not_copy_file
  4439 000087AC EBDC                <1> 	jmp	short loc_copy_ask_for_owr_again
  4440                              <1> 
  4441                              <1> loc_copy_y_n_escape:
  4442 000087AE B04E                <1> 	mov	al, 'N' ; 'no'
  4443 000087B0 E9A0000000          <1>         jmp     loc_do_not_copy_file
  4444                              <1> 
  4445                              <1> copy_source_file_to_destination_pass_owrq:
  4446 000087B5 A0[903C0100]        <1> 	mov     al, [SourceFile_Drv]
  4447 000087BA 0441                <1> 	add	al, 'A'
  4448 000087BC A2[D9F20000]        <1> 	mov	[msg_source_file_drv], al
  4449 000087C1 A0[103D0100]        <1>         mov     al, [DestinationFile_Drv]
  4450 000087C6 0441                <1> 	add	al, 'A'
  4451 000087C8 A2[F8F20000]        <1> 	mov	[msg_destination_file_drv], al
  4452                              <1> 
  4453 000087CD BE[BDF20000]        <1> 	mov	esi, msg_source_file
  4454 000087D2 E895D2FFFF          <1> 	call	print_msg
  4455 000087D7 BE[913C0100]        <1> 	mov	esi, SourceFile_Directory
  4456 000087DC 803E20              <1> 	cmp	byte [esi], 20h
  4457 000087DF 7605                <1> 	jna	short csftdfq_sfn
  4458 000087E1 E886D2FFFF          <1> 	call	print_msg
  4459                              <1> csftdfq_sfn:
  4460 000087E6 BE[D23C0100]        <1> 	mov	esi, SourceFile_Name
  4461 000087EB E87CD2FFFF          <1> 	call	print_msg
  4462 000087F0 BE[DCF20000]        <1> 	mov	esi, msg_destination_file
  4463 000087F5 E872D2FFFF          <1> 	call	print_msg
  4464 000087FA BE[113D0100]        <1> 	mov	esi, DestinationFile_Directory
  4465 000087FF 803E20              <1> 	cmp	byte [esi], 20h
  4466 00008802 7605                <1> 	jna	short csftdfq_dfn
  4467 00008804 E863D2FFFF          <1> 	call	print_msg
  4468                              <1> csftdfq_dfn:
  4469 00008809 BE[523D0100]        <1> 	mov	esi, DestinationFile_Name
  4470 0000880E E859D2FFFF          <1> 	call	print_msg
  4471 00008813 BE[FBF20000]        <1> 	mov	esi, msg_copy_nextline
  4472 00008818 E84FD2FFFF          <1> 	call	print_msg
  4473 0000881D BE[FBF20000]        <1> 	mov	esi, msg_copy_nextline
  4474 00008822 E845D2FFFF          <1> 	call	print_msg
  4475                              <1> 
  4476                              <1> loc_copy_ask_for_new_file_yes_no:
  4477 00008827 BE[1DF30000]        <1> 	mov	esi, Msg_DoYouWantCopyFile
  4478 0000882C E83BD2FFFF          <1> 	call	print_msg
  4479 00008831 BE[8DF10000]        <1> 	mov	esi, Msg_YesNo
  4480 00008836 E831D2FFFF          <1> 	call	print_msg
  4481                              <1> 
  4482                              <1> loc_copy_ask_for_new_file_again:
  4483 0000883B 30E4                <1> 	xor	ah, ah
  4484 0000883D E85A83FFFF          <1> 	call	int16h
  4485 00008842 3C1B                <1> 	cmp	al, 1Bh
  4486 00008844 740F                <1> 	je	short loc_do_not_copy_file
  4487 00008846 24DF                <1> 	and	al, 0DFh
  4488 00008848 A2[97F10000]        <1>         mov     [Y_N_nextline], al
  4489 0000884D 3C59                <1> 	cmp	al, 'Y'
  4490 0000884F 7404                <1> 	je	short loc_yes_copy_file
  4491 00008851 3C4E                <1> 	cmp	al, 'N'
  4492 00008853 75E6                <1> 	jne	short loc_copy_ask_for_new_file_again
  4493                              <1> 
  4494                              <1> loc_do_not_copy_file:
  4495                              <1> loc_yes_copy_file:
  4496 00008855 A2[97F10000]        <1> 	mov	[Y_N_nextline], al
  4497 0000885A 6650                <1> 	push	ax
  4498 0000885C BE[97F10000]        <1> 	mov	esi, Y_N_nextline
  4499 00008861 E806D2FFFF          <1> 	call	print_msg
  4500 00008866 6658                <1> 	pop	ax
  4501 00008868 5F                  <1> 	pop	edi ; *
  4502                              <1> 	;cmp	al, 'Y' ; 'yes'
  4503                              <1> 	;cmc
  4504                              <1>         ;jnc	loc_file_rw_restore_retn
  4505 00008869 3C4E                <1> 	cmp	al, 'N' ; 'no'
  4506 0000886B 0F84BDF2FFFF        <1>         je	loc_file_rw_restore_retn
  4507                              <1> 
  4508                              <1> copy_source_file_to_destination_pass_q:
  4509 00008871 B002                <1> 	mov	al, 2  ; copy procedure Phase 2
  4510 00008873 E8011C0000          <1> 	call	copy_source_file_to_destination_file
  4511                              <1> 	;jc	short loc_file_write_check_disk_space_err
  4512                              <1> 
  4513                              <1> 	; 24/03/2016
  4514 00008878 6651                <1> 	push	cx
  4515 0000887A BE[FBF20000]        <1> 	mov	esi, msg_copy_nextline
  4516 0000887F E8E8D1FFFF          <1> 	call	print_msg
  4517                              <1> 	;pop	cx
  4518 00008884 6658                <1> 	pop	ax
  4519                              <1> 
  4520                              <1> 	;or	cl, cl
  4521 00008886 08C0                <1> 	or	al, al
  4522 00008888 7419                <1> 	jz	short copy_source_file_to_destination_OK
  4523                              <1> 	
  4524                              <1> 	; 15/10/2016 (1Dh -> 18)
  4525                              <1> 	; 18/03/2016 (1Dh)
  4526                              <1> 	;cmp	cl, 18 ; write error
  4527 0000888A 3C12                <1> 	cmp	al, 18
  4528 0000888C 7506                <1> 	jne	short copy_source_file_to_destination_not_OK
  4529                              <1> 	;
  4530                              <1> 	;mov	al, cl ; error number (write fault!)
  4531 0000888E F9                  <1> 	stc
  4532 0000888F E99AF2FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4533                              <1> 
  4534                              <1> copy_source_file_to_destination_not_OK:
  4535 00008894 BE[36F30000]        <1> 	mov	esi, Msg_read_file_error_before_EOF
  4536 00008899 E8CED1FFFF          <1> 	call	print_msg
  4537 0000889E E98BF2FFFF          <1> 	jmp	loc_file_rw_restore_retn	      
  4538                              <1>  
  4539                              <1> copy_source_file_to_destination_OK:
  4540 000088A3 BE[9BF10000]        <1> 	mov	esi, Msg_OK
  4541 000088A8 E8BFD1FFFF          <1> 	call	print_msg
  4542                              <1> 
  4543 000088AD E97CF2FFFF          <1> 	jmp	loc_file_rw_restore_retn
  4544                              <1> 
  4545                              <1> ;loc_file_write_check_disk_space_err:
  4546                              <1> 	;cmp	al, 27h ; Insufficient disk space 
  4547                              <1> 	;je	loc_file_write_insuff_disk_space_msg
  4548                              <1>         ;jb	loc_file_rw_cmd_failed
  4549                              <1> 
  4550                              <1> 	;call	print_misc_error_msg ; 15/03/2016
  4551                              <1>         ;jmp	loc_file_rw_restore_retn 
  4552                              <1> 
  4553                              <1> change_fs_file_attributes:
  4554                              <1> 	; 04/03/2016 ; Temporary
  4555                              <1> 	; AL = File or directory attributes
  4556                              <1> 	; AH = 0 -> Attributes are in MS-DOS format
  4557                              <1> 	; AH > 0 -> Attributes are in SINGLIX format
  4558                              <1> 	;push	ebx
  4559                              <1> 	; ... do somethings here ...
  4560                              <1> 	;pop	ebx
  4561                              <1> 	; BL = File or directory attributes
  4562 000088B2 C3                  <1> 	retn
  4563                              <1> 
  4564                              <1> set_get_env:
  4565                              <1> 	; 11/04/2016 (TRDOS 386 =  TRDOS v2.0)
  4566                              <1> 	; 02/09/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_set')
  4567                              <1> 	; 2005 - 28/08/2011 
  4568                              <1> get_setenv_fchar:
  4569                              <1> 	; esi = environment variable/string
  4570 000088B3 8A06                <1> 	mov	al, [esi]
  4571 000088B5 3C20                <1> 	cmp	al, 20h
  4572 000088B7 771E                <1> 	ja	short loc_find_env
  4573                              <1> 
  4574 000088B9 BE00300900          <1> 	mov	esi, Env_Page
  4575                              <1> loc_print_setline:
  4576 000088BE 803E00              <1> 	cmp	byte [esi], 0
  4577 000088C1 7613                <1> 	jna	short loc_setenv_retn
  4578 000088C3 E8A4D1FFFF          <1> 	call	print_msg
  4579 000088C8 56                  <1> 	push	esi
  4580 000088C9 BE[C3FF0000]        <1> 	mov	esi, nextline
  4581 000088CE E899D1FFFF          <1> 	call	print_msg 
  4582 000088D3 5E                  <1> 	pop	esi
  4583 000088D4 EBE8                <1> 	jmp	short loc_print_setline   
  4584                              <1> 
  4585                              <1> loc_setenv_retn: 
  4586 000088D6 C3                  <1> 	retn
  4587                              <1> 
  4588                              <1> loc_find_env:
  4589 000088D7 3C3D                <1> 	cmp	al, '='
  4590 000088D9 0F841DE9FFFF        <1> 	je	loc_cmd_failed
  4591                              <1> 
  4592 000088DF 56                  <1> 	push	esi
  4593                              <1> loc_repeat_env_equal_check:
  4594 000088E0 46                  <1> 	inc	esi
  4595 000088E1 803E3D              <1> 	cmp	byte [esi], '='
  4596 000088E4 7431                <1> 	je	short pass_env_equal_check
  4597 000088E6 803E20              <1> 	cmp	byte [esi], 20h
  4598 000088E9 73F5                <1> 	jnb	short loc_repeat_env_equal_check
  4599 000088EB C60600              <1> 	mov	byte [esi], 0 
  4600 000088EE 5E                  <1> 	pop	esi
  4601 000088EF BF[A6320100]        <1> 	mov	edi, TextBuffer ; out buffer
  4602 000088F4 B9FF000000          <1> 	mov	ecx, 255 ; maximum size (limit)
  4603 000088F9 30C0                <1> 	xor	al, al ; 0 -> use [ESI]
  4604 000088FB E89E000000          <1> 	call	get_environment_string
  4605 00008900 72D4                <1> 	jc	short loc_setenv_retn
  4606                              <1> 
  4607 00008902 BE[A6320100]        <1> 	mov	esi, TextBuffer
  4608 00008907 E860D1FFFF          <1> 	call	print_msg
  4609 0000890C BE[C3FF0000]        <1> 	mov	esi, nextline
  4610 00008911 E856D1FFFF          <1> 	call	print_msg
  4611                              <1> 
  4612 00008916 C3                  <1> 	retn 
  4613                              <1>               
  4614                              <1> pass_env_equal_check:
  4615 00008917 46                  <1> 	inc	esi
  4616 00008918 803E20              <1> 	cmp	byte [esi], 20h
  4617 0000891B 73FA                <1> 	jnb	short pass_env_equal_check
  4618 0000891D C60600              <1> 	mov	byte [esi], 0	
  4619                              <1> 
  4620                              <1> loc_call_set_env_string:
  4621 00008920 5E                  <1> 	pop	esi
  4622 00008921 E83B010000          <1> 	call	set_environment_string
  4623 00008926 73AE                <1> 	jnc	short loc_setenv_retn
  4624                              <1> 
  4625                              <1> loc_set_cmd_failed:
  4626 00008928 3C08                <1> 	cmp	al, 08h
  4627 0000892A 0F85CCE8FFFF        <1> 	jne	loc_cmd_failed
  4628                              <1> 
  4629 00008930 BE[76F30000]        <1> 	mov	esi, Msg_No_Set_Space
  4630 00008935 E832D1FFFF          <1> 	call	print_msg
  4631                              <1> 
  4632 0000893A C3                  <1> 	retn
  4633                              <1> 
  4634                              <1> set_get_path:
  4635                              <1> 	; 11/04/2016 (TRDOS 386 =  TRDOS v2.0)
  4636                              <1> 	; 03/09/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_path')
  4637                              <1> 	; 2005
  4638                              <1> get_path_fchar:
  4639                              <1>  	; esi = path
  4640 0000893B 803E20              <1> 	cmp	byte [esi], 20h
  4641 0000893E 7737                <1> 	ja	short loc_set_path
  4642                              <1> 
  4643 00008940 BE00300900          <1> 	mov	esi, Env_Page
  4644                              <1> loc_print_path:
  4645 00008945 803E00              <1> 	cmp	byte [esi], 0
  4646 00008948 762C                <1> 	jna	short loc_path_retn
  4647                              <1> 
  4648 0000894A BE[D9ED0000]        <1> 	mov	esi, Cmd_Path ; 'PATH' address
  4649 0000894F BF[A6320100]        <1> 	mov	edi, TextBuffer ; oout buffer
  4650 00008954 30C0                <1> 	xor	al, al  ; use [ESI]
  4651 00008956 B9FF000000          <1> 	mov	ecx, 255 ; maximum size (limit)
  4652 0000895B E83E000000          <1> 	call	get_environment_string
  4653 00008960 7214                <1> 	jc	short loc_path_retn
  4654                              <1> 
  4655 00008962 BE[A6320100]        <1> 	mov	esi, TextBuffer
  4656 00008967 E800D1FFFF          <1> 	call	print_msg
  4657 0000896C BE[C3FF0000]        <1> 	mov	esi, nextline
  4658 00008971 E8F6D0FFFF          <1> 	call	print_msg   
  4659                              <1> 
  4660                              <1> loc_path_retn: 
  4661 00008976 C3                  <1> 	retn
  4662                              <1> 
  4663                              <1> loc_set_path:
  4664 00008977 56                  <1> 	push	esi 
  4665                              <1> loc_set_path_find_end:
  4666 00008978 46                  <1> 	inc	esi
  4667 00008979 803E20              <1> 	cmp	byte [esi], 20h
  4668 0000897C 73FA                <1> 	jnb	short loc_set_path_find_end
  4669 0000897E C60600              <1> 	mov	byte [esi], 0 
  4670                              <1> loc_set_path_header: 
  4671 00008981 5E                  <1> 	pop	esi	  
  4672 00008982 4E                  <1> 	dec	esi
  4673 00008983 C6063D              <1> 	mov	byte [esi], '='
  4674 00008986 4E                  <1> 	dec	esi
  4675 00008987 C60648              <1> 	mov	byte [esi], 'H'
  4676 0000898A 4E                  <1> 	dec	esi
  4677 0000898B C60654              <1> 	mov	byte [esi], 'T'
  4678 0000898E 4E                  <1> 	dec	esi
  4679 0000898F C60641              <1> 	mov	byte [esi], 'A'
  4680 00008992 4E                  <1> 	dec	esi
  4681 00008993 C60650              <1> 	mov	byte [esi], 'P'   
  4682                              <1> 
  4683                              <1> loc_path_call_set_env_string:
  4684 00008996 E8C6000000          <1> 	call	set_environment_string
  4685 0000899B 728B                <1>         jc	short loc_set_cmd_failed
  4686                              <1> 
  4687 0000899D C3                  <1> 	retn              
  4688                              <1> 
  4689                              <1> get_environment_string:
  4690                              <1> 	; 12/04/2016
  4691                              <1> 	; 11/04/2016
  4692                              <1> 	; 05/04/2016 (TRDOS 386 =  TRDOS v2.0)
  4693                              <1> 	; 02/09/2011 (TRDOS v1, MAINPROG.ASM)
  4694                              <1> 	; 28/08/2011
  4695                              <1> 	; INPUT->
  4696                              <1> 	;	EDI = Output buffer
  4697                              <1> 	;	CX = Buffer length (<= ENV_PAGE_SIZE)
  4698                              <1> 	;
  4699                              <1> 	;	AL > 0 = AL = String sequence number
  4700                              <1> 	;	AL = 0 -> ESI = ASCIIZ Set word 
  4701                              <1> 	;		(environment variable)
  4702                              <1> 	; OUTPUT ->
  4703                              <1> 	;	ESI is not changed
  4704                              <1> 	;	EDI is not changed
  4705                              <1> 	;	EAX = String length (with zero tail)
  4706                              <1> 	;	EDX = Environment variables page address
  4707                              <1> 	;	CF = 1 -> Not found (EAX not valid)
  4708                              <1> 	;
  4709                              <1> 	; (Modified registers: EAX, EDX) 
  4710                              <1> 
  4711 0000899E BA00300900          <1> 	mov	edx, Env_Page
  4712 000089A3 803A00              <1> 	cmp	byte [edx], 0
  4713 000089A6 7474                <1> 	jz	short get_env_string_with_word_stc_retn
  4714                              <1> 
  4715 000089A8 66890D[143E0100]    <1> 	mov	[env_var_length], cx
  4716                              <1> 
  4717 000089AF 51                  <1> 	push	ecx ; *
  4718 000089B0 56                  <1> 	push	esi ; **
  4719                              <1> 
  4720 000089B1 08C0                <1> 	or	al, al
  4721 000089B3 7449                <1> 	jz	short get_env_string_with_word
  4722                              <1> 
  4723                              <1> get_env_string_with_seq_number:
  4724 000089B5 B101                <1> 	mov	cl, 1
  4725 000089B7 88C5                <1> 	mov	ch, al
  4726 000089B9 31C0                <1> 	xor	eax, eax
  4727 000089BB 89D6                <1> 	mov	esi, edx ; Env_Page
  4728                              <1> 
  4729                              <1> get_env_string_seq_number_check:
  4730 000089BD 38CD                <1> 	cmp	ch, cl
  4731 000089BF 7726                <1> 	ja	short get_env_string_seq_number_next
  4732                              <1> 
  4733                              <1> get_env_string_move_to_buff:
  4734 000089C1 57                  <1> 	push	edi ; ***
  4735                              <1> 
  4736 000089C2 29D2                <1> 	sub	edx, edx
  4737                              <1> 
  4738                              <1> get_env_string_seq_number_repeat1:
  4739 000089C4 42                  <1> 	inc	edx
  4740 000089C5 AC                  <1> 	lodsb
  4741 000089C6 AA                  <1> 	stosb
  4742                              <1> 
  4743 000089C7 66FF0D[143E0100]    <1> 	dec	word [env_var_length]
  4744 000089CE 7508                <1> 	jnz	short get_env_string_seq_number_repeat3
  4745                              <1> 
  4746                              <1> get_env_string_seq_number_repeat2:
  4747 000089D0 20C0                <1> 	and	al, al
  4748 000089D2 7408                <1> 	jz	short get_env_string_seq_number_ok
  4749 000089D4 42                  <1> 	inc	edx
  4750 000089D5 AC                  <1> 	lodsb
  4751 000089D6 EBF8                <1> 	jmp	short get_env_string_seq_number_repeat2
  4752                              <1> 
  4753                              <1> get_env_string_seq_number_repeat3:
  4754 000089D8 08C0                <1> 	or	al, al
  4755 000089DA 75E8                <1> 	jnz	short get_env_string_seq_number_repeat1
  4756                              <1> 
  4757                              <1> get_env_string_seq_number_ok:
  4758 000089DC 5F                  <1> 	pop	edi ; ***
  4759 000089DD 89D0                <1> 	mov	eax, edx ; Length of the environment string
  4760                              <1> 			 ; (ASCIIZ, includes ZERO tail)
  4761 000089DF BA00300900          <1> 	mov	edx, Env_Page
  4762                              <1> 
  4763                              <1> get_env_string_stc_retn:
  4764 000089E4 5E                  <1> 	pop	esi ; **
  4765 000089E5 59                  <1> 	pop	ecx ; *
  4766 000089E6 C3                  <1> 	retn   
  4767                              <1> 	
  4768                              <1> get_env_string_seq_number_next:
  4769 000089E7 AC                  <1> 	lodsb
  4770 000089E8 08C0                <1> 	or	al, al
  4771 000089EA 75FB                <1> 	jnz	short get_env_string_seq_number_next
  4772                              <1> 
  4773 000089EC 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; +512 (+4096)
  4774 000089F2 F5                  <1> 	cmc
  4775 000089F3 72EF                <1> 	jc	short get_env_string_stc_retn
  4776                              <1> 
  4777 000089F5 AC                  <1> 	lodsb
  4778 000089F6 3C01                <1> 	cmp	al, 1
  4779 000089F8 72EA                <1> 	jb	short get_env_string_stc_retn
  4780 000089FA FEC1                <1> 	inc	cl
  4781 000089FC EBBF                <1> 	jmp	short get_env_string_seq_number_check
  4782                              <1> 
  4783                              <1> get_env_string_with_word:
  4784 000089FE 31C9                <1> 	xor	ecx, ecx
  4785                              <1> 
  4786                              <1> get_env_string_calc_word_length:
  4787 00008A00 AC                  <1> 	lodsb 
  4788 00008A01 3C20                <1> 	cmp	al, 20h
  4789 00008A03 7211                <1> 	jb	short get_env_string_calc_word_length_ok
  4790                              <1> 	;inc	cx
  4791 00008A05 FEC1                <1> 	inc	cl
  4792                              <1> 
  4793 00008A07 3C61                <1> 	cmp	al, 'a'
  4794 00008A09 72F5                <1> 	jb	short get_env_string_calc_word_length
  4795 00008A0B 3C7A                <1> 	cmp	al, 'z'
  4796 00008A0D 77F1                <1> 	ja	short get_env_string_calc_word_length
  4797 00008A0F 24DF                <1> 	and	al, 0DFh
  4798 00008A11 8846FF              <1> 	mov	[esi-1], al
  4799 00008A14 EBEA                <1> 	jmp	short get_env_string_calc_word_length
  4800                              <1> 	
  4801                              <1> get_env_string_calc_word_length_ok:
  4802 00008A16 08C9                <1> 	or	cl, cl
  4803 00008A18 7506                <1> 	jnz	short get_env_string_calc_word_length_save
  4804                              <1>      
  4805 00008A1A 5E                  <1> 	pop	esi ; **
  4806                              <1> 
  4807                              <1> get_env_string_stc_retn1:
  4808 00008A1B 59                  <1> 	pop	ecx ; *
  4809                              <1>         
  4810                              <1> get_env_string_with_word_stc_retn:
  4811 00008A1C 31C0                <1> 	xor	eax, eax  
  4812 00008A1E F9                  <1> 	stc
  4813 00008A1F C3                  <1> 	retn
  4814                              <1>   
  4815                              <1> get_env_string_calc_word_length_save:
  4816 00008A20 871C24              <1> 	xchg	ebx, [esp] ; **
  4817 00008A23 89DE                <1> 	mov	esi, ebx 
  4818                              <1> 		; Start of the env string (to be searched)
  4819                              <1> 
  4820 00008A25 57                  <1> 	push	edi ; ***
  4821 00008A26 89D7                <1> 	mov	edi, edx ; Env_Page
  4822                              <1> 
  4823                              <1> get_env_string_compare:
  4824 00008A28 57                  <1> 	push	edi ; ****
  4825 00008A29 51                  <1> 	push	ecx ; ***** ; Variable name length
  4826                              <1> 
  4827                              <1> get_env_string_compare_rep:
  4828 00008A2A AC                  <1> 	lodsb
  4829 00008A2B AE                  <1> 	scasb
  4830 00008A2C 7511                <1> 	jne	short get_env_string_compare_next1
  4831 00008A2E E2FA                <1> 	loop	get_env_string_compare_rep
  4832                              <1> 	
  4833 00008A30 803F3D              <1> 	cmp	byte [edi], '='
  4834 00008A33 750A                <1> 	jne	short get_env_string_compare_next1
  4835                              <1>  
  4836 00008A35 59                  <1> 	pop	ecx ; *****
  4837 00008A36 5F                  <1> 	pop	edi ; ****
  4838 00008A37 89FE                <1> 	mov	esi, edi
  4839 00008A39 5F                  <1> 	pop	edi ; ***
  4840 00008A3A 871C24              <1> 	xchg	ebx, [esp] ; **
  4841 00008A3D EB82                <1> 	jmp	short get_env_string_move_to_buff
  4842                              <1> 
  4843                              <1> get_env_string_compare_next1:
  4844 00008A3F 89FE                <1> 	mov	esi, edi
  4845 00008A41 59                  <1> 	pop	ecx ; *****
  4846 00008A42 5F                  <1> 	pop	edi ; ****
  4847                              <1> get_env_string_compare_next2:
  4848 00008A43 81FEFF310900        <1> 	cmp	esi, Env_Page + Env_Page_Size - 1 ; +511 (+4095)
  4849 00008A49 7310                <1> 	jnb	short get_env_string_compare_not_ok
  4850 00008A4B 20C0                <1> 	and	al, al
  4851 00008A4D AC                  <1> 	lodsb
  4852 00008A4E 75F3                <1> 	jnz	short get_env_string_compare_next2
  4853 00008A50 08C0                <1> 	or	al, al
  4854 00008A52 7407                <1> 	jz	short get_env_string_compare_not_ok
  4855 00008A54 4E                  <1> 	dec	esi ; 12/04/2016
  4856 00008A55 89F7                <1> 	mov	edi, esi
  4857 00008A57 89DE                <1> 	mov	esi, ebx
  4858 00008A59 EBCD                <1> 	jmp	short get_env_string_compare
  4859                              <1> 
  4860                              <1> get_env_string_compare_not_ok:
  4861 00008A5B 5F                  <1> 	pop	edi ; ***
  4862 00008A5C 89DE                <1> 	mov	esi, ebx
  4863 00008A5E 5B                  <1> 	pop	ebx ; **
  4864 00008A5F EBBA                <1> 	jmp	short get_env_string_stc_retn1
  4865                              <1> 
  4866                              <1> set_environment_string:
  4867                              <1> 	; 13/04/2016
  4868                              <1> 	; 12/04/2016
  4869                              <1> 	; 11/04/2016
  4870                              <1> 	; 06/04/2016
  4871                              <1> 	; 05/04/2016 (TRDOS 386 = TRDOS v2.0)
  4872                              <1> 	; 02/09/2011 (TRDOS v1, MAINPROG.ASM)
  4873                              <1> 	; 29/08/2011
  4874                              <1> 	; 29/08/2011
  4875                              <1> 	; INPUT->
  4876                              <1> 	;	ESI = ASCIIZ environment string
  4877                              <1> 	; OUTPUT ->
  4878                              <1> 	;	ESI is not changed
  4879                              <1> 	;	CF = 1 -> Could not set, 
  4880                              <1> 	;	     insufficient environment space
  4881                              <1> 	;
  4882                              <1> 	; (EAX, EDX will be changed) 
  4883                              <1> 	;
  4884                              <1> 	;    (EAX = Start address of the env string if > 0)	
  4885                              <1> 	;    (EDX = Environment string length)	
  4886                              <1> 
  4887 00008A61 56                  <1> 	push 	esi ; *
  4888                              <1> 
  4889 00008A62 31C0                <1> 	xor	eax, eax
  4890                              <1> 
  4891                              <1> set_env_chk_validation1:
  4892 00008A64 FEC4                <1> 	inc	ah ; variable (string) length
  4893 00008A66 AC                  <1> 	lodsb
  4894 00008A67 3C3D                <1> 	cmp	al, '='
  4895 00008A69 7415                <1> 	je	short set_env_chk_validation2
  4896 00008A6B 3C20                <1> 	cmp	al, 20h
  4897 00008A6D 720F                <1> 	jb	short set_env_string_stc
  4898                              <1> 
  4899                              <1> 	; 06/04/2016
  4900 00008A6F 3C61                <1> 	cmp	al, 'a'
  4901 00008A71 72F1                <1> 	jb	short set_env_chk_validation1
  4902 00008A73 3C7A                <1> 	cmp	al, 'z'
  4903 00008A75 77ED                <1> 	ja	short set_env_chk_validation1
  4904 00008A77 2C20                <1> 	sub	al, 'a'-'A'
  4905 00008A79 8846FF              <1> 	mov	[esi-1], al
  4906 00008A7C EBE6                <1> 	jmp	short set_env_chk_validation1
  4907                              <1> 
  4908                              <1> set_env_string_stc:
  4909 00008A7E 5E                  <1> 	pop	esi ; *
  4910                              <1> 	;stc
  4911 00008A7F C3                  <1> 	retn 
  4912                              <1> 	   
  4913                              <1> set_env_chk_validation2:
  4914 00008A80 51                  <1> 	push	ecx ; **
  4915 00008A81 53                  <1> 	push	ebx ; *** 
  4916 00008A82 57                  <1> 	push	edi ; ****
  4917                              <1> 
  4918                              <1> 	; 12/04/2016
  4919 00008A83 8B5C240C            <1> 	mov	ebx, [esp+12]
  4920                              <1> 
  4921                              <1> set_env_chk_validation2w:
  4922 00008A87 89F7                <1> 	mov	edi, esi
  4923 00008A89 4F                  <1> 	dec	edi
  4924                              <1> 
  4925 00008A8A 807FFF20            <1> 	cmp	byte [edi-1], 20h
  4926 00008A8E 771A                <1> 	ja	short set_env_chk_validation2z
  4927                              <1> 	
  4928 00008A90 56                  <1> 	push	esi
  4929 00008A91 89FE                <1> 	mov	esi, edi
  4930 00008A93 4E                  <1> 	dec	esi
  4931                              <1> 
  4932                              <1> set_env_chk_validation2x:
  4933 00008A94 4E                  <1> 	dec	esi
  4934                              <1> 
  4935 00008A95 39DE                <1> 	cmp	esi, ebx
  4936 00008A97 7207                <1> 	jb	short set_env_chk_validation2y
  4937                              <1> 
  4938 00008A99 4F                  <1> 	dec	edi
  4939                              <1> 
  4940 00008A9A 8A06                <1> 	mov	al, [esi]
  4941 00008A9C 8807                <1> 	mov	[edi], al
  4942                              <1> 
  4943 00008A9E EBF4                <1> 	jmp	short set_env_chk_validation2x
  4944                              <1> 
  4945                              <1> set_env_chk_validation2y:
  4946 00008AA0 5E                  <1> 	pop	esi
  4947                              <1> 
  4948                              <1> 	;mov	byte [ebx], 20h
  4949                              <1> 	
  4950 00008AA1 43                  <1> 	inc 	ebx
  4951 00008AA2 895C240C            <1> 	mov	[esp+12], ebx
  4952                              <1> 
  4953 00008AA6 FECC                <1> 	dec 	ah ; 13/04/2016
  4954                              <1> 
  4955 00008AA8 EBDD                <1> 	jmp	short set_env_chk_validation2w
  4956                              <1> 	
  4957                              <1> set_env_chk_validation2z:	
  4958 00008AAA BA00300900          <1> 	mov	edx, Env_Page
  4959 00008AAF 89D7                <1> 	mov	edi, edx
  4960                              <1> 
  4961                              <1> set_env_chk_validation3:
  4962 00008AB1 AC                  <1> 	lodsb
  4963 00008AB2 3C20                <1> 	cmp	al, 20h
  4964 00008AB4 74FB                <1> 	je	short set_env_chk_validation3
  4965                              <1> 
  4966 00008AB6 9C                  <1> 	pushf
  4967                              <1> 
  4968                              <1> 	; 12/04/2016
  4969                              <1> set_env_chk_validation3n:
  4970 00008AB7 3C61                <1> 	cmp	al, 'a'
  4971 00008AB9 720C                <1> 	jb	short set_env_chk_validation3c
  4972 00008ABB 3C7A                <1> 	cmp	al, 'z'
  4973 00008ABD 7705                <1> 	ja	short set_env_chk_validation3x
  4974 00008ABF 2C20                <1> 	sub	al, 'a'-'A'
  4975 00008AC1 8846FF              <1> 	mov	[esi-1], al
  4976                              <1> 
  4977                              <1> set_env_chk_validation3x:
  4978 00008AC4 AC                  <1> 	lodsb
  4979 00008AC5 EBF0                <1> 	jmp	short set_env_chk_validation3n
  4980                              <1> 
  4981                              <1> set_env_chk_validation3c:
  4982 00008AC7 3C20                <1> 	cmp	al, 20h
  4983 00008AC9 73F9                <1> 	jnb	short set_env_chk_validation3x
  4984                              <1> 		
  4985 00008ACB 803F00              <1> 	cmp	byte [edi], 0
  4986 00008ACE 7731                <1> 	ja	short set_env_chk_validation4
  4987                              <1> 
  4988 00008AD0 9D                  <1> 	popf
  4989 00008AD1 7228                <1> 	jb	short set_env_string_nothing
  4990                              <1> 
  4991 00008AD3 B900020000          <1> 	mov	ecx, Env_Page_Size ; 512 (4096)
  4992                              <1> 
  4993 00008AD8 89DE                <1> 	mov	esi, ebx ; 12/04/2016
  4994                              <1> 
  4995                              <1> set_env_string_copy_to_envb:
  4996 00008ADA AC                  <1> 	lodsb
  4997 00008ADB 3C20                <1> 	cmp	al, 20h
  4998 00008ADD 720A                <1> 	jb	short set_env_string_copy_to_envb_z
  4999 00008ADF AA                  <1> 	stosb
  5000 00008AE0 E2F8                <1> 	loop	set_env_string_copy_to_envb
  5001                              <1> 
  5002                              <1> 	; 11/04/2016
  5003 00008AE2 89D7                <1> 	mov	edi, edx ; Env_Page
  5004 00008AE4 B900020000          <1> 	mov	ecx, Env_Page_Size 
  5005                              <1> 
  5006                              <1> set_env_string_copy_to_envb_z:
  5007 00008AE9 52                  <1> 	push	edx  ; Start address of the variable
  5008 00008AEA BA00020000          <1> 	mov	edx, Env_Page_Size
  5009 00008AEF 29CA                <1> 	sub	edx, ecx ; variable (string) length
  5010                              <1> 
  5011 00008AF1 28C0                <1> 	sub	al, al ; 0
  5012 00008AF3 F3AA                <1>  	rep	stosb ; clear remain bytes of the env page
  5013                              <1> 
  5014 00008AF5 58                  <1> 	pop	eax  ; Start address of the variable
  5015                              <1> 
  5016                              <1> set_env_string_allocate_envb_retn:  ; stc or clc return
  5017 00008AF6 5F                  <1> 	pop	edi ; ****
  5018 00008AF7 5B                  <1> 	pop	ebx ; ***
  5019 00008AF8 59                  <1> 	pop	ecx ; **
  5020 00008AF9 5E                  <1> 	pop	esi ; *	
  5021 00008AFA C3                  <1> 	retn
  5022                              <1> 
  5023                              <1> set_env_string_nothing:
  5024 00008AFB 31C0                <1> 	xor	eax, eax
  5025 00008AFD 31D2                <1> 	xor	edx, edx ; 11/04/2016
  5026 00008AFF EBF5                <1> 	jmp	short set_env_string_allocate_envb_retn
  5027                              <1> 
  5028                              <1> set_env_chk_validation4:
  5029                              <1> 	; 11/04/2016
  5030 00008B01 9D                  <1> 	popf
  5031                              <1> 
  5032 00008B02 89D6                <1> 	mov	esi, edx  ; Env_Page
  5033                              <1> 
  5034                              <1> set_env_chk_validation5:	
  5035 00008B04 89DF                <1> 	mov	edi, ebx  ; ASCIIZ environment string address	
  5036 00008B06 0FB6CC              <1> 	movzx	ecx, ah ; Variable (string) length (with '=')
  5037                              <1> 
  5038                              <1> set_env_chk_validation5_loop:
  5039 00008B09 AC                  <1> 	lodsb
  5040 00008B0A AE                  <1> 	scasb
  5041 00008B0B 750A                <1> 	jne	short set_env_chk_validation6
  5042 00008B0D E2FA                <1> 	loop	set_env_chk_validation5_loop
  5043                              <1> 
  5044 00008B0F 3C3D                <1> 	cmp	al, '='
  5045 00008B11 0F8483000000        <1>         je      set_env_change_variable
  5046                              <1> 
  5047                              <1> set_env_chk_validation6:
  5048 00008B17 08C0                <1> 	or	al, al ; 0
  5049 00008B19 7403                <1> 	jz	short set_env_chk_validation7
  5050                              <1> 
  5051 00008B1B AC                  <1> 	lodsb
  5052 00008B1C EBF9                <1> 	jmp	short set_env_chk_validation6
  5053                              <1> 
  5054                              <1> set_env_chk_validation7:
  5055 00008B1E 88E1                <1> 	mov	cl, ah
  5056 00008B20 01F1                <1> 	add	ecx, esi
  5057 00008B22 81F9FF310900        <1> 	cmp	ecx, Env_Page + Env_Page_Size - 1 
  5058                              <1> 		; 511 (4095) 
  5059                              <1> 		; strlen + '=' + 0
  5060 00008B28 72DA                <1> 	jb	short set_env_chk_validation5
  5061                              <1> 
  5062                              <1> set_env_chk_validation8: ; variable not found
  5063 00008B2A 0FB6F4              <1> 	movzx	esi, ah  ; variable name length (with '=') 
  5064 00008B2D 01DE                <1> 	add	esi, ebx ; position just after of the '='
  5065                              <1> 
  5066                              <1> set_env_chk_validation8_loop:
  5067 00008B2F AC                  <1> 	lodsb
  5068 00008B30 3C20                <1> 	cmp	al, 20h
  5069 00008B32 74FB                <1> 	je	short set_env_chk_validation8_loop	
  5070 00008B34 72C5                <1> 	jb	short set_env_string_nothing
  5071                              <1> 
  5072                              <1> set_env_chk_validation9:
  5073 00008B36 AC                  <1> 	lodsb
  5074 00008B37 3C20                <1> 	cmp	al, 20h
  5075 00008B39 73FB                <1> 	jnb	short set_env_chk_validation9
  5076                              <1> 
  5077                              <1> 	; End of ASCIIZ environment string
  5078                              <1> 
  5079                              <1> set_env_add_variable:
  5080 00008B3B 29DE                <1> 	sub	esi, ebx ; variable+definition length
  5081                              <1> 	
  5082 00008B3D 56                  <1> 	push	esi ; *****
  5083                              <1> 
  5084 00008B3E 89D6                <1> 	mov	esi, edx ; Environment page address
  5085                              <1> 
  5086 00008B40 B900020000          <1> 	mov	ecx, Env_Page_Size ; 512 (4096)	
  5087                              <1> 
  5088                              <1> set_env_add_variable_loop:
  5089 00008B45 AC                  <1> 	lodsb
  5090 00008B46 20C0                <1> 	and	al, al		
  5091 00008B48 7406                <1> 	jz	short set_env_add_variable_chk1 ; 0
  5092 00008B4A E2F9                <1> 	loop	set_env_add_variable_loop
  5093                              <1> 
  5094                              <1> 	; 11/04/2016
  5095 00008B4C 884EFF              <1> 	mov	[esi-1], cl ; 0
  5096 00008B4F 41                  <1> 	inc	ecx
  5097                              <1> 	
  5098                              <1> set_env_add_variable_chk1: 
  5099 00008B50 49                  <1> 	dec	ecx
  5100 00008B51 7408                <1> 	jz	short set_env_add_variable_nspc
  5101 00008B53 AC                  <1> 	lodsb
  5102 00008B54 08C0                <1> 	or 	al, al
  5103 00008B56 740C                <1> 	jz	short set_env_add_variable_chk2 ; 00
  5104 00008B58 49                  <1> 	dec	ecx
  5105 00008B59 75EA                <1> 	jnz	short set_env_add_variable_loop
  5106                              <1> 
  5107                              <1> set_env_add_variable_nspc: ; no space on environment page
  5108 00008B5B 58                  <1> 	pop	eax ; *****
  5109 00008B5C B808000000          <1> 	mov	eax, 8 ; No space for new environment string
  5110 00008B61 F9                  <1> 	stc
  5111 00008B62 EB92                <1>         jmp     short set_env_string_allocate_envb_retn
  5112                              <1> 
  5113                              <1> set_env_add_variable_chk2:
  5114 00008B64 8B0C24              <1> 	mov	ecx, [esp] ; *****
  5115 00008B67 4E                  <1> 	dec	esi ; beginning address of the new variable
  5116 00008B68 89F0                <1> 	mov	eax, esi
  5117 00008B6A 01C8                <1> 	add	eax, ecx ; string length (with CR)
  5118 00008B6C 81C200020000        <1> 	add	edx, Env_Page_Size ; 512 (4096)
  5119 00008B72 39D0                <1> 	cmp	eax, edx 
  5120 00008B74 77E5                <1> 	ja	short set_env_add_variable_nspc
  5121 00008B76 49                  <1> 	dec	ecx ; except CR at the end
  5122 00008B77 89CA                <1> 	mov	edx, ecx ; 12/04/2016
  5123 00008B79 89F7                <1> 	mov	edi, esi
  5124 00008B7B 893C24              <1> 	mov	[esp], edi ; ***** ; Start address of new variable
  5125 00008B7E 89DE                <1> 	mov	esi, ebx ; ASCIIZ environment string address
  5126 00008B80 F3A4                <1> 	rep	movsb
  5127 00008B82 28C0                <1> 	sub	al, al
  5128 00008B84 AA                  <1> 	stosb
  5129 00008B85 58                  <1> 	pop	eax ; ***** ; Beginning address of new variable			
  5130 00008B86 81FF00320900        <1>         cmp     edi, Env_Page + Env_Page_Size ; 12/04/2016
  5131 00008B8C 0F8364FFFFFF        <1>         jnb     set_env_string_allocate_envb_retn ; OK !
  5132 00008B92 880F                <1> 	mov	[edi], cl ; 0
  5133 00008B94 F8                  <1> 	clc	; 13/04/2016
  5134 00008B95 E95CFFFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  5135                              <1> 
  5136                              <1> set_env_change_variable:
  5137                              <1> 	; 06/04/2016
  5138                              <1> 	; esi = Variable's address in environment page (after '=')
  5139                              <1> 	; edi = ASCIIZ environment string address (after '=')
  5140                              <1> 
  5141                              <1> 	; ah = variable length from start to the '='
  5142 00008B9A 8825[143E0100]      <1> 	mov	[env_var_length], ah
  5143                              <1> 
  5144 00008BA0 28C9                <1> 	sub	cl, cl ; ecx = 0
  5145                              <1> 
  5146 00008BA2 57                  <1> 	push	edi ; *****
  5147                              <1> 
  5148 00008BA3 89F7                <1> 	mov	edi, esi ; 11/04/2016
  5149                              <1> 
  5150                              <1> set_env_change_variable_calc1:
  5151 00008BA5 AC                  <1> 	lodsb
  5152 00008BA6 08C0                <1> 	or	al, al
  5153 00008BA8 7403                <1> 	jz	short set_env_change_variable_calc2
  5154                              <1> 
  5155 00008BAA 41                  <1> 	inc	ecx ; length of environment string (after the '=')
  5156                              <1> 
  5157 00008BAB EBF8                <1> 	jmp	short set_env_change_variable_calc1	
  5158                              <1> 
  5159                              <1> set_env_change_variable_calc2:
  5160 00008BAD 8B3424              <1> 	mov	esi, [esp] ; ASCIIZ environment string address
  5161                              <1> 	
  5162 00008BB0 29D2                <1> 	sub	edx, edx
  5163                              <1> 
  5164                              <1> set_env_change_variable_calc3:
  5165 00008BB2 AC                  <1> 	lodsb
  5166 00008BB3 3C20                <1> 	cmp	al, 20h
  5167 00008BB5 7203                <1> 	jb	short set_env_change_variable_calc4
  5168                              <1> 
  5169 00008BB7 42                  <1> 	inc	edx ; length of ASCIIZ string (after the '=')
  5170                              <1> 	
  5171 00008BB8 EBF8                <1> 	jmp	short set_env_change_variable_calc3
  5172                              <1> 	
  5173                              <1> set_env_change_variable_calc4:
  5174 00008BBA C646FF00            <1> 	mov	byte [esi-1], 0  ; put ZERO instead of CR
  5175                              <1> 	
  5176 00008BBE 5E                  <1> 	pop	esi ; ***** ; ASCIIZ string address (after '=')
  5177                              <1> 
  5178                              <1> 	; EDI = Old variable's address (after '=')
  5179                              <1> 	
  5180                              <1> 	; compare the new string with the old string
  5181 00008BBF 39CA                <1> 	cmp	edx, ecx
  5182 00008BC1 7717                <1> 	ja	short set_env_change_variable_calc5 ; longer
  5183 00008BC3 0F828F000000        <1>         jb      set_env_change_variable_calc9 ; shorter
  5184                              <1> 	
  5185                              <1> 	;same length (simple copy)
  5186 00008BC9 0FB6C4              <1> 	movzx	eax, ah
  5187 00008BCC 01C2                <1> 	add	edx, eax
  5188 00008BCE F7D8                <1> 	neg	eax
  5189 00008BD0 01F8                <1> 	add	eax, edi
  5190                              <1> 	; EAX = Start address of the variable
  5191                              <1> 	; EDX = Variable length (without ZERO at the end of variable)
  5192                              <1> 
  5193 00008BD2 F3A4                <1> 	rep	movsb
  5194 00008BD4 F8                  <1> 	clc	; 13/04/2016
  5195 00008BD5 E91CFFFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  5196                              <1> 
  5197                              <1> set_env_change_variable_calc5:
  5198                              <1> 	; 11/04/2016
  5199 00008BDA 52                  <1> 	push	edx ; *****
  5200 00008BDB 29CA                <1> 	sub	edx, ecx ; difference ; (the new string is longer)
  5201 00008BDD 89F3                <1> 	mov 	ebx, esi
  5202 00008BDF 89FE                <1> 	mov	esi, edi
  5203                              <1> 
  5204                              <1> set_env_change_variable_calc6:
  5205 00008BE1 AC                  <1> 	lodsb 
  5206 00008BE2 20C0                <1> 	and	al, al
  5207 00008BE4 75FB                <1> 	jnz	short set_env_change_variable_calc6
  5208                              <1> 
  5209 00008BE6 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; 512 (4096)
  5210 00008BEC 0F8369FFFFFF        <1>         jnb     set_env_add_variable_nspc
  5211                              <1> 
  5212 00008BF2 89F9                <1> 	mov	ecx, edi  ; current (old) variable's address
  5213 00008BF4 89F7                <1> 	mov	edi, esi  ; next variable's address 
  5214                              <1> 
  5215 00008BF6 AC                  <1> 	lodsb
  5216 00008BF7 08C0                <1> 	or	al, al
  5217 00008BF9 7416                <1> 	jz	short set_env_change_variable_calc8 ; 00
  5218                              <1> 
  5219                              <1> set_env_change_variable_calc7:
  5220 00008BFB AC                  <1> 	lodsb
  5221 00008BFC 20C0                <1> 	and	al, al
  5222 00008BFE 75FB                <1> 	jnz	short set_env_change_variable_calc7
  5223                              <1> 
  5224 00008C00 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; 512 (4096)
  5225 00008C06 0F834FFFFFFF        <1>         jnb     set_env_add_variable_nspc
  5226                              <1> 
  5227 00008C0C AC                  <1> 	lodsb
  5228 00008C0D 08C0                <1> 	or	al, al
  5229 00008C0F 75EA                <1> 	jnz	short set_env_change_variable_calc7
  5230                              <1> 
  5231                              <1> set_env_change_variable_calc8:
  5232 00008C11 4E                  <1> 	dec	esi ; address of the second (last) 0 of the 00
  5233                              <1> 
  5234 00008C12 01F2                <1> 	add	edx, esi ; final position of the last 0
  5235                              <1> 
  5236 00008C14 81FA00320900        <1> 	cmp	edx, Env_Page + Env_Page_Size ; 512 (4096)
  5237 00008C1A 0F833BFFFFFF        <1>         jnb     set_env_add_variable_nspc
  5238                              <1> 
  5239 00008C20 89C8                <1> 	mov	eax, ecx ; old variable's address (after '=')
  5240                              <1> 
  5241 00008C22 89F1                <1> 	mov	ecx, esi 
  5242 00008C24 29F9                <1> 	sub	ecx, edi ; count of bytes to move forward
  5243                              <1> 
  5244                              <1> 	; 13/04/2016
  5245 00008C26 C60200              <1> 	mov	byte [edx], 0
  5246 00008C29 89D7                <1> 	mov	edi, edx
  5247 00008C2B 29F2                <1> 	sub	edx, esi ; difference (additional byte count)
  5248 00008C2D 4F                  <1> 	dec	edi ; the last zero address (first byte of the 00)
  5249 00008C2E 89FE                <1> 	mov	esi, edi
  5250 00008C30 29D6                <1> 	sub	esi, edx ; - displacement
  5251                              <1> 	
  5252 00008C32 FA                  <1> 	cli	; disable interrupts
  5253 00008C33 FD                  <1> 	std	; backward
  5254                              <1> 
  5255 00008C34 F3A4                <1> 	rep	movsb ; move ECX bytes from DS:ESI to ES:EDI
  5256                              <1> 
  5257 00008C36 FC                  <1> 	cld	; forward (default)
  5258 00008C37 FB                  <1> 	sti	; enable interrupts
  5259                              <1> 	
  5260 00008C38 89C7                <1> 	mov	edi, eax
  5261 00008C3A 59                  <1> 	pop	ecx ; ***** ; byte count (after '=')
  5262 00008C3B 89CA                <1> 	mov	edx, ecx
  5263 00008C3D 89DE                <1> 	mov	esi, ebx ; ASCIIZ string address (after '=')
  5264 00008C3F 89FB                <1> 	mov	ebx, edi
  5265                              <1> 
  5266 00008C41 F3A4                <1> 	rep	movsb
  5267                              <1> 
  5268 00008C43 880F                <1> 	mov	[edi], cl ; 0 ; end of variable
  5269                              <1> 
  5270 00008C45 0FB605[143E0100]    <1> 	movzx	eax, byte [env_var_length]
  5271 00008C4C 01C2                <1> 	add	edx, eax ; variable length (total)
  5272 00008C4E F7D8                <1> 	neg	eax
  5273 00008C50 01D8                <1> 	add	eax, ebx ; start address of the variable
  5274 00008C52 F8                  <1> 	clc	; 13/04/2016
  5275 00008C53 E99EFEFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  5276                              <1> 
  5277                              <1> set_env_change_variable_calc9:
  5278                              <1> 	; 11/04/2016
  5279 00008C58 21D2                <1> 	and	edx, edx ; is empty ?
  5280 00008C5A 753B                <1> 	jnz	short set_env_change_variable_calc15
  5281                              <1> 	
  5282 00008C5C 0FB6DC              <1> 	movzx	ebx, ah
  5283 00008C5F F7DB                <1> 	neg	ebx
  5284 00008C61 01FB                <1> 	add	ebx, edi
  5285                              <1> 
  5286                              <1> 	; EBX = Start address of the variable (in env page)
  5287                              <1> 	; EDX = Variable length = 0
  5288                              <1> 	
  5289 00008C63 89FE                <1> 	mov	esi, edi
  5290                              <1> 
  5291                              <1> set_env_change_variable_calc10:
  5292 00008C65 AC                  <1> 	lodsb
  5293 00008C66 08C0                <1> 	or	al, al
  5294 00008C68 75FB                <1> 	jnz	short set_env_change_variable_calc10
  5295                              <1> 
  5296 00008C6A B9FF310900          <1> 	mov	ecx, Env_Page + Env_Page_Size - 1
  5297                              <1> 
  5298 00008C6F 39CE                <1> 	cmp	esi, ecx ; +511 (+4095)
  5299 00008C71 7604                <1> 	jna	short set_env_change_variable_calc11
  5300                              <1> 
  5301 00008C73 89CE                <1> 	mov	esi, ecx
  5302 00008C75 8806                <1> 	mov	[esi], al ; 0
  5303                              <1> 
  5304                              <1> set_env_change_variable_calc11:
  5305 00008C77 89DF                <1> 	mov	edi, ebx ; old variable's start address
  5306                              <1> 
  5307                              <1> set_env_change_variable_calc12:
  5308 00008C79 AC                  <1> 	lodsb
  5309 00008C7A AA                  <1> 	stosb
  5310 00008C7B 20C0                <1> 	and	al, al
  5311 00008C7D 75FA                <1> 	jnz	short set_env_change_variable_calc12
  5312 00008C7F 39CE                <1> 	cmp	esi, ecx
  5313 00008C81 7706                <1> 	ja	short set_env_change_variable_calc13
  5314 00008C83 AC                  <1> 	lodsb
  5315 00008C84 AA                  <1> 	stosb
  5316 00008C85 20C0                <1> 	and	al, al
  5317 00008C87 75F0                <1> 	jnz	short set_env_change_variable_calc12	
  5318                              <1> 
  5319                              <1> set_env_change_variable_calc13:
  5320 00008C89 29F9                <1> 	sub	ecx, edi
  5321 00008C8B 7203                <1> 	jb	short set_env_change_variable_calc14
  5322 00008C8D 41                  <1> 	inc	ecx ; 1-512 (1-4096)
  5323 00008C8E F3AA                <1> 	rep	stosb ; al = 0	
  5324                              <1> 
  5325                              <1> set_env_change_variable_calc14:
  5326 00008C90 29C0                <1> 	sub	eax, eax ; Start address of the variable
  5327                              <1> 	; EAX = 0 -> Variable is removed
  5328                              <1> 	; EDX = Variable length = 0	
  5329                              <1> 
  5330 00008C92 E95FFEFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  5331                              <1> 	    
  5332                              <1> set_env_change_variable_calc15:	
  5333 00008C97 52                  <1> 	push	edx ; *****
  5334 00008C98 F7DA                <1> 	neg	edx
  5335 00008C9A 01CA                <1> 	add	edx, ecx ; difference (the old string is longer)
  5336 00008C9C 89F3                <1> 	mov 	ebx, esi
  5337 00008C9E 89FE                <1> 	mov	esi, edi
  5338                              <1> 
  5339                              <1> set_env_change_variable_calc16:
  5340 00008CA0 AC                  <1> 	lodsb 
  5341 00008CA1 20C0                <1> 	and	al, al
  5342 00008CA3 75FB                <1> 	jnz	short set_env_change_variable_calc16
  5343                              <1> 
  5344 00008CA5 B900320900          <1> 	mov	ecx, Env_Page + Env_Page_Size
  5345                              <1> 
  5346 00008CAA 39CE                <1> 	cmp	esi, ecx ; +512 (+4096)
  5347 00008CAC 7605                <1> 	jna	short set_env_change_variable_calc17
  5348                              <1> 
  5349 00008CAE 89CE                <1> 	mov	esi, ecx
  5350 00008CB0 8846FF              <1> 	mov	[esi-1], al ; 0
  5351                              <1> 
  5352                              <1> set_env_change_variable_calc17:
  5353 00008CB3 89F9                <1> 	mov	ecx, edi  ; current (old) variable's address
  5354 00008CB5 89F7                <1> 	mov	edi, esi  ; next variable's address 
  5355                              <1> 
  5356 00008CB7 AC                  <1> 	lodsb
  5357 00008CB8 08C0                <1> 	or	al, al
  5358 00008CBA 741D                <1> 	jz	short set_env_change_variable_calc20
  5359                              <1> 
  5360                              <1> set_env_change_variable_calc18:
  5361 00008CBC AC                  <1> 	lodsb
  5362 00008CBD 20C0                <1> 	and	al, al
  5363 00008CBF 75FB                <1> 	jnz	short set_env_change_variable_calc18
  5364                              <1> 
  5365 00008CC1 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size
  5366 00008CC7 720B                <1> 	jb	short set_env_change_variable_calc19
  5367 00008CC9 740E                <1> 	je	short set_env_change_variable_calc20
  5368                              <1> 
  5369 00008CCB BEFF310900          <1> 	mov	esi, Env_Page + Env_Page_Size - 1
  5370 00008CD0 8806                <1> 	mov	[esi], al ; 0
  5371 00008CD2 EB06                <1> 	jmp	short set_env_change_variable_calc21
  5372                              <1> 
  5373                              <1> set_env_change_variable_calc19:
  5374 00008CD4 AC                  <1> 	lodsb
  5375 00008CD5 08C0                <1> 	or	al, al
  5376 00008CD7 75E3                <1> 	jnz	short set_env_change_variable_calc18
  5377                              <1> 
  5378                              <1> set_env_change_variable_calc20:
  5379 00008CD9 4E                  <1> 	dec	esi ; address of the second (last) 0 of the 00
  5380                              <1> 
  5381                              <1> set_env_change_variable_calc21:
  5382                              <1> 	; edx = difference (byte count)
  5383                              <1> 	
  5384 00008CDA 89C8                <1> 	mov	eax, ecx ; old variable's address (after '=')
  5385                              <1> 
  5386 00008CDC 89F1                <1> 	mov	ecx, esi 
  5387 00008CDE 29F9                <1> 	sub	ecx, edi ; count of bytes to move backward
  5388                              <1> 
  5389 00008CE0 89FE                <1> 	mov	esi, edi ; next variable's address
  5390 00008CE2 29D7                <1> 	sub	edi, edx ; (displacement)
  5391                              <1> 	
  5392 00008CE4 F3A4                <1> 	rep	movsb
  5393                              <1> 
  5394 00008CE6 880F                <1> 	mov	[edi], cl ; 0 ; 00 ; end of environment variables
  5395                              <1> 
  5396 00008CE8 89C7                <1> 	mov	edi, eax
  5397 00008CEA 5A                  <1> 	pop	edx ; ***** ; byte count (after '=')
  5398 00008CEB 89D1                <1> 	mov	ecx, edx
  5399 00008CED 89DE                <1> 	mov	esi, ebx ; ASCIIZ string address (after '=')
  5400 00008CEF 89FB                <1> 	mov	ebx, edi
  5401                              <1> 	
  5402 00008CF1 F3A4                <1> 	rep	movsb
  5403                              <1> 
  5404 00008CF3 880F                <1> 	mov	[edi], cl ; 0 ; end of variable
  5405                              <1> 
  5406 00008CF5 0FB605[143E0100]    <1> 	movzx	eax, byte [env_var_length]
  5407 00008CFC 01C2                <1> 	add	edx, eax ; variable length (total)
  5408 00008CFE F7D8                <1> 	neg	eax
  5409 00008D00 01D8                <1> 	add	eax, ebx ; start address of the variable
  5410 00008D02 F8                  <1> 	clc	; 13/04/2016
  5411 00008D03 E9EEFDFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  5412                              <1> 
  5413                              <1> mainprog_startup_configuration:
  5414                              <1> 	; 06/05/2016
  5415                              <1> 	; 14/04/2016 (TRDOS 386 = TRDOS v2.0)
  5416                              <1> 	; 17/09/2011 (TRDOS v1, MAINPROG.ASM)
  5417                              <1> 	;
  5418                              <1> loc_load_mainprog_cfg_file:
  5419 00008D08 BE[53ED0000]        <1> 	mov	esi, MainProgCfgFile
  5420 00008D0D 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  5421 00008D11 E8E8E9FFFF          <1> 	call	find_first_file
  5422 00008D16 7256                <1> 	jc	short loc_load_mainprog_cfg_exit
  5423                              <1> 
  5424                              <1> 	;or	eax, eax
  5425                              <1> 	;jz	short loc_load_mainprog_cfg_exit
  5426                              <1> 
  5427                              <1> loc_start_mainprog_configuration:
  5428                              <1> 	; ESI = FindFile_DirEntry Location
  5429                              <1> 	; EAX = File Size
  5430                              <1> 
  5431 00008D18 A3[94310100]        <1> 	mov	[MainProgCfg_FileSize], eax
  5432                              <1> 
  5433 00008D1D 668B5614            <1> 	mov	dx, [esi+DirEntry_FstClusHI]
  5434 00008D21 C1E210              <1> 	shl	edx, 16
  5435 00008D24 668B561A            <1> 	mov	dx, [esi+DirEntry_FstClusLO]
  5436 00008D28 8915[C83D0100]      <1> 	mov	[csftdf_sf_cluster], edx
  5437                              <1> 
  5438 00008D2E 89C1                <1> 	mov	ecx, eax
  5439 00008D30 29C0                <1> 	sub	eax, eax
  5440                              <1> 
  5441                              <1> 	; TRDOS 386 (TRDOS v2.0)
  5442                              <1> 	; Allocate contiguous memory block for loading the file
  5443                              <1> 	
  5444                              <1> 	; eax = 0 (Allocate memory from the beginning)
  5445                              <1> 	; ecx = File (Allocation) size in bytes
  5446                              <1> 	
  5447 00008D32 E839C6FFFF          <1> 	call	allocate_memory_block
  5448 00008D37 7235                <1> 	jc	short loc_load_mainprog_cfg_exit
  5449                              <1> 
  5450 00008D39 A3[C03D0100]        <1> 	mov	[csftdf_sf_mem_addr], eax ; loading address
  5451 00008D3E 890D[C43D0100]      <1> 	mov	[csftdf_sf_mem_bsize], ecx ; block size
  5452                              <1> 
  5453 00008D44 31DB                <1> 	xor	ebx, ebx
  5454                              <1> 	;mov	[csftdf_sf_rbytes], ebx ; 0, reset
  5455                              <1> 
  5456 00008D46 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv] ; [FindFile_Drv]
  5457 00008D4C BE00010900          <1> 	mov	esi, Logical_DOSDisks
  5458 00008D51 01DE                <1> 	add	esi, ebx
  5459                              <1> 
  5460 00008D53 8B1D[C03D0100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  5461                              <1> 
  5462 00008D59 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  5463 00008D5D 7710                <1>         ja	short loc_mcfg_load_fat_file
  5464                              <1> 
  5465 00008D5F C705[D03D0100]0000- <1> 	mov	dword [csftdf_r_size], 65536
  5465 00008D67 0100                <1>
  5466 00008D69 E992010000          <1>         jmp     loc_mcfg_load_fs_file
  5467                              <1> 
  5468                              <1> loc_load_mainprog_cfg_exit:
  5469 00008D6E C3                  <1> 	retn 
  5470                              <1> 
  5471                              <1> loc_mcfg_load_fat_file:
  5472 00008D6F 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
  5473 00008D73 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  5474 00008D77 F7E1                <1> 	mul	ecx
  5475 00008D79 A3[D03D0100]        <1> 	mov	[csftdf_r_size], eax
  5476                              <1> 
  5477                              <1> loc_mcfg_load_fat_file_next:
  5478 00008D7E E813010000          <1> 	call	mcfg_read_fat_file_sectors
  5479 00008D83 0F82F7000000        <1>         jc      mcfg_deallocate_mem
  5480                              <1> 
  5481 00008D89 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  5482 00008D8B 74F1                <1> 	jz	short loc_mcfg_load_fat_file_next
  5483                              <1> 
  5484                              <1> loc_mcfg_load_fat_file_ok:
  5485                              <1> 	; 06/05/2016
  5486 00008D8D C705[643E0100]-     <1> 	mov	dword [mainprog_return_addr], loc_mcfg_ci_return_addr 
  5486 00008D93 [418E0000]          <1>
  5487                              <1> 	;
  5488 00008D97 8B35[C03D0100]      <1> 	mov	esi, [csftdf_sf_mem_addr]
  5489 00008D9D 8935[98310100]      <1> 	mov	[MainProgCfg_LineOffset], esi
  5490                              <1> 	
  5491 00008DA3 A1[94310100]        <1> 	mov	eax, [MainProgCfg_FileSize]
  5492 00008DA8 89C2                <1> 	mov	edx, eax
  5493 00008DAA 01F2                <1> 	add	edx, esi
  5494                              <1> 
  5495                              <1> loc_mcfg_process_next_line_check:
  5496 00008DAC 89C1                <1> 	mov	ecx, eax
  5497                              <1> 
  5498 00008DAE 803E2A              <1> 	cmp	byte [esi], "*" ; Remark sign
  5499 00008DB1 7503                <1> 	jne	short loc_mcfg_process_next_line
  5500 00008DB3 46                  <1> 	inc	esi
  5501 00008DB4 EB17                <1> 	jmp	short loc_move_mainprog_cfg_nl1
  5502                              <1> 
  5503                              <1> loc_mcfg_process_next_line:
  5504 00008DB6 83F94F              <1> 	cmp	ecx, 79
  5505 00008DB9 7605                <1> 	jna	short loc_start_mainprog_cfg_process
  5506                              <1> 	
  5507 00008DBB B94F000000          <1> 	mov	ecx, 79 
  5508                              <1> 
  5509                              <1> loc_start_mainprog_cfg_process:
  5510 00008DC0 BF[56320100]        <1> 	mov	edi, CommandBuffer
  5511                              <1> 
  5512                              <1> loc_move_mainprog_cfg_line:
  5513 00008DC5 AC                  <1> 	lodsb
  5514 00008DC6 3C20                <1> 	cmp	al, 20h
  5515 00008DC8 720C                <1> 	jb	short loc_move_mainprog_cfg_nl2
  5516 00008DCA AA                  <1> 	stosb
  5517 00008DCB E2F8                <1> 	loop	loc_move_mainprog_cfg_line
  5518                              <1> 
  5519                              <1> loc_move_mainprog_cfg_nl1:
  5520 00008DCD 39D6                <1> 	cmp	esi, edx ; + configuration file size
  5521 00008DCF 7312                <1> 	jnb	short loc_end_of_mainprog_cfg_line
  5522 00008DD1 AC                  <1> 	lodsb
  5523 00008DD2 3C20                <1> 	cmp	al, 20h
  5524 00008DD4 73F7                <1> 	jnb	short loc_move_mainprog_cfg_nl1
  5525                              <1> 
  5526                              <1> loc_move_mainprog_cfg_nl2:
  5527 00008DD6 39D6                <1> 	cmp	esi, edx
  5528 00008DD8 7309                <1> 	jnb	short loc_end_of_mainprog_cfg_line
  5529 00008DDA 8A06                <1> 	mov	al, [esi]
  5530 00008DDC 3C20                <1> 	cmp	al, 20h
  5531 00008DDE 7703                <1>  	ja	short loc_end_of_mainprog_cfg_line
  5532 00008DE0 46                  <1> 	inc	esi
  5533 00008DE1 EBF3                <1> 	jmp	short loc_move_mainprog_cfg_nl2	               
  5534                              <1> 
  5535                              <1> loc_end_of_mainprog_cfg_line:
  5536 00008DE3 C60700              <1> 	mov	byte [edi], 0
  5537                              <1> 
  5538 00008DE6 8935[98310100]      <1> 	mov	[MainProgCfg_LineOffset], esi
  5539                              <1> 	
  5540                              <1> loc_move_mainprog_cfg_command:
  5541 00008DEC BE[56320100]        <1> 	mov	esi, CommandBuffer
  5542 00008DF1 89F7                <1> 	mov	edi, esi
  5543 00008DF3 31DB                <1> 	xor	ebx, ebx
  5544                              <1> 	;xor	ecx, ecx
  5545 00008DF5 30C9                <1> 	xor	cl, cl
  5546                              <1> 
  5547                              <1> loc_move_mcfg_first_cmd_char:
  5548 00008DF7 8A041E              <1> 	mov	al, [esi+ebx]
  5549 00008DFA FEC3                <1> 	inc	bl 
  5550 00008DFC 3C20                <1> 	cmp	al, 20h
  5551 00008DFE 7712                <1> 	ja	short loc_move_mcfg_cmd_capitalizing
  5552 00008E00 7237                <1> 	jb	short loc_move_mcfg_cmd_arguments_ok
  5553 00008E02 80FB4F              <1> 	cmp	bl, 79
  5554 00008E05 72F0                <1> 	jb	short loc_move_mcfg_first_cmd_char
  5555 00008E07 EB30                <1> 	jmp	short loc_move_mcfg_cmd_arguments_ok
  5556                              <1> 
  5557                              <1> loc_move_mcfg_next_cmd_char:
  5558 00008E09 8A041E              <1> 	mov	al, [esi+ebx]
  5559 00008E0C FEC3                <1> 	inc	bl
  5560 00008E0E 3C20                <1> 	cmp	al, 20h
  5561 00008E10 7614                <1> 	jna	short loc_move_mcfg_cmd_ok
  5562                              <1> 
  5563                              <1> loc_move_mcfg_cmd_capitalizing:
  5564 00008E12 3C61                <1> 	cmp	al, 61h ; 'a'
  5565 00008E14 7206                <1> 	jb	short loc_move_mcfg_cmd_caps_ok
  5566 00008E16 3C7A                <1> 	cmp	al, 7Ah ; 'z'
  5567 00008E18 7702                <1> 	ja	short loc_move_mcfg_cmd_caps_ok
  5568 00008E1A 24DF                <1> 	and	al, 0DFh ; sub	al, 'a'-'A'
  5569                              <1> 
  5570                              <1> loc_move_mcfg_cmd_caps_ok:
  5571 00008E1C AA                  <1> 	stosb 
  5572 00008E1D FEC1                <1> 	inc	cl
  5573 00008E1F 80FB4F              <1> 	cmp	bl, 79
  5574 00008E22 72E5                <1> 	jb	short loc_move_mcfg_next_cmd_char
  5575 00008E24 EB13                <1> 	jmp	short loc_move_mcfg_cmd_arguments_ok
  5576                              <1> 
  5577                              <1> loc_move_mcfg_cmd_ok:
  5578 00008E26 30C0                <1> 	xor	al, al ; 0
  5579                              <1> 
  5580                              <1> loc_move_mcfg_cmd_arguments:
  5581 00008E28 8807                <1> 	mov	[edi], al
  5582 00008E2A 47                  <1> 	inc	edi
  5583 00008E2B 80FB4F              <1> 	cmp	bl, 79
  5584 00008E2E 7309                <1> 	jnb	short loc_move_mcfg_cmd_arguments_ok
  5585 00008E30 8A041E              <1> 	mov	al, [esi+ebx]
  5586 00008E33 FEC3                <1> 	inc	bl
  5587 00008E35 3C20                <1> 	cmp	al, 20h
  5588 00008E37 73EF                <1> 	jnb	short loc_move_mcfg_cmd_arguments
  5589                              <1> 	
  5590                              <1> loc_move_mcfg_cmd_arguments_ok:
  5591 00008E39 C60700              <1> 	mov	byte [edi], 0
  5592                              <1>        
  5593                              <1> loc_mcfg_process_cmd_interpreter:
  5594 00008E3C E8F4DFFFFF          <1> 	call    command_interpreter
  5595                              <1> 
  5596                              <1> loc_mcfg_ci_return_addr: 
  5597 00008E41 A1[94310100]        <1> 	mov	eax, [MainProgCfg_FileSize]
  5598 00008E46 89C2                <1> 	mov	edx, eax
  5599 00008E48 8B35[98310100]      <1> 	mov	esi, [MainProgCfg_LineOffset]
  5600 00008E4E 01F2                <1> 	add	edx, esi
  5601 00008E50 0305[C03D0100]      <1> 	add	eax, [csftdf_sf_mem_addr]
  5602 00008E56 29F0                <1> 	sub	eax, esi
  5603 00008E58 0F874EFFFFFF        <1>         ja      loc_mcfg_process_next_line_check
  5604                              <1> 
  5605 00008E5E E81D000000          <1> 	call	mcfg_deallocate_mem
  5606                              <1>  
  5607 00008E63 B94F000000          <1>  	mov	ecx, 79 ; 80 ?
  5608 00008E68 BF[56320100]        <1> 	mov	edi, CommandBuffer
  5609 00008E6D 30C0                <1> 	xor	al, al
  5610 00008E6F F3AA                <1> 	rep	stosb
  5611                              <1> 
  5612                              <1> 	; 06/05/2016
  5613 00008E71 BE[C3FF0000]        <1> 	mov	esi, nextline
  5614 00008E76 E8F1CBFFFF          <1> 	call	print_msg
  5615 00008E7B E92DD6FFFF          <1> 	jmp	dos_prompt
  5616                              <1> 
  5617                              <1> mcfg_deallocate_mem:
  5618 00008E80 A1[C03D0100]        <1> 	mov	eax, [csftdf_sf_mem_addr] ; start address
  5619 00008E85 8B0D[C43D0100]      <1> 	mov	ecx, [csftdf_sf_mem_bsize] ; block size	
  5620                              <1> 	;call	deallocate_memory_block
  5621                              <1> 	;retn
  5622 00008E8B E9E1C6FFFF          <1> 	jmp	deallocate_memory_block
  5623                              <1> 
  5624                              <1> mcfg_read_file_sectors:
  5625                              <1> 	; 14/04/2016
  5626 00008E90 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  5627 00008E94 7669                <1>         jna	short mcfg_read_fs_file_sectors
  5628                              <1> 
  5629                              <1> mcfg_read_fat_file_sectors:
  5630                              <1> 	; return:
  5631                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  5632                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  5633                              <1> 	;   CF = 1 -> read error (error code in AL)	
  5634                              <1> 
  5635                              <1> mcfg_read_fat_file_secs_0:
  5636 00008E96 8B15[94310100]      <1> 	mov	edx, [MainProgCfg_FileSize]
  5637 00008E9C 2B15[D83D0100]      <1> 	sub	edx, [csftdf_sf_rbytes]
  5638 00008EA2 3B15[D03D0100]      <1> 	cmp	edx, [csftdf_r_size]	
  5639 00008EA8 7306                <1> 	jnb	short mcfg_read_fat_file_secs_1
  5640 00008EAA 8915[D03D0100]      <1> 	mov	[csftdf_r_size], edx
  5641                              <1> 		
  5642                              <1> mcfg_read_fat_file_secs_1:
  5643 00008EB0 A1[D03D0100]        <1> 	mov	eax, [csftdf_r_size]
  5644 00008EB5 29D2                <1> 	sub	edx, edx
  5645 00008EB7 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  5646 00008EBB 01C8                <1> 	add	eax, ecx
  5647 00008EBD 48                  <1> 	dec	eax
  5648 00008EBE F7F1                <1> 	div	ecx
  5649 00008EC0 89C1                <1> 	mov	ecx, eax ; sector count
  5650 00008EC2 A1[C83D0100]        <1> 	mov	eax, [csftdf_sf_cluster]
  5651                              <1> 
  5652                              <1> 	; EBX = memory block address (current)
  5653                              <1> 	
  5654 00008EC7 E88E230000          <1> 	call	read_fat_file_sectors
  5655 00008ECC 7230                <1> 	jc	short mcfg_read_fat_file_secs_3
  5656                              <1> 
  5657                              <1> 	; EBX = next memory address
  5658                              <1> 
  5659 00008ECE A1[D83D0100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  5660 00008ED3 0305[D03D0100]      <1> 	add	eax, [csftdf_r_size]
  5661 00008ED9 8B15[94310100]      <1> 	mov	edx, [MainProgCfg_FileSize]
  5662 00008EDF 39D0                <1> 	cmp	eax, edx
  5663 00008EE1 731B                <1> 	jnb	short mcfg_read_fat_file_secs_3 ; edx > 0
  5664 00008EE3 A3[D83D0100]        <1> 	mov	[csftdf_sf_rbytes], eax
  5665                              <1> 
  5666 00008EE8 53                  <1> 	push	ebx ; *
  5667                              <1> 	; get next cluster (csftdf_r_size! bytes)
  5668 00008EE9 A1[C83D0100]        <1> 	mov	eax, [csftdf_sf_cluster]
  5669 00008EEE E839210000          <1> 	call	get_next_cluster
  5670 00008EF3 5B                  <1> 	pop	ebx ; *
  5671 00008EF4 7301                <1> 	jnc	short mcfg_read_fat_file_secs_2
  5672                              <1> 
  5673                              <1> 	;mov	eax, 17; Read error !
  5674 00008EF6 C3                  <1> 	retn
  5675                              <1> 
  5676                              <1> mcfg_read_fat_file_secs_2:
  5677 00008EF7 29D2                <1> 	sub	edx, edx ; 0
  5678 00008EF9 A3[C83D0100]        <1> 	mov	[csftdf_sf_cluster], eax ; next cluster
  5679                              <1> 
  5680                              <1> mcfg_read_fat_file_secs_3:
  5681 00008EFE C3                  <1> 	retn
  5682                              <1> 
  5683                              <1> mcfg_read_fs_file_sectors:
  5684 00008EFF C3                  <1> 	retn
  5685                              <1> 
  5686                              <1> loc_mcfg_load_fs_file:
  5687 00008F00 C3                  <1> 	retn
  5688                              <1> 
  5689                              <1> load_and_execute_file:
  5690                              <1> 	; 04/01/2017
  5691                              <1> 	; 06/05/2016, 07/05/2016, 11/05/2016
  5692                              <1> 	; 23/04/2016, 24/04/2016
  5693                              <1> 	; 22/04/2016 (TRDOS 386 = TRDOS v2.0)
  5694                              <1> 	; 05/11/2011 
  5695                              <1> 	; (TRDOS v1, CMDINTR.ASM, 'cmp_cmd_run', 'cmp_cmd_external')
  5696                              <1> 	; ('loc_run_check_filename')
  5697                              <1> 	; 29/08/2011
  5698                              <1> 	; 10/09/2011
  5699                              <1> 	; INPUT->
  5700                              <1> 	;	ESI = Path Name address (CommandBuffer address)
  5701                              <1> 	; OUTPUT ->
  5702                              <1> 	;	none (error message will be shown if an error will occur)
  5703                              <1> 	;
  5704                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI, EBP will be changed) 
  5705                              <1> 	;
  5706                              <1> loc_run_check_filename:
  5707 00008F01 803E20              <1> 	cmp	byte [esi], 20h
  5708 00008F04 0F82F2E2FFFF        <1> 	jb	loc_cmd_failed
  5709 00008F0A 7703                <1> 	ja	short loc_run_check_filename_ok
  5710 00008F0C 46                  <1> 	inc	esi
  5711 00008F0D EBF2                <1> 	jmp	short loc_run_check_filename
  5712                              <1> 
  5713                              <1> loc_run_check_filename_ok:
  5714 00008F0F C605[07320100]00    <1> 	mov	byte [CmdArgStart], 0 ; reset
  5715 00008F16 56                  <1> 	push	esi ; *
  5716                              <1> loc_run_get_first_arg_pos:
  5717 00008F17 46                  <1> 	inc	esi
  5718 00008F18 8A06                <1> 	mov	al, [esi]
  5719 00008F1A 3C20                <1> 	cmp	al, 20h
  5720 00008F1C 77F9                <1> 	ja	short loc_run_get_first_arg_pos
  5721 00008F1E C60600              <1> 	mov	byte [esi], 0
  5722                              <1> loc_run_get_external_arg_pos:
  5723                              <1> 	; 11/05/2016
  5724 00008F21 46                  <1> 	inc	esi
  5725 00008F22 8A06                <1> 	mov	al, [esi]
  5726 00008F24 3C20                <1> 	cmp	al, 20h
  5727 00008F26 760C                <1> 	jna	short loc_run_parse_path_name
  5728 00008F28 89F0                <1> 	mov	eax, esi
  5729 00008F2A 2D[56320100]        <1> 	sub	eax, CommandBuffer
  5730 00008F2F A2[07320100]        <1> 	mov	byte [CmdArgStart], al
  5731                              <1> loc_run_parse_path_name:
  5732 00008F34 5E                  <1> 	pop	esi ; *
  5733 00008F35 BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  5734 00008F3A E8D6090000          <1> 	call	parse_path_name
  5735 00008F3F 0F82B7E2FFFF        <1> 	jc	loc_cmd_failed
  5736                              <1> 
  5737                              <1> loc_run_check_filename_exists:
  5738 00008F45 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  5739 00008F4A 803E20              <1> 	cmp	byte [esi], 20h
  5740 00008F4D 0F86A9E2FFFF        <1> 	jna	loc_cmd_failed
  5741                              <1> 
  5742                              <1> loc_run_check_exe_filename_ext:
  5743 00008F53 E891020000          <1> 	call	check_prg_filename_ext
  5744 00008F58 0F829EE2FFFF        <1> 	jc	loc_cmd_failed
  5745                              <1> 	
  5746                              <1> loc_run_check_exe_filename_ext_ok:
  5747 00008F5E 66A3[623E0100]      <1> 	mov	word [EXE_ID], ax
  5748                              <1> 
  5749                              <1> loc_run_drv:
  5750 00008F64 C605[613E0100]00    <1> 	mov	byte [Run_Manual_Path], 0
  5751 00008F6B A1[A0310100]        <1> 	mov	eax, [Current_Dir_FCluster]
  5752 00008F70 A3[5C3E0100]        <1>         mov     [Run_CDirFC], eax
  5753                              <1> 	;
  5754 00008F75 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  5755 00008F7B 8835[063A0100]      <1> 	mov	[RUN_CDRV], dh
  5756                              <1> 
  5757 00008F81 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  5758 00008F87 38F2                <1> 	cmp	dl, dh
  5759 00008F89 7412                <1> 	je	short loc_run_change_directory
  5760                              <1>                
  5761 00008F8B 8005[613E0100]02    <1> 	add	byte [Run_Manual_Path], 2
  5762                              <1> 
  5763 00008F92 E8D5D3FFFF          <1> 	call	change_current_drive
  5764 00008F97 0F828AE2FFFF        <1> 	jc	loc_run_cmd_failed
  5765                              <1> 
  5766                              <1> loc_run_change_directory:
  5767 00008F9D 803D[4B3B0100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  5768 00008FA4 7623                <1> 	jna	short loc_run_find_executable_file
  5769                              <1> 
  5770 00008FA6 FE05[613E0100]      <1> 	inc	byte [Run_Manual_Path]
  5771                              <1>      
  5772 00008FAC FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  5773                              <1> 
  5774 00008FB2 BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  5775 00008FB7 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  5776 00008FB9 E843030000          <1> 	call	change_current_directory
  5777 00008FBE 0F8263E2FFFF        <1> 	jc	loc_run_cmd_failed
  5778                              <1> 
  5779                              <1> loc_run_change_prompt_dir_string:
  5780 00008FC4 E858020000          <1> 	call	change_prompt_dir_string
  5781                              <1> 
  5782                              <1> loc_run_find_executable_file:
  5783 00008FC9 66C705[603E0100]00- <1> 	mov	word [Run_Auto_Path], 0
  5783 00008FD1 00                  <1>
  5784                              <1> 
  5785                              <1> loc_run_find_executable_file_next:
  5786 00008FD2 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  5787                              <1> loc_run_find_program_file_next:
  5788 00008FD7 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  5789 00008FDB E81EE7FFFF          <1> 	call	find_first_file
  5790                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
  5791                              <1> 	; EDI = Directory Buffer Directory Entry Location
  5792                              <1> 	; EAX = File size
  5793 00008FE0 0F835C010000        <1> 	jnc	loc_load_and_run_file
  5794                              <1> 	 
  5795 00008FE6 3C02                <1> 	cmp	al, 2 ; file not found
  5796 00008FE8 0F8539E2FFFF        <1> 	jne	loc_run_cmd_failed
  5797                              <1> 
  5798 00008FEE 66A1[623E0100]      <1> 	mov	ax, word [EXE_ID]
  5799 00008FF4 80FC2E              <1> 	cmp	ah, '.' ; File name has extension sign
  5800 00008FF7 7424                <1> 	je	short loc_run_check_auto_path
  5801                              <1> 
  5802 00008FF9 08C0                <1> 	or	al, al
  5803 00008FFB 7520                <1> 	jnz	short loc_run_check_auto_path
  5804                              <1> 
  5805 00008FFD 80FC08              <1> 	cmp	ah, 8 ; count of file name chars
  5806 00009000 771B                <1> 	ja	short loc_run_check_auto_path
  5807                              <1> 
  5808                              <1> loc_run_change_file_ext_to_prg:
  5809 00009002 0FB6DC              <1> 	movzx	ebx, ah ; count of file name chars
  5810 00009005 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  5811 0000900A 01F3                <1> 	add	ebx, esi	
  5812                              <1> 	; 07/05/2016
  5813 0000900C C7032E505247        <1> 	mov	dword [ebx],  '.PRG'
  5814 00009012 66C705[623E0100]50- <1> 	mov	word [EXE_ID], 'P.'
  5814 0000901A 2E                  <1>
  5815 0000901B EBBA                <1> 	jmp	short loc_run_find_program_file_next	
  5816                              <1> 
  5817                              <1> loc_run_check_auto_path:
  5818                              <1> 	; NOTE: /// 07/05/2016 ///
  5819                              <1> 	; If the path is given, value of byte [Run_Manual_Path]
  5820                              <1> 	; will not be ZERO. If so, file searching by using
  5821                              <1> 	; Automatic Path (via 'PATH' environment variable)
  5822                              <1> 	; will not be applicable, because the program file 
  5823                              <1> 	; is already/absolutely not found.
  5824                              <1> 
  5825 0000901D A0[613E0100]        <1> 	mov	al, [Run_Manual_Path]
  5826 00009022 08C0                <1> 	or	al, al
  5827 00009024 0F85D2E1FFFF        <1> 	jnz	loc_cmd_failed
  5828                              <1> 
  5829                              <1> loc_run_check_auto_path_again:
  5830 0000902A 66833D[603E0100]FF  <1> 	cmp	word [Run_Auto_Path], 0FFFFh		 
  5831                              <1> 		; 0FFFFh = Not a valid run path (in ENV block) 
  5832 00009032 0F83C4E1FFFF        <1> 	jnb	loc_cmd_failed
  5833                              <1> 	; xor	al, al 
  5834 00009038 BE[D9ED0000]        <1> 	mov	esi, Cmd_Path ; 'PATH'
  5835 0000903D BF[A6320100]        <1> 	mov	edi, TextBuffer
  5836 00009042 E857F9FFFF          <1> 	call	get_environment_string
  5837 00009047 730E                <1> 	jnc	short loc_run_chk_filename_ext_again
  5838 00009049 66C705[603E0100]FF- <1> 	mov	word [Run_Auto_Path], 0FFFFh ; invalid
  5838 00009051 FF                  <1>
  5839 00009052 E9A5E1FFFF          <1> 	jmp	loc_cmd_failed
  5840                              <1> 
  5841                              <1> loc_run_chk_filename_ext_again:
  5842 00009057 89C1                <1> 	mov	ecx, eax ; string length (with zero tail)
  5843 00009059 49                  <1> 	dec	ecx ; without zero tail
  5844 0000905A 66A1[623E0100]      <1> 	mov	ax, [EXE_ID]
  5845 00009060 80FC2E              <1> 	cmp	ah, '.'
  5846 00009063 740E                <1> 	je	short loc_run_chk_auto_path_pos
  5847                              <1> 	 
  5848                              <1> loc_run_change_file_ext_to_noext_again:
  5849 00009065 0FB6DC              <1> 	movzx	ebx, ah
  5850 00009068 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  5851 0000906D 01F3                <1> 	add 	ebx, esi
  5852 0000906F 29C0                <1> 	sub	eax, eax
  5853 00009071 8903                <1> 	mov	[ebx], eax ; 0 ; erase extension (.PRG)
  5854                              <1> 
  5855                              <1> loc_run_chk_auto_path_pos:
  5856                              <1> 	;movzx	eax,  word [Run_Auto_Path]
  5857 00009073 66A1[603E0100]      <1> 	mov	ax, [Run_Auto_Path]
  5858 00009079 39C8                <1> 	cmp	eax, ecx ; ecx = string length (except zero tail)
  5859 0000907B 0F837BE1FFFF        <1> 	jnb	loc_cmd_failed
  5860                              <1> 	;or	eax, eax
  5861 00009081 6609C0              <1> 	or	ax, ax
  5862 00009084 7502                <1> 	jnz	short loc_run_auto_path_pos_move
  5863 00009086 B005                <1> 	mov	al, 5
  5864                              <1> 
  5865                              <1> loc_run_auto_path_pos_move:
  5866 00009088 89FE                <1> 	mov	esi, edi ; offset TextBuffer
  5867 0000908A 01C6                <1> 	add	esi, eax
  5868                              <1> 
  5869                              <1> loc_run_auto_path_pos_space_loop:
  5870 0000908C AC                  <1> 	lodsb
  5871 0000908D 3C20                <1> 	cmp	al, 20h 
  5872 0000908F 74FB                <1> 	je	short loc_run_auto_path_pos_space_loop
  5873 00009091 0F8265E1FFFF        <1> 	jb	loc_cmd_failed 
  5874 00009097 AA                  <1> 	stosb
  5875                              <1> loc_run_auto_path_pos_move_next: 
  5876 00009098 AC                  <1> 	lodsb
  5877 00009099 3C3B                <1> 	cmp	al, ';'
  5878 0000909B 7414                <1> 	je	short loc_run_auto_path_pos_move_last_byte
  5879 0000909D 3C20                <1> 	cmp	al, 20h
  5880 0000909F 74F7                <1> 	je	short loc_run_auto_path_pos_move_next
  5881 000090A1 7203                <1> 	jb	short loc_byte_ptr_end_of_path
  5882 000090A3 AA                  <1> 	stosb
  5883 000090A4 EBF2                <1> 	jmp	short loc_run_auto_path_pos_move_next 
  5884                              <1> 
  5885                              <1> loc_byte_ptr_end_of_path: 
  5886 000090A6 66C705[603E0100]FF- <1> 	mov	word [Run_Auto_Path], 0FFFFh ; end of path
  5886 000090AE FF                  <1>
  5887 000090AF EB0D                <1> 	jmp	short loc_run_auto_path_move_ok 
  5888                              <1> 
  5889                              <1> loc_run_auto_path_pos_move_last_byte:
  5890 000090B1 89F0                <1> 	mov	eax, esi
  5891 000090B3 2D[A6320100]        <1> 	sub	eax, TextBuffer 
  5892 000090B8 66A3[603E0100]      <1> 	mov	[Run_Auto_Path], ax ; next path position
  5893                              <1> 
  5894                              <1> loc_run_auto_path_move_ok:
  5895 000090BE 4F                  <1> 	dec	edi
  5896 000090BF B02F                <1> 	mov	al, '/'
  5897 000090C1 3807                <1> 	cmp	[edi], al
  5898 000090C3 7403                <1> 	je	short loc_run_auto_path_move_file_name
  5899 000090C5 47                  <1> 	inc	edi
  5900 000090C6 8807                <1> 	mov	[edi], al
  5901                              <1> 
  5902                              <1> loc_run_auto_path_move_file_name:
  5903 000090C8 47                  <1> 	inc	edi   
  5904 000090C9 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  5905                              <1> 
  5906                              <1> loc_run_auto_path_move_fn_loop:
  5907 000090CE AC                  <1> 	lodsb
  5908 000090CF AA                  <1> 	stosb
  5909 000090D0 08C0                <1> 	or	al, al
  5910 000090D2 75FA                <1> 	jnz	short loc_run_auto_path_move_fn_loop
  5911                              <1> 
  5912 000090D4 BE[A6320100]        <1> 	mov	esi, TextBuffer
  5913 000090D9 BF[4A3B0100]        <1> 	mov	edi, FindFile_Drv
  5914 000090DE E832080000          <1> 	call	parse_path_name
  5915 000090E3 0F8213E1FFFF        <1> 	jc	loc_cmd_failed
  5916                              <1> 
  5917 000090E9 8A35[A6310100]      <1> 	mov	dh, [Current_Drv]
  5918 000090EF 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  5919 000090F5 38F2                <1> 	cmp	dl, dh
  5920 000090F7 740B                <1> 	je	short loc_run_change_directory_again
  5921                              <1>                
  5922 000090F9 E86ED2FFFF          <1> 	call	change_current_drive
  5923 000090FE 0F8223E1FFFF        <1> 	jc	loc_run_cmd_failed
  5924                              <1> 
  5925                              <1> loc_run_change_directory_again:
  5926 00009104 803D[4B3B0100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  5927 0000910B 761D                <1> 	jna	short loc_load_executable_cdir_chk_again
  5928                              <1> 
  5929 0000910D FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  5930 00009113 BE[4B3B0100]        <1> 	mov	esi, FindFile_Directory
  5931 00009118 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  5932 0000911A E8E2010000          <1> 	call	change_current_directory
  5933 0000911F 0F8202E1FFFF        <1> 	jc	loc_run_cmd_failed
  5934                              <1> 
  5935                              <1> loc_run_chg_prompt_dir_str_again:
  5936 00009125 E8F7000000          <1> 	call	change_prompt_dir_string
  5937                              <1> 
  5938                              <1> loc_load_executable_cdir_chk_again:
  5939 0000912A A1[A0310100]        <1> 	mov	eax, [Current_Dir_FCluster]
  5940 0000912F 3B05[5C3E0100]      <1> 	cmp	eax, [Run_CDirFC]
  5941 00009135 0F8597FEFFFF        <1> 	jne	loc_run_find_executable_file_next
  5942 0000913B 30C0                <1> 	xor	al, al ; 0
  5943 0000913D E9E8FEFFFF          <1> 	jmp	loc_run_check_auto_path_again
  5944                              <1> 
  5945                              <1> loc_load_and_run_file:
  5946                              <1> 	; 04/01/2017
  5947                              <1> 	; 23/04/2016
  5948 00009142 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  5949 00009147 BF[A6320100]        <1> 	mov	edi, TextBuffer
  5950                              <1> 
  5951                              <1>  	; 24/04/2016
  5952 0000914C 31D2                <1> 	xor	edx, edx
  5953 0000914E 668915[9E470100]    <1> 	mov	word [argc], dx ; 0
  5954 00009155 8915[44470100]      <1> 	mov	dword [u.nread], edx ; 0
  5955                              <1> 
  5956                              <1> loc_load_and_run_file_1:
  5957 0000915B AC                  <1> 	lodsb	
  5958 0000915C AA                  <1> 	stosb
  5959 0000915D FF05[44470100]      <1> 	inc	dword [u.nread]
  5960 00009163 20C0                <1> 	and	al, al
  5961 00009165 75F4                <1> 	jnz 	short loc_load_and_run_file_1
  5962                              <1> 	
  5963 00009167 A0[07320100]        <1> 	mov	al, [CmdArgStart]
  5964 0000916C 20C0                <1> 	and	al, al
  5965 0000916E 7445                <1> 	jz	short loc_load_and_run_file_7
  5966                              <1> 
  5967 00009170 0FB6F0              <1> 	movzx	esi, al ; 11/05/2016
  5968 00009173 B950000000          <1> 	mov	ecx, 80
  5969 00009178 29F1                <1> 	sub	ecx, esi
  5970 0000917A 81C6[56320100]      <1> 	add	esi, CommandBuffer
  5971                              <1> 
  5972 00009180 66FF05[9E470100]    <1> 	inc	word [argc] ; 11/05/2016
  5973                              <1> 
  5974                              <1> loc_load_and_run_file_2:
  5975 00009187 AC                  <1> 	lodsb
  5976 00009188 3C20                <1> 	cmp	al, 20h
  5977 0000918A 7717                <1> 	ja	short loc_load_and_run_file_5	
  5978 0000918C 721E                <1> 	jb	short loc_load_and_run_file_6
  5979                              <1> 
  5980                              <1> loc_load_and_run_file_3:
  5981 0000918E 803E20              <1> 	cmp	byte [esi], 20h
  5982 00009191 7707                <1> 	ja	short loc_load_and_run_file_4
  5983 00009193 7217                <1> 	jb	short loc_load_and_run_file_6
  5984 00009195 46                  <1> 	inc	esi
  5985 00009196 E2F6                <1> 	loop	loc_load_and_run_file_3
  5986 00009198 EB12                <1> 	jmp	short loc_load_and_run_file_6
  5987                              <1> 
  5988                              <1> loc_load_and_run_file_4:
  5989 0000919A 28C0                <1> 	sub	al, al ; 0
  5990 0000919C 66FF05[9E470100]    <1> 	inc	word [argc]
  5991                              <1> loc_load_and_run_file_5:
  5992 000091A3 AA                  <1> 	stosb
  5993 000091A4 FF05[44470100]      <1> 	inc	dword [u.nread]
  5994 000091AA E2DB                <1> 	loop	loc_load_and_run_file_2
  5995                              <1> 			
  5996                              <1> loc_load_and_run_file_6:
  5997 000091AC 30C0                <1> 	xor	al, al ; 0
  5998 000091AE AA                  <1> 	stosb
  5999 000091AF FF05[44470100]      <1> 	inc	dword [u.nread]
  6000                              <1> loc_load_and_run_file_7:
  6001 000091B5 8807                <1> 	mov 	[edi], al ; 0
  6002 000091B7 66FF05[9E470100]    <1> 	inc	word [argc] ; 24/04/2016
  6003 000091BE FF05[44470100]      <1> 	inc	dword [u.nread] ; 24/04/2016
  6004 000091C4 BE[A6320100]        <1> 	mov	esi, TextBuffer
  6005 000091C9 8B15[B83B0100]      <1> 	mov	edx, [FindFile_DirEntry+DirEntry_FileSize]
  6006 000091CF 66A1[B03B0100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusHI]
  6007 000091D5 66C1E010            <1> 	shl	ax, 16
  6008 000091D9 66A1[B63B0100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusLO]
  6009                              <1> 	; EAX = First Cluster number
  6010                              <1> 	; EDX = File Size
  6011                              <1> 	; ESI = Argument list address
  6012                              <1> 	; [argc] = argument count
  6013                              <1> 	; [u.nread] = argument list length
  6014 000091DF E8AF440000          <1> 	call	load_and_run_file ; trdosk6.s
  6015                              <1>         ;jc	loc_run_cmd_failed ; 04/01/2017
  6016                              <1> loc_load_and_run_file_8: ; 06/05/2016
  6017 000091E4 E945E9FFFF          <1> 	jmp	loc_file_rw_restore_retn
  6018                              <1> 
  6019                              <1> check_prg_filename_ext:
  6020                              <1> 	; 23/04/2016 (TRDOS 386 = TRDOS v2.0)
  6021                              <1> 	; 10/09/2011 
  6022                              <1> 	; (TRDOS v1, CMDINTR.ASM, 'proc_check_exe_filename_ext')
  6023                              <1> 	; 14/11/2009
  6024                              <1> 	; INPUT -> 
  6025                              <1> 	;	ESI = Dot File Name
  6026                              <1> 	; OUTPUT ->
  6027                              <1> 	;     cf = 0 -> EXE_ID in AL
  6028                              <1> 	;	ESI = Last char + 1 position
  6029                              <1> 	;     cf = 1 -> Invalid executable file name
  6030                              <1> 	;	or no file name extension if AH<=8
  6031                              <1> 	;	AL = Last file name char     
  6032                              <1> 	;     cf = 0 -> AL='P' (PRG), AL=0 (no extension)
  6033                              <1> 	;
  6034                              <1> 	; (Modified registers: EAX, ESI)
  6035                              <1>   
  6036 000091E9 30E4                <1> 	xor	ah, ah
  6037                              <1> loc_run_check_filename_ext:	
  6038 000091EB AC                  <1> 	lodsb
  6039 000091EC 3C21                <1> 	cmp	al, 21h
  6040 000091EE 7229                <1> 	jb	short loc_check_exe_fn_retn 
  6041 000091F0 FEC4                <1> 	inc	ah
  6042 000091F2 3C2E                <1> 	cmp	al, '.'
  6043 000091F4 75F5                <1> 	jne	short loc_run_check_filename_ext	
  6044                              <1> 		 
  6045                              <1> loc_run_check_filename_ext_dot:
  6046 000091F6 80FC02              <1> 	cmp	ah, 2 ; .??? is not valid
  6047 000091F9 88C4                <1> 	mov	ah, al ; '.' 
  6048 000091FB 7219                <1> 	jb	short loc_check_prg_fn_retn
  6049                              <1> 
  6050                              <1> loc_run_check_filename_ext_dot_ok:
  6051 000091FD AC                  <1> 	lodsb
  6052 000091FE 24DF                <1> 	and	al, 0DFh 
  6053                              <1> 
  6054                              <1> loc_run_check_filename_ext_prg:
  6055 00009200 3C50                <1> 	cmp	al, 'P'
  6056 00009202 7212                <1> 	jb	short loc_check_prg_fn_retn
  6057 00009204 7711                <1> 	ja	short loc_check_prg_fn_stc
  6058 00009206 AC                  <1> 	lodsb
  6059 00009207 24DF                <1> 	and	al, 0DFh 
  6060 00009209 3C52                <1> 	cmp	al, 'R'
  6061 0000920B 750A                <1> 	jne	short loc_check_prg_fn_stc
  6062 0000920D AC                  <1> 	lodsb
  6063 0000920E 24DF                <1> 	and	al, 0DFh
  6064 00009210 3C47                <1> 	cmp	al, 'G'
  6065 00009212 7503                <1> 	jne	short loc_check_prg_fn_stc
  6066                              <1> 
  6067 00009214 B050                <1> 	mov	al, 'P'
  6068                              <1> loc_check_prg_fn_retn:
  6069 00009216 C3                  <1> 	retn
  6070                              <1> 
  6071                              <1> loc_check_prg_fn_stc:
  6072 00009217 F9                  <1> 	stc
  6073 00009218 C3                  <1> 	retn
  6074                              <1>  
  6075                              <1> loc_check_exe_fn_retn:
  6076 00009219 28C0                <1> 	sub	al, al ; 0
  6077 0000921B C3                  <1> 	retn
  6078                              <1>               
  6079                              <1> find_and_list_files:
  6080 0000921C C3                  <1> 	retn
  6081                              <1> set_exec_arguments:
  6082 0000921D C3                  <1> 	retn
  6083                              <1> delete_fs_directory:
  6084 0000921E 31C0                <1> 	xor eax, eax
  6085 00009220 C3                  <1> 	retn
  2136                                  %include 'trdosk4.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - Directory Functions : trdosk4.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 17/10/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    11                              <1> ; DIR.ASM (09/10/2011)
    12                              <1> ; ****************************************************************************
    13                              <1> 
    14                              <1> ; DIR.ASM  [ TRDOS KERNEL - COMMAND EXECUTER SECTION - DIRECTORY FUNCTIONS ]
    15                              <1> ; (c) 2004-2010  Erdogan TAN  [ 17/01/2004 ]  Last Update: 09/10/2011
    16                              <1> ; FILE.ASM [ FILE FUNCTIONS ] Last Update: 09/10/2011
    17                              <1> 
    18                              <1> change_prompt_dir_string:
    19                              <1> 	; 05/10/2016
    20                              <1> 	; 24/01/2016 (TRDOS 386 = TRDOS v2.0)
    21                              <1> 	; 27/03/2011
    22                              <1> 	; 09/10/2009
    23                              <1> 	; INPUT/OUTPUT => none
    24                              <1> 	; this procedure changes current directory string/text  
    25                              <1> 	; 2005
    26                              <1> 
    27 00009221 BE[073A0100]        <1> 	mov	esi, PATH_Array
    28                              <1> change_prompt_dir_str: ; 05/10/2016 (call from 'set_working_path')
    29 00009226 BF[AA310100]        <1> 	mov	edi, Current_Directory
    30 0000922B 8A25[A4310100]      <1> 	mov	ah, [Current_Dir_Level]
    31 00009231 E807000000          <1> 	call	set_current_directory_string
    32 00009236 880D[05320100]      <1> 	mov	[Current_Dir_StrLen], cl
    33                              <1> 
    34 0000923C C3                  <1> 	retn
    35                              <1> 
    36                              <1> set_current_directory_string:
    37                              <1> 	; 24/01/2016 (TRDOS 386 = TRDOS v2.0)
    38                              <1> 	; 27/03/2011
    39                              <1> 	; 09/10/2009
    40                              <1> 	; INPUT:
    41                              <1> 	;    ESI = Path Array Address 
    42                              <1> 	;    EDI = Current Directory String Buffer
    43                              <1> 	;    AH = Current Directory Level
    44                              <1> 	; OUTPUT => EAX, EBX, ESI will be changed
    45                              <1> 	;    EDI will be same with input
    46                              <1> 	;    ECX = Current Directory String Length 
    47                              <1> 
    48 0000923D 57                  <1> 	push    edi
    49 0000923E 80FC00              <1> 	cmp     ah, 0
    50 00009241 7652                <1> 	jna	short pass_write_path
    51 00009243 83C610              <1> 	add	esi, 16
    52 00009246 89F3                <1> 	mov	ebx, esi
    53                              <1> loc_write_path:
    54 00009248 B908000000          <1> 	mov	ecx, 8
    55                              <1> path_write_dirname1:
    56 0000924D AC                  <1> 	lodsb
    57 0000924E 3C20                <1> 	cmp	al, 20h
    58 00009250 7612                <1> 	jna	short pass_write_dirname1
    59 00009252 AA                  <1> 	stosb
    60 00009253 81FF[04320100]      <1> 	cmp	edi, End_Of_Current_Dir_Str
    61 00009259 733A                <1> 	jnb	short pass_write_path
    62 0000925B E2F0                <1> 	loop	path_write_dirname1
    63 0000925D 803E20              <1> 	cmp	byte [esi], 20h
    64 00009260 7624                <1> 	jna	short pass_write_dirname2
    65 00009262 EB0A                <1> 	jmp     short loc_put_dot_cont_ext
    66                              <1> pass_write_dirname1:
    67 00009264 89DE                <1> 	mov	esi, ebx
    68 00009266 83C608              <1> 	add	esi, 8
    69 00009269 803E20              <1> 	cmp	byte [esi], 20h
    70 0000926C 7618                <1> 	jna	short pass_write_dirname2
    71                              <1> loc_put_dot_cont_ext:
    72 0000926E C6072E              <1> 	mov	byte [edi], "."
    73                              <1> 	;mov	ecx, 3
    74 00009271 B103                <1> 	mov	cl, 3
    75                              <1> loc_check_dir_name_ext:
    76 00009273 AC                  <1> 	lodsb
    77 00009274 47                  <1> 	inc	edi
    78 00009275 3C20                <1> 	cmp	al, 20h
    79 00009277 760D                <1> 	jna	short pass_write_dirname2
    80 00009279 8807                <1> 	mov	[edi], al
    81 0000927B 81FF[04320100]      <1> 	cmp	edi, End_Of_Current_Dir_Str
    82 00009281 7312                <1> 	jnb	short pass_write_path
    83 00009283 E2EE                <1> 	loop    loc_check_dir_name_ext
    84 00009285 47                  <1> 	inc	edi
    85                              <1> pass_write_dirname2:
    86 00009286 FECC                <1> 	dec	ah
    87 00009288 740B                <1> 	jz      short pass_write_path
    88 0000928A 83C310              <1> 	add	ebx, 16
    89 0000928D 89DE                <1> 	mov	esi, ebx
    90 0000928F C6072F              <1> 	mov	byte [edi],"/"
    91 00009292 47                  <1> 	inc	edi
    92 00009293 EBB3                <1> 	jmp	short loc_write_path
    93                              <1> pass_write_path:
    94 00009295 C60700              <1> 	mov	byte [edi], 0
    95 00009298 47                  <1> 	inc	edi
    96 00009299 89F9                <1> 	mov	ecx, edi
    97 0000929B 5F                  <1> 	pop	edi
    98 0000929C 29F9                <1> 	sub	ecx, edi
    99                              <1> 	; ECX = Current Directory String Length
   100 0000929E C3                  <1> 	retn
   101                              <1> 
   102                              <1> get_current_directory:
   103                              <1> 	; 15/10/2016
   104                              <1> 	; 14/02/2016
   105                              <1> 	; 24/01/2016 (TRDOS 386 = TRDOS v2.0)
   106                              <1> 	; 27/03/2011
   107                              <1> 	;
   108                              <1> 	; INPUT-> ESI = Current Directory Buffer
   109                              <1> 	;         DL = TRDOS Logical Dos Drive Number + 1
   110                              <1> 	;              (0= Default/Current Drive)
   111                              <1> 	;           
   112                              <1> 	;   Note: Required dir buffer length may be <= 92 bytes
   113                              <1> 	;         for TRDOS (7*12 name chars + 7 slash + 0)
   114                              <1> 	; OUTPUT ->  ESI = Current Directory Buffer
   115                              <1> 	;            EAX, EBX, ECX, EDX, EDI will be changed
   116                              <1> 	;            CX/CL = Current Directory String Length
   117                              <1> 	;	     DL = Drive Number (0 based)
   118                              <1> 	;            (If input is 0, output is current drv number) 
   119                              <1> 	;            DH = same with input 
   120                              <1> 	;   cf = 0 -> AL = 0
   121                              <1> 	;   cf = 1 -> error code in AL 
   122                              <1>               
   123                              <1> loc_get_current_drive_0:
   124 0000929F 80FA00              <1> 	cmp	dl, 0
   125 000092A2 7708                <1> 	ja	short loc_get_current_drive_1
   126 000092A4 8A15[A6310100]      <1> 	mov	dl, [Current_Drv]
   127 000092AA EB17                <1> 	jmp	short loc_get_current_drive_2
   128                              <1> loc_get_current_drive_1:
   129 000092AC FECA                <1> 	dec 	dl
   130 000092AE 3A15[0CED0000]      <1> 	cmp	dl, [Last_DOS_DiskNo]
   131 000092B4 760D                <1> 	jna	short loc_get_current_drive_2
   132 000092B6 B80F000000          <1> 	mov	eax, 0Fh ; Invalid drive (Drive not ready!)
   133 000092BB F5                  <1> 	cmc 	; stc
   134 000092BC C3                  <1> 	retn
   135                              <1> 
   136                              <1> loc_get_current_drive_not_ready_retn:
   137 000092BD 5E                  <1> 	pop	esi
   138                              <1> 	;mov	eax, 15
   139 000092BE 66B80F00            <1> 	mov	ax, 15 ; Drive not ready
   140 000092C2 C3                  <1> 	retn  
   141                              <1>  
   142                              <1> loc_get_current_drive_2:
   143 000092C3 31C0                <1> 	xor	eax, eax
   144 000092C5 88D4                <1> 	mov	ah, dl
   145 000092C7 56                  <1> 	push	esi
   146 000092C8 BE00010900          <1> 	mov	esi, Logical_DOSDisks
   147 000092CD 01C6                <1> 	add	esi, eax
   148 000092CF 8A06                <1> 	mov	al, [esi+LD_Name] 
   149 000092D1 3C41                <1> 	cmp	al, 'A'
   150 000092D3 72E8                <1> 	jb	short loc_get_current_drive_not_ready_retn
   151                              <1> 
   152 000092D5 8A667F              <1> 	mov	ah, [esi+LD_CDirLevel]
   153 000092D8 08E4                <1> 	or	ah, ah
   154 000092DA 7506                <1> 	jnz	short loc_get_current_drive_3
   155                              <1> 
   156                              <1> 	;xor	ah, ah ; mov ah, 0
   157 000092DC 8826                <1> 	mov	[esi], ah
   158 000092DE 31C9                <1> 	xor	ecx, ecx
   159 000092E0 EB1C                <1> 	jmp	short loc_get_current_drive_4
   160                              <1> 
   161                              <1> loc_get_current_drive_3:
   162 000092E2 BF[073A0100]        <1>         mov     edi, PATH_Array
   163 000092E7 57                  <1> 	push	edi
   164 000092E8 81C680000000        <1> 	add	esi, LD_CurrentDirectory
   165 000092EE B920000000          <1> 	mov	ecx, 32
   166 000092F3 F3A5                <1> 	rep	movsd
   167 000092F5 5E                  <1> 	pop	esi ; Path Array Address
   168 000092F6 5F                  <1> 	pop	edi ; pushed esi (current dir buffer offset) 
   169                              <1> 	;
   170 000092F7 E841FFFFFF          <1> 	call	set_current_directory_string
   171 000092FC 89FE                <1> 	mov	esi, edi
   172                              <1> 
   173                              <1> loc_get_current_drive_4:
   174 000092FE 30C0                <1> 	xor	al, al
   175 00009300 C3                  <1> 	retn
   176                              <1> 
   177                              <1> change_current_directory:
   178                              <1> 	; 19/02/2016
   179                              <1> 	; 11/02/2016
   180                              <1> 	; 10/02/2016
   181                              <1> 	; 08/02/2016
   182                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   183                              <1> 	; 18/09/2011 (DIR.ASM, 09/10/2011)	
   184                              <1> 	; 04/10/2009
   185                              <1> 	; 2005
   186                              <1> 	; INPUT -> 
   187                              <1> 	;	ESI = Directory string
   188                              <1> 	;	ah = CD command (CDh = save current dir string)
   189                              <1> 	; OUTPUT -> 
   190                              <1> 	; 	EDI = DOS Drive Description Table
   191                              <1> 	; 	cf = 1 -> error
   192                              <1> 	;	   EAX = Error code
   193                              <1> 	;	cf = 0 -> succesful
   194                              <1> 	;	   ESI = PATH_Array
   195                              <1> 	;	   EAX = Current Directory First Cluster
   196                              <1> 	;
   197                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
   198                              <1> 	
   199 00009301 8825[953A0100]      <1> 	mov	[CD_COMMAND], ah
   200 00009307 803E2F              <1> 	cmp	byte [esi], '/'
   201 0000930A 7505                <1> 	jne	short loc_ccd_cdir_level
   202 0000930C 46                  <1> 	inc	esi
   203 0000930D 30C0                <1> 	xor	al, al
   204 0000930F EB05                <1> 	jmp	short loc_ccd_parse_path_name
   205                              <1> loc_ccd_cdir_level:
   206 00009311 A0[A4310100]        <1> 	mov	al, [Current_Dir_Level]
   207                              <1> loc_ccd_parse_path_name:
   208 00009316 88C4                <1> 	mov	ah, al
   209 00009318 BF[073A0100]        <1> 	mov	edi, PATH_Array
   210                              <1> 
   211                              <1> ; Reset directory levels > cdir level
   212                              <1> 	; is this required !?
   213                              <1> 	;
   214                              <1> 	; Relations:
   215                              <1> 	; MAINPROG.ASM (pass_ccdrv_reset_cdir_FAT_fcluster)
   216                              <1> 	; proc_parse_dir_name,
   217                              <1> 	; proc_change_current_directory (this procedure)
   218                              <1> 	; proc_change_prompt_dir_string 
   219                              <1>  
   220 0000931D 0FB6C8              <1> 	movzx	ecx, al
   221 00009320 FEC1                <1> 	inc	cl
   222 00009322 C0E104              <1> 	shl	cl, 4
   223 00009325 01CF                <1> 	add	edi, ecx
   224 00009327 B107                <1> 	mov	cl, 7
   225 00009329 28C1                <1> 	sub	cl, al
   226 0000932B C0E102              <1> 	shl	cl, 2
   227 0000932E 89C3                <1> 	mov	ebx, eax
   228 00009330 31C0                <1> 	xor	eax, eax ; 0
   229 00009332 F3AB                <1> 	rep	stosd
   230 00009334 89D8                <1> 	mov	eax, ebx
   231                              <1> 
   232 00009336 BF[073A0100]        <1> 	mov	edi, PATH_Array
   233                              <1> 
   234 0000933B 803E20              <1> 	cmp	byte [esi], 20h
   235 0000933E F5                  <1> 	cmc
   236 0000933F 7305                <1> 	jnc	short pass_ccd_parse_dir_name
   237                              <1> 
   238                              <1> 		; ESI = Path name
   239                              <1> 		; AL = CCD_Level
   240 00009341 E872010000          <1>         call    parse_dir_name
   241                              <1> 		; AL = CCD_Level 
   242                              <1> 		; AH = Last_Dir_Level
   243                              <1> 		; (EDI = PATH_Array)
   244                              <1> 
   245                              <1> pass_ccd_parse_dir_name:
   246 00009346 9C                  <1> 	pushf
   247                              <1> 
   248                              <1> 	;mov	[CCD_Level], al
   249                              <1>         ;mov	[Last_Dir_Level], ah
   250 00009347 66A3[8B3A0100]      <1> 	mov	[CCD_Level], ax
   251                              <1> 
   252 0000934D 31DB                <1> 	xor	ebx, ebx
   253 0000934F 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
   254 00009355 BE00010900          <1> 	mov	esi, Logical_DOSDisks
   255 0000935A 01DE                <1> 	add	esi, ebx
   256                              <1> 
   257 0000935C 9D                  <1> 	popf 
   258 0000935D 720A                <1> 	jc	short loc_ccd_bad_path_name_retn
   259                              <1> 
   260 0000935F 8935[873A0100]      <1> 	mov	[CCD_DriveDT], esi
   261                              <1> 
   262 00009365 3C07                <1> 	cmp	al, 7
   263 00009367 7209                <1> 	jb	short loc_ccd_load_child_dir
   264                              <1> 
   265                              <1> loc_ccd_bad_path_name_retn:
   266 00009369 87F7                <1> 	xchg	esi, edi
   267 0000936B B813000000          <1> 	mov	eax, 19 ; Bad directory/path name 
   268 00009370 F9                  <1> 	stc
   269                              <1> loc_ccd_retn_p:
   270 00009371 C3                  <1> 	retn
   271                              <1> 
   272                              <1> loc_ccd_load_child_dir:
   273                              <1> 	; AL = CCD_Level
   274 00009372 08C0                <1> 	or	al, al
   275 00009374 7468                <1> 	jz	short loc_ccd_load_root_dir
   276                              <1> 
   277 00009376 6689C1              <1> 	mov	cx, ax
   278 00009379 C0E004              <1> 	shl	al, 4
   279 0000937C 0FB6F0              <1> 	movzx	esi, al
   280 0000937F 01FE                <1>      	add	esi, edi  ; offset PATH_Array
   281                              <1> 
   282 00009381 8B460C              <1> 	mov	eax, [esi+12]
   283 00009384 38E9                <1> 	cmp	cl, ch
   284 00009386 0F84FA000000        <1>         je      loc_ccd_load_sub_directory
   285 0000938C A3[A0310100]        <1> 	mov	[Current_Dir_FCluster], eax
   286                              <1> 
   287                              <1> loc_ccd_load_child_dir_next:
   288 00009391 83C610              <1> 	add	esi, 16 ; DOS DirEntry Format FileName Address
   289                              <1> 
   290                              <1>  	; Directory attribute : 10h
   291 00009394 B010                <1> 	mov	al, 00010000b ; 10h (Attrib AND mask)
   292                              <1> 	;mov	ah, 11001000b ; C8h
   293                              <1> 	; Volume name attribute: 8h
   294 00009396 B408                <1> 	mov	ah, 00001000b ; 08h (Attrib NAND, AND --> zero mask)
   295                              <1> 
   296 00009398 6631C9              <1> 	xor	cx, cx  
   297 0000939B E8B5010000          <1> 	call	locate_current_dir_file
   298 000093A0 7353                <1> 	jnc	short loc_ccd_set_dir_cluster_ptr
   299                              <1> 
   300                              <1> 	 ; 19/02/2016
   301                              <1> 	;mov	edi, [CCD_DriveDT]
   302 000093A2 8A25[8B3A0100]      <1> 	mov	ah, [CCD_Level]
   303 000093A8 803D[953A0100]CD    <1> 	cmp	byte [CD_COMMAND], 0CDh ;'CD' command or another
   304 000093AF 7509                <1> 	jne	short loc_ccd_load_child_dir_err
   305                              <1> 	; It is better to save recent successful part 
   306                              <1> 	; of the (requested) path as current directory.
   307                              <1> 	; (Otherwise the path would be reset to back
   308                              <1> 	; on the next 'CD' command.)
   309 000093B1 88E1                <1> 	mov	cl, ah
   310 000093B3 50                  <1> 	push	eax
   311 000093B4 E8E3000000          <1> 	call	loc_ccd_save_current_dir
   312 000093B9 58                  <1> 	pop	eax
   313                              <1> loc_ccd_load_child_dir_err:            
   314 000093BA 3C03                <1> 	cmp	al, 3	; AL = 2 => File not found error
   315 000093BC 7202                <1> 	jb	short loc_ccd_path_not_found_retn
   316 000093BE F9                  <1> 	stc
   317 000093BF C3                  <1> 	retn
   318                              <1> 
   319                              <1> loc_ccd_path_not_found_retn:
   320 000093C0 B003                <1> 	mov	al, 3	; Path not found
   321 000093C2 C3                  <1> 	retn
   322                              <1> 
   323                              <1> loc_ccd_load_FAT_root_dir:
   324 000093C3 803D[A5310100]02    <1> 	cmp	byte [Current_FATType], 2
   325 000093CA 776B                <1> 	ja	short loc_ccd_load_FAT32_root_dir
   326                              <1> 
   327                              <1> 	;mov	esi, [CCD_DriveDT]
   328                              <1> 	;push	esi
   329 000093CC E8B61D0000          <1> 	call	load_FAT_root_directory
   330                              <1> 	;pop	edi ; Dos Drv Description Table
   331                              <1> 
   332 000093D1 89F7                <1> 	mov	edi, esi
   333 000093D3 BE[073A0100]        <1> 	mov	esi, PATH_Array
   334 000093D8 7297                <1> 	jc	short loc_ccd_retn_p
   335                              <1> 
   336 000093DA 31C0                <1> 	xor	eax, eax
   337 000093DC EB78                <1>         jmp	short loc_ccd_set_cdfc
   338                              <1> 
   339                              <1> loc_ccd_load_root_dir:
   340 000093DE 803D[A5310100]01    <1> 	cmp	byte [Current_FATType], 1
   341 000093E5 73DC                <1> 	jnb	short loc_ccd_load_FAT_root_dir
   342                              <1> 
   343                              <1> loc_ccd_load_FS_root_dir:
   344 000093E7 E8621E0000          <1> 	call	load_FS_root_directory
   345 000093EC EB5C                <1> 	jmp	short pass_ccd_load_FAT_sub_directory
   346                              <1> 
   347                              <1> loc_ccd_load_FS_sub_directory_next:
   348 000093EE E85C1E0000          <1> 	call	load_FS_sub_directory
   349 000093F3 EB1F                <1> 	jmp	short pass_ccd_set_dir_cluster_ptr  
   350                              <1> 
   351                              <1> loc_ccd_set_dir_cluster_ptr:
   352                              <1> 	; EDI = Directory Entry
   353 000093F5 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
   354 000093F9 C1E010              <1> 	shl	eax, 16
   355 000093FC 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
   356                              <1> 
   357 00009400 8B35[873A0100]      <1> 	mov	esi, [CCD_DriveDT]
   358 00009406 803D[A5310100]01    <1> 	cmp	byte [Current_FATType], 1
   359 0000940D 72DF                <1> 	jb	short loc_ccd_load_FS_sub_directory_next
   360                              <1> 	;push	esi
   361 0000940F E8FE1D0000          <1> 	call	load_FAT_sub_directory
   362                              <1> 	;pop	edi ; Dos Drv Description Table
   363                              <1> 
   364                              <1> pass_ccd_set_dir_cluster_ptr:
   365                              <1> 	;mov	edi, esi
   366 00009414 BE[073A0100]        <1> 	mov	esi, PATH_Array
   367 00009419 7264                <1> 	jc	short loc_ccd_retn_c
   368                              <1> 
   369 0000941B A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
   370                              <1> 
   371 00009420 FE05[8B3A0100]      <1> 	inc	byte [CCD_Level]
   372 00009426 0FB61D[8B3A0100]    <1> 	movzx	ebx, byte [CCD_Level]
   373 0000942D C0E304              <1> 	shl	bl, 4 ; * 16 (<= 128)   
   374 00009430 01DE                <1> 	add	esi, ebx ; 19/02/2016
   375 00009432 89460C              <1> 	mov	[esi+12], eax
   376 00009435 EB1F                <1> 	jmp	short loc_ccd_set_cdfc
   377                              <1> 
   378                              <1> loc_ccd_load_FAT32_root_dir:
   379 00009437 BE[073A0100]        <1> 	mov	esi, PATH_Array
   380 0000943C 8B460C              <1> 	mov	eax, [esi+12]
   381 0000943F 8B35[873A0100]      <1> 	mov	esi, [CCD_DriveDT]
   382                              <1>  
   383                              <1> loc_ccd_load_FAT_sub_directory:
   384                              <1> 	;push	esi
   385 00009445 E8C81D0000          <1> 	call	load_FAT_sub_directory
   386                              <1> 	;pop	edi ; Dos Drv Description Table
   387                              <1> 
   388                              <1> pass_ccd_load_FAT_sub_directory:
   389                              <1> 	;mov	edi, esi
   390 0000944A BE[073A0100]        <1> 	mov	esi, PATH_Array
   391 0000944F 722E                <1> 	jc	short loc_ccd_retn_c
   392                              <1> 
   393 00009451 A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
   394                              <1> 
   395                              <1> loc_ccd_set_cdfc:
   396 00009456 8A0D[8B3A0100]      <1> 	mov	cl, [CCD_Level]
   397 0000945C 880D[A4310100]      <1> 	mov	[Current_Dir_Level], cl
   398 00009462 A3[A0310100]        <1> 	mov	[Current_Dir_FCluster], eax
   399                              <1> 
   400 00009467 8A2D[8C3A0100]      <1> 	mov	ch, [Last_Dir_Level]
   401 0000946D 38E9                <1> 	cmp	cl, ch 
   402 0000946F 0F821CFFFFFF        <1> 	jb	loc_ccd_load_child_dir_next
   403                              <1> 	
   404 00009475 803D[953A0100]CD    <1> 	cmp	byte [CD_COMMAND], 0CDh ;'CD' command or another
   405 0000947C 741E                <1> 	je	short loc_ccd_save_current_dir
   406                              <1> 
   407                              <1>         ; jne -> don't save, restore (the previous cdir) later !
   408                              <1>         ; (saving the cdir would prevent previous cdir restoration!)
   409                              <1> 
   410 0000947E F8                  <1> 	clc
   411                              <1> 
   412                              <1> loc_ccd_retn_c:
   413 0000947F 8B3D[873A0100]      <1> 	mov	edi, [CCD_DriveDT]
   414 00009485 C3                  <1> 	retn
   415                              <1> 
   416                              <1> loc_ccd_load_sub_directory:
   417 00009486 8B35[873A0100]      <1> 	mov	esi, [CCD_DriveDT]
   418 0000948C 803D[A5310100]01    <1> 	cmp	byte [Current_FATType], 1
   419 00009493 73B0                <1> 	jnb	short loc_ccd_load_FAT_sub_directory 
   420 00009495 E8B51D0000          <1> 	call	load_FS_sub_directory
   421 0000949A EBAE                <1> 	jmp	short pass_ccd_load_FAT_sub_directory 
   422                              <1> 
   423                              <1> loc_ccd_save_current_dir:
   424 0000949C BE[073A0100]        <1> 	mov	esi, PATH_Array ; 19/02/2016
   425 000094A1 8B3D[873A0100]      <1> 	mov	edi, [CCD_DriveDT]
   426 000094A7 57                  <1> 	push	edi
   427 000094A8 83C77F              <1>         add     edi, LD_CDirLevel
   428 000094AB 880F                <1> 	mov	[edi], cl
   429 000094AD 47                  <1> 	inc	edi ; LD_CurrentDirectory 
   430 000094AE 56                  <1> 	push	esi
   431                              <1> 	;mov	ecx, 32  ; always < 65536 (in this procedure)
   432 000094AF 66B92000            <1> 	mov	cx, 32
   433 000094B3 F3A5                <1> 	rep	movsd
   434                              <1> 	; Current directory has been saved to 
   435                              <1> 	; the DOS drive description table, cdir area !
   436 000094B5 5E                  <1> 	pop	esi  ; PATH_Array
   437 000094B6 5F                  <1> 	pop	edi  ; Dos Drv Description Table
   438                              <1> 
   439 000094B7 C3                  <1> 	retn
   440                              <1> 
   441                              <1> parse_dir_name:
   442                              <1> 	; 11/02/2016
   443                              <1> 	; 10/02/2016
   444                              <1> 	; 07/02/2016 (TRDOS 386 = TRDOS v2.0)
   445                              <1> 	; 18/09/2011
   446                              <1> 	; 17/10/2009
   447                              <1> 	; INPUT ->
   448                              <1> 	;	ESI = ASCIIZ Directory String Address
   449                              <1> 	;	AL = Current Directory Level
   450                              <1> 	;	EDI = Destination Adress
   451                              <1> 	;	     (8 levels, each one 12+4 byte)
   452                              <1> 	; OUTPUT ->
   453                              <1> 	;	EDI = Dir Entry Formatted Array
   454                              <1> 	;	     with zero cluster pointer at the last level
   455                              <1> 	;	AH = Last Dir Level
   456                              <1> 	;	AL = Current Dir Level
   457                              <1> 	;
   458                              <1> 	; (esi, ebx, ecx will be changed) 
   459                              <1> 
   460                              <1> 	;mov	[PATH_Array_Ptr], edi
   461 000094B8 88C4                <1> 	mov	ah, al
   462 000094BA 66A3[2C3B0100]      <1> 	mov	[PATH_CDLevel], ax
   463                              <1> repeat_ppdn_check_slash:
   464 000094C0 AC                  <1> 	lodsb
   465 000094C1 3C2F                <1> 	cmp	al, '/'
   466 000094C3 74FB                <1> 	je	short repeat_ppdn_check_slash
   467 000094C5 3C21                <1> 	cmp	al, 21h
   468 000094C7 7219                <1> 	jb	short loc_ppdn_retn
   469 000094C9 57                  <1> 	push	edi
   470                              <1> loc_ppdn_get_dir_name:
   471 000094CA B90C000000          <1> 	mov	ecx, 12
   472 000094CF BF[2E3B0100]        <1> 	mov	edi, Dir_File_Name
   473                              <1> repeat_ppdn_get_dir_name:
   474 000094D4 AA                  <1> 	stosb
   475 000094D5 AC                  <1> 	lodsb
   476 000094D6 3C2F                <1> 	cmp	al, '/'
   477 000094D8 740A                <1> 	je	short loc_check_level_dot_conv_dir_name
   478 000094DA 3C20                <1> 	cmp	al, 20h
   479 000094DC 7605                <1> 	jna	short loc_ppdn_end_of_path_scan
   480 000094DE E2F4                <1> 	loop	repeat_ppdn_get_dir_name
   481 000094E0 5F                  <1> 	pop	edi
   482 000094E1 F9                  <1> 	stc
   483                              <1> loc_ppdn_retn:
   484 000094E2 C3                  <1> 	retn
   485                              <1> 
   486                              <1> loc_ppdn_end_of_path_scan:
   487 000094E3 4E                  <1> 	dec	esi
   488                              <1> loc_check_level_dot_conv_dir_name:
   489 000094E4 31C0                <1> 	xor	eax, eax
   490 000094E6 AA                  <1> 	stosb
   491 000094E7 89F3                <1> 	mov	ebx, esi
   492 000094E9 BE[2E3B0100]        <1> 	mov	esi, Dir_File_Name
   493 000094EE AC                  <1> 	lodsb
   494                              <1> repeat_ppdn_name_check_dot:
   495 000094EF 3C2E                <1> 	cmp	al, '.'
   496 000094F1 7509                <1> 	jne	short loc_ppdn_convert_sub_dir_name
   497                              <1> repeat_ppdn_name_dot_dot:
   498 000094F3 AC                  <1> 	lodsb
   499 000094F4 3C2E                <1> 	cmp	al, '.'
   500 000094F6 743E                <1> 	je	short loc_ppdn_dot_dot
   501 000094F8 3C21                <1> 	cmp	al, 21h
   502 000094FA 7226                <1> 	jb	short pass_ppdn_convert_sub_dir_name
   503                              <1> loc_ppdn_convert_sub_dir_name:
   504 000094FC 8A25[2D3B0100]      <1> 	mov	ah, [PATH_Level]
   505 00009502 80FC07              <1> 	cmp	ah, 7
   506 00009505 731B                <1> 	jnb	short pass_ppdn_convert_sub_dir_name
   507 00009507 FEC4                <1> 	inc	ah  
   508 00009509 8825[2D3B0100]      <1> 	mov	[PATH_Level], ah
   509 0000950F BE[2E3B0100]        <1> 	mov	esi, Dir_File_Name
   510                              <1> 	;mov	edi, [PATH_Array_Ptr]
   511 00009514 B010                <1> 	mov	al, 16
   512 00009516 F6E4                <1> 	mul	ah
   513 00009518 8B3C24              <1> 	mov	edi, [esp]
   514                              <1> 	;push	edi 
   515 0000951B 01C7                <1> 	add	edi, eax
   516 0000951D E828030000          <1> 	call	convert_file_name
   517                              <1> 	;pop	edi
   518                              <1> pass_ppdn_convert_sub_dir_name:
   519 00009522 89DE                <1> 	mov	esi, ebx
   520                              <1> repeat_ppdn_check_last_slash:
   521 00009524 AC                  <1> 	lodsb
   522 00009525 3C2F                <1> 	cmp	al, '/'
   523 00009527 74FB                <1> 	je	short repeat_ppdn_check_last_slash
   524 00009529 3C21                <1> 	cmp	al, 21h
   525 0000952B 739D                <1> 	jnb	short loc_ppdn_get_dir_name
   526                              <1> end_of_parse_dir_name:
   527 0000952D 5F                  <1> 	pop	edi
   528 0000952E F5                  <1> 	cmc  
   529                              <1> 	;mov	al, [PATH_CDLevel]
   530                              <1> 	;mov	ah, [PATH_Level]
   531 0000952F 66A1[2C3B0100]      <1> 	mov	ax, [PATH_CDLevel]
   532 00009535 C3                  <1> 	retn
   533                              <1> 
   534                              <1> loc_ppdn_dot_dot:
   535 00009536 AC                  <1> 	lodsb
   536 00009537 3C21                <1> 	cmp	al, 21h
   537 00009539 73F2                <1> 	jnb	short end_of_parse_dir_name 
   538                              <1> loc_ppdn_dot_dot_prev_level:
   539 0000953B 66A1[2C3B0100]      <1> 	mov	ax, [PATH_CDLevel]
   540 00009541 80EC01              <1> 	sub	ah, 1
   541 00009544 80D400              <1> 	adc	ah, 0
   542 00009547 38E0                <1> 	cmp	al, ah
   543 00009549 7602                <1> 	jna	short pass_ppdn_set_al_to_ah
   544 0000954B 88E0                <1> 	mov	al, ah
   545                              <1> pass_ppdn_set_al_to_ah:
   546 0000954D 66A3[2C3B0100]      <1> 	mov	[PATH_CDLevel], ax
   547 00009553 EBCD                <1> 	jmp	short pass_ppdn_convert_sub_dir_name
   548                              <1> 
   549                              <1> locate_current_dir_file:
   550                              <1> 	; 14/02/2016
   551                              <1> 	; 13/02/2016
   552                              <1> 	; 10/02/2016
   553                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   554                              <1> 	; 14/08/2010
   555                              <1> 	; 19/09/2009
   556                              <1>         ; 2005
   557                              <1> 	; INPUT ->
   558                              <1> 	;	ESI = DOS DirEntry Format FileName Address
   559                              <1> 	;	AL = Attributes Mask 
   560                              <1> 	;	(<AL AND EntryAttrib> must be equal to AL)
   561                              <1> 	;	AH = Negative Attributes Mask (If AH>0)
   562                              <1> 	;	(<AH AND EntryAttrib> must be ZERO)
   563                              <1> 	;	CH > 0 Find First Free Dir Entry or Deleted Entry
   564                              <1> 	;	CL = 0 -> Return the First Free Dir Entry
   565                              <1> 	;	CL = E5h -> Return the 1st deleted entry
   566                              <1> 	;	CL = FFh -> Return the 1st deleted or free entry
   567                              <1> 	;	CL > 0 and CL <> E5h and CL <> FFh -> Return the first 
   568                              <1> 	;	     proper entry (which fits with Atributes Masks)
   569                              <1> 	;	CX = 0 Find Valid File/Directory/VolumeName
   570                              <1> 	;	? = Any One Char
   571                              <1> 	;	* = Every Chars
   572                              <1> 	; OUTPUT ->
   573                              <1> 	;	EDI = Directory Entry Address (in Directory Buffer)
   574                              <1> 	;	ESI = DOS DirEntry Format FileName Address
   575                              <1> 	;	CF = 0 -> No Error, Proper Entry,
   576                              <1> 	;	DL = Attributes
   577                              <1> 	;	DH = Previous Entry Attr (LongName Check)
   578                              <1> 	;	AL > 0 -> Ambiguous filename wildcard "?" used
   579                              <1> 	;	AH > 0 -> Ambiguous filename wildcard "*" used
   580                              <1> 	;	AX = 0 -> Filename full fits with directory entry
   581                              <1> 	;	CH = The 1st Name Char of Current Dir Entry
   582                              <1> 	;	CF = 1 -> Proper entry not found, Error Code in EAX/AL
   583                              <1> 	;	CL = 0 and CH = 0 -> Free Entry (End Of Dir)
   584                              <1> 	;	CL = 0 and CH = E5h -> Deleted Entry fits with filters
   585                              <1> 	;	CL > 0 -> Entry not found, CH invalid
   586                              <1> 	;	CF = 0 -> 
   587                              <1> 	;	EBX = Current Directory Entry Index/Number (BX)
   588                              <1> 
   589                              <1> 	;mov	word [DirBuff_EntryCounter], 0 ; Zero Based
   590                              <1> 
   591 00009555 8935[8F3A0100]      <1> 	mov	[CDLF_FNAddress], esi
   592 0000955B 66A3[8D3A0100]      <1> 	mov	[CDLF_AttributesMask], ax
   593 00009561 66890D[933A0100]    <1> 	mov	[CDLF_DEType], cx
   594                              <1> 
   595 00009568 31DB                <1> 	xor	ebx, ebx
   596 0000956A 881D[A43A0100]      <1> 	mov	[PreviousAttr], bl ; 0  ; 13/02/2016
   597                              <1> 
   598 00009570 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
   599 00009576 381D[D0390100]      <1> 	cmp	byte [DirBuff_ValidData], bl ; 0
   600 0000957C 761D                <1> 	jna	short loc_lcdf_reload_current_dir2
   601 0000957E 8A1D[CE390100]      <1>         mov     bl, [DirBuff_DRV]
   602 00009584 80EB41              <1> 	sub	bl, 'A'
   603 00009587 38DF                <1> 	cmp	bh, bl
   604 00009589 750E                <1> 	jne	short loc_lcdf_reload_current_dir1
   605 0000958B 8B15[D5390100]      <1> 	mov	edx, [DirBuff_Cluster]
   606 00009591 3B15[A0310100]      <1> 	cmp	edx, [Current_Dir_FCluster]
   607 00009597 7412                <1> 	je	short loc_cdir_locatefile_search
   608                              <1> 
   609                              <1> loc_lcdf_reload_current_dir1:
   610 00009599 30DB                <1> 	xor	bl, bl
   611                              <1> loc_lcdf_reload_current_dir2:
   612 0000959B 89DE                <1> 	mov	esi, ebx
   613 0000959D 81C600010900        <1>         add     esi, Logical_DOSDisks
   614 000095A3 E872000000          <1> 	call	reload_current_directory 
   615 000095A8 735B                <1> 	jnc	short loc_locatefile_search_again 
   616 000095AA C3                  <1> 	retn  
   617                              <1> 
   618                              <1> loc_cdir_locatefile_search:
   619 000095AB 31DB                <1> 	xor	ebx, ebx
   620 000095AD E8A5000000          <1> 	call	find_directory_entry
   621 000095B2 7349                <1> 	jnc	short loc_cdir_locate_file_retn
   622                              <1> 
   623                              <1> loc_locatefile_check_stc_reason:
   624 000095B4 08ED                <1> 	or	ch, ch
   625 000095B6 7444                <1> 	jz	short loc_cdir_locate_file_stc_retn
   626                              <1> 
   627                              <1> loc_locatefile_check_next_entryblock:
   628 000095B8 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
   629 000095BE 28DB                <1> 	sub	bl, bl
   630 000095C0 0FB7F3              <1> 	movzx	esi, bx
   631 000095C3 81C600010900        <1>         add     esi, Logical_DOSDisks
   632                              <1> 
   633 000095C9 803D[A4310100]00    <1> 	cmp	byte [Current_Dir_Level], 0
   634 000095D0 760A                <1> 	jna	short loc_locatefile_check_FAT_type
   635                              <1>             
   636 000095D2 803D[A5310100]01    <1> 	cmp	byte [Current_FATType], 1
   637 000095D9 730A                <1> 	jnb	short loc_locatefile_load_subdir_cluster
   638 000095DB C3                  <1> 	retn  
   639                              <1> 
   640                              <1> loc_locatefile_check_FAT_type:
   641 000095DC 803D[A5310100]03    <1> 	cmp	byte [Current_FATType], 3
   642 000095E3 7218                <1> 	jb	short loc_cdir_locate_file_retn
   643                              <1> 
   644                              <1> loc_locatefile_load_subdir_cluster:
   645 000095E5 A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
   646 000095EA E83D1A0000          <1> 	call	get_next_cluster
   647 000095EF 730D                <1> 	jnc	short loc_locatefile_next_cluster
   648 000095F1 09C0                <1> 	or	eax, eax
   649 000095F3 7507                <1> 	jnz	short loc_locatefile_drive_not_ready_read_err
   650 000095F5 F9                  <1> 	stc
   651                              <1> loc_locatefile_file_notfound:
   652 000095F6 B802000000          <1> 	mov	eax, 2 ; File/Directory/VolName not found
   653 000095FB C3                  <1> 	retn
   654                              <1> 
   655                              <1> loc_locatefile_drive_not_ready_read_err:
   656                              <1> 	;mov	eax, 17 ;Drive not ready or read error
   657                              <1> loc_cdir_locate_file_stc_retn:
   658 000095FC F5                  <1> 	cmc ;stc
   659                              <1> loc_cdir_locate_file_retn:
   660 000095FD C3                  <1> 	retn
   661                              <1> 
   662                              <1> loc_locatefile_next_cluster:
   663 000095FE E80F1C0000          <1> 	call	load_FAT_sub_directory
   664                              <1> 	;jc	short loc_locatefile_drive_not_ready_read_err
   665 00009603 72F8                <1> 	jc	short loc_cdir_locate_file_retn 
   666                              <1> 
   667                              <1> loc_locatefile_search_again:
   668 00009605 8B35[8F3A0100]      <1> 	mov	esi, [CDLF_FNAddress] 
   669 0000960B 66A1[8D3A0100]      <1> 	mov	ax, [CDLF_AttributesMask]
   670 00009611 668B0D[933A0100]    <1> 	mov	cx, [CDLF_DEType] 
   671 00009618 EB91                <1> 	jmp	short loc_cdir_locatefile_search
   672                              <1> 
   673                              <1> reload_current_directory:
   674                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   675                              <1> 	; 13/06/2010
   676                              <1> 	; 22/09/2009
   677                              <1>         ;
   678                              <1> 	; INPUT ->
   679                              <1> 	;	ESI = Dos drive description table address
   680                              <1> 	
   681                              <1> 	;mov	al, [esi+LD_FATType]
   682 0000961A A0[A5310100]        <1> 	mov	al, [Current_FATType]
   683 0000961F 3C02                <1> 	cmp	al, 2
   684 00009621 7729                <1> 	ja	short loc_reload_FAT_sub_directory
   685 00009623 8A25[A4310100]      <1> 	mov	ah, [Current_Dir_Level]
   686 00009629 08C0                <1> 	or	al, al
   687 0000962B 740A                <1> 	jz	short loc_reload_FS_directory
   688 0000962D 08E4                <1> 	or	ah, ah
   689 0000962F 751B                <1> 	jnz	short loc_reload_FAT_sub_directory
   690                              <1> loc_reload_FAT_12_16_root_directory:
   691 00009631 E8511B0000          <1> 	call	load_FAT_root_directory
   692 00009636 C3                  <1> 	retn
   693                              <1> loc_reload_FS_directory:
   694 00009637 20E4                <1> 	and	ah, ah
   695 00009639 7506                <1> 	jnz	short loc_reload_FS_sub_directory 
   696                              <1> loc_reload_FS_root_directory: 
   697 0000963B E80E1C0000          <1> 	call	load_FS_root_directory
   698 00009640 C3                  <1> 	retn
   699                              <1> loc_reload_FS_sub_directory:
   700 00009641 A1[A0310100]        <1> 	mov	eax, [Current_Dir_FCluster]
   701 00009646 E8041C0000          <1> 	call	load_FS_sub_directory
   702 0000964B C3                  <1> 	retn 
   703                              <1> loc_reload_FAT_sub_directory:
   704 0000964C A1[A0310100]        <1> 	mov	eax, [Current_Dir_FCluster]
   705 00009651 E8BC1B0000          <1> 	call	load_FAT_sub_directory
   706 00009656 C3                  <1> 	retn
   707                              <1> 
   708                              <1> find_directory_entry:
   709                              <1> 	; 14/02/2016
   710                              <1> 	; 13/02/2016
   711                              <1> 	; 10/02/2016
   712                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   713                              <1> 	; 14/08/2010 (DIR.ASM, "proc_find_direntry")
   714                              <1> 	; 19/09/2009
   715                              <1> 	; 2005
   716                              <1> 	; INPUT ->
   717                              <1> 	;	ESI = Sub Dir or File Name Address
   718                              <1> 	;	AL = Attributes Mask 
   719                              <1> 	;	(<AL AND EntryAttrib> must be equal to AL)
   720                              <1> 	;	AH = Negative Attributes Mask (If AH>0)
   721                              <1> 	;	(<AH AND EntryAttrib> must be ZERO)
   722                              <1> 	;	CH > 0 Find First Free Dir Entry or Deleted Entry
   723                              <1> 	;	CL = 0 -> Return the First Free Dir Entry
   724                              <1> 	;	CL = E5h -> Return the 1st deleted entry
   725                              <1> 	;	CL = FFh -> Return the 1st deleted or free entry
   726                              <1> 	;	CL > 0 and CL <> E5h and CL <> FFh -> Return the first 
   727                              <1> 	;            proper entry (which fits with Atributes Masks)
   728                              <1> 	;	CX = 0 -> Find Valid File/Directory/VolumeName
   729                              <1> 	;	? = Any One Char
   730                              <1> 	;	* = Every Chars
   731                              <1> 	;	EBX = Current Dir Entry (BX)
   732                              <1> 	;
   733                              <1> 	; OUTPUT -> 
   734                              <1> 	;	EDI = Directory Entry Address (in DirectoryBuffer)
   735                              <1> 	;	ESI = Sub Dir or File Name Address
   736                              <1> 	;	CF = 0 -> No Error, Proper Entry,
   737                              <1> 	;	DL = Attributes
   738                              <1> 	;	DH = Previous Entry Attr (LongName Check)
   739                              <1> 	;	AL > 0 -> Ambiguous filename wildcard "?" used
   740                              <1> 	;	AH > 0 -> Ambiguous filename wildcard "*" used
   741                              <1> 	;	AX = 0 -> Filename full fits with directory entry
   742                              <1> 	;	EBX = CurrentDirEntry (BX)
   743                              <1> 	;	CH = The 1st Name Char of Current Dir Entry
   744                              <1> 	;	CF = 1 -> Proper entry not found, Error Code in AX/AL
   745                              <1> 	;	CL = 0 and CH = 0 -> Free Entry (End Of Dir)
   746                              <1> 	;	CL = 0 and CH = E5h -> Deleted Entry fits with filters
   747                              <1> 	;	CL > 0 -> Entry not found, CH invalid
   748                              <1> 	;
   749                              <1> 	; (EAX, EBX, ECX, EDX, EDI, EBP will be changed)	 
   750                              <1> 
   751 00009657 663B1D[D3390100]    <1> 	cmp	bx, [DirBuff_LastEntry]
   752 0000965E 0F8739010000        <1>         ja      loc_ffde_stc_retn_255
   753                              <1> 
   754                              <1> 	;mov    [DirBuff_CurrentEntry], bx  
   755                              <1> 
   756 00009664 BF00000800          <1>   	mov	edi, Directory_Buffer
   757 00009669 66A3[A03A0100]      <1> 	mov	[FDE_AttrMask], ax
   758                              <1> 
   759 0000966F 29C0                <1> 	sub	eax, eax
   760                              <1>             
   761                              <1> 	;;mov	[PreviousAttr], al ; 0 ;; 13/02/2016
   762 00009671 66A3[A23A0100]      <1> 	mov	[AmbiguousFileName], ax ; 0
   763                              <1> 
   764 00009677 6689D8              <1> 	mov	ax, bx
   765 0000967A 66C1E005            <1> 	shl	ax, 5 ; ; * 32 ; Directory entry size
   766 0000967E 01C7                <1> 	add     edi, eax
   767                              <1> 
   768 00009680 08ED                <1> 	or	ch, ch
   769 00009682 0F852C010000        <1>         jnz     loc_find_free_deleted_entry_0
   770                              <1> 
   771 00009688 08C9                <1> 	or      cl, cl
   772 0000968A 0F850D010000        <1>         jnz     loc_ffde_stc_retn_255
   773                              <1>  
   774                              <1> check_find_dir_entry:
   775 00009690 66A1[A03A0100]      <1> 	mov	ax, [FDE_AttrMask]
   776 00009696 8A2F                <1> 	mov	ch, [edi]
   777 00009698 80FD00              <1> 	cmp     ch, 0 ; Is it never used entry?
   778 0000969B 0F86FF000000        <1> 	jna	loc_find_direntry_stc_retn 
   779 000096A1 56                  <1> 	push	esi
   780 000096A2 8A570B              <1> 	mov	dl, [edi+0Bh] ; File attributes
   781 000096A5 80FDE5              <1> 	cmp	ch, 0E5h ; Is it a deleted file?
   782 000096A8 746D                <1> 	je	short loc_find_dir_next_entry_prevdeleted
   783                              <1> 
   784 000096AA 80FA0F              <1> 	cmp     dl, 0Fh ; longname sub component check
   785 000096AD 7505                <1> 	jne     short loc_check_attributes_mask
   786 000096AF E8ED010000          <1> 	call	save_longname_sub_component
   787                              <1> 
   788                              <1> loc_check_attributes_mask:
   789 000096B4 88C6                <1> 	mov	dh, al
   790 000096B6 20D6                <1> 	and	dh, dl    
   791 000096B8 38F0                <1> 	cmp	al, dh
   792 000096BA 0F85BA000000        <1>         jne     loc_find_dir_next_entry
   793 000096C0 20D4                <1> 	and	ah, dl
   794 000096C2 0F85B2000000        <1>         jnz     loc_find_dir_next_entry
   795 000096C8 80FA0F              <1> 	cmp	dl, 0Fh
   796 000096CB 751A                <1> 	jne	short pass_direntry_attr_check
   797                              <1> 
   798 000096CD 3C0F                <1> 	cmp	al, 0Fh ; AL = 0Fh -> find long name
   799 000096CF 0F85A5000000        <1>         jne     loc_find_dir_next_entry
   800                              <1> 
   801 000096D5 5E                  <1> 	pop	esi
   802 000096D6 6631C0              <1> 	xor	ax, ax
   803 000096D9 8A35[A43A0100]      <1> 	mov	dh, [PreviousAttr]
   804 000096DF 66891D[D1390100]    <1> 	mov	[DirBuff_CurrentEntry], bx
   805 000096E6 C3                  <1> 	retn
   806                              <1> 
   807                              <1> pass_direntry_attr_check:
   808 000096E7 89FD                <1> 	mov	ebp, edi ; 14/02/2016
   809 000096E9 B908000000          <1> 	mov	ecx, 8
   810                              <1> loc_lodsb_find_dir:
   811 000096EE AC                  <1> 	lodsb
   812 000096EF 3C2A                <1> 	cmp	al, '*'
   813 000096F1 7508                <1> 	jne	short pass_fde_ambiguous1_check
   814 000096F3 FE05[A33A0100]      <1>         inc     byte [AmbiguousFileName+1]
   815 000096F9 EB28                <1> 	jmp	short loc_check_direntry_extension
   816                              <1> 
   817                              <1> pass_fde_ambiguous1_check:
   818 000096FB 3C3F                <1> 	cmp	al, '?'
   819 000096FD 750D                <1> 	jne	short pass_fde_ambiguous2_check
   820 000096FF FE05[A23A0100]      <1> 	inc	byte [AmbiguousFileName]
   821 00009705 803F20              <1> 	cmp	byte [edi], 20h
   822 00009708 764E                <1> 	jna	short loc_find_dir_next_entry_ebp
   823 0000970A EB14                <1> 	jmp	short loc_scasb_find_dir_inc_di
   824                              <1> 
   825                              <1> pass_fde_ambiguous2_check:
   826 0000970C 3C20                <1> 	cmp	al, 20h
   827 0000970E 750C                <1> 	jne	short loc_scasb_find_dir
   828 00009710 803F20              <1> 	cmp	byte [edi], 20h
   829 00009713 7543                <1> 	jne	short loc_find_dir_next_entry_ebp
   830 00009715 EB0C                <1> 	jmp	short loc_check_direntry_extension
   831                              <1> 
   832                              <1> loc_find_dir_next_entry_prevdeleted:
   833 00009717 80CA80              <1> 	or	dl, 80h  ; Bit 7 -> deleted entry sign
   834 0000971A EB5E                <1> 	jmp	short loc_find_dir_next_entry
   835                              <1> 
   836                              <1> loc_scasb_find_dir:
   837 0000971C 3A07                <1> 	cmp	al, [edi]
   838 0000971E 7538                <1> 	jne	short loc_find_dir_next_entry_ebp
   839                              <1> loc_scasb_find_dir_inc_di:
   840 00009720 47                  <1> 	inc	edi
   841 00009721 E2CB                <1> 	loop	loc_lodsb_find_dir
   842                              <1> 
   843                              <1> loc_check_direntry_extension:
   844 00009723 BE08000000          <1> 	mov	esi, 8
   845 00009728 89F7                <1> 	mov	edi, esi ; 8
   846 0000972A 033424              <1> 	add	esi, [esp] ; Sub Dir or File Name Address
   847 0000972D 01EF                <1> 	add	edi, ebp
   848 0000972F B103                <1> 	mov	cl, 3
   849                              <1> loc_lodsb_find_dir_ext:
   850 00009731 AC                  <1> 	lodsb
   851 00009732 3C2A                <1> 	cmp	al, '*'
   852 00009734 7508                <1> 	jne	short pass_fde_ambiguous3_check
   853 00009736 FE05[A33A0100]      <1> 	inc	byte [AmbiguousFileName+1]
   854 0000973C EB1E                <1> 	jmp	short loc_find_dir_proper_direntry
   855                              <1> 
   856                              <1> pass_fde_ambiguous3_check:
   857 0000973E 3C3F                <1> 	cmp	al, '?'
   858 00009740 750D                <1> 	jne	short pass_fde_ambiguous4_check
   859 00009742 FE05[A23A0100]      <1> 	inc	byte [AmbiguousFileName]
   860 00009748 803F20              <1> 	cmp	byte [edi], 20h
   861 0000974B 760B                <1> 	jna	short loc_find_dir_next_entry_ebp
   862 0000974D EB49                <1> 	jmp	short loc_scasb_find_dir_ext_inc_di
   863                              <1> 
   864                              <1> pass_fde_ambiguous4_check:
   865 0000974F 3C20                <1> 	cmp	al, 20h
   866 00009751 7541                <1> 	jne	short loc_scasb_find_dir_ext
   867 00009753 803F20              <1> 	cmp	byte [edi], 20h
   868 00009756 7404                <1> 	je	short loc_find_dir_proper_direntry
   869                              <1> 
   870                              <1> loc_find_dir_next_entry_ebp:
   871 00009758 89EF                <1> 	mov	edi, ebp ; 14/02/2016
   872 0000975A EB1E                <1> 	jmp	short loc_find_dir_next_entry
   873                              <1> 
   874                              <1> loc_find_dir_proper_direntry:
   875 0000975C 30C9                <1> 	xor	cl, cl
   876                              <1> loc_find_dir_proper_direntry_1:
   877 0000975E 5E                  <1> 	pop	esi
   878 0000975F 89EF                <1>         mov     edi, ebp
   879 00009761 8A2F                <1> 	mov	ch, [edi]
   880 00009763 8A570B              <1> 	mov     dl, [edi+0Bh] ; Dir entry attributes
   881 00009766 66A1[A23A0100]      <1> 	mov	ax, [AmbiguousFileName]
   882                              <1> loc_find_dir_proper_direntry_2:
   883 0000976C 8A35[A43A0100]      <1> 	mov     dh, [PreviousAttr]
   884 00009772 66891D[D1390100]    <1> 	mov	[DirBuff_CurrentEntry], bx
   885 00009779 C3                  <1> 	retn
   886                              <1> 
   887                              <1> loc_find_dir_next_entry:
   888 0000977A 8815[A43A0100]      <1> 	mov	byte [PreviousAttr], dl ; LongName check
   889                              <1> loc_find_dir_next_entry_1:
   890 00009780 5E                  <1> 	pop	esi
   891 00009781 83C720              <1> 	add	edi, 32
   892                              <1> 	;inc	word [DirBuff_EntryCounter]
   893 00009784 6643                <1> 	inc	bx
   894 00009786 663B1D[D3390100]    <1> 	cmp	bx, [DirBuff_LastEntry]
   895 0000978D 770E                <1> 	ja	short loc_ffde_stc_retn_255
   896 0000978F E9FCFEFFFF          <1>         jmp     check_find_dir_entry 
   897                              <1> 
   898                              <1> loc_scasb_find_dir_ext:
   899 00009794 3A07                <1> 	cmp	al, [edi]
   900 00009796 75C0                <1> 	jne	short loc_find_dir_next_entry_ebp
   901                              <1> loc_scasb_find_dir_ext_inc_di:
   902 00009798 47                  <1> 	inc	edi
   903 00009799 E296                <1> 	loop    loc_lodsb_find_dir_ext
   904 0000979B EBC1                <1> 	jmp	short loc_find_dir_proper_direntry_1
   905                              <1> 
   906                              <1> loc_ffde_stc_retn_255:
   907                              <1> 	;mov	cx, 0FFFFh
   908 0000979D 31C9                <1> 	xor	ecx, ecx
   909 0000979F 49                  <1> 	dec	ecx ; 0FFFFFFFFh
   910                              <1> 	;xor	eax, eax
   911                              <1> loc_find_direntry_stc_retn:
   912                              <1> loc_check_ffde_retn_1:
   913                              <1> 	;mov	ax, 2
   914 000097A0 B802000000          <1> 	mov	eax, 2 ; File Not Found
   915 000097A5 8A35[A43A0100]      <1> 	mov	dh, [PreviousAttr]
   916 000097AB 66891D[D1390100]    <1> 	mov	[DirBuff_CurrentEntry], bx
   917 000097B2 F9                  <1> 	stc
   918 000097B3 C3                  <1> 	retn
   919                              <1> 
   920                              <1> loc_find_free_deleted_entry_0:
   921 000097B4 66A1[A03A0100]      <1> 	mov	ax, [FDE_AttrMask]
   922 000097BA 8A2F                <1> 	mov	ch, [edi]
   923 000097BC 8A570B              <1> 	mov	dl, [edi+0Bh] ; File attributes
   924 000097BF 08C9                <1> 	or	cl, cl 
   925 000097C1 7407                <1> 	jz	short loc_check_ffde_0_repeat
   926                              <1> 	;cmp	cl, 0E5h
   927                              <1> 	;je	short pass_loc_check_ffde_0_err
   928 000097C3 80F9FF              <1> 	cmp	cl, 0FFh
   929 000097C6 7432                <1> 	je	short loc_find_free_deleted_entry_1
   930 000097C8 EB4D                <1> 	jmp	short pass_loc_check_ffde_0_err
   931                              <1> 
   932                              <1> loc_check_ffde_0_repeat:
   933 000097CA 08ED                <1> 	or	ch, ch
   934 000097CC 7511                <1> 	jnz	short loc_check_ffde_0_next
   935                              <1> 
   936                              <1> loc_check_ffde_retn_2:
   937 000097CE 6629C0              <1> 	sub	ax, ax
   938 000097D1 8A35[A43A0100]      <1> 	mov	dh, [PreviousAttr]
   939 000097D7 66891D[D1390100]    <1> 	mov	[DirBuff_CurrentEntry], bx
   940 000097DE C3                  <1> 	retn
   941                              <1>  
   942                              <1> loc_check_ffde_0_next:
   943 000097DF 6643                <1> 	inc	bx
   944 000097E1 83C720              <1> 	add	edi, 32
   945                              <1> 	;inc	word [DirBuff_EntryCounter]
   946                              <1> 	 
   947 000097E4 663B1D[D3390100]    <1>         cmp	bx, [DirBuff_LastEntry]
   948 000097EB 77B0                <1> 	ja	short loc_ffde_stc_retn_255
   949 000097ED 8815[A43A0100]      <1> 	mov	[PreviousAttr], dl
   950 000097F3 8A2F                <1> 	mov	ch, [edi]
   951 000097F5 8A570B              <1> 	mov	dl, [edi+0Bh] ; file attributes
   952 000097F8 EBD0                <1> 	jmp	short loc_check_ffde_0_repeat
   953                              <1> 
   954                              <1> loc_find_free_deleted_entry_1:
   955 000097FA 28D2                <1> 	sub	dl, dl      
   956                              <1> loc_find_free_deleted_entry_2:
   957 000097FC 20ED                <1> 	and	ch, ch  
   958 000097FE 74CE                <1> 	jz	short loc_check_ffde_retn_2
   959 00009800 80FDE5              <1> 	cmp	ch, 0E5h
   960 00009803 74C9                <1> 	je	short loc_check_ffde_retn_2
   961 00009805 6643                <1> 	inc	bx
   962 00009807 83C720              <1> 	add	edi, 32
   963 0000980A 663B1D[D3390100]    <1> 	cmp	bx, [DirBuff_LastEntry]
   964 00009811 778A                <1> 	ja	short loc_ffde_stc_retn_255
   965 00009813 8A2F                <1> 	mov	ch, [edi]
   966 00009815 EBE5                <1> 	jmp	short loc_find_free_deleted_entry_2
   967                              <1> 
   968                              <1> pass_loc_check_ffde_0_err:
   969 00009817 38CD                <1> 	cmp	ch, cl
   970 00009819 741F                <1> 	je	short loc_check_ffde_attrib 
   971                              <1> 
   972 0000981B 6643                <1> 	inc	bx
   973 0000981D 83C720              <1> 	add	edi, 32
   974 00009820 663B1D[D3390100]    <1> 	cmp	bx, [DirBuff_LastEntry]
   975 00009827 0F8770FFFFFF        <1>         ja      loc_ffde_stc_retn_255
   976 0000982D 8815[A43A0100]      <1> 	mov	[PreviousAttr], dl
   977 00009833 8A2F                <1> 	mov	ch, [edi]
   978 00009835 8A570B              <1> 	mov	dl, [edi+0Bh]
   979 00009838 EBDD                <1> 	jmp	short pass_loc_check_ffde_0_err
   980                              <1> 
   981                              <1> loc_check_ffde_attrib:
   982 0000983A 88C6                <1> 	mov	dh, al
   983 0000983C 20D6                <1> 	and	dh, dl    
   984 0000983E 38F0                <1> 	cmp	al, dh
   985 00009840 759D                <1> 	jne	short loc_check_ffde_0_next
   986 00009842 20D4                <1> 	and	ah, dl
   987 00009844 7599                <1> 	jnz	short loc_check_ffde_0_next
   988 00009846 30C9                <1> 	xor	cl, cl 
   989 00009848 EB84                <1>         jmp     loc_check_ffde_retn_2
   990                              <1> 
   991                              <1> convert_file_name:
   992                              <1> 	; 06/03/2016
   993                              <1> 	; 11/02/2016
   994                              <1> 	; 07/02/2016 (TRDOS 386 = TRDOS v2.0)
   995                              <1> 	; 06/10/2009
   996                              <1> 	; 2005
   997                              <1> 	;
   998                              <1> 	; INPUT  ->
   999                              <1> 	;	ESI = Dot File Name Location
  1000                              <1> 	;	EDI = Dir Entry Format File Name Location
  1001                              <1> 	; OUTPUT ->
  1002                              <1> 	;	EDI = Dir Entry Format File Name Location
  1003                              <1> 	;	ESI = Dot File Name Location (capitalized)
  1004                              <1> 	;
  1005                              <1> 	; (ECX, AL will be changed) 
  1006                              <1>      
  1007 0000984A 56                  <1> 	push	esi  
  1008 0000984B 57                  <1> 	push	edi
  1009                              <1> 
  1010 0000984C B90B000000          <1> 	mov	ecx, 11
  1011 00009851 B020                <1> 	mov	al, 20h
  1012 00009853 F3AA                <1> 	rep	stosb
  1013                              <1> 
  1014 00009855 8B3C24              <1> 	mov	edi, [esp]
  1015                              <1> 
  1016 00009858 B10C                <1> 	mov	cl, 12 ; file name length (max.)
  1017                              <1> 	; 06/03/2016
  1018                              <1> 	; Directory entry name limit (11 bytes) check for
  1019                              <1> 	; 'rename_directory_entry' procedure.
  1020                              <1> 	; (EDI points to Directory Entry)
  1021                              <1> 	; (If the file name would not contain a dot
  1022                              <1> 	; and file name length would be 12, this would cause to
  1023                              <1> 	; overwrite the attributes byte of the directory entry.)
  1024                              <1> 	;
  1025 0000985A B50B                <1> 	mov	ch, 11 ; directory entry's name length
  1026                              <1> loc_check_first_dot:
  1027 0000985C 8A06                <1> 	mov	al, [esi]
  1028 0000985E 3C2E                <1> 	cmp	al, 2Eh
  1029 00009860 750C                <1> 	jne	short pass_check_first_dot
  1030 00009862 8807                <1> 	mov	[edi], al
  1031 00009864 47                  <1> 	inc	edi
  1032 00009865 46                  <1> 	inc	esi
  1033 00009866 FEC9                <1> 	dec	cl
  1034 00009868 75F2                <1> 	jnz	short loc_check_first_dot
  1035                              <1> 	;;(ecx <= 12)
  1036                              <1> 	;;loop	loc_check_first_dot 
  1037 0000986A EB30                <1> 	jmp	short stop_convert_file
  1038                              <1> 
  1039                              <1> loc_get_fchar:
  1040 0000986C 8A06                <1> 	mov	al, [esi]
  1041                              <1> pass_check_first_dot:
  1042 0000986E 3C61                <1> 	cmp	al, 61h ; 'a'
  1043 00009870 7208                <1> 	jb	short pass_name_capitalize
  1044 00009872 3C7A                <1> 	cmp	al, 7Ah ; 'z'
  1045 00009874 7704                <1> 	ja	short pass_name_capitalize
  1046 00009876 24DF                <1> 	and	al, 0DFh
  1047 00009878 8806                <1> 	mov	[esi], al
  1048                              <1> pass_name_capitalize:
  1049 0000987A 3C21                <1> 	cmp	al, 21h
  1050 0000987C 721E                <1> 	jb	short stop_convert_file
  1051 0000987E 3C2E                <1> 	cmp	al, 2Eh ; '.'
  1052 00009880 750C                <1> 	jne	short pass_dot_space
  1053                              <1> add_dot_space: 
  1054 00009882 80F904              <1> 	cmp	cl, 4
  1055 00009885 760E                <1> 	jna	short inc_and_loop
  1056 00009887 47                  <1> 	inc	edi
  1057 00009888 FECD                <1> 	dec	ch ; 06/03/2016
  1058 0000988A FEC9                <1> 	dec	cl
  1059 0000988C EBF4                <1> 	jmp	short add_dot_space
  1060                              <1> 	
  1061                              <1> 	;mov	al, 4
  1062                              <1> 	;cmp	cl, al
  1063                              <1> 	;jna	short inc_and_loop
  1064                              <1> 	;sub	cl, al
  1065                              <1> 	;add	edi, ecx
  1066                              <1> 	;mov	cl, al
  1067                              <1> 	;jmp	short inc_and_loop	
  1068                              <1> 
  1069                              <1> pass_dot_space:
  1070 0000988E 8807                <1> 	mov	[edi], al
  1071                              <1> loc_after_double_dot:
  1072                              <1> 	; 06/03/2016
  1073 00009890 FECD                <1> 	dec	ch ; count down for 11 bytes dir entry limit
  1074 00009892 740A                <1> 	jz	short stop_convert_file_x
  1075 00009894 47                  <1> 	inc	edi
  1076                              <1> inc_and_loop:
  1077 00009895 FEC9                <1> 	dec	cl ; count down for 12 bytes filename limit 
  1078 00009897 7403                <1> 	jz	short stop_convert_file	
  1079 00009899 46                  <1> 	inc	esi
  1080                              <1> 	;;(ecx <= 12)
  1081                              <1> 	;;loop	loc_get_fchar
  1082 0000989A EBD0                <1> 	jmp	short loc_get_fchar
  1083                              <1> 
  1084                              <1> stop_convert_file:
  1085                              <1> 	; 06/03/2016
  1086 0000989C 30ED                <1> 	xor	ch, ch
  1087                              <1> 	; ECX < 256 ; 'find_first_file' -> xor cl, cl
  1088                              <1> stop_convert_file_x:
  1089 0000989E 5F                  <1> 	pop	edi
  1090 0000989F 5E                  <1> 	pop	esi
  1091 000098A0 C3                  <1> 	retn
  1092                              <1>  
  1093                              <1> save_longname_sub_component:
  1094                              <1> 	; 13/02/2016
  1095                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
  1096                              <1> 	; 28/02/2010
  1097                              <1> 	; 17/10/2009
  1098                              <1> 	; INPUT ->
  1099                              <1> 	;	EDI = Directory Entry    
  1100                              <1> 	;     	// This procedure is called
  1101                              <1> 	;	// from 'find_directory_entry' procedure.
  1102                              <1> 	;	// If the last entry returns with
  1103                              <1> 	;	// a non-zero LongnameFound value and
  1104                              <1> 	;	// if LFN_CheckSum value is equal to
  1105                              <1> 	;	// the next shortname checksum,
  1106                              <1> 	;	// long name is valid.
  1107                              <1> 	;	// If a longname is longer than 65 bytes,
  1108                              <1> 	;	// it is invalid for trdos. (>45h)
  1109                              <1>  
  1110 000098A1 57                  <1> 	push	edi
  1111 000098A2 56                  <1> 	push	esi
  1112                              <1> 	;push	ebx
  1113                              <1> 	;push	ecx
  1114                              <1> 	;push	edx
  1115 000098A3 50                  <1> 	push	eax
  1116                              <1>            
  1117 000098A4 29C9                <1> 	sub	ecx, ecx
  1118                              <1> 	;sub	eax, eax
  1119 000098A6 B11A                <1> 	mov	cl, 26
  1120                              <1> 
  1121 000098A8 0FB607              <1> 	movzx	eax, byte [edi] ; LDIR_Order
  1122 000098AB 3C41                <1> 	cmp	al, 41h  ; 40h (last long entry sign) + 1
  1123 000098AD 722B                <1> 	jb	short pass_pslnsc_last_long_entry
  1124                              <1> 
  1125 000098AF 88C4                <1> 	mov	ah, al
  1126 000098B1 80EC40              <1> 	sub	ah, 40h
  1127 000098B4 8825[A63A0100]      <1> 	mov	[LFN_EntryLength], ah
  1128                              <1> 	
  1129 000098BA 3C45                <1> 	cmp	al, 45h  ; 40h (last long entry sign) + 5
  1130                              <1>  		; Max 130 byte length is usable in TRDOS
  1131                              <1> ; 26*5 = 130
  1132 000098BC 7753                <1> 	ja	short loc_pslnsc_retn
  1133                              <1> 
  1134 000098BE 2407                <1> 	and	al, 07h ; 0Fh
  1135 000098C0 A2[A53A0100]        <1> 	mov	[LongNameFound], al
  1136                              <1> 
  1137 000098C5 FEC8                <1> 	dec	al
  1138                              <1> 	;mov	cl, 26
  1139 000098C7 F6E1                <1> 	mul	cl
  1140                              <1> 
  1141 000098C9 89C6                <1> 	mov	esi, eax
  1142 000098CB 01CE                <1> 	add	esi, ecx
  1143                              <1> 		; to make is an ASCIZZ string
  1144                              <1> 		; with ax+26 bytes length
  1145 000098CD 81C6[A83A0100]      <1> 	add	esi, LongFileName
  1146 000098D3 66C7060000          <1> 	mov	word [esi], 0   
  1147 000098D8 EB16                <1> 	jmp	short loc_pslsc_move_ldir_name2 
  1148                              <1> 
  1149                              <1> pass_pslnsc_last_long_entry:
  1150 000098DA 3C04                <1> 	cmp	al, 04h
  1151 000098DC 7733                <1> 	ja	short loc_pslnsc_retn
  1152 000098DE FE0D[A53A0100]      <1> 	dec	byte [LongNameFound]
  1153 000098E4 3A05[A53A0100]      <1> 	cmp	al, [LongNameFound]
  1154 000098EA 7525                <1> 	jne	short loc_pslnsc_retn
  1155                              <1> 
  1156                              <1> loc_pslsc_move_ldir_name1:
  1157 000098EC FEC8                <1> 	dec	al
  1158                              <1> 	;mov	cl, 26
  1159 000098EE F6E1                <1> 	mul	cl
  1160                              <1> 
  1161                              <1> loc_pslsc_move_ldir_name2:
  1162 000098F0 8A4F0D              <1> 	mov	cl, [edi+0Dh] ; long name checksum
  1163 000098F3 880D[A73A0100]      <1> 	mov	[LFN_CheckSum], cl 
  1164 000098F9 89FE                <1> 	mov	esi, edi ; LDIR_Order
  1165 000098FB BF[A83A0100]        <1> 	mov	edi, LongFileName
  1166 00009900 01C7                <1> 	add	edi, eax
  1167 00009902 46                  <1> 	inc	esi
  1168 00009903 B105                <1> 	mov	cl, 5 ; chars 1 to 5
  1169 00009905 F366A5              <1> 	rep	movsw
  1170 00009908 83C603              <1> 	add	esi, 3
  1171 0000990B A5                  <1> 	movsd	; char 6 & 7 
  1172 0000990C A5                  <1> 	movsd	; char 8 & 9
  1173 0000990D A5                  <1> 	movsd	; char 10 & 11
  1174 0000990E 46                  <1> 	inc	esi
  1175 0000990F 46                  <1> 	inc	esi 
  1176 00009910 A5                  <1> 	movsd   ; char 12 & 13 
  1177                              <1> 
  1178                              <1> loc_pslnsc_retn:
  1179 00009911 58                  <1>  	pop	eax
  1180                              <1> 	;pop	edx
  1181                              <1> 	;pop	ecx
  1182                              <1> 	;pop	ebx
  1183 00009912 5E                  <1> 	pop	esi  
  1184 00009913 5F                  <1> 	pop	edi
  1185                              <1>  
  1186 00009914 C3                  <1>     	retn
  1187                              <1> 
  1188                              <1> parse_path_name:
  1189                              <1> 	; 10/02/2016
  1190                              <1> 	; 08/02/2016 (TRDOS 386 = TRDOS v2.0)
  1191                              <1> 	; 10/009/2011 ('proc_parse_pathname')
  1192                              <1> 	; 27/11/2009
  1193                              <1> 	; 05/12/2004
  1194                              <1> 	;
  1195                              <1> 	; INPUT ->
  1196                              <1> 	;	ESI = Beginning of ASCIIZ pathname string
  1197                              <1> 	;       EDI = Destination Address
  1198                              <1> 	;	      (which is TR-DOS FindFile data buffer)
  1199                              <1> 	; OUTPUT ->
  1200                              <1> 	;	CF = 1 -> Error
  1201                              <1> 	;	     EAX = Error Code (AL)
  1202                              <1> 	;
  1203                              <1> 	; (Modified registers: eax, ecx, esi, edi) 
  1204                              <1> 	
  1205                              <1> 	; Clear the pathname bytes in TR-DOS Findfile data buffer 
  1206 00009915 57                  <1> 	push	edi
  1207 00009916 B914000000          <1> 	mov	ecx, 20  ; 80 bytes
  1208 0000991B 31C0                <1> 	xor	eax, eax
  1209 0000991D F3AB                <1> 	rep	stosd 
  1210 0000991F 5F                  <1> 	pop	edi
  1211                              <1> 
  1212 00009920 668B06              <1> 	mov	ax, [esi]
  1213 00009923 80FC3A              <1> 	cmp	ah, ':'
  1214 00009926 741C                <1> 	je	short loc_ppn_change_drive
  1215 00009928 A0[A6310100]        <1> 	mov	al, [Current_Drv]
  1216 0000992D EB33                <1> 	jmp	short pass_ppn_change_drive
  1217                              <1> 
  1218                              <1> pass_ppn_cdir:
  1219 0000992F 8B35[CA3B0100]      <1> 	mov	esi, [First_Path_Pos]
  1220 00009935 AC                  <1> 	lodsb
  1221                              <1> loc_ppn_get_filename:
  1222 00009936 83C741              <1> 	add	edi, 65 ; FindFile_Name location
  1223                              <1> 	; TRDOS Filename length must not be more than 12 bytes
  1224                              <1> 	;mov	ecx, 12
  1225 00009939 B10C                <1> 	mov	cl, 12
  1226                              <1> loc_ppn_get_fnchar_next:
  1227 0000993B AA                  <1> 	stosb
  1228 0000993C AC                  <1> 	lodsb
  1229 0000993D 3C21                <1> 	cmp	al, 21h
  1230 0000993F 7274                <1> 	jb	short loc_ppn_clc_return 
  1231 00009941 E2F8                <1>         loop    loc_ppn_get_fnchar_next
  1232                              <1> loc_ppn_return:
  1233 00009943 C3                  <1> 	retn
  1234                              <1> 
  1235                              <1> loc_ppn_change_drive:
  1236 00009944 24DF                <1> 	and	al, 0DFh
  1237 00009946 2C41                <1> 	sub	al, 'A'; A:
  1238 00009948 726F                <1> 	jc	short loc_ppn_invalid_drive
  1239 0000994A 3805[0CED0000]      <1> 	cmp	[Last_DOS_DiskNo], al
  1240 00009950 7267                <1> 	jb	short loc_ppn_invalid_drive
  1241                              <1> 
  1242 00009952 46                  <1> 	inc	esi
  1243 00009953 46                  <1> 	inc	esi
  1244 00009954 8A26                <1> 	mov	ah, [esi]
  1245 00009956 80FC21              <1> 	cmp	ah, 21h
  1246 00009959 7307                <1> 	jnb	short pass_ppn_change_drive
  1247                              <1> 
  1248                              <1> loc_ppn_cmd_failed:
  1249                              <1> 	; File or directory name is not existing
  1250 0000995B 8807                <1> 	mov	[edi], al ; Drv 
  1251 0000995D 66B80100            <1> 	mov	ax, 1 ; eax = 1
  1252                              <1> 	; TR-DOS Error Code 01h = Bad Command Argument
  1253                              <1> 	; MS-DOS Error Code 01h : Invalid Function Number
  1254                              <1> 	;stc
  1255                              <1> 	; (MainProg ErrMsg: "Bad command or file name!")
  1256 00009961 C3                  <1> 	retn
  1257                              <1> 
  1258                              <1> pass_ppn_change_drive:
  1259 00009962 8935[CA3B0100]      <1> 	mov	[First_Path_Pos], esi
  1260 00009968 C705[CE3B0100]0000- <1> 	mov	dword [Last_Slash_Pos], 0
  1260 00009970 0000                <1>
  1261 00009972 AA                  <1> 	stosb
  1262 00009973 8A06                <1> 	mov	al, [esi]
  1263                              <1> loc_scan_ppn_dslash:
  1264 00009975 3C2F                <1> 	cmp	al, '/'
  1265 00009977 7506                <1>   	jne	short loc_scan_next_slash_pos
  1266 00009979 8935[CE3B0100]      <1> 	mov	[Last_Slash_Pos], esi
  1267                              <1> loc_scan_next_slash_pos:
  1268 0000997F 46                  <1> 	inc	esi
  1269 00009980 8A06                <1> 	mov	al, [esi]
  1270 00009982 3C20                <1> 	cmp	al, 20h
  1271 00009984 77EF                <1> 	ja	short loc_scan_ppn_dslash
  1272 00009986 833D[CE3B0100]00    <1> 	cmp	dword [Last_Slash_Pos], 0
  1273 0000998D 76A0                <1> 	jna	short pass_ppn_cdir
  1274                              <1> 	
  1275 0000998F 8B0D[CE3B0100]      <1> 	mov	ecx, [Last_Slash_Pos]
  1276 00009995 8B35[CA3B0100]      <1> 	mov	esi, [First_Path_Pos]
  1277 0000999B 29F1                <1> 	sub	ecx, esi
  1278 0000999D 41                  <1> 	inc	ecx
  1279                              <1> 	;cmp	ecx, 64
  1280 0000999E 80F940              <1> 	cmp	cl, 64
  1281 000099A1 7715                <1> 	ja	short loc_ppn_invalid_drive_stc
  1282                              <1> 
  1283 000099A3 89F8                <1> 	mov	eax, edi ; Dest Dir String Location (65 byte)
  1284 000099A5 F3A4                <1> 	rep	movsb
  1285                              <1> 	;mov	[edi], cl ; 0, End of Dir String
  1286 000099A7 8B35[CE3B0100]      <1> 	mov	esi, [Last_Slash_Pos]
  1287 000099AD 46                  <1> 	inc	esi
  1288 000099AE 89C7                <1> 	mov	edi, eax
  1289 000099B0 AC                  <1> 	lodsb
  1290 000099B1 3C21                <1> 	cmp	al, 21h
  1291 000099B3 7381                <1> 	jnb	short loc_ppn_get_filename
  1292                              <1> loc_ppn_clc_return:
  1293                              <1> 	;clc
  1294 000099B5 31C0                <1> 	xor	eax, eax
  1295 000099B7 C3                  <1> 	retn
  1296                              <1> 
  1297                              <1> loc_ppn_invalid_drive_stc:
  1298 000099B8 F5                  <1> 	cmc	 ; stc
  1299                              <1> loc_ppn_invalid_drive:
  1300                              <1> 	; cf = 1
  1301                              <1> 	; The Drive Letter/Char < "A" or > "Z"
  1302 000099B9 66B80F00            <1> 	mov	ax, 0Fh
  1303                              <1> 	; MS-DOS Error Code 0Fh = Disk Drive Invalid 
  1304                              <1> 	; (MainProg ErrMsg: "Drive not ready or read error!")
  1305 000099BD C3                  <1> 	retn
  1306                              <1> 
  1307                              <1> find_longname:
  1308                              <1> 	; 13/02/2016 (TRDOS 386 = TRDOS v2.0)
  1309                              <1> 	; 24/01/2010 (DIR.ASM, 'proc_find_longname')
  1310                              <1> 	; 17/10/2009
  1311                              <1> 	
  1312                              <1> 	; INPUT -> 
  1313                              <1> 	;	ESI = DOS short file name address
  1314                              <1> 	; 	for example: "filename.ext"
  1315                              <1> 	;
  1316                              <1> 	; OUTPUT ->
  1317                              <1> 	; 	ESI = ASCIIZ longname address (cf = 0)
  1318                              <1> 	;	cf = 1 -> error number returns in EAX (AL)
  1319                              <1> 	;	AL = 0 & CF=1 -> longname not found
  1320                              <1> 	;	     the file/directory has no longname
  1321                              <1> 	; 	cf = 0 -> AL = FAT Type 
  1322                              <1>  
  1323                              <1> 	; 17/10/2009
  1324                              <1> 	; ASCIIZ string will be returned
  1325                              <1> 	; as LongFileName
  1326                              <1> 	; clearing/reset is not needed
  1327                              <1> 	;mov	ecx, 33
  1328                              <1> 	;mov	edi, LongFileName
  1329                              <1> 	;sub	ax, ax ; 0
  1330                              <1> 	;rep	stosw
  1331                              <1> 
  1332                              <1> 	;mov	byte [LongNameFound], 0
  1333                              <1> 
  1334                              <1> 	; ESI = ASCIIZ file/directory name address
  1335                              <1> 	;   AL = Attributes AND mask 
  1336                              <1> 	;	(Result of AND must be equal to AL)
  1337                              <1> 	;   AH = Negative attributes mask 
  1338                              <1> 	;	(Result of AND must be ZERO)
  1339 000099BE 66B80008            <1> 	mov	ax, 0800h 
  1340                              <1> 		; it must not be volume name or longname
  1341 000099C2 E837DDFFFF          <1> 	call	find_first_file
  1342 000099C7 7216                <1> 	jc	short loc_fln_retn
  1343                              <1>  
  1344                              <1> loc_fln_check_FAT_Type:
  1345 000099C9 803D[A5310100]01    <1> 	cmp	byte [Current_FATType], 1
  1346 000099D0 7306                <1> 	jnb	short loc_fln_check_longname_yes_sign
  1347                              <1> 
  1348 000099D2 E839000000          <1> 	call	get_fs_longname
  1349 000099D7 C3                  <1> 	retn
  1350                              <1> 
  1351                              <1> loc_fln_check_longname_yes_sign:
  1352 000099D8 08FF                <1> 	or	bh, bh
  1353 000099DA 7504                <1> 	jnz	short loc_fln_check_longnamefound_number
  1354                              <1> loc_fln_longname_not_found_retn:
  1355 000099DC 31C0                <1> 	xor	eax, eax 
  1356                              <1> 	; cf = 1 & al = 0 -> longname not found
  1357 000099DE F9                  <1> 	stc
  1358                              <1> loc_fln_retn:
  1359 000099DF C3                  <1> 	retn
  1360                              <1> 
  1361                              <1> loc_fln_check_longnamefound_number:
  1362                              <1> 	; 'LongNameFound' is set by
  1363                              <1>         ; by 'save_longname_sub_component'
  1364                              <1> 	; which is called from
  1365                              <1> 	; 'find_directory_entry' 
  1366                              <1> 	; which is called from 
  1367                              <1> 	; 'find_first_file'
  1368                              <1> 	; It must 1 if the longname is valid
  1369 000099E0 803D[A53A0100]01    <1>         cmp     byte [LongNameFound], 1
  1370 000099E7 75F3                <1> 	jne	short loc_fln_longname_not_found_retn
  1371                              <1>              
  1372                              <1> loc_fln_calculate_checksum: 
  1373 000099E9 E813000000          <1> 	call	calculate_checksum
  1374                              <1> 	; AL = shortname checksum
  1375                              <1> 
  1376                              <1> loc_fln_longname_validation:
  1377                              <1> 	; 'LFN_CheckSum' has been set already
  1378                              <1> 	; by 'save_longname_sub_component'
  1379                              <1> 	; which is called from
  1380                              <1> 	; 'find_directory_entry' 
  1381                              <1> 	; which is called from 
  1382                              <1> 	; 'find_first_file'
  1383 000099EE 3805[A73A0100]      <1> 	cmp	[LFN_CheckSum], al
  1384 000099F4 75E6                <1> 	jne	short loc_fln_longname_not_found_retn
  1385                              <1> 
  1386 000099F6 BE[A83A0100]        <1> 	mov	esi, LongFileName
  1387 000099FB A0[A5310100]        <1> 	mov	al, [Current_FATType]
  1388 00009A00 C3                  <1> 	retn
  1389                              <1> 
  1390                              <1> calculate_checksum:
  1391                              <1> 	; 13/02/2016 (TRDOS 386 = TRDOS v2.0)
  1392                              <1> 	; 17/10/2009 (DIR.ASM, 'proc_calculate_checksum')
  1393                              <1>         ;    
  1394                              <1> 	; INPUT ->
  1395                              <1> 	;	ESI = 11 byte DOS File Name location
  1396                              <1> 	;	(in DOS Directory Entry Format)
  1397                              <1> 	; OUTPUT ->
  1398                              <1> 	;	 AL = 8 bit checksum (CRC) value
  1399                              <1> 	;
  1400                              <1> 	; (Modified registers: EAX, ECX, ESI)
  1401                              <1> 
  1402                              <1> 	; Erdogan Tan [ 17-10-2009 ]
  1403                              <1> 	;  'ror al, 1' instruction
  1404                              <1> 
  1405                              <1> 	; Erdogan Tan [ 20-06-2004 ]
  1406                              <1> 	; This 8086 assembly code is an original code
  1407                              <1> 	; which is adapted from C code in
  1408                              <1> 	; Microsoft FAT32 File System Specification
  1409                              <1> 	; Version 1.03, December 6, 2000
  1410                              <1> 	; Page 28
  1411                              <1> 
  1412 00009A01 30C0                <1> 	xor	al, al
  1413 00009A03 B90B000000          <1> 	mov	ecx, 11
  1414                              <1> loc_next_sum:
  1415                              <1> 	;xor	ah, ah
  1416                              <1> 	;test	al, 1
  1417                              <1> 	;jz	short pass_ah_80h
  1418                              <1> 	;mov	ah, 80h
  1419                              <1> ;pass_ah_80h:
  1420                              <1> 	;shr	al, 1
  1421 00009A08 D0C8                <1> 	ror	al, 1 ; 17/10/2009  
  1422 00009A0A 0206                <1> 	add	al, [esi]
  1423 00009A0C 46                  <1> 	inc	esi
  1424                              <1> 	;add	al, ah
  1425 00009A0D E2F9                <1> 	loop	loc_next_sum
  1426 00009A0F C3                  <1> 	retn
  1427                              <1> 
  1428                              <1> get_fs_longname:
  1429                              <1> 	; temporary (13/02/2016)
  1430 00009A10 31C0                <1> 	xor eax, eax
  1431 00009A12 F9                  <1> 	stc
  1432 00009A13 C3                  <1> 	retn
  1433                              <1> 
  1434                              <1> make_sub_directory:
  1435                              <1> 	; 16/10/2016
  1436                              <1> 	; 02/03/2016, 03/03/2016
  1437                              <1> 	; 26/02/2016, 27/02/2016
  1438                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  1439                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_make_directory')
  1440                              <1> 	; 10/07/2010
  1441                              <1> 	; INPUT ->
  1442                              <1> 	; 	ESI = ASCIIZ Directory Name
  1443                              <1> 	;	CL = Directory Attributes
  1444                              <1> 	; OUTPUT ->
  1445                              <1> 	;	EAX = New sub dir's first cluster
  1446                              <1> 	;	ESI = Logical Dos Drv Descr. Table Addr.
  1447                              <1> 	;	CF = 1 -> error code in AL (EAX)
  1448                              <1> 
  1449                              <1> 	;test	cl, 10h  ; directory
  1450                              <1> 	;jz	short loc_make_directory_access_denied
  1451                              <1> 	;test	cl, 08h ; volume name
  1452                              <1> 	;jnz	short loc_make_directory_access_denied
  1453                              <1> 
  1454 00009A14 80E107              <1> 	and	cl, 07h
  1455 00009A17 880D[243C0100]      <1> 	mov	byte [mkdir_attrib], cl
  1456                              <1> 
  1457 00009A1D 56                  <1> 	push	esi
  1458 00009A1E 31DB                <1> 	xor	ebx, ebx
  1459 00009A20 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
  1460 00009A26 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1461 00009A2B 01DE                <1> 	add	esi, ebx
  1462 00009A2D 5B                  <1> 	pop	ebx
  1463                              <1> 
  1464                              <1> 	; 10/07/2010 -> 1st writable disk check for trdos
  1465                              <1> 	; LD_DiskType = 0 for write protection (read only) 
  1466 00009A2E 807E0101            <1> 	cmp	byte [esi+LD_DiskType], 1 ; 0 = Invalid
  1467 00009A32 730B                <1> 	jnb	short loc_mkdir_check_file_sytem
  1468                              <1> 	; 16/10/2016 (13h -> 30)
  1469 00009A34 B81E000000          <1> 	mov	eax, 30 ; 'Disk write-protected' error
  1470 00009A39 BA00000000          <1> 	mov	edx, 0
  1471                              <1> 	; err retn: EDX = 0, EBX = Dir name offset
  1472                              <1> 	;ESI = Logical DOS drive description table address
  1473 00009A3E C3                  <1> 	retn
  1474                              <1> 
  1475                              <1> ;loc_make_directory_access_denied:
  1476                              <1> 	;mov	ax, 05h ; access denied (invalid attributes input)
  1477                              <1> 	;stc
  1478                              <1> 	;retn
  1479                              <1> 
  1480                              <1> loc_mkdir_check_file_sytem:
  1481 00009A3F 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  1482 00009A43 730B                <1> 	jnb	short loc_mkdir_check_free_sectors
  1483                              <1> 
  1484                              <1> loc_make_fs_directory:
  1485 00009A45 A1[A0310100]        <1> 	mov	eax, [Current_Dir_FCluster]
  1486                              <1> 	; EAX = Parent directory DDT Address
  1487                              <1> 	; ESI = Logical DOS Drive DT Address
  1488                              <1> 	; EBX = Directory name offset (as ASCIIZ name)
  1489 00009A4A E8D8150000          <1> 	call	make_fs_directory
  1490 00009A4F C3                  <1> 	retn
  1491                              <1> 
  1492                              <1> loc_mkdir_check_free_sectors:
  1493 00009A50 0FB64613            <1>         movzx   eax, byte [esi+LD_BPB+SecPerClust]
  1494 00009A54 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  1495 00009A57 39C1                <1> 	cmp	ecx, eax
  1496 00009A59 7255                <1> 	jb	short loc_mkdir_insufficient_disk_space
  1497                              <1> 
  1498                              <1> loc_make_fat_directory:
  1499 00009A5B 891D[143C0100]      <1> 	mov	[mkdir_DirName_Offset], ebx
  1500 00009A61 890D[203C0100]      <1> 	mov	[mkdir_FreeSectors], ecx
  1501                              <1> 
  1502                              <1> 	;mov	al, [esi+LD_BPB+SecPerClust]
  1503 00009A67 A2[263C0100]        <1> 	mov	byte [mkdir_SecPerClust], al
  1504                              <1> 
  1505                              <1> loc_mkdir_gffc_1:
  1506 00009A6C E812180000          <1> 	call	get_first_free_cluster
  1507 00009A71 722A                <1> 	jc	short loc_mkdir_gffc_retn
  1508                              <1> 
  1509                              <1> ;loc_mkdir_gffc_1_cont: 
  1510                              <1> 	;cmp	eax, 2
  1511                              <1> 	;jb	short loc_mkdir_gffc_insufficient_disk_space
  1512                              <1> 
  1513                              <1> ;loc_mkdir_gffc_1_save_fcluster:  
  1514 00009A73 A3[183C0100]        <1> 	mov	[mkdir_FFCluster], eax
  1515                              <1> 
  1516                              <1> loc_mkdir_locate_ffe:
  1517                              <1> 	; Current directory fcluster <> Directory buffer cluster
  1518                              <1> 	; Current directory will be reloaded by
  1519                              <1> 	; 'locate_current_dir_file' procedure
  1520                              <1> 	;
  1521                              <1> 	; ESI = Logical DOS Drive Description Table Address 
  1522                              <1> 	;push	esi ; 27/02/2016
  1523 00009A78 31C0                <1> 	xor	eax, eax
  1524 00009A7A 89C1                <1>         mov	ecx, eax
  1525 00009A7C 6649                <1> 	dec	cx ; FFFFh  
  1526                              <1> 	; CX = FFFFh -> find first deleted or free entry
  1527                              <1> 	; ESI would be ASCIIZ filename address if the call
  1528                              <1> 	; would not be for first free or deleted dir entry
  1529 00009A7E E8D2FAFFFF          <1> 	call	locate_current_dir_file
  1530 00009A83 734C                <1> 	jnc	short loc_mkdir_set_ff_dir_entry_1
  1531                              <1> 	;pop	esi 
  1532                              <1> 	; ESI = Logical DOS Drive Description Table Address 
  1533 00009A85 83F802              <1> 	cmp	eax, 2  ; cmp al, 2 ; File/Dir not found !
  1534 00009A88 752B                <1> 	jne	short loc_mkdir_stc_return
  1535                              <1> 
  1536                              <1> loc_mkdir_add_new_cluster:
  1537 00009A8A 3805[A5310100]      <1> 	cmp	byte [Current_FATType], al ; 2
  1538                              <1> 	;cmp	byte ptr [esi+LD_FATType], 2
  1539 00009A90 770C                <1> 	ja	short loc_mkdir_add_new_cluster_check_fsc
  1540 00009A92 803D[A4310100]01    <1> 	cmp	byte [Current_Dir_Level], 1
  1541                              <1> 	;cmp	byte [esi+LD_CDirLevel], 1
  1542 00009A99 7303                <1> 	jnb	short loc_mkdir_add_new_cluster_check_fsc
  1543                              <1> 
  1544 00009A9B B00C                <1> 	mov	al, 12 ; No more files 
  1545                              <1> loc_mkdir_gffc_retn:
  1546 00009A9D C3                  <1> 	retn
  1547                              <1> 
  1548                              <1> loc_mkdir_add_new_cluster_check_fsc:
  1549 00009A9E 8B0D[203C0100]      <1> 	mov	ecx, [mkdir_FreeSectors]
  1550                              <1> 	;movzx	eax, byte [mkdir_SecPerClust]
  1551 00009AA4 A0[263C0100]        <1> 	mov	al, [mkdir_SecPerClust]
  1552 00009AA9 66D1E0              <1> 	shl	ax, 1 ; AX = 2 * AX
  1553 00009AAC 39C1                <1> 	cmp	ecx, eax
  1554 00009AAE 7350                <1> 	jnb	short loc_mkdir_add_new_subdir_cluster
  1555                              <1> 
  1556                              <1> loc_mkdir_insufficient_disk_space:
  1557                              <1> 	;mov	edx, ecx
  1558                              <1> ;loc_mkdir_gffc_insufficient_disk_space:
  1559 00009AB0 66B82700            <1> 	mov	ax, 27h ; MSDOS err => insufficient disk space
  1560                              <1> 	; err retn: EDX = Free sectors, EBX = Dir name offset
  1561                              <1>         ; ESI -> Dos drive description table address
  1562                              <1> 	;; ecx = edx
  1563                              <1> 	;
  1564 00009AB4 C3                  <1> 	retn
  1565                              <1> 
  1566                              <1> loc_mkdir_stc_return:
  1567 00009AB5 F9                  <1> 	stc
  1568 00009AB6 C3                  <1> 	retn 
  1569                              <1> 
  1570                              <1> loc_mkdir_gffc_2:
  1571 00009AB7 E8C7170000          <1> 	call	get_first_free_cluster
  1572 00009ABC 72DF                <1> 	jc	short loc_mkdir_gffc_retn
  1573                              <1> 
  1574                              <1> ;loc_mkdir_gffc_1_cont: 
  1575                              <1> 	;cmp	eax, 2
  1576                              <1> 	;jb	short loc_mkdir_gffc_insufficient_disk_space
  1577                              <1> 
  1578                              <1> ;loc_mkdir_gffc_2_save_fcluster:  
  1579 00009ABE A3[183C0100]        <1> 	mov	[mkdir_FFCluster], eax
  1580                              <1> 
  1581 00009AC3 A1[1C3C0100]        <1> 	mov	eax, [mkdir_LastDirCluster]
  1582                              <1> 
  1583 00009AC8 E845170000          <1> 	call	load_FAT_sub_directory 
  1584 00009ACD 72CE                <1> 	jc	short loc_mkdir_gffc_retn
  1585                              <1> 
  1586 00009ACF 31FF                <1> 	xor	edi, edi
  1587                              <1> loc_mkdir_set_ff_dir_entry_1:
  1588                              <1> 	; 27/02/2016
  1589 00009AD1 56                  <1> 	push	esi ; Logical DOS Drv Desc. Tbl. address
  1590                              <1> 	; EDI = Directory Entry Address
  1591 00009AD2 8B35[143C0100]      <1> 	mov	esi, [mkdir_DirName_Offset]
  1592 00009AD8 A1[183C0100]        <1> 	mov	eax, [mkdir_FFCluster]
  1593                              <1> 
  1594 00009ADD 66B91000            <1> 	mov	cx, 10h	; CL = Directory attribute
  1595                              <1> 			; CH = 0 -> File size is 0
  1596 00009AE1 0A0D[243C0100]      <1> 	or	cl, [mkdir_attrib] ; S, H, R  
  1597 00009AE7 E8B0010000          <1> 	call	make_directory_entry
  1598                              <1> 
  1599 00009AEC 5E                  <1> 	pop	esi
  1600                              <1> 
  1601 00009AED C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1602 00009AF4 E880020000          <1> 	call	save_directory_buffer
  1603 00009AF9 0F83DA000000        <1>         jnc     loc_mkdir_set_ff_dir_entry_2
  1604                              <1> 
  1605                              <1> loc_mkdir_return:
  1606 00009AFF C3                  <1> 	retn
  1607                              <1> 
  1608                              <1> loc_mkdir_add_new_subdir_cluster:
  1609 00009B00 8B15[D5390100]      <1> 	mov	edx, [DirBuff_Cluster]
  1610 00009B06 8915[1C3C0100]      <1> 	mov	[mkdir_LastDirCluster], edx       
  1611                              <1> 
  1612 00009B0C A1[183C0100]        <1> 	mov	eax, [mkdir_FFCluster]
  1613 00009B11 E8FC160000          <1> 	call	load_FAT_sub_directory 
  1614 00009B16 72E7                <1> 	jc	short loc_mkdir_return
  1615                              <1> 	; eax = 0
  1616                              <1> 	; ecx =  directory buffer sector count (<= 128)
  1617                              <1> 
  1618                              <1> pass_mkdir_add_new_subdir_cluster:
  1619 00009B18 29FF                <1> 	sub	edi, edi ; 0
  1620                              <1> 	;mov	al, 128 ; double word
  1621                              <1> 	;mul	ecx ; ecx =  directory buffer sector count
  1622                              <1> 	;mov	ecx, eax
  1623                              <1> 	;shl	cx, 7 ; 128 * sector count	
  1624 00009B1A 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec] ; 512
  1625 00009B1E 66C1E802            <1> 	shr	ax, 2 ; 'byte count / 4' for 'stosd'
  1626 00009B22 66F7E1              <1> 	mul	cx ; max = 128*(512/4) -> 16384 (stosd)
  1627 00009B25 6689C1              <1> 	mov	cx, ax
  1628 00009B28 6629C0              <1> 	sub	ax, ax ; 0
  1629 00009B2B F3AB                <1> 	rep	stosd ; clear directory buffer
  1630                              <1> 
  1631 00009B2D C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1632 00009B34 E840020000          <1> 	call	save_directory_buffer 
  1633 00009B39 72C4                <1> 	jc	short loc_mkdir_return
  1634                              <1> 
  1635                              <1> loc_mkdir_save_added_cluster:
  1636 00009B3B A1[1C3C0100]        <1> 	mov	eax, [mkdir_LastDirCluster]
  1637 00009B40 8B0D[183C0100]      <1> 	mov	ecx, [mkdir_FFCluster]
  1638                              <1> 	; 01/03/2016
  1639 00009B46 31D2                <1> 	xor	edx, edx
  1640 00009B48 8915[C6390100]      <1> 	mov	[FAT_ClusterCounter], edx ; 0 ; reset
  1641 00009B4E E803180000          <1> 	call	update_cluster
  1642 00009B53 7304                <1> 	jnc	short loc_mkdir_save_fat_buffer_0
  1643 00009B55 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1644 00009B57 7518                <1> 	jnz	short loc_mkdir_save_fat_buffer_stc_retn
  1645                              <1> 
  1646                              <1> loc_mkdir_save_fat_buffer_0:
  1647 00009B59 A1[183C0100]        <1> 	mov	eax, [mkdir_FFCluster]
  1648 00009B5E A3[1C3C0100]        <1> 	mov	[mkdir_LastDirCluster], eax
  1649                              <1> 
  1650 00009B63 31C9                <1> 	xor	ecx, ecx
  1651 00009B65 49                  <1> 	dec	ecx ; FFFFFFFFh
  1652                              <1> 	; ESI = Logical DOS Drive Description Table address 
  1653 00009B66 E8EB170000          <1> 	call	update_cluster
  1654 00009B6B 731A                <1> 	jnc	short loc_mkdir_save_fat_buffer_1
  1655 00009B6D 09C0                <1> 	or	eax, eax
  1656 00009B6F 7416                <1> 	jz	short loc_mkdir_save_fat_buffer_1
  1657                              <1> 
  1658                              <1> loc_mkdir_save_fat_buffer_stc_retn:
  1659                              <1> 	; 01/03/2016
  1660 00009B71 803D[C6390100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  1661 00009B78 720C                <1> 	jb	short loc_mkdir_save_fat_buffer_retn
  1662                              <1> 
  1663 00009B7A 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space (BL = 0)
  1664                              <1> 			   ; (BH = FFh -> Use ESI as Drv Param. Tbl.)
  1665 00009B7E 50                  <1> 	push	eax
  1666 00009B7F E8241B0000          <1> 	call	calculate_fat_freespace
  1667 00009B84 58                  <1> 	pop	eax
  1668 00009B85 F9                  <1> 	stc
  1669                              <1> loc_mkdir_save_fat_buffer_retn:
  1670 00009B86 C3                  <1> 	retn
  1671                              <1> 
  1672                              <1> loc_mkdir_save_fat_buffer_1:
  1673                              <1> 	; byte [FAT_BuffValidData] = 2 
  1674 00009B87 E8871A0000          <1> 	call	save_fat_buffer
  1675 00009B8C 72E3                <1> 	jc	short loc_mkdir_save_fat_buffer_stc_retn
  1676                              <1> 
  1677                              <1> 	; 01/03/2016
  1678 00009B8E 803D[C6390100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  1679 00009B95 721B                <1> 	jb	short loc_mkdir_save_fat_buffer_2
  1680                              <1> 
  1681                              <1> 	; ESI = Logical DOS Drive Description Table address 
  1682 00009B97 A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter]
  1683 00009B9C 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  1684 00009BA0 E8031B0000          <1> 	call	calculate_fat_freespace
  1685                              <1> 
  1686                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  1687                              <1> 	;jnz	short loc_mkdir_save_fat_buffer_2
  1688                              <1> 
  1689                              <1> 	; ecx > 0 -> Recalculation is needed
  1690 00009BA5 09C9                <1> 	or	ecx, ecx 
  1691 00009BA7 7409                <1> 	jz	short loc_mkdir_save_fat_buffer_2
  1692                              <1> 
  1693 00009BA9 66BB00FF            <1> 	mov	bx, 0FF00h ; ; recalculate free space
  1694 00009BAD E8F61A0000          <1> 	call	calculate_fat_freespace
  1695                              <1> 
  1696                              <1> loc_mkdir_save_fat_buffer_2:
  1697 00009BB2 C605[273C0100]01    <1> 	mov	byte [mkdir_add_new_cluster], 1
  1698 00009BB9 E9C4000000          <1> 	jmp	loc_mkdir_upd_parent_dir_lmdt
  1699                              <1> 
  1700                              <1> loc_mkdir_update_sub_dir_cluster:
  1701 00009BBE A1[183C0100]        <1> 	mov	eax, [mkdir_FFCluster]
  1702 00009BC3 29C9                <1> 	sub	ecx, ecx ; 0
  1703                              <1> 	; 01/03/2016
  1704 00009BC5 890D[C6390100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; Reset
  1705 00009BCB 49                  <1> 	dec	ecx ; 0FFFFFFFFh
  1706                              <1> 
  1707                              <1> 	; ESI = Logical DOS Drive Descisption Table address  
  1708 00009BCC E885170000          <1> 	call	update_cluster
  1709 00009BD1 7379                <1> 	jnc	short loc_mkdir_save_fat_buffer_3
  1710 00009BD3 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1711 00009BD5 7475                <1> 	jz	short loc_mkdir_save_fat_buffer_3
  1712                              <1> 	; 01/03/2016
  1713 00009BD7 EB98                <1> 	jmp	short loc_mkdir_save_fat_buffer_stc_retn
  1714                              <1> 
  1715                              <1> loc_mkdir_set_ff_dir_entry_2:
  1716                              <1> 	; ESI = Logical DOS Drive Description Table address  
  1717 00009BD9 A1[183C0100]        <1> 	mov	eax, [mkdir_FFCluster]
  1718                              <1> 	; Load disk sectors as a directory cluster
  1719 00009BDE E82F160000          <1> 	call	load_FAT_sub_directory 
  1720 00009BE3 7266                <1> 	jc	short retn_make_fat_directory
  1721                              <1> 	
  1722                              <1> 	; eax = 0
  1723                              <1> 	; ecx =  directory buffer sector count (<= 128)
  1724                              <1> 
  1725 00009BE5 BF40000800          <1> 	mov	edi, Directory_Buffer + 64 ; 26/02/2016
  1726                              <1> 
  1727                              <1> 	; 02/03/2016
  1728 00009BEA 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec] ; 512
  1729 00009BEE 66C1E802            <1> 	shr	ax, 2 ; 'byte count / 4' for 'stosd'
  1730 00009BF2 F7E1                <1> 	mul 	ecx
  1731 00009BF4 89C1                <1> 	mov	ecx, eax
  1732 00009BF6 6629C0              <1> 	sub	ax, ax
  1733 00009BF9 F3AB                <1> 	rep	stosd
  1734                              <1> 
  1735                              <1> 	;;mov	al, 128 ; double word
  1736                              <1> 	;;mul	ecx ; ecx =  directory buffer sector count
  1737                              <1> 	;;mov	ecx, eax
  1738                              <1> 	;shl	cx, 7 ; 128 * sector count	
  1739                              <1> 	;;sub	eax, eax
  1740                              <1> 	;;sub	al, al ; 0
  1741                              <1> 	;rep	stosd ; clear directory buffer
  1742                              <1> 
  1743 00009BFB BF00000800          <1> 	mov	edi, Directory_Buffer ; 26/02/2016
  1744                              <1> 	
  1745 00009C00 56                  <1> 	push	esi
  1746                              <1> 
  1747 00009C01 BE[283C0100]        <1> 	mov	esi, mkdir_Name
  1748 00009C06 66C7062E00          <1> 	mov	word [esi], 2Eh ; db '.', '0'
  1749                              <1> 
  1750 00009C0B A1[183C0100]        <1> 	mov	eax, [mkdir_FFCluster]
  1751 00009C10 66B91000            <1> 	mov	cx, 10h ; CL = Directory attribute
  1752                              <1> 			; CH = 0 -> File size is 0
  1753 00009C14 E883000000          <1> 	call	make_directory_entry
  1754                              <1> 
  1755 00009C19 BF20000800          <1> 	mov	edi, Directory_Buffer + 32 ; 26/02/2016
  1756                              <1> 
  1757                              <1> 	; 03/03/2016
  1758                              <1> 	; Following modification has been done according to 
  1759                              <1> 	; 'Microsoft Extensible Firmware Initiative
  1760                              <1> 	; FAT32 File System Specification' document,
  1761                              <1> 	; 'FAT: General Overview of On-Disk FormatPage 25'.
  1762                              <1> 	; "Finally, you set DIR_FstClusLO and DIR_FstClusHI
  1763                              <1> 	; for the dotdot entry (the second entry) to the
  1764                              <1> 	; first cluster number of the directory in which you 
  1765                              <1> 	; just created the directory (value is 0 if this directory
  1766                              <1> 	; is the root directory even for FAT32 volumes)."
  1767                              <1> 	; (Correctness of this modification has been verified
  1768                              <1> 	;  by using Windows 98 'scandisk.exe'.)
  1769                              <1> 
  1770 00009C1E 29C0                <1> 	sub	eax, eax
  1771 00009C20 3805[A4310100]      <1> 	cmp	byte [Current_Dir_Level], al ; 0
  1772 00009C26 7605                <1> 	jna	short loc_mkdir_set_ff_dir_entry_3
  1773 00009C28 A1[A0310100]        <1> 	mov	eax, [Current_Dir_FCluster] ; parent dir
  1774                              <1> loc_mkdir_set_ff_dir_entry_3:
  1775 00009C2D 66C746012E00        <1> 	mov	word [esi+1], 2Eh ; db '.', '0'
  1776                              <1> 
  1777                              <1> 	;mov	cx, 10h
  1778 00009C33 E864000000          <1> 	call	make_directory_entry
  1779                              <1> 
  1780 00009C38 5E                  <1> 	pop	esi
  1781                              <1> 
  1782 00009C39 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1783 00009C40 E834010000          <1> 	call	save_directory_buffer
  1784 00009C45 0F8373FFFFFF        <1>         jnc     loc_mkdir_update_sub_dir_cluster
  1785                              <1>  
  1786                              <1> retn_make_fat_directory:
  1787 00009C4B C3                  <1> 	retn
  1788                              <1> 
  1789                              <1> loc_mkdir_save_fat_buffer_3:
  1790                              <1> 	; 01/03/2016
  1791                              <1> 	; byte [FAT_BuffValidData] = 2 
  1792 00009C4C E8C2190000          <1> 	call	save_fat_buffer
  1793 00009C51 0F821AFFFFFF        <1>         jc      loc_mkdir_save_fat_buffer_stc_retn
  1794                              <1> 
  1795 00009C57 803D[C6390100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  1796 00009C5E 721B                <1> 	jb	short loc_mkdir_save_fat_buffer_4
  1797                              <1> 
  1798                              <1> 	; ESI = Logical DOS Drive Description Table address 
  1799 00009C60 A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter]
  1800 00009C65 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  1801 00009C69 E83A1A0000          <1> 	call	calculate_fat_freespace
  1802                              <1> 
  1803                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  1804                              <1>         ;jnz    short loc_mkdir_save_fat_buffer_4
  1805                              <1> 
  1806                              <1> 	; ecx > 0 -> Recalculation is needed
  1807 00009C6E 09C9                <1> 	or	ecx, ecx 
  1808 00009C70 7409                <1>         jz      short loc_mkdir_save_fat_buffer_4
  1809                              <1> 
  1810 00009C72 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space
  1811 00009C76 E82D1A0000          <1> 	call	calculate_fat_freespace
  1812                              <1> 
  1813                              <1> loc_mkdir_save_fat_buffer_4:	
  1814 00009C7B C605[273C0100]00    <1> 	mov	byte [mkdir_add_new_cluster], 0
  1815                              <1> 
  1816                              <1> loc_mkdir_upd_parent_dir_lmdt:
  1817 00009C82 E88D010000          <1> 	call	update_parent_dir_lmdt
  1818                              <1> 
  1819                              <1> 	; 01/03/2016
  1820 00009C87 803D[273C0100]00    <1> 	cmp	byte [mkdir_add_new_cluster], 0
  1821 00009C8E 0F8723FEFFFF        <1>         ja      loc_mkdir_gffc_2
  1822                              <1> 
  1823                              <1> loc_mkdir_retn_new_dir_cluster:
  1824 00009C94 A1[183C0100]        <1> 	mov	eax, [mkdir_FFCluster]
  1825 00009C99 31D2                <1> 	xor	edx, edx
  1826                              <1> loc_mkdir_retn:
  1827 00009C9B C3                  <1> 	retn
  1828                              <1> 
  1829                              <1> make_directory_entry:
  1830                              <1> 	; 02/03/2016
  1831                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  1832                              <1> 	; 09/08/2010 (DIR.ASM, 'proc_make_directory_entry')
  1833                              <1> 	; 17/07/2010
  1834                              <1> 	; INPUT ->
  1835                              <1> 	; 	EDI = Directory Entry Address
  1836                              <1> 	;	ESI = Dot File Name Location
  1837                              <1> 	;	EAX = First Cluster
  1838                              <1> 	;	File Size = 0 (Must be set later)
  1839                              <1> 	;	CL = Attributes
  1840                              <1> 	;	CH = 0 (File size = 0) 
  1841                              <1> 	;	(If CH>0, File size is in dword [EBX]) (*)
  1842                              <1> 	; OUTPUT -> 
  1843                              <1> 	;	EDI = Directory Entry Address
  1844                              <1> 	;	ESI = Dot File Name Location (Capitalized)
  1845                              <1> 	;	If CH input = 0, File Size = 0
  1846                              <1> 	;	Otherwise file size is as dword [EBX] (*)
  1847                              <1> 	;	DX = Date, AX = Time in DOS Dir Entry format
  1848                              <1> 	;	EBX = same
  1849                              <1> 	;	ECX = same
  1850                              <1> 
  1851 00009C9C 51                  <1> 	push	ecx
  1852                              <1> 
  1853 00009C9D 884F0B              <1> 	mov	[edi+11], cl ; Attributes
  1854 00009CA0 6689471A            <1> 	mov	[edi+26], ax ; FClusterLw, 26
  1855 00009CA4 C1E810              <1> 	shr	eax, 16
  1856 00009CA7 66894714            <1> 	mov	[edi+20], ax ; FClusterHw, 20
  1857 00009CAB 6631C0              <1> 	xor	ax, ax 
  1858 00009CAE 6689470C            <1> 	mov	[edi+12], ax ; NTReserved, 12
  1859                              <1> 			     ; CrtTimeTenth, 13
  1860 00009CB2 08ED                <1> 	or	ch, ch
  1861 00009CB4 7402                <1> 	jz	short loc_make_direntry_set_filesize
  1862                              <1> 
  1863 00009CB6 8B03                <1> 	mov	eax, [ebx]
  1864                              <1>         
  1865                              <1> loc_make_direntry_set_filesize:
  1866 00009CB8 89471C              <1> 	mov	[edi+28], eax ; FileSize, 28
  1867                              <1> 	
  1868 00009CBB E88AFBFFFF          <1> 	call	convert_file_name
  1869                              <1> 	;EDI = Dir Entry Format File Name Location
  1870                              <1> 	;ESI = Dot File Name Location (capitalized)
  1871                              <1> 
  1872 00009CC0 E816000000          <1> 	call	convert_current_date_time
  1873                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  1874                              <1>         ; 	    AX = Time in dos dir entry format
  1875 00009CC5 6689470E            <1> 	mov	[edi+14], ax ; CrtTime, 14
  1876 00009CC9 66895710            <1> 	mov	[edi+16], dx ; CrtDate, 16
  1877 00009CCD 66895712            <1> 	mov	[edi+18], dx ; LastAccDate, 18
  1878 00009CD1 66894716            <1> 	mov	[edi+22], ax ; WrtTime, 14
  1879 00009CD5 66895718            <1> 	mov	[edi+24], dx ; WrtDate, 16
  1880 00009CD9 59                  <1> 	pop	ecx
  1881                              <1> 
  1882 00009CDA C3                  <1> 	retn
  1883                              <1> 
  1884                              <1> convert_current_date_time:
  1885                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  1886                              <1> 	; 13/06/2010 (DIR.ASM, 'proc_convert_current_date_time')
  1887                              <1> 	; converts date&time to dos dir entry format
  1888                              <1> 	; INPUT -> none
  1889                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  1890                              <1> 	;           AX = Time in dos dir entry format
  1891                              <1>  
  1892 00009CDB B404                <1> 	mov	ah, 04h ; Return Current Date
  1893 00009CDD E8CFB9FFFF          <1> 	call	int1Ah 
  1894                              <1> 
  1895 00009CE2 88E8                <1> 	mov	al, ch ; <- century BCD
  1896 00009CE4 240F                <1> 	and	al, 0Fh
  1897 00009CE6 88EC                <1> 	mov	ah, ch
  1898 00009CE8 C0EC04              <1> 	shr	ah, 4
  1899 00009CEB D50A                <1> 	aad
  1900 00009CED 88C5                <1> 	mov	ch, al ; -> century 
  1901                              <1> 
  1902 00009CEF 88C8                <1> 	mov	al, cl ; <- year BCD
  1903 00009CF1 240F                <1> 	and	al, 0Fh
  1904 00009CF3 88CC                <1> 	mov	ah, cl
  1905 00009CF5 C0EC04              <1> 	shr	ah, 4
  1906 00009CF8 D50A                <1> 	aad
  1907 00009CFA 88C1                <1> 	mov	cl, al ; -> year
  1908                              <1> 
  1909 00009CFC 88E8                <1> 	mov	al, ch
  1910 00009CFE B464                <1> 	mov	ah, 100
  1911 00009D00 F6E4                <1> 	mul	ah
  1912 00009D02 30ED                <1> 	xor	ch, ch
  1913 00009D04 6601C8              <1> 	add	ax, cx
  1914 00009D07 662DBC07            <1> 	sub	ax, 1980 ; ms-dos epoch
  1915 00009D0B 6689C1              <1> 	mov	cx, ax
  1916                              <1> 
  1917 00009D0E 88F0                <1> 	mov	al, dh ; <- month in bcd
  1918 00009D10 240F                <1> 	and	al, 0Fh
  1919 00009D12 88F4                <1> 	mov	ah, dh
  1920 00009D14 C0EC04              <1> 	shr	ah, 4
  1921 00009D17 D50A                <1> 	aad
  1922 00009D19 88C6                <1> 	mov	dh, al ; -> month
  1923                              <1> 
  1924 00009D1B 88D0                <1> 	mov	al, dl ; <- day BCD
  1925 00009D1D 240F                <1> 	and	al, 0Fh
  1926 00009D1F 88D4                <1> 	mov	ah, dl
  1927 00009D21 C0EC04              <1> 	shr	ah, 4
  1928 00009D24 D50A                <1> 	aad
  1929 00009D26 88C2                <1> 	mov	dl, al ; -> day
  1930                              <1> 
  1931 00009D28 88C8                <1> 	mov	al, cl ; count of years from 1980
  1932 00009D2A 66C1E004            <1> 	shl	ax, 4
  1933 00009D2E 08F0                <1> 	or	al, dh ; month of year, 1 to 12
  1934 00009D30 66C1E005            <1> 	shl	ax, 5
  1935 00009D34 08D0                <1> 	or	al, dl ; day of year, 1 to 31
  1936                              <1> 	
  1937 00009D36 6650                <1> 	push	ax ; push date
  1938                              <1> 
  1939 00009D38 B402                <1> 	mov	ah, 02h ; Return Current Time
  1940 00009D3A E872B9FFFF          <1> 	call	int1Ah
  1941                              <1> 
  1942 00009D3F 88E8                <1> 	mov	al, ch ; <- hours BCD
  1943 00009D41 240F                <1> 	and	al, 0Fh
  1944 00009D43 88EC                <1> 	mov	ah, ch
  1945 00009D45 C0EC04              <1> 	shr	ah, 4
  1946 00009D48 D50A                <1> 	aad
  1947 00009D4A 88C5                <1> 	mov	ch, al ; -> hours
  1948                              <1> 
  1949 00009D4C 88C8                <1> 	mov	al, cl ; <- minutes BCD
  1950 00009D4E 240F                <1> 	and	al, 0Fh
  1951 00009D50 88CC                <1> 	mov	ah, cl
  1952 00009D52 C0EC04              <1> 	shr	ah, 4
  1953 00009D55 D50A                <1> 	aad
  1954 00009D57 88C1                <1> 	mov	cl, al ; -> minutes
  1955                              <1> 
  1956 00009D59 88F0                <1> 	mov	al, dh ; <- seconds BCD
  1957 00009D5B 240F                <1> 	and	al, 0Fh
  1958 00009D5D 88F4                <1> 	mov	ah, dh
  1959 00009D5F C0EC04              <1> 	shr	ah, 4
  1960 00009D62 D50A                <1> 	aad
  1961 00009D64 88C6                <1> 	mov	dh, al ; -> seconds
  1962                              <1> 
  1963 00009D66 88E8                <1> 	mov	al, ch ; hours
  1964 00009D68 66C1E006            <1> 	shl	ax, 6
  1965 00009D6C 08C8                <1> 	or	al, cl ; minutes
  1966 00009D6E 66C1E005            <1> 	shl	ax, 5
  1967 00009D72 D0EE                <1> 	shr	dh, 1 ; 2 seconds
  1968                              <1> 	; There is a bug in TRDOS v1 here !
  1969                              <1> 	; it was 'or al, dl' ! 
  1970 00009D74 08F0                <1> 	or	al, dh ; seconds
  1971                              <1> 
  1972 00009D76 665A                <1> 	pop	dx ; pop date
  1973                              <1> 	
  1974 00009D78 C3                  <1> 	retn
  1975                              <1> 
  1976                              <1> save_directory_buffer:
  1977                              <1> 	; 15/10/2016
  1978                              <1> 	; 23/03/2016
  1979                              <1> 	; 26/02/2016
  1980                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  1981                              <1> 	; 01/08/2011
  1982                              <1> 	; 14/03/2010
  1983                              <1> 	; INPUT ->
  1984                              <1> 	; 	 none
  1985                              <1> 	; OUTPUT ->
  1986                              <1> 	;  cf = 0 -> write OK...
  1987                              <1> 	;  cf = 1 -> error code in AL (EAX)
  1988                              <1> 	;  cf = 1 & AL = 0Dh => CH & CL = FS & FAT type
  1989                              <1> 	;  EBX = Directory Buffer Address
  1990                              <1> 	;
  1991                              <1> 	;  (EAX, ECX, EDX will be modified)
  1992                              <1>  
  1993 00009D79 BB00000800          <1> 	mov	ebx, Directory_Buffer
  1994 00009D7E 803D[D0390100]02    <1> 	cmp	byte [DirBuff_ValidData], 2
  1995 00009D85 7403                <1> 	je	short loc_save_dir_buffer
  1996 00009D87 31C0                <1> 	xor	eax, eax
  1997 00009D89 C3                  <1> 	retn            
  1998                              <1> 
  1999                              <1> loc_save_dir_buffer:
  2000 00009D8A 56                  <1> 	push	esi
  2001 00009D8B 31DB                <1> 	xor	ebx, ebx 
  2002 00009D8D 8A3D[CE390100]      <1>         mov     bh, [DirBuff_DRV]
  2003 00009D93 80EF41              <1> 	sub	bh, 'A'
  2004 00009D96 BE00010900          <1>         mov     esi, Logical_DOSDisks
  2005 00009D9B 01DE                <1> 	add	esi, ebx
  2006 00009D9D 668B4E03            <1>         mov     cx, [esi+LD_FATType]
  2007                              <1> 	; CH = FS Type (A1h for FS)
  2008                              <1> 	; CL = FAT Type (0 for FS)
  2009 00009DA1 08C9                <1> 	or	cl, cl
  2010 00009DA3 7433                <1> 	jz	short loc_save_dir_buff_stc_retn
  2011                              <1> 
  2012                              <1> loc_save_dir_buffer_check_cluster_no:    
  2013 00009DA5 A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
  2014 00009DAA 28FF                <1> 	sub	bh, bh ; ebx = 0
  2015 00009DAC 09C0                <1> 	or	eax, eax
  2016 00009DAE 7540                <1> 	jnz	short loc_save_sub_dir_buffer
  2017 00009DB0 8A25[CF390100]      <1> 	mov	ah, [DirBuff_FATType]
  2018 00009DB6 FEC3                <1> 	inc	bl ;  bl = 1
  2019 00009DB8 38DC                <1> 	cmp	ah, bl
  2020 00009DBA 721D                <1> 	jb	short loc_save_dir_buff_inv_data_retn
  2021 00009DBC FEC3                <1> 	inc	bl ; bl = 2
  2022 00009DBE 38E3                <1> 	cmp	bl, ah
  2023 00009DC0 7217                <1> 	jb	short loc_save_dir_buff_inv_data_retn
  2024                              <1> 
  2025                              <1> loc_save_root_dir_buffer:
  2026 00009DC2 668B5E17            <1> 	mov	bx, [esi+LD_BPB+RootDirEnts]
  2027 00009DC6 6683C30F            <1> 	add	bx, 15
  2028 00009DCA 66C1EB04            <1> 	shr	bx, 4 ; 16 dir entries per sector
  2029 00009DCE 6609DB              <1> 	or	bx, bx
  2030 00009DD1 7405                <1> 	jz	short loc_save_dir_buff_stc_retn
  2031                              <1> 	;mov	ecx, ebx 
  2032 00009DD3 8B4664              <1> 	mov	eax, [esi+LD_ROOTBegin] ; 26/02/2016
  2033 00009DD6 EB23                <1> 	jmp	short loc_write_directory_to_disk
  2034                              <1> 
  2035                              <1> loc_save_dir_buff_stc_retn:
  2036 00009DD8 F9                  <1> 	stc
  2037                              <1> loc_save_dir_buff_inv_data_retn:
  2038                              <1> 	; 15/10/2016 (0Dh -> 29)
  2039 00009DD9 B01D                <1> 	mov	al, 29 ; Invalid data !
  2040 00009DDB C605[D0390100]00    <1> 	mov	byte [DirBuff_ValidData], 0
  2041 00009DE2 EB05                <1> 	jmp	short loc_save_dir_buff_retn 
  2042                              <1> 
  2043                              <1> loc_write_directory_to_disk_err:
  2044                              <1> 	; 15/10/2016 (disk write error code, 1Dh -> 18)
  2045 00009DE4 B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error 
  2046                              <1> 
  2047                              <1> loc_save_dir_buff_retn:
  2048 00009DE9 BB00000800          <1> 	mov	ebx, Directory_Buffer
  2049 00009DEE 5E                  <1> 	pop	esi
  2050 00009DEF C3                  <1> 	retn
  2051                              <1>  
  2052                              <1> loc_save_sub_dir_buffer:
  2053                              <1> 	; ebx  = 0
  2054 00009DF0 83E802              <1> 	sub	eax, 2
  2055 00009DF3 8A5E13              <1> 	mov	bl, [esi+LD_BPB+SecPerClust]
  2056 00009DF6 F7E3                <1> 	mul	ebx
  2057 00009DF8 034668              <1>         add     eax, [esi+LD_DATABegin]
  2058                              <1>  	;mov	ecx, ebx
  2059                              <1> 
  2060                              <1> loc_write_directory_to_disk:
  2061 00009DFB 89D9                <1>  	mov	ecx, ebx
  2062 00009DFD BB00000800          <1> 	mov	ebx, Directory_Buffer
  2063 00009E02 E85B480000          <1> 	call	disk_write
  2064 00009E07 72DB                <1> 	jc	short loc_write_directory_to_disk_err
  2065                              <1> 
  2066                              <1> loc_save_dir_buff_validate_retn:
  2067 00009E09 C605[D0390100]01    <1> 	mov	byte [DirBuff_ValidData], 1
  2068 00009E10 31C0                <1> 	xor	eax, eax
  2069                              <1> 	; 26/02/2016
  2070 00009E12 EBD5                <1> 	jmp	short loc_save_dir_buff_retn
  2071                              <1> 
  2072                              <1> update_parent_dir_lmdt:
  2073                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  2074                              <1> 	; 01/08/2011
  2075                              <1> 	; 16/10/2010 
  2076                              <1> 	; 
  2077                              <1> 	; INPUT -> 
  2078                              <1> 	;	none
  2079                              <1>  	; OUTPUT ->
  2080                              <1> 	;	(last modification date & time of the parent dir
  2081                              <1> 	;	will be changed/updated)
  2082                              <1> 	;
  2083                              <1> 	; (EAX, EBX, ECX, EDX, EDI will be changed)
  2084                              <1> 
  2085 00009E14 29C0                <1> 	sub	eax, eax
  2086 00009E16 8A25[A4310100]      <1> 	mov	ah, [Current_Dir_Level]
  2087 00009E1C A0[A5310100]        <1> 	mov	al, [Current_FATType]
  2088 00009E21 3C01                <1> 	cmp	al, 1
  2089 00009E23 723A                <1> 	jb	short loc_UPDLMDT_proc_retn
  2090                              <1>     
  2091                              <1> loc_update_parent_dir_lm_date_time:
  2092 00009E25 08E4                <1> 	or	ah, ah
  2093 00009E27 7436                <1> 	jz	short loc_UPDLMDT_proc_retn
  2094                              <1> 
  2095 00009E29 56                  <1> 	push	esi ; *
  2096 00009E2A 8825[483C0100]      <1> 	mov	[UPDLMDT_CDirLevel], ah
  2097 00009E30 8B15[A0310100]      <1> 	mov	edx, [Current_Dir_FCluster]
  2098 00009E36 8915[493C0100]      <1> 	mov	[UPDLMDT_CDirFCluster], edx
  2099                              <1> 
  2100 00009E3C FECC                <1> 	dec	ah
  2101 00009E3E B90C000000          <1> 	mov	ecx, 12
  2102 00009E43 BE[073A0100]        <1>         mov     esi, PATH_Array
  2103                              <1> 
  2104 00009E48 8825[A4310100]      <1> 	mov	[Current_Dir_Level], ah
  2105 00009E4E 08E4                <1> 	or	ah, ah
  2106 00009E50 750E                <1> 	jnz	short loc_update_parent_dir_lmdt_load_sub_dir_1
  2107 00009E52 803D[A5310100]02    <1> 	cmp	byte [Current_FATType], 2
  2108 00009E59 770B                <1> 	ja	short loc_update_parent_dir_lmdt_load_sub_dir_2
  2109 00009E5B 28C0                <1> 	sub	al, al ; eax = 0
  2110 00009E5D EB0A                <1> 	jmp	short loc_update_parent_dir_lmdt_load_sub_dir_3
  2111                              <1> 
  2112                              <1> loc_UPDLMDT_proc_retn:
  2113 00009E5F C3                  <1> 	retn
  2114                              <1>          
  2115                              <1> loc_update_parent_dir_lmdt_load_sub_dir_1:
  2116 00009E60 B010                <1> 	mov	al, 16
  2117 00009E62 F6E4                <1> 	mul	ah 
  2118 00009E64 01C6                <1> 	add	esi, eax
  2119                              <1> 
  2120                              <1> loc_update_parent_dir_lmdt_load_sub_dir_2:  
  2121 00009E66 8B460C              <1> 	mov	eax, [esi+12] ; Parent Dir First Cluster
  2122                              <1> 
  2123                              <1> loc_update_parent_dir_lmdt_load_sub_dir_3:
  2124 00009E69 A3[A0310100]        <1> 	mov	[Current_Dir_FCluster], eax
  2125                              <1> 
  2126 00009E6E 83C610              <1> 	add	esi, 16
  2127 00009E71 66BF[2E3B]          <1> 	mov	di, Dir_File_Name  
  2128 00009E75 F3A4                <1> 	rep	movsb
  2129                              <1> 	
  2130 00009E77 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2131 00009E7C 29DB                <1> 	sub	ebx, ebx
  2132 00009E7E 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
  2133 00009E84 01DE                <1> 	add	esi, ebx
  2134 00009E86 E88FF7FFFF          <1> 	call	reload_current_directory
  2135 00009E8B 7232                <1> 	jc	short loc_update_parent_dir_lmdt_restore_cdirlevel
  2136                              <1> 
  2137                              <1> loc_update_parent_dir_lmdt_locate_dir: 
  2138 00009E8D BE[2E3B0100]        <1> 	mov	esi, Dir_File_Name        
  2139 00009E92 6631C9              <1> 	xor	cx, cx
  2140 00009E95 66B81008            <1> 	mov	ax, 0810h ; Only directories
  2141 00009E99 E8B7F6FFFF          <1>         call    locate_current_dir_file
  2142                              <1> 	; EDI = DirBuff Directory Entry Address
  2143 00009E9E 721F                <1> 	jc short loc_update_parent_dir_lmdt_restore_cdirlevel
  2144                              <1> 
  2145 00009EA0 E836FEFFFF          <1> 	call	convert_current_date_time
  2146 00009EA5 66895712            <1> 	mov	[edi+18], dx ; Last Access Date
  2147 00009EA9 66895718            <1> 	mov	[edi+24], dx ; Last Write Date
  2148 00009EAD 66894716            <1> 	mov	[edi+22], ax ; Last Write Time
  2149                              <1> 
  2150 00009EB1 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  2151 00009EB8 E8BCFEFFFF          <1> 	call	save_directory_buffer
  2152 00009EBD 7200                <1> 	jc	short loc_update_parent_dir_lmdt_restore_cdirlevel
  2153                              <1> 	;xor	al, al 
  2154                              <1> loc_update_parent_dir_lmdt_restore_cdirlevel:
  2155                              <1>  	;current directory level restoration
  2156 00009EBF 8A25[483C0100]      <1> 	mov	ah, [UPDLMDT_CDirLevel]
  2157 00009EC5 8825[A4310100]      <1> 	mov	[Current_Dir_Level], ah
  2158 00009ECB 8B15[493C0100]      <1>         mov     edx, [UPDLMDT_CDirFCluster]
  2159 00009ED1 8915[A0310100]      <1> 	mov	[Current_Dir_FCluster], edx
  2160                              <1> 
  2161 00009ED7 5E                  <1> 	pop	esi ; *
  2162 00009ED8 C3                  <1> 	retn
  2163                              <1> 
  2164                              <1> delete_longname:
  2165                              <1> 	; 27/02/2016 (TRDOS 386 = TRDOS v2.0)
  2166                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_delete_longname')
  2167                              <1> 	; 14/03/2010
  2168                              <1> 	; INPUT ->
  2169                              <1> 	; 	EAX = Directory Entry (Index) Number (< 65536)
  2170                              <1> 	; OUTPUT ->
  2171                              <1> 	;	cf = 0 -> OK  (EAX = 0)
  2172                              <1> 	; 	cf = 1 -> error code in EAX (AL)
  2173                              <1> 	;
  2174                              <1> 	; (Modified registers: EAX, EDX, ECX, EBX, EDI) 
  2175                              <1> 
  2176 00009ED9 66A3[783C0100]      <1> 	mov	[DLN_EntryNumber], ax
  2177 00009EDF C605[7A3C0100]40    <1>         mov     byte [DLN_40h], 40h
  2178                              <1> 
  2179 00009EE6 E858000000          <1> 	call	locate_current_dir_entry
  2180 00009EEB 7308                <1> 	jnc	short loc_dln_check_attributes
  2181 00009EED C3                  <1> 	retn
  2182                              <1> 
  2183                              <1> loc_dln_longname_not_found:
  2184 00009EEE B802000000          <1> 	mov	eax, 2
  2185 00009EF3 F9                  <1> 	stc
  2186 00009EF4 C3                  <1> 	retn
  2187                              <1> 
  2188                              <1> loc_dln_check_attributes:
  2189 00009EF5 B00F                <1> 	mov	al, 0Fh  ; long name
  2190 00009EF7 8A670B              <1> 	mov	ah, [edi+0Bh] ; dir entry attributes
  2191 00009EFA 38C4                <1> 	cmp	ah, al
  2192 00009EFC 75F0                <1> 	jne	short loc_dln_longname_not_found
  2193 00009EFE 8A27                <1> 	mov	ah, [edi]
  2194 00009F00 2A25[7A3C0100]      <1> 	sub	ah, [DLN_40h]
  2195 00009F06 76E6                <1> 	jna	short loc_dln_longname_not_found         
  2196 00009F08 80FC14              <1> 	cmp	ah, 14h ; 84-64=20 -> 20*13=260 bytes
  2197 00009F0B 77E1                <1> 	ja	short loc_dln_longname_not_found
  2198                              <1>              
  2199 00009F0D C607E5              <1> 	mov	byte [edi], 0E5h  ; deleted sign
  2200 00009F10 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; changed/write sign
  2201 00009F17 C605[7A3C0100]00    <1> 	mov	byte [DLN_40h], 0 ; 40h -> 0
  2202                              <1> 	  
  2203                              <1> loc_dln_delete_next_ln_entry:
  2204 00009F1E 80FC01              <1> 	cmp	ah, 1
  2205 00009F21 7616                <1> 	jna	short loc_dln_longname_retn
  2206                              <1> loc_dln_delete_next_ln_entry_0:
  2207 00009F23 66FF05[783C0100]    <1> 	inc	word [DLN_EntryNumber]
  2208 00009F2A 0FB705[783C0100]    <1> 	movzx	eax, word [DLN_EntryNumber] 
  2209 00009F31 E80D000000          <1> 	call	locate_current_dir_entry
  2210 00009F36 73BD                <1> 	jnc	short loc_dln_check_attributes
  2211                              <1> 
  2212                              <1> loc_dln_longname_stc_retn:
  2213 00009F38 C3                  <1> 	retn 
  2214                              <1> 	   
  2215                              <1> loc_dln_longname_retn:
  2216                              <1> 	;cmp	byte [DirBuff_ValidData], 2
  2217                              <1> 	;jne	short loc_dln_longname_retn_xor_eax
  2218 00009F39 E83BFEFFFF          <1> 	call	save_directory_buffer
  2219 00009F3E 72F8                <1> 	jc	short loc_dln_longname_stc_retn
  2220                              <1> 
  2221                              <1> loc_dln_longname_retn_xor_eax:
  2222 00009F40 31C0                <1> 	xor	eax, eax
  2223 00009F42 C3                  <1> 	retn
  2224                              <1> 
  2225                              <1> locate_current_dir_entry:
  2226                              <1> 	; 16/10/2016
  2227                              <1> 	; 15/10/2016
  2228                              <1> 	; 23/03/2016
  2229                              <1> 	; 27/02/2016 (TRDOS 386 = TRDOS v2.0)
  2230                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_locate_current_dir_entry')
  2231                              <1> 	; 07/03/2010
  2232                              <1> 	; INPUT ->
  2233                              <1> 	;	EAX = Directory Entry (Index) Number (< 65536) 
  2234                              <1> 	; OUTPUT ->
  2235                              <1> 	;	EDI = Directory Entry Address
  2236                              <1> 	; 	EAX = Cluster Number of Directory Buffer
  2237                              <1> 	;	EBX = Directory Buffer Entry Offset
  2238                              <1> 	;	ECX = DirBuff Valid Data identifier (CL)
  2239                              <1> 	;   	If CF = 0 and CL = 2 then
  2240                              <1> 	;	   directory buffer modified and
  2241                              <1> 	;	   must be written to disk.
  2242                              <1> 	; 	If CF = 0  and CL = 1 then
  2243                              <1> 	;	   dir buffer has been written to disk, already.
  2244                              <1> 	;	CF = 1 -> Error code in EAX (AL)
  2245                              <1> 	;
  2246                              <1> 	; (Modified registers: EAX, EDX, ECX, EBX, EDI) 
  2247                              <1> 
  2248                              <1> loc_locate_current_dir_entry:
  2249 00009F43 56                  <1> 	push	esi
  2250 00009F44 89C1                <1> 	mov	ecx, eax
  2251 00009F46 BA20000000          <1> 	mov	edx, 32
  2252 00009F4B F7E2                <1> 	mul	edx 
  2253 00009F4D A3[843C0100]        <1> 	mov	[LCDE_ByteOffset], eax
  2254 00009F52 31DB                <1> 	xor	ebx, ebx
  2255 00009F54 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
  2256 00009F5A A0[CE390100]        <1>         mov     al, [DirBuff_DRV]
  2257 00009F5F 2C41                <1> 	sub	al, 'A'
  2258 00009F61 BE00010900          <1>         mov     esi, Logical_DOSDisks
  2259 00009F66 01DE                <1> 	add	esi, ebx
  2260 00009F68 38C7                <1> 	cmp	bh, al
  2261 00009F6A 0F8592000000        <1>         jne     loc_lcde_reload_current_directory
  2262                              <1> loc_lcde_cdl_check:
  2263 00009F70 803D[A4310100]00    <1> 	cmp	byte [Current_Dir_Level], 0
  2264 00009F77 772A                <1> 	ja	short loc_lcde_calc_dirbuff_cluster_offset
  2265                              <1> 	; 27/02/2016
  2266                              <1> 	; TRDOS v1 has bug here for FAT32 fs !
  2267                              <1> 	; (Root Directory Entries for FAT32 = 0)
  2268 00009F79 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3  ; FAT32
  2269 00009F7D 7324                <1> 	jnb	short loc_lcde_calc_dirbuff_cluster_offset
  2270                              <1> 
  2271                              <1> loc_lcde_cdl_check_FAT12_16:
  2272 00009F7F 668B4617            <1> 	mov	ax, [esi+LD_BPB+RootDirEnts]
  2273 00009F83 6648                <1> 	dec	ax
  2274                              <1> 	;xor	dx, dx  
  2275 00009F85 6639C8              <1> 	cmp	ax, cx ; cx = Directory Entry (Index) Number
  2276 00009F88 720E                <1> 	jb	short loc_lcde_stc_12h_retn
  2277 00009F8A 66890D[7C3C0100]    <1> 	mov	[LCDE_EntryIndex], cx
  2278 00009F91 31C0                <1> 	xor	eax, eax
  2279 00009F93 E993000000          <1>         jmp     loc_lcde_check_dir_buffer_cluster
  2280                              <1> 
  2281                              <1> loc_lcde_stc_12h_retn:
  2282 00009F98 5E                  <1> 	pop	esi
  2283 00009F99 89CB                <1> 	mov	ebx, ecx
  2284 00009F9B 89D1                <1> 	mov	ecx, edx
  2285                              <1> 	; 16/10/2016 (12h -> 12)
  2286 00009F9D B80C000000          <1> 	mov	eax, 12 ; No more files
  2287 00009FA2 C3                  <1> 	retn 
  2288                              <1> 
  2289                              <1> loc_lcde_calc_dirbuff_cluster_offset:
  2290 00009FA3 8A5E13              <1> 	mov	bl, [esi+LD_BPB+SecPerClust]
  2291 00009FA6 30FF                <1> 	xor	bh, bh
  2292 00009FA8 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec]
  2293 00009FAC 66F7E3              <1> 	mul	bx
  2294 00009FAF 6609D2              <1>  	or	dx, dx ; If bytes per cluster > 32KB it is invalid
  2295 00009FB2 755D                <1> 	jnz	short loc_lcde_invalid_format
  2296                              <1> 	;mov	ecx, eax
  2297 00009FB4 6689C1              <1> 	mov	cx, ax ; BYTES PER CLUSTER
  2298 00009FB7 A1[843C0100]        <1> 	mov	eax, [LCDE_ByteOffset]
  2299                              <1> 	;sub	edx, edx
  2300 00009FBC F7F1                <1> 	div	ecx
  2301 00009FBE 3DFFFF0000          <1> 	cmp	eax, 65535
  2302 00009FC3 774C                <1> 	ja	short loc_lcde_invalid_format
  2303                              <1> 
  2304                              <1> 	; cluster sequence number of directory (< 65536)
  2305 00009FC5 66A3[7E3C0100]      <1> 	mov	[LCDE_ClusterSN], ax 
  2306                              <1> 
  2307 00009FCB 6689D0              <1> 	mov	ax, dx ; byte offset in cluster (directory buffer)
  2308 00009FCE 66BB2000            <1> 	mov	bx, 32 ; ; 1 dir entry = 32 bytes
  2309 00009FD2 6629D2              <1>         sub     dx, dx  ; 0
  2310 00009FD5 66F7F3              <1> 	div	bx 
  2311 00009FD8 66A3[7C3C0100]      <1> 	mov	[LCDE_EntryIndex], ax ; dir entry index/sequence number
  2312                              <1> 				      ; (in directory buffer/cluster)	  
  2313                              <1> loc_lcde_get_current_sub_dir_fcluster:
  2314 00009FDE A1[A0310100]        <1> 	mov	eax, [Current_Dir_FCluster]
  2315                              <1> 
  2316                              <1> loc_lcde_get_next_cluster:
  2317 00009FE3 66833D[7E3C0100]00  <1> 	cmp	word [LCDE_ClusterSN], 0
  2318 00009FEB 763E                <1> 	jna	short loc_lcde_check_dir_buffer_cluster
  2319 00009FED A3[803C0100]        <1> 	mov	[LCDE_Cluster], eax
  2320 00009FF2 E835100000          <1> 	call	get_next_cluster
  2321 00009FF7 7220                <1> 	jc	short loc_lcde_check_gnc_error
  2322 00009FF9 66FF0D[7E3C0100]    <1>   	dec	word [LCDE_ClusterSN]
  2323 0000A000 EBE1                <1> 	jmp	short loc_lcde_get_next_cluster
  2324                              <1> 
  2325                              <1> loc_lcde_reload_current_directory:
  2326 0000A002 51                  <1> 	push	ecx
  2327 0000A003 E812F6FFFF          <1> 	call	reload_current_directory
  2328 0000A008 59                  <1> 	pop	ecx
  2329 0000A009 0F8361FFFFFF        <1>         jnc     loc_lcde_cdl_check
  2330 0000A00F 5E                  <1> 	pop	esi
  2331 0000A010 C3                  <1> 	retn
  2332                              <1> 
  2333                              <1> loc_lcde_invalid_format:
  2334                              <1> 	; 15/10/2016 (0Bh -> 28)
  2335 0000A011 B81C000000          <1> 	mov	eax, 28 ; Invalid Format !
  2336                              <1> loc_lcde_drive_not_ready_read_err:
  2337 0000A016 F9                  <1> 	stc
  2338 0000A017 5E                  <1> 	pop	esi 
  2339 0000A018 C3                  <1> 	retn  
  2340                              <1> 
  2341                              <1> loc_lcde_check_gnc_error:
  2342 0000A019 09C0                <1> 	or	eax, eax
  2343 0000A01B 75F9                <1> 	jnz	short loc_lcde_drive_not_ready_read_err
  2344 0000A01D 66FF0D[7E3C0100]    <1> 	dec	word [LCDE_ClusterSN]
  2345 0000A024 75EB                <1> 	jnz	short loc_lcde_invalid_format 
  2346 0000A026 A1[803C0100]        <1> 	mov	eax, [LCDE_Cluster]
  2347                              <1> 
  2348                              <1> loc_lcde_check_dir_buffer_cluster:
  2349 0000A02B 3B05[D5390100]      <1> 	cmp	eax, [DirBuff_Cluster]
  2350 0000A031 755C                <1> 	jne	short loc_lcde_load_dir_cluster
  2351 0000A033 803D[D0390100]00    <1> 	cmp	byte [DirBuff_ValidData], 0
  2352 0000A03A 7727                <1> 	ja	short lcde_check_dir_buffer_cluster_next
  2353 0000A03C 803D[A4310100]00    <1> 	cmp	byte [Current_Dir_Level], 0    
  2354 0000A043 775F                <1> 	ja	short loc_lcde_load_dir_cluster_0
  2355                              <1> 	; 27/02/2016
  2356                              <1> 	; TRDOS v1 has bug here for FAT32 fs !
  2357 0000A045 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3  ; FAT32
  2358 0000A049 7359                <1> 	jnb	short loc_lcde_load_dir_cluster_0
  2359                              <1> 	;
  2360 0000A04B 0FB74E17            <1> 	movzx	ecx, word [esi+LD_BPB+RootDirEnts]
  2361 0000A04F 6683C10F            <1> 	add	cx, 15 ; round up (16 entries per sector)
  2362 0000A053 66C1E904            <1> 	shr	cx, 4 ; 1 sector contains 16 dir entries	
  2363                              <1> 
  2364 0000A057 8B4664              <1>         mov     eax, [esi+LD_ROOTBegin]
  2365 0000A05A EB54                <1> 	jmp	short loc_lcde_load_dir_cluster_1 
  2366                              <1> 
  2367                              <1> loc_lcde_validate_dirBuff:
  2368 0000A05C C605[D0390100]01    <1> 	mov	byte [DirBuff_ValidData], 1
  2369                              <1> 
  2370                              <1> lcde_check_dir_buffer_cluster_next:
  2371 0000A063 0FB71D[7C3C0100]    <1> 	movzx	ebx, word [LCDE_EntryIndex]
  2372 0000A06A 663B1D[D3390100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  2373 0000A071 779E                <1> 	ja	short loc_lcde_invalid_format 
  2374 0000A073 B820000000          <1> 	mov	eax, 32
  2375 0000A078 F7E3                <1> 	mul	ebx
  2376                              <1> 	;or	edx, edx
  2377                              <1> 	;jnz	short loc_lcde_invalid_format
  2378                              <1> 
  2379 0000A07A BF00000800          <1> 	mov	edi, Directory_Buffer  
  2380 0000A07F 01C7                <1> 	add	edi, eax ; add entry offset to buffer address
  2381                              <1> 
  2382                              <1> loc_lcde_dir_buffer_last_check:
  2383 0000A081 A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
  2384 0000A086 0FB60D[D0390100]    <1> 	movzx	ecx, byte [DirBuff_ValidData]
  2385                              <1> 
  2386                              <1> loc_lcde_retn:
  2387 0000A08D 5E                  <1> 	pop	esi
  2388 0000A08E C3                  <1> 	retn
  2389                              <1> 
  2390                              <1> loc_lcde_load_dir_cluster:
  2391                              <1> 	;cmp	byte [DirBuff_ValidData], 2
  2392                              <1> 	;jne	short loc_lcde_load_dir_cluster_n2
  2393 0000A08F 50                  <1> 	push	eax
  2394 0000A090 E8E4FCFFFF          <1> 	call	save_directory_buffer
  2395 0000A095 58                  <1> 	pop	eax
  2396 0000A096 72F5                <1> 	jc	short loc_lcde_retn
  2397                              <1> 
  2398                              <1> loc_lcde_load_dir_cluster_n2:
  2399 0000A098 C605[D0390100]00    <1> 	mov	byte [DirBuff_ValidData], 0
  2400 0000A09F A3[D5390100]        <1> 	mov	[DirBuff_Cluster], eax
  2401                              <1> 
  2402                              <1> loc_lcde_load_dir_cluster_0:
  2403 0000A0A4 83E802              <1> 	sub	eax, 2
  2404 0000A0A7 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  2405 0000A0AB F7E1                <1> 	mul	ecx
  2406 0000A0AD 034668              <1>         add     eax, [esi+LD_DATABegin]
  2407                              <1> 
  2408                              <1> loc_lcde_load_dir_cluster_1:
  2409 0000A0B0 BB00000800          <1> 	mov	ebx, Directory_Buffer
  2410                              <1> 	; ecx = sector count
  2411 0000A0B5 E8B7450000          <1> 	call	disk_read
  2412 0000A0BA 73A0                <1> 	jnc	short loc_lcde_validate_dirBuff
  2413                              <1> 
  2414                              <1> 	; 15/10/2016 
  2415                              <1> 	; (Disk read error instead of drv not ready err)
  2416 0000A0BC B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
  2417 0000A0C1 EBCA                <1> 	jmp	short loc_lcde_retn
  2418                              <1> 
  2419                              <1> 
  2420                              <1> remove_file:
  2421                              <1> 	; 15/10/2016
  2422                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  2423                              <1> 	; 10/04/2011 (FILE.ASM, 'proc_delete_file')
  2424                              <1> 	; 09/08/2010
  2425                              <1> 	; INPUT ->
  2426                              <1> 	;	EDI = Directory Buffer Entry Address
  2427                              <1> 	;	 CX = Directory Buffer Entry Counter/Index
  2428                              <1> 	;	 BL = Longname Entry Length
  2429                              <1> 	;	 BH = Logical DOS Drive Number 
  2430                              <1> 
  2431 0000A0C3 29C0                <1> 	sub	eax, eax
  2432 0000A0C5 88FC                <1> 	mov	ah, bh
  2433 0000A0C7 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2434 0000A0CC 01C6                <1> 	add	esi, eax
  2435                              <1> 
  2436 0000A0CE 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  2437 0000A0D2 7312                <1> 	jnb	short loc_del_fat_file 
  2438                              <1>               
  2439 0000A0D4 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  2440 0000A0D8 7406                <1> 	je	short loc_del_fs_file
  2441                              <1> 
  2442                              <1> loc_del_file_invalid_format:
  2443 0000A0DA 30E4                <1> 	xor	ah, ah
  2444                              <1> 	; 15/10/2016 (0Bh -> 28)
  2445 0000A0DC B01C                <1> 	mov	al, 28  ; Invalid Format
  2446 0000A0DE F9                  <1> 	stc 
  2447 0000A0DF C3                  <1> 	retn
  2448                              <1> 
  2449                              <1> loc_del_fs_file:
  2450 0000A0E0 E8400F0000          <1> 	call	delete_fs_file
  2451 0000A0E5 C3                  <1> 	retn
  2452                              <1> 
  2453                              <1> loc_del_fat_file:
  2454 0000A0E6 E808000000          <1> 	call	delete_directory_entry
  2455 0000A0EB 7205                <1> 	jc	short loc_del_file_err_retn 
  2456                              <1> 
  2457                              <1> loc_delfile_unlink_cluster_chain:
  2458 0000A0ED E864170000          <1> 	call	truncate_cluster_chain
  2459                              <1> 	;jc	short loc_del_file_err_retn
  2460                              <1> 
  2461                              <1> loc_delfile_return:
  2462                              <1> loc_del_file_err_retn:
  2463 0000A0F2 C3                  <1> 	retn
  2464                              <1> 
  2465                              <1> delete_directory_entry:
  2466                              <1> 	; 15/10/2016
  2467                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  2468                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_delete_directory_entry')
  2469                              <1> 	; 10/04/2011 
  2470                              <1> 	; INPUT ->
  2471                              <1> 	; 	ESI = Logical Dos Drive Descripton Table Address 
  2472                              <1> 	;	EDI = Directory Buffer Entry Address
  2473                              <1> 	;	 CX = Directory Buffer Entry Counter/Index
  2474                              <1> 	;	 BL = Longname Entry Length
  2475                              <1> 	; OUTPUT ->
  2476                              <1> 	; 	ESI = Logical dos drive descripton table address 
  2477                              <1> 	;	EAX = First cluster to be truncated/unlinked
  2478                              <1> 	;       CF = 1 -> Error code in EAX (AL)
  2479                              <1> 	;       CF = 0 & BH <> 0 -> LMDT write error  (BH = 1)
  2480                              <1> 	;       CF = 0 & BL <> 0 -> Long name delete error (BL = FFh) 
  2481                              <1> 	;
  2482                              <1> 	;  (EDI, EBX, ECX register contents will be changed)
  2483                              <1> 
  2484 0000A0F3 881D[123C0100]      <1> 	mov	[DelFile_LNEL], bl
  2485 0000A0F9 66890D[103C0100]    <1> 	mov	[DelFile_EntryCounter], cx
  2486                              <1> 
  2487 0000A100 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  2488 0000A104 C1E010              <1> 	shl	eax, 16
  2489 0000A107 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  2490                              <1> 
  2491 0000A10B A3[0C3C0100]        <1> 	mov	[DelFile_FCluster], eax
  2492                              <1> 
  2493                              <1> loc_del_short_name:
  2494 0000A110 C607E5              <1> 	mov	byte [edi], 0E5h  ; Deleted sign
  2495                              <1> 
  2496 0000A113 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  2497 0000A11A E85AFCFFFF          <1> 	call	save_directory_buffer
  2498 0000A11F 723D                <1> 	jc	short loc_delete_direntry_err_return
  2499                              <1>  
  2500                              <1> loc_del_long_name:
  2501 0000A121 0FB615[123C0100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  2502 0000A128 08D2                <1> 	or	dl, dl
  2503 0000A12A 7416                <1> 	jz	short loc_del_dir_entry_update_parent_dir_lm_date
  2504                              <1> 
  2505 0000A12C 8835[123C0100]      <1> 	mov	byte [DelFile_LNEL], dh ; 0              
  2506                              <1>   
  2507 0000A132 0FB705[103C0100]    <1> 	movzx	eax,  word [DelFile_EntryCounter]
  2508 0000A139 29D0                <1> 	sub	eax, edx
  2509                              <1> 	;jnc	short loc_del_long_name_continue
  2510 0000A13B 7205                <1> 	jc	short loc_del_dir_entry_update_parent_dir_lm_date   
  2511                              <1> 
  2512                              <1> ;loc_del_direntry_inv_data_return: ; 15/10/2016 (0Dh -> 29)
  2513                              <1> ;	mov	eax, 29 ; 0Dh (TRDOS 8086) ; Invalid data
  2514                              <1> ;	retn
  2515                              <1> 
  2516                              <1> loc_del_long_name_continue: 
  2517                              <1> 	; AX = Directory Entry Number of the long name last entry
  2518 0000A13D E897FDFFFF          <1> 	call	delete_longname
  2519                              <1> 	;jc	short loc_delete_direntry_err_return
  2520                              <1> 
  2521                              <1> loc_del_dir_entry_update_parent_dir_lm_date:
  2522 0000A142 801D[123C0100]00    <1> 	sbb	byte [DelFile_LNEL], 0 ; 0FFh if cf = 1
  2523                              <1> 
  2524 0000A149 E8C6FCFFFF          <1> 	call	update_parent_dir_lmdt
  2525 0000A14E B700                <1> 	mov	bh, 0
  2526 0000A150 80D700              <1> 	adc	bh, 0
  2527                              <1> 
  2528 0000A153 8A1D[123C0100]      <1> 	mov	bl, byte [DelFile_LNEL]
  2529                              <1>  
  2530                              <1> loc_delete_direntry_return:
  2531 0000A159 A1[0C3C0100]        <1> 	mov	eax, [DelFile_FCluster]
  2532                              <1> loc_delete_direntry_err_return:
  2533 0000A15E C3                  <1> 	retn
  2534                              <1> 
  2535                              <1> rename_directory_entry:
  2536                              <1> 	; 15/10/2016
  2537                              <1> 	; 06/03/2016 (TRDOS 386 = TRDOS v2.0)
  2538                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_rename_directory_entry')
  2539                              <1> 	; 19/11/2010
  2540                              <1> 	; INPUT -> (Current Directory)
  2541                              <1> 	;	CX = Directory Entry Number
  2542                              <1> 	;      EAX = First Cluster number of file or directory
  2543                              <1> 	;      EBX = Longname Length (dir entry count) (< 256)
  2544                              <1> 	;      ESI = New file (or directory) name (no path).
  2545                              <1> 	;           (ASCIIZ string)  
  2546                              <1> 	; OUTPUT -> 
  2547                              <1> 	;      CF = 0 -> successfull
  2548                              <1> 	;      CF = 1 -> error code in EAX (AL)
  2549                              <1> 	;
  2550                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
  2551                              <1> 
  2552 0000A15F 803D[A5310100]00    <1> 	cmp	byte [Current_FATType], 0
  2553 0000A166 7706                <1> 	ja	short loc_rename_directory_entry
  2554                              <1> 
  2555 0000A168 E8B90E0000          <1> 	call	rename_fs_file_or_directory
  2556 0000A16D C3                  <1> 	retn 
  2557                              <1> 	
  2558                              <1> loc_rename_directory_entry:
  2559 0000A16E 881D[123C0100]      <1> 	mov	[DelFile_LNEL], bl
  2560 0000A174 66890D[103C0100]    <1> 	mov	[DelFile_EntryCounter], cx
  2561 0000A17B A3[0C3C0100]        <1> 	mov	[DelFile_FCluster], eax
  2562                              <1> 
  2563 0000A180 0FB7C1              <1> 	movzx	eax, cx
  2564 0000A183 E8BBFDFFFF          <1> 	call	locate_current_dir_entry
  2565 0000A188 7308                <1> 	jnc	short loc_rename_direntry_check_fcluster
  2566                              <1> 
  2567                              <1> loc_rename_direntry_pop_retn:
  2568 0000A18A C3                  <1> 	retn
  2569                              <1> 
  2570                              <1> loc_rename_direntry_pop_invd_retn:
  2571 0000A18B F9                  <1> 	stc
  2572                              <1> loc_rename_direntry_invd_retn:
  2573                              <1> 	; 15/10/2016 (0Dh -> 29)
  2574 0000A18C B81D000000          <1> 	mov	eax, 29 ; Invalid data
  2575                              <1> loc_rename_retn:
  2576 0000A191 C3                  <1> 	retn 
  2577                              <1> 
  2578                              <1> loc_rename_direntry_check_fcluster:
  2579 0000A192 668B5714            <1> 	mov	dx, [edi+20] ; First Cluster HW
  2580 0000A196 66C1E210            <1> 	shl	dx, 16
  2581 0000A19A 668B571A            <1> 	mov	dx, [edi+26] ; First Cluster LW
  2582 0000A19E 3B15[0C3C0100]      <1> 	cmp	edx, [DelFile_FCluster]
  2583 0000A1A4 75E5                <1> 	jne	short loc_rename_direntry_pop_invd_retn
  2584                              <1> 	; ESI = New file (or directory) name. (ASCIIZ string)
  2585                              <1> 	; 06/03/2016
  2586                              <1> 	; TRDOS v2 - NOTE: 'convert_file_name' procedure
  2587                              <1> 	; has been modified for eliminating following situation.
  2588                              <1> 	; 
  2589                              <1> 	; TRDOS v1 - NOTE: If file/dir name is more than 11 bytes
  2590                              <1> 	; without a dot, attributes (edi+11) byte will be overwritten !
  2591                              <1> 	; (Dot file name input must be proper for 11 byte dir entry
  2592                              <1> 	;  type file name output.) 
  2593 0000A1A6 E89FF6FFFF          <1> 	call	convert_file_name
  2594                              <1> 
  2595 0000A1AB C605[D0390100]02    <1>         mov     byte [DirBuff_ValidData], 2
  2596 0000A1B2 E8C2FBFFFF          <1> 	call	save_directory_buffer
  2597 0000A1B7 72D8                <1> 	jc	short loc_rename_retn
  2598                              <1> 
  2599                              <1> loc_rename_direntry_del_ln:
  2600 0000A1B9 0FB615[123C0100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  2601 0000A1C0 08D2                <1> 	or	dl, dl
  2602 0000A1C2 7410                <1> 	jz	short loc_rename_direntry_update_parent_dir_lm_date
  2603                              <1> 
  2604 0000A1C4 0FB705[103C0100]    <1> 	movzx	eax, word [DelFile_EntryCounter]
  2605 0000A1CB 29D0                <1> 	sub	eax, edx
  2606 0000A1CD 72BD                <1> 	jc	short loc_rename_direntry_invd_retn
  2607                              <1> 
  2608                              <1> loc_rename_direntry_del_ln_continue: 
  2609                              <1> 	; EAX = Directory Entry Number of the long name last entry
  2610 0000A1CF E805FDFFFF          <1> 	call	delete_longname
  2611                              <1> 
  2612                              <1> loc_rename_direntry_update_parent_dir_lm_date:
  2613 0000A1D4 E83BFCFFFF          <1> 	call	update_parent_dir_lmdt
  2614 0000A1D9 31C0                <1> 	xor	eax, eax 
  2615 0000A1DB C3                  <1> 	retn
  2616                              <1> 
  2617                              <1> move_source_file_to_destination_file:
  2618                              <1> 	; 15/10/2016
  2619                              <1> 	; 11/03/2016
  2620                              <1> 	; 10/03/2016 (TRDOS 386 = TRDOS v2.0)
  2621                              <1> 	; 01/08/2011 (FILE.ASM)
  2622                              <1> 	; 04/08/2010
  2623                              <1> 	;
  2624                              <1> 	;   Phase 1 -> Check destination file, 
  2625                              <1> 	;              'not found' is required
  2626                              <1> 	;   Phase 2 -> Check source file
  2627                              <1> 	;              'found' and proper attributes is required
  2628                              <1> 	;   Phase 3 -> Make destination directory entry,
  2629                              <1> 	;           add new dir cluster or section if it is required
  2630                              <1> 	;   Phase 4 -> Delete source directory entry.
  2631                              <1> 	;       cf = 1 causes to return before the phase 4.
  2632                              <1> 	;    (source file protection against any possible errors)    
  2633                              <1> 	;
  2634                              <1> 	; 08/05/2011 major modification
  2635                              <1> 	;            -> destination file deleting is removed   
  2636                              <1> 	;            for msdos move/rename compatibility.
  2637                              <1> 	;            (Access denied error will return if
  2638                              <1> 	;            the destination file is found...)
  2639                              <1> 	; INPUT ->
  2640                              <1> 	;	 ESI = Source File Pathname (Asciiz)
  2641                              <1> 	;        EDI = Destination File Pathname (Asciiz)
  2642                              <1> 	;        AL = 0 --> Interrupt (System call)
  2643                              <1> 	;        AL > 0 --> Command Interpreter (Question)
  2644                              <1> 	;        AL = 1 --> Question Phase
  2645                              <1> 	;        AL = 2 --> Progress Phase        
  2646                              <1> 	; OUTPUT -> 
  2647                              <1> 	;	 cf = 0 -> OK
  2648                              <1> 	;        EAX = Destination directory first cluster
  2649                              <1> 	;        ESI = Logical DOS drive description table 
  2650                              <1> 	;        EBX = Destination file structure offset
  2651                              <1> 	;        CX = 0 (CX > 0 --> calculate free space error)
  2652                              <1> 	;        cf = 1 -> Error code in EAX (AL) 
  2653                              <1> 	;
  2654                              <1> 	;  (EDX, ECX, EBX, ESI, EDI will be changed)
  2655                              <1> 
  2656 0000A1DC 3C02                <1> 	cmp	al, 2
  2657 0000A1DE 0F847F010000        <1> 	je	msftdf_df2_check_directory
  2658 0000A1E4 A2[923D0100]        <1> 	mov	[move_cmd_phase], al
  2659                              <1> 
  2660                              <1> msftdf_parse_sf_path:
  2661                              <1> 	; ESI = ASCIIZ pathname (Source)
  2662 0000A1E9 57                  <1> 	push	edi 
  2663 0000A1EA BF[903C0100]        <1> 	mov	edi, SourceFile_Drv
  2664 0000A1EF E821F7FFFF          <1> 	call	parse_path_name
  2665 0000A1F4 5E                  <1> 	pop	esi
  2666 0000A1F5 7211                <1> 	jc	short msftdf_psf_retn
  2667                              <1> 
  2668                              <1> msftdf_parse_df_path:
  2669                              <1> 	; ESI = ASCIIZ pathname	(Destination)
  2670 0000A1F7 BF[103D0100]        <1> 	mov	edi, DestinationFile_Drv
  2671 0000A1FC E814F7FFFF          <1> 	call	parse_path_name
  2672 0000A201 7306                <1> 	jnc	short msftdf_check_sf_drv
  2673                              <1> 
  2674 0000A203 3C01                <1> 	cmp	al, 1 ; File or directory name is not existing
  2675 0000A205 7602                <1> 	jna	short msftdf_check_sf_drv
  2676                              <1> 
  2677                              <1> msftdf_stc_retn:
  2678 0000A207 F9                  <1> 	stc
  2679                              <1> msftdf_psf_retn:
  2680 0000A208 C3                  <1> 	retn 
  2681                              <1> 
  2682                              <1> msftdf_check_sf_drv:
  2683 0000A209 A0[903C0100]        <1> 	mov	al, [SourceFile_Drv]
  2684                              <1> 
  2685                              <1> msftdf_check_df_drv:
  2686 0000A20E 8A15[103D0100]      <1> 	mov	dl, [DestinationFile_Drv]
  2687                              <1> 
  2688                              <1> msftdf_compare_sf_df_drv:
  2689 0000A214 29DB                <1> 	sub	ebx, ebx
  2690 0000A216 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
  2691 0000A21C 38C2                <1> 	cmp	dl, al
  2692 0000A21E 7409                <1> 	je	short msftdf_check_sf_df_drv_ok
  2693                              <1> 
  2694                              <1> msftdf_not_same_drv:
  2695                              <1>         ; DL = source file's drive number
  2696 0000A220 88C6                <1> 	mov	dh, al ; destination file's drive number
  2697                              <1> 	; 15/10/2016 (11h -> 21)
  2698 0000A222 B815000000          <1> 	mov	eax, 21 ; Not the same drive
  2699 0000A227 F9                  <1> 	stc
  2700 0000A228 C3                  <1> 	retn 
  2701                              <1> 
  2702                              <1> msftdf_check_sf_df_drv_ok:
  2703 0000A229 8815[933D0100]      <1> 	mov	[msftdf_sf_df_drv], dl
  2704                              <1> 
  2705 0000A22F 29C0                <1>         sub	eax, eax
  2706 0000A231 88D4                <1> 	mov	ah, dl
  2707 0000A233 0500010900          <1> 	add	eax, Logical_DOSDisks
  2708 0000A238 A3[943D0100]        <1> 	mov	[msftdf_drv_offset], eax
  2709                              <1> 
  2710 0000A23D 38FA                <1> 	cmp	dl, bh ; byte [Current_Drv]
  2711 0000A23F 7407                <1> 	je	short msftdf_df_check_directory
  2712                              <1> 
  2713                              <1> msftdf_change_drv:
  2714 0000A241 E826C1FFFF          <1> 	call 	change_current_drive
  2715 0000A246 726D                <1> 	jc	short msftdf_df_error_retn
  2716                              <1> 	  
  2717                              <1> msftdf_check_destination_file:
  2718                              <1> msftdf_df_check_directory:
  2719 0000A248 BE[113D0100]        <1> 	mov	esi, DestinationFile_Directory
  2720 0000A24D 803E20              <1> 	cmp	byte [esi], 20h
  2721 0000A250 760F                <1> 	jna	short msftdf_df_find_1
  2722                              <1> 
  2723                              <1> msftdf_df_change_directory:
  2724 0000A252 FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  2725 0000A258 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  2726 0000A25A E8A2F0FFFF          <1> 	call	change_current_directory
  2727 0000A25F 7254                <1> 	jc	short msftdf_df_error_retn
  2728                              <1> 
  2729                              <1> ;msftdf_df_change_prompt_dir_string:
  2730                              <1> ;	call 	change_prompt_dir_string
  2731                              <1> 
  2732                              <1> msftdf_df_find_1:
  2733 0000A261 BE[523D0100]        <1>         mov     esi, DestinationFile_Name
  2734 0000A266 803E20              <1> 	cmp	byte [esi], 20h
  2735 0000A269 7631                <1> 	jna	short msftdf_df_copy_sf_name
  2736                              <1> 
  2737                              <1> msftdf_df_find_2:
  2738 0000A26B 6631C0              <1> 	xor	ax, ax ; DestinationFile_AttributesMask -> any/zero
  2739 0000A26E E88BD4FFFF          <1> 	call	find_first_file
  2740 0000A273 0F838D000000        <1> 	jnc	msftdf_permission_denied_retn
  2741                              <1> 
  2742                              <1> msftdf_df_check_error_code:
  2743                              <1> 	;cmp	eax, 2 ; File not found error
  2744 0000A279 3C02                <1> 	cmp	al, 2
  2745 0000A27B 7537                <1> 	jne	short msftdf_df_stc_retn
  2746                              <1>               
  2747                              <1> msftdf_df_check_fname:
  2748                              <1> 	; 15/10/2016
  2749 0000A27D BE[523D0100]        <1> 	mov	esi, DestinationFile_Name ; *
  2750 0000A282 E837D8FFFF          <1> 	call	check_filename
  2751 0000A287 7307                <1> 	jnc	short msftdf_convert_df_direntry_name
  2752                              <1> 	; invalid file name chars !
  2753 0000A289 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME  ; 26
  2754 0000A28E EB24                <1> 	jmp	short msftdf_df_stc_retn
  2755                              <1> 
  2756                              <1> msftdf_convert_df_direntry_name:
  2757                              <1> 	; mov	esi, DestinationFile_Name ; *
  2758 0000A290 BF[623D0100]        <1> 	mov	edi, DestinationFile_DirEntry
  2759 0000A295 E8B0F5FFFF          <1> 	call	convert_file_name
  2760 0000A29A EB1A                <1>   	jmp	short msftdf_restore_current_dir_1
  2761                              <1> 
  2762                              <1> msftdf_df_copy_sf_name:
  2763 0000A29C 89F7                <1> 	mov	edi, esi
  2764 0000A29E 57                  <1> 	push	edi 
  2765 0000A29F BE[D23C0100]        <1>         mov     esi, SourceFile_Name
  2766 0000A2A4 B90C000000          <1> 	mov	ecx, 12
  2767                              <1> msftdf_df_copy_sf_name_loop:
  2768 0000A2A9 AC                  <1> 	lodsb
  2769 0000A2AA AA                  <1>         stosb
  2770 0000A2AB 08C0                <1> 	or	al, al
  2771 0000A2AD 7402                <1> 	jz	short msftdf_df_copy_sf_name_ok	
  2772 0000A2AF E2F8                <1>         loop    msftdf_df_copy_sf_name_loop
  2773                              <1> msftdf_df_copy_sf_name_ok:	
  2774 0000A2B1 5E                  <1> 	pop	esi  
  2775 0000A2B2 EBB7                <1> 	jmp	short msftdf_df_find_2
  2776                              <1> 
  2777                              <1> msftdf_df_stc_retn:
  2778 0000A2B4 F9                  <1> 	stc
  2779                              <1> msftdf_restore_cdir_failed:
  2780                              <1> msftdf_df_error_retn:
  2781 0000A2B5 C3                  <1> 	retn
  2782                              <1> 
  2783                              <1> msftdf_restore_current_dir_1:
  2784 0000A2B6 803D[0DED0000]00    <1> 	cmp	byte [Restore_CDIR], 0
  2785 0000A2BD 760D                <1> 	jna	short msftdf_sf_check_directory
  2786 0000A2BF 8B35[943D0100]      <1> 	mov	esi, [msftdf_drv_offset] 
  2787 0000A2C5 E859C1FFFF          <1> 	call	restore_current_directory
  2788 0000A2CA 72E9                <1> 	jc	short msftdf_restore_cdir_failed
  2789                              <1> 
  2790                              <1> msftdf_sf_check_directory:
  2791 0000A2CC BE[913C0100]        <1> 	mov	esi, SourceFile_Directory
  2792 0000A2D1 803E20              <1> 	cmp	byte [esi], 20h
  2793 0000A2D4 760F                <1> 	jna	short msftdf_sf_find
  2794                              <1> msftdf_sf_change_directory:
  2795 0000A2D6 FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  2796 0000A2DC 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  2797 0000A2DE E81EF0FFFF          <1> 	call	change_current_directory
  2798 0000A2E3 7227                <1> 	jc	short msftdf_return
  2799                              <1> 
  2800                              <1> ;msftdf_sf_change_prompt_dir_string:
  2801                              <1> ;	call	change_prompt_dir_string
  2802                              <1> 
  2803                              <1> msftdf_sf_find:
  2804 0000A2E5 BE[D23C0100]        <1>         mov     esi, SourceFile_Name  ; Offset 66
  2805 0000A2EA 66B80018            <1> 	mov	ax, 1800h ; Only files
  2806 0000A2EE E80BD4FFFF          <1> 	call	find_first_file
  2807 0000A2F3 7217                <1> 	jc	short msftdf_return
  2808                              <1> 
  2809                              <1> msftdf_sf_ambgfn_check:
  2810 0000A2F5 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  2811 0000A2F8 7407                <1> 	jz	short msftdf_sf_found
  2812                              <1> 
  2813                              <1> msftdf_ambiguous_file_name_error:
  2814 0000A2FA B802000000          <1> 	mov	eax, 2 ; File not found error
  2815 0000A2FF F9                  <1> 	stc
  2816 0000A300 C3                  <1> 	retn
  2817                              <1> 
  2818                              <1> msftdf_sf_found:
  2819 0000A301 80E31F              <1> 	and	bl, 1Fh ; Attributes, D-V-S-H-R
  2820 0000A304 7416                <1> 	jz	short msftdf_save_sf_structure
  2821                              <1> 
  2822                              <1> msftdf_permission_denied_retn:
  2823 0000A306 B805000000          <1> 	mov	eax, 05h ; Access (Permission) denied !
  2824 0000A30B F9                  <1> 	stc
  2825                              <1> msftdf_rest_cdir_err_retn:
  2826                              <1> msftdf_return:
  2827 0000A30C C3                  <1> 	retn
  2828                              <1> 
  2829                              <1> msftdf_phase_1_return:
  2830 0000A30D 31C0                <1> 	xor	eax, eax
  2831 0000A30F A2[923D0100]        <1> 	mov	[move_cmd_phase], al ; 0
  2832 0000A314 FEC0                <1> 	inc	al ; mov al, 1
  2833 0000A316 BB[63A30000]        <1> 	mov	ebx, msftdf_df2_check_directory
  2834                              <1> 	;mov	edx, 0FFFFFFFFh 
  2835 0000A31B C3                  <1> 	retn
  2836                              <1> 
  2837                              <1> msftdf_save_sf_structure:
  2838 0000A31C BE[9C3B0100]        <1> 	mov	esi, FindFile_DirEntry
  2839 0000A321 BF[E23C0100]        <1> 	mov	edi, SourceFile_DirEntry
  2840 0000A326 B908000000          <1> 	mov	ecx, 8
  2841 0000A32B F3A5                <1> 	rep	movsd
  2842                              <1> 
  2843                              <1> msftdf_df_copy_sf_parameters:
  2844 0000A32D BE0B000000          <1> 	mov	esi, 11
  2845 0000A332 89F7                <1> 	mov	edi, esi
  2846 0000A334 81C6[E23C0100]      <1> 	add	esi, SourceFile_DirEntry
  2847 0000A33A 81C7[623D0100]      <1> 	add	edi, DestinationFile_DirEntry
  2848                              <1> 	;mov	ecx, 21
  2849 0000A340 B115                <1> 	mov	cl, 21
  2850 0000A342 F3A4                <1> 	rep	movsb
  2851                              <1> 
  2852                              <1> msftdf_restore_current_dir_2:
  2853 0000A344 803D[0DED0000]00    <1> 	cmp	byte [Restore_CDIR], 0
  2854 0000A34B 760D                <1> 	jna	short msftdf_df2_check_move_cmd_phase
  2855 0000A34D 8B35[943D0100]      <1>  	mov	esi, [msftdf_drv_offset]
  2856 0000A353 E8CBC0FFFF          <1> 	call	restore_current_directory
  2857 0000A358 72B2                <1> 	jc	short msftdf_rest_cdir_err_retn
  2858                              <1> 
  2859                              <1> msftdf_df2_check_move_cmd_phase:
  2860 0000A35A 803D[923D0100]01    <1> 	cmp	byte [move_cmd_phase], 1
  2861 0000A361 74AA                <1> 	je	short msftdf_phase_1_return
  2862                              <1> 
  2863                              <1> msftdf_df2_check_directory:
  2864 0000A363 BE[113D0100]        <1> 	mov	esi, DestinationFile_Directory
  2865 0000A368 803E20              <1> 	cmp	byte [esi], 20h
  2866 0000A36B 760F                <1> 	jna	short msftdf_make_dfde_locate_ffe_on_directory
  2867                              <1> msftdf_df2_change_directory:
  2868 0000A36D FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  2869 0000A373 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  2870 0000A375 E887EFFFFF          <1> 	call	change_current_directory
  2871 0000A37A 7290                <1> 	jc	short msftdf_return
  2872                              <1> 
  2873                              <1> ;msftdf_df2_change_prompt_dir_string:
  2874                              <1> ;	call	change_prompt_dir_string
  2875                              <1> 
  2876                              <1> msftdf_make_dfde_locate_ffe_on_directory:
  2877                              <1> 	; Current directory fcluster <> Directory buffer cluster
  2878                              <1> 	; Current directory will be reloaded by
  2879                              <1> 	; 'locate_current_dir_file' procedure
  2880                              <1> 	;
  2881                              <1> 	;xor	ax, ax
  2882 0000A37C 31C0                <1> 	xor	eax, eax
  2883 0000A37E 89C1                <1> 	mov	ecx, eax
  2884 0000A380 6649                <1> 	dec	cx ; FFFFh  
  2885                              <1> 		; CX = FFFFh -> find first deleted or free entry
  2886                              <1> 		; ESI would be ASCIIZ filename address if the call
  2887                              <1> 		; would not be for first free or deleted dir entry  
  2888 0000A382 E8CEF1FFFF          <1> 	call	locate_current_dir_file
  2889 0000A387 733F                <1> 	jnc	msftdf_make_dfde_set_ff_dir_entry
  2890                              <1> 	
  2891                              <1> 	;cmp	eax, 2
  2892 0000A389 3C02                <1>         cmp	al, 2
  2893 0000A38B 7537                <1> 	jne	short msftdf_error_retn
  2894                              <1> 
  2895                              <1> msftdf_add_new_dir_entry_check_fs:
  2896 0000A38D 8B35[943D0100]      <1> 	mov	esi, [msftdf_drv_offset]
  2897 0000A393 A1[D5390100]        <1> 	mov 	eax, [DirBuff_Cluster]
  2898 0000A398 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  2899 0000A39C 7711                <1> 	ja	short msftdf_add_new_subdir_cluster
  2900                              <1> 
  2901                              <1> msftdf_add_new_fs_subdir_section:
  2902                              <1> 	;CL=0, CH=E5h --> deleted entry, CH=0 --> free entry
  2903                              <1>         ;xor	cx, cx
  2904 0000A39E 30ED                <1> 	xor	ch, ch ; cx = 0 --> add a new subdir section
  2905 0000A3A0 E8830C0000          <1> 	call	add_new_fs_section
  2906 0000A3A5 721E                <1>         jc	short msftdf_dsfde_error_retn
  2907                              <1> 	;mov	[createfile_LastDirCluster], eax
  2908                              <1> 
  2909 0000A3A7 E8A30E0000          <1> 	call	load_FS_sub_directory 
  2910                              <1> 	;mov	ebx, Directory_Buffer 
  2911 0000A3AC 7318                <1> 	jnc	short msftdf_add_new_fs_subdir_section_ok
  2912 0000A3AE C3                  <1> 	retn	 
  2913                              <1> 
  2914                              <1> msftdf_add_new_subdir_cluster:
  2915 0000A3AF E881150000          <1> 	call	add_new_cluster
  2916 0000A3B4 720F                <1> 	jc	short msftdf_dsfde_error_retn
  2917                              <1> 	
  2918                              <1> 	;mov	[createfile_LastDirCluster], eax
  2919                              <1> 
  2920 0000A3B6 E8570E0000          <1> 	call	load_FAT_sub_directory
  2921 0000A3BB 7309                <1> 	jnc	short msftdf_add_new_subdir_cluster_ok
  2922                              <1> 	; EBX = Directory buffer address
  2923                              <1> 
  2924                              <1> msftdf_ansdc_update_parent_dir_lmdt:
  2925                              <1> msftdf_make_dfde_err_upd_pdir_lmdt:
  2926 0000A3BD 50                  <1> 	push	eax
  2927 0000A3BE E851FAFFFF          <1> 	call	update_parent_dir_lmdt
  2928 0000A3C3 58                  <1> 	pop	eax
  2929                              <1> 
  2930                              <1> msftdf_error_retn:
  2931 0000A3C4 F9                  <1> 	stc
  2932                              <1> msftdf_dsfde_restore_cdir_failed:
  2933                              <1> msftdf_dsfde_error_retn:
  2934 0000A3C5 C3                  <1> 	retn
  2935                              <1> 
  2936                              <1> msftdf_add_new_fs_subdir_section_ok:
  2937                              <1> msftdf_add_new_subdir_cluster_ok:
  2938 0000A3C6 89DF                <1> 	mov	edi, ebx ; Directory buffer address
  2939                              <1> 
  2940                              <1> msftdf_make_dfde_set_ff_dir_entry:
  2941 0000A3C8 8B15[A0310100]      <1> 	mov	edx, [Current_Dir_FCluster]
  2942 0000A3CE 8915[F83D0100]      <1> 	mov	[createfile_FFCluster], edx
  2943                              <1> 	; EDI = Directory entry offset
  2944 0000A3D4 BE[623D0100]        <1> 	mov	esi, DestinationFile_DirEntry
  2945 0000A3D9 B908000000          <1> 	mov	ecx, 8
  2946 0000A3DE F3A5                <1> 	rep	movsd
  2947                              <1> 
  2948 0000A3E0 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2 
  2949 0000A3E7 E88DF9FFFF          <1> 	call	save_directory_buffer
  2950 0000A3EC 72CF                <1> 	jc	short msftdf_make_dfde_err_upd_pdir_lmdt
  2951                              <1> 
  2952                              <1> msftdf_make_dfde_update_pdir_lmdt:
  2953 0000A3EE E821FAFFFF          <1> 	call	update_parent_dir_lmdt
  2954                              <1> 
  2955                              <1> msftdf_dsfde_restore_current_dir_1:
  2956 0000A3F3 803D[0DED0000]00    <1> 	cmp	byte [Restore_CDIR], 0
  2957 0000A3FA 760D                <1> 	jna	short msftdf_dsfde_check_directory
  2958 0000A3FC 8B35[943D0100]      <1>  	mov	esi, [msftdf_drv_offset]
  2959 0000A402 E81CC0FFFF          <1> 	call	restore_current_directory
  2960 0000A407 72BC                <1> 	jc	short msftdf_dsfde_restore_cdir_failed
  2961                              <1> 
  2962                              <1> msftdf_dsfde_check_directory:
  2963 0000A409 BE[913C0100]        <1> 	mov	esi, SourceFile_Directory
  2964 0000A40E 803E20              <1> 	cmp	byte [esi], 20h
  2965 0000A411 760F                <1> 	jna	short msftdf_dsfde_find_file
  2966                              <1> 
  2967                              <1> msftdf_dsfde_change_directory:
  2968 0000A413 FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  2969 0000A419 28E4                <1> 	sub	ah, ah ; CD_COMMAND sign -> 0 
  2970 0000A41B E8E1EEFFFF          <1> 	call	change_current_directory
  2971 0000A420 72A3                <1> 	jc	short msftdf_dsfde_error_retn
  2972                              <1> 
  2973                              <1> ;msftdf_dsfde_sf_change_prompt_dir_string:
  2974                              <1> ;	call	change_prompt_dir_string
  2975                              <1> 
  2976                              <1> msftdf_dsfde_find_file:
  2977 0000A422 BE[D23C0100]        <1> 	mov	esi, SourceFile_Name  ; Offset 66
  2978 0000A427 668B460E            <1> 	mov	ax, [esi+14] ; 80 -> SourceFile_AttributesMask
  2979 0000A42B E8CED2FFFF          <1> 	call	find_first_file
  2980 0000A430 7293                <1> 	jc	short msftdf_dsfde_error_retn
  2981                              <1> 
  2982                              <1> msftdf_dsfde_delete_direntry:
  2983 0000A432 8B35[943D0100]      <1> 	mov	esi, [msftdf_drv_offset]
  2984                              <1> 	
  2985 0000A438 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  2986 0000A43C 770A                <1> 	ja	short msftdf_delete_FAT_direntry
  2987                              <1> 	
  2988 0000A43E 30DB                <1> 	xor	bl, bl
  2989                              <1> 	; BL = 0 -> File
  2990                              <1> 	; EDI -> Directory buffer entry offset/address 
  2991 0000A440 E8E40B0000          <1> 	call	delete_fs_directory_entry
  2992 0000A445 7315                <1> 	jnc	short msftdf_dsfde_restore_current_dir_2
  2993 0000A447 C3                  <1> 	retn
  2994                              <1> 
  2995                              <1> msftdf_delete_FAT_direntry:	
  2996 0000A448 8A1D[993B0100]      <1> 	mov	bl, [FindFile_LongNameEntryLength]
  2997 0000A44E 668B0D[C43B0100]    <1> 	mov	cx, [FindFile_DirEntryNumber]
  2998                              <1> 	; ESI = Logical DOS drive description table address
  2999                              <1> 	; EDI = Directory buffer entry offset/address 
  3000 0000A455 E899FCFFFF          <1> 	call	delete_directory_entry
  3001 0000A45A 721C                <1> 	jc	short msftdf_retn
  3002                              <1> 
  3003                              <1> msftdf_dsfde_restore_current_dir_2:
  3004 0000A45C 803D[0DED0000]00    <1> 	cmp	byte [Restore_CDIR], 0
  3005 0000A463 7607                <1> 	jna	short msftdf_new_dir_fcluster_retn
  3006                              <1> 	;mov	esi, [msftdf_drv_offset]
  3007 0000A465 E8B9BFFFFF          <1> 	call	restore_current_directory
  3008 0000A46A 720C                <1> 	jc	short msftdf_retn
  3009                              <1> 
  3010                              <1> msftdf_new_dir_fcluster_retn:
  3011 0000A46C 31C9                <1> 	xor	ecx, ecx 
  3012 0000A46E A1[F83D0100]        <1> 	mov	eax, [createfile_FFCluster]
  3013 0000A473 BB[103D0100]        <1> 	mov	ebx, DestinationFile_Drv
  3014                              <1> 
  3015                              <1> msftdf_retn:
  3016 0000A478 C3                  <1> 	retn
  3017                              <1> 
  3018                              <1> 
  3019                              <1> copy_source_file_to_destination_file:
  3020                              <1> 	; 17/10/2016
  3021                              <1> 	; 16/10/2016
  3022                              <1> 	; 15/10/2016
  3023                              <1> 	; 30/03/2016, 31/03/2016
  3024                              <1> 	; 24/03/2016, 25/03/2016, 28/03/2016
  3025                              <1> 	; 21/03/2016, 22/03/2016, 23/03/2016
  3026                              <1> 	; 16/03/2016, 17/03/2016, 18/03/2016
  3027                              <1> 	; 15/03/2016 (TRDOS 386 = TRDOS v2.0)
  3028                              <1> 	; 02/09/2011 (FILE.ASM 'copy_source_file_to_destination_file')
  3029                              <1> 	; 01/08/2010 - 18/05/2011
  3030                              <1> 	;
  3031                              <1> 	;   Command Interpreter phase 1 enter ->
  3032                              <1> 	;           AL = 1 -> Caller is command interpreter
  3033                              <1> 	;           AL = 2 -> The second call, re-enter/continue
  3034                              <1> 	;   Phase 1 -> Check source file
  3035                              <1> 	;              'found' is required
  3036                              <1> 	;   Phase 2 -> Check destination file, 
  3037                              <1> 	;              save 'found' or 'not found' status
  3038                              <1> 	;              'permission denied' error will be return
  3039                              <1> 	;              if attributes have not for ordinary file 
  3040                              <1> 	;              without readonly attribute
  3041                              <1> 	;   Command Interpreter phase 1 return ->
  3042                              <1> 	;              DH = Source file attributes
  3043                              <1> 	;              DL = Destination file found status
  3044                              <1> 	;              EAX = 0 
  3045                              <1> 	;   Command Interpreter phase 2 enter ->
  3046                              <1> 	;              AL = 2 -> Continue from the last position
  3047                              <1> 	;              AH = 
  3048                              <1> 	;   Phase 3 -> Load source file or use read/write cluster method
  3049                              <1> 	;   Phase 4 -> Create destination file if it is not found
  3050                              <1> 	;   Phase 5 -> Open destination file
  3051                              <1> 	;   Phase 6 -> Read from source and write to destination
  3052                              <1> 	;   Phase 7 -> Unload source file, if it is loaded at memory
  3053                              <1> 	;       cf = 1 causes to return before the phase 7
  3054                              <1> 	;              but loaded file will be unloaded
  3055                              <1> 	;	       (allocated memory block will be deallocated) 
  3056                              <1> 	;
  3057                              <1> 	; INPUT -> 
  3058                              <1> 	;	 ESI = Source File Pathname (Asciiz)
  3059                              <1> 	;        EDI = Destination File Pathname (Asciiz)
  3060                              <1> 	;        AL = 0 --> Interrupt (System call)
  3061                              <1> 	;        AL > 0 --> Command Interpreter (Question)
  3062                              <1> 	;        AL = 1 --> Question Phase
  3063                              <1> 	;        AL = 2 --> Progress Phase        
  3064                              <1> 	;
  3065                              <1> 	; OUTPUT -> 
  3066                              <1> 	;	cf = 0 -> OK
  3067                              <1> 	;	EAX = Destination file first cluster
  3068                              <1> 	;
  3069                              <1> 	;        CL > 0 if there is file reading error before EOF
  3070                              <1> 	;	        (incomplete copy) 
  3071                              <1> 	;        CH > 0 if file is (full) loaded at memory
  3072                              <1> 	;
  3073                              <1> 	;	cf = 1 -> Error code in AL (EAX) 
  3074                              <1> 	;
  3075                              <1> 	; (EBX, ECX, ESI, EDI register contents will be changed)           
  3076                              <1> 
  3077                              <1> 
  3078 0000A479 3C02                <1> 	cmp	al, 2
  3079 0000A47B 0F845A020000        <1> 	je	csftdf2_check_cdrv
  3080                              <1> 
  3081                              <1> ; Phase 1
  3082                              <1> 
  3083 0000A481 A2[B83D0100]        <1> 	mov	byte [copy_cmd_phase], al
  3084                              <1> 
  3085 0000A486 57                  <1> 	push	edi ; *
  3086                              <1> 
  3087                              <1> csftdf_parse_sf_path:
  3088 0000A487 BF[903C0100]        <1> 	mov	edi, SourceFile_Drv
  3089 0000A48C E884F4FFFF          <1> 	call	parse_path_name
  3090 0000A491 721C                <1> 	jc	short csftdf_parse_sf_path_failed
  3091                              <1> 
  3092                              <1> csftdf_parse_df_path:	
  3093 0000A493 5E                  <1> 	pop	esi ; * (pushed edi) 
  3094                              <1> 
  3095                              <1> csftdf_sf_check_filename_exists:
  3096 0000A494 803D[D23C0100]21    <1> 	cmp	byte [SourceFile_Name], 21h
  3097 0000A49B 7215                <1> 	jb	short csftdf_sf_file_not_found_error
  3098                              <1> 
  3099 0000A49D BF[103D0100]        <1> 	mov	edi, DestinationFile_Drv
  3100 0000A4A2 E86EF4FFFF          <1> 	call	parse_path_name
  3101 0000A4A7 7310                <1> 	jnc	short csftdf_check_sf_cdrv
  3102                              <1> 	
  3103 0000A4A9 3C01                <1> 	cmp	al, 1 ; File or directory name is not existing
  3104 0000A4AB 760C                <1> 	jna	short csftdf_check_sf_cdrv
  3105                              <1> 
  3106                              <1> csftdf_parse_df_path_failed:
  3107 0000A4AD F9                  <1> 	stc 
  3108                              <1> csftdf_sf_error_retn: 
  3109 0000A4AE C3                  <1> 	retn
  3110                              <1> 
  3111                              <1> csftdf_parse_sf_path_failed:	
  3112 0000A4AF 5F                  <1> 	pop	edi ; *
  3113 0000A4B0 EBFC                <1> 	jmp	short csftdf_sf_error_retn
  3114                              <1> 
  3115                              <1> csftdf_sf_file_not_found_error:
  3116 0000A4B2 B802000000          <1> 	mov	eax, 2 ; File not found 
  3117 0000A4B7 EBF5                <1> 	jmp	short csftdf_sf_error_retn
  3118                              <1> 
  3119                              <1> csftdf_check_sf_cdrv:
  3120 0000A4B9 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
  3121                              <1> 
  3122 0000A4BF 883D[BB3D0100]      <1> 	mov	[csftdf_cdrv], bh ; 23/03/2016
  3123                              <1> 
  3124 0000A4C5 8A15[903C0100]      <1> 	mov	dl, [SourceFile_Drv]
  3125 0000A4CB 38FA                <1> 	cmp	dl, bh ; byte [Current_Drv]
  3126 0000A4CD 7407                <1> 	je	short csftdf_sf_check_directory
  3127                              <1> 
  3128 0000A4CF E898BEFFFF          <1> 	call	change_current_drive
  3129 0000A4D4 72D8                <1> 	jc	short csftdf_sf_error_retn
  3130                              <1> 
  3131                              <1> csftdf_sf_check_directory:
  3132 0000A4D6 BE[913C0100]        <1> 	mov	esi, SourceFile_Directory
  3133 0000A4DB 803E20              <1> 	cmp	byte [esi], 20h
  3134 0000A4DE 760F                <1> 	jna	short csftdf_find_sf
  3135                              <1> 
  3136                              <1> csftdf_sf_change_directory:
  3137 0000A4E0 FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  3138 0000A4E6 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3139 0000A4E8 E814EEFFFF          <1> 	call	change_current_directory
  3140 0000A4ED 72BF                <1> 	jc	short csftdf_sf_error_retn
  3141                              <1> 
  3142                              <1> ;csftdf_sf_change_prompt_dir_string:
  3143                              <1> ;	call	change_prompt_dir_string
  3144                              <1> 
  3145                              <1> csftdf_find_sf:
  3146 0000A4EF BE[D23C0100]        <1> 	mov	esi, SourceFile_Name
  3147 0000A4F4 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  3148 0000A4F8 E801D2FFFF          <1> 	call	find_first_file
  3149 0000A4FD 72AF                <1> 	jc	short csftdf_sf_error_retn
  3150                              <1> 
  3151                              <1> csftdf_sf_ambgfn_check:
  3152 0000A4FF 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3153 0000A502 7407                <1> 	jz	short csftdf_sf_found
  3154                              <1> 
  3155                              <1> csftdf_ambiguous_file_name_error:
  3156 0000A504 B802000000          <1> 	mov	eax, 2 ; File not found error
  3157 0000A509 F9                  <1> 	stc
  3158 0000A50A C3                  <1> 	retn
  3159                              <1> 
  3160                              <1> csftdf_sf_found:
  3161 0000A50B A3[BC3D0100]        <1> 	mov	[csftdf_filesize], eax
  3162                              <1> 
  3163 0000A510 09C0                <1> 	or	eax, eax
  3164 0000A512 7507                <1> 	jnz	short csftdf_set_source_file_direntry
  3165                              <1> 
  3166                              <1> csftdf_sf_file_size_zero:
  3167 0000A514 B814000000          <1> 	mov	eax, 20 ; TRDOS zero length (file size) error
  3168 0000A519 F9                  <1> 	stc
  3169 0000A51A C3                  <1> 	retn
  3170                              <1> 
  3171                              <1> csftdf_set_source_file_direntry:
  3172 0000A51B BE[9C3B0100]        <1> 	mov	esi, FindFile_DirEntry
  3173 0000A520 BF[E23C0100]        <1> 	mov	edi, SourceFile_DirEntry
  3174 0000A525 B908000000          <1> 	mov	ecx, 8
  3175 0000A52A F3A5                <1> 	rep	movsd
  3176                              <1> 
  3177                              <1> csftdf_sf_restore_cdrv:
  3178                              <1> 	; 22/03/2016
  3179 0000A52C 8A15[BB3D0100]      <1> 	mov	dl, [csftdf_cdrv]
  3180 0000A532 3A15[A6310100]      <1> 	cmp	dl, [Current_Drv]
  3181 0000A538 7407                <1> 	je	short csftdf_sf_restore_cdir
  3182 0000A53A E82DBEFFFF          <1> 	call	change_current_drive 
  3183 0000A53F 724F                <1> 	jc	short csftdf_df_error_retn ; 30/03/2016
  3184                              <1> 
  3185                              <1> csftdf_sf_restore_cdir:
  3186 0000A541 803D[0DED0000]00    <1> 	cmp	byte [Restore_CDIR], 0
  3187 0000A548 7612                <1> 	jna	short csftdf_df_check_filename_exists
  3188 0000A54A 29C0                <1> 	sub	eax, eax
  3189 0000A54C BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3190 0000A551 88D4                <1> 	mov	ah, dl ; byte [csftdf_cdrv]
  3191 0000A553 01C6                <1> 	add	esi, eax
  3192 0000A555 E8C9BEFFFF          <1> 	call	restore_current_directory
  3193 0000A55A 7234                <1> 	jc	short csftdf_df_error_retn
  3194                              <1>   
  3195                              <1> csftdf_df_check_filename_exists:
  3196 0000A55C 803D[523D0100]20    <1> 	cmp	byte [DestinationFile_Name], 20h
  3197 0000A563 7716                <1> 	ja	short csftdf_check_df_cdrv
  3198                              <1> 
  3199                              <1> csftdf_copy_sf_name:
  3200 0000A565 BF[523D0100]        <1> 	mov	edi, DestinationFile_Name
  3201 0000A56A BE[D23C0100]        <1> 	mov	esi, SourceFile_Name
  3202 0000A56F B10C                <1> 	mov	cl, 12
  3203                              <1> 
  3204                              <1> csftdf_df_copy_sf_name_loop:
  3205 0000A571 AC                  <1> 	lodsb
  3206 0000A572 AA                  <1> 	stosb
  3207 0000A573 08C0                <1> 	or	al, al
  3208 0000A575 7404                <1> 	jz	short csftdf_check_df_cdrv             
  3209 0000A577 FEC9                <1> 	dec	cl
  3210 0000A579 75F6                <1> 	jnz	csftdf_df_copy_sf_name_loop
  3211                              <1> 
  3212                              <1> csftdf_check_df_cdrv:
  3213 0000A57B 8A15[103D0100]      <1> 	mov	dl, [DestinationFile_Drv]
  3214 0000A581 3A15[A6310100]      <1> 	cmp	dl, [Current_Drv]
  3215 0000A587 7408                <1> 	je	short csftdf_df_check_directory
  3216                              <1> 
  3217 0000A589 E8DEBDFFFF          <1> 	call	change_current_drive
  3218 0000A58E 7301                <1> 	jnc	short csftdf_df_check_directory
  3219                              <1> 
  3220                              <1> csftdf_df_error_retn:
  3221 0000A590 C3                  <1> 	retn
  3222                              <1> 
  3223                              <1> csftdf_df_check_directory:
  3224 0000A591 BE[113D0100]        <1> 	mov	esi, DestinationFile_Directory
  3225 0000A596 803E20              <1>         cmp     byte [esi], 20h
  3226 0000A599 760F                <1> 	jna	short csftdf_find_df
  3227                              <1> 
  3228                              <1> csftdf_df_change_directory:
  3229 0000A59B FE05[0DED0000]      <1> 	inc	byte [Restore_CDIR]
  3230 0000A5A1 28E4                <1> 	sub	ah, ah ; CD_COMMAND sign -> 0 
  3231 0000A5A3 E859EDFFFF          <1> 	call	change_current_directory
  3232 0000A5A8 72E6                <1> 	jc	short csftdf_df_error_retn
  3233                              <1> 
  3234                              <1> ;csftdf_df_change_prompt_dir_string:
  3235                              <1> ;	call	change_prompt_dir_string
  3236                              <1> 
  3237                              <1> csftdf_find_df:
  3238                              <1> 	; 23/03/2016
  3239 0000A5AA 29DB                <1> 	sub	ebx, ebx
  3240 0000A5AC 8A3D[103D0100]      <1> 	mov	bh,  [DestinationFile_Drv]
  3241 0000A5B2 81C300010900        <1> 	add	ebx, Logical_DOSDisks
  3242 0000A5B8 891D[E83D0100]      <1> 	mov	[csftdf_df_drv_dt], ebx
  3243                              <1> 
  3244 0000A5BE BE[523D0100]        <1> 	mov	esi, DestinationFile_Name
  3245 0000A5C3 6631C0              <1> 	xor	ax, ax 
  3246                              <1> 		; DestinationFile_AttributesMask -> any/zero
  3247 0000A5C6 E833D1FFFF          <1> 	call	find_first_file
  3248 0000A5CB 7218                <1> 	jc	short csftdf_df_check_error_code
  3249                              <1> 
  3250                              <1> csftdf_df_ambgfn_check:
  3251 0000A5CD 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3252 0000A5D0 752A                <1> 	jnz	short csftdf_df_error_inv_fname
  3253                              <1> 	
  3254                              <1> csftdf_df_found:
  3255 0000A5D2 C605[BA3D0100]01    <1> 	mov	byte [DestinationFileFound], 1
  3256                              <1> 	; 17/10/2016 (cl -> bl)
  3257 0000A5D9 80E31F              <1> 	and	bl, 1Fh ; Attributes, D-V-S-H-R
  3258 0000A5DC 745F                <1> 	jz	short csftdf_df_save_first_cluster
  3259                              <1> 
  3260                              <1> csftdf_df_permission_denied_retn:	 
  3261 0000A5DE B805000000          <1> 	mov	eax, 05h ; Access/Permisson denied.
  3262                              <1> csftdf_df_error_stc_retn:
  3263 0000A5E3 F9                  <1> 	stc
  3264 0000A5E4 C3                  <1> 	retn
  3265                              <1> 
  3266                              <1> csftdf_df_check_error_code:
  3267                              <1> 	;cmp	eax, 2
  3268 0000A5E5 3C02                <1> 	cmp	al, 2
  3269 0000A5E7 75FA                <1> 	jne	short csftdf_df_error_stc_retn
  3270                              <1> 
  3271 0000A5E9 C605[BA3D0100]00    <1> 	mov	byte [DestinationFileFound], 0
  3272                              <1> 
  3273                              <1> 	; 15/10/2016
  3274 0000A5F0 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name ; *
  3275 0000A5F5 E8C4D4FFFF          <1> 	call	check_filename
  3276 0000A5FA 7307                <1> 	jnc	short csftdf_df_valid_fname
  3277                              <1> csftdf_df_error_inv_fname: ; 'invalid file name !'
  3278 0000A5FC B81A000000          <1> 	mov 	eax, ERR_INV_FILE_NAME  ; 26
  3279 0000A601 F9                  <1> 	stc	
  3280 0000A602 C3                  <1> 	retn
  3281                              <1> 
  3282                              <1> csftdf_df_valid_fname:	
  3283                              <1> 	; 21/03/2016
  3284                              <1> 	; (Capitalized file name)
  3285                              <1> 	;mov	esi, FindFile_Name ; * ; 15/10/2016
  3286 0000A603 BF[523D0100]        <1> 	mov	edi, DestinationFile_Name
  3287 0000A608 A5                  <1> 	movsd
  3288 0000A609 A5                  <1> 	movsd	
  3289 0000A60A A5                  <1> 	movsd
  3290                              <1> 	;movsb
  3291                              <1> 
  3292                              <1> csftdf_check_disk_free_size_0:
  3293 0000A60B A1[FE3C0100]        <1> 	mov	eax, [SourceFile_DirEntry+DirEntry_FileSize]
  3294                              <1> 
  3295                              <1> csftdf_check_disk_free_size_1:
  3296                              <1> 	;sub	ebx, ebx
  3297                              <1> 	;mov 	esi, Logical_DOSDisks
  3298                              <1> 	;mov	bh,  [DestinationFile_Drv]
  3299                              <1> 	;add	esi, ebx
  3300                              <1> 	
  3301 0000A610 8B35[E83D0100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 23/03/2016
  3302                              <1> 
  3303 0000A616 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 17, LD_BPB + 0Bh
  3304 0000A61A 01C8                <1> 	add	eax, ecx
  3305 0000A61C 48                  <1> 	dec	eax  ; file size (additional bytes) + 511 (round up)
  3306                              <1> csftdf_check_disk_free_size_3: ; 16/03/2016
  3307 0000A61D 29D2                <1> 	sub	edx, edx
  3308 0000A61F F7F1                <1> 	div	ecx ; bytes per sector
  3309                              <1> 
  3310                              <1> csftdf_check_disk_free_size:
  3311 0000A621 3B4674              <1> 	cmp	eax, [esi+LD_FreeSectors]
  3312 0000A624 0F8294000000        <1>         jb      csftdf_check_disk_free_size_ok
  3313 0000A62A 770A                <1> 	ja	short csftdf_df_insufficient_disk_space
  3314                              <1> 
  3315 0000A62C 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0 ; FS needs FDT sector also.
  3316 0000A630 0F8788000000        <1>         ja      csftdf_check_disk_free_size_ok 
  3317                              <1> 
  3318                              <1> csftdf_df_insufficient_disk_space:
  3319 0000A636 B827000000          <1> 	mov	eax, 27h ; insufficient disk space
  3320 0000A63B EBA6                <1> 	jmp	short csftdf_df_error_stc_retn
  3321                              <1> 
  3322                              <1> csftdf_df_save_first_cluster:
  3323                              <1> 	; ESI = FindFile_DirEntry (for the old destination file)
  3324                              <1> 	; EAX = Old destination file size
  3325                              <1> 	; 24/03/2016
  3326                              <1> 	; EDI = Directory entry address (within Dir Buffer boundaries)
  3327 0000A63D 81EF00000800        <1> 	sub	edi, Directory_Buffer  ; (<65536)
  3328 0000A643 66C1EF05            <1> 	shr	di, 5 ; Convert entry offset to entry index/number
  3329 0000A647 66893D[8A3D0100]    <1> 	mov	[DestinationFile_DirEntryNumber], di ; (<2048)
  3330                              <1> 
  3331                              <1> csftdf_df_check_sf_df_fcluster:
  3332 0000A64E 668B5614            <1> 	mov	dx, [esi+DirEntry_FstClusHI]
  3333 0000A652 C1E210              <1> 	shl	edx, 16
  3334 0000A655 668B561A            <1> 	mov	dx, [esi+DirEntry_FstClusLO]
  3335 0000A659 8915[CC3D0100]      <1> 	mov	[csftdf_df_cluster], edx
  3336                              <1> csftdf_df_check_sf_df_fcluster_1:
  3337 0000A65F 668B15[F63C0100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusHI]
  3338 0000A666 C1E210              <1> 	shl	edx, 16
  3339 0000A669 668B15[FC3C0100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusLO]
  3340 0000A670 3B15[CC3D0100]      <1> 	cmp	edx, [csftdf_df_cluster]
  3341 0000A676 7512                <1> 	jne	short csftdf_df_check_sf_df_fcluster_ok
  3342                              <1> csftdf_df_check_sf_df_drv:
  3343 0000A678 8A15[903C0100]      <1> 	mov	dl, [SourceFile_Drv]
  3344 0000A67E 3A15[103D0100]      <1> 	cmp	dl, [DestinationFile_Drv]
  3345 0000A684 7504                <1> 	jne	short csftdf_df_check_sf_df_fcluster_ok
  3346                              <1> 
  3347                              <1> 	; source and destination files are same !
  3348                              <1> 	; (they have same first cluster value on same logical disk)
  3349                              <1> 
  3350 0000A686 31C0                <1> 	xor	eax, eax ; mov eax, 0 -> Bad command or file name !
  3351 0000A688 F9                  <1> 	stc
  3352 0000A689 C3                  <1> 	retn 
  3353                              <1>    
  3354                              <1> csftdf_df_check_sf_df_fcluster_ok:
  3355                              <1> csftdf_df_move_findfile_struct:
  3356                              <1> 	; mov	esi, FindFile_DirEntry
  3357 0000A68A BF[623D0100]        <1> 	mov	edi, DestinationFile_DirEntry
  3358 0000A68F B908000000          <1> 	mov	ecx, 8
  3359 0000A694 F3A5                <1> 	rep	movsd
  3360                              <1> 	
  3361                              <1> csftdf_check_disk_free_size_2:
  3362 0000A696 89C2                <1> 	mov	edx, eax ; Old destination file size
  3363                              <1> 
  3364                              <1> 	;mov	eax, [SourceFile_DirEntry+DirEntry_FileSize]
  3365 0000A698 A1[BC3D0100]        <1> 	mov	eax, [csftdf_filesize] ; 23/03/2016
  3366                              <1> 
  3367                              <1> 	;;sub	ecx, ecx ; 0
  3368                              <1> 	;mov 	esi, Logical_DOSDisks
  3369                              <1> 	;mov	ch,  [DestinationFile_Drv]
  3370                              <1> 	;add	esi, ecx
  3371                              <1> 	;
  3372                              <1> 	;mov	[csftdf_df_drv_dt], esi
  3373                              <1> 
  3374 0000A69D 8B35[E83D0100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 23/03/2016
  3375                              <1> 
  3376 0000A6A3 668B4E11            <1> 	mov	cx, [esi+LD_BPB+BytesPerSec] ; 17, LD_BPB + 0Bh
  3377 0000A6A7 01CA                <1> 	add	edx, ecx ; + 512
  3378 0000A6A9 01C8                <1> 	add	eax, ecx ; + 512
  3379 0000A6AB 4A                  <1> 	dec	edx ; old file size + 511 (round up)
  3380 0000A6AC 48                  <1> 	dec	eax ; new file size + 511 (round up)
  3381 0000A6AD F7D9                <1> 	neg	ecx ; -512 ; 0FFFFFE00h
  3382 0000A6AF 21CA                <1> 	and	edx, ecx ; = old sector count * 512 
  3383 0000A6B1 21C8                <1> 	and	eax, ecx ; = new sector count * 512 
  3384                              <1> 
  3385 0000A6B3 29D0                <1> 	sub	eax, edx ; new file size - old file size (on disk)
  3386 0000A6B5 7607                <1> 	jna	short csftdf_check_disk_free_size_ok
  3387                              <1> 
  3388 0000A6B7 F7D9                <1> 	neg	ecx ; 512 (bytes per sector) ; 200h
  3389                              <1> 	; check free space for additional sectors
  3390                              <1> 	; eax = number of additional sectors * bytes per sector
  3391                              <1> 	; esi = Logical DOS drive number (of destination disk)
  3392 0000A6B9 E95FFFFFFF          <1>         jmp     csftdf_check_disk_free_size_3
  3393                              <1>  
  3394                              <1> csftdf_check_disk_free_size_ok:
  3395                              <1> 	; 18/03/2016
  3396                              <1> csftdf_df_check_copy_cmd_phase:
  3397 0000A6BE A0[B83D0100]        <1> 	mov	al, [copy_cmd_phase]
  3398 0000A6C3 3C01                <1> 	cmp	al, 1
  3399 0000A6C5 7514                <1> 	jne	short csftdf2_check_cdrv
  3400                              <1> 	
  3401 0000A6C7 31C0                <1> 	xor	eax, eax
  3402 0000A6C9 A2[B83D0100]        <1> 	mov	[copy_cmd_phase], al ; 0
  3403                              <1> 
  3404 0000A6CE 8A15[BA3D0100]      <1> 	mov	dl, [DestinationFileFound]            
  3405 0000A6D4 8A35[ED3C0100]      <1> 	mov	dh, [SourceFile_DirEntry+11] ; Attributes
  3406                              <1>  
  3407                              <1> csftdf_return:	
  3408 0000A6DA C3                  <1> 	retn
  3409                              <1> 
  3410                              <1> ; Phase 2
  3411                              <1> 
  3412                              <1> csftdf2_check_cdrv:
  3413                              <1> 	; 18/03/2016
  3414                              <1> 	; Here, destination drive and directory are ready !
  3415                              <1> 	; (checking/restoring is not needed)
  3416                              <1> 	; (Since at the end of the phase 1)
  3417                              <1> 
  3418                              <1> ;	mov	dl, [DestinationFile_Drv]
  3419                              <1> ;	cmp	dl, [Current_Drv]
  3420                              <1> ;	je	short csftdf2_df_check_directory
  3421                              <1> ;
  3422                              <1> ;	call	change_current_drive
  3423                              <1> ;	jc	short csftdf2_read_error
  3424                              <1> ;
  3425                              <1> ;csftdf2_df_check_directory:
  3426                              <1> ;	mov	esi, DestinationFile_Directory  
  3427                              <1> ;	cmp	byte [esi], 20h
  3428                              <1> ;	jna	short csftdf2_df_check_found_or_not
  3429                              <1> ;
  3430                              <1> ;csftdf2_df_change_directory:
  3431                              <1> ;	inc	byte [Restore_CDIR]
  3432                              <1> ;	xor	ah, ah ; CD_COMMAND sign -> 0 
  3433                              <1> ;	call	change_current_directory
  3434                              <1> ;	jc	short csftdf2_stc_return
  3435                              <1> ;
  3436                              <1> ;;csftdf2_df_change_prompt_dir_string:
  3437                              <1> ;;	call	change_prompt_dir_string
  3438                              <1> 
  3439                              <1> csftdf2_df_check_found_or_not:
  3440                              <1> 	; 21/03/2016
  3441 0000A6DB 803D[BA3D0100]00    <1> 	cmp	byte [DestinationFileFound], 0 
  3442 0000A6E2 7739                <1> 	ja	short csftdf2_set_sf_percentage
  3443                              <1> 
  3444                              <1> csftdf2_create_file:
  3445 0000A6E4 BE[523D0100]        <1> 	mov	esi, DestinationFile_Name
  3446 0000A6E9 A1[BC3D0100]        <1> 	mov	eax, [csftdf_filesize]
  3447 0000A6EE 30C9                <1> 	xor	cl, cl ; 0
  3448                              <1> 
  3449 0000A6F0 31DB                <1> 	xor	ebx, ebx ; 0
  3450 0000A6F2 4B                  <1> 	dec	ebx ; 0FFFFFFFFh 
  3451                              <1> 
  3452                              <1> 	; INPUT ->
  3453                              <1> 	; 	EAX -> File Size
  3454                              <1> 	; 	ESI = ASCIIZ File name
  3455                              <1> 	;	 CL = File attributes
  3456                              <1> 	;	EBX = FFFFFFFFh -> empty file sign for FAT fs
  3457                              <1> 	;	EBX <> FFFFFFFFh -> use file size for FAT fs 
  3458                              <1> 	;
  3459                              <1> 	; OUTPUT ->
  3460                              <1> 	;	EAX = New file's first cluster
  3461                              <1> 	;	ESI = Logical Dos Drv Descr. Table Addr.
  3462                              <1> 	;	EBX = CreateFile_Size address
  3463                              <1> 	;	ECX = Sectors per cluster (<256)
  3464                              <1> 	;	EDX = Directory Entry Index/Number (<65536)
  3465                              <1> 	;		
  3466                              <1> 	;	cf = 1 -> error code in AL (EAX)
  3467                              <1> 
  3468 0000A6F3 E8EC050000          <1> 	call	create_file
  3469                              <1> 	;pop	esi
  3470 0000A6F8 0F82A3050000        <1>         jc      csftdf2_rw_error
  3471                              <1> 
  3472                              <1> csftdf2_create_file_OK:
  3473 0000A6FE A3[CC3D0100]        <1> 	mov	[csftdf_df_cluster], eax
  3474                              <1> 	
  3475                              <1> 	; 24/03/2016
  3476 0000A703 668915[8A3D0100]    <1> 	mov	[DestinationFile_DirEntryNumber], dx 
  3477                              <1> 
  3478                              <1> 	; 21/03/2016
  3479 0000A70A BE00000800          <1> 	mov	esi, Directory_Buffer
  3480 0000A70F C1E205              <1> 	shl	edx, 5 ; 32 * index number
  3481 0000A712 01D6                <1> 	add	esi, edx
  3482 0000A714 BF[623D0100]        <1> 	mov	edi, DestinationFile_DirEntry	
  3483 0000A719 B108                <1> 	mov	cl, 8 ; 32 bytes
  3484 0000A71B F3A5                <1> 	rep	movsd
  3485                              <1> 
  3486                              <1> csftdf2_set_sf_percentage:
  3487                              <1> 	; 17/03/2016
  3488 0000A71D 31C0                <1> 	xor	eax, eax	
  3489 0000A71F A2[E03D0100]        <1> 	mov 	[csftdf_percentage], al ; 0, reset
  3490                              <1> 
  3491 0000A724 A3[D83D0100]        <1> 	mov	[csftdf_sf_rbytes], eax ; 0, reset
  3492 0000A729 A3[DC3D0100]        <1> 	mov	[csftdf_df_wbytes], eax ; 0, reset
  3493                              <1> 
  3494 0000A72E 8A25[903C0100]      <1> 	mov	ah, [SourceFile_Drv]	
  3495 0000A734 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3496 0000A739 01C6                <1> 	add	esi, eax
  3497                              <1> 	
  3498 0000A73B 8935[E43D0100]      <1> 	mov	[csftdf_sf_drv_dt], esi ; 23/03/2016
  3499                              <1> 
  3500 0000A741 668B15[F63C0100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusHI]
  3501 0000A748 C1E210              <1> 	shl	edx, 16
  3502 0000A74B 668B15[FC3C0100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusLO]
  3503 0000A752 8915[C83D0100]      <1> 	mov	[csftdf_sf_cluster], edx
  3504                              <1> 
  3505                              <1> 	; 16/03/2016
  3506                              <1> 	; Note: Singlix FS boot sector parameters (for cluster
  3507                              <1> 	;	related calculations) has same offset
  3508                              <1> 	;	values from LD_BPB as in FAT file system.
  3509                              <1> 	;	[esi+LD_BPB+SecPerClust] is 1 for Singlix FS.
  3510                              <1> 	;	
  3511 0000A758 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  3512 0000A75C 880D[0E3D0100]      <1> 	mov	[SourceFile_SecPerClust], cl
  3513                              <1> 
  3514                              <1> 	; 17/03/2016
  3515 0000A762 386E03              <1> 	cmp	[esi+LD_FATType], ch ; 0
  3516 0000A765 7707                <1> 	ja	short csftdf2_set_sf_percent_rsize1
  3517                              <1> 
  3518 0000A767 B800000100          <1> 	mov	eax, 65536 ; read/write buffer size for Singlix FS
  3519 0000A76C EB06                <1> 	jmp	short csftdf2_set_sf_percent_rsize2	
  3520                              <1>  
  3521                              <1> csftdf2_set_sf_percent_rsize1:
  3522 0000A76E 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec]
  3523 0000A772 F7E1                <1> 	mul	ecx
  3524                              <1> 	;sub	edx, edx
  3525                              <1> csftdf2_set_sf_percent_rsize2:
  3526 0000A774 A3[D03D0100]        <1> 	mov	[csftdf_r_size], eax
  3527                              <1> 
  3528                              <1> csftdf2_set_df_percentage:
  3529                              <1> 	;sub	eax, eax
  3530                              <1> 	;mov	ah, [DestinationFile_Drv]	
  3531                              <1> 	;mov	edi, Logical_DOSDisks
  3532                              <1> 	;add	edi, eax
  3533                              <1> 	;mov	[csftdf_df_drv_dt], edi ; 17/03/2016
  3534                              <1> 
  3535 0000A779 8B3D[E83D0100]      <1> 	mov	edi, [csftdf_df_drv_dt] ; 23/03/2016
  3536                              <1> 
  3537                              <1> 	; 16/03/2016
  3538                              <1> 	; Note: Singlix FS boot sector parameters (for cluster
  3539                              <1> 	;	related calculations) has same offset
  3540                              <1> 	;	values from LD_BPB as in FAT file system.
  3541                              <1> 	;	[edi+LD_BPB+SecPerClust] is 1 for Singlix FS.
  3542                              <1> 	;	
  3543                              <1> 	;movzx	ecx, byte [edi+LD_BPB+SecPerClust]
  3544 0000A77F 8A4F13              <1> 	mov	cl, [edi+LD_BPB+SecPerClust]
  3545 0000A782 880D[8E3D0100]      <1> 	mov	[DestinationFile_SecPerClust], cl
  3546                              <1> 
  3547                              <1> 	; 17/03/2016
  3548 0000A788 386F03              <1> 	cmp	[edi+LD_FATType], ch ; 0
  3549 0000A78B 7707                <1> 	ja	short csftdf2_set_df_percent_wsize1
  3550                              <1> 	
  3551 0000A78D B800000100          <1> 	mov	eax, 65536 ; read/write buffer size for Singlix FS
  3552 0000A792 EB06                <1> 	jmp	short csftdf2_set_df_percent_wsize2	
  3553                              <1> 
  3554                              <1> csftdf2_set_df_percent_wsize1:
  3555 0000A794 0FB74711            <1> 	movzx	eax, word [edi+LD_BPB+BytesPerSec]
  3556 0000A798 F7E1                <1> 	mul	ecx
  3557                              <1> 	;sub	edx, edx
  3558                              <1> csftdf2_set_df_percent_wsize2:
  3559 0000A79A A3[D43D0100]        <1> 	mov	[csftdf_w_size], eax
  3560                              <1> 
  3561 0000A79F A1[BC3D0100]        <1> 	mov	eax, [csftdf_filesize]
  3562                              <1> 
  3563 0000A7A4 3D00000100          <1> 	cmp	eax, 65536 ; 64KB	; small file
  3564 0000A7A9 721F                <1> 	jb	short csftdf2_load_file ; do not display percentage
  3565                              <1> 	
  3566                              <1> csftdf2_reset_wf_percent_ptr_chk_64k:
  3567 0000A7AB B201                <1> 	mov	dl, 1 ; 25/03/2016
  3568                              <1> 
  3569 0000A7AD 3D00000400          <1> 	cmp	eax, 65536*4 ; 256KB
  3570 0000A7B2 7310                <1> 	jnb	short csftdf2_enable_percentage_display ; big file
  3571                              <1> 
  3572                              <1> 	; 64-128KB file size for floppy disks
  3573 0000A7B4 3815[903C0100]      <1> 	cmp	byte [SourceFile_Drv], dl ; 1 ; read from floppy disk ?
  3574 0000A7BA 7608                <1> 	jna	short csftdf2_enable_percentage_display
  3575                              <1> 
  3576 0000A7BC 3815[103D0100]      <1> 	cmp	byte [DestinationFile_Drv], dl ; 1 ; write to floppy disk ?
  3577 0000A7C2 7706                <1> 	ja	short csftdf2_load_file
  3578                              <1> 
  3579                              <1> csftdf2_enable_percentage_display:	
  3580 0000A7C4 8815[E03D0100]      <1> 	mov	[csftdf_percentage], dl ; 1	
  3581                              <1> 	
  3582                              <1> csftdf2_load_file:
  3583                              <1> 	; 13/05/2016
  3584                              <1> 	; 19/03/2016
  3585                              <1> 	; 18/03/2016
  3586                              <1> 	; 17/03/2016
  3587 0000A7CA B40F                <1> 	mov	ah, 0Fh
  3588 0000A7CC E84F6CFFFF          <1> 	call	_int10h
  3589                              <1> 	; 13/05/2016
  3590 0000A7D1 883D[E13D0100]      <1> 	mov	[csftdf_videopage], bh ; active video page
  3591 0000A7D7 B403                <1> 	mov	ah, 03h
  3592 0000A7D9 E8426CFFFF          <1> 	call	_int10h
  3593 0000A7DE 668915[E23D0100]    <1> 	mov	[csftdf_cursorpos], dx
  3594                              <1> 
  3595 0000A7E5 29C0                <1> 	sub	eax, eax
  3596 0000A7E7 A2[B93D0100]        <1> 	mov	[csftdf_rw_err], al ; 0 
  3597                              <1> 
  3598                              <1> ; ///
  3599                              <1> csftdf_sf_amb: ; 15/03/2016
  3600 0000A7EC 8B0D[BC3D0100]      <1> 	mov	ecx, [csftdf_filesize]	; 23/03/2016
  3601                              <1> 
  3602                              <1> 	; TRDOS 386 (TRDOS v2.0)
  3603                              <1> 	; Allocate contiguous memory block for loading the file
  3604                              <1> 	
  3605                              <1> 	;mov	ecx, [SourceFile_DirEntry+DirEntry_FileSize]
  3606                              <1> 	
  3607                              <1> 	;sub	eax, eax ; First free memory aperture
  3608                              <1> 	
  3609                              <1> 	; eax = 0 (Allocate memory from the beginning)
  3610                              <1> 	; ecx = File (Allocation) size in bytes
  3611                              <1> 	
  3612 0000A7F2 E879ABFFFF          <1> 	call	allocate_memory_block
  3613 0000A7F7 7304                <1> 	jnc	short loc_check_sf_save_loading_parms
  3614                              <1> 
  3615 0000A7F9 29C0                <1> 	sub	eax, eax
  3616 0000A7FB 29C9                <1> 	sub	ecx, ecx
  3617                              <1> 	
  3618                              <1> loc_check_sf_save_loading_parms:
  3619 0000A7FD A3[C03D0100]        <1> 	mov	[csftdf_sf_mem_addr], eax ; loading address
  3620 0000A802 890D[C43D0100]      <1> 	mov	[csftdf_sf_mem_bsize], ecx ; block size
  3621                              <1> ; ///   
  3622                              <1> 	; 19/03/2016
  3623 0000A808 8B35[E43D0100]      <1> 	mov	esi, [csftdf_sf_drv_dt] ; logical dos drv desc. tbl.
  3624                              <1> 
  3625                              <1> 	; 17/03/2016
  3626 0000A80E 09C0                <1> 	or	eax, eax ; contiguous free memory block address 
  3627 0000A810 0F845B010000        <1>         jz      csftdf2_read_sf_cluster
  3628                              <1> 
  3629                              <1> 	; 18/03/2016
  3630 0000A816 8B1D[C03D0100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  3631                              <1> 
  3632 0000A81C 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3633 0000A820 0F8605020000        <1>         jna     csftdf2_load_fs_file
  3634                              <1> 
  3635                              <1> csftdf2_load_fat_file:
  3636 0000A826 53                  <1> 	push	ebx ; *
  3637                              <1> 
  3638                              <1> csftdf2_load_fat_file_next:
  3639 0000A827 BE[59F30000]        <1> 	mov	esi, msg_reading
  3640 0000A82C E83BB2FFFF          <1> 	call	print_msg
  3641                              <1> 
  3642 0000A831 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  3643 0000A838 7605                <1> 	jna	short csftdf2_load_fat_file_1
  3644                              <1> 	
  3645 0000A83A E87C000000          <1> 	call	csftdf2_print_percentage ; 19/03/2016
  3646                              <1> 
  3647                              <1> csftdf2_load_fat_file_1:
  3648 0000A83F 8B35[E43D0100]      <1> 	mov	esi, [csftdf_sf_drv_dt]	
  3649 0000A845 5B                  <1> 	pop	ebx ; *
  3650                              <1> 
  3651                              <1> csftdf2_load_fat_file_2:
  3652 0000A846 E8B8000000          <1> 	call	csftdf2_read_fat_file_sectors ; 19/03/2016
  3653 0000A84B 0F8250040000        <1>         jc      csftdf2_rw_error ; eocc! or disk error! 
  3654                              <1> 
  3655 0000A851 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  3656 0000A853 7520                <1> 	jnz	short csftdf2_load_fat_file_ok
  3657                              <1> 
  3658 0000A855 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  3659 0000A85C 76E8                <1> 	jna	short csftdf2_load_fat_file_2
  3660                              <1> 
  3661 0000A85E 53                  <1> 	push	ebx ; *	
  3662                              <1> 
  3663                              <1> 	; Set cursor position
  3664                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  3665 0000A85F 8A3D[E13D0100]      <1> 	mov	bh, [csftdf_videopage]
  3666 0000A865 668B15[E23D0100]    <1> 	mov	dx, [csftdf_cursorpos]
  3667 0000A86C B402                <1> 	mov	ah, 2
  3668 0000A86E E8AD6BFFFF          <1> 	call	_int10h
  3669 0000A873 EBB2                <1> 	jmp	short csftdf2_load_fat_file_next
  3670                              <1> 	
  3671                              <1> csftdf2_load_fat_file_ok:
  3672 0000A875 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  3673 0000A87C 0F8651020000        <1>         jna     csftdf2_save_file ; 25/03/2016
  3674                              <1> 	
  3675                              <1> 	; "Reading... 100%"
  3676 0000A882 BF[71F30000]        <1> 	mov	edi, percentagestr
  3677 0000A887 B031                <1> 	mov	al, '1'
  3678 0000A889 AA                  <1> 	stosb
  3679 0000A88A B030                <1> 	mov	al, '0'
  3680 0000A88C AA                  <1> 	stosb
  3681 0000A88D AA                  <1> 	stosb
  3682                              <1> 
  3683 0000A88E 8A3D[E13D0100]      <1> 	mov	bh, [csftdf_videopage]
  3684 0000A894 668B15[E23D0100]    <1> 	mov	dx, [csftdf_cursorpos]
  3685 0000A89B B402                <1> 	mov	ah, 2
  3686 0000A89D E87E6BFFFF          <1> 	call	_int10h
  3687                              <1> 
  3688 0000A8A2 BE[59F30000]        <1> 	mov	esi, msg_reading
  3689 0000A8A7 E8C0B1FFFF          <1> 	call	print_msg
  3690                              <1> 	
  3691 0000A8AC BE[71F30000]        <1> 	mov	esi, percentagestr
  3692 0000A8B1 E8B6B1FFFF          <1> 	call	print_msg
  3693                              <1> 
  3694 0000A8B6 E918020000          <1>         jmp     csftdf2_save_file ; 25/03/2016
  3695                              <1> 
  3696                              <1> csftdf2_print_percentage:
  3697                              <1> 	; 19/03/2016
  3698                              <1> 	; 18/03/2016
  3699 0000A8BB B020                <1> 	mov	al, 20h
  3700 0000A8BD BF[71F30000]        <1> 	mov	edi, percentagestr
  3701 0000A8C2 AA                  <1> 	stosb
  3702 0000A8C3 AA                  <1> 	stosb
  3703 0000A8C4 A1[D83D0100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  3704 0000A8C9 BA64000000          <1> 	mov	edx, 100
  3705 0000A8CE F7E2                <1> 	mul	edx
  3706 0000A8D0 8B0D[BC3D0100]      <1> 	mov	ecx, [csftdf_filesize]	
  3707 0000A8D6 F7F1                <1> 	div	ecx
  3708 0000A8D8 B10A                <1> 	mov	cl, 10
  3709 0000A8DA F6F1                <1> 	div	cl
  3710 0000A8DC 80C430              <1> 	add	ah, '0'
  3711 0000A8DF 8827                <1> 	mov	[edi], ah
  3712 0000A8E1 20C0                <1> 	and	al, al
  3713 0000A8E3 740A                <1> 	jz	short csftdf2_print_percent_1
  3714 0000A8E5 4F                  <1> 	dec	edi
  3715 0000A8E6 6698                <1> 	cbw
  3716 0000A8E8 F6F1                <1> 	div	cl
  3717 0000A8EA 80C430              <1> 	add	ah, '0'
  3718 0000A8ED 8827                <1> 	mov	[edi], ah
  3719                              <1> 	;and	al, al
  3720                              <1> 	;jz	short csftdf2_print_percent_1
  3721                              <1> 	;dec	edi
  3722                              <1> 	;mov	[edi], '1' ; 100%		
  3723                              <1> 
  3724                              <1> csftdf2_print_percent_1:
  3725 0000A8EF BE[71F30000]        <1> 	mov	esi, percentagestr
  3726                              <1> 	;call	print_msg
  3727                              <1> 	;retn
  3728 0000A8F4 E973B1FFFF          <1> 	jmp	print_msg
  3729                              <1> 
  3730                              <1> csftdf2_read_file_sectors:
  3731                              <1> 	; 19/03/2016
  3732 0000A8F9 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3733 0000A8FD 0F8627070000        <1>         jna     csftdf2_read_fs_file_sectors
  3734                              <1> 
  3735                              <1> csftdf2_read_fat_file_sectors:
  3736                              <1> 	; 19/03/2016
  3737                              <1> 	; 18/03/2016
  3738                              <1> 	; return:
  3739                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  3740                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  3741                              <1> 	;   CF = 1 -> read error (error code in AL)	
  3742                              <1> 
  3743                              <1> csftdf2_read_fat_file_secs_0:
  3744 0000A903 8B15[BC3D0100]      <1> 	mov	edx, [csftdf_filesize]
  3745 0000A909 2B15[D83D0100]      <1> 	sub	edx, [csftdf_sf_rbytes]
  3746 0000A90F 3B15[D03D0100]      <1> 	cmp	edx, [csftdf_r_size]	
  3747 0000A915 7306                <1> 	jnb	short csftdf2_read_fat_file_secs_1
  3748 0000A917 8915[D03D0100]      <1> 	mov	[csftdf_r_size], edx
  3749                              <1> 		
  3750                              <1> csftdf2_read_fat_file_secs_1:
  3751 0000A91D A1[D03D0100]        <1> 	mov	eax, [csftdf_r_size]
  3752 0000A922 29D2                <1> 	sub	edx, edx
  3753 0000A924 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  3754 0000A928 01C8                <1> 	add	eax, ecx
  3755 0000A92A 48                  <1> 	dec	eax
  3756 0000A92B F7F1                <1> 	div	ecx
  3757 0000A92D 89C1                <1> 	mov	ecx, eax ; sector count
  3758 0000A92F A1[C83D0100]        <1> 	mov	eax, [csftdf_sf_cluster]
  3759                              <1> 
  3760                              <1> 	; EBX = memory block address (current)
  3761                              <1> 	
  3762 0000A934 E821090000          <1> 	call	read_fat_file_sectors
  3763 0000A939 7235                <1> 	jc	short csftdf2_read_fat_file_secs_3
  3764                              <1> 
  3765                              <1> 	; EBX = next memory address
  3766                              <1> 
  3767 0000A93B A1[D83D0100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  3768 0000A940 0305[D03D0100]      <1> 	add	eax, [csftdf_r_size]
  3769 0000A946 8B15[BC3D0100]      <1> 	mov	edx, [csftdf_filesize]
  3770 0000A94C 39D0                <1> 	cmp	eax, edx
  3771 0000A94E 7320                <1> 	jnb	short csftdf2_read_fat_file_secs_3 ; edx > 0
  3772 0000A950 A3[D83D0100]        <1> 	mov	[csftdf_sf_rbytes], eax
  3773                              <1> 
  3774 0000A955 53                  <1> 	push	ebx ; *
  3775                              <1> 	; get next cluster (csftdf_r_size! bytes)
  3776 0000A956 A1[C83D0100]        <1> 	mov	eax, [csftdf_sf_cluster]
  3777 0000A95B E8CC060000          <1> 	call	get_next_cluster
  3778 0000A960 5B                  <1> 	pop	ebx ; *
  3779 0000A961 7306                <1> 	jnc	short csftdf2_read_fat_file_secs_2
  3780                              <1> 
  3781                              <1> 	; 15/10/2016
  3782                              <1> 	;Disk read error instad of drv not ready err
  3783 0000A963 B811000000          <1> 	mov	eax, 17 ; Read error !
  3784 0000A968 C3                  <1> 	retn
  3785                              <1> 
  3786                              <1> csftdf2_read_fat_file_secs_2:
  3787 0000A969 29D2                <1> 	sub	edx, edx ; 0
  3788 0000A96B A3[C83D0100]        <1> 	mov	[csftdf_sf_cluster], eax ; next cluster
  3789                              <1> 
  3790                              <1> csftdf2_read_fat_file_secs_3:
  3791 0000A970 C3                  <1> 	retn
  3792                              <1> 
  3793                              <1> csftdf2_read_sf_cluster:
  3794                              <1> 	; 19/03/2016
  3795 0000A971 BB00000700          <1> 	mov	ebx, Cluster_Buffer ; buffer address (64KB)
  3796                              <1> 
  3797 0000A976 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  3798 0000A97D 760D                <1> 	jna	short csftdf2_read_sf_clust_2
  3799                              <1> 
  3800 0000A97F 53                  <1> 	push	ebx ; *	
  3801                              <1> 
  3802                              <1> csftdf2_read_sf_clust_next:
  3803 0000A980 E836FFFFFF          <1> 	call	csftdf2_print_percentage
  3804                              <1> 
  3805                              <1> csftdf2_read_sf_clust_0:
  3806 0000A985 8B35[E43D0100]      <1> 	mov	esi, [csftdf_sf_drv_dt]	
  3807                              <1> csftdf2_read_sf_clust_1:
  3808 0000A98B 5B                  <1> 	pop	ebx ; *
  3809                              <1> 
  3810                              <1> csftdf2_read_sf_clust_2:
  3811 0000A98C 89DA                <1> 	mov	edx, ebx
  3812 0000A98E 0315[D03D0100]      <1> 	add	edx, [csftdf_r_size]
  3813 0000A994 81FA00000800        <1> 	cmp	edx, Cluster_Buffer + 65536
  3814 0000A99A 772F                <1> 	ja	short csftdf2_write_df_cluster
  3815                              <1> 
  3816 0000A99C E858FFFFFF          <1> 	call	csftdf2_read_file_sectors ; 19/03/2016
  3817 0000A9A1 0F8280020000        <1>         jc      csftdf2_save_fat_file_err2 ; eocc! or disk error! 
  3818                              <1> 
  3819 0000A9A7 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  3820 0000A9A9 7520                <1> 	jnz	short csftdf2_write_df_cluster
  3821                              <1> 
  3822 0000A9AB 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  3823 0000A9B2 76D8                <1> 	jna	short csftdf2_read_sf_clust_2
  3824                              <1> 
  3825 0000A9B4 53                  <1> 	push	ebx ; *	
  3826                              <1> 
  3827                              <1> 	; Set cursor position
  3828                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  3829 0000A9B5 8A3D[E13D0100]      <1> 	mov	bh, [csftdf_videopage]
  3830 0000A9BB 668B15[E23D0100]    <1> 	mov	dx, [csftdf_cursorpos]
  3831 0000A9C2 B402                <1> 	mov	ah, 2
  3832 0000A9C4 E8576AFFFF          <1> 	call	_int10h
  3833 0000A9C9 EBB5                <1> 	jmp	short csftdf2_read_sf_clust_next
  3834                              <1> 
  3835                              <1> csftdf2_write_df_cluster:
  3836                              <1> 	; 19/03/2016
  3837 0000A9CB 8B35[E83D0100]      <1> 	mov	esi, [csftdf_df_drv_dt]	
  3838 0000A9D1 BB00000700          <1> 	mov	ebx, Cluster_Buffer ; buffer address (64KB)
  3839                              <1> 
  3840                              <1> csftdf2_write_df_clust_next:
  3841 0000A9D6 E855000000          <1> 	call	csftdf2_write_file_sectors ; 19/03/2016
  3842 0000A9DB 0F8246020000        <1>         jc      csftdf2_save_fat_file_err2 ; eocc! or disk error! 
  3843                              <1> 
  3844 0000A9E1 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  3845 0000A9E3 750A                <1> 	jnz	short csftdf2_rw_f_clust_ok
  3846                              <1> 
  3847 0000A9E5 81FB00000800        <1> 	cmp	ebx, Cluster_Buffer + 65536
  3848 0000A9EB 72E9                <1> 	jb	short csftdf2_write_df_clust_next
  3849                              <1> 	
  3850 0000A9ED EB82                <1> 	jmp	short csftdf2_read_sf_cluster
  3851                              <1>  
  3852                              <1> csftdf2_rw_f_clust_ok:
  3853 0000A9EF 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  3854 0000A9F6 0F86B2010000        <1>         jna     csftdf2_save_fat_file_4 ; 25/03/2016
  3855                              <1> 
  3856                              <1> 	; "100%"
  3857 0000A9FC BF[71F30000]        <1> 	mov	edi, percentagestr
  3858 0000AA01 B031                <1> 	mov	al, '1'
  3859 0000AA03 AA                  <1> 	stosb
  3860 0000AA04 B030                <1> 	mov	al, '0'
  3861 0000AA06 AA                  <1> 	stosb
  3862 0000AA07 AA                  <1> 	stosb
  3863                              <1> 
  3864 0000AA08 8A3D[E13D0100]      <1> 	mov	bh, [csftdf_videopage]
  3865 0000AA0E 668B15[E23D0100]    <1> 	mov	dx, [csftdf_cursorpos]
  3866 0000AA15 B402                <1> 	mov	ah, 2
  3867 0000AA17 E8046AFFFF          <1> 	call	_int10h
  3868                              <1> 
  3869 0000AA1C BE[71F30000]        <1> 	mov	esi, percentagestr
  3870 0000AA21 E846B0FFFF          <1> 	call	print_msg
  3871                              <1> 
  3872 0000AA26 E983010000          <1>         jmp     csftdf2_save_fat_file_4
  3873                              <1> 
  3874                              <1> csftdf2_load_fs_file:
  3875                              <1> 	; temporary - 18/03/2016
  3876 0000AA2B E96F020000          <1>         jmp     csftdf2_read_error
  3877                              <1> 
  3878                              <1> csftdf2_write_file_sectors:
  3879                              <1> 	; 19/03/2016
  3880 0000AA30 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3881 0000AA34 0F86F1050000        <1>         jna     csftdf2_write_fs_file_sectors
  3882                              <1> 
  3883                              <1> csftdf2_write_fat_file_sectors:
  3884                              <1> 	; 19/03/2016
  3885                              <1> 	; 18/03/2016
  3886                              <1> 	; return:
  3887                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  3888                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  3889                              <1> 	;   CF = 1 -> write error (error code in AL)	
  3890                              <1> 
  3891                              <1> csftdf2_write_fat_file_secs_0:
  3892 0000AA3A 8B15[BC3D0100]      <1> 	mov	edx, [csftdf_filesize]
  3893 0000AA40 2B15[DC3D0100]      <1> 	sub	edx, [csftdf_df_wbytes]
  3894 0000AA46 3B15[D43D0100]      <1> 	cmp	edx, [csftdf_w_size]	
  3895 0000AA4C 7306                <1> 	jnb	short csftdf2_write_fat_file_secs_1
  3896 0000AA4E 8915[D43D0100]      <1> 	mov	[csftdf_w_size], edx		
  3897                              <1> 
  3898                              <1> csftdf2_write_fat_file_secs_1:
  3899 0000AA54 A1[D43D0100]        <1> 	mov	eax, [csftdf_w_size]
  3900 0000AA59 29D2                <1> 	sub	edx, edx
  3901 0000AA5B 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  3902 0000AA5F 01C8                <1> 	add	eax, ecx
  3903 0000AA61 48                  <1> 	dec	eax
  3904 0000AA62 F7F1                <1> 	div	ecx
  3905 0000AA64 89C1                <1> 	mov	ecx, eax ; sector count
  3906 0000AA66 A1[CC3D0100]        <1> 	mov	eax, [csftdf_df_cluster]
  3907                              <1> 
  3908                              <1> 	; EBX = memory block address (current)	
  3909                              <1> 
  3910 0000AA6B E8A20F0000          <1> 	call	write_fat_file_sectors
  3911 0000AA70 7259                <1> 	jc	short csftdf2_write_fat_file_secs_4
  3912                              <1> 
  3913                              <1> 	; EBX = next memory address
  3914                              <1> 
  3915 0000AA72 A1[DC3D0100]        <1> 	mov	eax, [csftdf_df_wbytes]
  3916 0000AA77 0305[D43D0100]      <1> 	add	eax, [csftdf_w_size]
  3917 0000AA7D 8B15[BC3D0100]      <1> 	mov	edx, [csftdf_filesize]
  3918 0000AA83 39D0                <1> 	cmp	eax, edx
  3919 0000AA85 7344                <1> 	jnb	short csftdf2_write_fat_file_secs_4
  3920 0000AA87 A3[DC3D0100]        <1> 	mov	[csftdf_df_wbytes], eax
  3921                              <1> 	;
  3922 0000AA8C A3[7E3D0100]        <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], eax
  3923                              <1> 
  3924 0000AA91 53                  <1> 	push	ebx ; *
  3925                              <1> 
  3926 0000AA92 803D[BA3D0100]01    <1> 	cmp	byte [DestinationFileFound], 1
  3927 0000AA99 7210                <1> 	jb	short csftdf2_write_fat_file_secs_2
  3928                              <1> 
  3929                              <1> 	; get next cluster (csftdf_w_size! bytes)
  3930 0000AA9B A1[CC3D0100]        <1> 	mov	eax, [csftdf_df_cluster]
  3931 0000AAA0 E887050000          <1> 	call	get_next_cluster
  3932 0000AAA5 731C                <1> 	jnc	short csftdf2_write_fat_file_secs_3
  3933                              <1> 
  3934 0000AAA7 21C0                <1> 	and	eax, eax ; end of cluster chain!?
  3935 0000AAA9 7521                <1> 	jnz	short csftdf2_write_fat_file_secs_5 ; disk error !
  3936                              <1> 
  3937                              <1> csftdf2_write_fat_file_secs_2:
  3938 0000AAAB A1[CC3D0100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  3939 0000AAB0 E8800E0000          <1> 	call	add_new_cluster		
  3940 0000AAB5 7215                <1> 	jc	short csftdf2_write_fat_file_secs_5
  3941                              <1> 
  3942                              <1> 	; NOTE: Destination file size may be bigger than
  3943                              <1> 	; source file size when the last reading fails after here.
  3944                              <1> 	; (The last -empty- cluster of destination file must be 
  3945                              <1> 	; truncated and LMDT must be current date&time for partial
  3946                              <1> 	; copy result!) 
  3947 0000AAB7 8B15[D43D0100]      <1> 	mov	edx, [csftdf_w_size] ; bytes per cluster
  3948 0000AABD 0115[7E3D0100]      <1> 	add	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  3949                              <1> 
  3950                              <1> csftdf2_write_fat_file_secs_3:
  3951 0000AAC3 5B                  <1> 	pop	ebx ; *
  3952 0000AAC4 29D2                <1> 	sub	edx, edx ; 0
  3953 0000AAC6 A3[CC3D0100]        <1> 	mov	[csftdf_df_cluster], eax ; next cluster
  3954                              <1> 
  3955                              <1> csftdf2_write_fat_file_secs_4:
  3956 0000AACB C3                  <1> 	retn
  3957                              <1> 
  3958                              <1> csftdf2_write_fat_file_secs_5:
  3959 0000AACC 5B                  <1> 	pop	ebx ; *
  3960                              <1> 	; 16/10/2016 (1Dh -> 18)
  3961 0000AACD B812000000          <1> 	mov	eax, 18 ; Write error !
  3962 0000AAD2 C3                  <1> 	retn
  3963                              <1> 
  3964                              <1> csftdf2_save_file:
  3965                              <1> 	; 25/03/2016
  3966                              <1> 	; 19/03/2016
  3967                              <1> 	; 18/03/2016
  3968 0000AAD3 8B35[E83D0100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; logical dos drv desc. tbl.
  3969                              <1> 
  3970 0000AAD9 8B1D[C03D0100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  3971                              <1> 
  3972 0000AADF 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3973 0000AAE3 0F86F4010000        <1>         jna     csftdf2_save_fs_file
  3974                              <1> 
  3975                              <1> csftdf2_save_fat_file:
  3976 0000AAE9 53                  <1> 	push	ebx; *
  3977                              <1> 
  3978 0000AAEA 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  3979 0000AAF1 7724                <1> 	ja	short csftdf2_save_fat_file_0
  3980                              <1> 
  3981                              <1> 	; Set cursor position
  3982                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  3983 0000AAF3 8A3D[E13D0100]      <1> 	mov	bh, [csftdf_videopage]
  3984 0000AAF9 668B15[E23D0100]    <1> 	mov	dx, [csftdf_cursorpos]
  3985 0000AB00 B402                <1> 	mov	ah, 2
  3986 0000AB02 E81969FFFF          <1> 	call	_int10h
  3987                              <1> 	
  3988 0000AB07 BE[65F30000]        <1> 	mov	esi, msg_writing
  3989 0000AB0C E85BAFFFFF          <1> 	call	print_msg
  3990                              <1> 
  3991                              <1> csftdf2_save_fat_file_next:
  3992 0000AB11 8B35[E83D0100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 25/03/2016
  3993                              <1> 
  3994                              <1> csftdf2_save_fat_file_0:
  3995 0000AB17 5B                  <1> 	pop	ebx ; *
  3996                              <1> 
  3997                              <1> csftdf2_save_fat_file_1:
  3998 0000AB18 E813FFFFFF          <1> 	call	csftdf2_write_file_sectors ; 19/03/2016	
  3999 0000AB1D 0F827E010000        <1>         jc      csftdf2_rw_error ; eocc! or disk error! 
  4000                              <1> 
  4001 0000AB23 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4002 0000AB25 756D                <1>         jnz     short csftdf2_save_fat_file_3 ; 25/03/2016
  4003                              <1> 
  4004 0000AB27 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4005 0000AB2E 76E8                <1> 	jna	short csftdf2_save_fat_file_1
  4006                              <1> 
  4007 0000AB30 B020                <1> 	mov	al, 20h
  4008 0000AB32 BF[71F30000]        <1> 	mov	edi, percentagestr
  4009 0000AB37 AA                  <1> 	stosb
  4010 0000AB38 AA                  <1> 	stosb
  4011 0000AB39 A1[DC3D0100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4012 0000AB3E BA64000000          <1> 	mov	edx, 100
  4013 0000AB43 F7E2                <1> 	mul	edx
  4014 0000AB45 8B0D[BC3D0100]      <1> 	mov	ecx, [csftdf_filesize]	
  4015 0000AB4B F7F1                <1> 	div	ecx
  4016 0000AB4D B10A                <1> 	mov	cl, 10
  4017 0000AB4F F6F1                <1> 	div	cl
  4018 0000AB51 80C430              <1> 	add	ah, '0'
  4019 0000AB54 8827                <1> 	mov	[edi], ah
  4020 0000AB56 20C0                <1> 	and	al, al
  4021 0000AB58 740A                <1> 	jz	short csftdf2_save_fat_file_2
  4022 0000AB5A 4F                  <1> 	dec	edi
  4023 0000AB5B 6698                <1> 	cbw
  4024 0000AB5D F6F1                <1> 	div	cl
  4025 0000AB5F 80C430              <1> 	add	ah, '0'
  4026 0000AB62 8827                <1> 	mov	[edi], ah
  4027                              <1> 	;and	al, al
  4028                              <1> 	;jz	short csftdf2_save_fat_file_2
  4029                              <1> 	;dec	edi
  4030                              <1> 	;mov	[edi], '1' ; 100%		
  4031                              <1> 
  4032                              <1> csftdf2_save_fat_file_2:
  4033 0000AB64 53                  <1> 	push	ebx ; *
  4034                              <1> 
  4035 0000AB65 E802000000          <1> 	call	csftdf2_print_wr_percentage ; 25/03/2016
  4036                              <1> 
  4037 0000AB6A EBA5                <1>         jmp     csftdf2_save_fat_file_next
  4038                              <1> 
  4039                              <1> csftdf2_print_wr_percentage:
  4040                              <1> 	; Set cursor position
  4041                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4042 0000AB6C 8A3D[E13D0100]      <1> 	mov	bh, [csftdf_videopage]
  4043 0000AB72 668B15[E23D0100]    <1> 	mov	dx, [csftdf_cursorpos]
  4044 0000AB79 B402                <1> 	mov	ah, 2
  4045 0000AB7B E8A068FFFF          <1> 	call	_int10h
  4046                              <1> 
  4047 0000AB80 BE[65F30000]        <1> 	mov	esi, msg_writing
  4048 0000AB85 E8E2AEFFFF          <1> 	call	print_msg
  4049                              <1> 
  4050 0000AB8A BE[71F30000]        <1> 	mov	esi, percentagestr
  4051                              <1> 	;call	print_msg
  4052                              <1> 	;retn
  4053 0000AB8F E9D8AEFFFF          <1> 	jmp	print_msg
  4054                              <1> 
  4055                              <1> csftdf2_save_fat_file_3:
  4056 0000AB94 803D[E03D0100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4057 0000AB9B 7611                <1>         jna     csftdf2_save_fat_file_4 ; 25/03/2016
  4058                              <1> 
  4059                              <1> 	; "100%"
  4060 0000AB9D BF[71F30000]        <1> 	mov	edi, percentagestr
  4061 0000ABA2 B031                <1> 	mov	al, '1'
  4062 0000ABA4 AA                  <1> 	stosb
  4063 0000ABA5 B030                <1> 	mov	al, '0'
  4064 0000ABA7 AA                  <1> 	stosb
  4065 0000ABA8 AA                  <1> 	stosb
  4066                              <1> 
  4067 0000ABA9 E8BEFFFFFF          <1> 	call	csftdf2_print_wr_percentage
  4068                              <1> 
  4069                              <1> csftdf2_save_fat_file_4:
  4070 0000ABAE 803D[BA3D0100]00    <1> 	cmp	byte [DestinationFileFound], 0
  4071 0000ABB5 7647                <1> 	jna	short csftdf2_save_fat_file_6
  4072                              <1> 
  4073 0000ABB7 8B35[E83D0100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 31/03/2016	
  4074                              <1> 
  4075 0000ABBD A1[CC3D0100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  4076 0000ABC2 E865040000          <1> 	call	get_next_cluster
  4077 0000ABC7 7235                <1> 	jc	short csftdf2_save_fat_file_6 ; eocc! or disk error!
  4078                              <1> 
  4079 0000ABC9 A1[CC3D0100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  4080                              <1> 	;xor	ecx, ecx
  4081                              <1> 	;mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  4082                              <1> 	;dec	ecx ; 0FFFFFFFFh
  4083                              <1> 	;shr	ecx, 4 ; 28 bit ; 0FFFFFFFh
  4084 0000ABCE B9FFFFFF0F          <1> 	mov	ecx, 0FFFFFFFh
  4085 0000ABD3 E87E070000          <1> 	call	update_cluster
  4086 0000ABD8 7224                <1> 	jc	short csftdf2_save_fat_file_6 ; really last cluster!?
  4087                              <1> 
  4088 0000ABDA A3[CC3D0100]        <1> 	mov	[csftdf_df_cluster], eax ; next cluster
  4089                              <1> 	
  4090                              <1> 	; byte [FAT_BuffValidData] = 2 
  4091 0000ABDF E82F0A0000          <1> 	call	save_fat_buffer
  4092 0000ABE4 730E                <1> 	jnc	short csftdf2_save_fat_file_5
  4093                              <1> 	
  4094 0000ABE6 8B15[BC3D0100]      <1> 	mov	edx, [csftdf_filesize]
  4095 0000ABEC 8915[7E3D0100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  4096 0000ABF2 EB58                <1> 	jmp	short csftdf2_save_fat_file_err3
  4097                              <1> 
  4098                              <1> csftdf2_save_fat_file_5:
  4099 0000ABF4 A1[CC3D0100]        <1> 	mov	eax, [csftdf_df_cluster]
  4100                              <1> 
  4101                              <1> 	; EAX = First cluster to be truncated/unlinked
  4102                              <1> 	; ESI = Logical dos drive description table address
  4103 0000ABF9 E8580C0000          <1> 	call	truncate_cluster_chain
  4104                              <1> 
  4105                              <1> csftdf2_save_fat_file_6:
  4106                              <1> 	; 28/03/2016
  4107 0000ABFE BE[ED3C0100]        <1> 	mov	esi, SourceFile_DirEntry+DirEntry_Attr ; +11 to + 18
  4108 0000AC03 BF[6D3D0100]        <1> 	mov	edi, DestinationFile_DirEntry+DirEntry_Attr ; +11 to + 18
  4109 0000AC08 A4                  <1> 	movsb ; +11
  4110 0000AC09 A5                  <1> 	movsd ; +12 .. +15
  4111 0000AC0A 66A5                <1> 	movsw ; +16 .. +17
  4112                              <1> 		; + 18
  4113 0000AC0C 83C604              <1> 	add	esi, 4
  4114 0000AC0F 83C704              <1> 	add	edi, 4
  4115 0000AC12 A5                  <1> 	movsd	; DirEntry_WrtTime ; +22 .. +25
  4116                              <1> 
  4117 0000AC13 8B15[BC3D0100]      <1> 	mov	edx, [csftdf_filesize]
  4118 0000AC19 8915[7E3D0100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  4119                              <1> 
  4120 0000AC1F E8B7F0FFFF          <1> 	call	convert_current_date_time
  4121                              <1> 	; DX = Date in dos dir entry format
  4122                              <1> 	; AX = Time in dos dir entry format
  4123 0000AC24 EB4D                <1> 	jmp	short csftdf2_save_fat_file_7
  4124                              <1> 
  4125                              <1> csftdf2_save_fat_file_err1:
  4126 0000AC26 5B                  <1> 	pop	ebx ; *	
  4127                              <1> csftdf2_save_fat_file_err2:
  4128 0000AC27 A1[DC3D0100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4129 0000AC2C 8B15[7E3D0100]      <1> 	mov	edx, [DestinationFile_DirEntry+DirEntry_FileSize]
  4130 0000AC32 39C2                <1> 	cmp	edx, eax
  4131 0000AC34 7616                <1> 	jna	short csftdf2_save_fat_file_err3
  4132 0000AC36 A1[CC3D0100]        <1> 	mov	eax, [csftdf_df_cluster] ; last (empty) cluster
  4133                              <1> 	; ESI = Logical dos drive description table address
  4134 0000AC3B E8160C0000          <1> 	call	truncate_cluster_chain
  4135 0000AC40 720A                <1> 	jc	short csftdf2_save_fat_file_err3
  4136 0000AC42 A1[DC3D0100]        <1> 	mov	eax, [csftdf_df_wbytes]	
  4137 0000AC47 A3[7E3D0100]        <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], eax
  4138                              <1> csftdf2_save_fat_file_err3:
  4139 0000AC4C E88AF0FFFF          <1> 	call	convert_current_date_time
  4140                              <1> 	; DX = Date in dos dir entry format
  4141                              <1> 	; AX = Time in dos dir entry format
  4142 0000AC51 C605[6F3D0100]00    <1> 	mov	byte [DestinationFile_DirEntry+DirEntry_CrtTimeTenth], 0
  4143 0000AC58 66A3[703D0100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_CrtTime], ax
  4144 0000AC5E 668915[723D0100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_CrtDate], dx		
  4145 0000AC65 66A3[783D0100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_WrtTime], ax
  4146 0000AC6B 668915[7A3D0100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_WrtDate], dx
  4147 0000AC72 F9                  <1> 	stc
  4148                              <1> csftdf2_save_fat_file_7:
  4149 0000AC73 9C                  <1> 	pushf
  4150 0000AC74 668915[743D0100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_LastAccDate], dx
  4151 0000AC7B BE[623D0100]        <1> 	mov	esi, DestinationFile_DirEntry
  4152 0000AC80 BF00000800          <1> 	mov	edi, Directory_Buffer
  4153 0000AC85 0FB70D[8A3D0100]    <1> 	movzx	ecx, word [DestinationFile_DirEntryNumber] ; (<2048)
  4154 0000AC8C 66C1E105            <1> 	shl	cx, 5 ; 32 * directory entry number
  4155 0000AC90 01CF                <1> 	add	edi, ecx
  4156                              <1> 	;mov	ecx, 8
  4157 0000AC92 66B90800            <1> 	mov	cx, 8
  4158 0000AC96 F3A5                <1> 	rep	movsd
  4159 0000AC98 9D                  <1> 	popf
  4160 0000AC99 730B                <1> 	jnc	short csftdf2_write_file_OK
  4161                              <1> 	 		
  4162                              <1> csftdf2_write_error:
  4163                              <1> 	; 18/03/2016
  4164 0000AC9B B01D                <1> 	mov	al, 1Dh ; write error
  4165 0000AC9D EB02                <1> 	jmp	short csftdf2_rw_error
  4166                              <1> 
  4167                              <1> 	; 16/03/2016
  4168                              <1> csftdf2_read_error:
  4169 0000AC9F B011                <1> 	mov	al, 17 ; ; Drive not ready or read error!
  4170                              <1> csftdf2_rw_error:
  4171 0000ACA1 A2[B93D0100]        <1> 	mov	[csftdf_rw_err], al 
  4172                              <1> 
  4173                              <1> csftdf2_write_file_OK:
  4174                              <1> 	; 18/03/2016
  4175 0000ACA6 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  4176 0000ACAD E8C7F0FFFF          <1> 	call	save_directory_buffer
  4177                              <1> 
  4178                              <1>  	; Update last modification date&time of destination
  4179                              <1> 	; file's (parent) directory
  4180 0000ACB2 E85DF1FFFF          <1> 	call	update_parent_dir_lmdt
  4181                              <1> 	;
  4182 0000ACB7 A1[C03D0100]        <1> 	mov	eax, [csftdf_sf_mem_addr] ; start address
  4183                              <1> 
  4184 0000ACBC 21C0                <1> 	and	eax, eax
  4185 0000ACBE 750E                <1> 	jnz	short csftdf2_dealloc_mblock
  4186                              <1> 
  4187 0000ACC0 88C5                <1> 	mov	ch, al ; 0 (Cluster r/w, not full loading)
  4188                              <1> csftdf2_dealloc_retn:
  4189 0000ACC2 8A0D[B93D0100]      <1> 	mov	cl, [csftdf_rw_err]
  4190 0000ACC8 A1[CC3D0100]        <1> 	mov	eax, [csftdf_df_cluster]
  4191 0000ACCD C3                  <1> 	retn
  4192                              <1> 
  4193                              <1> csftdf2_dealloc_mblock:
  4194 0000ACCE 8B0D[C43D0100]      <1> 	mov	ecx, [csftdf_sf_mem_bsize] ; block size	
  4195 0000ACD4 E898A8FFFF          <1> 	call	deallocate_memory_block
  4196 0000ACD9 B5FF                <1>         mov     ch, 0FFh ; (File was full loaded at memory)
  4197 0000ACDB EBE5                <1> 	jmp	short csftdf2_dealloc_retn
  4198                              <1> 
  4199                              <1> csftdf2_save_fs_file:
  4200                              <1> 	; 16/10/2016 (1Dh -> 18)
  4201                              <1> 	; temporary - (21/03/2016)
  4202 0000ACDD B812000000          <1> 	mov	eax, 18 ; write error
  4203 0000ACE2 F9                  <1> 	stc
  4204 0000ACE3 C3                  <1> 	retn
  4205                              <1> 
  4206                              <1> create_file:
  4207                              <1> 	; 16/10/2016
  4208                              <1> 	; 24/03/2016, 31/03/2016
  4209                              <1> 	; 20/03/2016, 21/03/2016, 23/03/2016
  4210                              <1> 	; 19/03/2016 (TRDOS 396 = TRDOS v2.0)
  4211                              <1> 	; 03/09/2011 (FILE.ASM, 'proc_create_file')
  4212                              <1> 	; 09/08/2010
  4213                              <1> 	;
  4214                              <1> 	; INPUT ->
  4215                              <1> 	; 	EAX = File Size
  4216                              <1> 	; 	ESI = ASCIIZ File Name
  4217                              <1> 	; 	CL = File Attributes 
  4218                              <1> 	;	EBX = FFFFFFFFh -> create empty file 
  4219                              <1> 	;			 (only for FAT fs) 
  4220                              <1> 	; OUTPUT ->
  4221                              <1> 	;     CF = 0 ->
  4222                              <1> 	;	EAX = New file's first cluster
  4223                              <1> 	; 	ESI = Logical Dos Drv Descr. Table Addr.
  4224                              <1> 	; 	EBX = offset CreateFile_Size
  4225                              <1> 	; 	ECX = Sectors per cluster (<256) 
  4226                              <1> 	; 	EDX = Directory entry index/number (<65536)
  4227                              <1> 	;     CF = 1 -> error code in AL
  4228                              <1> 
  4229                              <1> ;	test	cl, 18h (directory or volume name)
  4230                              <1> ;	jnz	short loc_createfile_access_denied
  4231 0000ACE4 80E107              <1> 	and	cl, 07h ; S, H, R
  4232 0000ACE7 880D[083E0100]      <1>         mov     [createfile_attrib], cl 
  4233                              <1> 
  4234 0000ACED 89D9                <1> 	mov	ecx, ebx
  4235 0000ACEF 89F3                <1> 	mov	ebx, esi ; ASCIIZ File Name address
  4236 0000ACF1 29D2                <1> 	sub	edx, edx
  4237 0000ACF3 8A35[A6310100]      <1>         mov     dh, [Current_Drv]
  4238 0000ACF9 BE00010900          <1>         mov     esi, Logical_DOSDisks
  4239 0000ACFE 01D6                <1> 	add	esi, edx
  4240                              <1> 
  4241 0000AD00 8815[133E0100]      <1> 	mov	[createfile_UpdatePDir], dl ; 0 ; 31/03/2016 
  4242                              <1> 
  4243                              <1> 	; LD_DiskType = 0 for write protection (read only) 
  4244 0000AD06 807E0101            <1> 	cmp	byte [esi+LD_DiskType], 1 ; 0 = Invalid
  4245 0000AD0A 730A                <1> 	jnb	short loc_createfile_check_file_sytem
  4246                              <1> 	; 16/10/2016 (TRDOS Error code: 30, disk write protected) 
  4247 0000AD0C B81E000000          <1> 	mov	eax, 30 ; 13h, MSDOS err : Disk write-protected 
  4248 0000AD11 66BA0000            <1> 	mov	dx, 0
  4249                              <1> 	; err retn: EDX = 0, EBX = File name offset
  4250                              <1> 	; ESI -> Dos drive description table address	
  4251 0000AD15 C3                  <1> 	retn
  4252                              <1> 
  4253                              <1> ;loc_createfile_access_denied:
  4254                              <1> ;	mov	eax, 05h ; access denied (invalid attributes input)
  4255                              <1> ;	stc
  4256                              <1> ;	retn
  4257                              <1> 
  4258                              <1> loc_createfile_check_file_sytem:
  4259 0000AD16 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  4260 0000AD1A 730A                <1> 	jnb	short loc_createfile_chk_empty_FAT_file_sign1
  4261                              <1> 
  4262 0000AD1C A3[F43D0100]        <1> 	mov	[createfile_size], eax
  4263                              <1> 	; ESI = Logical Dos Drive Description Table address
  4264                              <1> 	; EBX = ASCIIZ File Name address
  4265 0000AD21 E9FE020000          <1> 	jmp	create_fs_file
  4266                              <1> 
  4267                              <1> loc_createfile_chk_empty_FAT_file_sign1:
  4268                              <1> 	; ECX = FFFFFFFFh -> create empty file if drive has FAT fs
  4269 0000AD26 41                  <1> 	inc	ecx
  4270 0000AD27 7506                <1> 	jnz	short loc_createfile_chk_empty_FAT_file_sign2
  4271 0000AD29 890D[F43D0100]      <1> 	mov	[createfile_size], ecx ; 0 ; empty file
  4272                              <1> 
  4273                              <1> loc_createfile_chk_empty_FAT_file_sign2:
  4274                              <1> 	; 23/03/2016
  4275 0000AD2F 668B4E11            <1> 	mov	cx, [esi+LD_BPB+BytesPerSec]
  4276 0000AD33 66890D[103E0100]    <1> 	mov	[createfile_BytesPerSec], cx
  4277                              <1> 	
  4278                              <1> 	; EBX = ASCIIZ File Name address
  4279 0000AD3A 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
  4280 0000AD3E 8815[093E0100]      <1> 	mov	[createfile_SecPerClust], dl
  4281 0000AD44 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  4282 0000AD47 39D1                <1> 	cmp	ecx, edx ; byte [createfile_SecPerClust]
  4283 0000AD49 7306                <1> 	jnb	short loc_create_fat_file
  4284                              <1> 	  
  4285                              <1> loc_createfile_insufficient_disk_space:
  4286 0000AD4B B827000000          <1> 	mov	eax, 27h
  4287                              <1> loc_createfile_gffc_retn:
  4288 0000AD50 C3                  <1> 	retn
  4289                              <1> 
  4290                              <1> loc_create_fat_file:
  4291 0000AD51 891D[EC3D0100]      <1> 	mov	[createfile_Name_Offset], ebx
  4292 0000AD57 890D[F03D0100]      <1> 	mov	[createfile_FreeSectors], ecx
  4293                              <1> 
  4294                              <1> loc_createfile_gffc_1:
  4295 0000AD5D E821050000          <1> 	call	get_first_free_cluster
  4296 0000AD62 72EC                <1> 	jc	short loc_createfile_gffc_retn
  4297                              <1> 
  4298 0000AD64 A3[F83D0100]        <1> 	mov	[createfile_FFCluster], eax
  4299                              <1> 
  4300                              <1> loc_createfile_locate_ffe_on_directory:
  4301                              <1> 	; Current directory fcluster <> Directory buffer cluster
  4302                              <1> 	; Current directory will be reloaded by
  4303                              <1> 	; 'locate_current_dir_file' procedure
  4304                              <1> 	;
  4305                              <1> 	; ESI = Logical Dos Drv Desc. Table Adress
  4306 0000AD69 56                  <1> 	push	esi ; *
  4307 0000AD6A 31C0                <1> 	xor	eax, eax
  4308                              <1> 
  4309 0000AD6C A3[C6390100]        <1> 	mov	dword [FAT_ClusterCounter], eax ; 0
  4310                              <1> 	; 21/03/2016
  4311 0000AD71 A2[123E0100]        <1> 	mov	byte [createfile_wfc], al ; 0 
  4312                              <1> 
  4313 0000AD76 89C1                <1>  	mov	ecx, eax
  4314 0000AD78 6649                <1> 	dec	cx ; FFFFh  
  4315                              <1> 	; CX = FFFFh -> find first deleted or free entry
  4316                              <1> 	; ESI would be ASCIIZ filename address if the call
  4317                              <1> 	; would not be for first free or deleted dir entry  
  4318 0000AD7A E8D6E7FFFF          <1> 	call	locate_current_dir_file
  4319 0000AD7F 0F83EE000000        <1> 	jnc	loc_createfile_set_ff_dir_entry
  4320 0000AD85 5E                  <1> 	pop	esi ; *
  4321                              <1> 	 ; ESI = Logical DOS Drv. Description Table Address 
  4322 0000AD86 83F802              <1> 	cmp	eax, 2
  4323 0000AD89 7402                <1> 	je	short loc_createfile_add_new_cluster
  4324                              <1> loc_createfile_locate_file_stc_retn:
  4325 0000AD8B F9                  <1> 	stc
  4326 0000AD8C C3                  <1> 	retn
  4327                              <1> 
  4328                              <1> loc_createfile_add_new_cluster:
  4329 0000AD8D 803D[A5310100]02    <1> 	cmp	byte [Current_FATType], 2
  4330                              <1> 	;cmp	byte [esi+LD_FATType], 2
  4331 0000AD94 770C                <1> 	ja	short loc_createfile_add_new_cluster_check_fsc
  4332 0000AD96 803D[A4310100]01    <1> 	cmp	byte [Current_Dir_Level], 1
  4333                              <1> 	;cmp	byte [esi+LD_CDirLevel], 1
  4334 0000AD9D 7303                <1> 	jnb	short loc_createfile_add_new_cluster_check_fsc
  4335                              <1> 	
  4336                              <1> 	;mov	eax, 12
  4337 0000AD9F B00C                <1> 	mov	al, 12 ; No more files 
  4338                              <1> 
  4339                              <1> loc_createfile_anc_retn:
  4340 0000ADA1 C3                  <1> 	retn
  4341                              <1> 
  4342                              <1> loc_createfile_add_new_cluster_check_fsc:
  4343 0000ADA2 8B0D[F03D0100]      <1> 	mov	ecx, [createfile_FreeSectors]
  4344 0000ADA8 0FB605[093E0100]    <1> 	movzx	eax, byte [createfile_SecPerClust]
  4345 0000ADAF 66D1E0              <1> 	shl	ax, 1 ; AX = 2 * AX
  4346 0000ADB2 39C1                <1> 	cmp	ecx, eax
  4347 0000ADB4 7295                <1>         jb	short loc_createfile_insufficient_disk_space
  4348                              <1> 
  4349                              <1> loc_createfile_add_new_subdir_cluster:
  4350 0000ADB6 8B15[D5390100]      <1> 	mov	edx, [DirBuff_Cluster]
  4351 0000ADBC 8915[FC3D0100]      <1> 	mov	[createfile_LastDirCluster], edx	
  4352                              <1> 
  4353 0000ADC2 A1[F83D0100]        <1> 	mov	eax, [createfile_FFCluster]
  4354 0000ADC7 E846040000          <1> 	call	load_FAT_sub_directory 
  4355 0000ADCC 72D3                <1> 	jc	short loc_createfile_anc_retn
  4356                              <1> 
  4357                              <1> pass_createfile_add_new_subdir_cluster:
  4358                              <1> 	;movzx	eax, word [esi+LD_BPB+BytesPerSec]
  4359 0000ADCE 0FB705[103E0100]    <1> 	movzx	eax, word [createfile_BytesPerSec] ; 23/03/2016
  4360 0000ADD5 F7E1                <1> 	mul	ecx ; ecx = directory buffer sector count
  4361 0000ADD7 89C1                <1> 	mov	ecx, eax
  4362 0000ADD9 C1E902              <1> 	shr	ecx, 2 ; dword count
  4363 0000ADDC 29C0                <1> 	sub	eax, eax ; 0
  4364 0000ADDE F3AB                <1> 	rep	stosd 
  4365                              <1> 	;
  4366 0000ADE0 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2 
  4367 0000ADE7 E88DEFFFFF          <1> 	call	save_directory_buffer
  4368 0000ADEC 72B3                <1> 	jc	short loc_createfile_anc_retn
  4369                              <1> 
  4370                              <1> loc_createfile_save_added_subdir_cluster:
  4371 0000ADEE A1[FC3D0100]        <1> 	mov	eax, [createfile_LastDirCluster]
  4372 0000ADF3 8B0D[F83D0100]      <1> 	mov	ecx, [createfile_FFCluster]
  4373 0000ADF9 E858050000          <1> 	call	update_cluster
  4374 0000ADFE 7304                <1> 	jnc	short loc_createfile_save_fat_buffer_0
  4375 0000AE00 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  4376 0000AE02 751A                <1> 	jnz	short loc_createfile_save_fat_buffer_stc_retn
  4377                              <1> 
  4378                              <1> loc_createfile_save_fat_buffer_0:
  4379 0000AE04 A1[F83D0100]        <1> 	mov	eax, [createfile_FFCluster]
  4380 0000AE09 A3[FC3D0100]        <1> 	mov	[createfile_LastDirCluster], eax
  4381 0000AE0E B9FFFFFF0F          <1> 	mov	ecx, 0FFFFFFFh ; 28 bit
  4382 0000AE13 E83E050000          <1> 	call	update_cluster
  4383 0000AE18 7306                <1> 	jnc	short loc_createfile_save_fat_buffer_1
  4384 0000AE1A 09C0                <1> 	or	eax, eax ; Was it free cluster
  4385 0000AE1C 7402                <1> 	jz	short loc_createfile_save_fat_buffer_1
  4386                              <1> 
  4387                              <1> loc_createfile_save_fat_buffer_stc_retn:
  4388 0000AE1E F9                  <1> 	stc
  4389                              <1> loc_createfile_save_fat_buffer_retn:
  4390                              <1> loc_createfile_gffc_2_stc_retn:
  4391 0000AE1F C3                  <1> 	retn
  4392                              <1> 
  4393                              <1> loc_createfile_save_fat_buffer_1:
  4394                              <1> 	; byte [FAT_BuffValidData] = 2 
  4395 0000AE20 E8EE070000          <1> 	call	save_fat_buffer
  4396 0000AE25 72F8                <1> 	jc	short loc_createfile_save_fat_buffer_retn
  4397                              <1> 
  4398 0000AE27 803D[C6390100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  4399 0000AE2E 7222                <1> 	jb	short loc_createfile_save_fat_buffer_2
  4400                              <1> 
  4401                              <1> 	; ESI = Logical DOS Drive Description Table address 
  4402 0000AE30 A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter]
  4403                              <1> 
  4404 0000AE35 C605[C6390100]00    <1> 	mov	byte [FAT_ClusterCounter], 0 ; 21/03/2016
  4405                              <1> 
  4406 0000AE3C 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  4407 0000AE40 E863080000          <1> 	call	calculate_fat_freespace
  4408                              <1> 
  4409                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  4410                              <1> 	;jnz	short loc_createfile_save_fat_buffer_2
  4411                              <1> 
  4412                              <1> 	; ecx > 0 -> Recalculation is needed
  4413 0000AE45 09C9                <1> 	or	ecx, ecx 
  4414 0000AE47 7409                <1> 	jz	short loc_createfile_save_fat_buffer_2
  4415                              <1> 
  4416 0000AE49 66BB00FF            <1> 	mov	bx, 0FF00h ; ; recalculate free space
  4417 0000AE4D E856080000          <1> 	call	calculate_fat_freespace
  4418                              <1> 
  4419                              <1> loc_createfile_save_fat_buffer_2:
  4420                              <1> 	;call	update_parent_dir_lmdt
  4421                              <1> 
  4422                              <1> loc_createfile_gffc_2:
  4423 0000AE52 E82C040000          <1> 	call	get_first_free_cluster
  4424 0000AE57 72C6                <1> 	jc	short loc_createfile_gffc_2_stc_retn
  4425                              <1> 
  4426 0000AE59 A3[F83D0100]        <1> 	mov	[createfile_FFCluster], eax
  4427                              <1> 
  4428 0000AE5E A1[FC3D0100]        <1> 	mov	eax, [createfile_LastDirCluster]
  4429                              <1> 	
  4430 0000AE63 E8AA030000          <1> 	call	load_FAT_sub_directory 
  4431 0000AE68 72B5                <1> 	jc	short loc_createfile_gffc_2_stc_retn
  4432                              <1> 
  4433 0000AE6A BF00000800          <1> 	mov	edi, Directory_Buffer
  4434                              <1> 
  4435 0000AE6F 6629DB              <1> 	sub	bx, bx ; directory entry index/number = 0
  4436                              <1> 
  4437 0000AE72 56                  <1> 	push	esi ; * ; 23/03/2016
  4438                              <1> 
  4439                              <1> loc_createfile_set_ff_dir_entry:
  4440 0000AE73 66891D[0A3E0100]    <1> 	mov	[createfile_DirIndex], bx
  4441                              <1> 
  4442                              <1>         ; EDI = Directory entry address
  4443 0000AE7A 8B35[EC3D0100]      <1> 	mov	esi, [createfile_Name_Offset]
  4444 0000AE80 A1[F83D0100]        <1> 	mov	eax, [createfile_FFCluster]
  4445 0000AE85 A3[003E0100]        <1> 	mov	[createfile_Cluster], eax ; 24/03/2016
  4446 0000AE8A B5FF                <1> 	mov	ch, 0FFh
  4447 0000AE8C 8A0D[083E0100]      <1>         mov	cl, [createfile_attrib] ; file attributes
  4448                              <1> 	; CH > 0 -> File size is in [EBX]
  4449 0000AE92 BB[F43D0100]        <1> 	mov	ebx, createfile_size
  4450                              <1>   
  4451 0000AE97 E800EEFFFF          <1> 	call	make_directory_entry
  4452                              <1> 	
  4453 0000AE9C 5E                  <1> 	pop	esi ; * ; ESI = Logical Dos Drv Desc. Table address
  4454                              <1> 
  4455 0000AE9D C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2 
  4456 0000AEA4 E8D0EEFFFF          <1> 	call	save_directory_buffer
  4457 0000AEA9 7221                <1> 	jc	short loc_createfile_set_ff_dir_entry_retn
  4458                              <1> 
  4459 0000AEAB C605[133E0100]01    <1> 	mov	byte [createfile_UpdatePDir], 1 ; 31/03/2016 
  4460                              <1> 
  4461                              <1> loc_createfile_get_set_write_file_cluster:
  4462 0000AEB2 A1[F43D0100]        <1> 	mov	eax, [createfile_size]
  4463 0000AEB7 09C0                <1> 	or	eax, eax
  4464 0000AEB9 7570                <1> 	jnz	short loc_createfile_get_set_wfc_cont
  4465 0000AEBB 40                  <1> 	inc	eax
  4466                              <1> 	; 23/03/2016
  4467 0000AEBC 0FB61D[093E0100]    <1> 	movzx	ebx, byte [createfile_SecPerClust]
  4468                              <1> 	;movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 512
  4469 0000AEC3 0FB70D[103E0100]    <1>         movzx   ecx, word [createfile_BytesPerSec] ; 512
  4470 0000AECA EB7C                <1> 	jmp	loc_createfile_set_cluster_count 
  4471                              <1> 
  4472                              <1> loc_createfile_set_ff_dir_entry_retn:
  4473 0000AECC C3                  <1> 	retn
  4474                              <1> 
  4475                              <1> loc_createfile_write_fcluster_to_disk:
  4476 0000AECD 034668              <1> 	add	eax, [esi+LD_DATABegin] ; convert to physical address
  4477 0000AED0 BB00000700          <1> 	mov	ebx, Cluster_Buffer
  4478                              <1> 	; ESI = Logical DOS Drv. Desc. Tbl. address
  4479                              <1> 	; EAX = Disk address
  4480                              <1> 	; EBX = Sector Buffer
  4481                              <1> 	; ECX = sectors per cluster
  4482 0000AED5 E888370000          <1> 	call	disk_write
  4483 0000AEDA 7211                <1> 	jc	short loc_createfile_dsk_wr_err
  4484                              <1> 
  4485                              <1> loc_createfile_update_fat_cluster:
  4486                              <1> 	; 21/03/2016	
  4487 0000AEDC 803D[123E0100]00    <1> 	cmp	byte [createfile_wfc], 0 
  4488 0000AEE3 7712                <1> 	ja	short loc_createfile_update_fat_cluster_n1
  4489                              <1> 
  4490 0000AEE5 FE05[123E0100]      <1> 	inc	byte [createfile_wfc] ; 1
  4491 0000AEEB EB24                <1> 	jmp	short loc_createfile_update_fat_cluster_n2
  4492                              <1> 
  4493                              <1> loc_createfile_dsk_wr_err:
  4494                              <1> 	; 16/10/2016 (1Dh -> 18)
  4495                              <1> 	; 23/03/2016
  4496 0000AEED B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error !
  4497 0000AEF2 E9BD000000          <1> 	jmp	loc_createfile_stc_retn
  4498                              <1> 
  4499                              <1> loc_createfile_update_fat_cluster_n1:
  4500 0000AEF7 A1[043E0100]        <1> 	mov	eax, [createfile_PCluster]
  4501 0000AEFC 8B0D[003E0100]      <1> 	mov	ecx, [createfile_Cluster]
  4502 0000AF02 E84F040000          <1> 	call	update_cluster
  4503 0000AF07 7308                <1> 	jnc	short loc_createfile_update_fat_cluster_n2
  4504 0000AF09 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  4505 0000AF0B 0F85A3000000        <1> 	jnz	loc_createfile_stc_retn
  4506                              <1> 
  4507                              <1> loc_createfile_update_fat_cluster_n2:
  4508 0000AF11 A1[003E0100]        <1>         mov	eax, [createfile_Cluster]
  4509 0000AF16 B9FFFFFF0F          <1> 	mov	ecx, 0FFFFFFFh
  4510 0000AF1B E836040000          <1> 	call	update_cluster
  4511 0000AF20 734E                <1> 	jnc	short loc_createfile_save_fat_buffer_3
  4512 0000AF22 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  4513 0000AF24 744A                <1> 	jz	short loc_createfile_save_fat_buffer_3
  4514                              <1> 
  4515                              <1> loc_createfile_upd_fat_fcluster_stc_retn:
  4516 0000AF26 E989000000          <1> 	jmp	loc_createfile_stc_retn
  4517                              <1> 
  4518                              <1> loc_createfile_get_set_wfc_cont:
  4519                              <1> 	;movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 512	
  4520 0000AF2B 0FB70D[103E0100]    <1> 	movzx	ecx, word [createfile_BytesPerSec] ; 512
  4521 0000AF32 01C8                <1> 	add	eax, ecx
  4522 0000AF34 48                  <1> 	dec	eax  ; add eax, 511
  4523 0000AF35 29D2                <1> 	sub	edx, edx
  4524 0000AF37 F7F1                <1> 	div	ecx
  4525 0000AF39 0FB61D[093E0100]    <1> 	movzx	ebx, byte [createfile_SecPerClust]
  4526 0000AF40 01D8                <1> 	add	eax, ebx
  4527 0000AF42 48                  <1> 	dec	eax  ; add eax, SecPerClust - 1
  4528 0000AF43 6631D2              <1> 	xor	dx, dx
  4529 0000AF46 F7F3                <1> 	div	ebx
  4530                              <1> 
  4531                              <1> loc_createfile_set_cluster_count:
  4532 0000AF48 A3[0C3E0100]        <1> 	mov 	[createfile_CCount], eax
  4533                              <1> 	
  4534 0000AF4D BF00000700          <1> 	mov	edi, Cluster_Buffer
  4535 0000AF52 89C8                <1> 	mov	eax, ecx ; Bytes per Sector
  4536 0000AF54 F7E3                <1> 	mul	ebx ; Sectors per Cluster 
  4537                              <1> 	; EAX = Bytes per Cluster
  4538 0000AF56 89C1                <1> 	mov	ecx, eax
  4539 0000AF58 C1E902              <1> 	shr	ecx, 2 ; dword count
  4540 0000AF5B 31C0                <1> 	xor	eax, eax
  4541 0000AF5D F3AB                <1> 	rep	stosd ; clear cluster buffer
  4542                              <1> 
  4543 0000AF5F A1[003E0100]        <1> 	mov	eax, [createfile_Cluster] ; 24/03/2016
  4544                              <1> 
  4545 0000AF64 89D9                <1> 	mov	ecx, ebx
  4546                              <1> 
  4547                              <1> loc_createfile_get_set_wf_fclust_cont:
  4548 0000AF66 83E802              <1> 	sub	eax, 2
  4549 0000AF69 F7E1                <1> 	mul	ecx
  4550                              <1> 	; EAX = Logical DOS disk address (offset)
  4551 0000AF6B E95DFFFFFF          <1>         jmp     loc_createfile_write_fcluster_to_disk
  4552                              <1> 
  4553                              <1> loc_createfile_save_fat_buffer_3:
  4554                              <1> 	; byte [FAT_BuffValidData] = 2
  4555 0000AF70 E89E060000          <1> 	call	save_fat_buffer
  4556 0000AF75 723D                <1> 	jc	loc_createfile_stc_retn
  4557                              <1> 
  4558                              <1> 	; 21/03/2016
  4559 0000AF77 803D[C6390100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  4560 0000AF7E 721B                <1> 	jb	short loc_createfile_save_fat_buffer_4
  4561                              <1> 
  4562                              <1> 	; ESI = Logical DOS Drive Description Table address 
  4563 0000AF80 A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter]
  4564 0000AF85 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  4565 0000AF89 E81A070000          <1> 	call	calculate_fat_freespace
  4566                              <1> 
  4567                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  4568                              <1> 	;jnz	short loc_createfile_save_fat_buffer_4
  4569                              <1> 
  4570                              <1> 	; ecx > 0 -> Recalculation is needed
  4571 0000AF8E 09C9                <1> 	or	ecx, ecx 
  4572 0000AF90 7409                <1> 	jz	short loc_createfile_save_fat_buffer_4
  4573                              <1> 
  4574 0000AF92 66BB00FF            <1> 	mov	bx, 0FF00h ; ; recalculate free space
  4575 0000AF96 E80D070000          <1> 	call	calculate_fat_freespace
  4576                              <1> 
  4577                              <1> loc_createfile_save_fat_buffer_4:
  4578 0000AF9B FF0D[0C3E0100]      <1> 	dec	dword [createfile_CCount]
  4579                              <1> 	;jz	short loc_createfile_upd_dir_modif_date_time
  4580 0000AFA1 743F                <1> 	jz	short loc_createfile_stc_retn_cc ; 31/03/2016
  4581                              <1> 
  4582                              <1> loc_createfile_get_set_write_next_cluster:
  4583 0000AFA3 E8DB020000          <1> 	call	get_first_free_cluster
  4584 0000AFA8 720A                <1> 	jc	short loc_createfile_stc_retn
  4585                              <1> 
  4586                              <1> loc_createfile_get_set_write_next_cluster_1:
  4587 0000AFAA 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh
  4588 0000AFAD 7213                <1> 	jb	short loc_createfile_get_set_write_next_cluster_2
  4589                              <1> 
  4590                              <1> loc_createfile_wnc_insufficient_disk_space:	
  4591 0000AFAF B827000000          <1> 	mov	eax, 27h ; Insufficient disk space
  4592                              <1> 
  4593                              <1> loc_createfile_stc_retn:
  4594 0000AFB4 803D[123E0100]01    <1> 	cmp	byte [createfile_wfc], 1
  4595 0000AFBB 7324                <1> 	jnb	short loc_createfile_err_retn
  4596 0000AFBD C3                  <1> 	retn
  4597                              <1> 
  4598                              <1> loc_createfile_wnc_inv_format_retn:
  4599                              <1> 	;mov	eax, 28
  4600 0000AFBE B01C                <1> 	mov	al, 28 ; Invalid format
  4601 0000AFC0 EBF2                <1> 	jmp	short loc_createfile_stc_retn
  4602                              <1> 	         
  4603                              <1> loc_createfile_get_set_write_next_cluster_2:
  4604 0000AFC2 83F802              <1> 	cmp	eax, 2
  4605 0000AFC5 72F7                <1> 	jb	short loc_createfile_wnc_inv_format_retn
  4606                              <1> 
  4607                              <1> loc_createfile_get_set_write_next_cluster_3:
  4608 0000AFC7 8B0D[003E0100]      <1> 	mov	ecx, [createfile_Cluster]
  4609 0000AFCD A3[003E0100]        <1> 	mov	[createfile_Cluster], eax
  4610 0000AFD2 890D[043E0100]      <1> 	mov	[createfile_PCluster], ecx
  4611 0000AFD8 0FB60D[093E0100]    <1> 	movzx	ecx, byte [createfile_SecPerClust]
  4612 0000AFDF EB85                <1> 	jmp	short loc_createfile_get_set_wf_fclust_cont
  4613                              <1> 
  4614                              <1> loc_createfile_err_retn:
  4615 0000AFE1 F9                  <1> 	stc
  4616                              <1> 
  4617                              <1> ;loc_createfile_upd_dir_modif_date_time:
  4618                              <1> loc_createfile_stc_retn_cc: ; 31/03/2016
  4619 0000AFE2 9C                  <1> 	pushf	; cpu is here for an error return or completion 
  4620 0000AFE3 50                  <1> 	push	eax ; error code if cf = 1
  4621                              <1> 
  4622                              <1> 	;call	update_parent_dir_lmdt
  4623                              <1> 
  4624                              <1> ;loc_createfile_stc_retn_cc:
  4625 0000AFE4 A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter]
  4626 0000AFE9 09C0                <1> 	or	eax, eax
  4627 0000AFEB 741A                <1> 	jz	short loc_createfile_stc_retn_pop_eax
  4628 0000AFED 8A3D[A6310100]      <1> 	mov	bh, [Current_Drv]
  4629 0000AFF3 B301                <1> 	mov	bl, 01h ; BL = 1 -> add clusters
  4630                              <1> 	; NOTE: EAX value will be added to Free Cluster Count
  4631                              <1> 	; (If EAX value is negative, Free Cluster Count will be decreased)
  4632 0000AFF5 E8AE060000          <1>   	call	calculate_fat_freespace
  4633                              <1>         ; ESI = Logical DOS Drive Description Table Address 
  4634                              <1>         ;jc	short loc_createfile_stc_retn_pop_eax_cf
  4635 0000AFFA 21C9                <1> 	and	ecx, ecx ; cx = 0 -> valid free sector count
  4636 0000AFFC 7409                <1> 	jz	short loc_createfile_stc_retn_pop_eax
  4637                              <1> 
  4638                              <1> loc_createfile_stc_retn_recalc_FAT_freespace:
  4639 0000AFFE 66BB00FF            <1> 	mov	bx, 0FF00h ; bh = 0FFh -> 
  4640                              <1> 	; ESI = Logical DOS Drv DT Addr
  4641                              <1> 	; BL = 0 -> Recalculate 
  4642 0000B002 E8A1060000          <1> 	call	calculate_fat_freespace
  4643                              <1> 
  4644                              <1> loc_createfile_stc_retn_pop_eax:
  4645 0000B007 58                  <1> 	pop	eax
  4646 0000B008 9D                  <1> 	popf
  4647 0000B009 7218                <1> 	jc	short loc_createfile_retn
  4648                              <1> 
  4649                              <1> loc_createfile_retn_fcluster:
  4650 0000B00B A1[F83D0100]        <1> 	mov	eax, [createfile_FFCluster]
  4651 0000B010 BB[F43D0100]        <1> 	mov	ebx, createfile_size
  4652                              <1> 	;movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  4653 0000B015 0FB60D[093E0100]    <1> 	movzx	ecx, byte [createfile_SecPerClust] ; 23/03/2016
  4654 0000B01C 0FB715[0A3E0100]    <1> 	movzx	edx, word [createfile_DirIndex]
  4655                              <1> 
  4656                              <1> loc_createfile_retn:
  4657 0000B023 C3                  <1> 	retn
  4658                              <1> 
  4659                              <1> create_fs_file:
  4660                              <1> 	; temporary (21/03/2016)
  4661 0000B024 C3                  <1> 	retn
  4662                              <1> 
  4663                              <1> delete_fs_file:
  4664                              <1> 	; temporary (28/02/2016)
  4665 0000B025 C3                  <1> 	retn
  4666                              <1> 
  4667                              <1> rename_fs_file_or_directory:
  4668 0000B026 C3                  <1> 	retn
  4669                              <1> 
  4670                              <1> make_fs_directory:
  4671                              <1> 	; temporary (21/02/2016)
  4672 0000B027 C3                  <1> 	retn
  4673                              <1> 
  4674                              <1> add_new_fs_section:
  4675                              <1> 	; temporary (11/03/2016)
  4676 0000B028 C3                  <1> 	retn
  4677                              <1> 
  4678                              <1> delete_fs_directory_entry:
  4679                              <1> 	; temporary (11/03/2016)
  4680 0000B029 C3                  <1> 	retn
  4681                              <1> 
  4682                              <1> csftdf2_read_fs_file_sectors:
  4683                              <1> 	; temporary (19/03/2016)
  4684 0000B02A C3                  <1> 	retn
  4685                              <1> 
  4686                              <1> csftdf2_write_fs_file_sectors:
  4687                              <1> 	; temporary (19/03/2016)
  4688 0000B02B C3                  <1> 	retn
  2137                                  %include 'trdosk5.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - File System Procedures : trdosk5s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 23/10/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    11                              <1> ; DRV_FAT.ASM (21/08/2011)
    12                              <1> ; ****************************************************************************
    13                              <1> ; DRV_FAT.ASM (c) 2005-2011 Erdogan TAN [ 07/07/2009 ] Last Update: 21/08/2011
    14                              <1> 
    15                              <1> get_next_cluster:
    16                              <1> 	; 15/10/2016
    17                              <1> 	; 23/03/2016
    18                              <1> 	; 01/02/2016 (TRDOS 386 =  TRDOS v2.0)
    19                              <1> 	; 05/07/2011
    20                              <1> 	; 07/07/2009
    21                              <1> 	; 2005
    22                              <1> 	; INPUT ->
    23                              <1> 	;	EAX = Cluster Number (32 bit)
    24                              <1> 	;	ESI = Logical DOS Drive Parameters Table
    25                              <1> 	; OUTPUT ->
    26                              <1> 	;	cf = 0 -> No Error, EAX valid
    27                              <1> 	;	cf = 1 & EAX = 0 -> End Of Cluster Chain
    28                              <1> 	;	cf = 1 & EAX > 0 -> Error
    29                              <1> 	;	ECX = Current/Previous cluster (if CF = 0)
    30                              <1> 	;	EAX = Next Cluster Number (32 bit)
    31                              <1> 	;
    32                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
    33                              <1> 
    34 0000B02C A3[BA390100]        <1> 	mov	[FAT_CurrentCluster], eax
    35                              <1> check_next_cluster_fat_type:
    36 0000B031 29D2                <1> 	sub	edx, edx ; 0
    37 0000B033 807E0302            <1>         cmp     byte [esi+LD_FATType], 2
    38 0000B037 7250                <1> 	jb	short get_FAT12_next_cluster
    39 0000B039 0F87AF000000        <1>         ja      get_FAT32_next_cluster
    40                              <1> get_FAT16_next_cluster:
    41 0000B03F BB00030000          <1> 	mov	ebx, 300h ;768
    42 0000B044 F7F3                <1> 	div	ebx
    43                              <1> 	; EAX = Count of 3 FAT sectors
    44                              <1> 	; EDX = Cluster Offset (< 768)
    45 0000B046 66D1E2              <1> 	shl	dx, 1 ; Multiply by 2
    46 0000B049 89D3                <1> 	mov	ebx, edx ; Byte Offset
    47 0000B04B 81C3001C0900        <1> 	add	ebx, FAT_Buffer
    48 0000B051 66BA0300            <1> 	mov	dx, 3
    49 0000B055 F7E2                <1> 	mul	edx  
    50                              <1> 	; EAX = FAT Sector (<= 256)
    51                              <1> 	; EDX = 0
    52 0000B057 8A0E                <1> 	mov	cl, [esi+LD_Name]
    53 0000B059 803D[BE390100]00    <1> 	cmp	byte [FAT_BuffValidData], 0
    54 0000B060 0F86CC000000        <1>         jna     load_FAT_sectors0
    55 0000B066 3A0D[BF390100]      <1> 	cmp	cl, [FAT_BuffDrvName]
    56 0000B06C 0F85C0000000        <1>         jne     load_FAT_sectors0
    57 0000B072 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
    58 0000B078 0F85BA000000        <1>         jne     load_FAT_sectors1
    59                              <1> 	;movzx	eax, word [ebx]
    60 0000B07E 668B03              <1> 	mov	ax, [ebx]
    61                              <1> 	; 01/02/2016
    62                              <1> 	; DRV_FAT.ASM (21/08/2011) had a FATal bug here !
    63                              <1> 	; (cmp ah, 0Fh) ! (ax >= FF7h)
    64                              <1> 	; (how can i do a such mistake!?)
    65                              <1> 	;cmp	al, 0F7h
    66                              <1> 	;jb	short loc_pass_gnc_FAT16_eoc_check
    67                              <1> 	;cmp	ah, 0FFh
    68                              <1> 	;jb	short loc_pass_gnc_FAT16_eoc_check
    69 0000B081 6683F8F7            <1> 	cmp	ax, 0FFF7h
    70 0000B085 725A                <1> 	jb	short loc_pass_gnc_FAT16_eoc_check
    71                              <1> 	; ax >= FFF7h (cluster 0002h to FFF6h is valid, in use)
    72 0000B087 EB56                <1> 	jmp	short loc_pass_gnc_FAT16_eoc_check_xor_eax
    73                              <1> 
    74                              <1> get_FAT12_next_cluster:
    75 0000B089 BB00040000          <1> 	mov	ebx, 400h ;1024
    76 0000B08E F7F3                <1> 	div	ebx
    77                              <1> 	; EAX = Count of 3 FAT sectors
    78                              <1> 	; EDX = Cluster Offset (< 1024)
    79 0000B090 6650                <1> 	push	ax
    80 0000B092 66B80300            <1> 	mov	ax, 3	
    81 0000B096 66F7E2              <1> 	mul	dx    	; Multiply by 3
    82 0000B099 66D1E8              <1> 	shr	ax, 1	; Divide by 2
    83 0000B09C 6689C3              <1>         mov	bx, ax 	; Byte Offset
    84 0000B09F 81C3001C0900        <1> 	add	ebx, FAT_Buffer
    85 0000B0A5 6658                <1> 	pop	ax
    86 0000B0A7 66BA0300            <1> 	mov	dx, 3
    87 0000B0AB F7E2                <1> 	mul	edx 
    88                              <1> 	; EAX = FAT Sector (<= 12)
    89                              <1> 	; EDX = 0
    90 0000B0AD 8A0E                <1> 	mov	cl, [esi+LD_Name]
    91 0000B0AF 803D[BE390100]00    <1> 	cmp	byte [FAT_BuffValidData], 0
    92 0000B0B6 767A                <1> 	jna	short load_FAT_sectors0
    93 0000B0B8 3A0D[BF390100]      <1> 	cmp	cl, [FAT_BuffDrvName]
    94 0000B0BE 7572                <1> 	jne	short load_FAT_sectors0
    95 0000B0C0 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
    96 0000B0C6 7570                <1> 	jne	short load_FAT_sectors1
    97 0000B0C8 A1[BA390100]        <1> 	mov	eax, [FAT_CurrentCluster]
    98 0000B0CD 66D1E8              <1> 	shr	ax, 1
    99                              <1> 	;movzx	eax, word [ebx]
   100 0000B0D0 668B03              <1> 	mov	ax, [ebx]
   101 0000B0D3 7314                <1> 	jnc	short get_FAT12_nc_even
   102 0000B0D5 66C1E804            <1> 	shr	ax, 4
   103                              <1> loc_gnc_fat12_eoc_check:
   104                              <1> 	;cmp	al, 0F7h
   105                              <1> 	;jb	short loc_pass_gnc_FAT16_eoc_check
   106                              <1> 	;cmp	ah, 0Fh
   107                              <1> 	;jb	short loc_pass_gnc_FAT16_eoc_check
   108 0000B0D9 663DF70F            <1> 	cmp	ax, 0FF7h
   109 0000B0DD 7202                <1> 	jb	short loc_pass_gnc_FAT16_eoc_check
   110                              <1> 	; ax >= FF7h (cluster 0002h to FF6h is valid, in use)
   111                              <1> 
   112                              <1> loc_pass_gnc_FAT16_eoc_check_xor_eax:
   113 0000B0DF 31C0                <1> 	xor	eax, eax ; 0
   114                              <1> loc_pass_gnc_FAT16_eoc_check:
   115                              <1> loc_pass_gnc_FAT32_eoc_check:
   116 0000B0E1 8B0D[BA390100]      <1> 	mov	ecx, [FAT_CurrentCluster]
   117 0000B0E7 F5                  <1> 	cmc
   118 0000B0E8 C3                  <1> 	retn
   119                              <1> 
   120                              <1> get_FAT12_nc_even:
   121 0000B0E9 80E40F              <1> 	and	ah, 0Fh
   122 0000B0EC EBEB                <1> 	jmp	short loc_gnc_fat12_eoc_check
   123                              <1> 
   124                              <1> get_FAT32_next_cluster:
   125 0000B0EE BB80010000          <1> 	mov	ebx, 180h ;384
   126 0000B0F3 F7F3                <1> 	div	ebx
   127                              <1> 	; EAX = Count of 3 FAT sectors
   128                              <1> 	; EDX = Cluster Offset (< 384)
   129 0000B0F5 66C1E202            <1> 	shl	dx, 2	; Multiply by 4
   130 0000B0F9 89D3                <1> 	mov	ebx, edx ; Byte Offset
   131 0000B0FB 81C3001C0900        <1> 	add	ebx, FAT_Buffer
   132 0000B101 66BA0300            <1> 	mov	dx, 3
   133 0000B105 F7E2                <1> 	mul	edx	
   134                              <1>         ; EAX = FAT Sector (<= 2097152) ; (FFFFFF7h * 4) / 512
   135                              <1> 	; 	for 32KB cluster size:
   136                              <1> 	;	EAX <= 1024 = (4GB / 32KB) * 4) / 512 	
   137                              <1> 	; EDX = 0
   138 0000B107 8A0E                <1> 	mov	cl, [esi+LD_Name]
   139 0000B109 803D[BE390100]00    <1> 	cmp	byte [FAT_BuffValidData], 0
   140 0000B110 7620                <1> 	jna	short load_FAT_sectors0
   141 0000B112 3A0D[BF390100]      <1> 	cmp	cl, [FAT_BuffDrvName]
   142 0000B118 7518                <1> 	jne	short load_FAT_sectors0
   143 0000B11A 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector] ; 0, 3, 6, 9 ...
   144 0000B120 7516                <1> 	jne	short load_FAT_sectors1
   145 0000B122 8B03                <1> 	mov	eax, [ebx]
   146 0000B124 25FFFFFF0F          <1>  	and	eax, 0FFFFFFFh ; 28 bit Cluster
   147 0000B129 3DF7FFFF0F          <1> 	cmp	eax, 0FFFFFF7h
   148 0000B12E 72B1                <1> 	jb	short loc_pass_gnc_FAT32_eoc_check
   149                              <1> 	; eax >= FFFFFF7h (cluster 0002h to FFFFFF6h is valid)
   150 0000B130 EBAD                <1> 	jmp	short loc_pass_gnc_FAT16_eoc_check_xor_eax
   151                              <1> 
   152                              <1> load_FAT_sectors0:
   153 0000B132 880D[BF390100]      <1> 	mov	[FAT_BuffDrvName], cl
   154                              <1> load_FAT_sectors1:
   155 0000B138 A3[C2390100]        <1> 	mov	[FAT_BuffSector], eax
   156 0000B13D 89C3                <1> 	mov	ebx, eax
   157 0000B13F 034660              <1>         add     eax, [esi+LD_FATBegin]
   158 0000B142 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
   159 0000B146 7706                <1>         ja      short load_FAT_sectors3
   160 0000B148 0FB74E1C            <1> 	movzx	ecx, word [esi+LD_BPB+BPB_FATSz16]
   161 0000B14C EB03                <1> 	jmp	short load_FAT_sectors4
   162                              <1> load_FAT_sectors3:
   163 0000B14E 8B4E2A              <1> 	mov	ecx, [esi+LD_BPB+BPB_FATSz32]
   164                              <1> load_FAT_sectors4:
   165 0000B151 29D9                <1> 	sub	ecx, ebx ; [FAT_BuffSector]
   166 0000B153 83F903              <1>         cmp     ecx, 3
   167 0000B156 7605                <1>         jna     short load_FAT_sectors5
   168 0000B158 B903000000          <1> 	mov	ecx, 3
   169                              <1> load_FAT_sectors5:
   170 0000B15D BB001C0900          <1> 	mov	ebx, FAT_Buffer
   171 0000B162 E80A350000          <1> 	call	disk_read
   172 0000B167 730D                <1> 	jnc	short load_FAT_sectors_ok
   173                              <1> 	; 15/10/2016 (15h -> 17)
   174                              <1> 	; 23/03/2016 (15h)
   175 0000B169 B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error
   176 0000B16E C605[BE390100]00    <1> 	mov	byte [FAT_BuffValidData], 0
   177 0000B175 C3                  <1> 	retn
   178                              <1> load_FAT_sectors_ok:
   179 0000B176 C605[BE390100]01    <1> 	mov	byte [FAT_BuffValidData], 1
   180 0000B17D A1[BA390100]        <1> 	mov	eax, [FAT_CurrentCluster]
   181 0000B182 E9AAFEFFFF          <1>         jmp     check_next_cluster_fat_type
   182                              <1> 
   183                              <1> load_FAT_root_directory:
   184                              <1> 	; 23/10/2016
   185                              <1> 	; 15/10/2016
   186                              <1> 	; 07/02/2016
   187                              <1> 	; 02/02/2016
   188                              <1> 	; 01/02/2016 (TRDOS 386 =  TRDOS v2.0)
   189                              <1> 	; 21/05/2011
   190                              <1> 	; 22/08/2009
   191                              <1> 	;
   192                              <1> 	; INPUT ->
   193                              <1> 	;	ESI = Logical DOS Drive Description Table
   194                              <1> 	; OUTPUT ->
   195                              <1> 	;	cf = 1 -> Root directory could not be loaded
   196                              <1> 	;	    EAX > 0 -> Error number
   197                              <1> 	;	cf = 0 -> EAX = 0
   198                              <1> 	;	ECX = Directory buffer size in sectors (CL)
   199                              <1> 	;	EBX = Directory buffer address
   200                              <1> 	; 	NOTE: DirBuffer_Size is in bytes ! (word)
   201                              <1> 	;
   202                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
   203                              <1> 
   204                              <1> 	; NOTE: Only for FAT12 and FAT16 file systems !
   205                              <1> 	; (FAT32 fs root dir must be loaded as sub directory)
   206                              <1> 
   207 0000B187 8A1E                <1> 	mov	bl, [esi+LD_Name]
   208 0000B189 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   209                              <1> 
   210                              <1> 	;mov	[DirBuff_DRV], bl
   211                              <1> 	;mov	[DirBuff_FATType], bh
   212 0000B18C 66891D[CE390100]    <1> 	mov	[DirBuff_DRV], bx
   213                              <1> 	
   214                              <1> 	;cmp	bh, 2
   215                              <1> 	;ja	short load_FAT32_root_dir0 ; FAT32 root dir
   216                              <1> 
   217                              <1> load_FAT_root_dir0: ; 23/10/2016
   218 0000B193 0FB75617            <1> 	movzx	edx, word [esi+LD_BPB+RootDirEnts]
   219                              <1> 
   220                              <1> 	;or	dx, dx ; 0 for FAT32 file systems
   221                              <1> 	;jz	short load_FAT32_root_dir0 ; FAT32 root dir
   222                              <1> 
   223 0000B197 6681FA0002          <1> 	cmp	dx, 512 ; Number of Root Dir Entries
   224 0000B19C 7414                <1> 	je	short lrd_mov_ecx_32
   225 0000B19E 89D0                <1> 	mov	eax, edx
   226                              <1> 	; 23/10/2016
   227 0000B1A0 89C1                <1> 	mov	ecx, eax
   228 0000B1A2 6683C10F            <1> 	add	cx, 15 ; round up 
   229 0000B1A6 66C1E904            <1> 	shr	cx, 4  ; 16 entries per sector (512/32)
   230                              <1> 	; ecx = Root directory size in sectors
   231 0000B1AA 66C1E005            <1> 	shl	ax, 5 ; Root directory size in bytes
   232 0000B1AE 664A                <1> 	dec	dx    ; Last entry number of root dir
   233                              <1> 	; cx = Dir Buffer sector count             
   234 0000B1B0 EB0B                <1> 	jmp	short lrd_check_dir_buffer
   235                              <1> 
   236                              <1> lrd_mov_ecx_32:
   237 0000B1B2 B920000000          <1> 	mov	ecx, 32
   238 0000B1B7 664A                <1> 	dec	dx ; 511
   239 0000B1B9 66B80040            <1> 	mov	ax, 32*512 
   240                              <1>  
   241                              <1> lrd_check_dir_buffer:
   242 0000B1BD 29DB                <1> 	sub	ebx, ebx ; 0
   243 0000B1BF 881D[D0390100]      <1> 	mov	[DirBuff_ValidData], bl ; 0
   244 0000B1C5 668915[D3390100]    <1> 	mov	[DirBuff_LastEntry], dx
   245 0000B1CC 891D[D5390100]      <1> 	mov	[DirBuff_Cluster], ebx ; 0
   246 0000B1D2 66A3[D9390100]      <1> 	mov	[DirBuffer_Size], ax
   247                              <1> 
   248 0000B1D8 8B4664              <1> 	mov	eax, [esi+LD_ROOTBegin]
   249                              <1> read_directory:
   250 0000B1DB BB00000800          <1> 	mov	ebx, Directory_Buffer
   251 0000B1E0 51                  <1> 	push	ecx ; Directory buffer sector count
   252 0000B1E1 53                  <1> 	push	ebx
   253 0000B1E2 E88A340000          <1> 	call	disk_read
   254 0000B1E7 5B                  <1> 	pop	ebx
   255 0000B1E8 720B                <1> 	jc	short load_DirBuff_error
   256                              <1> 
   257                              <1> validate_DirBuff_and_return:
   258 0000B1EA 59                  <1> 	pop	ecx ; Number of loaded sectors
   259 0000B1EB C605[D0390100]01    <1> 	mov	byte [DirBuff_ValidData], 1
   260 0000B1F2 31C0                <1> 	xor	eax, eax ; 0 = no error
   261 0000B1F4 C3                  <1> 	retn
   262                              <1> 
   263                              <1> load_DirBuff_error:
   264 0000B1F5 89C8                <1> 	mov	eax, ecx ; remaining sectors
   265 0000B1F7 59                  <1> 	pop	ecx ; sector count
   266 0000B1F8 29C1                <1> 	sub	ecx, eax ; Number of loaded sectors
   267                              <1> 	; 15/10/2016 (15h -> 17)
   268 0000B1FA B811000000          <1> 	mov	eax, 17 ; DRV NOT READY OR READ ERROR !
   269 0000B1FF F9                  <1> 	stc
   270 0000B200 C3                  <1>         retn
   271                              <1> 
   272                              <1> load_FAT32_root_directory:
   273                              <1> 	; 02/02/2016 (TRDOS 386 =  TRDOS v2.0)
   274                              <1> 	;
   275                              <1> 	; INPUT ->
   276                              <1> 	;	ESI = Logical DOS Drive Description Table
   277                              <1> 	; OUTPUT ->
   278                              <1> 	;	cf = 1 -> Root directory could not be loaded
   279                              <1> 	;	    EAX > 0 -> Error number
   280                              <1> 	;	cf = 0 -> EAX = 0
   281                              <1> 	;	ECX = Directory buffer size in sectors (CL)
   282                              <1> 	;	EBX = Directory buffer address
   283                              <1> 	; 	NOTE: DirBuffer_Size is in bytes ! (word)
   284                              <1> 	;
   285                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
   286                              <1> 
   287                              <1> 
   288 0000B201 8A1E                <1> 	mov	bl, [esi+LD_Name]
   289 0000B203 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   290                              <1> 
   291                              <1> 	;mov	[DirBuff_DRV], bl
   292                              <1> 	;mov	[DirBuff_FATType], bh
   293 0000B206 66891D[CE390100]    <1> 	mov	[DirBuff_DRV], bx
   294                              <1> 
   295                              <1> load_FAT32_root_dir0:
   296 0000B20D 8B4632              <1> 	mov	eax, [esi+LD_BPB+FAT32_RootFClust]
   297 0000B210 EB0C                <1> 	jmp	short load_FAT_sub_dir0
   298                              <1> 	
   299                              <1> load_FAT_sub_directory:
   300                              <1> 	; 01/02/2016 (TRDOS 386 =  TRDOS v2.0)
   301                              <1> 	; 05/07/2011
   302                              <1> 	; 23/08/2009
   303                              <1> 	;
   304                              <1> 	; INPUT ->
   305                              <1> 	;	ESI = Logical DOS Drive Description Table
   306                              <1> 	;	EAX = Cluster Number
   307                              <1> 	; OUTPUT ->
   308                              <1> 	;	cf = 1 -> Sub directory could not be loaded
   309                              <1> 	;	    EAX > 0 -> Error number
   310                              <1> 	;	cf = 0 -> EAX = 0
   311                              <1> 	;	ECX = Directory buffer size in sectors (CL)
   312                              <1> 	;	EBX = Directory buffer address
   313                              <1> 	;
   314                              <1> 	; 	NOTE: DirBuffer_Size is in bytes ! (word)
   315                              <1> 	;
   316                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
   317                              <1> 
   318 0000B212 8A1E                <1> 	mov	bl, [esi+LD_Name]
   319 0000B214 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   320                              <1> 
   321                              <1> 	;mov	[DirBuff_DRV], bl
   322                              <1> 	;mov	[DirBuff_FATType], bh
   323 0000B217 66891D[CE390100]    <1> 	mov	[DirBuff_DRV], bx
   324                              <1> 
   325                              <1> load_FAT_sub_dir0:
   326 0000B21E 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
   327                              <1> 
   328 0000B222 882D[D0390100]      <1> 	mov	[DirBuff_ValidData], ch ; 0
   329 0000B228 A3[D5390100]        <1> 	mov	[DirBuff_Cluster], eax
   330                              <1> 
   331 0000B22D 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
   332 0000B231 F7E1                <1> 	mul	ecx
   333 0000B233 C1E805              <1> 	shr	eax, 5 ; directory entry count (dir size / 32)
   334 0000B236 6648                <1> 	dec	ax ; last entry
   335 0000B238 66A3[D3390100]      <1> 	mov	[DirBuff_LastEntry], ax
   336                              <1> 
   337 0000B23E A1[D5390100]        <1> 	mov	eax, [DirBuff_Cluster]
   338 0000B243 83E802              <1> 	sub	eax, 2
   339 0000B246 F7E1                <1> 	mul	ecx
   340 0000B248 034668              <1> 	add	eax, [esi+LD_DATABegin]
   341                              <1> 	; ecx = sector per cluster (dir buffer size = 32 sectors)
   342 0000B24B EB8E                <1> 	jmp	short read_directory
   343                              <1> 
   344                              <1> ; DRV_FS.ASM
   345                              <1> 
   346                              <1> load_current_FS_directory:
   347 0000B24D C3                  <1> 	retn
   348                              <1> load_FS_root_directory:
   349 0000B24E C3                  <1> 	retn
   350                              <1> load_FS_sub_directory:
   351 0000B24F C3                  <1> 	retn
   352                              <1> 
   353                              <1> read_cluster:
   354                              <1> 	; 15/10/2016
   355                              <1> 	; 18/03/2016
   356                              <1> 	; 16/03/2016
   357                              <1> 	; 17/02/2016
   358                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
   359                              <1> 	;
   360                              <1> 	; INPUT ->
   361                              <1> 	;	EAX = Cluster Number (Sector index for SINGLIX FS)
   362                              <1> 	;	ESI = Logical DOS Drive Description Table address
   363                              <1> 	;	EBX = Cluster (File R/W) Buffer address (max. 64KB)
   364                              <1> 	;	Only for SINGLIX FS:
   365                              <1> 	;	EDX = File Number (The 1st FDT address) 
   366                              <1> 	; OUTPUT ->
   367                              <1> 	;	cf = 1 -> Cluster can not be loaded at the buffer
   368                              <1> 	;	    EAX > 0 -> Error number
   369                              <1> 	;	cf = 0 -> Cluster has been loaded at the buffer
   370                              <1> 	;
   371                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
   372                              <1> 	
   373 0000B250 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+BPB_SecPerClust] 
   374                              <1> 	; CL = 1 = [esi+LD_FS_Reserved2] ; SectPerClust for Singlix FS
   375                              <1> 
   376                              <1> read_file_sectors: ; 16/03/2016
   377 0000B254 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
   378 0000B258 761C                <1> 	jna	short read_fs_cluster
   379                              <1> 
   380                              <1> read_fat_file_sectors: ; 18/03/2016
   381 0000B25A 83E802              <1> 	sub	eax, 2 ; Beginning cluster number is always 2
   382 0000B25D 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+BPB_SecPerClust] ; 18/03/2016 
   383 0000B261 F7E2                <1> 	mul	edx
   384 0000B263 034668              <1> 	add	eax, [esi+LD_DATABegin] ; absolute address of the cluster
   385                              <1> 
   386                              <1> 	; EAX = Disk sector address
   387                              <1> 	; ECX = Sector count
   388                              <1> 	; EBX = Buffer address
   389                              <1> 	; (EDX = 0)
   390                              <1> 	; ESI = Logical DOS drive description table address	
   391                              <1> 
   392 0000B266 E806340000          <1> 	call	disk_read
   393 0000B26B 7306                <1> 	jnc	short rclust_retn
   394                              <1> 	
   395                              <1> 	; 15/10/2016 (15h -> 17)
   396 0000B26D B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
   397 0000B272 C3                  <1> 	retn
   398                              <1> 
   399                              <1> rclust_retn:
   400 0000B273 29C0                <1> 	sub	eax, eax ; 0
   401 0000B275 C3                  <1> 	retn
   402                              <1> 
   403                              <1> read_fs_cluster:
   404                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
   405                              <1> 	; Singlix FS
   406                              <1> 	
   407                              <1> 	; EAX = Cluster number is sector index number of the file (eax)
   408                              <1> 	
   409                              <1> 	; EDX = File number is the first File Descriptor Table address 
   410                              <1> 	;	of the file. (Absolute address of the FDT).
   411                              <1> 	
   412                              <1> 	; eax = sector index (0 for the first sector)
   413                              <1> 	; edx = FDT0 address
   414                              <1> 		; 64 KB buffer = 128 sectors (limit) 
   415 0000B276 B980000000          <1> 	mov	ecx, 128 ; maximum count of sectors (before eof) 
   416 0000B27B E801000000          <1> 	call	read_fs_sectors
   417 0000B280 C3                  <1> 	retn
   418                              <1> 
   419                              <1> read_fs_sectors:
   420                              <1> 	; 15/02/2016 (TRDOS 386 =  TRDOS v2.0)
   421 0000B281 F9                  <1> 	stc
   422 0000B282 C3                  <1> 	retn
   423                              <1> 
   424                              <1> get_first_free_cluster:
   425                              <1> 	; 02/03/2016
   426                              <1> 	; 21/02/2016 (TRDOS 386 =  TRDOS v2.0)
   427                              <1> 	; 26/10/2010 (DRV_FAT.ASM, 'proc_get_first_free_cluster')
   428                              <1> 	; 10/07/2010
   429                              <1> 	; INPUT ->
   430                              <1> 	;	ESI = Logical DOS Drive Description Table address
   431                              <1> 	; OUTPUT ->
   432                              <1> 	;	cf = 1 -> Error code in AL (EAX)
   433                              <1> 	;	cf = 0 -> 
   434                              <1> 	;	  EAX = Cluster number 
   435                              <1> 	;	  If EAX = FFFFFFFFh -> no free space
   436                              <1> 	;	If the drive has FAT32 fs:
   437                              <1> 	;	  EBX = FAT32 FSI sector buffer address (if > 0)
   438                              <1> 
   439 0000B283 8B4678              <1> 	mov	eax, [esi+LD_Clusters]
   440 0000B286 40                  <1> 	inc	eax ; add eax, 1
   441 0000B287 A3[583C0100]        <1> 	mov	[gffc_last_free_cluster], eax
   442                              <1> 
   443 0000B28C 31DB                <1> 	xor	ebx, ebx ; 0 ; 02/03/2016
   444                              <1> 
   445 0000B28E 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
   446 0000B292 760E                <1> 	jna	short loc_gffc_get_first_fat_free_cluster0
   447                              <1> 
   448                              <1> loc_gffc_get_first_fat32_free_cluster:
   449                              <1> 	; 02/03/2016
   450 0000B294 E844060000          <1> 	call	get_fat32_fsinfo_sector_parms
   451 0000B299 7207                <1> 	jc	short loc_gffc_get_first_fat_free_cluster0 
   452                              <1> 
   453                              <1> loc_gffc_check_fsinfo_parms:
   454                              <1> 	;;mov	ebx, DOSBootSectorBuff
   455                              <1> 	;cmp	dword [ebx], 41615252h
   456                              <1> 	;jne	short loc_gffc_fat32_fsinfo_err
   457                              <1> 	;cmp	dword [ebx+484], 61417272h
   458                              <1> 	;jne	short loc_gffc_fat32_fsinfo_err
   459                              <1> 	;mov	eax, [ebx+492] ; FSI_Next_Free
   460                              <1> 	;EAX = First free cluster 
   461                              <1> 	;(from FAT32 FSInfo sector)
   462 0000B29B 89D0                <1> 	mov	eax, edx ; FSI_Next_Free (First Free Cluster)
   463 0000B29D 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh ; invalid (unknown) !
   464 0000B2A0 7205                <1> 	jb	short loc_gffc_get_first_fat_free_cluster1
   465                              <1> 
   466                              <1> 	; Start from the 1st cluster of the FAT(32) file system
   467                              <1> loc_gffc_get_first_fat_free_cluster0:
   468 0000B2A2 B802000000          <1> 	mov	eax, 2
   469                              <1> 	;xor	edx, edx
   470                              <1> 
   471                              <1> loc_gffc_get_first_fat_free_cluster1:
   472 0000B2A7 53                  <1> 	push	ebx ; 02/03/2016 
   473                              <1> 
   474                              <1> loc_gffc_get_first_fat_free_cluster2:   
   475 0000B2A8 A3[543C0100]        <1> 	mov	[gffc_first_free_cluster], eax
   476 0000B2AD A3[503C0100]        <1> 	mov	[gffc_next_free_cluster], eax
   477                              <1> 
   478                              <1> 	; EBX = FAT32 FSINFO sector buffer address
   479                              <1> 	; (EBX = 0, if the drive has not got FAT32 fs or
   480                              <1> 	; FAT32 FSINFO sector buffer is invalid.)
   481                              <1> 
   482                              <1> loc_gffc_get_first_fat_free_cluster3:
   483 0000B2B2 E875FDFFFF          <1> 	call	get_next_cluster
   484 0000B2B7 7307                <1> 	jnc	short loc_gffc_get_first_fat_free_cluster4
   485 0000B2B9 09C0                <1> 	or	eax, eax
   486 0000B2BB 740B                <1> 	jz	short loc_gffc_first_free_fat_cluster_next
   487 0000B2BD 5B                  <1> 	pop	ebx ; 02/03/2016
   488 0000B2BE F5                  <1> 	cmc 	; stc
   489 0000B2BF C3                  <1> 	retn
   490                              <1> 
   491                              <1> loc_gffc_get_first_fat_free_cluster4:
   492 0000B2C0 21C0                <1> 	and	eax, eax ; next cluster value
   493 0000B2C2 7504                <1> 	jnz	short loc_gffc_first_free_fat_cluster_next
   494 0000B2C4 89C8                <1> 	mov	eax, ecx ; current (previous cluster) value
   495 0000B2C6 EB22                <1> 	jmp	short loc_gffc_check_for_set
   496                              <1>  
   497                              <1> loc_gffc_first_free_fat_cluster_next:
   498 0000B2C8 A1[503C0100]        <1> 	mov	eax, [gffc_next_free_cluster]
   499 0000B2CD 3B05[583C0100]      <1> 	cmp	eax, [gffc_last_free_cluster]
   500 0000B2D3 7308                <1> 	jnb	short retn_stc_from_get_first_free_cluster
   501                              <1> pass_gffc_last_cluster_eax_check:
   502 0000B2D5 40                  <1> 	inc	eax ; add eax, 1
   503 0000B2D6 A3[503C0100]        <1> 	mov	[gffc_next_free_cluster], eax
   504 0000B2DB EBD5                <1> 	jmp	short loc_gffc_get_first_fat_free_cluster3
   505                              <1> 
   506                              <1> retn_stc_from_get_first_free_cluster:
   507 0000B2DD A1[543C0100]        <1> 	mov	eax, [gffc_first_free_cluster]
   508 0000B2E2 83F802              <1> 	cmp	eax, 2
   509 0000B2E5 7709                <1> 	ja	short loc_gffc_check_previous_clusters
   510 0000B2E7 29C0                <1> 	sub	eax, eax
   511 0000B2E9 48                  <1> 	dec	eax ; FFFFFFFFh
   512                              <1> 
   513                              <1> loc_gffc_check_for_set:
   514                              <1> 	; 02/03/2016
   515 0000B2EA 5B                  <1> 	pop	ebx
   516                              <1> 
   517                              <1> 	; EBX = FAT32 FSINFO sector buffer address
   518                              <1> 	; (EBX = 0, if the drive has not got FAT32 fs or
   519                              <1> 	; FAT32 FSINFO sector buffer is invalid.)
   520                              <1> 
   521 0000B2EB 09DB                <1> 	or	ebx, ebx
   522 0000B2ED 750E                <1> 	jnz	short loc_gffc_set_ffree_fat32_cluster
   523                              <1> 
   524                              <1> 	;cmp	byte [esi+LD_FATType], 3
   525                              <1> 	;jnb	short loc_gffc_set_ffree_fat32_cluster
   526                              <1> 
   527                              <1> 	;xor	ebx, ebx ; 0
   528                              <1> 
   529                              <1> loc_gffc_retn:
   530 0000B2EF C3                  <1> 	retn
   531                              <1> 
   532                              <1> loc_gffc_check_previous_clusters:
   533 0000B2F0 48                  <1> 	dec	eax ; sub eax, 1
   534 0000B2F1 A3[583C0100]        <1> 	mov	[gffc_last_free_cluster], eax 
   535 0000B2F6 B802000000          <1> 	mov	eax, 2
   536                              <1> 	;xor	edx, edx
   537 0000B2FB EBAB                <1> 	jmp	short loc_gffc_get_first_fat_free_cluster2
   538                              <1> 
   539                              <1> loc_gffc_set_ffree_fat32_cluster:
   540                              <1> 	;call	set_first_free_cluster
   541                              <1> 	;retn
   542                              <1> 	;jmp	short set_first_free_cluster	
   543                              <1> 
   544                              <1> set_first_free_cluster:
   545                              <1> 	; 15/10/2016
   546                              <1> 	; 23/03/2016
   547                              <1> 	; 02/03/2016
   548                              <1> 	; 29/02/2016
   549                              <1> 	; 26/02/2016
   550                              <1> 	; 21/02/2016 (TRDOS 386 =  TRDOS v2.0)
   551                              <1> 	; 21/08/2011 (DRV_FAT.ASM, 'proc_set_first_free_cluster')
   552                              <1> 	; 11/07/2010
   553                              <1> 	; INPUT -> 
   554                              <1> 	;	ESI = Logical DOS Drive Description Table address
   555                              <1> 	;	EAX = First free cluster
   556                              <1> 	;	EBX = FSINFO sector buffer address
   557                              <1> 	;  	;;If EBX > 0, it is FSINFO sector buffer address
   558                              <1> 	;	;;EBX = 0, if FSINFO sector is not loaded
   559                              <1> 	; OUTPUT->
   560                              <1> 	;	ESI = Logical DOS Drive Description Table address
   561                              <1> 	;  	If EBX > 0, it is FSINFO sector buffer address
   562                              <1> 	;	EBX = 0, if FSINFO sector could not be loaded
   563                              <1> 	; 	CF = 1 -> Error code in AL (EAX)
   564                              <1> 	;	CF = 0 -> first free cluster is successfully updated 
   565                              <1> 
   566                              <1> 	;cmp	byte [esi+LD_FATType], 3
   567                              <1> 	;jb	short loc_sffc_invalid_drive
   568                              <1> 
   569                              <1> 	; Save First Free Cluster value for 'update_cluster'
   570 0000B2FD 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; First free Cluster	
   571                              <1> 
   572                              <1> 	;or	ebx, ebx
   573                              <1> 	;jnz	short loc_sffc_read_fsinfo_sector
   574                              <1> 
   575 0000B300 813B52526141        <1> 	cmp     dword [ebx], 41615252h
   576 0000B306 7540                <1> 	jne	short loc_sffc_read_fsinfo_sector
   577 0000B308 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
   577 0000B311 61                  <1>
   578 0000B312 7534                <1> 	jne	short loc_sffc_read_fsinfo_sector
   579                              <1> 
   580 0000B314 3B83EC010000        <1> 	cmp	eax, [ebx+492]  ; FSI_Next_Free
   581 0000B31A 741F                <1> 	je	short loc_sffc_retn
   582                              <1> 
   583                              <1> loc_sffc_write_fsinfo_sector:
   584                              <1> 	; EBX = FSINFO sector buffer
   585                              <1> 	; [CFS_FAT32FSINFOSEC] is set in 'get_fat32_fsinfo_sector_parms'
   586 0000B31C 8983EC010000        <1> 	mov	[ebx+492], eax
   587 0000B322 A1[683C0100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC] 
   588 0000B327 B901000000          <1> 	mov	ecx, 1
   589 0000B32C 53                  <1> 	push	ebx
   590 0000B32D E830330000          <1> 	call	disk_write
   591 0000B332 7208                <1> 	jc      short loc_sffc_read_fsinfo_sector_err1
   592 0000B334 5B                  <1> 	pop	ebx
   593                              <1> 
   594 0000B335 8B83EC010000        <1> 	mov	eax, [ebx+492] ; First (Next) Free Cluster
   595                              <1> 
   596                              <1> loc_sffc_retn:
   597 0000B33B C3                  <1> 	retn
   598                              <1> 
   599                              <1> ;loc_sffc_invalid_drive:
   600                              <1> ;	mov	eax, 0Fh ; MSDOS Error : Invalid drive
   601                              <1> ;	push	edx
   602                              <1> 
   603                              <1> loc_sffc_read_fsinfo_sector_err1:
   604 0000B33C BB00000000          <1> 	mov	ebx, 0
   605                              <1> 	; 15/10/2016 (1Dh -> 18)
   606                              <1> 	; 23/03/2016 (1Dh)
   607 0000B341 B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error
   608                              <1> 
   609                              <1> loc_sffc_read_fsinfo_sector_err2:
   610 0000B346 5A                  <1> 	pop	edx
   611 0000B347 C3                  <1> 	retn
   612                              <1> 	
   613                              <1> loc_sffc_read_fsinfo_sector:
   614 0000B348 50                  <1> 	push	eax
   615                              <1> 
   616 0000B349 E88F050000          <1> 	call	get_fat32_fsinfo_sector_parms
   617 0000B34E 72F6                <1> 	jc	short loc_sffc_read_fsinfo_sector_err2
   618                              <1> 
   619 0000B350 58                  <1> 	pop	eax
   620                              <1> 	; EDX = First (Next) Free Cluster value from FSINFO sector
   621                              <1> 	; EAX = First Free Cluster value from 'get_next_cluster'
   622                              <1> 	; (edx = old value)
   623 0000B351 39D0                <1> 	cmp	eax, edx ; First free Cluster (eax = new value) 
   624 0000B353 75C7                <1> 	jne	short loc_sffc_write_fsinfo_sector
   625                              <1> 
   626 0000B355 C3                  <1> 	retn	
   627                              <1> 
   628                              <1> update_cluster:
   629                              <1> 	; 23/10/2016
   630                              <1> 	; 23/03/2016
   631                              <1> 	; 02/03/2016
   632                              <1> 	; 01/03/2016
   633                              <1> 	; 29/02/2016
   634                              <1> 	; 27/02/2016
   635                              <1> 	; 26/02/2016
   636                              <1> 	; 22/02/2016 (TRDOS 386 =  TRDOS v2.0)
   637                              <1> 	; 11/08/2011  
   638                              <1> 	; 09/02/2005
   639                              <1> 	; INPUT ->
   640                              <1> 	;	EAX = Cluster Number
   641                              <1> 	;	ECX = New Cluster Value
   642                              <1> 	;	ESI = Logical Dos Drive Parameters Table
   643                              <1> 	;
   644                              <1> 	;	/// dword [FAT_ClusterCounter] ///
   645                              <1> 	;
   646                              <1> 	; OUTPUT ->
   647                              <1> 	;	cf = 0 -> No Error, EAX is valid
   648                              <1> 	;	cf = 1 & EAX = 0 -> End Of Cluster Chain
   649                              <1> 	; 	cf = 1 & EAX > 0 -> Error
   650                              <1> 	;		(ECX -> any value)
   651                              <1> 	; 	EAX = Next Cluster
   652                              <1> 	;	ECX = New Cluster Value
   653                              <1> 	;
   654                              <1> 	;	/// [FAT_ClusterCounter] is updated,
   655                              <1> 	;	/// decreased when a free cluster is assigned,
   656                              <1> 	;	/// increased if an assigned cluster is freed.	
   657                              <1> 	;		
   658                              <1> 	;
   659                              <1> 	; (Modified registers: EAX, EBX, -ECX-, EDX)
   660                              <1> 	
   661 0000B356 A3[BA390100]        <1> 	mov	[FAT_CurrentCluster], eax
   662 0000B35B 890D[5C3C0100]      <1> 	mov	[ClusterValue], ecx
   663                              <1> 
   664                              <1> loc_update_cluster_check_fat_buffer:
   665 0000B361 8A1E                <1> 	mov	bl, [esi+LD_Name]
   666 0000B363 381D[BF390100]      <1> 	cmp	[FAT_BuffDrvName], bl
   667 0000B369 741A                <1> 	je	short loc_update_cluster_check_fat_type
   668 0000B36B 803D[BE390100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
   669 0000B372 0F84C2000000        <1>         je      loc_uc_save_fat_buffer
   670                              <1> 
   671                              <1> loc_uc_reset_fat_buffer_validation:
   672 0000B378 C605[BE390100]00    <1> 	mov	byte [FAT_BuffValidData], 0
   673                              <1> 
   674                              <1> loc_uc_check_fat_type_reset_drvname:
   675 0000B37F 881D[BF390100]      <1> 	mov	[FAT_BuffDrvName], bl
   676                              <1> 
   677                              <1> loc_update_cluster_check_fat_type:
   678 0000B385 29D2                <1> 	sub	edx, edx ; 26/02/2016
   679 0000B387 8A5E03              <1> 	mov	bl, [esi+LD_FATType]
   680 0000B38A 83F802              <1> 	cmp	eax, 2
   681 0000B38D 0F82BE000000        <1>         jb      update_cluster_inv_data
   682 0000B393 80FB02              <1> 	cmp	bl, 2 
   683 0000B396 0F877A010000        <1>         ja      update_fat32_cluster
   684                              <1> 	;cmp	bl, 1
   685                              <1> 	;jb	short update_cluster_inv_data
   686 0000B39C 8B4E78              <1> 	mov	ecx, [esi+LD_Clusters]
   687 0000B39F 41                  <1> 	inc	ecx  
   688 0000B3A0 890D[CA390100]      <1> 	mov	[LastCluster], ecx
   689 0000B3A6 39C8                <1> 	cmp	eax, ecx ; dword [LastCluster]
   690 0000B3A8 0F87A6000000        <1>         ja      return_uc_fat_stc
   691                              <1> 	; TRDOS v1 has a FATal bug here ! 
   692                              <1> 		; or bl, bl ; cmp bl, 0
   693                              <1> 		; jz short update_fat12_cluster
   694                              <1> 	; !! It would destroy FAT12 floppy disk fs here !!
   695                              <1> 	; ('A:' disks of TRDOS v1 operating system project
   696                              <1> 	; had 'singlix fs', so, I could not differ this mistake
   697                              <1> 	; on a drive 'A:')
   698 0000B3AE 80FB01              <1> 	cmp	bl, 1 ; correct comparison is this !
   699 0000B3B1 0F86A2000000        <1>         jna     update_fat12_cluster 
   700                              <1> 
   701                              <1> update_fat16_cluster:
   702                              <1> pass_uc_fat16_errc:
   703                              <1> 	;sub	edx, edx
   704 0000B3B7 BB00030000          <1> 	mov	ebx, 300h ;768
   705 0000B3BC F7F3                <1> 	div	ebx
   706                              <1> 	; EAX = Count of 3 FAT sectors
   707                              <1> 	; DX = Cluster offset in FAT buffer
   708 0000B3BE 6689D3              <1> 	mov	bx, dx  
   709 0000B3C1 66D1E3              <1> 	shl	bx, 1 ; Multiply by 2
   710 0000B3C4 66BA0300            <1> 	mov	dx, 3
   711 0000B3C8 F7E2                <1> 	mul	edx  
   712                              <1> 	; EAX = FAT Sector
   713                              <1> 	; EDX = 0
   714                              <1> 	; EBX = Byte offset in FAT buffer
   715 0000B3CA 8A0D[BE390100]      <1> 	mov	cl, [FAT_BuffValidData]
   716 0000B3D0 80F902              <1> 	cmp	cl, 2
   717 0000B3D3 750A                <1> 	jne	short loc_uc_check_fat16_buff_sector_load
   718                              <1> 
   719                              <1> loc_uc_check_fat16_buff_sector_save:
   720 0000B3D5 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
   721 0000B3DB 755D                <1> 	jne	short loc_uc_save_fat_buffer
   722 0000B3DD EB15                <1> 	jmp	short loc_update_fat16_cell
   723                              <1> 
   724                              <1> loc_uc_check_fat16_buff_sector_load:
   725 0000B3DF 80F901              <1> 	cmp	cl, 1 ; byte [FAT_BuffValidData]
   726 0000B3E2 0F85FB010000        <1>         jne     loc_uc_load_fat_sectors
   727 0000B3E8 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
   728 0000B3EE 0F85EF010000        <1>         jne     loc_uc_load_fat_sectors
   729                              <1> 
   730                              <1> loc_update_fat16_cell:
   731                              <1> loc_update_fat16_buffer:
   732 0000B3F4 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
   733                              <1> 	;movzx	eax, word [ebx]
   734 0000B3FA 668B03              <1> 	mov	ax, [ebx]
   735                              <1> 	; 01/03/2016
   736 0000B3FD 89C2                <1> 	mov	edx, eax ; old value of the cluster
   737 0000B3FF A3[BA390100]        <1> 	mov	[FAT_CurrentCluster], eax
   738 0000B404 8B0D[5C3C0100]      <1> 	mov	ecx, [ClusterValue] ; 32 bits
   739 0000B40A 66890B              <1> 	mov	[ebx], cx ; 16 bits !
   740                              <1> 
   741 0000B40D C605[BE390100]02    <1> 	mov	byte [FAT_BuffValidData], 2
   742                              <1> 	
   743 0000B414 6683F802            <1> 	cmp	ax, 2
   744 0000B418 723A                <1> 	jb	short return_uc_fat_stc
   745 0000B41A 3B05[CA390100]      <1> 	cmp	eax, [LastCluster]
   746 0000B420 7732                <1> 	ja	short return_uc_fat_stc
   747                              <1> 
   748                              <1> loc_fat_buffer_updated:
   749                              <1> 	; 01/03/2016
   750 0000B422 F8                  <1> 	clc
   751                              <1> loc_fat_buffer_stc_1:
   752 0000B423 9C                  <1> 	pushf
   753 0000B424 21C9                <1> 	and	ecx, ecx
   754 0000B426 7506                <1> 	jnz	short loc_fat_buffer_updated_1
   755                              <1> 
   756                              <1> 	; 01/03/2016 
   757                              <1> 	; new value of the cluster = 0 (free)
   758                              <1> 	; increase free(d) cluster count
   759 0000B428 FF05[C6390100]      <1> 	inc	dword [FAT_ClusterCounter]
   760                              <1> 
   761                              <1> loc_fat_buffer_updated_1: ; new value of the cluster > 0
   762 0000B42E 09D2                <1> 	or	edx, edx ; 02/03/2016
   763 0000B430 7506                <1> 	jnz	short loc_fat_buffer_updated_2
   764                              <1> 	; old value of the cluster = 0 (it was free cluster)
   765                              <1> 	; decrease free(d) cluster count
   766 0000B432 FF0D[C6390100]      <1> 	dec	dword [FAT_ClusterCounter] ; it may be negative number
   767                              <1> 
   768                              <1> loc_fat_buffer_updated_2:
   769 0000B438 9D                  <1> 	popf
   770 0000B439 C3                  <1> 	retn
   771                              <1> 
   772                              <1> loc_uc_save_fat_buffer:
   773                              <1> 	; byte [FAT_BuffValidData] = 2 
   774 0000B43A E8D4010000          <1> 	call	save_fat_buffer
   775 0000B43F 0F8297010000        <1>         jc      loc_fat_sectors_rw_error2
   776                              <1> 	;mov	byte [FAT_BuffValidData], 1
   777 0000B445 A1[BA390100]        <1> 	mov	eax, [FAT_CurrentCluster]
   778                              <1> 	;mov	ecx, [ClusterValue]
   779                              <1> 	;jmp	short loc_update_cluster_check_fat_buffer
   780 0000B44A 8A1E                <1> 	mov	bl, [esi+LD_Name] ; 01/03/2016
   781 0000B44C E927FFFFFF          <1>         jmp     loc_uc_reset_fat_buffer_validation
   782                              <1> 
   783                              <1> update_cluster_inv_data:
   784                              <1> 	;mov	eax, 0Dh
   785 0000B451 B00D                <1> 	mov	al, 0Dh  ; Invalid Data
   786 0000B453 C3                  <1> 	retn 
   787                              <1> 
   788                              <1> return_uc_fat_stc:
   789                              <1> 	; 01/03/2016
   790 0000B454 31C0                <1> 	xor	eax, eax
   791 0000B456 F9                  <1> 	stc
   792 0000B457 EBCA                <1> 	jmp	short loc_fat_buffer_stc_1
   793                              <1> 
   794                              <1> update_fat12_cluster:
   795                              <1> pass_uc_fat12_errc:
   796                              <1> 	;sub	edx, edx
   797 0000B459 BB00040000          <1> 	mov	ebx, 400h ;1024
   798 0000B45E F7F3                <1> 	div	ebx
   799                              <1> 	; EAX = Count of 3 FAT sectors
   800                              <1> 	; DX = Cluster offset in FAT buffer
   801 0000B460 66B90300            <1> 	mov	cx, 3
   802 0000B464 6689C3              <1> 	mov	bx, ax
   803 0000B467 6689C8              <1> 	mov	ax, cx ; 3
   804 0000B46A 66F7E2              <1> 	mul	dx     ; Multiply by 3
   805 0000B46D 66D1E8              <1> 	shr	ax, 1  ; Divide by 2
   806 0000B470 6693                <1> 	xchg	bx, ax
   807                              <1> 	; EAX = Count of 3 FAT sectors
   808                              <1> 	; EBX = Byte Offset in FAT buffer   
   809 0000B472 66F7E1              <1> 	mul	cx  ; 3 * AX
   810                              <1> 	; EAX = FAT Beginning Sector
   811                              <1> 	; EDX = 0
   812 0000B475 8A0D[BE390100]      <1> 	mov	cl, [FAT_BuffValidData]
   813                              <1> 	; TRDOS v1 has a FATal bug here ! 
   814                              <1> 	; (it does not have 'cmp cl, 2' instruction here !
   815                              <1> 	;  while 'jne' is existing !)
   816 0000B47B 80F902              <1> 	cmp	cl, 2 ; 2 = dirty buffer (must be written to disk)
   817 0000B47E 750A                <1> 	jne	short loc_uc_check_fat12_buff_sector_load
   818                              <1> 
   819                              <1> loc_uc_check_fat12_buff_sector_save:
   820 0000B480 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
   821 0000B486 75B2                <1>         jne     short loc_uc_save_fat_buffer
   822 0000B488 EB15                <1> 	jmp	short loc_update_fat12_cell
   823                              <1> 
   824                              <1> loc_uc_check_fat12_buff_sector_load:
   825 0000B48A 80F901              <1> 	cmp	cl, 1 ; byte ptr [FAT_BuffValidData]
   826 0000B48D 0F8550010000        <1>         jne     loc_uc_load_fat_sectors
   827 0000B493 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
   828 0000B499 0F8544010000        <1>         jne     loc_uc_load_fat_sectors
   829                              <1> 
   830                              <1> loc_update_fat12_cell:
   831 0000B49F 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
   832 0000B4A5 668B0D[BA390100]    <1> 	mov	cx, [FAT_CurrentCluster]
   833 0000B4AC 66D1E9              <1> 	shr	cx, 1
   834 0000B4AF 668B03              <1> 	mov	ax, [ebx]
   835 0000B4B2 6689C2              <1> 	mov	dx, ax
   836 0000B4B5 7344                <1> 	jnc	short uc_fat12_nc_even
   837                              <1> 
   838 0000B4B7 6683E00F            <1> 	and	ax, 0Fh
   839 0000B4BB 8B0D[5C3C0100]      <1> 	mov	ecx, [ClusterValue] ; 32 bits
   840 0000B4C1 66C1E104            <1> 	shl	cx, 4
   841 0000B4C5 6609C1              <1> 	or	cx, ax
   842 0000B4C8 6689D0              <1> 	mov	ax, dx
   843 0000B4CB 66890B              <1> 	mov	[ebx], cx  ; 16 bits !
   844 0000B4CE 66C1E804            <1> 	shr	ax, 4 ; al(bit4..7)+ah(bit0..7)
   845                              <1> 
   846                              <1> update_fat12_buffer:
   847 0000B4D2 A3[BA390100]        <1> 	mov	[FAT_CurrentCluster], eax
   848 0000B4D7 89C2                <1> 	mov	edx, eax ; 01/03/2016
   849 0000B4D9 C605[BE390100]02    <1> 	mov	byte [FAT_BuffValidData], 2
   850 0000B4E0 6683F802            <1> 	cmp	ax, 2
   851 0000B4E4 0F826AFFFFFF        <1>         jb      return_uc_fat_stc
   852 0000B4EA 3B05[CA390100]      <1> 	cmp	eax, [LastCluster]
   853 0000B4F0 0F875EFFFFFF        <1>         ja      return_uc_fat_stc
   854 0000B4F6 E927FFFFFF          <1>         jmp     loc_fat_buffer_updated
   855                              <1> 
   856                              <1> uc_fat12_nc_even:
   857 0000B4FB 662500F0            <1> 	and	ax, 0F000h
   858 0000B4FF 8B0D[5C3C0100]      <1> 	mov	ecx, [ClusterValue] ; 32 bits
   859 0000B505 80E50F              <1> 	and	ch, 0Fh
   860 0000B508 6609C1              <1> 	or	cx, ax
   861 0000B50B 6689D0              <1> 	mov	ax, dx
   862 0000B50E 66890B              <1> 	mov	[ebx], cx ; 16 bits !
   863 0000B511 80E40F              <1> 	and	ah, 0Fh ; al(bit0..7)+ah(bit0..3)
   864 0000B514 EBBC                <1> 	jmp	short update_fat12_buffer
   865                              <1> 
   866                              <1> update_fat32_cluster:
   867 0000B516 8B4E78              <1> 	mov	ecx, [esi+LD_Clusters]
   868 0000B519 41                  <1> 	inc	ecx
   869 0000B51A 890D[CA390100]      <1> 	mov	[LastCluster], ecx
   870                              <1> 
   871 0000B520 39C8                <1> 	cmp	eax, ecx
   872 0000B522 0F872CFFFFFF        <1>         ja      return_uc_fat_stc
   873                              <1> 
   874                              <1> pass_uc_fat32_errc:
   875                              <1> 	;sub	edx, edx
   876 0000B528 BB80010000          <1> 	mov	ebx, 180h ;384
   877 0000B52D F7F3                <1> 	div	ebx
   878                              <1> 	; EAX = Count of 3 FAT sectors
   879                              <1> 	; DX = Cluster offset in FAT buffer
   880 0000B52F 89D3                <1> 	mov	ebx, edx
   881 0000B531 C1E302              <1> 	shl	ebx, 2 ; Multiply by 4
   882 0000B534 BA03000000          <1> 	mov	edx, 3	
   883 0000B539 F7E2                <1> 	mul	edx
   884                              <1> 	; EBX = Cluster Offset in FAT buffer
   885                              <1> 	; EAX = FAT Sector
   886                              <1> 	; EDX = 0
   887 0000B53B 8A0D[BE390100]      <1> 	mov	cl, [FAT_BuffValidData]
   888 0000B541 80F902              <1> 	cmp	cl, 2
   889 0000B544 750E                <1> 	jne	short loc_uc_check_fat32_buff_sector_load
   890                              <1> 
   891                              <1> loc_uc_check_fat32_buff_sector_save:
   892 0000B546 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
   893 0000B54C 0F85E8FEFFFF        <1>         jne     loc_uc_save_fat_buffer
   894 0000B552 EB11                <1> 	jmp	short loc_update_fat32_cell
   895                              <1> 
   896                              <1> loc_uc_check_fat32_buff_sector_load:
   897 0000B554 80F901              <1> 	cmp	cl, 1 ; byte [FAT_BuffValidData]
   898 0000B557 0F8586000000        <1>         jne     loc_uc_load_fat_sectors
   899 0000B55D 3B05[C2390100]      <1> 	cmp	eax, [FAT_BuffSector]
   900 0000B563 757E                <1>         jne     loc_uc_load_fat_sectors
   901                              <1> 
   902                              <1> loc_update_fat32_cell:
   903                              <1> loc_update_fat32_buffer:
   904 0000B565 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
   905 0000B56B 8B03                <1> 	mov	eax, [ebx]
   906 0000B56D 25FFFFFF0F          <1> 	and	eax, 0FFFFFFFh ; 28 bit cluster value
   907                              <1> 	
   908 0000B572 8B15[BA390100]      <1> 	mov	edx, [FAT_CurrentCluster] ; 01/03/2016
   909                              <1> 
   910 0000B578 A3[BA390100]        <1> 	mov 	[FAT_CurrentCluster], eax
   911 0000B57D 8B0D[5C3C0100]      <1> 	mov	ecx, [ClusterValue]
   912 0000B583 890B                <1> 	mov	[ebx], ecx ; 29/02/2016 
   913                              <1> 
   914 0000B585 C605[BE390100]02    <1> 	mov	byte [FAT_BuffValidData], 2
   915                              <1> 
   916                              <1> 	; 01/03/2016
   917 0000B58C 21C0                <1> 	and	eax, eax ; was it free cluster ?
   918 0000B58E 7514                <1> 	jnz	short loc_upd_fat32_c0
   919                              <1> 
   920                              <1> 	;or	ecx, ecx ; it will be left free ?!
   921                              <1> 	;jz	short loc_upd_fat32_c3
   922                              <1> 
   923 0000B590 3B563E              <1> 	cmp	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free cluster
   924 0000B593 7520                <1> 	jne	short loc_upd_fat32_c3
   925                              <1> 
   926 0000B595 3B15[CA390100]      <1> 	cmp	edx, [LastCluster]
   927 0000B59B 7207                <1> 	jb	short loc_upd_fat32_c0
   928                              <1> 
   929 0000B59D BA02000000          <1> 	mov	edx, 2 ; rewind !
   930 0000B5A2 EB0E                <1> 	jmp	short loc_upd_fat32_c2
   931                              <1> 
   932                              <1> loc_upd_fat32_c0:
   933 0000B5A4 FF463E              <1> 	inc	dword [esi+LD_BPB+BPB_Reserved+4] ; set it to next cluster		
   934 0000B5A7 EB0C                <1> 	jmp	short loc_upd_fat32_c3
   935                              <1> 
   936                              <1> loc_upd_fat32_c1:
   937 0000B5A9 09C9                <1> 	or	ecx, ecx ; will it be free cluster ?
   938 0000B5AB 7508                <1> 	jnz	short loc_upd_fat32_c3
   939                              <1> 
   940 0000B5AD 3B563E              <1> 	cmp	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free cluster
   941 0000B5B0 7303                <1> 	jnb	short loc_upd_fat32_c3
   942                              <1> 
   943                              <1> loc_upd_fat32_c2:	
   944 0000B5B2 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx			
   945                              <1> 
   946                              <1> loc_upd_fat32_c3:
   947 0000B5B5 89C2                <1> 	mov	edx, eax
   948                              <1> 
   949                              <1> loc_upd_fat32_c4:
   950 0000B5B7 83F802              <1> 	cmp	eax, 2
   951 0000B5BA 0F8294FEFFFF        <1>         jb      return_uc_fat_stc
   952                              <1> 
   953                              <1> pass_uc_fat32_c_zero_check_2:
   954 0000B5C0 3B05[CA390100]      <1> 	cmp	eax, [LastCluster]
   955 0000B5C6 0F8788FEFFFF        <1>         ja      return_uc_fat_stc
   956                              <1> 	
   957 0000B5CC E951FEFFFF          <1> 	jmp     loc_fat_buffer_updated
   958                              <1> 
   959                              <1> loc_fat_sectors_rw_error1:
   960                              <1> 	;mov	byte [FAT_BuffValidData], 0
   961                              <1> 	; 23/10/2016 (15h -> 17)
   962                              <1> 	; 23/03/2016
   963 0000B5D1 B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error
   964 0000B5D6 8825[BE390100]      <1> 	mov	[FAT_BuffValidData], ah ; 0
   965                              <1> 
   966                              <1> loc_fat_sectors_rw_error2:
   967                              <1> 	;mov	eax, error code
   968                              <1> 	;mov	edx, 0
   969 0000B5DC 8B0D[5C3C0100]      <1> 	mov	ecx, [ClusterValue]
   970 0000B5E2 C3                  <1> 	retn
   971                              <1> 
   972                              <1> loc_uc_load_fat_sectors:
   973 0000B5E3 A3[C2390100]        <1> 	mov	[FAT_BuffSector], eax
   974                              <1> 
   975                              <1> load_uc_fat_sectors_zero:
   976 0000B5E8 034660              <1> 	add	eax, [esi+LD_FATBegin]
   977 0000B5EB BB001C0900          <1> 	mov	ebx, FAT_Buffer
   978 0000B5F0 B903000000          <1> 	mov	ecx, 3
   979 0000B5F5 E877300000          <1> 	call	disk_read
   980 0000B5FA 72D5                <1> 	jc	short loc_fat_sectors_rw_error1
   981                              <1> 
   982 0000B5FC C605[BE390100]01    <1>         mov     byte [FAT_BuffValidData], 1
   983 0000B603 A1[BA390100]        <1> 	mov 	eax, [FAT_CurrentCluster]
   984 0000B608 8B0D[5C3C0100]      <1> 	mov	ecx, [ClusterValue]
   985 0000B60E E972FDFFFF          <1>         jmp     loc_update_cluster_check_fat_type
   986                              <1> 
   987                              <1> save_fat_buffer:
   988                              <1> 	; 15/10/2016
   989                              <1> 	; 01/03/2016
   990                              <1> 	; 22/02/2016 (TRDOS 386 =  TRDOS v2.0)
   991                              <1> 	; 11/08/2011
   992                              <1> 	; 09/02/2005 
   993                              <1> 	; INPUT ->
   994                              <1> 	;	None
   995                              <1> 	; OUTPUT ->
   996                              <1> 	;	cf = 0 -> OK.
   997                              <1> 	;	cf = 1 -> error code in AL (EAX)
   998                              <1> 	;
   999                              <1> 	;	EBX = FAT_Buffer address
  1000                              <1> 	;
  1001                              <1> 	; (EAX, EDX, ECX will be modified)
  1002                              <1> 
  1003                              <1> 	;cmp	byte [FAT_BuffValidData], 2 
  1004                              <1> 	;je	short loc_save_fat_buff
  1005                              <1> 
  1006                              <1> ;loc_save_fat_buffer_retn:
  1007                              <1> ;	xor	eax, eax
  1008                              <1> ;	retn
  1009                              <1> 
  1010                              <1> loc_save_fat_buff:
  1011 0000B613 31D2                <1> 	xor	edx, edx
  1012 0000B615 8A35[BF390100]      <1> 	mov	dh, [FAT_BuffDrvName]
  1013 0000B61B 80FE41              <1> 	cmp	dh, 'A'
  1014 0000B61E 722E                <1> 	jb	short loc_save_fat_buffer_inv_data_retn
  1015 0000B620 80EE41              <1> 	sub	dh, 'A'
  1016 0000B623 56                  <1> 	push	esi ; *
  1017 0000B624 BE00010900          <1>         mov     esi, Logical_DOSDisks
  1018 0000B629 01D6                <1> 	add	esi, edx
  1019                              <1> 	
  1020 0000B62B 8A5603              <1> 	mov	dl, [esi+LD_FATType]
  1021 0000B62E 20D2                <1> 	and	dl, dl
  1022 0000B630 741B                <1> 	jz	short loc_save_fat_buffer_inv_data_pop_retn 
  1023                              <1> 
  1024 0000B632 A1[C2390100]        <1> 	mov	eax, [FAT_BuffSector]
  1025 0000B637 80FA02              <1> 	cmp	dl, 2
  1026 0000B63A 770A                <1> 	ja	short loc_save_fat32_buff
  1027                              <1> 
  1028                              <1> loc_save_fat_12_16_buff:
  1029                              <1> 	; 01/03/2016
  1030                              <1> 	; TRDOS v1 has a FATal bug here!
  1031                              <1> 	; Correct code: mov dx, word ptr [FAT_BuffSector]+2
  1032                              <1> 	; (DX:AX in TRDOS v1 -> EAX in TRDOS v2)
  1033                              <1> 	;
  1034 0000B63C 0FB74E1C            <1> 	movzx	ecx, word [esi+LD_BPB+FATSecs] 
  1035 0000B640 29C1                <1> 	sub	ecx, eax
  1036                              <1> 	; TRDOS v1 has a bug here... ('pop esi' was forgotten!)
  1037                              <1> 	;jna	short loc_save_fat_buffer_inv_data_retn ; wrong addr!
  1038 0000B642 7609                <1> 	jna	short loc_save_fat_buffer_inv_data_pop_retn ; correct addr.
  1039 0000B644 EB15                <1> 	jmp	short loc_save_fat_buffer_check_rs3
  1040                              <1> 
  1041                              <1> loc_save_fat32_buff:
  1042 0000B646 8B4E2A              <1> 	mov	ecx, [esi+LD_BPB+FAT32_FAT_Size]
  1043 0000B649 29C1                <1> 	sub	ecx, eax
  1044 0000B64B 770E                <1> 	ja	short loc_save_fat_buffer_check_rs3
  1045                              <1> 
  1046                              <1> loc_save_fat_buffer_inv_data_pop_retn:
  1047 0000B64D 5E                  <1> 	pop	esi ; *
  1048                              <1> loc_save_fat_buffer_inv_data_retn:
  1049 0000B64E B80D000000          <1> 	mov	eax, 0Dh ; Invalid DATA
  1050 0000B653 C3                  <1> 	retn
  1051                              <1> 
  1052                              <1> loc_save_fat_buff_remain_sectors_3:
  1053 0000B654 B903000000          <1> 	mov	ecx, 3
  1054 0000B659 EB05                <1> 	jmp	short loc_save_fat_buff_continue
  1055                              <1> 
  1056                              <1> loc_save_fat_buffer_check_rs3:
  1057 0000B65B 83F903              <1> 	cmp	ecx, 3
  1058 0000B65E 77F4                <1> 	ja	short loc_save_fat_buff_remain_sectors_3
  1059                              <1> 
  1060                              <1> loc_save_fat_buff_continue:
  1061 0000B660 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1062 0000B665 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1063 0000B668 51                  <1> 	push	ecx
  1064 0000B669 E8F42F0000          <1> 	call	disk_write
  1065 0000B66E 59                  <1> 	pop	ecx
  1066 0000B66F 722B                <1> 	jc	short loc_save_FAT_buff_write_err
  1067                              <1> 	
  1068 0000B671 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1069 0000B675 7605                <1> 	jna	short loc_calc_2nd_fat12_16_addr
  1070                              <1> 
  1071                              <1> loc_calc_2nd_fat32_addr:
  1072 0000B677 8B462A              <1> 	mov	eax, [esi+LD_BPB+FAT32_FAT_Size]
  1073 0000B67A EB04                <1> 	jmp	short loc_calc_2nd_fat_addr
  1074                              <1> 
  1075                              <1> loc_calc_2nd_fat12_16_addr:
  1076 0000B67C 0FB7461C            <1> 	movzx	eax, word [esi+LD_BPB+FATSecs]
  1077                              <1> 
  1078                              <1> loc_calc_2nd_fat_addr:
  1079 0000B680 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1080 0000B683 0305[C2390100]      <1> 	add	eax, [FAT_BuffSector]
  1081 0000B689 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1082                              <1> 	; ecx = 1 to 3
  1083 0000B68E E8CF2F0000          <1> 	call	disk_write
  1084 0000B693 7207                <1> 	jc	short loc_save_FAT_buff_write_err
  1085                              <1>  	; Valid  buffer (1 = valid but do not save)
  1086 0000B695 C605[BE390100]01    <1> 	mov	byte [FAT_BuffValidData], 1
  1087                              <1> 
  1088                              <1> loc_save_FAT_buff_write_err:
  1089 0000B69C 5E                  <1> 	pop	esi ; *
  1090 0000B69D BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1091                              <1> 	; 15/10/2016 (1Dh -> 18)
  1092                              <1> 	; 23/03/2016 (1Dh)
  1093 0000B6A2 B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error
  1094 0000B6A7 C3                  <1> 	retn
  1095                              <1> 
  1096                              <1> calculate_fat_freespace:
  1097                              <1> 	; 23/03/2016
  1098                              <1> 	; 02/03/2016
  1099                              <1> 	; 01/03/2016
  1100                              <1> 	; 29/02/2016
  1101                              <1> 	; 22/02/2016 (TRDOS 386 =  TRDOS v2.0)
  1102                              <1> 	; 30/04/2011
  1103                              <1> 	; 03/04/2010
  1104                              <1> 	; 2005
  1105                              <1> 	; INPUT ->
  1106                              <1> 	;	EAX = Cluster count to be added or subtracted
  1107                              <1> 	; 	If BH = FFh, ESI = TR-DOS Logical Drive Description Table
  1108                              <1> 	; 	If BH < FFh, BH = TR-DOS Logical Drive Number
  1109                              <1> 	; 	BL: 
  1110                              <1> 	;	0 = Calculate, 1 = Add, 2 = Subtract, 3 = Get (Not Set/Calc)
  1111                              <1> 	; OUTPUT ->
  1112                              <1> 	;	EAX = Free Space in sectors
  1113                              <1> 	;	ESI = Logical Dos Drive Description Table address
  1114                              <1> 	;	BH = Logical Dos Drive Number (same with input value of BH)
  1115                              <1> 	;	BL = Type of operation (same with input value of BL)
  1116                              <1> 	;	ECX = 0 -> valid
  1117                              <1> 	;	ECX > 0 -> error or invalid
  1118                              <1> 	;	If EAX = FFFFFFFFh, it is 're-calculation needed'
  1119                              <1> 	;			          sign due to r/w error   
  1120                              <1> 
  1121 0000B6A8 66891D[623C0100]    <1> 	mov	[CFS_OPType], bx
  1122 0000B6AF A3[643C0100]        <1> 	mov	[CFS_CC], eax
  1123                              <1> 	
  1124 0000B6B4 80FFFF              <1> 	cmp	bh, 0FFh
  1125 0000B6B7 740B                <1> 	je	short pass_calculate_freespace_get_drive_dt_offset
  1126                              <1> 
  1127                              <1> loc_calculate_freespace_get_drive_dt_offset:     
  1128 0000B6B9 31C0                <1> 	xor	eax, eax
  1129 0000B6BB 88FC                <1>         mov     ah, bh
  1130 0000B6BD BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1131 0000B6C2 01C6                <1>         add     esi, eax
  1132                              <1> 
  1133                              <1> pass_calculate_freespace_get_drive_dt_offset:
  1134 0000B6C4 08DB                <1> 	or	bl, bl
  1135 0000B6C6 7435                <1> 	jz	short loc_reset_fcc
  1136                              <1> 	
  1137                              <1> loc_get_free_sectors:
  1138 0000B6C8 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors]
  1139                              <1> 
  1140                              <1> 	;xor	ecx, ecx
  1141                              <1> 	;dec	ecx ; 0FFFFFFFFh
  1142                              <1> 	;cmp	eax, ecx ; 29/02/2016
  1143                              <1> 	;je	short loc_get_free_sectors_retn ; recalculation is needed!
  1144                              <1> 	
  1145                              <1> 	; 23/03/2016
  1146 0000B6CB 8B4E70              <1> 	mov	ecx, [esi+LD_TotalSectors]
  1147 0000B6CE 39C1                <1> 	cmp	ecx, eax ; Total sectors must be greater than Free sectors !
  1148 0000B6D0 7707                <1> 	ja	short loc_get_free_sectors_check_optype
  1149                              <1> 	
  1150 0000B6D2 31C0                <1> 	xor	eax, eax
  1151 0000B6D4 48                  <1> 	dec	eax ; 0FFFFFFFFh  ; recalculation is needed!
  1152 0000B6D5 894674              <1> 	mov	[esi+LD_FreeSectors], eax ; reset (for recalculation)
  1153                              <1> 		
  1154                              <1> loc_get_free_sectors_retn:
  1155 0000B6D8 C3                  <1> 	retn
  1156                              <1> 	
  1157                              <1> loc_get_free_sectors_check_optype:
  1158 0000B6D9 80FB03              <1> 	cmp	bl, 3
  1159 0000B6DC 7203                <1> 	jb	short loc_set_fcc
  1160                              <1> 
  1161 0000B6DE 29C9                <1> 	sub	ecx, ecx ; 0
  1162                              <1> 
  1163 0000B6E0 C3                  <1> 	retn	
  1164                              <1> 
  1165                              <1> loc_set_fcc:
  1166 0000B6E1 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1167 0000B6E5 0F87DF000000        <1>         ja      loc_update_FAT32_fs_info_fcc
  1168                              <1> 
  1169                              <1> 	;mov	eax, [esi+LD_FreeSectors]
  1170 0000B6EB 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  1171 0000B6EF 29D2                <1> 	sub	edx, edx
  1172 0000B6F1 F7F1                <1> 	div	ecx
  1173                              <1> 	;or	dx, dx 
  1174                              <1> 	;	; DX -> Remain sectors < SecPerClust
  1175                              <1> 	;	; DX > 0 -> invalid free sector count
  1176                              <1> 	;jnz	short loc_reset_fcc 
  1177                              <1> 
  1178                              <1> ;pass_set_fcc_div32:
  1179 0000B6F3 A3[DB390100]        <1> 	mov	[FreeClusterCount], eax
  1180 0000B6F8 E988000000          <1>         jmp     loc_set_free_sectors_FAT12_FAT16
  1181                              <1> 
  1182                              <1> loc_reset_fcc:
  1183 0000B6FD 31C0                <1> 	xor	eax, eax
  1184 0000B6FF A3[DB390100]        <1> 	mov	[FreeClusterCount], eax ; 0
  1185 0000B704 8B5678              <1> 	mov	edx, [esi+LD_Clusters]
  1186 0000B707 42                  <1> 	inc	edx
  1187 0000B708 8915[CA390100]      <1> 	mov	[LastCluster], edx
  1188                              <1> 
  1189 0000B70E 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1190 0000B712 7647                <1> 	jna	short loc_count_free_fat_clusters_0  
  1191                              <1> 
  1192 0000B714 48                  <1> 	dec	eax ; FFFFFFFFh
  1193 0000B715 A3[6C3C0100]        <1> 	mov	[CFS_FAT32FC], eax
  1194                              <1> 
  1195                              <1> 	; 29/02/2016
  1196 0000B71A 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; reset
  1197 0000B71D 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; reset
  1198                              <1> 	
  1199 0000B720 B802000000          <1> 	mov 	eax, 2
  1200                              <1> 
  1201                              <1> loc_count_fc_next_cluster_0:
  1202 0000B725 50                  <1> 	push	eax
  1203 0000B726 E801F9FFFF          <1> 	call	get_next_cluster
  1204 0000B72B 7310                <1> 	jnc	short loc_check_fat32_ff_cluster
  1205 0000B72D 09C0                <1> 	or	eax, eax
  1206 0000B72F 741E                <1> 	jz	short pass_inc_cfs_fcc_0
  1207                              <1> 
  1208                              <1> loc_put_fcc_unknown_sign:
  1209 0000B731 58                  <1> 	pop	eax
  1210                              <1> 	; "Free count is Unknown" sign
  1211                              <1> 	;mov	dword [FreeClusterCount], 0FFFFFFFFh
  1212                              <1> 
  1213                              <1> 	; 29/02/2016
  1214                              <1> 	; Save Free Cluster Count value in FAT32 'BPB_Reserved' area
  1215                              <1> 	;mov	[esi+LD_BPB+BPB_Reserved], 0FFFFFFFFh ; unknown!
  1216 0000B732 8B15[6C3C0100]      <1> 	mov	edx, [CFS_FAT32FC] ; First Free Cluster
  1217                              <1> 	; Save First Free Cluster value in FAT32 'BPB_Reserved+4' area
  1218 0000B738 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx
  1219                              <1> 	
  1220 0000B73B EB7D                <1>         jmp     loc_put_fcc_invalid_sign
  1221                              <1> 
  1222                              <1> loc_check_fat32_ff_cluster:
  1223 0000B73D 09C0                <1> 	or	eax, eax
  1224 0000B73F 750E                <1> 	jnz	short pass_inc_cfs_fcc_0
  1225 0000B741 58                  <1> 	pop	eax
  1226 0000B742 A3[6C3C0100]        <1> 	mov	[CFS_FAT32FC], eax
  1227                              <1> 	;mov	dword [FreeClusterCount], 1
  1228 0000B747 FF05[DB390100]      <1> 	inc	dword [FreeClusterCount]
  1229 0000B74D EB27                <1> 	jmp	short pass_inc_cfs_fcc_1
  1230                              <1> 
  1231                              <1> pass_inc_cfs_fcc_0:
  1232 0000B74F 58                  <1> 	pop	eax
  1233                              <1> 
  1234                              <1> pass_inc_cfs_fcc_0c:
  1235 0000B750 40                  <1> 	inc	eax ; add eax, 1
  1236 0000B751 3B05[CA390100]      <1> 	cmp	eax, [LastCluster]
  1237 0000B757 76CC                <1> 	jna 	short loc_count_fc_next_cluster_0
  1238 0000B759 EB6F                <1> 	jmp	short loc_update_FAT32_fs_info_fcc
  1239                              <1> 
  1240                              <1> loc_count_free_fat_clusters_0:
  1241                              <1> 	;mov	eax, 2
  1242 0000B75B B002                <1> 	mov	al, 2
  1243                              <1> 
  1244                              <1> loc_count_fc_next_cluster:
  1245 0000B75D 50                  <1> 	push	eax
  1246 0000B75E E8C9F8FFFF          <1> 	call	get_next_cluster
  1247 0000B763 720C                <1> 	jc	short loc_count_fcc_stc
  1248                              <1> 
  1249                              <1> loc_count_free_clusters_1:
  1250 0000B765 21C0                <1> 	and	eax, eax
  1251 0000B767 750C                <1> 	jnz	short pass_inc_cfs_fcc
  1252                              <1> 
  1253 0000B769 FF05[DB390100]      <1> 	inc	dword [FreeClusterCount]
  1254 0000B76F EB04                <1> 	jmp	short pass_inc_cfs_fcc
  1255                              <1> 
  1256                              <1> loc_count_fcc_stc:
  1257 0000B771 09C0                <1> 	or	eax, eax
  1258 0000B773 75BC                <1> 	jnz	short loc_put_fcc_unknown_sign ; 29/02/2016
  1259                              <1> 
  1260                              <1> pass_inc_cfs_fcc:
  1261 0000B775 58                  <1> 	pop	eax
  1262                              <1> 
  1263                              <1> pass_inc_cfs_fcc_1:
  1264 0000B776 40                  <1> 	inc	eax ; add eax, 1
  1265 0000B777 3B05[CA390100]      <1> 	cmp	eax, [LastCluster]
  1266 0000B77D 76DE                <1> 	jna	short loc_count_fc_next_cluster
  1267                              <1> 
  1268                              <1> loc_set_free_sectors:
  1269 0000B77F 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1270 0000B783 7745                <1> 	ja	short loc_update_FAT32_fs_info_fcc
  1271                              <1> 
  1272                              <1> loc_set_free_sectors_FAT12_FAT16:
  1273 0000B785 803D[623C0100]00    <1> 	cmp	byte [CFS_OPType], 0
  1274 0000B78C 761C                <1> 	jna	short pass_FAT_add_sub_fcc
  1275 0000B78E A1[643C0100]        <1> 	mov	eax, [CFS_CC]
  1276 0000B793 803D[623C0100]01    <1> 	cmp	byte [CFS_OPType], 1
  1277 0000B79A 7708                <1> 	ja	short pass_FAT_add_fcc
  1278 0000B79C 0105[DB390100]      <1> 	add 	[FreeClusterCount], eax
  1279 0000B7A2 EB06                <1> 	jmp	short pass_FAT_add_sub_fcc
  1280                              <1> 
  1281                              <1> pass_FAT_add_fcc:
  1282 0000B7A4 2905[DB390100]      <1> 	sub	[FreeClusterCount], eax
  1283                              <1> 
  1284                              <1> pass_FAT_add_sub_fcc:
  1285 0000B7AA 0FB64613            <1> 	movzx	eax, byte [esi+LD_BPB+SecPerClust]
  1286 0000B7AE 8B15[DB390100]      <1> 	mov	edx, [FreeClusterCount]
  1287 0000B7B4 F7E2                <1> 	mul	edx
  1288                              <1> 
  1289 0000B7B6 31C9                <1> 	xor	ecx, ecx 
  1290 0000B7B8 EB05                <1> 	jmp	short loc_cfs_retn_params
  1291                              <1> 
  1292                              <1> loc_put_fcc_invalid_sign:
  1293 0000B7BA 29C0                <1>        	sub	eax, eax ; 0
  1294 0000B7BC 48                  <1> 	dec	eax ; FFFFFFFFh
  1295                              <1> loc_fat32_ffc_recalc_needed:
  1296 0000B7BD 89C1                <1> 	mov	ecx, eax
  1297                              <1> 
  1298                              <1> loc_cfs_retn_params:
  1299 0000B7BF 894674              <1> 	mov 	[esi+LD_FreeSectors], eax
  1300 0000B7C2 0FB71D[623C0100]    <1> 	movzx	ebx, word [CFS_OPType]
  1301 0000B7C9 C3                  <1> 	retn
  1302                              <1> 
  1303                              <1> loc_update_FAT32_fs_info_fcc:
  1304                              <1> loc_check_fcc_FSINFO_op:
  1305                              <1> 	; 29/02/2016
  1306                              <1> 	; EAX = Free cluster count (before this update) ; value from disk
  1307                              <1> 	; EDX = First Free Cluster (before this update) ; value from disk
  1308 0000B7CA 803D[623C0100]01    <1> 	cmp	byte [CFS_OPType], 1
  1309 0000B7D1 7221                <1> 	jb	short loc_cfs_FAT32_get_rcalc_parms ; 0 = recalculated
  1310 0000B7D3 7406                <1> 	je	short loc_check_fcc_FSINFO_op1 ; 1 = add
  1311                              <1> loc_check_fcc_FSINFO_op2: ; subtract
  1312 0000B7D5 F71D[643C0100]      <1> 	neg	dword [CFS_CC] ; prepare to subtract ; 2 = sub (add negative)
  1313                              <1> loc_check_fcc_FSINFO_op1:
  1314                              <1> 	; 01/03/2016
  1315 0000B7DB 31D2                <1> 	xor	edx, edx ; 0
  1316 0000B7DD 4A                  <1> 	dec	edx ; 0FFFFFFFFh
  1317 0000B7DE 8B463A              <1> 	mov	eax, [esi+LD_BPB+BPB_Reserved]
  1318 0000B7E1 39D0                <1> 	cmp	eax, edx
  1319 0000B7E3 73D5                <1> 	jnb	short loc_put_fcc_invalid_sign
  1320 0000B7E5 0305[643C0100]      <1>         add     eax, [CFS_CC] ; free cluster count on disk + current count
  1321 0000B7EB 72CD                <1> 	jc	short loc_put_fcc_invalid_sign
  1322                              <1> 	
  1323 0000B7ED A3[DB390100]        <1> 	mov	[FreeClusterCount], eax
  1324 0000B7F2 EB0E                <1> 	jmp	short loc_cfs_write_FSINFO_sector
  1325                              <1> 
  1326                              <1> loc_cfs_FAT32_get_rcalc_parms:
  1327 0000B7F4 8B15[6C3C0100]      <1> 	mov	edx, [CFS_FAT32FC]
  1328 0000B7FA A1[DB390100]        <1> 	mov	eax, [FreeClusterCount]
  1329 0000B7FF 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx ; First Free Cluster
  1330                              <1> loc_cfs_write_FSINFO_sector:
  1331 0000B802 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count
  1332                              <1> 	; 01/03/2016
  1333 0000B805 E8AA000000          <1> 	call	set_fat32_fsinfo_sector_parms
  1334 0000B80A 72AE                <1>         jc      short loc_put_fcc_invalid_sign
  1335                              <1> 
  1336                              <1> loc_set_FAT32_free_sectors:
  1337                              <1> 	; 29/02/2016
  1338                              <1> 	;mov	eax, [FreeClusterCount]
  1339                              <1> 	;mov	ecx, eax
  1340                              <1> 	;cmp	eax, 0FFFFFFFFh ; Invalid !
  1341                              <1> 	;je	short loc_cfs_retn_params
  1342                              <1> 	;
  1343 0000B80C 8B0D[DB390100]      <1> 	mov	ecx, [FreeClusterCount]
  1344 0000B812 0FB64613            <1> 	movzx	eax, byte [esi+LD_BPB+SecPerClust]
  1345 0000B816 F7E1                <1> 	mul	ecx
  1346                              <1> 	; 29/02/2016
  1347 0000B818 31C9                <1> 	xor	ecx, ecx ; 0
  1348 0000B81A 09D2                <1> 	or	edx, edx ; 0 ?
  1349 0000B81C 759C                <1>         jnz     loc_put_fcc_invalid_sign
  1350 0000B81E 394670              <1> 	cmp	[esi+LD_TotalSectors], eax ; Volume size in sectors
  1351 0000B821 7697                <1>         jna     short loc_put_fcc_invalid_sign
  1352                              <1> 	;
  1353                              <1> loc_set_FAT32_free_sectors_ok:
  1354 0000B823 31D2                <1> 	xor	edx, edx ; 0
  1355 0000B825 EB98                <1>         jmp     short loc_cfs_retn_params 
  1356                              <1> 	;
  1357                              <1> 
  1358                              <1> get_last_cluster:
  1359                              <1> 	; 22/10/2016
  1360                              <1> 	; 27/02/2016 (TRDOS 386 =  TRDOS v2.0)
  1361                              <1> 	; 12/06/2010 (DRV_FAT.ASM, 'proc_get_last_custer')
  1362                              <1> 	; 06/06/2010
  1363                              <1> 	; INPUT ->
  1364                              <1> 	;	EAX = First Cluster Number
  1365                              <1> 	; 	ESI = Logical Dos Drive Parameters Table
  1366                              <1> 	; OUTPUT ->
  1367                              <1> 	;	cf = 0 -> No Error, EAX is valid
  1368                              <1> 	;	cf = 1 -> EAX > 0 -> Error
  1369                              <1> 	;	EAX = Last Cluster Number
  1370                              <1> 	;       ECX = Previous Cluster -just before the last cluster-
  1371                              <1> 	;       ; 22/10/2016
  1372                              <1> 	;	[glc_index] = cluster index number of the last cluster	
  1373                              <1> 	;
  1374                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
  1375                              <1> 
  1376 0000B827 89C1                <1> 	mov	ecx, eax
  1377                              <1> 
  1378 0000B829 C705[743C0100]FFFF- <1> 	mov	dword [glc_index], 0FFFFFFFFh ; 22/10/2016	
  1378 0000B831 FFFF                <1>
  1379                              <1> 
  1380                              <1> loc_glc_get_next_cluster_1:
  1381 0000B833 890D[703C0100]      <1> 	mov	[glc_prevcluster], ecx
  1382                              <1>  	; 22/10/2016
  1383 0000B839 FF05[743C0100]      <1> 	inc	dword [glc_index]
  1384                              <1> 
  1385                              <1> loc_glc_get_next_cluster_2:
  1386 0000B83F E8E8F7FFFF          <1> 	call	get_next_cluster
  1387                              <1> 	; ecx = current/previous cluster 
  1388                              <1> 	; eax = next/last cluster
  1389 0000B844 73ED                <1> 	jnc	short loc_glc_get_next_cluster_1
  1390                              <1> 
  1391 0000B846 09C0                <1> 	or	eax, eax
  1392 0000B848 7509                <1> 	jnz	short loc_glc_stc_retn
  1393                              <1> 
  1394                              <1> 	; ecx = previous cluster
  1395 0000B84A 89C8                <1>         mov	eax, ecx
  1396                              <1> 
  1397                              <1> 	; previous cluster becomes last cluster (ecx -> eax)
  1398                              <1> 	; previous of previous cluster becomes previous cluster (ecx)
  1399                              <1> 
  1400                              <1> loc_glc_prev_cluster_retn:
  1401 0000B84C 8B0D[703C0100]      <1> 	mov	ecx, [glc_prevcluster] 
  1402 0000B852 C3                  <1> 	retn
  1403                              <1> 
  1404                              <1> loc_glc_stc_retn:
  1405 0000B853 F5                  <1> 	cmc	;stc
  1406 0000B854 EBF6                <1>         jmp	short loc_glc_prev_cluster_retn
  1407                              <1> 
  1408                              <1> truncate_cluster_chain:
  1409                              <1> 	; 01/03/2016
  1410                              <1> 	; 28/02/2016 (TRDOS 386 =  TRDOS v2.0)
  1411                              <1> 	; 22/01/2011 (DRV_FAT.ASM, 'proc_truncate_cluster_chain')
  1412                              <1> 	; 11/09/2010
  1413                              <1> 	; INPUT ->
  1414                              <1> 	;	ESI = Logical dos drive description table address
  1415                              <1> 	;	EAX = First cluster to be truncated/unlinked 
  1416                              <1> 	; OUTPUT ->
  1417                              <1> 	;	ESI = Logical dos drive description table address
  1418                              <1> 	; 	ECX = Count of truncated/removed clusters
  1419                              <1> 	; 	CF = 0 -> EAX = Free sectors
  1420                              <1> 	; 	CF = 1 -> Error code in EAX (AL)
  1421                              <1> 
  1422                              <1> 	; NOTE: This procedure does not update lm date&time ! 
  1423                              <1> 
  1424                              <1> loc_truncate_cc:	
  1425 0000B856 31C9                <1> 	xor	ecx, ecx ; mov ecx, 0
  1426                              <1> 	;mov	byte [FAT_BuffValidData], 0
  1427 0000B858 890D[C6390100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  1428                              <1> 
  1429                              <1> loc_tcc_unlink_clusters:
  1430 0000B85E E8F3FAFFFF          <1> 	call	update_cluster
  1431                              <1> 	; EAX = Next Cluster
  1432                              <1> 	; ECX = Cluster Value
  1433                              <1> 	; Note:
  1434                              <1> 	; Returns count of unlinked clusters in
  1435                              <1> 	; dword ptr FAT_ClusterCounter
  1436 0000B863 73F9                <1> 	jnc short loc_tcc_unlink_clusters
  1437                              <1> 
  1438                              <1> pass_tcc_unlink_clusters:
  1439 0000B865 A2[7B3C0100]        <1> 	mov	byte [TCC_FATErr], al
  1440 0000B86A 803D[BE390100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
  1441 0000B871 750E                <1> 	jne	short loc_tcc_calculate_FAT_freespace
  1442 0000B873 E89BFDFFFF          <1> 	call	save_fat_buffer
  1443 0000B878 7307                <1> 	jnc	short loc_tcc_calculate_FAT_freespace
  1444 0000B87A A2[7B3C0100]        <1> 	mov	byte [TCC_FATErr], al ; Error
  1445                              <1> 	;mov	byte [FAT_BuffValidData], 0
  1446                              <1> 
  1447                              <1> 	; 01/03/2016
  1448 0000B87F EB12                <1> 	jmp	short loc_tcc_recalculate_FAT_freespace
  1449                              <1> 
  1450                              <1> loc_tcc_calculate_FAT_freespace:
  1451 0000B881 A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter] ; signed (+-) number
  1452 0000B886 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> ESI = Dos drv desc. table
  1453                              <1> 			   ; BL = 1 -> add cluster
  1454 0000B88A E819FEFFFF          <1> 	call	calculate_fat_freespace
  1455 0000B88F 21C9                <1> 	and	ecx, ecx ; cx = 0 -> valid free sector count
  1456 0000B891 7409                <1> 	jz	short pass_truncate_cc_recalc_FAT_freespace
  1457                              <1> 
  1458                              <1> loc_tcc_recalculate_FAT_freespace:
  1459 0000B893 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate !
  1460 0000B897 E80CFEFFFF          <1> 	call	calculate_fat_freespace
  1461                              <1>               
  1462                              <1> loc_tcc_calculate_FAT_freespace_err:
  1463                              <1> pass_truncate_cc_recalc_FAT_freespace:
  1464 0000B89C 8B0D[C6390100]      <1> 	mov	ecx, [FAT_ClusterCounter]
  1465                              <1> 
  1466 0000B8A2 803D[7B3C0100]00    <1> 	cmp	byte [TCC_FATErr], 0
  1467 0000B8A9 7608                <1> 	jna	short loc_tcc_unlink_clusters_retn
  1468                              <1> 
  1469                              <1> loc_tcc_unlink_clusters_error:
  1470 0000B8AB 0FB605[7B3C0100]    <1> 	movzx	eax, byte [TCC_FATErr]
  1471 0000B8B2 F9                  <1> 	stc
  1472                              <1> loc_tcc_unlink_clusters_retn:
  1473 0000B8B3 C3                  <1> 	retn
  1474                              <1> 
  1475                              <1> set_fat32_fsinfo_sector_parms:
  1476                              <1> 	; 15/10/2016
  1477                              <1> 	; 23/03/2016
  1478                              <1> 	; 29/02/2016 (TRDOS 386 =  TRDOS v2.0)
  1479                              <1> 	; INPUT ->
  1480                              <1> 	;	ESI = Logical dos drive description table address
  1481                              <1> 	;	[esi+LD_BPB+BPB_Reserved] = Free Cluster Count
  1482                              <1> 	;	[esi+LD_BPB+BPB_Reserved+4] = First Free Cluster 
  1483                              <1> 	; OUTPUT ->
  1484                              <1> 	;	ESI = Logical dos drive description table address
  1485                              <1> 	; 	CF = 0 -> OK..
  1486                              <1> 	; 	CF = 1 -> Error code in EAX (AL)
  1487                              <1> 	;
  1488                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
  1489                              <1> 
  1490 0000B8B4 E824000000          <1> 	call	get_fat32_fsinfo_sector_parms
  1491 0000B8B9 7221                <1> 	jc	short update_fat32_fsinfo_sector_retn
  1492                              <1> 
  1493 0000B8BB 8B463A              <1> 	mov	eax, [esi+LD_BPB+BPB_Reserved] ; Free Cluster Count
  1494 0000B8BE 8B563E              <1> 	mov	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free Cluster	
  1495                              <1> 
  1496                              <1>         ;mov	ebx, DOSBootSectorBuff
  1497 0000B8C1 8983E8010000        <1> 	mov	[ebx+488], eax
  1498 0000B8C7 8993EC010000        <1> 	mov	[ebx+492], edx	
  1499                              <1> 
  1500 0000B8CD A1[683C0100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC]
  1501 0000B8D2 B901000000          <1> 	mov	ecx, 1
  1502 0000B8D7 E8862D0000          <1> 	call	disk_write
  1503                              <1> 	;jnc     short update_fat32_fsinfo_sector_retn
  1504                              <1> 
  1505                              <1> 	; 15/10/2016 (1Dh -> 18)
  1506                              <1> 	; 23/03/2016 (1Dh)
  1507                              <1> 	;mov	eax, 18 ; Drive not ready or write error
  1508                              <1> 
  1509                              <1> update_fat32_fsinfo_sector_retn:
  1510 0000B8DC C3                  <1> 	retn
  1511                              <1> 
  1512                              <1> get_fat32_fsinfo_sector_parms:
  1513                              <1> 	; 15/10/2016
  1514                              <1> 	; 23/03/2016
  1515                              <1> 	; 01/03/2016
  1516                              <1> 	; 29/02/2016 (TRDOS 386 =  TRDOS v2.0)
  1517                              <1> 	; INPUT ->
  1518                              <1> 	;	ESI = Logical dos drive description table address
  1519                              <1> 	; OUTPUT ->
  1520                              <1> 	;	ESI = Logical dos drive description table address
  1521                              <1> 	;	EBX = FSINFO sector buffer address (DOSBootSectorBuff)	
  1522                              <1> 	;	CF = 0 -> OK..
  1523                              <1> 	;	   EAX = FsInfo sector address
  1524                              <1> 	;	   ECX = Free cluster count
  1525                              <1> 	;	   EDX = First free cluster 	
  1526                              <1> 	;	CF = 1 -> Error code in AL (EAX)
  1527                              <1> 	;	   EBX = 0
  1528                              <1> 	;	
  1529                              <1> 	;	[CFS_FAT32FSINFOSEC] = FAT32 FSINFO sector address
  1530                              <1>         ;
  1531                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
  1532                              <1> 
  1533 0000B8DD 0FB74636            <1> 	movzx	eax, word [esi+LD_BPB+FAT32_FSInfoSec]
  1534 0000B8E1 03466C              <1> 	add	eax, [esi+LD_StartSector]
  1535 0000B8E4 A3[683C0100]        <1> 	mov	[CFS_FAT32FSINFOSEC], eax
  1536                              <1> 	
  1537 0000B8E9 BB[BA370100]        <1>         mov     ebx, DOSBootSectorBuff
  1538 0000B8EE B901000000          <1> 	mov	ecx, 1
  1539 0000B8F3 E8792D0000          <1> 	call	disk_read
  1540 0000B8F8 7232                <1> 	jc	short loc_read_FAT32_fsinfo_sec_err
  1541                              <1> 
  1542 0000B8FA BB[BA370100]        <1> 	mov	ebx, DOSBootSectorBuff
  1543                              <1> 
  1544 0000B8FF 813B52526141        <1> 	cmp	dword [ebx], 41615252h
  1545 0000B905 751E                <1> 	jne	short loc_read_FAT32_fsinfo_sec_stc
  1546                              <1> 
  1547 0000B907 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
  1547 0000B910 61                  <1>
  1548 0000B911 7512                <1> 	jne	short loc_read_FAT32_fsinfo_sec_stc
  1549                              <1> 
  1550 0000B913 A1[683C0100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC]
  1551 0000B918 8B8BE8010000        <1> 	mov	ecx, [ebx+488] ; free cluster count
  1552 0000B91E 8B93EC010000        <1> 	mov	edx, [ebx+492] ; first (next) free cluster	
  1553                              <1> 
  1554 0000B924 C3                  <1> 	retn
  1555                              <1> 
  1556                              <1> loc_read_FAT32_fsinfo_sec_stc: 
  1557                              <1> 	; 15/10/2016 (0Bh -> 28)
  1558 0000B925 B81C000000          <1> 	mov	eax, 28 ; Invalid format!
  1559 0000B92A EB05                <1> 	jmp	short loc_read_FAT32_fsinfo_sec_stc_retn
  1560                              <1> 
  1561                              <1> loc_read_FAT32_fsinfo_sec_err:
  1562                              <1> 	; 15/10/2016 (15h -> 17)
  1563                              <1> 	; 23/03/2016 (15h)
  1564 0000B92C B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error
  1565                              <1> 
  1566                              <1> loc_read_FAT32_fsinfo_sec_stc_retn:
  1567 0000B931 29DB                <1> 	sub	ebx, ebx ; 0
  1568 0000B933 F9                  <1> 	stc
  1569 0000B934 C3                  <1> 	retn
  1570                              <1> 
  1571                              <1> add_new_cluster:
  1572                              <1> 	; 15/10/2016
  1573                              <1> 	; 16/05/2016
  1574                              <1> 	; 18/03/2016, 24/03/2016
  1575                              <1> 	; 11/03/2016 (TRDOS 386 =  TRDOS v2.0)
  1576                              <1> 	; 30/07/2011 (DRV_FAT.ASM)
  1577                              <1> 	; 11/09/2010
  1578                              <1> 	; INPUT ->
  1579                              <1> 	;	ESI = Logical dos drv desc. table address
  1580                              <1> 	;	EAX = Last cluster
  1581                              <1> 	; OUTPUT ->
  1582                              <1> 	;	ESI = Logical dos drv desc. table address
  1583                              <1> 	;	EAX = New Last cluster (next cluster)
  1584                              <1> 	;	cf = 1 -> error code in EAX (AL)
  1585                              <1> 	;	cf = 1 -> DX = sectors per cluster
  1586                              <1> 	;	ECX = Free sectors
  1587                              <1> 	; NOTE:
  1588                              <1> 	; This procedure does not update lm date&time !
  1589                              <1> 	;
  1590                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, EDI)
  1591                              <1> 	;
  1592                              <1> 
  1593 0000B935 A3[983D0100]        <1> 	mov	[FAT_anc_LCluster], eax
  1594                              <1> 	
  1595 0000B93A E844F9FFFF          <1> 	call	get_first_free_cluster
  1596 0000B93F 720B                <1> 	jc	short loc_add_new_cluster_retn
  1597                              <1> 	; EAX >= 2 and EAX < FFFFFFFFh is valid
  1598                              <1> 
  1599 0000B941 89C2                <1> 	mov	edx, eax
  1600                              <1> 
  1601 0000B943 42                  <1> 	inc	edx
  1602                              <1> 	;jnz	short loc_add_new_cluster_check_ffc_eax
  1603 0000B944 7516                <1> 	jnz	short loc_add_new_cluster_save_fcc
  1604                              <1> 
  1605                              <1> loc_add_new_cluster_no_disk_space_retn:
  1606 0000B946 B827000000          <1> 	mov	eax, 27h ; MSDOS err => insufficient disk space
  1607                              <1> loc_add_new_cluster_stc_retn:
  1608 0000B94B F9                  <1> 	stc
  1609                              <1> loc_add_new_cluster_retn:
  1610 0000B94C 0FB65E13            <1> 	movzx	ebx, byte [esi+LD_BPB+SecPerClust]
  1611 0000B950 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  1612                              <1> 	;xor	edx, edx
  1613                              <1> 	;stc
  1614 0000B953 C3                  <1> 	retn
  1615                              <1> 
  1616                              <1> loc_anc_invalid_format_stc_retn:
  1617 0000B954 F9                  <1> 	stc
  1618                              <1> loc_add_new_cluster_invalid_format_retn:
  1619                              <1> 	; 15/10/2016 (0Bh -> 28)
  1620 0000B955 B81C000000          <1> 	mov	eax, 28 ; Invalid format
  1621 0000B95A EBF0                <1> 	jmp	short loc_add_new_cluster_retn 
  1622                              <1> 
  1623                              <1> ;loc_add_new_cluster_check_ffc_eax:
  1624                              <1> ;	cmp	eax, 2
  1625                              <1> ;	jb	short loc_add_new_cluster_invalid_format_retn
  1626                              <1> 
  1627                              <1> loc_add_new_cluster_save_fcc:  
  1628 0000B95C A3[9C3D0100]        <1> 	mov	[FAT_anc_FFCluster], eax
  1629                              <1> 
  1630 0000B961 83E802              <1> 	sub	eax, 2
  1631 0000B964 0FB65E13            <1>         movzx   ebx, byte [esi+LD_BPB+SecPerClust]
  1632 0000B968 F7E3                <1> 	mul	ebx
  1633 0000B96A 09D2                <1> 	or	edx, edx
  1634 0000B96C 75E6                <1> 	jnz	short loc_anc_invalid_format_stc_retn
  1635                              <1> 
  1636                              <1> loc_add_new_cluster_allocate_cluster:
  1637                              <1> 	; 18/03/2016
  1638 0000B96E 92                  <1> 	xchg	edx, eax ; eax = 0
  1639                              <1> 	; 16/05/2016
  1640                              <1> 	;cmp	[ClusterBuffer_Valid], al ; 0
  1641                              <1> 	;jna	short loc_anc_clear_cluster_buffer
  1642                              <1> 	;; 'copy' command, 
  1643                              <1> 	;; writing destination file clust after reading source file clust
  1644                              <1> 	;mov	[ClusterBuffer_Valid], al ; 0 ; reset
  1645                              <1> 	;jmp	short loc_add_new_cluster_write_nc_to_disk
  1646                              <1> 
  1647                              <1> loc_anc_clear_cluster_buffer:
  1648                              <1> 	; 11/03/2016
  1649                              <1> 	; Clear buffer
  1650 0000B96F BF00000700          <1> 	mov	edi, Cluster_Buffer ; 70000h (for current TRDOS 386 version)
  1651 0000B974 89D9                <1> 	mov	ecx, ebx ; sector count
  1652 0000B976 C1E107              <1> 	shl	ecx, 7 ; 1 sector = 512 bytes -> 128 double words
  1653                              <1> 	;xor	eax, eax ; 0
  1654 0000B979 F3AB                <1> 	rep	stosd
  1655                              <1> 
  1656                              <1> loc_add_new_cluster_write_nc_to_disk:
  1657                              <1> 	; 11/03/2016
  1658                              <1> 	;xchg	eax, edx ; edx = 0, eax = sector offset
  1659 0000B97B 89D0                <1> 	mov	eax, edx
  1660 0000B97D 034668              <1>         add     eax, [esi+LD_DATABegin]
  1661 0000B980 72D3                <1> 	jc	short loc_add_new_cluster_invalid_format_retn 
  1662                              <1> 		
  1663 0000B982 89D9                <1> 	mov	ecx, ebx ; ECX = sectors per cluster (<256)
  1664 0000B984 BB00000700          <1> 	mov	ebx, Cluster_Buffer
  1665 0000B989 E8D42C0000          <1> 	call	disk_write
  1666 0000B98E 7307                <1> 	jnc	short loc_add_new_cluster_update_fat_nlc
  1667                              <1> 	
  1668                              <1> 	; 15/10/2016 (1Dh -> 18)
  1669 0000B990 B812000000          <1> 	mov	eax, 18 ; Write Error
  1670 0000B995 EBB4                <1> 	jmp	short loc_add_new_cluster_stc_retn
  1671                              <1> 
  1672                              <1> loc_add_new_cluster_update_fat_nlc:
  1673 0000B997 A1[9C3D0100]        <1> 	mov	eax, [FAT_anc_FFCluster]
  1674 0000B99C 31C9                <1> 	xor	ecx, ecx
  1675 0000B99E 890D[C6390100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  1676 0000B9A4 49                  <1> 	dec	ecx ; 0FFFFFFFFh
  1677 0000B9A5 E8ACF9FFFF          <1> 	call	update_cluster
  1678 0000B9AA 7304                <1> 	jnc	short loc_add_new_cluster_update_fat_plc
  1679 0000B9AC 09C0                <1> 	or	eax, eax ;EAX = 0 -> cluster value is 0 or eocc
  1680 0000B9AE 759B                <1> 	jnz	short loc_add_new_cluster_stc_retn
  1681                              <1> 
  1682                              <1> loc_add_new_cluster_update_fat_plc:
  1683 0000B9B0 A1[983D0100]        <1> 	mov	eax, [FAT_anc_LCluster]
  1684 0000B9B5 8B0D[9C3D0100]      <1> 	mov	ecx, [FAT_anc_FFCluster]
  1685 0000B9BB E896F9FFFF          <1> 	call	update_cluster
  1686 0000B9C0 7314                <1> 	jnc	short loc_add_new_cluster_save_fat_buffer
  1687 0000B9C2 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1688 0000B9C4 7410                <1> 	jz	short loc_add_new_cluster_save_fat_buffer
  1689                              <1> 
  1690                              <1> loc_anc_save_fat_buffer_err_retn:
  1691                              <1> 	;cmp	byte [FAT_ClusterCounter], 1
  1692                              <1> 	;jb	short loc_add_new_cluster_retn
  1693                              <1> 
  1694 0000B9C6 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space (BL = 0)
  1695                              <1> 			   ; (BH = FFh -> Use ESI as Drv Param. Tbl.)
  1696 0000B9CA 50                  <1> 	push	eax
  1697 0000B9CB E8D8FCFFFF          <1> 	call	calculate_fat_freespace
  1698 0000B9D0 58                  <1> 	pop	eax
  1699 0000B9D1 E975FFFFFF          <1>         jmp     loc_add_new_cluster_stc_retn
  1700                              <1> 
  1701                              <1> loc_add_new_cluster_save_fat_buffer:
  1702                              <1> 	;cmp	byte [FAT_BuffValidData], 2
  1703                              <1> 	;jne	short loc_add_new_cluster_calc_FAT_freespace 
  1704                              <1> 	;Byte [FAT_BuffValidData] =  2 
  1705 0000B9D6 E838FCFFFF          <1> 	call	save_fat_buffer
  1706 0000B9DB 72E9                <1> 	jc	short loc_anc_save_fat_buffer_err_retn
  1707                              <1> 
  1708                              <1> loc_add_new_cluster_calc_FAT_freespace:
  1709                              <1> 	;mov	eax, 1 ; Only one Cluster
  1710 0000B9DD A1[C6390100]        <1> 	mov	eax, [FAT_ClusterCounter]
  1711 0000B9E2 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> ESI -> Dos drv desc. table
  1712                              <1> 		; BL = 1 -> add cluster
  1713 0000B9E6 B301                <1> 	mov	bl, 01h ; BL = 1 -> add clusters
  1714                              <1> 	; NOTE: EAX value will be added to Free Cluster Count
  1715                              <1> 	; (Free Cluster Count is decreased when EAX value is negative)
  1716 0000B9E8 E8BBFCFFFF          <1>         call    calculate_fat_freespace
  1717                              <1> 	;ECX = 0 -> no error, ECX > 0 -> error or invalid return
  1718 0000B9ED 21C9                <1> 	and	ecx, ecx ; ECX = 0 -> valid free sector count
  1719 0000B9EF 7409                <1> 	jz	short loc_add_new_cluster_return_cluster_number
  1720                              <1> 
  1721                              <1> loc_add_new_cluster_recalc_FAT_freespace:
  1722 0000B9F1 66BB00FF            <1> 	mov	bx, 0FF00h  ; recalculate free space
  1723 0000B9F5 E8AEFCFFFF          <1>         call    calculate_fat_freespace
  1724                              <1> 	; cf = 0
  1725                              <1> loc_add_new_cluster_return_cluster_number:
  1726 0000B9FA 89C1                <1> 	mov	ecx, eax ; Free sector count
  1727 0000B9FC A1[9C3D0100]        <1> 	mov	eax, [FAT_anc_FFCluster]
  1728 0000BA01 0FB65E13            <1> 	movzx	ebx, byte [esi+LD_BPB+SecPerClust]
  1729                              <1> 	;mov	edi, Cluster_Buffer
  1730 0000BA05 31D2                <1> 	xor	edx, edx
  1731 0000BA07 C3                  <1>         retn
  1732                              <1> 
  1733                              <1> write_cluster:
  1734                              <1> 	; 15/10/2016
  1735                              <1> 	; 21/03/2016 (TRDOS 386 =  TRDOS v2.0)
  1736                              <1> 	;
  1737                              <1> 	; INPUT ->
  1738                              <1> 	;	EAX = Cluster Number (Sector index for SINGLIX FS)
  1739                              <1> 	;	ESI = Logical DOS Drive Description Table address
  1740                              <1> 	;	EBX = Cluster (File R/W) Buffer address (max. 64KB)
  1741                              <1> 	;	Only for SINGLIX FS:
  1742                              <1> 	;	EDX = File Number (The 1st FDT address) 
  1743                              <1> 	; OUTPUT ->
  1744                              <1> 	;	cf = 1 -> Cluster can not be written onto disk
  1745                              <1> 	;	    EAX > 0 -> Error number
  1746                              <1> 	;	cf = 0 -> Cluster has been written successfully
  1747                              <1> 	;
  1748                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
  1749                              <1> 	
  1750 0000BA08 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+BPB_SecPerClust] 
  1751                              <1> 	; CL = 1 = [esi+LD_FS_Reserved2] ; SectPerClust for Singlix FS
  1752                              <1> 
  1753                              <1> write_file_sectors: ; 16/03/2016
  1754 0000BA0C 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  1755 0000BA10 761C                <1> 	jna	short write_fs_cluster
  1756                              <1> 
  1757                              <1> write_fat_file_sectors: 
  1758 0000BA12 83E802              <1> 	sub	eax, 2 ; Beginning cluster number is always 2
  1759 0000BA15 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+BPB_SecPerClust] ; 18/03/2016 
  1760 0000BA19 F7E2                <1> 	mul	edx
  1761 0000BA1B 034668              <1> 	add	eax, [esi+LD_DATABegin] ; absolute address of the cluster
  1762                              <1> 
  1763                              <1> 	; EAX = Disk sector address
  1764                              <1> 	; ECX = Sector count
  1765                              <1> 	; EBX = Buffer address
  1766                              <1> 	; (EDX = 0)
  1767                              <1> 	; ESI = Logical DOS drive description table address	
  1768                              <1> 
  1769 0000BA1E E83F2C0000          <1> 	call	disk_write
  1770 0000BA23 7306                <1> 	jnc	short wclust_retn
  1771                              <1> 	
  1772                              <1> 	; 15/10/2016 (1Dh -> 18)
  1773 0000BA25 B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error !
  1774 0000BA2A C3                  <1> 	retn
  1775                              <1> 
  1776                              <1> wclust_retn:
  1777 0000BA2B 29C0                <1> 	sub	eax, eax ; 0
  1778 0000BA2D C3                  <1> 	retn
  1779                              <1> 
  1780                              <1> write_fs_cluster:
  1781                              <1> 	; 21/03/2016 (TRDOS 386 =  TRDOS v2.0)
  1782                              <1> 	; Singlix FS
  1783                              <1> 	
  1784                              <1> 	; EAX = Cluster number is sector index number of the file (eax)
  1785                              <1> 	
  1786                              <1> 	; EDX = File number is the first File Descriptor Table address 
  1787                              <1> 	;	of the file. (Absolute address of the FDT).
  1788                              <1> 	
  1789                              <1> 	; eax = sector index (0 for the first sector)
  1790                              <1> 	; edx = FDT0 address
  1791                              <1> 		; 64 KB buffer = 128 sectors (limit) 
  1792 0000BA2E B980000000          <1> 	mov	ecx, 128 ; maximum count of sectors (before eof) 
  1793 0000BA33 E801000000          <1> 	call	write_fs_sectors
  1794 0000BA38 C3                  <1> 	retn
  1795                              <1> 
  1796                              <1> write_fs_sectors:
  1797                              <1> 	; 21/03/2016 (TRDOS 386 =  TRDOS v2.0)
  1798 0000BA39 F9                  <1> 	stc
  1799 0000BA3A C3                  <1> 	retn
  1800                              <1> 
  1801                              <1> get_cluster_by_index:
  1802                              <1> 	; 29/04/2016 (TRDOS 386 =  TRDOS v2.0)
  1803                              <1> 	; INPUT ->
  1804                              <1> 	; 	EAX = Beginning cluster
  1805                              <1> 	; 	EDX = Sector index in disk/file section
  1806                              <1> 	;	      (Only for SINGLIX file system!)
  1807                              <1> 	; 	ECX = Cluster sequence number after the beginning cluster
  1808                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  1809                              <1> 	; OUTPUT ->
  1810                              <1> 	;	EAX = Cluster number 
  1811                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  1812                              <1> 	;
  1813                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  1814                              <1> 	;	
  1815 0000BA3B 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  1816 0000BA3F 721E                <1>         jb      short get_fs_section_by_index 
  1817                              <1> 
  1818 0000BA41 3B4E78              <1> 	cmp	ecx, [esi+LD_Clusters]
  1819 0000BA44 7207                <1> 	jb	short gcbi_1
  1820                              <1> gcbi_0:
  1821 0000BA46 F9                  <1> 	stc
  1822 0000BA47 B823000000          <1> 	mov	eax, 23h ; Cluster not available ! 
  1823                              <1> 			 ; MSDOS error code: FCB unavailable
  1824 0000BA4C C3                  <1> 	retn
  1825                              <1> gcbi_1:
  1826 0000BA4D 51                  <1> 	push	ecx
  1827 0000BA4E E8D9F5FFFF          <1> 	call	get_next_cluster
  1828 0000BA53 59                  <1> 	pop	ecx
  1829 0000BA54 7203                <1> 	jc	short gcbi_3
  1830 0000BA56 E2F5                <1> 	loop	gcbi_1
  1831                              <1> gcbi_2:
  1832 0000BA58 C3                  <1> 	retn
  1833                              <1> gcbi_3:
  1834 0000BA59 09C0                <1> 	or	eax, eax
  1835 0000BA5B 74E9                <1> 	jz	short gcbi_0
  1836 0000BA5D F5                  <1> 	cmc 	; stc
  1837 0000BA5E C3                  <1> 	retn
  1838                              <1> 
  1839                              <1> get_fs_section_by_index:
  1840                              <1> 	; 29/04/2016 (TRDOS 386 =  TRDOS v2.0)
  1841                              <1> 	; INPUT ->
  1842                              <1> 	; 	EAX = Beginning FDT number/address
  1843                              <1> 	; 	EDX = Sector index in disk/file section
  1844                              <1> 	; 	ECX = Sector sequence number after the beginning FDT
  1845                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  1846                              <1> 	; OUTPUT ->
  1847                              <1> 	; 	EAX = FDT number/address
  1848                              <1> 	; 	EDX = Sector index of the section (0,1,2,3,4...)
  1849                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  1850                              <1> 	;
  1851                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  1852                              <1> 	;
  1853 0000BA5F B8FFFFFFFF          <1> 	mov	eax, 0FFFFFFFFh
  1854 0000BA64 C3                  <1> 	retn
  1855                              <1> 
  1856                              <1> get_last_section:
  1857                              <1> 	; 22/10/2016 (TRDOS 386 =  TRDOS v2.0)	
  1858                              <1> 	; INPUT ->
  1859                              <1> 	; 	EAX = (The 1st) FDT number/address
  1860                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  1861                              <1> 	; OUTPUT ->
  1862                              <1> 	; 	EAX = FDT number/address of the last section
  1863                              <1> 	; 	EDX = Last sector of the section (0,1,2,3,4...)
  1864                              <1> 	;	[glc_index] = sector index number of the last sector
  1865                              <1> 	;		      (for file, not for the last section)  	
  1866                              <1> 	;		   	
  1867                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  1868                              <1> 	;
  1869                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  1870                              <1> 	;
  1871 0000BA65 B800000000          <1> 	mov	eax, 0
  1872 0000BA6A BA00000000          <1> 	mov	edx, 0
  1873 0000BA6F C3                  <1> 	retn
  2138                                  %include 'trdosk6.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - MAIN PROGRAM : trdosk6.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 16/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    11                              <1> ; u1.s (27/17/2015), u2.s (03/01/2016)
    12                              <1> ; ****************************************************************************
    13                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    14                              <1> ; TRDOS2.ASM (09/11/2011)
    15                              <1> ; ----------------------------------------------------------------------------
    16                              <1> ; INT_21H.ASM (c) 2009-2011 Erdogan TAN  [14/11/2009] Last Update: 08/11/2011
    17                              <1> 
    18                              <1> sysent: ; < enter to system call >
    19                              <1> 	; 13/01/2017
    20                              <1> 	; 06/06/2016
    21                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
    22                              <1> 	; 16/04/2015 - 19/10/2015 (Retro UNIX 386 v1)
    23                              <1> 	; 10/04/2013 - 18/01/2014 (Retro UNIX 8086 v1)
    24                              <1> 	;
    25                              <1> 	; 'unkni' or 'sysent' is sytem entry from various traps. 
    26                              <1> 	; The trap type is determined and an indirect jump is made to 
    27                              <1> 	; the appropriate system call handler. If there is a trap inside
    28                              <1> 	; the system a jump to panic is made. All user registers are saved 
    29                              <1> 	; and u.sp points to the end of the users stack. The sys (trap)
    30                              <1> 	; instructor is decoded to get the the system code part (see
    31                              <1> 	; trap instruction in the PDP-11 handbook) and from this 
    32                              <1> 	; the indirect jump address is calculated. If a bad system call is
    33                              <1> 	; made, i.e., the limits of the jump table are exceeded, 'badsys'
    34                              <1> 	; is called. If the call is legitimate control passes to the
    35                              <1> 	; appropriate system routine.
    36                              <1> 	;
    37                              <1> 	; Calling sequence:
    38                              <1> 	;	Through a trap caused by any sys call outside the system.
    39                              <1> 	; Arguments:
    40                              <1> 	;	Arguments of particular system call.	
    41                              <1> 	; ...............................................................
    42                              <1> 	;	
    43                              <1> 	; Retro UNIX 8086 v1 modification: 
    44                              <1> 	;       System call number is in EAX register.
    45                              <1> 	;
    46                              <1> 	;       Other parameters are in EDX, EBX, ECX, ESI, EDI, EBP
    47                              <1> 	;	registers depending of function details.
    48                              <1>   	;
    49                              <1> 	; 16/04/2015
    50 0000BA70 368925[14470100]    <1>         mov     [ss:u.sp], esp ; Kernel stack points to return address
    51                              <1> 
    52                              <1> 	; save user registers
    53 0000BA77 1E                  <1> 	push	ds
    54 0000BA78 06                  <1> 	push	es
    55 0000BA79 0FA0                <1> 	push	fs
    56 0000BA7B 0FA8                <1> 	push	gs
    57 0000BA7D 60                  <1> 	pushad  ; eax, ecx, edx, ebx, esp -before pushad-, ebp, esi, edi
    58                              <1> 	;
    59                              <1> 	; ESPACE = [ss:u.sp] - esp ; 4*12 = 48 ; 17/09/2015 ; 06/06/2016
    60                              <1> 	; 	(ESPACE is size of space in kernel stack 
    61                              <1> 	;	for saving/restoring user registers.)
    62                              <1> 	;
    63 0000BA7E 50                  <1> 	push	eax ; 01/07/2015
    64 0000BA7F 66B81000            <1> 	mov     ax, KDATA
    65 0000BA83 8ED8                <1>         mov     ds, ax
    66 0000BA85 8EC0                <1>         mov     es, ax
    67 0000BA87 8EE0                <1>         mov     fs, ax
    68 0000BA89 8EE8                <1>         mov     gs, ax
    69 0000BA8B A1[E0300100]        <1> 	mov	eax, [k_page_dir]
    70 0000BA90 0F22D8              <1> 	mov	cr3, eax
    71 0000BA93 58                  <1> 	pop	eax ; 01/07/2015
    72                              <1> 	; 19/10/2015
    73 0000BA94 FC                  <1> 	cld
    74                              <1> 	;
    75 0000BA95 FE05[13470100]      <1> 	inc	byte [sysflg]
    76                              <1> 		; incb sysflg / indicate a system routine is in progress
    77 0000BA9B FB                  <1>         sti 	; 18/01/2014
    78 0000BA9C 0F851EA0FFFF        <1> 	jnz     panic ; 24/05/2013
    79                              <1> 		; beq 1f
    80                              <1> 		; jmp panic ; / called if trap inside system
    81                              <1> ;1:
    82                              <1> 	; 16/04/2015
    83 0000BAA2 A3[1C470100]        <1> 	mov	[u.r0], eax
    84 0000BAA7 8925[18470100]      <1> 	mov	[u.usp], esp ; kernel stack points to user's registers
    85                              <1> 
    86                              <1> 	; 13/01/2017 (TRDOS 386 Feaure only !)
    87 0000BAAD 803D[8C470100]00    <1> 	cmp	byte [u.t_lock], 0 ; timer interrupt lock ?
    88 0000BAB4 0F8741010000        <1> 	ja	sysrele		   ; yes, sys release only !!!
    89                              <1> 
    90                              <1> 		; mov $s.syst+2,clockp
    91                              <1> 		; mov r0,-(sp) / save user registers 
    92                              <1> 		; mov sp,u.r0 / pointer to bottom of users stack 
    93                              <1> 			   ; / in u.r0
    94                              <1> 		; mov r1,-(sp)
    95                              <1> 		; mov r2,-(sp)
    96                              <1> 		; mov r3,-(sp)
    97                              <1> 		; mov r4,-(sp)
    98                              <1> 		; mov r5,-(sp)
    99                              <1> 		; mov ac,-(sp) / "accumulator" register for extended
   100                              <1> 		             ; / arithmetic unit
   101                              <1> 		; mov mq,-(sp) / "multiplier quotient" register for the
   102                              <1> 		             ; / extended arithmetic unit
   103                              <1> 		; mov sc,-(sp) / "step count" register for the extended
   104                              <1> 		             ; / arithmetic unit
   105                              <1> 		; mov sp,u.sp / u.sp points to top of users stack
   106                              <1> 		; mov 18.(sp),r0 / store pc in r0
   107                              <1> 		; mov -(r0),r0 / sys inst in r0      10400xxx
   108                              <1> 		; sub $sys,r0 / get xxx code
   109 0000BABA C1E002              <1> 	shl	eax, 2
   110                              <1> 		; asl r0 / multiply by 2 to jump indirect in bytes
   111 0000BABD 3DA8000000          <1> 	cmp	eax, end_of_syscalls - syscalls
   112                              <1> 		; cmp r0,$2f-1f / limit of table (35) exceeded
   113                              <1> 	;jnb	short badsys
   114                              <1> 		; bhis badsys / yes, bad system call
   115 0000BAC2 F5                  <1> 	cmc
   116 0000BAC3 9C                  <1> 	pushf	
   117 0000BAC4 50                  <1> 	push	eax
   118 0000BAC5 8B2D[14470100]      <1>  	mov 	ebp, [u.sp] ; Kernel stack at the beginning of sys call
   119 0000BACB B0FE                <1> 	mov	al, 0FEh ; 11111110b
   120 0000BACD 1400                <1> 	adc	al, 0 ; al = al + cf
   121 0000BACF 204508              <1> 	and	[ebp+8], al ; flags (reset carry flag)
   122                              <1> 		; bic $341,20.(sp) / set users processor priority to 0 
   123                              <1> 				 ; / and clear carry bit
   124 0000BAD2 5D                  <1> 	pop	ebp ; eax
   125 0000BAD3 9D                  <1> 	popf
   126 0000BAD4 0F8265010000        <1>         jc      badsys
   127 0000BADA A1[1C470100]        <1> 	mov	eax, [u.r0]
   128                              <1> 	; system call registers: EAX, EDX, ECX, EBX, ESI, EDI
   129 0000BADF FFA5[E5BA0000]      <1> 	jmp	dword [ebp+syscalls]
   130                              <1> 		; jmp *1f(r0) / jump indirect thru table of addresses
   131                              <1> 		            ; / to proper system routine.
   132                              <1> syscalls: ; 1:
   133                              <1> 	; 15/10/2016
   134                              <1> 	; 20/05/2016
   135                              <1> 	; 19/05/2016
   136                              <1> 	; 16/05/2016
   137                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   138                              <1> 	; 21/09/2015
   139                              <1> 	; 01/07/2015
   140                              <1> 	; 16/04/2015 (32 bit address modification) 
   141                              <1> 	;dd sysrele	; / 0
   142 0000BAE5 [AFDD0000]          <1> 	dd sysver	; 0 ; Get TRDOS 386 version number (v2.0)	
   143 0000BAE9 [A1BC0000]          <1> 	dd sysexit 	; / 1
   144 0000BAED [18BE0000]          <1> 	dd sysfork 	; / 2
   145 0000BAF1 [4CC20000]          <1> 	dd sysread 	; / 3
   146 0000BAF5 [6BC20000]          <1> 	dd syswrite 	; / 4
   147 0000BAF9 [02C00000]          <1> 	dd sysopen 	; / 5
   148 0000BAFD [23C20000]          <1> 	dd sysclose 	; / 6
   149 0000BB01 [9ABD0000]          <1> 	dd syswait 	; / 7
   150 0000BB05 [30BF0000]          <1> 	dd syscreat 	; / 8
   151 0000BB09 [22CE0000]          <1> 	dd syslink 	; / 9
   152 0000BB0D [6DCE0000]          <1> 	dd sysunlink 	; / 10
   153 0000BB11 [FACE0000]          <1> 	dd sysexec 	; / 11
   154 0000BB15 [F1D20000]          <1> 	dd syschdir 	; / 12
   155 0000BB19 [D0D30000]          <1> 	dd systime 	; / 13
   156 0000BB1D [E5C10000]          <1> 	dd sysmkdir 	; / 14
   157 0000BB21 [43D30000]          <1> 	dd syschmod 	; / 15
   158 0000BB25 [A0D30000]          <1> 	dd syschown 	; / 16
   159 0000BB29 [03D40000]          <1> 	dd sysbreak 	; / 17
   160 0000BB2D [A1D00000]          <1> 	dd sysstat 	; / 18
   161 0000BB31 [48D40000]          <1> 	dd sysseek 	; / 19
   162 0000BB35 [5AD40000]          <1> 	dd systell 	; / 20
   163 0000BB39 [43D50000]          <1> 	dd sysmount 	; / 21
   164 0000BB3D [57D50000]          <1> 	dd sysumount 	; / 22
   165 0000BB41 [CCD40000]          <1> 	dd syssetuid 	; / 23
   166 0000BB45 [FDD40000]          <1> 	dd sysgetuid 	; / 24
   167 0000BB49 [DFD30000]          <1> 	dd sysstime 	; / 25
   168 0000BB4D [C0D40000]          <1> 	dd sysquit 	; / 26
   169 0000BB51 [B4D40000]          <1> 	dd sysintr 	; / 27
   170 0000BB55 [B5D00000]          <1> 	dd sysfstat 	; / 28
   171 0000BB59 [02C30000]          <1> 	dd sysemt 	; / 29
   172 0000BB5D [ADC40000]          <1> 	dd sysmdate 	; / 30
   173                              <1> 	;dd sysstty	; / 31
   174 0000BB61 [C1C40000]          <1> 	dd sysvideo 	; 31 ; TRDOS 386 Video Functions (16/05/2016)
   175                              <1> 	;dd sysgtty	; / 32
   176 0000BB65 [10CE0000]          <1> 	dd sysaudio 	; 32 ; TRDOS 386 Audio Functions (16/05/2016)
   177                              <1> 	;dd sysilgins	; / 33
   178 0000BB69 [1BC30000]          <1> 	dd systimer 	; 33 ; TRDOS 386 Timer Functions (18/05/2016)
   179 0000BB6D [6BD50000]          <1> 	dd syssleep 	; 34 ; Retro UNIX 8086 v1 feature only !
   180                              <1> 			     ; 11/06/2014
   181 0000BB71 [9AD50000]          <1> 	dd sysmsg	; 35 ; Retro UNIX 386 v1 feature only !
   182                              <1> 			     ; 01/07/2015
   183 0000BB75 [70D60000]          <1> 	dd sysgeterr	; 36 ; Retro UNIX 386 v1 feature only !
   184                              <1> 			     ; 21/09/2015 - get last error number
   185 0000BB79 [BEDD0000]          <1> 	dd sysreserved1 ; 37 ;; TRDOS 386 (19/05/2016)
   186 0000BB7D [CDDD0000]          <1> 	dd syspri 	; 38 ; change priority - TRDOS 386 (20/05/2016)
   187 0000BB81 [FBBB0000]          <1> 	dd sysrele	; 39 ; TRDOS 386 (19/05/2016) (0 -> 39)
   188 0000BB85 [00DF0000]          <1> 	dd sysfff	; 40 ; Find First File - TRDOS 386 (15/10/2016)
   189 0000BB89 [DFDF0000]          <1> 	dd sysfnf	; 41 ; Find Next File - TRDOS 386 (15/10/2016)	
   190                              <1> 
   191                              <1> end_of_syscalls:
   192                              <1> 
   193                              <1> error:
   194                              <1> 	; 18/05/2016
   195                              <1> 	; 13/05/2016
   196                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   197                              <1> 	; 16/04/2015 - 17/09/2015 (Retro UNIX 386 v1)
   198                              <1> 	; 10/04/2013 - 07/08/2013 (Retro UNIX 8086 v1)
   199                              <1> 	;
   200                              <1> 	; 'error' merely sets the error bit off the processor status (c-bit)
   201                              <1> 	; then falls right into the 'sysret', 'sysrele' return sequence.
   202                              <1> 	;
   203                              <1> 	; INPUTS -> none
   204                              <1> 	; OUTPUTS ->
   205                              <1> 	;	processor status - carry (c) bit is set (means error)
   206                              <1> 	;
   207                              <1> 	; 26/05/2013 (Stack pointer must be reset here! 
   208                              <1> 	; 	      Because, jumps to error procedure
   209                              <1> 	;	      disrupts push-pop nesting balance)
   210                              <1> 	;
   211 0000BB8D 8B2D[14470100]      <1> 	mov	ebp, [u.sp] ; interrupt (system call) return (iretd) address
   212 0000BB93 804D0801            <1> 	or	byte [ebp+8], 1  ; set carry bit of flags register
   213                              <1> 				 ; (system call will return with cf = 1)
   214                              <1> 		; bis $1,20.(r1) / set c bit in processor status word below
   215                              <1> 		               ; / users stack
   216                              <1> 	; 17/09/2015
   217 0000BB97 83ED30              <1> 	sub	ebp, ESPACE ; 48 ; total size of stack frame ('sysdefs.inc')
   218                              <1> 				 ; for saving/restoring user registers	
   219                              <1> 	;cmp	ebp, [u.usp]
   220                              <1> 	;je	short err0	
   221 0000BB9A 892D[18470100]      <1> 	mov	[u.usp], ebp
   222                              <1> ;err0:
   223                              <1> 	; 01/09/2015
   224 0000BBA0 8B25[18470100]      <1> 	mov	esp, [u.usp] 	    ; Retro Unix 8086 v1 modification!
   225                              <1> 				    ; 10/04/2013
   226                              <1> 				    ; (If an I/O error occurs during disk I/O,
   227                              <1> 				    ; related procedures will jump to 'error'
   228                              <1> 				    ; procedure directly without returning to 
   229                              <1> 				    ; the caller procedure. So, stack pointer
   230                              <1>                                     ; must be restored here.)
   231                              <1> 	; 13/05/2016
   232                              <1> 	; NOTE: (The last) error code is in 'u.error', it can be retrieved by
   233                              <1> 	;	'get last error' system call later. 	
   234                              <1> 
   235                              <1> 	; 03/09/2015 - 09/06/2015 - 07/08/2013
   236 0000BBA6 C605[7E470100]00    <1> 	mov 	byte [u.kcall], 0 ; namei_r, mkdir_w reset
   237                              <1> 
   238                              <1> sysret: ; < return from system call>
   239                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   240                              <1> 	; 16/04/2015 - 10/09/2015 (Retro UNIX 386 v1)
   241                              <1> 	; 10/04/2013 - 23/02/2014 (Retro UNIX 8086 v1)
   242                              <1> 	;
   243                              <1> 	; 'sysret' first checks to see if process is about to be 
   244                              <1> 	; terminated (u.bsys). If it is, 'sysexit' is called.
   245                              <1> 	; If not, following happens:	 
   246                              <1> 	; 	1) The user's stack pointer is restored.
   247                              <1> 	;	2) r1=0 and 'iget' is called to see if last mentioned
   248                              <1> 	;	   i-node has been modified. If it has, it is written out
   249                              <1> 	;	   via 'ppoke'.
   250                              <1> 	;	3) If the super block has been modified, it is written out
   251                              <1> 	;	   via 'ppoke'.				
   252                              <1> 	;	4) If the dismountable file system's super block has been
   253                              <1> 	;	   modified, it is written out to the specified device
   254                              <1> 	;	   via 'ppoke'.
   255                              <1> 	;	5) A check is made if user's time quantum (uquant) ran out
   256                              <1> 	;	   during his execution. If so, 'tswap' is called to give
   257                              <1> 	;	   another user a chance to run.
   258                              <1> 	;	6) 'sysret' now goes into 'sysrele'. 
   259                              <1> 	;	    (See 'sysrele' for conclusion.)		
   260                              <1> 	;
   261                              <1> 	; Calling sequence:
   262                              <1> 	;	jump table or 'br sysret'
   263                              <1> 	; Arguments: 
   264                              <1> 	;	-	
   265                              <1> 	; ...............................................................
   266                              <1> 	;	
   267                              <1> 	; ((AX=r1 for 'iget' input))
   268                              <1> 	;	
   269 0000BBAD 6631C0              <1> 	xor	ax, ax ; 04/05/2013
   270                              <1> sysret0: ; 29/07/2015 (eax = 0, jump from sysexec)
   271 0000BBB0 FEC0                <1> 	inc	al ; 04/05/2013
   272 0000BBB2 3805[6A470100]      <1> 	cmp	[u.bsys], al ; 1
   273                              <1> 		; tstb u.bsys / is a process about to be terminated because
   274 0000BBB8 0F83E3000000        <1>         jnb     sysexit ; 04/05/2013
   275                              <1> 		; bne sysexit / of an error? yes, go to sysexit
   276                              <1> 	;mov	esp, [u.usp] ; 24/05/2013 (that is not needed here)
   277                              <1> 		; mov u.sp,sp / no point stack to users stack
   278 0000BBBE FEC8                <1> 	dec 	al ; mov ax, 0
   279                              <1> 		; clr r1 / zero r1 to check last mentioned i-node
   280 0000BBC0 E88B2A0000          <1> 	call	iget
   281                              <1> 		; jsr r0,iget / if last mentioned i-node has been modified
   282                              <1> 		            ; / it is written out
   283                              <1> 	; 10/01/2017
   284                              <1> 	; 09/01/2017
   285                              <1> ;sysrele: ; < release >
   286                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   287                              <1> 	; 16/04/2015 - 14/10/2015 (Retro UNIX 386 v1)
   288                              <1> 	; 10/04/2013 - 07/03/2014 (Retro UNIX 8086 v1)
   289                              <1> 	;
   290                              <1> 	; 'sysrele' first calls 'tswap' if the time quantum for a user is
   291                              <1> 	;  zero (see 'sysret'). It then restores the user's registers and
   292                              <1> 	; turns off the system flag. It then checked to see if there is
   293                              <1> 	; an interrupt from the user by calling 'isintr'. If there is, 
   294                              <1> 	; the output gets flashed (see isintr) and interrupt action is
   295                              <1> 	; taken by a branch to 'intract'. If there is no interrupt from
   296                              <1> 	; the user, a rti is made.
   297                              <1> 	;
   298                              <1> 	; Calling sequence:
   299                              <1> 	;	Fall through a 'bne' in 'sysret' & ?
   300                              <1> 	; Arguments:
   301                              <1> 	;	-	
   302                              <1> 	; ...............................................................
   303                              <1> 	;	
   304                              <1> 	; 23/02/2014 (swapret)
   305                              <1> 	; 22/09/2013
   306                              <1> sysrel0: ;1:
   307 0000BBC5 803D[60470100]00    <1> 	cmp	byte [u.quant], 0 ; 16/05/2013
   308                              <1> 		; tstb uquant / is the time quantum 0?
   309 0000BBCC 7705                <1>         ja      short swapret
   310                              <1> 		; bne 1f / no, don't swap it out
   311                              <1> sysrelease: ; 07/12/2013 (jump from 'clock')
   312 0000BBCE E8C2200000          <1> 	call	tswap
   313                              <1> 		; jsr r0,tswap / yes, swap it out
   314                              <1> 	
   315                              <1> ; Retro Unix 8086 v1 feature: return from 'swap' to 'swapret' address.
   316                              <1> swapret: ;1:
   317                              <1> 	; 10/09/2015
   318                              <1> 	; 01/09/2015
   319                              <1> 	; 14/05/2015
   320                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - 32 bit, pm modifications)
   321                              <1> 	; 26/05/2013 (Retro UNIX 8086 v1)
   322                              <1> 	; cli
   323                              <1> 	; 24/07/2015
   324                              <1> 	;
   325                              <1> 	;; 'esp' must be already equal to '[u.usp]' here ! 
   326                              <1> 	;; mov	esp, [u.usp]
   327                              <1> 
   328                              <1> 	; 22/09/2013
   329 0000BBD3 E87A2A0000          <1> 	call	isintr
   330                              <1> 	; 20/10/2013
   331 0000BBD8 7405                <1> 	jz	short sysrel1
   332 0000BBDA E8AB000000          <1> 	call	intract
   333                              <1> 		; jsr r0,isintr / is there an interrupt from the user
   334                              <1> 		;     br intract / yes, output gets flushed, take interrupt
   335                              <1> 		               ; / action
   336                              <1> sysrel1:
   337 0000BBDF FA                  <1> 	cli	; 14/10/2015
   338                              <1> sysrel2:
   339 0000BBE0 FE0D[13470100]      <1> 	dec	byte [sysflg]
   340                              <1> 		; decb sysflg / turn system flag off
   341                              <1> 	
   342 0000BBE6 A1[70470100]        <1> 	mov	eax, [u.pgdir]	
   343 0000BBEB 0F22D8              <1> 	mov	cr3, eax  ; 1st PDE points to Kernel Page Table 0 (1st 4 MB)
   344                              <1> 			  ; (others are different than kernel page tables) 
   345                              <1> 	; 10/09/2015
   346 0000BBEE 61                  <1> 	popad ; edi, esi, ebp, temp (icrement esp by 4), ebx, edx, ecx, eax
   347                              <1> 		; mov (sp)+,sc / restore user registers
   348                              <1> 		; mov (sp)+,mq
   349                              <1> 		; mov (sp)+,ac
   350                              <1> 		; mov (sp)+,r5
   351                              <1> 		; mov (sp)+,r4
   352                              <1> 		; mov (sp)+,r3
   353                              <1> 		; mov (sp)+,r2
   354                              <1> 	;
   355 0000BBEF A1[1C470100]        <1> 	mov	eax, [u.r0]  ; ((return value in EAX))
   356 0000BBF4 0FA9                <1> 	pop	gs
   357 0000BBF6 0FA1                <1> 	pop	fs
   358 0000BBF8 07                  <1> 	pop	es
   359 0000BBF9 1F                  <1> 	pop	ds
   360 0000BBFA CF                  <1> 	iretd	
   361                              <1> 		; rti / no, return from interrupt
   362                              <1> 
   363                              <1> sysrele:
   364                              <1> 	; 14/01/2017
   365                              <1> 	; 13/01/2017
   366                              <1> 	; 09/01/2017, 10/01/2017, 12/01/2017
   367                              <1> 	; Major modification for TRDOS 386 (CallBack return)
   368                              <1> 	;
   369                              <1> 	; 'sysrele' system call restores previously saved
   370                              <1> 	; registers and addresses of the process
   371                              <1> 	; (Main purpose -in TRDOS 386- is to return from
   372                              <1> 	; timer callback service routine in ring 3 -user mode-.)
   373                              <1> 	;
   374                              <1> 	; check if the process is in timer callback phase
   375 0000BBFB 803D[8C470100]00    <1> 	cmp	byte [u.t_lock], 0 ; TIMER INT LOCK
   376 0000BC02 74C1                <1> 	je	short sysrel0 ; classic (Retro UNIX 386 type) sysrele
   377                              <1> 	;xor	eax, eax
   378                              <1> 	;mov	byte [u.t_lock], al ; 0 ; reset
   379 0000BC04 0FB61D[6B470100]    <1> 	movzx	ebx, byte [u.uno] ; current process number
   380 0000BC0B 66C1E302            <1> 	shl	bx, 2
   381                              <1> 	;cmp	[ebx+p.tcb-4], eax ; 0 ; is there callback address ?
   382                              <1> 	;jna	short sysrel0 
   383                              <1> 	; yes, reset callback address then restore process registers 
   384                              <1> 	;mov	[ebx+p.tcb-4], eax ; 0 ; reset
   385 0000BC0F 8B83[74440100]      <1> 	mov     eax, [ebx+p.upage-4] ; UPAGE address
   386 0000BC15 FA                  <1> 	cli	; disable interrupts till 'iretd'
   387 0000BC16 E84B210000          <1> 	call	rswap ; restore process 'u' structure
   388                              <1> 	; 14/01/2017
   389 0000BC1B 28C0                <1> 	sub	al, al
   390 0000BC1D 3805[8C470100]      <1> 	cmp	byte [u.t_lock], al ; 0 ; TIMER INT LOCK
   391 0000BC23 74BB                <1> 	je	short sysrel2 ; no !?
   392 0000BC25 A2[8C470100]        <1> 	mov	byte [u.t_lock], al ; 0 ; reset
   393 0000BC2A A0[8D470100]        <1> 	mov	al, [u.t_mode]
   394 0000BC2F 20C0                <1> 	and	al, al
   395 0000BC31 75AD                <1> 	jnz	short sysrel2 ; 0FFh ; user mode
   396 0000BC33 FEC8                <1> 	dec	al
   397 0000BC35 A2[8D470100]        <1> 	mov	[u.t_mode], al ; 0FFh ; not necessary !?
   398                              <1> 	; cpu will continue from the interrupted sytem call addr
   399 0000BC3A 61                  <1> 	popad		; edi, esi, ebp, esp, ebx, edx, ecx, eax
   400 0000BC3B 83C410              <1> 	add	esp, 16	; pass segment segisters: ds, es, fs, gs		
   401 0000BC3E CF                  <1> 	iretd		; eip, cs, eflags	
   402                              <1>  
   403                              <1> badsys:
   404                              <1> 	; 25/12/2016
   405                              <1> 	; 18/04/2016 (TRDOS 386 = TRDOS v2.0)
   406                              <1> 	; 17/04/2011 (TRDOS v1.0, 'IFC.ASM')
   407                              <1> 	; 03/02/2011 ('trdos_ifc_routine')
   408                              <1> 	;
   409                              <1> 	; 16/04/2015 (Retro UNIX 386 v1, 'badsys')
   410                              <1> 	; (EIP, EAX values will be shown on screen with error message)
   411                              <1> 	; (EIP = 'CD 40h' instruction address -INT 40h-)
   412                              <1> 	; (EAX = Function number)  
   413                              <1> 	;
   414 0000BC3F FE05[6A470100]      <1> 	inc	byte [u.bsys]
   415                              <1> 	;
   416 0000BC45 8B1D[14470100]      <1> 	mov	ebx, [u.sp] ; esp at the beginning of 'sysent'
   417 0000BC4B 8B03                <1> 	mov	eax, [ebx] ; EIP (return address, not 'INT 30h' address)
   418 0000BC4D 83E802              <1> 	sub	eax, 2 ; CDh, ##h
   419 0000BC50 E83A76FFFF          <1> 	call	dwordtohex
   420 0000BC55 8915[17F40000]      <1> 	mov	[eip_str], edx
   421 0000BC5B A3[1BF40000]        <1> 	mov	[eip_str+4], eax
   422 0000BC60 A1[1C470100]        <1> 	mov	eax, [u.r0]
   423 0000BC65 E82576FFFF          <1> 	call	dwordtohex
   424 0000BC6A 8915[06F40000]      <1> 	mov	[eax_str], edx
   425 0000BC70 A3[0AF40000]        <1> 	mov	[eax_str+4], eax
   426                              <1> 
   427 0000BC75 66C705[FBF30000]34- <1> 	mov	word [int_num_str], SYSCALL_INT_NUM ; 25/12/2016
   427 0000BC7D 30                  <1>
   428                              <1> 
   429 0000BC7E BE[CDF30000]        <1> 	mov	esi, ifc_msg ; "invalid funtion call !" msg (trdosk9.s)
   430 0000BC83 E8E49DFFFF          <1> 	call	print_msg
   431                              <1> 
   432 0000BC88 EB17                <1> 	jmp	sysexit
   433                              <1> 
   434                              <1> intract: ; / interrupt action
   435                              <1> 	; 14/10/2015
   436                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - Beginning)
   437                              <1> 	; 09/05/2013 - 07/12/2013 (Retro UNIX 8086 v1)
   438                              <1> 	;
   439                              <1> 	; Retro UNIX 8086 v1 modification !
   440                              <1> 	; (Process/task switching and quit routine by using
   441                              <1> 	; Retro UNIX 8086 v1 keyboard interrupt output.))
   442                              <1> 	;
   443                              <1> 	; input -> 'u.quit'  (also value of 'u.intr' > 0)
   444                              <1> 	; output -> If value of 'u.quit' = FFFFh ('ctrl+brk' sign)
   445                              <1> 	;		'intract' will jump to 'sysexit'.
   446                              <1> 	;	    Intract will return to the caller 
   447                              <1> 	;		if value of 'u.quit' <> FFFFh. 	 
   448                              <1> 	; 14/10/2015
   449 0000BC8A FB                  <1> 	sti
   450                              <1> 	; 07/12/2013	
   451 0000BC8B 66FF05[64470100]    <1> 	inc 	word [u.quit]
   452 0000BC92 7408                <1> 	jz	short intrct0 ; FFFFh -> 0
   453 0000BC94 66FF0D[64470100]    <1> 	dec	word [u.quit]
   454                              <1> 	; 16/04/2015
   455 0000BC9B C3                  <1> 	retn
   456                              <1> intrct0:	
   457 0000BC9C 58                  <1> 	pop	eax ; call intract -> retn
   458                              <1> 	;
   459 0000BC9D 31C0                <1> 	xor 	eax, eax
   460 0000BC9F FEC0                <1> 	inc	al  ; mov ax, 1
   461                              <1> ;;;
   462                              <1> 	; UNIX v1 original 'intract' routine... 
   463                              <1> 	; / interrupt action
   464                              <1> 		;cmp *(sp),$rti / are you in a clock interrupt?
   465                              <1> 		; bne 1f / no, 1f
   466                              <1> 		; cmp (sp)+,(sp)+ / pop clock pointer
   467                              <1> 	; 1: / now in user area
   468                              <1> 		; mov r1,-(sp) / save r1
   469                              <1> 		; mov u.ttyp,r1 
   470                              <1> 			; / pointer to tty buffer in control-to r1
   471                              <1> 		; cmpb 6(r1),$177
   472                              <1> 			; / is the interrupt char equal to "del"
   473                              <1> 		; beq 1f / yes, 1f
   474                              <1> 		; clrb 6(r1) 
   475                              <1> 		        ; / no, clear the byte 
   476                              <1> 			; / (must be a quit character)
   477                              <1> 		; mov (sp)+,r1 / restore r1
   478                              <1> 		; clr u.quit / clear quit flag
   479                              <1> 		; bis $20,2(sp) 
   480                              <1> 		    	; / set trace for quit (sets t bit of 
   481                              <1> 			; / ps-trace trap)
   482                              <1> 		; rti   ;  / return from interrupt
   483                              <1> 	; 1: / interrupt char = del
   484                              <1> 		; clrb 6(r1) / clear the interrupt byte 
   485                              <1> 			   ; / in the buffer
   486                              <1> 		; mov (sp)+,r1 / restore r1
   487                              <1> 		; cmp u.intr,$core / should control be 
   488                              <1> 				; / transferred to loc core?
   489                              <1> 		; blo 1f
   490                              <1> 		; jmp *u.intr / user to do rti yes, 
   491                              <1> 				; / transfer to loc core
   492                              <1> 	; 1:
   493                              <1> 		; sys 1 / exit
   494                              <1> 
   495                              <1> sysexit: ; <terminate process>
   496                              <1> 	; 02/01/2017
   497                              <1> 	; 10/06/2016
   498                              <1> 	; 06/06/2016
   499                              <1> 	; 23/05/2016
   500                              <1> 	; 19/05/2016
   501                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   502                              <1> 	; 16/04/2015 - 01/09/2015 (Retro UNIX 386 v1)
   503                              <1> 	; 19/04/2013 - 14/02/2014 (Retro UNIX 8086 v1)
   504                              <1> 	;
   505                              <1> 	; 'sysexit' terminates a process. First each file that
   506                              <1> 	; the process has opened is closed by 'flose'. The process
   507                              <1> 	; status is then set to unused. The 'p.pid' table is then
   508                              <1> 	; searched to find children of the dying process. If any of
   509                              <1> 	; children are zombies (died by not waited for), they are
   510                              <1> 	; set free. The 'p.pid' table is then searched to find the
   511                              <1> 	; dying process's parent. When the parent is found, it is
   512                              <1> 	; checked to see if it is free or it is a zombie. If it is
   513                              <1> 	; one of these, the dying process just dies. If it is waiting
   514                              <1> 	; for a child process to die, it notified that it doesn't 
   515                              <1> 	; have to wait anymore by setting it's status from 2 to 1
   516                              <1> 	; (waiting to active). It is awakened and put on runq by
   517                              <1> 	; 'putlu'. The dying process enters a zombie state in which
   518                              <1> 	; it will never be run again but stays around until a 'wait'
   519                              <1> 	; is completed by it's parent process. If the parent is not
   520                              <1> 	; found, process just dies. This means 'swap' is called with
   521                              <1> 	; 'u.uno=0'. What this does is the 'wswap' is not called
   522                              <1> 	; to write out the process and 'rswap' reads the new process
   523                              <1> 	; over the one that dies..i.e., the dying process is 
   524                              <1> 	; overwritten and destroyed.	
   525                              <1>  	;
   526                              <1> 	; Calling sequence:
   527                              <1> 	;	sysexit or conditional branch.
   528                              <1> 	; Arguments:
   529                              <1> 	;	-	
   530                              <1> 	; ...............................................................
   531                              <1> 	;	
   532                              <1> 	; Retro UNIX 8086 v1 modification: 
   533                              <1> 	;       System call number (=1) is in EAX register.
   534                              <1> 	;
   535                              <1> 	;       Other parameters are in EDX, EBX, ECX, ESI, EDI, EBP
   536                              <1> 	;       registers depending of function details.
   537                              <1> 	;
   538                              <1> 	; ('swap' procedure is mostly different than original UNIX v1.)
   539                              <1> 	;
   540                              <1> ; / terminate process
   541                              <1> 	; AX = 1
   542 0000BCA1 6648                <1> 	dec 	ax ; 0
   543 0000BCA3 66A3[62470100]      <1> 	mov	[u.intr], ax ; 0
   544                              <1> 		; clr u.intr / clear interrupt control word
   545                              <1> 		; clr r1 / clear r1
   546                              <1> sysexit_0:
   547                              <1> 	; 02/01/2017
   548                              <1> 	; 10/06/2016
   549                              <1> 	; 06/06/2016
   550                              <1> 	; 23/05/2016
   551                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
   552                              <1> 	; Check and stop/clear timer event(s) of this (dying) process
   553                              <1> 	; if there is.
   554                              <1> 
   555                              <1> 	; 02/01/2017 
   556 0000BCA9 FA                  <1> 	cli	; disable interrupts 
   557 0000BCAA 0FB61D[6B470100]    <1> 	movzx	ebx, byte [u.uno]
   558                              <1> 	;mov	bl, [u.uno] ; process number of dying process
   559 0000BCB1 8A83[B7440100]      <1> 	mov 	al, [ebx+p.timer-1]
   560 0000BCB7 20C0                <1> 	and	al, al
   561 0000BCB9 743B                <1> 	jz	short sysexit_12 ; no timer events for this process
   562 0000BCBB C683[B7440100]00    <1> 	mov	byte [ebx+p.timer-1], 0 ; reset
   563 0000BCC2 A0[773E0100]        <1> 	mov	al, [timer_events]
   564                              <1> 	;or	al, al
   565                              <1>  	;jz	short sysexit_12 ; no timer events
   566 0000BCC7 88C1                <1> 	mov	cl, al
   567                              <1> 	;cli	; disable interrupts 
   568 0000BCC9 B410                <1> 	mov	ah, 16 ; number of available timer events
   569 0000BCCB BE[B4470100]        <1> 	mov	esi, timer_set ; beginning address of timer events
   570                              <1> sysexit_7:
   571 0000BCD0 8A06                <1> 	mov	al, [esi] ; process number (of timer event)
   572 0000BCD2 38D8                <1> 	cmp	al, bl ; process number comparison
   573 0000BCD4 7411                <1> 	je	short sysexit_10
   574 0000BCD6 20C0                <1> 	and	al, al
   575 0000BCD8 7404                <1> 	jz	short sysexit_9
   576                              <1> sysexit_8:
   577 0000BCDA FEC9                <1> 	dec	cl
   578 0000BCDC 7416                <1> 	jz	short sysexit_11
   579                              <1> sysexit_9:
   580 0000BCDE FECC                <1> 	dec	ah
   581 0000BCE0 7412                <1> 	jz	short sysexit_11
   582 0000BCE2 83C610              <1> 	add	esi, 16
   583 0000BCE5 EBE9                <1> 	jmp	short sysexit_7
   584                              <1> 
   585                              <1> sysexit_10:
   586                              <1> 	;mov	byte [esi], 0
   587 0000BCE7 66C7060000          <1> 	mov	word [esi], 0
   588                              <1> 	;mov	dword [esi+12], 0
   589                              <1> 	;
   590 0000BCEC FE0D[773E0100]      <1> 	dec	byte [timer_events] ; 02/01/2017
   591                              <1> 	;
   592 0000BCF2 EBE6                <1> 	jmp	short sysexit_8
   593                              <1> 
   594                              <1> sysexit_11:
   595 0000BCF4 30C0                <1> 	xor	al, al
   596                              <1> sysexit_12: ; 2:
   597 0000BCF6 FB                  <1> 	sti	; enable interrupts 
   598                              <1> 	;
   599                              <1> 	; AX = 0
   600                              <1> sysexit_1: ; 1:
   601                              <1> 	; AX = File descriptor
   602                              <1> 		; / r1 has file descriptor (index to u.fp list)
   603                              <1> 		; / Search the whole list
   604 0000BCF7 E8CD130000          <1> 	call	fclose
   605                              <1> 		; jsr r0,fclose / close all files the process opened
   606                              <1> 	;; ignore error return
   607                              <1> 		; br .+2 / ignore error return
   608                              <1> 	;inc	ax
   609 0000BCFC FEC0                <1> 	inc	al
   610                              <1> 		; inc r1 / increment file descriptor
   611                              <1> 	;cmp	ax, 10
   612 0000BCFE 3C0A                <1> 	cmp	al, 10
   613                              <1> 		; cmp r1,$10. / end of u.fp list?
   614 0000BD00 72F5                <1> 	jb	short sysexit_1
   615                              <1> 		; blt 1b / no, go back
   616                              <1> 	;movzx	ebx, byte [u.uno]
   617 0000BD02 8A1D[6B470100]      <1> 	mov	bl, [u.uno] ; 02/01/2017
   618                              <1> 		; movb	u.uno,r1 / yes, move dying process's number to r1
   619 0000BD08 88A3[67440100]      <1> 	mov	[ebx+p.stat-1], ah ; 0, SFREE
   620                              <1> 		; clrb p.stat-1(r1) / free the process
   621                              <1> 	;shl	bx, 1
   622 0000BD0E D0E3                <1> 	shl	bl, 1
   623                              <1> 		; asl r1 / use r1 for index into the below tables
   624 0000BD10 668B8B[D6430100]    <1> 	mov	cx, [ebx+p.pid-2]
   625                              <1> 		; mov p.pid-2(r1),r3 / move dying process's name to r3
   626 0000BD17 668B93[F6430100]    <1> 	mov	dx, [ebx+p.ppid-2]
   627                              <1> 		; mov p.ppid-2(r1),r4 / move its parents name to r4
   628                              <1> 	; xor 	bx, bx ; 0
   629 0000BD1E 30DB                <1> 	xor	bl, bl ; 0
   630                              <1> 		; clr r2
   631 0000BD20 31F6                <1> 	xor	esi, esi ; 0
   632                              <1> 		; clr r5 / initialize reg
   633                              <1> sysexit_2: ; 1:
   634                              <1> 	        ; / find children of this dying process, 
   635                              <1> 		; / if they are zombies, free them
   636                              <1> 	;add	bx, 2
   637 0000BD22 80C302              <1> 	add	bl, 2
   638                              <1> 		; add $2,r2 / search parent process table 
   639                              <1> 		          ; / for dying process's name
   640 0000BD25 66398B[F6430100]    <1> 	cmp	[ebx+p.ppid-2], cx
   641                              <1> 		; cmp p.ppid-2(r2),r3 / found it?
   642 0000BD2C 7513                <1> 	jne	short sysexit_4
   643                              <1> 		; bne 3f / no
   644                              <1> 	;shr	bx, 1
   645 0000BD2E D0EB                <1> 	shr	bl, 1
   646                              <1> 		; asr r2 / yes, it is a parent
   647 0000BD30 80BB[67440100]03    <1> 	cmp	byte [ebx+p.stat-1], 3 ; SZOMB
   648                              <1> 		; cmpb p.stat-1(r2),$3 / is the child of this 
   649                              <1> 				     ; / dying process a zombie
   650 0000BD37 7506                <1> 	jne	short sysexit_3 
   651                              <1> 		; bne 2f / no
   652 0000BD39 88A3[67440100]      <1> 	mov	[ebx+p.stat-1], ah ; 0, SFREE
   653                              <1> 		; clrb p.stat-1(r2) / yes, free the child process
   654                              <1> sysexit_3: ; 2:
   655                              <1> 	;shr	bx, 1
   656 0000BD3F D0E3                <1> 	shl	bl, 1
   657                              <1> 		; asl r2
   658                              <1> sysexit_4: ; 3:
   659                              <1> 		; / search the process name table 
   660                              <1> 		; / for the dying process's parent
   661 0000BD41 663993[D6430100]    <1> 	cmp	[ebx+p.pid-2], dx
   662                              <1> 		; cmp p.pid-2(r2),r4 / found it?
   663 0000BD48 7502                <1> 	jne	short sysexit_5
   664                              <1> 		; bne 3f / no
   665 0000BD4A 89DE                <1> 	mov	esi, ebx
   666                              <1> 		; mov r2,r5 / yes, put index to p.pid table (parents
   667                              <1> 		          ; / process # x2) in r5
   668                              <1> sysexit_5: ; 3:
   669                              <1> 	;cmp	bx, nproc + nproc
   670 0000BD4C 80FB20              <1> 	cmp	bl, nproc + nproc
   671                              <1> 		; cmp r2,$nproc+nproc / has whole table been searched?
   672 0000BD4F 72D1                <1> 	jb	short sysexit_2
   673                              <1> 		; blt 1b / no, go back
   674                              <1> 		; mov r5,r1 / yes, r1 now has parents process # x2
   675 0000BD51 21F6                <1> 	and	esi, esi ; r5=r1
   676 0000BD53 7436                <1> 	jz	short sysexit_6
   677                              <1> 		; beq 2f / no parent has been found. 
   678                              <1> 		       ; / The process just dies
   679 0000BD55 66D1EE              <1> 	shr	si, 1
   680                              <1> 		; asr r1 / set up index to p.stat
   681 0000BD58 8A86[67440100]      <1> 	mov	al, [esi+p.stat-1]
   682                              <1> 		; movb p.stat-1(r1),r2 / move status of parent to r2
   683 0000BD5E 20C0                <1> 	and	al, al
   684 0000BD60 7429                <1> 	jz	short sysexit_6
   685                              <1> 		; beq 2f / if its been freed, 2f
   686 0000BD62 3C03                <1> 	cmp	al, 3
   687                              <1> 		; cmp r2,$3 / is parent a zombie?
   688 0000BD64 7425                <1> 	je	short sysexit_6
   689                              <1> 		; beq 2f / yes, 2f
   690                              <1> 	; BH = 0
   691 0000BD66 8A1D[6B470100]      <1> 	mov	bl, [u.uno]
   692                              <1> 		; movb u.uno,r3 / move dying process's number to r3
   693 0000BD6C C683[67440100]03    <1> 	mov	byte [ebx+p.stat-1], 3  ; SZOMB
   694                              <1> 		; movb $3,p.stat-1(r3) / make the process a zombie
   695 0000BD73 3C01                <1> 	cmp	al, 1 ; SRUN
   696 0000BD75 7414                <1> 	je	short sysexit_6
   697                              <1> 	;cmp	al, 2
   698                              <1> 		; cmp r2,$2 / is the parent waiting for 
   699                              <1> 			  ; / this child to die
   700                              <1> 	;jne	short sysexit_6	
   701                              <1> 		; bne 2f / yes, notify parent not to wait any more
   702                              <1> 	; p.stat = 2 --> waiting
   703                              <1> 	; p.stat = 4 --> sleeping
   704 0000BD77 C686[67440100]01    <1> 	mov	byte [esi+p.stat-1], 1 ; SRUN
   705                              <1> 	;dec	byte [esi+p.stat-1]
   706                              <1> 		; decb	p.stat-1(r1) / awaken it by putting it (parent)
   707 0000BD7E 6689F0              <1> 	mov	ax, si ; r1  (process number in AL)
   708                              <1> 	; 
   709                              <1> 	;mov	ebx, runq + 4
   710                              <1> 		; mov $runq+4,r2 / on the runq
   711 0000BD81 BB[0C470100]        <1> 	mov	ebx, runq+2 ; normal run queue ; 02/01/2017
   712 0000BD86 E804200000          <1> 	call	putlu
   713                              <1> 		; jsr r0, putlu
   714                              <1> sysexit_6: 
   715                              <1> 		; / the process dies
   716 0000BD8B C605[6B470100]00    <1> 	mov	byte [u.uno], 0
   717                              <1> 		; clrb u.uno / put zero as the process number, 
   718                              <1> 	           ; / so "swap" will
   719 0000BD92 E8181F0000          <1> 	call	swap
   720                              <1> 		; jsr r0,swap / overwrite process with another process
   721                              <1> 
   722                              <1> hlt_sys:
   723                              <1> 	;sti
   724                              <1> hlts0:
   725 0000BD97 F4                  <1> 	hlt
   726 0000BD98 EBFD                <1> 	jmp	short hlts0
   727                              <1> 		; 0 / and thereby kill it; halt?
   728                              <1> 
   729                              <1> syswait: ; < wait for a processs to die >
   730                              <1> 	; 17/09/2015
   731                              <1> 	; 02/09/2015
   732                              <1> 	; 01/09/2015
   733                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - Beginning)
   734                              <1> 	; 24/05/2013 - 05/02/2014 (Retro UNIX 8086 v1)
   735                              <1> 	;
   736                              <1> 	; 'syswait' waits for a process die. 
   737                              <1> 	; It works in following way:
   738                              <1> 	;    1) From the parent process number, the parent's 
   739                              <1> 	; 	process name is found. The p.ppid table of parent
   740                              <1> 	;	names is then searched for this process name.
   741                              <1> 	;	If a match occurs, r2 contains child's process
   742                              <1> 	;	number. The child status is checked to see if it is
   743                              <1> 	;	a zombie, i.e; dead but not waited for (p.stat=3)
   744                              <1> 	;	If it is, the child process is freed and it's name
   745                              <1> 	;	is put in (u.r0). A return is then made via 'sysret'.
   746                              <1> 	;	If the child is not a zombie, nothing happens and
   747                              <1> 	;	the search goes on through the p.ppid table until
   748                              <1> 	;	all processes are checked or a zombie is found.
   749                              <1> 	;    2) If no zombies are found, a check is made to see if
   750                              <1> 	;	there are any children at all. If there are none,
   751                              <1> 	;	an error return is made. If there are, the parent's
   752                              <1> 	;	status is set to 2 (waiting for child to die),
   753                              <1> 	;	the parent is swapped out, and a branch to 'syswait'
   754                              <1> 	;	is made to wait on the next process.
   755                              <1> 	;
   756                              <1> 	; Calling sequence:
   757                              <1> 	;	?
   758                              <1> 	; Arguments:
   759                              <1> 	;	-
   760                              <1> 	; Inputs: - 
   761                              <1> 	; Outputs: if zombie found, it's name put in u.r0.	
   762                              <1> 	; ...............................................................
   763                              <1> 	;				
   764                              <1> 	
   765                              <1> ; / wait for a process to die
   766                              <1> 
   767                              <1> syswait_0:
   768 0000BD9A 0FB61D[6B470100]    <1> 	movzx	ebx, byte [u.uno] ; 01/09/2015
   769                              <1> 		; movb u.uno,r1 / put parents process number in r1
   770 0000BDA1 D0E3                <1> 	shl	bl, 1
   771                              <1> 	;shl	bx, 1
   772                              <1> 		; asl r1 / x2 to get index into p.pid table
   773 0000BDA3 668B83[D6430100]    <1> 	mov	ax, [ebx+p.pid-2]
   774                              <1> 		; mov p.pid-2(r1),r1 / get the name of this process
   775 0000BDAA 31F6                <1> 	xor	esi, esi
   776                              <1> 		; clr r2
   777 0000BDAC 31C9                <1> 	xor	ecx, ecx ; 30/10/2013
   778                              <1> 	;xor 	cl, cl
   779                              <1> 		; clr r3 / initialize reg 3
   780                              <1> syswait_1: ; 1:
   781 0000BDAE 6683C602            <1> 	add	si, 2
   782                              <1> 		; add $2,r2 / use r2 for index into p.ppid table
   783                              <1> 			  ; / search table of parent processes 
   784                              <1> 			  ; / for this process name
   785 0000BDB2 663B86[F6430100]    <1> 	cmp	ax, [esi+p.ppid-2]
   786                              <1> 		; cmp p.ppid-2(r2),r1 / r2 will contain the childs 
   787                              <1> 			            ; / process number
   788 0000BDB9 7535                <1> 	jne	short syswait_3
   789                              <1> 		;bne 3f / branch if no match of parent process name
   790                              <1> 	;inc	cx
   791 0000BDBB FEC1                <1> 	inc	cl
   792                              <1> 		;inc r3 / yes, a match, r3 indicates number of children
   793 0000BDBD 66D1EE              <1> 	shr	si, 1
   794                              <1> 		; asr r2 / r2/2 to get index to p.stat table
   795                              <1> 	; The possible states ('p.stat' values) of a process are:
   796                              <1> 	;	0 = free or unused
   797                              <1> 	;	1 = active
   798                              <1> 	;	2 = waiting for a child process to die
   799                              <1> 	;	3 = terminated, but not yet waited for (zombie).	
   800 0000BDC0 80BE[67440100]03    <1> 	cmp	byte [esi+p.stat-1], 3 ; SZOMB, 05/02/2014
   801                              <1> 		; cmpb p.stat-1(r2),$3 / is the child process a zombie?
   802 0000BDC7 7524                <1> 	jne	short syswait_2
   803                              <1> 		; bne 2f / no, skip it
   804 0000BDC9 88BE[67440100]      <1> 	mov	[esi+p.stat-1], bh ; 0
   805                              <1> 		; clrb p.stat-1(r2) / yes, free it
   806 0000BDCF 66D1E6              <1> 	shl	si, 1
   807                              <1> 		; asl r2 / r2x2 to get index into p.pid table
   808 0000BDD2 0FB786[D6430100]    <1> 	movzx	eax, word [esi+p.pid-2]
   809 0000BDD9 A3[1C470100]        <1> 	mov	[u.r0], eax
   810                              <1> 		; mov p.pid-2(r2),*u.r0 
   811                              <1> 			      ; / put childs process name in (u.r0)
   812                              <1> 	;
   813                              <1> 	; Retro UNIX 386 v1 modification ! (17/09/2015)
   814                              <1> 	;
   815                              <1> 	; Parent process ID -p.ppid- field (of the child process)
   816                              <1> 	; must be cleared in order to prevent infinitive 'syswait'
   817                              <1> 	; system call loop from the application/program if it calls
   818                              <1> 	; 'syswait' again (mistakenly) while there is not a zombie
   819                              <1> 	; or running child process to wait. ('forktest.s', 17/09/2015)
   820                              <1> 	;
   821                              <1> 	; Note: syswait will return with error if there is not a
   822                              <1> 	;       zombie or running process to wait.	
   823                              <1> 	;
   824 0000BDDE 6629C0              <1> 	sub	ax, ax
   825 0000BDE1 668986[F6430100]    <1> 	mov 	[esi+p.ppid-2], ax ; 0 ; 17/09/2015
   826 0000BDE8 E9C3FDFFFF          <1> 	jmp	sysret0 ; ax = 0
   827                              <1> 	;
   828                              <1> 	;jmp	sysret
   829                              <1> 		; br sysret1 / return cause child is dead
   830                              <1> syswait_2: ; 2:
   831 0000BDED 66D1E6              <1> 	shl	si, 1
   832                              <1> 		; asl r2 / r2x2 to get index into p.ppid table
   833                              <1> syswait_3: ; 3:
   834 0000BDF0 6683FE20            <1> 	cmp	si, nproc+nproc
   835                              <1> 		; cmp r2,$nproc+nproc / have all processes been checked?
   836 0000BDF4 72B8                <1> 	jb	short syswait_1
   837                              <1> 		; blt 1b / no, continue search
   838                              <1> 	;and	cx, cx
   839 0000BDF6 20C9                <1> 	and	cl, cl
   840                              <1> 		; tst r3 / one gets here if there are no children 
   841                              <1> 		       ; / or children that are still active
   842                              <1> 	; 30/10/2013
   843 0000BDF8 750B                <1> 	jnz	short syswait_4
   844                              <1> 	;jz	error
   845                              <1> 		; beq error1 / there are no children, error
   846 0000BDFA 890D[1C470100]      <1> 	mov	[u.r0], ecx ; 0
   847 0000BE00 E988FDFFFF          <1> 	jmp	error
   848                              <1> syswait_4:
   849 0000BE05 8A1D[6B470100]      <1> 	mov	bl, [u.uno]
   850                              <1> 		; movb u.uno,r1 / there are children so put 
   851                              <1> 			      ; / parent process number in r1
   852 0000BE0B FE83[67440100]      <1> 	inc	byte [ebx+p.stat-1] ; 2, SWAIT, 05/02/2014
   853                              <1> 		; incb p.stat-1(r1) / it is waiting for 
   854                              <1> 				  ; / other children to die
   855                              <1> 	; 04/11/2013
   856 0000BE11 E8991E0000          <1> 	call	swap
   857                              <1> 		; jsr r0,swap / swap it out, because it's waiting
   858 0000BE16 EB82                <1> 	jmp	syswait_0
   859                              <1> 		; br syswait / wait on next process
   860                              <1> 
   861                              <1> sysfork: ; < create a new process >
   862                              <1> 	; 02/01/2017 (TRDOS 386 modification)
   863                              <1> 	; 04/09/2015, 18/05/2015
   864                              <1> 	; 28/08/2015, 01/09/2015, 02/09/2015
   865                              <1> 	; 09/05/2015, 10/05/2015, 14/05/2015
   866                              <1> 	; 06/05/2015 (Retro UNIX 386 v1 - Beginning)
   867                              <1> 	; 24/05/2013 - 14/02/2014 (Retro UNIX 8086 v1)
   868                              <1> 	;
   869                              <1> 	; 'sysfork' creates a new process. This process is referred
   870                              <1> 	; to as the child process. This new process core image is
   871                              <1> 	; a copy of that of the caller of 'sysfork'. The only
   872                              <1> 	; distinction is the return location and the fact that (u.r0)
   873                              <1> 	; in the old process (parent) contains the process id (p.pid)
   874                              <1> 	; of the new process (child). This id is used by 'syswait'.
   875                              <1> 	; 'sysfork' works in the following manner: 	
   876                              <1> 	;    1) The process status table (p.stat) is searched to find
   877                              <1> 	;	a process number that is unused. If none are found
   878                              <1> 	;	an error occurs.
   879                              <1> 	;    2) when one is found, it becomes the child process number
   880                              <1> 	;	and it's status (p.stat) is set to active.
   881                              <1> 	;    3) If the parent had a control tty, the interrupt 
   882                              <1> 	;	character in that tty buffer is cleared.
   883                              <1> 	;    4) The child process is put on the lowest priority run 
   884                              <1> 	;	queue via 'putlu'.
   885                              <1> 	;    5) A new process name is gotten from 'mpid' (actually 
   886                              <1> 	;	it is a unique number) and is put in the child's unique
   887                              <1> 	;	identifier; process id (p.pid).
   888                              <1> 	;    6) The process name of the parent is then obtained and
   889                              <1> 	;	placed in the unique identifier of the parent process
   890                              <1> 	;	name is then put in 'u.r0'.	
   891                              <1> 	;    7) The child process is then written out on disk by
   892                              <1> 	;	'wswap',i.e., the parent process is copied onto disk
   893                              <1> 	;	and the child is born. (The child process is written 
   894                              <1> 	;	out on disk/drum with 'u.uno' being the child process
   895                              <1> 	;	number.)
   896                              <1> 	;    8) The parent process number is then restored to 'u.uno'.
   897                              <1> 	;    9) The child process name is put in 'u.r0'.
   898                              <1> 	;   10) The pc on the stack sp + 18 is incremented by 2 to
   899                              <1> 	;	create the return address for the parent process.
   900                              <1> 	;   11) The 'u.fp' list as then searched to see what files
   901                              <1> 	;	the parent has opened. For each file the parent has
   902                              <1> 	;	opened, the corresponding 'fsp' entry must be updated
   903                              <1> 	;	to indicate that the child process also has opened
   904                              <1> 	;	the file. A branch to 'sysret' is then made.	 			 				
   905                              <1> 	;
   906                              <1> 	; Calling sequence:
   907                              <1> 	;	from shell ?
   908                              <1> 	; Arguments:
   909                              <1> 	;	-
   910                              <1> 	; Inputs: -
   911                              <1> 	; Outputs: *u.r0 - child process name
   912                              <1> 	; ...............................................................
   913                              <1> 	;	
   914                              <1> 	; Retro UNIX 8086 v1 modification: 
   915                              <1> 	;	AX = r0 = PID (>0) (at the return of 'sysfork')
   916                              <1> 	;	= process id of child a parent process returns
   917                              <1> 	;	= process id of parent when a child process returns
   918                              <1> 	;
   919                              <1> 	;       In original UNIX v1, sysfork is called and returns as
   920                              <1> 	;	in following manner: (with an example: c library, fork)
   921                              <1> 	;	
   922                              <1> 	;	1:
   923                              <1> 	;		sys	fork
   924                              <1> 	;			br 1f  / child process returns here
   925                              <1> 	;		bes	2f     / parent process returns here
   926                              <1> 	;		/ pid of new process in r0
   927                              <1> 	;		rts	pc
   928                              <1> 	;	2: / parent process condionally branches here
   929                              <1> 	;		mov	$-1,r0 / pid = -1 means error return
   930                              <1> 	;		rts	pc
   931                              <1> 	;
   932                              <1> 	;	1: / child process brances here
   933                              <1> 	;		clr	r0   / pid = 0 in child process
   934                              <1> 	;		rts	pc
   935                              <1> 	;
   936                              <1> 	;	In UNIX v7x86 (386) by Robert Nordier (1999)
   937                              <1> 	;		// pid = fork();
   938                              <1> 	;		//
   939                              <1> 	;		// pid == 0 in child process; 
   940                              <1> 	;		// pid == -1 means error return
   941                              <1> 	;		// in child, 
   942                              <1> 	;		//	parents id is in par_uid if needed
   943                              <1> 	;		
   944                              <1> 	;		_fork:
   945                              <1> 	;			mov	$.fork,eax
   946                              <1> 	;			int	$0x30
   947                              <1> 	;			jmp	1f
   948                              <1> 	;			jnc	2f
   949                              <1> 	;			jmp	cerror
   950                              <1> 	;		1:
   951                              <1> 	;			mov	eax,_par_uid
   952                              <1> 	;			xor	eax,eax
   953                              <1> 	;		2:
   954                              <1> 	;			ret
   955                              <1> 	;
   956                              <1> 	;	In Retro UNIX 8086 v1,
   957                              <1> 	;	'sysfork' returns in following manner:
   958                              <1> 	;	
   959                              <1> 	;		mov	ax, sys_fork
   960                              <1> 	;		mov	bx, offset @f ; routine for child
   961                              <1> 	;		int	20h
   962                              <1> 	;		jc	error
   963                              <1> 	;		
   964                              <1> 	;	; Routine for parent process here (just after 'jc')
   965                              <1> 	;		mov	word ptr [pid_of_child], ax
   966                              <1> 	;		jmp	next_routine_for_parent	
   967                              <1> 	;
   968                              <1> 	;	@@: ; routine for child process here				
   969                              <1> 	;		....	
   970                              <1> 	;	NOTE: 'sysfork' returns to specified offset
   971                              <1> 	;	       for child process by using BX input.
   972                              <1> 	;	      (at first, parent process will return then 
   973                              <1> 	;	      child process will return -after swapped in-
   974                              <1> 	;	      'syswait' is needed in parent process
   975                              <1> 	;	      if return from child process will be waited for.)
   976                              <1> 	;	  				
   977                              <1> 	
   978                              <1> ; / create a new process
   979                              <1> 	; EBX = return address for child process 
   980                              <1> 	     ; (Retro UNIX 8086 v1 modification !)
   981 0000BE18 31F6                <1> 	xor 	esi, esi
   982                              <1> 		; clr r1
   983                              <1> sysfork_1: ; 1: / search p.stat table for unused process number
   984 0000BE1A 46                  <1> 	inc	esi
   985                              <1> 		; inc r1
   986 0000BE1B 80BE[67440100]00    <1> 	cmp	byte [esi+p.stat-1], 0 ; SFREE, 05/02/2014
   987                              <1> 		; tstb p.stat-1(r1) / is process active, unused, dead
   988 0000BE22 760B                <1> 	jna	short sysfork_2	
   989                              <1> 		; beq 1f / it's unused so branch
   990 0000BE24 6683FE10            <1> 	cmp	si, nproc
   991                              <1> 		; cmp r1,$nproc / all processes checked
   992 0000BE28 72F0                <1> 	jb	short sysfork_1
   993                              <1> 		; blt 1b / no, branch back
   994                              <1> 	;
   995                              <1> 	; Retro UNIX 8086 v1. modification:
   996                              <1> 	;	Parent process returns from 'sysfork' to address 
   997                              <1> 	;	which is just after 'sysfork' system call in parent
   998                              <1> 	;	process. Child process returns to address which is put
   999                              <1> 	;	in BX register by parent process for 'sysfork'. 
  1000                              <1> 	;
  1001                              <1> 		;add $2,18.(sp) / add 2 to pc when trap occured, points
  1002                              <1> 		             ; / to old process return
  1003                              <1> 		; br error1 / no room for a new process
  1004 0000BE2A E95EFDFFFF          <1> 	jmp	error
  1005                              <1> sysfork_2: ; 1:
  1006 0000BE2F E8CB8CFFFF          <1> 	call	allocate_page
  1007 0000BE34 0F8253FDFFFF        <1> 	jc	error
  1008 0000BE3A 50                  <1> 	push	eax   ; UPAGE (user structure page) address
  1009                              <1> 	; Retro UNIX 386 v1 modification!
  1010 0000BE3B E8CE8EFFFF          <1> 	call	duplicate_page_dir
  1011                              <1> 		; EAX = New page directory 
  1012 0000BE40 730B                <1> 	jnc	short sysfork_3
  1013 0000BE42 58                  <1> 	pop	eax   ; UPAGE (user structure page) address
  1014 0000BE43 E8958EFFFF          <1> 	call 	deallocate_page
  1015 0000BE48 E940FDFFFF          <1> 	jmp	error
  1016                              <1> sysfork_3:
  1017                              <1> 	; Retro UNIX 386 v1 modification !
  1018 0000BE4D 56                  <1> 	push	esi
  1019 0000BE4E E8EA1E0000          <1> 	call	wswap ; save current user (u) structure, user registers
  1020                              <1> 		      ; and interrupt return components (for IRET)
  1021 0000BE53 8705[70470100]      <1> 	xchg	eax, [u.pgdir] ; page directory of the child process
  1022 0000BE59 A3[74470100]        <1> 	mov	[u.ppgdir], eax ; page directory of the parent process
  1023 0000BE5E 5E                  <1> 	pop	esi
  1024 0000BE5F 58                  <1> 	pop	eax   ; UPAGE (user structure page) address
  1025                              <1> 		; [u.usp] = esp
  1026 0000BE60 89F7                <1> 	mov	edi, esi
  1027 0000BE62 66C1E702            <1> 	shl	di, 2
  1028 0000BE66 8987[74440100]      <1> 	mov	[edi+p.upage-4], eax ; memory page for 'user' struct
  1029 0000BE6C A3[6C470100]        <1> 	mov	[u.upage], eax ; memory page for 'user' struct (child)
  1030                              <1> 	; 28/08/2015
  1031 0000BE71 0FB605[6B470100]    <1> 	movzx	eax, byte [u.uno] ; parent process number
  1032                              <1> 		; movb u.uno,-(sp) / save parent process number
  1033 0000BE78 89C7                <1> 	mov	edi, eax
  1034 0000BE7A 50                  <1>         push	eax ; ** 
  1035 0000BE7B 8A87[37440100]      <1> 	mov     al, [edi+p.ttyc-1] ; console tty (parent)
  1036                              <1> 	; 18/09/2015
  1037                              <1> 	;mov     [esi+p.ttyc-1], al ; set child's console tty
  1038                              <1> 	;mov     [esi+p.waitc-1], ah ; 0 ; reset child's wait channel
  1039 0000BE81 668986[37440100]    <1> 	mov     [esi+p.ttyc-1], ax ; al - set child's console tty
  1040                              <1> 				   ; ah - reset child's wait channel	
  1041 0000BE88 89F0                <1> 	mov	eax, esi
  1042 0000BE8A A2[6B470100]        <1> 	mov	[u.uno], al ; child process number
  1043                              <1> 		;movb r1,u.uno / set child process number to r1
  1044 0000BE8F FE86[67440100]      <1>         inc     byte [esi+p.stat-1] ; 1, SRUN, 05/02/2014
  1045                              <1> 		; incb p.stat-1(r1) / set p.stat entry for child 
  1046                              <1> 				; / process to active status
  1047                              <1> 		; mov u.ttyp,r2 / put pointer to parent process' 
  1048                              <1> 			      ; / control tty buffer in r2
  1049                              <1>                 ; beq 2f / branch, if no such tty assigned
  1050                              <1> 		; clrb 6(r2) / clear interrupt character in tty buffer
  1051                              <1> 	; 2:
  1052 0000BE95 53                  <1> 	push	ebx  ; * return address for the child process
  1053                              <1> 		     ; * Retro UNIX 8086 v1 feature only !	
  1054                              <1> 	; (Retro UNIX 8086 v1 modification!)
  1055                              <1> 		; mov $runq+4,r2
  1056 0000BE96 BB[0C470100]        <1> 	mov	ebx, runq+2 ; normal run queue ; 02/01/2017  
  1057 0000BE9B E8EF1E0000          <1> 	call	putlu
  1058                              <1>  		; jsr r0,putlu / put child process on lowest priority 
  1059                              <1> 			   ; / run queue
  1060 0000BEA0 66D1E6              <1> 	shl	si, 1
  1061                              <1> 		; asl r1 / multiply r1 by 2 to get index 
  1062                              <1> 		       ; / into p.pid table
  1063 0000BEA3 66FF05[06470100]    <1> 	inc	word [mpid]
  1064                              <1> 		; inc mpid / increment m.pid; get a new process name
  1065 0000BEAA 66A1[06470100]      <1> 	mov	ax, [mpid]
  1066 0000BEB0 668986[D6430100]    <1> 	mov	[esi+p.pid-2], ax
  1067                              <1> 		;mov mpid,p.pid-2(r1) / put new process name 
  1068                              <1> 				    ; / in child process' name slot
  1069 0000BEB7 5A                  <1> 	pop	edx  ; * return address for the child process
  1070                              <1> 		     ; * Retro UNIX 8086 v1 feature only !	
  1071 0000BEB8 5B                  <1>   	pop	ebx  ; **
  1072                              <1> 	;mov	ebx, [esp] ; ** parent process number
  1073                              <1> 		; movb (sp),r2 / put parent process number in r2
  1074 0000BEB9 66D1E3              <1> 	shl 	bx, 1
  1075                              <1> 		;asl r2 / multiply by 2 to get index into below tables
  1076                              <1> 	;movzx eax, word [ebx+p.pid-2]
  1077 0000BEBC 668B83[D6430100]    <1> 	mov	ax, [ebx+p.pid-2]
  1078                              <1> 		; mov p.pid-2(r2),r2 / get process name of parent
  1079                              <1> 				   ; / process
  1080 0000BEC3 668986[F6430100]    <1> 	mov	[esi+p.ppid-2], ax
  1081                              <1> 		; mov r2,p.ppid-2(r1) / put parent process name 
  1082                              <1> 			  ; / in parent process slot for child
  1083 0000BECA A3[1C470100]        <1> 	mov	[u.r0], eax	
  1084                              <1> 		; mov r2,*u.r0 / put parent process name on stack 
  1085                              <1> 			     ; / at location where r0 was saved
  1086 0000BECF 8B2D[14470100]      <1> 	mov 	ebp, [u.sp] ; points to return address (EIP for IRET)
  1087 0000BED5 895500              <1> 	mov	[ebp], edx ; *, CS:EIP -> EIP
  1088                              <1> 			   ; * return address for the child process
  1089                              <1> 		; mov $sysret1,-(sp) /
  1090                              <1> 		; mov sp,u.usp / contents of sp at the time when 
  1091                              <1> 			      ; / user is swapped out
  1092                              <1> 		; mov $sstack,sp / point sp to swapping stack space
  1093                              <1> 	; 04/09/2015 - 01/09/2015
  1094                              <1> 	; [u.usp] = esp
  1095 0000BED8 68[ADBB0000]        <1> 	push	sysret ; ***
  1096 0000BEDD 8925[18470100]      <1> 	mov	[u.usp], esp ; points to 'sysret' address (***)
  1097                              <1> 			     ; (for child process)	
  1098 0000BEE3 31C0                <1> 	xor 	eax, eax
  1099 0000BEE5 66A3[4C470100]      <1> 	mov 	[u.ttyp], ax ; 0
  1100                              <1> 	;
  1101 0000BEEB E84D1E0000          <1> 	call	wswap ; Retro UNIX 8086 v1 modification !
  1102                              <1> 		;jsr r0,wswap / put child process out on drum
  1103                              <1> 		;jsr r0,unpack / unpack user stack
  1104                              <1> 		;mov u.usp,sp / restore user stack pointer
  1105                              <1> 		; tst (sp)+ / bump stack pointer
  1106                              <1> 	; Retro UNIX 386 v1 modification !
  1107 0000BEF0 58                  <1> 	pop	eax ; ***
  1108 0000BEF1 66D1E3              <1> 	shl	bx, 1
  1109 0000BEF4 8B83[74440100]      <1> 	mov     eax, [ebx+p.upage-4] ; UPAGE address ; 14/05/2015
  1110 0000BEFA E8671E0000          <1> 	call	rswap ; restore parent process 'u' structure, 
  1111                              <1> 		      ; registers and return address (for IRET)
  1112                              <1> 		;movb (sp)+,u.uno / put parent process number in u.uno
  1113 0000BEFF 0FB705[06470100]    <1>         movzx   eax, word [mpid]
  1114 0000BF06 A3[1C470100]        <1> 	mov	[u.r0], eax
  1115                              <1> 		; mov mpid,*u.r0 / put child process name on stack 
  1116                              <1> 			       ; / where r0 was saved
  1117                              <1> 		; add $2,18.(sp) / add 2 to pc on stack; gives parent
  1118                              <1> 			          ; / process return
  1119                              <1> 	;xor	ebx, ebx
  1120 0000BF0B 31F6                <1> 	xor     esi, esi
  1121                              <1> 		;clr r1
  1122                              <1> sysfork_4: ; 1: / search u.fp list to find the files 
  1123                              <1> 	      ; / opened by the parent process
  1124                              <1> 	; 01/09/2015
  1125                              <1> 	;xor	bh, bh
  1126                              <1> 	;mov 	bl, [esi+u.fp]
  1127 0000BF0D 8A86[22470100]      <1> 	mov 	al, [esi+u.fp]
  1128                              <1> 		; movb u.fp(r1),r2 / get an open file for this process
  1129                              <1>         ;or      bl, bl
  1130 0000BF13 08C0                <1> 	or	al, al
  1131 0000BF15 740D                <1> 	jz	short sysfork_5	
  1132                              <1> 		; beq 2f / file has not been opened by parent, 
  1133                              <1> 		       ; / so branch
  1134 0000BF17 B40A                <1> 	mov	ah, 10 ; Retro UNIX 386 v1 fsp structure size = 10 bytes
  1135 0000BF19 F6E4                <1> 	mul	ah
  1136                              <1> 	;movzx	ebx, ax
  1137 0000BF1B 6689C3              <1> 	mov	bx, ax
  1138                              <1> 	;shl     bx, 3
  1139                              <1> 		; asl r2 / multiply by 8
  1140                              <1>        		; asl r2 / to get index into fsp table
  1141                              <1>        		; asl r2
  1142 0000BF1E FE83[06450100]      <1>   	inc     byte [ebx+fsp-2]
  1143                              <1> 		; incb fsp-2(r2) / increment number of processes
  1144                              <1> 			     ; / using file, because child will now be
  1145                              <1> 			     ; / using this file
  1146                              <1> sysfork_5: ; 2:
  1147 0000BF24 46                  <1>         inc     esi
  1148                              <1> 		; inc r1 / get next open file
  1149 0000BF25 6683FE0A            <1>         cmp     si, 10
  1150                              <1> 		; cmp r1,$10. / 10. files is the maximum number which
  1151                              <1> 			  ; / can be opened
  1152 0000BF29 72E2                <1> 	jb	short sysfork_4	
  1153                              <1> 		; blt 1b / check next entry
  1154 0000BF2B E97DFCFFFF          <1> 	jmp	sysret
  1155                              <1> 		; br sysret1
  1156                              <1> 
  1157                              <1> syscreat: ; < create file >
  1158                              <1> 	; 27/10/2016
  1159                              <1> 	; 25/10/2016, 26/10/2016
  1160                              <1> 	; 15/10/2016, 16/10/2016, 17/10/2016
  1161                              <1> 	; 10/10/2016 (TRDOS 386 = TRDOS v2.0) 
  1162                              <1> 	;	     -derived from INT_21H.ASM-
  1163                              <1> 	;            ("loc_INT21h_create_file")
  1164                              <1>         ; 	10/07/2011 (12/03/2011)
  1165                              <1>         ;	INT 21h Function AH = 3Ch
  1166                              <1>         ;	Create File
  1167                              <1>         ;	INPUT
  1168                              <1>         ;	   CX = Attributes
  1169                              <1>         ;          DS:DX= Address of zero terminaned path name
  1170                              <1>         ;
  1171                              <1> 	; 27/12/2015 (Retro UNIX 386 v1.1)
  1172                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  1173                              <1> 	; 27/05/2013 (Retro UNIX 8086 v1)
  1174                              <1> 	;
  1175                              <1> 	; 'syscreat' called with two arguments; name and mode.
  1176                              <1> 	; u.namep points to name of the file and mode is put
  1177                              <1> 	; on the stack. 'namei' is called to get i-number of the file.		
  1178                              <1> 	; If the file aready exists, it's mode and owner remain 
  1179                              <1> 	; unchanged, but it is truncated to zero length. If the file
  1180                              <1> 	; did not exist, an i-node is created with the new mode via
  1181                              <1> 	; 'maknod' whether or not the file already existed, it is
  1182                              <1> 	; open for writing. The fsp table is then searched for a free
  1183                              <1> 	; entry. When a free entry is found, proper data is placed
  1184                              <1> 	; in it and the number of this entry is put in the u.fp list.
  1185                              <1> 	; The index to the u.fp (also know as the file descriptor)
  1186                              <1> 	; is put in the user's r0. 			
  1187                              <1> 	;
  1188                              <1> 	; Calling sequence:
  1189                              <1> 	;	syscreate; name; mode
  1190                              <1> 	; Arguments:
  1191                              <1> 	;	name - name of the file to be created
  1192                              <1> 	;	mode - mode of the file to be created
  1193                              <1> 	; Inputs: (arguments)
  1194                              <1> 	; Outputs: *u.r0 - index to u.fp list 
  1195                              <1> 	;		   (the file descriptor of new file)
  1196                              <1> 	; ...............................................................
  1197                              <1> 	;				
  1198                              <1> 	; Retro UNIX 8086 v1 modification: 
  1199                              <1> 	;       'syscreate' system call has two arguments; so,
  1200                              <1> 	;	* 1st argument, name is pointed to by BX register
  1201                              <1> 	;	* 2nd argument, mode is in CX register
  1202                              <1> 	;
  1203                              <1> 	;	AX register (will be restored via 'u.r0') will return
  1204                              <1> 	;	to the user with the file descriptor/number 
  1205                              <1> 	;	(index to u.fp list).
  1206                              <1> 	;
  1207                              <1> 	;call	arg2
  1208                              <1> 	; * name - 'u.namep' points to address of file/path name
  1209                              <1> 	;          in the user's program segment ('u.segmnt')
  1210                              <1> 	;          with offset in BX register (as sysopen argument 1).
  1211                              <1> 	; * mode - sysopen argument 2 is in CX register 
  1212                              <1> 	;          which is on top of stack.
  1213                              <1> 	;
  1214                              <1> 	; TRDOS 386 (10/10/2016)
  1215                              <1> 	;	
  1216                              <1>         ; INPUT ->
  1217                              <1>         ;	   CL = File Attributes
  1218                              <1> 	;     	      bit 0 (1) - Read only file (R)
  1219                              <1> 	;             bit 1 (1) - Hidden file (H)
  1220                              <1>         ;             bit 2 (1) - System file (R)
  1221                              <1> 	;             bit 3 (1) - Volume label/name (V)
  1222                              <1>         ;             bit 4 (1) - Subdirectory (D)
  1223                              <1> 	;	      bit 5 (1) - File has been archived (A)	 	
  1224                              <1>         ;          EBX = Pointer to filename (ASCIIZ) -path-
  1225                              <1> 	;	
  1226                              <1> 	; OUTPUT ->
  1227                              <1> 	;          eax = File/Device Handle/Number (index) (AL)
  1228                              <1> 	;          cf = 1 -> Error code in AL
  1229                              <1> 	;
  1230                              <1> 	; Modified Registers: EAX (at the return of system call)
  1231                              <1> 	;  
  1232                              <1> 	; Note: If the file is existing and it has not any one
  1233                              <1> 	;	of S,H,R,V,D attributes, it will be truncated 
  1234                              <1> 	;	to zero length; otherwise, access error will be 
  1235                              <1> 	;	returned. 
  1236                              <1> 
  1237                              <1> sysmkdir_0:
  1238 0000BF30 F6C108              <1> 	test	cl, 08h ; Volume name 
  1239 0000BF33 740A                <1> 	jz	short syscreat_0
  1240                              <1> 
  1241                              <1> 	; Volume name or long name creation
  1242                              <1> 	; is not permitted (in TRDOS 386)!
  1243 0000BF35 B80B000000          <1> 	mov	eax, ERR_FILE_ACCESS  ; 11 ; 'permission denied !'
  1244 0000BF3A E927020000          <1>         jmp	sysopen_dev_err
  1245                              <1> 
  1246                              <1> syscreat_0:
  1247                              <1>         ;mov	[u.namep], ebx
  1248 0000BF3F 51                  <1> 	push	ecx
  1249 0000BF40 89DE                <1> 	mov	esi, ebx
  1250                              <1> 	; file name is forced, change directory as temporary
  1251                              <1> 	;mov	ax, 1
  1252                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
  1253                              <1> 	;call	set_working_path 
  1254 0000BF42 E82F2B0000          <1> 	call	set_working_path_x ; 17/10/2016	
  1255 0000BF47 0F82D8000000        <1> 	jc	syscreat_err
  1256                              <1> 
  1257                              <1> 	; 16/10/2016
  1258 0000BF4D 803D[9B3E0100]00    <1> 	cmp	byte [SWP_inv_fname], 0
  1259 0000BF54 776D                <1> 	ja	short  syscreat_inv_fname ; invalid file name !
  1260                              <1> 
  1261                              <1> 	; Here, we have a valid path and also a valid file name
  1262                              <1> 	; (Working dir has been changed if the path
  1263                              <1> 	;  -file name string- had contained a dir name.)
  1264                              <1> 
  1265 0000BF56 6631C0              <1> 	xor	ax, ax 
  1266                              <1> 	;mov	esi, FindFile_Name
  1267 0000BF59 E8A0B7FFFF          <1> 	call	find_first_file
  1268 0000BF5E 59                  <1> 	pop	ecx
  1269                              <1> 		; ESI = Directory Entry (FindFile_DirEntry) Location
  1270                              <1> 		; EDI = Directory Buffer Directory Entry Location
  1271                              <1> 		; EAX = File Size
  1272                              <1> 		;  BL = Attributes of The File/Directory
  1273                              <1> 		;  BH = Long Name Yes/No Status (>0 is YES)
  1274                              <1> 		;  DX > 0 : Ambiguous filename chars are used
  1275 0000BF5F 726A                <1> 	jc	short syscreat_1 ; file not found (the good!) 
  1276                              <1> 				 ; or another error (the bad') 
  1277                              <1> 
  1278                              <1> 	; (& the uggly!) truncate file to zero length before open
  1279                              <1> 
  1280                              <1> 	;'*' and '?' already checked at 'set_working_path' stage
  1281                              <1> 	;and	dx, dx
  1282                              <1> 	;jnz	short sysmkdir_err ; permission denied 
  1283                              <1> 				   ; invalid filename chars
  1284                              <1> 
  1285                              <1> 	;test	cl, 10h ; subdirectory ?
  1286                              <1> 	;jnz	short sysmkdir_err	
  1287                              <1> 
  1288                              <1> 	; BL = File Attributes:	
  1289                              <1> 	;     	      bit 0 (1) - Read only file (R)
  1290                              <1> 	;             bit 1 (1) - Hidden file (H)
  1291                              <1>         ;             bit 2 (1) - System file (R)
  1292                              <1> 	;             bit 3 (1) - Volume label/name (V)
  1293                              <1>         ;             bit 4 (1) - Subdirectory (D)
  1294                              <1> 	;	      bit 5 (1) - File has been archived	 	
  1295                              <1> 
  1296                              <1> 	; * existing directory must not be truncated
  1297                              <1> 	;   (we don't know it is empty or not, at this stage) 
  1298                              <1> 	; * existing volume name (or a long name) can not be
  1299                              <1> 	;   re-created or truncated by 'syscreat' 	
  1300                              <1> 	; * A file with S, H, R attributes must not be truncated
  1301                              <1> 	;   (change attributes to normal, if you need truncate it)
  1302                              <1> 
  1303 0000BF61 F6C31F              <1> 	test	bl, 00011111b  ; check attributes of existing file
  1304 0000BF64 754F                <1> 	jnz	short sysmkdir_err
  1305                              <1> 
  1306                              <1> 	;; normal file, OK to continue...
  1307                              <1> 
  1308                              <1> 	; ESI = FindFile_DirEntry
  1309 0000BF66 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI] ; 20
  1310 0000BF6A 66C1E010            <1> 	shl	ax, 16
  1311 0000BF6E 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO] ; 26 
  1312                              <1> 	; EAX = First cluster to be truncated/unlinked
  1313 0000BF72 57                  <1> 	push	edi
  1314 0000BF73 51                  <1> 	push	ecx
  1315 0000BF74 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1316 0000BF79 29C9                <1> 	sub	ecx, ecx
  1317 0000BF7B 8A2D[A6310100]      <1> 	mov	ch, [Current_Drv]
  1318 0000BF81 01CE                <1> 	add	esi, ecx
  1319                              <1> 	; ESI = Logical dos drive description table address
  1320 0000BF83 E8CEF8FFFF          <1> 	call	truncate_cluster_chain
  1321 0000BF88 59                  <1> 	pop	ecx
  1322 0000BF89 5F                  <1> 	pop	edi
  1323 0000BF8A 7230                <1> 	jc	short syscreate_truncate_err
  1324                              <1> 
  1325                              <1> 	; 26/10/2016
  1326                              <1> 	; EDI = Directory entry address in directory buffer
  1327                              <1> 	; Update directory entry
  1328 0000BF8C E84ADDFFFF          <1> 	call	convert_current_date_time
  1329                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  1330                              <1>         ; 	    AX = Time in dos dir entry format	
  1331 0000BF91 66894716            <1> 	mov	[edi+DirEntry_WrtTime], ax
  1332 0000BF95 66895718            <1> 	mov	[edi+DirEntry_WrtDate], dx	
  1333 0000BF99 66895712            <1> 	mov	[edi+DirEntry_LastAccDate], dx
  1334 0000BF9D 31C0                <1> 	xor	eax, eax ; file size = 0 
  1335 0000BF9F 89471C              <1> 	mov	[edi+DirEntry_FileSize], eax ; 0
  1336 0000BFA2 C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; data changed sign	
  1337 0000BFA9 BE[9C3B0100]        <1> 	mov	esi, FindFile_DirEntry
  1338 0000BFAE B201                <1> 	mov	dl, 1 ; open file for writing
  1339 0000BFB0 E9AA000000          <1> 	jmp	sysopen_2
  1340                              <1> 
  1341                              <1> sysmkdir_err:
  1342                              <1> 	; 1 = write, 2 = read & write, >2 = invalid
  1343 0000BFB5 B80B000000          <1>         mov	eax, ERR_FILE_ACCESS  ; 11 ; 'permission denied !'
  1344 0000BFBA EB73                <1>         jmp	short sysopen_err
  1345                              <1> 
  1346                              <1> syscreate_truncate_err:
  1347 0000BFBC B812000000          <1> 	mov	eax, ERR_DRV_WRITE ; 18 ; 'disk write error !'
  1348 0000BFC1 EB6C                <1>         jmp	short sysopen_err
  1349                              <1> 
  1350                              <1> syscreat_inv_fname:  ; invalid file name chars 
  1351                              <1> 	; 16/10/2016
  1352 0000BFC3 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME  ; 26 ; invalid file name chars 
  1353 0000BFC8 59                  <1> 	pop	ecx
  1354 0000BFC9 EB64                <1> 	jmp	sysopen_err
  1355                              <1> 
  1356                              <1> syscreat_1:
  1357                              <1> 	; Error code in EAX
  1358 0000BFCB 3C02                <1>         cmp	al, 02h ; 'File not found' error
  1359 0000BFCD 7560                <1>         jne	sysopen_err
  1360                              <1> 
  1361 0000BFCF F6C110              <1> 	test	cl, 10h ; Directory
  1362 0000BFD2 0F852C020000        <1> 	jnz	sysmkdir_2
  1363                              <1> 
  1364                              <1> syscreat_2:
  1365 0000BFD8 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name 
  1366                              <1>         ;xor	edx, edx
  1367 0000BFDD 31C0                <1>         xor	eax, eax ; File Size  = 0
  1368 0000BFDF 31DB                <1> 	xor	ebx, ebx
  1369 0000BFE1 4B                  <1> 	dec 	ebx ; FFFFFFFFh -> create empty file 
  1370                              <1> 	            ;              (only for FAT fs) 
  1371                              <1> 	; CL = File Attributes
  1372 0000BFE2 E8FDECFFFF          <1> 	call	create_file
  1373 0000BFE7 7246                <1> 	jc	sysopen_err
  1374                              <1> 		; EAX = New file's first cluster
  1375                              <1> 		; ESI = Logical Dos Drv Descr. Table Addr.
  1376                              <1> 		; EBX = offset CreateFile_Size
  1377                              <1> 		; ECX = Sectors per cluster (<256) 
  1378                              <1> 		; EDX = Directory entry index/number (<65536)
  1379                              <1> 	; 26/10/2016
  1380                              <1> 	;mov	esi, Directory_Buffer
  1381                              <1> 	;shl	dx, 5 ; *32
  1382                              <1> 	;add	esi, edx
  1383                              <1> 	;; esi = directory entry address in directory buffer
  1384                              <1> 
  1385                              <1> 	; Here, directory entry has been created but last
  1386                              <1> 	; modification date & time of the parent dir has not
  1387                              <1> 	; been updated, yet! 
  1388                              <1> 	; (Note: Directory and FAT buffers have been updated...)
  1389                              <1>  	
  1390 0000BFE9 E826DEFFFF          <1> 	call	update_parent_dir_lmdt ; now, it is OK too!
  1391                              <1> 
  1392                              <1> 	; 25/10/2016
  1393 0000BFEE 66B80018            <1> 	mov	ax, 1800h
  1394 0000BFF2 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name
  1395 0000BFF7 E802B7FFFF          <1> 	call	find_first_file
  1396 0000BFFC 7231                <1> 	jc	short sysopen_err
  1397                              <1> 
  1398                              <1> 	; Only possible error after here is 
  1399                              <1> 	; "too many open files !" error.
  1400                              <1> 	;
  1401                              <1> 	; If "syscreat" will return with that error,
  1402                              <1> 	; (the file has been created but it could not be opened)
  1403                              <1> 	; the user must retry to open this file again
  1404                              <1> 	; or must close another file before using 
  1405                              <1> 	; "sysopen" system call.
  1406                              <1> 
  1407 0000BFFE B201                <1> 	mov	dl, 1 ; open file for writing
  1408                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
  1409                              <1> 	; EAX = File Size (= 0)
  1410 0000C000 EB5D                <1> 	jmp	short sysopen_2
  1411                              <1> 
  1412                              <1> sysopen: ;<open file>
  1413                              <1> 	; 26/10/2016
  1414                              <1> 	; 24/10/2016
  1415                              <1> 	; 17/10/2016
  1416                              <1> 	; 15/10/2016
  1417                              <1> 	; 06/10/2016, 07/10/2016, 08/10/2016
  1418                              <1> 	; 05/10/2016 (TRDOS 386 = TRDOS v2.0) 
  1419                              <1> 	;	     -derived from INT_21H.ASM-
  1420                              <1> 	;            ("loc_INT21h_open_file")
  1421                              <1>         ; 	26/02/2011 
  1422                              <1>         ;	INT 21h Function AH = 3Dh
  1423                              <1>         ;	Open File
  1424                              <1>         ;	INPUT
  1425                              <1>         ;	   AL= File Access Value
  1426                              <1> 	;     	     0- Open for reading
  1427                              <1> 	;            1- Open for writing
  1428                              <1>         ;            2- Open for reading and writing
  1429                              <1>         ;          DS:DX= Pointer to filename (ASCIIZ)
  1430                              <1>         ;
  1431                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  1432                              <1> 	; 22/05/2013 - 27/05/2013 (Retro UNIX 8086 v1)
  1433                              <1> 	;
  1434                              <1> 	; 'sysopen' opens a file in following manner:
  1435                              <1> 	;    1) The second argument in a sysopen says whether to
  1436                              <1> 	;	open the file ro read (0) or write (>0).
  1437                              <1> 	;    2) I-node of the particular file is obtained via 'namei'.
  1438                              <1> 	;    3) The file is opened by 'iopen'.
  1439                              <1> 	;    4) Next housekeeping is performed on the fsp table
  1440                              <1> 	;	and the user's open file list - u.fp.
  1441                              <1> 	;	a) u.fp and fsp are scanned for the next available slot.
  1442                              <1> 	;	b) An entry for the file is created in the fsp table.
  1443                              <1> 	;	c) The number of this entry is put on u.fp list.
  1444                              <1> 	;	d) The file descriptor index to u.fp list is pointed
  1445                              <1> 	;	   to by u.r0.
  1446                              <1> 	;
  1447                              <1> 	; Calling sequence:
  1448                              <1> 	;	sysopen; name; mode
  1449                              <1> 	; Arguments:
  1450                              <1> 	;	name - file name or path name
  1451                              <1> 	;	mode - 0 to open for reading
  1452                              <1> 	;	       1 to open for writing
  1453                              <1> 	; Inputs: (arguments)
  1454                              <1> 	; Outputs: *u.r0 - index to u.fp list (the file descriptor)
  1455                              <1> 	;		  is put into r0's location on the stack.	
  1456                              <1> 	; ...............................................................
  1457                              <1> 	;				
  1458                              <1> 	; Retro UNIX 8086 v1 modification: 
  1459                              <1> 	;       'sysopen' system call has two arguments; so,
  1460                              <1> 	;	* 1st argument, name is pointed to by BX register
  1461                              <1> 	;	* 2nd argument, mode is in CX register
  1462                              <1> 	;
  1463                              <1> 	;	AX register (will be restored via 'u.r0') will return
  1464                              <1> 	;	to the user with the file descriptor/number 
  1465                              <1> 	;	(index to u.fp list).
  1466                              <1> 	;
  1467                              <1> 	;call	arg2
  1468                              <1> 	; * name - 'u.namep' points to address of file/path name
  1469                              <1> 	;          in the user's program segment ('u.segmnt')
  1470                              <1> 	;          with offset in BX register (as sysopen argument 1).
  1471                              <1> 	; * mode - sysopen argument 2 is in CX register 
  1472                              <1> 	;          which is on top of stack.
  1473                              <1> 	;
  1474                              <1> 	; jsr r0,arg2 / get sys args into u.namep and on stack
  1475                              <1> 	;
  1476                              <1>        	; system call registers: ebx, ecx (through 'sysenter')
  1477                              <1> 	;
  1478                              <1> 	; TRDOS 386 (05/10/2016)
  1479                              <1> 	;	
  1480                              <1>         ; INPUT ->
  1481                              <1>         ;	   CL = File Access Value (Open Mode)
  1482                              <1> 	;     	      0 - Open file for reading
  1483                              <1> 	;             1 - Open file for writing
  1484                              <1>         ;             2 - Open device for reading
  1485                              <1> 	;	      3 - Open device for writing
  1486                              <1>         ;          EBX = Pointer to filename/devicename (ASCIIZ)
  1487                              <1> 	; OUTPUT ->
  1488                              <1> 	;          eax = File/Device Handle/Number (index) (AL)
  1489                              <1> 	;          cf = 1 -> Error code in AL
  1490                              <1> 	;
  1491                              <1> 	; Modified Registers: EAX (at the return of system call)
  1492                              <1> 	;  
  1493                              <1> 
  1494 0000C002 80F901              <1> 	cmp	cl, 1 ; read file (0), write file (1)
  1495 0000C005 7614                <1> 	jna	short sysopen_0
  1496                              <1> 
  1497 0000C007 80F903              <1> 	cmp	cl, 3
  1498 0000C00A 0F8640010000        <1> 	jna	sysopen_device
  1499                              <1> 
  1500                              <1> 	; Invalid access code
  1501 0000C010 B817000000          <1> 	mov	eax, ERR_INV_PARAMETER
  1502 0000C015 0F874B010000        <1> 	ja	sysopen_dev_err
  1503                              <1> 
  1504                              <1> sysopen_0:
  1505                              <1> 	;mov	[u.namep], ebx
  1506 0000C01B 51                  <1> 	push	ecx
  1507 0000C01C 89DE                <1> 	mov	esi, ebx
  1508                              <1> 	; file name is forced, change directory as temporary
  1509                              <1> 	;mov	ax, 1
  1510                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
  1511                              <1> 	;call	set_working_path 
  1512 0000C01E E8532A0000          <1> 	call	set_working_path_x ; 17/10/2016	
  1513 0000C023 731E                <1> 	jnc	short sysopen_1
  1514                              <1> 
  1515                              <1> syscreat_err: ; ecx = file attributes (for 'syscreat')
  1516 0000C025 59                  <1> 	pop	ecx ; open mode  
  1517 0000C026 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
  1518 0000C028 7505                <1> 	jnz	short sysopen_err
  1519                              <1> 	; eax = 0
  1520 0000C02A B80C000000          <1> 	mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
  1521                              <1> sysopen_err:
  1522 0000C02F A3[1C470100]        <1> 	mov	[u.r0], eax
  1523 0000C034 A3[80470100]        <1> 	mov	[u.error], eax
  1524 0000C039 E80D2B0000          <1> 	call 	reset_working_path
  1525 0000C03E E94AFBFFFF          <1> 	jmp	error
  1526                              <1> 
  1527                              <1> sysopen_1:
  1528                              <1> 	;mov	esi, FindFile_Name
  1529 0000C043 66B80018            <1>         mov	ax, 1800h ; Only files 
  1530 0000C047 E8B2B6FFFF          <1> 	call	find_first_file
  1531 0000C04C 5A                  <1> 	pop	edx
  1532 0000C04D 72E0                <1> 	jc	short sysopen_err ; eax = 2 (File not found !)
  1533                              <1> 
  1534                              <1> 	; check_open_file_attr_access_code
  1535                              <1> 
  1536 0000C04F F6C307              <1>         test	bl, 7  ; system, hidden, readonly 
  1537 0000C052 740B                <1>         jz	short sysopen_2
  1538                              <1> 
  1539 0000C054 20D2                <1> 	and	dl, dl ; 0 = read mode
  1540 0000C056 7407                <1> 	jz	short sysopen_2
  1541                              <1> 
  1542                              <1> 	; 1 = write, 2 = read & write, >2 = invalid
  1543 0000C058 B80B000000          <1>         mov	eax, ERR_FILE_ACCESS  ; 11  = 'permission denied !'
  1544 0000C05D EBD0                <1>         jmp	short sysopen_err
  1545                              <1> 
  1546                              <1> sysopen_2:
  1547                              <1> 	; esi = Directory Entry (FindFile_DirEntry) Location
  1548 0000C05F 89F3                <1> 	mov	ebx, esi
  1549 0000C061 31F6                <1>         xor     esi, esi ; 0
  1550 0000C063 31FF                <1>         xor     edi, edi ; 0
  1551                              <1> sysopen_3: ; scan the list of entries in fsp table
  1552 0000C065 80BE[22470100]00    <1>         cmp     byte [esi+u.fp], 0
  1553 0000C06C 760F                <1>         jna     short sysopen_4 ; empty slot
  1554 0000C06E 6646                <1>         inc     si
  1555 0000C070 6683FE0A            <1>         cmp     si, 10
  1556 0000C074 72EF                <1> 	jb	short sysopen_3
  1557                              <1> toomanyf:
  1558 0000C076 B80D000000          <1> 	mov	eax, ERR_TOO_MANY_FILES ; too many open files !
  1559 0000C07B EBB2                <1> 	jmp	short sysopen_err
  1560                              <1> 
  1561                              <1> sysopen_4: 
  1562 0000C07D 80BF[0A420100]00    <1>         cmp     byte [edi+OF_MODE], 0 ; Scan open files table 
  1563 0000C084 760A                <1> 	jna     short sysopen_5
  1564 0000C086 6647                <1> 	inc	di
  1565 0000C088 6683FF0A            <1> 	cmp     di, OPENFILES ; max. number of open files (=10)
  1566 0000C08C 72EF                <1> 	jb	short sysopen_4
  1567 0000C08E EBE6                <1> 	jmp	short toomanyf
  1568                              <1> 
  1569                              <1> sysopen_5:
  1570 0000C090 FEC2                <1> 	inc	dl
  1571 0000C092 8897[0A420100]      <1>         mov     [edi+OF_MODE], dl
  1572 0000C098 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  1573 0000C09E 8897[00420100]      <1>         mov     [edi+OF_DRIVE], dl ; Logical DOS drive number
  1574 0000C0A4 66C1E702            <1> 	shl	di, 2 ; *4 (dword offset)
  1575                              <1> 
  1576 0000C0A8 8987[50420100]      <1> 	mov	[edi+OF_SIZE], eax ; File size in bytes
  1577                              <1> 
  1578 0000C0AE 668B4314            <1>         mov 	ax, [ebx+DirEntry_FstClusHI]
  1579 0000C0B2 C1E010              <1> 	shl	eax, 16
  1580 0000C0B5 668B431A            <1> 	mov 	ax, [ebx+DirEntry_FstClusLO]
  1581 0000C0B9 8987[D8410100]      <1> 	mov     [edi+OF_FCLUSTER], eax ; First cluster
  1582 0000C0BF 8987[F0420100]      <1> 	mov     [edi+OF_CCLUSTER], eax ; Current cluster
  1583                              <1> 
  1584 0000C0C5 31DB                <1>         xor	ebx, ebx
  1585 0000C0C7 899F[28420100]      <1>         mov     [edi+OF_POINTER], ebx ; offset pointer (0)
  1586 0000C0CD 899F[18430100]      <1>         mov     [edi+OF_CCINDEX], ebx ; cluster index (0)
  1587                              <1> 
  1588 0000C0D3 A1[BC3B0100]        <1> 	mov	eax, [FindFile_DirFirstCluster]
  1589 0000C0D8 8987[78420100]      <1> 	mov	[edi+OF_DIRFCLUSTER], eax
  1590                              <1> 
  1591 0000C0DE A1[C03B0100]        <1> 	mov	eax, [FindFile_DirCluster]
  1592 0000C0E3 8987[A0420100]      <1> 	mov	[edi+OF_DIRCLUSTER], eax
  1593                              <1> 
  1594                              <1> 	; Get (& Save) Volume ID 
  1595                              <1> 	; Important for files of removable drives
  1596                              <1> 	; (In order to check the drive has same volume/disk)
  1597 0000C0E9 88D7                <1> 	mov	bh, dl
  1598 0000C0EB 81C300010900        <1>         add	ebx, Logical_DOSDisks
  1599 0000C0F1 8A4303              <1>         mov	al, [ebx+LD_FATType]
  1600 0000C0F4 3C01                <1>         cmp	al, 1
  1601 0000C0F6 7209                <1>         jb	short sysopen_6_fs
  1602 0000C0F8 3C02                <1>         cmp	al, 2
  1603 0000C0FA 770A                <1>         ja	short sysopen_6_fat32
  1604                              <1> sysopen_6_fat:
  1605 0000C0FC 8B432D              <1>         mov	eax, [ebx+LD_BPB+VolumeID]
  1606 0000C0FF EB08                <1>         jmp	short sysopen_7
  1607                              <1> sysopen_6_fs:
  1608 0000C101 8B4328              <1>         mov	eax, [ebx+LD_FS_VolumeSerial]
  1609 0000C104 EB03                <1>         jmp	short sysopen_7
  1610                              <1> sysopen_6_fat32:
  1611 0000C106 8B4349              <1>         mov	eax, [ebx+LD_BPB+FAT32_VolID]
  1612                              <1> sysopen_7:
  1613 0000C109 A3[9C310100]        <1>         mov	[Current_VolSerial], eax
  1614                              <1> 
  1615 0000C10E 8987[C8420100]      <1> 	mov	[edi+OF_VOLUMEID], eax
  1616                              <1> 
  1617                              <1> 	; 24/10/2016
  1618 0000C114 66D1EF              <1> 	shr	di, 1 ; 4/2, word offset
  1619 0000C117 668B1D[C43B0100]    <1> 	mov	bx, [FindFile_DirEntryNumber]
  1620 0000C11E 66899F[40430100]    <1> 	mov	[edi+OF_DIRENTRY], bx
  1621                              <1> 
  1622 0000C125 31D2                <1> 	xor	edx, edx
  1623                              <1> 	;shr	di, 2 ; /4 (byte offset)
  1624 0000C127 66D1EF              <1> 	shr	di, 1 ; 2/2, byte offset
  1625 0000C12A 8897[1E420100]      <1> 	mov	byte [edi+OF_OPENCOUNT], dl ; 0
  1626 0000C130 8897[14420100]      <1> 	mov	byte [edi+OF_STATUS], dl ; 0
  1627                              <1> 
  1628 0000C136 89FB                <1> 	mov	ebx, edi
  1629 0000C138 FEC3                <1> 	inc	bl
  1630                              <1> 
  1631 0000C13A 889E[22470100]      <1>         mov     [esi+u.fp], bl ; Open File Entry Number
  1632 0000C140 8935[1C470100]      <1> 	mov     [u.r0], esi ; move index to u.fp list 
  1633                              <1> 			    ; into eax on stack
  1634                              <1> 
  1635 0000C146 E8002A0000          <1>         call 	reset_working_path
  1636                              <1>         
  1637 0000C14B E95DFAFFFF          <1> 	jmp	sysret
  1638                              <1> 
  1639                              <1> 	; (Retro UNIX 386 v1.0)
  1640                              <1> 	; 'fsp' table (10 bytes/entry)
  1641                              <1> 	; bit 15				   bit 0
  1642                              <1> 	; ---|-------------------------------------------
  1643                              <1> 	; r/w|		i-number of open file
  1644                              <1> 	; ---|-------------------------------------------
  1645                              <1> 	;		   device number
  1646                              <1> 	; -----------------------------------------------
  1647                              <1> 	; offset pointer, r/w pointer to file (bit 0-15)
  1648                              <1> 	; -----------------------------------------------
  1649                              <1> 	; offset pointer, r/w pointer to file (bit 16-31)
  1650                              <1> 	; ----------------------|------------------------
  1651                              <1> 	;  flag that says file 	| number of processes
  1652                              <1> 	;   has been deleted	| that have file open 
  1653                              <1> 	; ----------------------|------------------------
  1654                              <1> 
  1655                              <1> sysopen_device:
  1656                              <1> 	; 15/10/2016
  1657                              <1> 	; 08/10/2016
  1658                              <1> 	; 07/10/2016 (TRDOS 386 = TRDOS v2.0)
  1659 0000C150 51                  <1> 	push	ecx ; open mode
  1660 0000C151 89E5                <1> 	mov	ebp, esp
  1661 0000C153 B910000000          <1> 	mov	ecx, 16 ; transfer length = 16 bytes 
  1662 0000C158 29CC                <1> 	sub	esp, ecx
  1663 0000C15A 89E7                <1> 	mov	edi, esp ; destination address 
  1664 0000C15C 89DE                <1> 	mov 	esi, ebx ; dev name in user's memory space
  1665 0000C15E E8611D0000          <1> 	call	transfer_from_user_buffer
  1666 0000C163 7310                <1> 	jnc	short sysopen_dev_0
  1667                              <1> 	; eax = ERR_OUT_OF_MEMORY = 4 = ERR_MINOR_IM
  1668 0000C165 59                  <1> 	pop	ecx
  1669                              <1> sysopen_dev_err:
  1670 0000C166 A3[1C470100]        <1> 	mov	[u.r0], eax
  1671 0000C16B A3[80470100]        <1> 	mov	[u.error], eax
  1672 0000C170 E918FAFFFF          <1> 	jmp	error
  1673                              <1> sysopen_dev_0:
  1674 0000C175 89FE                <1> 	mov	esi, edi ; Device name addr (max. 16 bytes, ASCIIZ) 
  1675                              <1> 			 ; for example: "tty, TTY, /dev/tty"
  1676 0000C177 E8432A0000          <1> 	call	get_device_number
  1677 0000C17C 89EC                <1> 	mov	esp, ebp
  1678 0000C17E 59                  <1> 	pop	ecx
  1679 0000C17F 7307                <1> 	jnc	short sysopen_dev_1
  1680 0000C181 B818000000          <1> 	mov	eax, ERR_INV_DEV_NAME ; 24 ; 'invalid device name !'
  1681 0000C186 EBDE                <1> 	jmp	short sysopen_dev_err
  1682                              <1> sysopen_dev_1:
  1683                              <1> 	; eax = Device Number (AL)
  1684                              <1> 	;  cl = Open mode (2 = device read, 3 = device write)
  1685 0000C188 31DB                <1>         xor     ebx, ebx ; 0
  1686                              <1> sysopen_dev_2: ; scan the list of entries
  1687 0000C18A 389B[22470100]      <1>         cmp     [ebx+u.fp], bl ; 0
  1688 0000C190 760E                <1>         jna     short sysopen_dev_3 ; empty slot
  1689 0000C192 FEC3                <1>         inc     bl
  1690 0000C194 80FB0A              <1>         cmp     bl, 10
  1691 0000C197 72F1                <1> 	jb	short sysopen_dev_2
  1692                              <1> 	;
  1693 0000C199 B80D000000          <1> 	mov	eax, ERR_TOO_MANY_FILES ; too many open files !
  1694 0000C19E EBC6                <1> 	jmp	short sysopen_dev_err
  1695                              <1> sysopen_dev_3:
  1696 0000C1A0 891D[1C470100]      <1> 	mov 	[u.r0], ebx ; File/Device index/handle/descriptor
  1697                              <1> 	; eax = device number (entry offset)
  1698 0000C1A6 8AA8[9C3F0100]      <1> 	mov	ch, [eax+DEV_ACCESS] ; bit 0 = accessable by users
  1699                              <1> 				     ; bit 1 = read access perm
  1700                              <1> 				     ; bit 2 = write access perm
  1701                              <1> 				     ; bit 3 = IOCTL permit to users
  1702                              <1> 				     ; bit 4 = block device if set
  1703                              <1> 				     ; bit 5 = 16 bit or 1024 byte
  1704                              <1> 				     ; bit 6 = 32 bit or 2048 byte
  1705                              <1> 				     ; bit 7 = installable device drv
  1706 0000C1AC F6C501              <1> 	test 	ch, 1 ; accessable by normal users (except root)
  1707 0000C1AF 7510                <1> 	jnz	short sysopen_dev_4 ; yes, permission has been given
  1708 0000C1B1 803D[68470100]00    <1> 	cmp	byte [u.uid], 0 ; root?
  1709 0000C1B8 7607                <1> 	jna	short sysopen_dev_4 ; superuser can open all devices
  1710                              <1> sysopen_dev_perm_err:
  1711 0000C1BA B80B000000          <1> 	mov	eax, ERR_DEV_ACCESS  ; 11  = 'permission denied !'
  1712 0000C1BF EBA5                <1> 	jmp	short sysopen_dev_err
  1713                              <1> sysopen_dev_4:
  1714 0000C1C1 D0ED                <1> 	shr	ch, 1 ; result: 1 = read, 2 = write, 3 = r & w 
  1715 0000C1C3 FEC9                <1> 	dec	cl  ; result: 1 = read, 2 = write
  1716 0000C1C5 84E9                <1> 	test	cl, ch
  1717 0000C1C7 74F1                <1> 	jz	short sysopen_dev_perm_err 
  1718                              <1> 
  1719 0000C1C9 D0E5                <1> 	shl	ch, 1 ; bit 0 = 0
  1720                              <1> 	; eax = device number (entry offset)
  1721 0000C1CB E80B2B0000          <1> 	call	device_open
  1722 0000C1D0 72E8                <1> 	jc	short sysopen_dev_perm_err 
  1723                              <1> 
  1724                              <1> 	; eax = device number (entry offset)
  1725 0000C1D2 0C80                <1> 	or	al, 80h ; set device bit (set bit 7 to 1)
  1726 0000C1D4 8B1D[1C470100]      <1> 	mov	ebx, [u.r0]
  1727 0000C1DA 8883[22470100]      <1> 	mov	[ebx+u.fp], al	; bit 7 (=1) points to device	
  1728                              <1> 	
  1729 0000C1E0 E9C8F9FFFF          <1> 	jmp	sysret
  1730                              <1> 
  1731                              <1> sysmkdir: ; < make directory >
  1732                              <1> 	; 15/10/2016
  1733                              <1> 	; 10/10/2016 (TRDOS 386 = TRDOS v2.0) 
  1734                              <1> 	;	     -derived from INT_21H.ASM-
  1735                              <1> 	;            ("loc_INT21h_create_file")
  1736                              <1>         ; 	10/07/2011 (12/03/2011)
  1737                              <1>         ;	INT 21h Function AH = 3Ch
  1738                              <1>         ;	Create File
  1739                              <1>         ;	INPUT
  1740                              <1>         ;	   CX = Attributes
  1741                              <1>         ;          DS:DX= Address of zero terminaned path name
  1742                              <1>         ;
  1743                              <1>         ;
  1744                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  1745                              <1> 	; 27/05/2013 - 02/08/2013 (Retro UNIX 8086 v1)
  1746                              <1> 	;
  1747                              <1> 	; 'sysmkdir' creates an empty directory whose name is
  1748                              <1> 	; pointed to by arg 1. The mode of the directory is arg 2.	
  1749                              <1> 	; The special entries '.' and '..' are not present.
  1750                              <1> 	; Errors are indicated if the directory already exists or		
  1751                              <1> 	; user is not the super user. 
  1752                              <1> 	;
  1753                              <1> 	; Calling sequence:
  1754                              <1> 	;	sysmkdir; name; mode
  1755                              <1> 	; Arguments:
  1756                              <1> 	;	name - points to the name of the directory
  1757                              <1> 	;	mode - mode of the directory
  1758                              <1> 	; Inputs: (arguments)
  1759                              <1> 	; Outputs: -
  1760                              <1> 	;    (sets 'directory' flag to 1; 
  1761                              <1> 	;    'set user id on execution' and 'executable' flags to 0)
  1762                              <1> 	; ...............................................................
  1763                              <1> 	;				
  1764                              <1> 	; Retro UNIX 8086 v1 modification: 
  1765                              <1> 	;       'sysmkdir' system call has two arguments; so,
  1766                              <1> 	;	* 1st argument, name is pointed to by BX register
  1767                              <1> 	;	* 2nd argument, mode is in CX register
  1768                              <1> 	;
  1769                              <1> 	; TRDOS 386 (10/10/2016)
  1770                              <1> 	;	
  1771                              <1>         ; INPUT ->
  1772                              <1>         ;	   CL = Directory Attributes
  1773                              <1> 	;     	      bit 0 (1) - Read only file/dir (R)
  1774                              <1> 	;             bit 1 (1) - Hidden file/dir (H)
  1775                              <1>         ;             bit 2 (1) - System file/dir (R)
  1776                              <1> 	;             bit 3 (1) - Volume label/name (V)
  1777                              <1>         ;             bit 4 (1) - Subdirectory (D)
  1778                              <1> 	;	      bit 5 (1) - File/Dir has been archived (A)
  1779                              <1> 	;	   CX = 0 -> create normal directory	 	
  1780                              <1>         ;          EBX = Pointer to directory name (ASCIIZ) -path-
  1781                              <1> 	;	
  1782                              <1> 	; OUTPUT ->
  1783                              <1> 	;          eax = First cluster of the new directory
  1784                              <1> 	;          cf = 1 -> Error code in AL
  1785                              <1> 	;
  1786                              <1> 	; Modified Registers: EAX (at the return of system call)
  1787                              <1> 	;  
  1788                              <1> 	; Note: If the file or directory is existing
  1789                              <1> 	;	an access error will be returned. 
  1790                              <1> 
  1791 0000C1E5 6621C9              <1> 	and	cx, cx ; if cx = 0 -> create a normal subdir
  1792 0000C1E8 7413                <1> 	jz	short sysmkdir_1
  1793                              <1> 
  1794 0000C1EA F6C110              <1> 	test	cl, 10h ; if dir flags set, also use other flags
  1795 0000C1ED 0F853DFDFFFF        <1> 	jnz	sysmkdir_0 ; jump to head of 'syscreat'
  1796                              <1> 
  1797                              <1> 	; CX has wrong flags
  1798 0000C1F3 B817000000          <1> 	mov 	eax, ERR_INV_FLAGS
  1799 0000C1F8 E969FFFFFF          <1> 	jmp	sysopen_dev_err
  1800                              <1> 
  1801                              <1> sysmkdir_1:
  1802 0000C1FD B110                <1> 	mov	cl, 10h ; set subdir flag and reset other flags
  1803 0000C1FF E92CFDFFFF          <1> 	jmp	sysmkdir_0 ; jump to head of 'syscreat'
  1804                              <1> sysmkdir_2: 
  1805                              <1> 	; jump from 'syscreat' ; from 'syscreat_1'
  1806                              <1> 	;  CL = Directory attributes/flags  
  1807 0000C204 BE[8C3B0100]        <1> 	mov	esi, FindFile_Name 
  1808 0000C209 E806D8FFFF          <1> 	call	make_sub_directory
  1809 0000C20E 0F821BFEFFFF        <1> 	jc	sysopen_err       ; NOTE: Old type (TRDOS 8086)
  1810                              <1> 				  ; error codes must be modified
  1811                              <1> 				  ; for next TRDOS 386 versions
  1812                              <1> 				  ; (10/10/2016)
  1813                              <1> 				  ; Old (MSDOS type)
  1814                              <1> 				  ; error codes (2011):
  1815                              <1> 				  ;  2 = file not found
  1816                              <1> 				  ;  3 = directory not found
  1817                              <1> 				  ;  5 = access denied
  1818                              <1> 				  ; 12 = no more files
  1819                              <1> 			          ; 19 = disk write protected   
  1820                              <1> 				  ; 39 = insufficient disk space
  1821                              <1> 				  ; 'sysdefs.s' ; 10/10/2016  	
  1822                              <1> 	
  1823 0000C214 A3[1C470100]        <1> 	mov	[u.r0], eax ; New sub dir's first cluster
  1824                              <1> 
  1825 0000C219 E82D290000          <1>         call 	reset_working_path
  1826                              <1> 
  1827 0000C21E E98AF9FFFF          <1> 	jmp	sysret	
  1828                              <1> 
  1829                              <1> sysclose: ;<close file>
  1830                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0) 
  1831                              <1> 	;
  1832                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  1833                              <1> 	; 22/05/2013 - 26/05/2013 (Retro UNIX 8086 v1)
  1834                              <1> 	;
  1835                              <1> 	; 'sysclose', given a file descriptor in 'u.r0', closes the
  1836                              <1> 	; associated file. The file descriptor (index to 'u.fp' list)
  1837                              <1> 	; is put in r1 and 'fclose' is called.
  1838                              <1> 	;
  1839                              <1> 	; Calling sequence:
  1840                              <1> 	;	sysclose
  1841                              <1> 	; Arguments:
  1842                              <1> 	;	-  
  1843                              <1> 	; Inputs: *u.r0 - file descriptor
  1844                              <1> 	; Outputs: -
  1845                              <1> 	; ...............................................................
  1846                              <1> 	;				
  1847                              <1> 	; Retro UNIX 8086 v1 modification:
  1848                              <1> 	;	 The user/application program puts file descriptor
  1849                              <1> 	;        in BX register as 'sysclose' system call argument.
  1850                              <1> 	; 	 (argument transfer method 1)
  1851                              <1> 
  1852                              <1> 	; TRDOS 386 (06/10/2016)
  1853                              <1> 	;	
  1854                              <1>         ; INPUT ->
  1855                              <1>         ;	   EBX = File Handle/Number (file index) (AL)
  1856                              <1> 	; OUTPUT ->
  1857                              <1> 	;          cf = 0 -> EAX = 0
  1858                              <1> 	;          cf = 1 -> Error code in EAX (ERR_FILE_NOT_OPEN)
  1859                              <1> 	;
  1860                              <1> 	; Modified Registers: EAX (at the return of system call)
  1861                              <1> 	;  
  1862                              <1> 
  1863 0000C223 89D8                <1> 	mov 	eax, ebx
  1864 0000C225 31DB                <1> 	xor	ebx, ebx	
  1865 0000C227 891D[1C470100]      <1> 	mov	[u.r0], ebx ; 0  ; return value of EAX
  1866 0000C22D E8970E0000          <1> 	call 	fclose
  1867 0000C232 0F8375F9FFFF        <1> 	jnc	sysret
  1868 0000C238 B80A000000          <1> 	mov	eax, ERR_FILE_NOT_OPEN ; file not open !
  1869 0000C23D A3[80470100]        <1> 	mov	[u.error], eax ;
  1870 0000C242 A3[1C470100]        <1> 	mov	[u.r0], eax ; ! invalid handle !
  1871 0000C247 E941F9FFFF          <1> 	jmp	error
  1872                              <1> 
  1873                              <1> sysread: ; < read from file >
  1874                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0) 
  1875                              <1> 	;	     -derived from INT_21H.ASM-
  1876                              <1> 	;            ("loc_INT21h_read_file")
  1877                              <1>         ; 	13/03/2011 (05/03/2011)
  1878                              <1>         ;	INT 21h Function AH = 3Fh
  1879                              <1>         ;	Read from a File
  1880                              <1>         ;	INPUT
  1881                              <1> 	;	   BX = File Handle
  1882                              <1>         ;	   CX = Number of bytes to read
  1883                              <1>         ;          DS:DX= Buffer address
  1884                              <1>         ;
  1885                              <1> 	; Note: TRDOS 386 'sysread' has been derived from 
  1886                              <1> 	;	Retro UNIX 386 v1 'sysread', except a few 
  1887                              <1> 	;	code modifications.
  1888                              <1> 	;
  1889                              <1> 	; 13/05/2015 (Retro UNIX 386 v1)
  1890                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  1891                              <1> 	; 23/05/2013 (Retro UNIX 8086 v1)
  1892                              <1> 	;
  1893                              <1> 	; 'sysread' is given a buffer to read into and the number of
  1894                              <1> 	; characters to be read. If finds the file from the file
  1895                              <1> 	; descriptor located in *u.r0 (r0). This file descriptor
  1896                              <1> 	; is returned from a successful open call (sysopen).
  1897                              <1> 	; The i-number of file is obtained via 'rw1' and the data
  1898                              <1> 	; is read into core via 'readi'.
  1899                              <1> 	;
  1900                              <1> 	; Calling sequence:
  1901                              <1> 	;	sysread; buffer; nchars
  1902                              <1> 	; Arguments:
  1903                              <1> 	;	buffer - location of contiguous bytes where 
  1904                              <1> 	;		 input will be placed.
  1905                              <1> 	;	nchars - number of bytes or characters to be read.
  1906                              <1> 	; Inputs: *u.r0 - file descriptor (& arguments)
  1907                              <1> 	; Outputs: *u.r0 - number of bytes read.	
  1908                              <1> 	; ...............................................................
  1909                              <1> 	;				
  1910                              <1> 	; Retro UNIX 8086 v1 modification: 
  1911                              <1> 	;       'sysread' system call has three arguments; so,
  1912                              <1> 	;	* 1st argument, file descriptor is in BX register
  1913                              <1> 	;	* 2nd argument, buffer address/offset in CX register
  1914                              <1> 	;	* 3rd argument, number of bytes is in DX register
  1915                              <1> 	;
  1916                              <1> 	;	AX register (will be restored via 'u.r0') will return
  1917                              <1> 	;	to the user with number of bytes read. 
  1918                              <1> 	;
  1919                              <1> 	; TRDOS 386 (05/10/2016)
  1920                              <1> 	;	
  1921                              <1>         ; INPUT ->
  1922                              <1>         ;	   EBX = File handle (descriptor/index)
  1923                              <1> 	;	   ECX = Buffer address		
  1924                              <1>         ;          EDX = Number of bytes
  1925                              <1> 	; OUTPUT ->
  1926                              <1> 	;          EAX = Number of bytes have been read
  1927                              <1> 	;          cf = 1 -> Error code in AL
  1928                              <1> 	;
  1929                              <1> 	; Modified Registers: EAX (at the return of system call)
  1930                              <1> 	; 
  1931                              <1> 
  1932                              <1> 	; EBX = File descriptor
  1933 0000C24C E8C60E0000          <1> 	call	getf1 
  1934 0000C251 7277                <1> 	jc	short device_read ; read data from device
  1935                              <1> 	; EAX = First cluster of the file
  1936                              <1> 
  1937 0000C253 E83F000000          <1> 	call	rw1
  1938 0000C258 730A                <1> 	jnc	short sysread_0
  1939                              <1> 
  1940 0000C25A A3[1C470100]        <1> 	mov	[u.r0], eax ; error code
  1941 0000C25F E929F9FFFF          <1> 	jmp	error
  1942                              <1> 	 
  1943                              <1> sysread_0:
  1944 0000C264 E856170000          <1> 	call	readi
  1945 0000C269 EB1D                <1> 	jmp	short rw0
  1946                              <1> 
  1947                              <1> syswrite: ; < write to file >
  1948                              <1> 	; 23/10/2016
  1949                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0) 
  1950                              <1> 	;	     -derived from INT_21H.ASM-
  1951                              <1> 	;            ("loc_INT21h_write_file")
  1952                              <1>         ; 	13/03/2011 (05/03/2011)
  1953                              <1>         ;	INT 21h Function AH = 40h
  1954                              <1>         ;	Write to a File
  1955                              <1>         ;	INPUT
  1956                              <1> 	;	   BX = File Handle
  1957                              <1>         ;	   CX = Number of bytes to write
  1958                              <1>         ;          DS:DX= Buffer address
  1959                              <1>         ;
  1960                              <1> 	; Note: TRDOS 386 'sysrwrite' has been derived from 
  1961                              <1> 	;	Retro UNIX 386 v1 'syswrite', except a few 
  1962                              <1> 	;	code modifications.
  1963                              <1> 	;
  1964                              <1> 
  1965                              <1> 	; 13/05/2015 (Retro UNIX 386 v1)
  1966                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  1967                              <1> 	; 23/05/2013 (Retro UNIX 8086 v1)
  1968                              <1> 	;
  1969                              <1> 	; 'syswrite' is given a buffer to write onto an output file
  1970                              <1> 	; and the number of characters to write. If finds the file
  1971                              <1> 	; from the file descriptor located in *u.r0 (r0). This file 
  1972                              <1> 	; descriptor is returned from a successful open or create call
  1973                              <1> 	; (sysopen or syscreat). The i-number of file is obtained via
  1974                              <1> 	; 'rw1' and buffer is written on the output file via 'write'.
  1975                              <1> 	;
  1976                              <1> 	; Calling sequence:
  1977                              <1> 	;	syswrite; buffer; nchars
  1978                              <1> 	; Arguments:
  1979                              <1> 	;	buffer - location of contiguous bytes to be writtten.
  1980                              <1> 	;	nchars - number of characters to be written.
  1981                              <1> 	; Inputs: *u.r0 - file descriptor (& arguments)
  1982                              <1> 	; Outputs: *u.r0 - number of bytes written.	
  1983                              <1> 	; ...............................................................
  1984                              <1> 	;				
  1985                              <1> 	; Retro UNIX 8086 v1 modification: 
  1986                              <1> 	;       'syswrite' system call has three arguments; so,
  1987                              <1> 	;	* 1st argument, file descriptor is in BX register
  1988                              <1> 	;	* 2nd argument, buffer address/offset in CX register
  1989                              <1> 	;	* 3rd argument, number of bytes is in DX register
  1990                              <1> 	;
  1991                              <1> 	;	AX register (will be restored via 'u.r0') will return
  1992                              <1> 	;	to the user with number of bytes written. 
  1993                              <1> 	;
  1994                              <1> 	; INPUT ->
  1995                              <1>         ;	   EBX = File handle (descriptor/index)
  1996                              <1> 	;	   ECX = Buffer address		
  1997                              <1>         ;          EDX = Number of bytes
  1998                              <1> 	; OUTPUT ->
  1999                              <1> 	;          EAX = Number of bytes have been written
  2000                              <1> 	;          cf = 1 -> Error code in AL
  2001                              <1> 	;
  2002                              <1> 	; Modified Registers: EAX (at the return of system call)
  2003                              <1> 	;  
  2004                              <1> 
  2005                              <1> 	; EBX = File descriptor
  2006 0000C26B E8A70E0000          <1> 	call	getf1 
  2007 0000C270 7274                <1> 	jc	short device_write ; write data to device
  2008                              <1> 	; EAX = First cluster of the file
  2009                              <1> 	; EBX = File number  (Open file number) ; 23/10/2016
  2010                              <1> 
  2011 0000C272 E820000000          <1> 	call	rw1
  2012 0000C277 730A                <1> 	jnc	short syswrite_0
  2013 0000C279 A3[1C470100]        <1> 	mov	[u.r0], eax ; error code
  2014 0000C27E E90AF9FFFF          <1> 	jmp	error
  2015                              <1> 	 
  2016                              <1> syswrite_0:
  2017 0000C283 E8541E0000          <1> 	call	writei
  2018                              <1> rw0: ; 1:
  2019 0000C288 A1[44470100]        <1>         mov	eax, [u.nread]
  2020 0000C28D A3[1C470100]        <1> 	mov	[u.r0], eax
  2021 0000C292 E916F9FFFF          <1> 	jmp	sysret
  2022                              <1> 
  2023                              <1> rw1:	
  2024                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0) 
  2025                              <1> 	; 14/05/2015 (Retro UNIX 386 v1)
  2026                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  2027                              <1> 	; 23/05/2013 - 24/05/2013 (Retro UNIX 8086 v1)
  2028                              <1> 	; System call registers: ebx, ecx, edx (through 'sysenter')
  2029                              <1> 	;
  2030                              <1> 	; EBX = File descriptor
  2031                              <1> 	;call	getf1 ; calling point in 'getf' from 'rw1'
  2032                              <1> 	;jc	short device_rw ; read/write data from/to device
  2033                              <1> 	; EAX = First cluster of the file
  2034                              <1> 
  2035 0000C297 83F802              <1> 	cmp 	eax, 2
  2036 0000C29A 7217                <1> 	jb	short rw2
  2037                              <1> 	;
  2038 0000C29C 890D[3C470100]      <1> 	mov	[u.base], ecx 	; buffer address/offset 
  2039                              <1> 				;(in the user's virtual memory space)
  2040 0000C2A2 8915[40470100]      <1> 	mov	[u.count], edx 
  2041                              <1> 
  2042 0000C2A8 C705[80470100]0000- <1>         mov     dword [u.error], 0 ; reset the last error code
  2042 0000C2B0 0000                <1>
  2043 0000C2B2 C3                  <1> 	retn
  2044                              <1> 
  2045                              <1> rw2:
  2046 0000C2B3 B80A000000          <1> 	mov	eax, ERR_FILE_NOT_OPEN ; file not open !
  2047 0000C2B8 A3[80470100]        <1> 	mov	dword [u.error], eax
  2048 0000C2BD C3                  <1> 	retn
  2049                              <1> rw3: 
  2050 0000C2BE B80B000000          <1> 	mov	eax, ERR_FILE_ACCESS ; permission denied !
  2051 0000C2C3 A3[80470100]        <1> 	mov	dword [u.error], eax
  2052 0000C2C8 F9                  <1> 	stc
  2053 0000C2C9 C3                  <1> 	retn
  2054                              <1> 
  2055                              <1> device_read:
  2056                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2057                              <1> 	; cl = DEV_OPENMODE ; open mode
  2058                              <1> 	; ch = DEV_ACCESS   ; access flags   
  2059                              <1> 	; al = DEV_DRIVER   ; device number (eax)
  2060                              <1> 
  2061 0000C2CA F6C101              <1> 	test	cl, 1 ; 1 = read, 2 = write, 3 = read&write
  2062 0000C2CD 74EF                <1> 	jz	short rw3
  2063                              <1> 
  2064 0000C2CF 89C3                <1> 	mov	ebx, eax
  2065 0000C2D1 66C1E302            <1> 	shl	bx, 2 ; *4
  2066                              <1> 
  2067 0000C2D5 F6C580              <1> 	test	ch, 80h ; bit 7, installable device driver flag
  2068 0000C2D8 7406                <1> 	jz	short d_read_2 ; Kernel device
  2069                              <1> 	; installable device
  2070                              <1> d_read_1:
  2071 0000C2DA FFA3[583F0100]      <1>         jmp	dword [ebx+IDEV_RADDR-4]
  2072                              <1> d_read_2:
  2073 0000C2E0 FFA3[86F50000]      <1> 	jmp	dword [ebx+KDEV_RADDR-4]
  2074                              <1> 
  2075                              <1> device_write:
  2076                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2077                              <1> 	; cl = DEV_OPENMODE ; open mode
  2078                              <1> 	; ch = DEV_ACCESS   ; access flags   
  2079                              <1> 	; al = DEV_DRIVER   ; device number (eax)
  2080                              <1> 
  2081 0000C2E6 F6C102              <1> 	test	cl, 2 ; 1 = read, 2 = write, 3 = read&write
  2082 0000C2E9 74D3                <1> 	jz	short rw3	
  2083                              <1> 
  2084 0000C2EB 89C3                <1> 	mov	ebx, eax
  2085 0000C2ED 66C1E302            <1> 	shl	bx, 2 ; *4
  2086                              <1> 
  2087 0000C2F1 F6C580              <1> 	test	ch, 80h ; bit 7, installable device driver flag
  2088 0000C2F4 7406                <1> 	jz	short d_write_2 ; Kernel device
  2089                              <1> 	; installable device
  2090                              <1> d_write_1:
  2091 0000C2F6 FFA3[783F0100]      <1>         jmp	dword [ebx+IDEV_WADDR-4]
  2092                              <1> d_write_2:
  2093 0000C2FC FFA3[D6F50000]      <1> 	jmp	dword [ebx+KDEV_WADDR-4]
  2094                              <1> 
  2095                              <1> 
  2096                              <1> sysemt: ; enable (or disable) multi tasking -time sharing-
  2097                              <1> 	;
  2098                              <1> 	; 23/05/2016 - TRDOS 386 (TRDOS v2.0)
  2099                              <1> 	; 14/05/2015 (Retro UNIX 386 v1)
  2100                              <1> 	; 10/12/2013 - 20/04/2014 (Retro UNIX 8086 v1)
  2101                              <1> 	;
  2102                              <1> 	; Retro UNIX 8086 v1 modification: 
  2103                              <1> 	;	'Enable Multi Tasking'  system call instead 
  2104                              <1> 	;	of 'Emulator Trap' in original UNIX v1 for PDP-11.
  2105                              <1> 	;
  2106                              <1> 	; Retro UNIX 8086 v1 feature only!
  2107                              <1> 	;	Using purpose: Kernel will start without time-out
  2108                              <1> 	;	(internal clock/timer) functionality.
  2109                              <1> 	;	Then etc/init will enable clock/timer for
  2110                              <1> 	;	multi tasking. 
  2111                              <1> 	;
  2112                              <1> 	; INPUT ->
  2113                              <1> 	;	BL = 0 -> disable multi tasking
  2114                              <1> 	;	BL > 1 -> enable multi tasking (time sharing) 
  2115                              <1> 	; OUTPUT ->
  2116                              <1> 	;	none	
  2117                              <1> 	;
  2118                              <1> 	;  Note: Multi tasking is disabled during system
  2119                              <1> 	;	 initialization, it must be enabled by using
  2120                              <1> 	;	 this system call. (Otherwise, running proces 
  2121                              <1> 	;	 will not be changed by another process within
  2122                              <1> 	;	 run time sequence/schedule, if running process
  2123                              <1> 	;	 will not 'release' itself. Only 'wakeup' procedure
  2124                              <1> 	;	 for waiting processes and programmed timer events
  2125                              <1> 	;	 for other processes can change running process 
  2126                              <1> 	;	 while multi tasking is disabled.) ** 23/05/2016 **
  2127                              <1> 
  2128 0000C302 803D[68470100]00    <1> 	cmp	byte [u.uid], 0 ; root ?
  2129                              <1> 	;ja	error
  2130 0000C309 0F8730F9FFFF        <1> 	ja	badsys ; 14/05/2015
  2131                              <1> 	;
  2132 0000C30F FA                  <1> 	cli
  2133 0000C310 881D[763E0100]      <1> 	mov	[multi_tasking], bl ; 0 to disable, >0 to enable
  2134 0000C316 E992F8FFFF          <1> 	jmp	sysret
  2135                              <1> 
  2136                              <1> systimer:
  2137                              <1> 	; 02/01/2017
  2138                              <1> 	; 21/12/2016
  2139                              <1> 	; 19/12/2016
  2140                              <1> 	; 10/12/2016 (callback)
  2141                              <1> 	; 10/06/2016
  2142                              <1> 	; 07/06/2016
  2143                              <1> 	; 06/06/2016
  2144                              <1> 	; 21/05/2016
  2145                              <1> 	; 19/05/2016
  2146                              <1> 	; 18/05/2016 - TRDOS 386 (TRDOS v2.0)
  2147                              <1> 	; (TRDOS 386 feature only!)
  2148                              <1> 	;
  2149                              <1> 	; (start or stop timer event(s))	
  2150                              <1> 	;
  2151                              <1> 	; INPUT ->
  2152                              <1> 	;	BL = Signal return byte (response byte)
  2153                              <1> 	;	     (Any requested value between 0 and 255)
  2154                              <1> 	;	     (Kernel will put it at the requested address)    	
  2155                              <1> 	;	BH = Time count unit
  2156                              <1> 	;	     0 = Stop timer event
  2157                              <1> 	;	     1 = 18.2 ticks per second
  2158                              <1> 	;	     2 = 10 milliseconds  		
  2159                              <1> 	;	     3 = 1 second (for real time clock interrupt) 	 
  2160                              <1> 	;	     4 = time/tick count in current time count unit
  2161                              <1> 	;	    // 10/12/2016			
  2162                              <1> 	;	    80h = Stop timer event (callback method)
  2163                              <1> 	;	    81h = 18.2 ticks per second, callback method
  2164                              <1> 	;	    82h = 10 milliseconds, callback method 	
  2165                              <1> 	;	    83h = 1 second (for RTC int), callback method 	
  2166                              <1> 	;	    84h = current time count unit, callback method
  2167                              <1> 	;
  2168                              <1> 	;	    Note: Only 03h or 83h will set real time clock
  2169                              <1> 	;		  (RTC) events (Others are for PIT events)! 	
  2170                              <1> 	;	
  2171                              <1> 	;	NOTE: If callback (user service) method is used,
  2172                              <1> 	;	    EDX will point to the return address (of service
  2173                              <1> 	;	    procedure) in user's space instead of signal 
  2174                              <1> 	;	    response byte address. (TRDOS 386 kernel will
  2175                              <1> 	;	    direct the cpu to that address -in user's space-
  2176                              <1> 	;	    at the return of system call or interrupt 
  2177                              <1> 	;	    just after the adjusted count/time is elapsed.)
  2178                              <1> 	;	    User's sevice routine must be ended with a
  2179                              <1> 	;	    'iret'. Normal return addresses from system 
  2180                              <1> 	;	    calls or and interrupts will be kept same except
  2181                              <1> 	;	    the timer returns. 			
  2182                              <1>      	;
  2183                              <1> 	;	BH = 0 -> Stop timer event
  2184                              <1> 	;	BL = Timer event number (1 to 255) if BH = 0     	
  2185                              <1> 	;	     If BL = 0, all timer events (which are belongs
  2186                              <1> 	;	      to running process) will be stopped 		    
  2187                              <1> 	;	ECX = Time/Tick count (depending on time count unit)
  2188                              <1> 	;	EDX = Signal return (Response) byte address
  2189                              <1> 	;	      (virtual address in user's memory space)
  2190                              <1> 	; OUTPUT ->
  2191                              <1> 	;	AL = Timer event number	(1 to 255) (max. value = 16)
  2192                              <1> 	;	IF BH Input = 0 & CF = 0 & AL = 0 -> 
  2193                              <1> 	;	     timer event(s) has/have been stopped/finished
  2194                              <1> 	;	CF = 1 & AL = 0 -> no timer setting space to set
  2195                              <1> 	;	CF = 1 & AL > 0 -> timer count unit is not usable
  2196                              <1> 	;
  2197                              <1> 	;	NOTE: To modify a time count for a user function,
  2198                              <1> 	;	      at first, current timer event must be stopped
  2199                              <1> 	;	      then a new timer event (which is related with
  2200                              <1> 	;	      same user function) must be started.
  2201                              <1> 	;		
  2202                              <1> 	;	      Signal return (response) byte may be used for 
  2203                              <1> 	;	      several purposes. Kernel will put this value 
  2204                              <1> 	;	      to requested address during timer interrupt,
  2205                              <1> 	;	      program/user can check this value to understand
  2206                              <1> 	;	      which event has been occurred and what is changed.
  2207                              <1> 	;	      (Multi timer events can share same signal address)
  2208                              <1> 	;	
  2209                              <1> 	;	NOTE: If the process is running while the time count
  2210                              <1> 	;	      is reached, kernel will put signal return (response)
  2211                              <1> 	;	      byte value at requested address during timer
  2212                              <1> 	;	      interrupt and the process will continue to run.
  2213                              <1> 	;	      Program/process must call (jump to) it's timer event
  2214                              <1> 	;	      function as required, for checking the timer event
  2215                              <1> 	;	      status via signal return (response) byte address. 
  2216                              <1> 	;
  2217                              <1> 	;	      If the process is not running (waiting or sleeping
  2218                              <1> 	;	      or released) while the time count is reached,
  2219                              <1> 	;	      it is restarted from where it left, to ensure
  2220                              <1> 	;	      proper multi media (video, audio, clock, timer)
  2221                              <1> 	;	      functionality.
  2222                              <1> 	;
  2223                              <1> 	;	      (It is better to use 'syswait' or 'syssleep',
  2224                              <1> 	;	      or 'sysrele' system call just after the timer
  2225                              <1> 	;	      function. Otherwise, timer events may block other
  2226                              <1> 	;	      processes which are not using timer events.)  	 		 			 		 	
  2227                              <1> 	;	     	      		 			
  2228                              <1> 	; Timer Event Structure: (max. 16 timer events, 16*16 bytes)
  2229                              <1> 	;       Owner:	        resb 1 ; 0 = free
  2230                              <1> 	;		  	       ;>0 = process number (u.uno)
  2231                              <1> 	;	Calback:	resb 1 ; 1 = callback, 0 = response byte
  2232                              <1> 	;	Interrupt:      resb 1 ; 0 = Timer interrupt (or none)
  2233                              <1> 	;		   	       ; 1 = Real Time Clock interrupt 
  2234                              <1> 	;	Response:       resb 1 ; 0 to 255, signal return value
  2235                              <1> 	;	Count Limit:	resd 1 ; count of ticks (total/set)
  2236                              <1> 	;	Current Count: 	resd 1 ; count of ticks (current)
  2237                              <1> 	;	Response Addr:  resd 1 ; response byte (pointer) address
  2238                              <1> 	;
  2239                              <1> 
  2240                              <1> 	; 19/12/2016 (timer callback)
  2241 0000C31B C605[B4430100]00    <1> 	mov	byte [tcallback], 0 
  2242 0000C322 C605[B5430100]00    <1> 	mov	byte [trtc], 0
  2243 0000C329 C705[88470100]0000- <1> 	mov	dword [u.tcb], 0 ; this is not necessary...
  2243 0000C331 0000                <1>
  2244                              <1> 
  2245 0000C333 80FF80              <1> 	cmp	bh, 80h
  2246 0000C336 7225                <1> 	jb	short systimer_cb2
  2247 0000C338 7704                <1> 	ja	short systimer_cb0
  2248                              <1> 
  2249 0000C33A 31D2                <1> 	xor	edx, edx ; 0, reset callback address
  2250 0000C33C EB0B                <1> 	jmp	short systimer_cb1
  2251                              <1> 
  2252                              <1> systimer_cb0:
  2253 0000C33E 80FF84              <1> 	cmp	bh, 84h	
  2254 0000C341 7764                <1> 	ja	short systimer_5 ;  undefined, error
  2255                              <1> 
  2256                              <1> 	;mov	byte [tcallback], 1 ; 19/12/2016
  2257 0000C343 FE05[B4430100]      <1> 	inc	byte [tcallback]
  2258                              <1> 
  2259                              <1> systimer_cb1:
  2260 0000C349 0FB635[6B470100]    <1> 	movzx	esi, byte [u.uno] ; process number
  2261 0000C350 66C1E602            <1> 	shl	si, 2	
  2262 0000C354 8996[C4440100]      <1> 	mov	[esi+p.tcb-4], edx ; set process timer callback address
  2263                              <1> 				   ; (overwrite prev value if it is set!)
  2264 0000C35A 80E77F              <1> 	and	bh, 7Fh
  2265                              <1> 
  2266                              <1> systimer_cb2:
  2267 0000C35D 80FF02              <1> 	cmp	bh, 2
  2268 0000C360 7445                <1>         je      short systimer_5  ; only 18.2 ticks per second is usable
  2269                              <1> 				  ; 10 milliseconds (100 Hertz) timer 
  2270                              <1> 				  ; will be set later (18/05/2016)
  2271 0000C362 774B                <1>         ja      short systimer_6 
  2272                              <1> 
  2273 0000C364 20FF                <1> 	and	bh, bh
  2274 0000C366 0F84B4000000        <1>         jz      systimer_9        ; stop timer event(s)
  2275                              <1> 
  2276                              <1> 	; bh = 1 (timer interrupt, 18.2 Hz, IBM PC/AT ROMBIOS default)
  2277                              <1> 
  2278                              <1> systimer_19:
  2279 0000C36C B00A                <1> 	mov	al, 10 ; (*)
  2280                              <1> 
  2281                              <1> systimer_0:
  2282 0000C36E B710                <1> 	mov	bh, 16
  2283                              <1> 	;
  2284 0000C370 383D[773E0100]      <1> 	cmp	[timer_events], bh ; 16 ; 07/06/2016
  2285 0000C376 7319                <1> 	jnb 	short systimer_3  ; max. 16 timer events
  2286                              <1> 	;
  2287 0000C378 50                  <1> 	push	eax ; (*)
  2288                              <1> 
  2289 0000C379 BF[B4470100]        <1> 	mov	edi, timer_set  ; beginning address of timer events
  2290                              <1> 				; setting space
  2291 0000C37E 30C0                <1> 	xor	al, al ; 0
  2292                              <1> systimer_1:
  2293 0000C380 FEC0                <1> 	inc	al
  2294 0000C382 803F00              <1> 	cmp	byte [edi], 0 	; is it free space ?
  2295 0000C385 7639                <1> 	jna	short systimer_7 ; yes
  2296 0000C387 FECF                <1> 	dec	bh
  2297 0000C389 7405                <1> 	jz	short systimer_2
  2298 0000C38B 83C710              <1> 	add	edi, 16
  2299 0000C38E EBF0                <1> 	jmp	short  systimer_1 ; next event space
  2300                              <1> 
  2301                              <1> systimer_2:
  2302 0000C390 58                  <1> 	pop	eax ; (*) discard
  2303                              <1> systimer_3:
  2304 0000C391 C605[1C470100]00    <1> 	mov	byte [u.r0], 0
  2305                              <1> systimer_4:
  2306 0000C398 C705[80470100]1B00- <1>         mov     dword [u.error], ERR_MISC
  2306 0000C3A0 0000                <1>
  2307                              <1>                                 ; one of miscellaneous/other errors
  2308 0000C3A2 E9E6F7FFFF          <1> 	jmp	error ; cf -> 1
  2309                              <1> 
  2310                              <1> systimer_5:
  2311 0000C3A7 883D[1C470100]      <1> 	mov	[u.r0], bh ; Time count unit (=2 or >3)
  2312 0000C3AD EBE9                <1> 	jmp	short systimer_4 ; 07/06/2016
  2313                              <1> 
  2314                              <1> systimer_6:
  2315 0000C3AF 80FF04              <1> 	cmp	bh, 4
  2316 0000C3B2 77F3                <1>         ja      short systimer_5  ; undefined time count unit
  2317                              <1> 	;jb	short systimer_16	
  2318                              <1> 
  2319                              <1> 	;mov	al, 1	; default (use current timer unit)
  2320                              <1> 			; countdown value is in ECX ! 
  2321                              <1> 			; max. value of ecx = 4294967296/10
  2322                              <1>         ;jmp    short systimer_0
  2323                              <1> 	;jmp	short systimer_19	
  2324 0000C3B4 74B6                <1> 	je	short systimer_19
  2325                              <1> 
  2326                              <1> systimer_16:
  2327                              <1> 	; bh = 3
  2328                              <1> 	; timer event via real time clock interrupt
  2329                              <1> 	; interrupt/update frequency: 1 Hz (1 tick per second)
  2330                              <1> 	
  2331 0000C3B6 B0B6                <1> 	mov	al, 182 ; (*) ; 18.2 * 10
  2332 0000C3B8 FE05[B5430100]      <1> 	inc	byte [trtc] ; timer event via real time clock
  2333 0000C3BE EBAE                <1>         jmp     short systimer_0
  2334                              <1> 
  2335                              <1> systimer_7:
  2336 0000C3C0 A2[1C470100]        <1> 	mov	[u.r0], al ; timer event number
  2337                              <1> 	;
  2338                              <1> 	; edi = address of empty timer event area
  2339 0000C3C5 A0[6B470100]        <1> 	mov	al, [u.uno]
  2340 0000C3CA FA                  <1> 	cli 	; disable interrupts 
  2341 0000C3CB AA                  <1> 	stosb	; process number
  2342 0000C3CC A0[B4430100]        <1> 	mov	al, [tcallback] ; timer callback flag
  2343 0000C3D1 AA                  <1> 	stosb 	; 1= callback method, 0= signal response byte method
  2344 0000C3D2 A0[B5430100]        <1> 	mov	al, [trtc] ; timer interrupt type
  2345 0000C3D7 AA                  <1> 	stosb	; 1= real time clock, 0= programmable interval timer
  2346 0000C3D8 88D8                <1> 	mov	al, bl ; Signal return (Response) value
  2347 0000C3DA AA                  <1> 	stosb   ; response byte
  2348 0000C3DB 58                  <1> 	pop	eax ; (*) ; 10 or 182
  2349 0000C3DC 89D3                <1> 	mov	ebx, edx ; virtual address for response/signal byte
  2350 0000C3DE F7E1                <1> 	mul	ecx
  2351                              <1> 	; (eax = 10 * count of 18.2 Hz timer ticks)
  2352                              <1> 	; (count down step = 10)
  2353 0000C3E0 AB                  <1> 	stosd  ; count limit (reset value)
  2354 0000C3E1 AB                  <1> 	stosd  ; current count value
  2355                              <1> 
  2356                              <1> 	; 19/12/2016
  2357 0000C3E2 803D[B4430100]00    <1> 	cmp	byte [tcallback], 0 ; timer callback method ?
  2358 0000C3E9 7604                <1> 	jna	short systimer_17 ; no	
  2359 0000C3EB 89D8                <1> 	mov	eax, ebx ; virtual address for callback routine 
  2360 0000C3ED EB07                <1> 	jmp	short systimer_18
  2361                              <1> 
  2362                              <1> systimer_17: ; signal response byte method
  2363                              <1> 	; ebx = virtual address
  2364                              <1> 	; [u.pgdir] = page directory's physical address
  2365 0000C3EF E8238EFFFF          <1> 	call	get_physical_addr
  2366 0000C3F4 721A                <1> 	jc	short systimer_8 ; 07/06/2016
  2367                              <1> 	; eax = physical address of the virtual address in user's space
  2368                              <1> systimer_18:
  2369 0000C3F6 AB                  <1> 	stosd	; response addr (physical) or callback addr (virtual)
  2370 0000C3F7 FE05[773E0100]      <1> 	inc	byte [timer_events] ; 07/06/201
  2371                              <1> 	; 02/01/2017
  2372 0000C3FD 0FB605[6B470100]    <1> 	movzx	eax, byte [u.uno]
  2373 0000C404 FE80[B7440100]      <1> 	inc	byte [eax+p.timer-1]	
  2374                              <1> 	;
  2375 0000C40A FB                  <1> 	sti 	; enable interrupts
  2376 0000C40B E99DF7FFFF          <1> 	jmp	sysret
  2377                              <1> 
  2378                              <1> systimer_8:
  2379                              <1> 	; 10/06/2016
  2380                              <1> 	; 07/06/2016
  2381 0000C410 28C0                <1> 	sub	al, al ; 0
  2382 0000C412 8847F4              <1> 	mov	[edi-12], al ; clear process number (free timer event)
  2383                              <1> 	;mov	dword [edi], eax ; 0
  2384 0000C415 FB                  <1> 	sti
  2385 0000C416 A2[1C470100]        <1> 	mov	[u.r0], al ; 0
  2386 0000C41B E96DF7FFFF          <1> 	jmp	error
  2387                              <1> 
  2388                              <1> systimer_9:
  2389                              <1> 	; 10/06/2016
  2390                              <1> 	; 07/06/2016
  2391 0000C420 28C0                <1> 	sub	al, al
  2392 0000C422 A2[1C470100]        <1> 	mov	byte [u.r0], al ; 0
  2393 0000C427 3805[773E0100]      <1> 	cmp     byte [timer_events], al ;  0
  2394 0000C42D 7631                <1> 	jna	short systimer_12
  2395                              <1> 
  2396                              <1> 	; Note: ecx and edx are undefined here
  2397                              <1> 	;	(for stop timer function)
  2398                              <1> 
  2399 0000C42F BE[B4470100]        <1> 	mov	esi, timer_set  ; beginning address of timer events
  2400                              <1> 				; setting space	 
  2401 0000C434 A0[6B470100]        <1> 	mov	al, [u.uno]
  2402                              <1> 	
  2403 0000C439 B710                <1> 	mov	bh, 16
  2404                              <1> 
  2405 0000C43B 08DB                <1> 	or	bl, bl
  2406 0000C43D 7544                <1> 	jnz	short systimer_15
  2407                              <1> 
  2408                              <1> 	; clear timer event areas belong to current process
  2409                              <1> 	; (for stopping all timer events belong to current process) 
  2410 0000C43F FA                  <1> 	cli 	; disable interrupts
  2411                              <1> systimer_10:
  2412                              <1> 	; 10/06/2016
  2413                              <1> 	; 07/06/2016 	
  2414 0000C440 8A26                <1> 	mov	ah, [esi]
  2415 0000C442 08E4                <1> 	or	ah, ah ; 0 ?
  2416 0000C444 7411                <1> 	jz	short systimer_11
  2417 0000C446 38C4                <1> 	cmp	ah, al ; is the process number (owner) same ?
  2418 0000C448 750D                <1>         jne     short systimer_11 ; no
  2419                              <1> 
  2420                              <1> 	;mov	byte [esi], 0
  2421 0000C44A 66C7060000          <1> 	mov	word [esi], 0 ; clear
  2422                              <1> 	;mov	dword [esi+12], 0 ; clear
  2423                              <1> 
  2424 0000C44F FE0D[773E0100]      <1> 	dec	byte [timer_events]
  2425 0000C455 7409                <1> 	jz	short systimer_12
  2426                              <1> 
  2427                              <1> systimer_11:
  2428 0000C457 FECF                <1> 	dec	bh
  2429 0000C459 7405                <1> 	jz	short systimer_12
  2430 0000C45B 83C610              <1> 	add	esi, 16
  2431 0000C45E EBE0                <1> 	jmp	short systimer_10
  2432                              <1> 
  2433                              <1> systimer_12:
  2434 0000C460 0FB635[6B470100]    <1> 	movzx	esi, byte [u.uno]
  2435 0000C467 08DB                <1> 	or	bl, bl ; all timer events or one timer event ?
  2436 0000C469 740C                <1> 	jz	short systimer_13
  2437 0000C46B 8A9E[B7440100]      <1> 	mov	bl, [esi+p.timer-1]
  2438 0000C471 20DB                <1> 	and	bl, bl	; previous number of timer events for the process
  2439 0000C473 7408                <1> 	jz	short systimer_14
  2440 0000C475 FECB                <1> 	dec	bl  ; previous number of timer events for the process - 1
  2441                              <1> systimer_13:
  2442 0000C477 889E[B7440100]      <1> 	mov	[esi+p.timer-1], bl ; 0 ; no timer events for process
  2443                              <1> systimer_14:
  2444 0000C47D FB                  <1> 	sti	; enable interrupts
  2445 0000C47E E92AF7FFFF          <1> 	jmp	sysret
  2446                              <1> 
  2447                              <1> systimer_15:
  2448 0000C483 38FB                <1> 	cmp	bl, bh ; 16
  2449 0000C485 0F870DFFFFFF        <1>         ja      systimer_4      ; max. 16 timer events !
  2450                              <1> 	;
  2451 0000C48B 88DA                <1> 	mov	dl, bl
  2452 0000C48D FECA                <1> 	dec	dl  ; 16 -> 15 ... 1 -> 0 
  2453 0000C48F C0E204              <1> 	shl	dl, 4 ; * 16
  2454 0000C492 0FB6FA              <1> 	movzx	edi, dl
  2455 0000C495 01F7                <1> 	add	edi, esi ; timer_set 
  2456                              <1> 	
  2457 0000C497 3A07                <1> 	cmp	al, [edi] ; process number
  2458 0000C499 0F85F9FEFFFF        <1>         jne     systimer_4
  2459                              <1> 	
  2460                              <1> 	; same process ID
  2461 0000C49F FA                  <1> 	cli	; disable interrupts
  2462                              <1>  	; 10/06/2016 ; 02/01/2017
  2463                              <1> 	;mov	byte [edi], 0 
  2464 0000C4A0 66C7070000          <1> 	mov	word [edi], 0 ; clear
  2465                              <1> 	;mov	dword [edi+12], 0 ; clear
  2466 0000C4A5 FE0D[773E0100]      <1> 	dec	byte [timer_events]
  2467 0000C4AB EBB3                <1> 	jmp	short systimer_12
  2468                              <1> 
  2469                              <1> sysmdate: ; < change the modification time of a file >
  2470                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
  2471                              <1> 	; temporary !
  2472 0000C4AD B801000000          <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
  2473 0000C4B2 A3[80470100]        <1>         mov     [u.error], eax
  2474 0000C4B7 A3[1C470100]        <1>         mov     [u.r0], eax 
  2475 0000C4BC E9CCF6FFFF          <1> 	jmp	error
  2476                              <1> 
  2477                              <1> sysvideo: ; VIDEO DATA TRANSFER FUNCTIONS
  2478                              <1> 	; 11/07/2016
  2479                              <1> 	; 13/06/2016
  2480                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
  2481                              <1> 	;
  2482                              <1> 	;
  2483                              <1> 	; VIDEO DATA TRANSFER FUNCTIONS:
  2484                              <1> 	;
  2485                              <1> 	; Inputs:
  2486                              <1> 	;	BH = 0 = VIDEO BIOS Mode 3, tty/text mode data transfers
  2487                              <1> 	;	     BL = 
  2488                              <1> 	;		Bits 0&1, Transfer direction
  2489                              <1> 	;	     	 	0 - System to system
  2490                              <1> 	;			1 - User to system
  2491                              <1> 	;			2 - System to user
  2492                              <1> 	;			3 - User to user
  2493                              <1> 	;		Bits 2&3, Transfer Type
  2494                              <1> 	;			0 - Display page transfer	
  2495                              <1> 	;	     		1 - Display page window transfer
  2496                              <1> 	;	     		2 - Frame/Viewport/Window address transfer
  2497                              <1> 	;			3 - Window handle transfer		
  2498                              <1> 	;
  2499                              <1> 	;	     /// BL = 0 -> System to system (display page) transfer
  2500                              <1> 	;		 CL = Source page 
  2501                              <1> 	;		 DL = Destination page
  2502                              <1> 	;	     /// BL = 1&2 -> user to system & system to user transfer
  2503                              <1> 	;		 ECX = User buffer
  2504                              <1> 	;		 DL = Video page
  2505                              <1> 	;	     /// BL = 5&6 -> user to system, system to user transfer 
  2506                              <1> 	;		(window in current display page and in current mode)	 	 		
  2507                              <1> 	;		 ESI = User's buffer address
  2508                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2509                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2510                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2511                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2512                              <1>         ;                If BL = 5 ->
  2513                              <1> 	;		 EDI = Swap address (in user's memory space)
  2514                              <1> 	;		 (If swap address > 0, previous content of the window
  2515                              <1> 	;		 will be saved into swap area in user's memory space)		
  2516                              <1> 	;	     /// BL = 4 -> system to system transfer 
  2517                              <1> 	;		 ESI = System's source buffer (video page) address
  2518                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2519                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2520                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2521                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2522                              <1> 	;		 EDI = System's destination buffer (video page) address
  2523                              <1> 	;
  2524                              <1> 	;	BH = 1 = CGA Graphics (0B8000h) data transfers
  2525                              <1> 	;	     BL = 
  2526                              <1> 	;	     	0 = Fill color (color in CL] (32K)
  2527                              <1> 	;		1 = User to system display page transfer
  2528                              <1> 	;		2 = System to user display page transfer
  2529                              <1> 	;		3 = NOT bits in window (ECX, EDX)
  2530                              <1> 	;		4 = Window copy (system to system)	
  2531                              <1> 	;	     	5 = User to system window transfer
  2532                              <1> 	;	     	6 = System to user window transfer
  2533                              <1> 	;		7 = AND display page bytes with CL
  2534                              <1> 	;		8 = OR display page bytes with CL
  2535                              <1> 	;		9 = XOR display page bytes with CL
  2536                              <1> 	;
  2537                              <1> 	;	     /// BL = 0 -> Fill color  (all screen pixels)
  2538                              <1> 	;		 CL = Color value 
  2539                              <1> 	;	     /// BL = 1&2 -> user to system & system to user transfer
  2540                              <1> 	;		 ECX = User buffer
  2541                              <1> 	;	     /// BL = 5&6 -> user to system, system to user transfer 
  2542                              <1> 	;		(window in current display page and in current mode)	 	 		
  2543                              <1> 	;		 ESI = User's buffer address
  2544                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2545                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2546                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2547                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2548                              <1>         ;	     /// BL = 4 -> system to system (window) transfer 
  2549                              <1> 	;		 ESI = System's source buffer (video page) address
  2550                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2551                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2552                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2553                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2554                              <1> 	;		 EDI = System's destination buffer (video page) address
  2555                              <1> 	;	     /// BL = 3 -> NOT byte in display page/memory 
  2556                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2557                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2558                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2559                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2560                              <1> 	;
  2561                              <1> 	;	BH = 2 = VGA Graphics (0A0000h) data transfers
  2562                              <1> 	;	     BL = 
  2563                              <1> 	;	     	x0h = Fill color (color in CL] (64K)
  2564                              <1> 	;		x1h = User to system display page transfer
  2565                              <1> 	;		x2h = System to user display page transfer
  2566                              <1> 	;		x3h = NOT bits in window (ECX, EDX)
  2567                              <1> 	;		x4h = Window copy (system to system)	
  2568                              <1> 	;	     	x5h = User to system window transfer
  2569                              <1> 	;	     	x6h = System to user window transfer
  2570                              <1> 	;		x7h = AND display page bytes with CL
  2571                              <1> 	;		x8h = OR display page bytes with CL
  2572                              <1> 	;		x9h = XOR display page bytes with CL
  2573                              <1> 	;		x = 0 -> screen width = 320
  2574                              <1> 	;		x = 1 -> screen width = 640
  2575                              <1> 	;		x = 2 -> screen width = 800
  2576                              <1> 	;
  2577                              <1> 	;	     /// BL = 0 -> Fill color  (all screen pixels)
  2578                              <1> 	;		 CL = Color value 
  2579                              <1> 	;	     /// BL = 1&2 -> user to system & system to user transfer
  2580                              <1> 	;		 ECX = User buffer
  2581                              <1> 	;	     /// BL = 5&6 -> user to system, system to user transfer 
  2582                              <1> 	;		(window in current display page and in current mode)	 	 		
  2583                              <1> 	;		 ESI = User's buffer address
  2584                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2585                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2586                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2587                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2588                              <1>        	;	     /// BL = 4 -> system to system (window) transfer 
  2589                              <1> 	;		 ESI = System's source buffer (video page) address
  2590                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2591                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2592                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2593                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2594                              <1> 	;		 EDI = System's destination buffer (video page) address
  2595                              <1> 	;	     /// BL = 3 -> NOT byte in display page/memory 
  2596                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2597                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2598                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2599                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2600                              <1> 	;
  2601                              <1> 	;	BH = 3 = Super VGA, LINEAR FRAME BUFFER data transfers
  2602                              <1> 	;	     BL = 
  2603                              <1> 	;	     	0 = Fill color (color in ECX] (Frame buffer size)
  2604                              <1> 	;		1 = User to system display page transfer
  2605                              <1> 	;		2 = System to user display page transfer
  2606                              <1> 	;		3 = NOT bits in window (ECX, EDX)
  2607                              <1> 	;		4 = Window copy (system to system)	
  2608                              <1> 	;	     	5 = User to system window transfer
  2609                              <1> 	;	     	6 = System to user window transfer
  2610                              <1> 	;		7 = AND display page bytes with ECX
  2611                              <1> 	;		8 = OR display page bytes with ECX
  2612                              <1> 	;		9 = XOR display page bytes with ECX
  2613                              <1> 	;
  2614                              <1> 	;	     /// BL = 0 -> Fill color  (all screen pixels)
  2615                              <1> 	;		 CL = Color value 
  2616                              <1> 	;	     /// BL = 1&2 -> user to system & system to user transfer
  2617                              <1> 	;		 ECX = User buffer
  2618                              <1> 	;	     /// BL = 5&6 -> user to system, system to user transfer 
  2619                              <1> 	;		(window in current display page and in current mode)	 	 		
  2620                              <1> 	;		 ESI = User's buffer address
  2621                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2622                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2623                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2624                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2625                              <1> 	;	     /// BL = 4 -> system to system (window) transfer 
  2626                              <1> 	;		 ESI = System's source buffer (video page) address
  2627                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2628                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2629                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2630                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2631                              <1> 	;		 EDI = System's destination buffer (video page) address
  2632                              <1> 	;	     /// BL = 3 -> NOT byte in display page/memory 
  2633                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2634                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2635                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2636                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2637                              <1> 	;
  2638                              <1> 	; Outputs:
  2639                              <1> 	;	EAX = transfer/byte count
  2640                              <1> 	;
  2641                              <1> 	;	NOTE: If the source or destination address passes out of
  2642                              <1> 	;	video pages (display memory limits), data will not be transferred
  2643                              <1> 	;	and EAX will return as 0.
  2644                              <1> 	;
  2645                              <1> 	;
  2646                              <1> 	; DIRECT (STANDARD VGA/CGA) DISPLAY MEMORY ACCESS FUNCTIONS:
  2647                              <1> 	;
  2648                              <1> 	;	BH = 4 = CGA direct video memory (0B8000h, 32K) access
  2649                              <1> 	;		Page directory & page tables of the user's
  2650                              <1> 	;		program will be updated to direct access to
  2651                              <1> 	;		0B8000h (32K) video (CGA, color) memory; if
  2652                              <1> 	;		there is not a permission  conflict or lock!  
  2653                              <1> 	;	        (User's program/process will have permision to
  2654                              <1> 	;		access locked display memory if the owner is
  2655                              <1> 	;		it's parent.)
  2656                              <1>         ;
  2657                              <1> 	;	    Screen width = 320	
  2658                              <1> 	;
  2659                              <1> 	;	BH = 5 = VGA direct video memory (0A0000h, 64K) access
  2660                              <1> 	;		Page directory & page tables of the user's
  2661                              <1> 	;		program will be updated to direct access to
  2662                              <1> 	;		0A0000h (64K) video (VGA) memory; if there is not
  2663                              <1> 	;		a permission conflict or lock!  
  2664                              <1> 	;	        (User's program/process will have permision to
  2665                              <1> 	;		access locked display memory if the owner is
  2666                              <1> 	;		it's parent.)
  2667                              <1> 	;		
  2668                              <1> 	;	    BL = Screen width (320, 640, 800) 
  2669                              <1> 	;			
  2670                              <1> 	; Outputs:
  2671                              <1> 	;	EAX = Display mmory address for direct access
  2672                              <1> 	;	      0A0000h for VGA, 0B8000h for CGA	
  2673                              <1> 	;	(Display memory size: 32K for CGA, 64K for VGA)
  2674                              <1> 	; 	EAX = 0 if display page access permission has been denied. 
  2675                              <1> 	;	      (Locked!) 	
  2676                              <1> 	;	      	 	
  2677                              <1> 	; LINEAR FRAME BUFFER ACCESS FUNCTIONS:
  2678                              <1> 	;
  2679                              <1> 	;	BH = 6 = Linear Frame Buffer direct video memory access
  2680                              <1> 	;
  2681                              <1> 	;		Page directory & page tables of the user's
  2682                              <1> 	;		program will be updated to direct access to
  2683                              <1> 	;		the configured LFB (Linear Frame Buffer) address,
  2684                              <1> 	;		if there is not a permission conflict or lock!  
  2685                              <1> 	;	        (User's program/process will have permision to
  2686                              <1> 	;		access locked display memory if the owner is
  2687                              <1> 	;		it's parent.)
  2688                              <1> 	;			
  2689                              <1> 	;		Return: EAX = Linear Frame Buffer address
  2690                              <1> 	;			EDX = Frame Buffer Size in bytes	
  2691                              <1> 	;	
  2692                              <1> 	;	BH = 7 = Get Linear Frame Buffer info (for current mode)
  2693                              <1> 	;		
  2694                              <1> 	;		Return:
  2695                              <1> 	;		EAX = Frame Buffer Address (0 = is not in use)
  2696                              <1> 	;		EDX = Frame Buffer Size in bytes
  2697                              <1> 	;		BL = Current Video Mode
  2698                              <1> 	;		     BL = 0FFh -> Super VGA (Extended VGA)
  2699                              <1> 	;		     If BL = 0FFh, 
  2700                              <1>         ;                       BH = 0 = 16 colors
  2701                              <1> 	;			BH = 1 = 256 colors
  2702                              <1> 	;			BH = 2 = 66536 colors
  2703                              <1> 	;			BH = 3 = 24 bits TRUE (16M) colors
  2704                              <1> 	;			BH = 4 = 32 bits TRUE (16M) colors
  2705                              <1> 	;		ECX = Pixel resolution
  2706                              <1> 	;		      CX = Width (640, 800, 1024, 1366, 1920)
  2707                              <1> 	;		      High 16 bits of ECX = Height  
  2708                              <1> 	;
  2709                              <1> 	;	NOTE: Each process will have it's own frame buffer
  2710                              <1> 	;	      address and resolution parameters in 'u' area.
  2711                              <1> 	;	      Then, if the current frame buffer & resolution
  2712                              <1> 	;	      is different, frame buffer r/w functions
  2713                              <1> 	;	      will use scale factor to convert process's
  2714                              <1>         ;             pixel coordinates to actual screen coordinates.                            
  2715                              <1> 	;	      resolution -> dimensional scale
  2716                              <1> 	;	      color size -> color scale
  2717                              <1> 	;	     * RGB (TRUE) colors to 256 colors conversion:	
  2718                              <1>         ;             TRUE Colors -> 8,8,8 (R,G,B; byte 0 is R)            
  2719                              <1> 	;	      256 colors -> 2,2,2,2 (R,G,B,L; bit 0&1 is R)
  2720                              <1> 	; 		  bit 6&7 -> luminosity base level (0,1,2,3)
  2721                              <1> 	;		  bit 4&5 -> blue level (0,1,2,3)
  2722                              <1> 	;		  bit 2%3 -> green level (0,1,2,3)
  2723                              <1> 	;		  bit 0&1 -> red level (0,1,2,3)
  2724                              <1> 	;	      Example: total red level : luminosity + red level   				
  2725                              <1> 	;	      Luminosity base level: 0 -> 16
  2726                              <1> 	;		 		     1 -> 32
  2727                              <1> 	;				     2 -> 64
  2728                              <1> 	;				     3 -> 128
  2729                              <1> 	;	      Color level:	
  2730                              <1> 	;				    0 -> 0
  2731                              <1> 	;				    1 -> luminosity level
  2732                              <1> 	;				    2 -> luminosity level + 64
  2733                              <1> 	;				    3 -> 255
  2734                              <1> 	;	     Luminosity base level = min (R,G,B)
  2735                              <1> 	;			if it is <16, it will be set to 16
  2736                              <1> 	;	     Color levels: Color values are fixed to (nearest) 
  2737                              <1> 	;		   one of all possible set level (step) values
  2738                              <1> 	;		   (according to luminosity base level); then
  2739                              <1> 	;		   color levels are set to R-L, G-L, B-L.
  2740                              <1> 	;	 For example: If luminosity base level is 32
  2741                              <1> 	;		  all possible set values are 0, 32, 96, 255. 	 			
  2742                              <1> 	;
  2743                              <1> 	;	    * RGB (TRUE) colors to 16 colors conversion:
  2744                              <1> 	;	    16 colors: R, B,G, L bits (4 bits)
  2745                              <1> 	;	    	   If any one of R,G,B >= 128 L = 1 		     	
  2746                              <1>  	;		   If max. value of (R,G,B) >= 32, it is 1
  2747                              <1> 	;		      else all color bits (R&G&B&L) are 0
  2748                              <1> 	;		   If the second value >= max. value / 2
  2749                              <1> 	;		      it is 1
  2750                              <1> 	;		   If third value value >= max. value / 2
  2751                              <1> 	;		      it is 1
  2752                              <1> 	;	    Example: R = 132, G = 64, B = 78
  2753                              <1> 	;		     L = 1, R = 1
  2754                              <1> 	;		     G < 66 --> G = 0
  2755                              <1> 	;		     B >= 66 --> B = 1	 		 	  								 	 					
  2756                              <1> 
  2757                              <1> 	; 16/05/2016
  2758 0000C4C1 31C0                <1> 	xor	eax, eax
  2759 0000C4C3 A3[1C470100]        <1> 	mov	[u.r0], eax
  2760                              <1> 
  2761 0000C4C8 20FF                <1> 	and	bh, bh
  2762 0000C4CA 0F8572020000        <1> 	jnz	sysvideo_13 ; 11/07/2016
  2763                              <1> 	
  2764                              <1> 	; Video mode 0, 80*25 text mode, CGA 16 colors  ; [CRT_MODE] = 3
  2765 0000C4D0 88DF                <1> 	mov	bh, bl
  2766 0000C4D2 C0EF02              <1> 	shr	bh, 2
  2767 0000C4D5 20FF                <1> 	and	bh, bh
  2768 0000C4D7 0F8598000000        <1>         jnz     sysvideo_4
  2769 0000C4DD BF00800B00          <1> 	mov	edi, 0B8000h
  2770 0000C4E2 20D2                <1> 	and	dl, dl
  2771 0000C4E4 7413                <1> 	jz	short sysvideo_1
  2772 0000C4E6 80FA07              <1> 	cmp	dl, 7
  2773 0000C4E9 0F87BEF6FFFF        <1> 	ja	sysret
  2774                              <1> sysvideo_0:
  2775 0000C4EF 81C7A00F0000        <1> 	add	edi, 80*25*2
  2776 0000C4F5 FECA                <1> 	dec	dl
  2777 0000C4F7 75F6                <1> 	jnz	short sysvideo_0	
  2778                              <1> sysvideo_1:	
  2779 0000C4F9 80E303              <1> 	and	bl, 3
  2780 0000C4FC 7530                <1> 	jnz	short sysvideo_2
  2781 0000C4FE 80F907              <1> 	cmp	cl, 7
  2782 0000C501 0F87A6F6FFFF        <1> 	ja	sysret
  2783                              <1> 	; system to system video/display page transfer (mode 0)
  2784 0000C507 BE00800B00          <1> 	mov	esi, 0B8000h
  2785 0000C50C 0FB6C1              <1> 	movzx	eax, cl
  2786 0000C50F BAA00F0000          <1> 	mov	edx, 80*25*2
  2787 0000C514 F7E2                <1> 	mul	edx
  2788 0000C516 01C6                <1> 	add	esi, eax
  2789 0000C518 B9A00F0000          <1> 	mov	ecx, (80*25*2)
  2790 0000C51D 890D[1C470100]      <1> 	mov	[u.r0], ecx
  2791 0000C523 66C1E902            <1> 	shr	cx, 2 ; /4
  2792 0000C527 F3A5                <1> 	rep	movsd
  2793 0000C529 E97FF6FFFF          <1> 	jmp	sysret	
  2794                              <1> sysvideo_2:  
  2795 0000C52E 80FB02              <1> 	cmp	bl, 2
  2796 0000C531 0F8776F6FFFF        <1>         ja      sysret
  2797 0000C537 721F                <1> 	jb	short sysvideo_3
  2798                              <1> 	; system to user video/display page transfer (mode 0)
  2799 0000C539 89FE                <1> 	mov	esi, edi
  2800 0000C53B 89CF                <1> 	mov	edi, ecx ; user buffer
  2801 0000C53D B9A00F0000          <1> 	mov	ecx, 80*25*2
  2802 0000C542 E833190000          <1> 	call	transfer_to_user_buffer ; fast transfer
  2803 0000C547 0F8260F6FFFF        <1> 	jc	sysret
  2804 0000C54D 890D[1C470100]      <1> 	mov	[u.r0], ecx
  2805 0000C553 E955F6FFFF          <1> 	jmp	sysret 	
  2806                              <1> sysvideo_3: 
  2807                              <1> 	; user to system video/display page transfer (mode 0)	
  2808 0000C558 89CE                <1> 	mov	esi, ecx ; user buffer
  2809                              <1> 	; edi = video page address
  2810 0000C55A B9A00F0000          <1> 	mov	ecx, 80*25*2
  2811 0000C55F E860190000          <1> 	call	transfer_from_user_buffer ; fast transfer
  2812 0000C564 0F8243F6FFFF        <1> 	jc	sysret
  2813 0000C56A 890D[1C470100]      <1> 	mov	[u.r0], ecx		
  2814 0000C570 E938F6FFFF          <1> 	jmp	sysret
  2815                              <1> sysvideo_4:
  2816 0000C575 80E303              <1> 	and	bl, 3
  2817 0000C578 0F85F6000000        <1>         jnz     sysvideo_9
  2818 0000C57E 80F907              <1> 	cmp	cl, 7
  2819 0000C581 0F8726F6FFFF        <1> 	ja	sysret
  2820                              <1> 	; system to system video/display page window transfer (mode 0)
  2821 0000C587 81FE00800B00        <1> 	cmp	esi, 0B8000h
  2822 0000C58D 0F821AF6FFFF        <1> 	jb	sysret
  2823 0000C593 81FE00FD0B00        <1> 	cmp	esi, 0B8000h+(80*25*2*8)
  2824 0000C599 0F830EF6FFFF        <1> 	jnb	sysret
  2825 0000C59F 81FF00800B00        <1> 	cmp	edi, 0B8000h
  2826 0000C5A5 0F8202F6FFFF        <1> 	jb	sysret
  2827 0000C5AB 81FF00FD0B00        <1>         cmp     edi, 0B8000h+(80*25*2*8)
  2828 0000C5B1 0F83F6F5FFFF        <1> 	jnb	sysret
  2829                              <1> 	;
  2830 0000C5B7 51                  <1> 	push	ecx
  2831 0000C5B8 52                  <1> 	push	edx
  2832 0000C5B9 0FB7C1              <1> 	movzx	eax, cx ; top left column
  2833 0000C5BC 50                  <1> 	push	eax
  2834 0000C5BD C1E910              <1> 	shr	ecx, 16 ; top row
  2835 0000C5C0 66B8A000            <1> 	mov	ax, 80*2 ; 80 colums, 160 bytes per row
  2836 0000C5C4 F7E1                <1> 	mul	ecx
  2837 0000C5C6 01C6                <1> 	add	esi, eax
  2838 0000C5C8 01C7                <1> 	add	edi, eax
  2839 0000C5CA 58                  <1> 	pop	eax
  2840 0000C5CB 66D1E0              <1> 	shl	ax, 1 ; *2 	
  2841 0000C5CE 01C6                <1> 	add	esi, eax
  2842 0000C5D0 01C7                <1> 	add	edi, eax
  2843 0000C5D2 5A                  <1> 	pop	edx
  2844 0000C5D3 59                  <1> 	pop	ecx
  2845 0000C5D4 B800FD0B00          <1> 	mov	eax, 0B8000h+(80*25*2*8)
  2846 0000C5D9 39C6                <1> 	cmp	esi, eax
  2847 0000C5DB 0F83CCF5FFFF        <1> 	jnb	sysret
  2848 0000C5E1 39C6                <1> 	cmp	esi, eax
  2849 0000C5E3 0F83C4F5FFFF        <1> 	jnb	sysret	
  2850                              <1> 
  2851 0000C5E9 56                  <1> 	push	esi ; ****
  2852 0000C5EA 57                  <1> 	push	edi ; ***
  2853 0000C5EB 52                  <1> 	push	edx ; **
  2854 0000C5EC 51                  <1> 	push	ecx ; *
  2855 0000C5ED C1E910              <1> 	shr	ecx, 16 ; top row
  2856 0000C5F0 C1EA10              <1> 	shr	edx, 16 ; bottom row
  2857 0000C5F3 83F918              <1> 	cmp	ecx, 24 ; max. 25 rows
  2858 0000C5F6 7773                <1> 	ja	short sysvideo_6
  2859 0000C5F8 83FA18              <1> 	cmp	edx, 24 ; max. 25 rows
  2860 0000C5FB 776E                <1> 	ja	short sysvideo_6		
  2861 0000C5FD 28CA                <1> 	sub	dl, cl
  2862 0000C5FF 726A                <1> 	jc	short sysvideo_6
  2863 0000C601 50                  <1> 	push	eax ; *****
  2864 0000C602 89D3                <1> 	mov	ebx, edx ; row count - 1
  2865 0000C604 B8A0000000          <1> 	mov	eax, 80*2
  2866 0000C609 F7E0                <1> 	mul	eax
  2867 0000C60B 01C6                <1> 	add	esi, eax
  2868 0000C60D 01C7                <1> 	add	edi, eax
  2869 0000C60F 58                  <1> 	pop	eax ; *****
  2870 0000C610 39C6                <1> 	cmp	esi, eax
  2871 0000C612 7757                <1> 	ja	short sysvideo_6
  2872 0000C614 39C7                <1> 	cmp	edi, eax
  2873 0000C616 7753                <1> 	ja	short sysvideo_6
  2874 0000C618 59                  <1> 	pop	ecx ; *
  2875 0000C619 5A                  <1> 	pop	edx ; **
  2876 0000C61A 81E1FFFF0000        <1> 	and	ecx, 0FFFFh
  2877 0000C620 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  2878 0000C626 83F94F              <1> 	cmp	ecx, 79 ; max. 80 columns
  2879 0000C629 7742                <1> 	ja	short sysvideo_7
  2880 0000C62B 83FA4F              <1> 	cmp	edx, 79 ; max. 80 columns
  2881 0000C62E 773D                <1> 	ja	short sysvideo_7
  2882 0000C630 28CA                <1> 	sub	dl, cl
  2883 0000C632 7639                <1> 	jna	short sysvideo_7
  2884                              <1> 	; edx = column count (width) - 1
  2885 0000C634 D0E2                <1> 	shl	dl, 1
  2886 0000C636 01D6                <1> 	add	esi, edx
  2887 0000C638 01D7                <1> 	add	edi, edx
  2888 0000C63A 39C6                <1> 	cmp	esi, eax
  2889 0000C63C 772F                <1> 	ja	short sysvideo_7
  2890 0000C63E 39C7                <1> 	cmp	edi, eax
  2891 0000C640 772B                <1> 	ja	short sysvideo_7
  2892 0000C642 5F                  <1> 	pop	edi ; ***
  2893 0000C643 5E                  <1> 	pop	esi ; ****
  2894 0000C644 FEC3                <1> 	inc	bl
  2895 0000C646 FEC2                <1> 	inc	dl ; column count
  2896 0000C648 88D7                <1> 	mov	bh, dl
  2897 0000C64A D0E2                <1> 	shl	dl, 1
  2898 0000C64C B8A0000000          <1> 	mov	eax, 80*2
  2899 0000C651 28D0                <1> 	sub	al, dl ; (80 - columns) * 2
  2900                              <1> sysvideo_5:	
  2901 0000C653 88F9                <1> 	mov	cl, bh
  2902 0000C655 0115[1C470100]      <1> 	add	[u.r0], edx
  2903 0000C65B F366A5              <1> 	rep	movsw
  2904 0000C65E 01C6                <1> 	add	esi, eax ; next row
  2905 0000C660 01C7                <1> 	add	edi, eax ; next row
  2906 0000C662 FECB                <1> 	dec	bl
  2907 0000C664 75ED                <1> 	jnz	short sysvideo_5
  2908 0000C666 E942F5FFFF          <1> 	jmp	sysret
  2909                              <1> 
  2910                              <1> sysvideo_6:
  2911 0000C66B 59                  <1> 	pop	ecx ; *
  2912 0000C66C 5A                  <1> 	pop	edx ; **
  2913                              <1> sysvideo_7:	
  2914 0000C66D 5F                  <1> 	pop	edi ; ***
  2915 0000C66E 5E                  <1> 	pop	esi ; ****
  2916 0000C66F E939F5FFFF          <1> 	jmp	sysret
  2917                              <1> 
  2918                              <1> sysvideo_9:  
  2919 0000C674 80FB02              <1> 	cmp	bl, 2
  2920 0000C677 0F8730F5FFFF        <1>         ja      sysret
  2921                              <1> 
  2922 0000C67D 56                  <1> 	push	esi ; ****
  2923 0000C67E 57                  <1> 	push	edi ; ***
  2924 0000C67F 52                  <1> 	push	edx ; **
  2925 0000C680 51                  <1> 	push	ecx ; *
  2926                              <1> 
  2927 0000C681 C1E910              <1> 	shr	ecx, 16 ; top row
  2928 0000C684 C1EA10              <1> 	shr	edx, 16 ; bottom row
  2929 0000C687 83F918              <1> 	cmp	ecx, 24 ; max. 25 rows
  2930 0000C68A 77DF                <1> 	ja	short sysvideo_6
  2931 0000C68C 83FA18              <1> 	cmp	edx, 24 ; max. 25 rows
  2932 0000C68F 77DA                <1> 	ja	short sysvideo_6		
  2933 0000C691 28CA                <1> 	sub	dl, cl
  2934 0000C693 72D6                <1> 	jc	short sysvideo_6
  2935                              <1> 
  2936 0000C695 88CD                <1> 	mov	ch, cl ; top row
  2937 0000C697 8A0D[0E310100]      <1> 	mov	cl, [ACTIVE_PAGE]
  2938 0000C69D BFA00F0000          <1> 	mov	edi, 80*25*2
  2939 0000C6A2 D3E7                <1> 	shl	edi, cl 
  2940 0000C6A4 81C760700B00        <1> 	add	edi, 0B8000h - 80*25*2
  2941                              <1> 
  2942 0000C6AA 88D7                <1> 	mov	bh, dl ; row count - 1
  2943 0000C6AC 88EA                <1> 	mov	dl, ch ; top row
  2944 0000C6AE B8A0000000          <1> 	mov	eax, 80*2
  2945 0000C6B3 F7E2                <1> 	mul	edx
  2946 0000C6B5 01C7                <1> 	add	edi, eax
  2947                              <1> 
  2948 0000C6B7 59                  <1> 	pop	ecx ; *
  2949 0000C6B8 5A                  <1> 	pop	edx ; **
  2950 0000C6B9 81E1FFFF0000        <1> 	and	ecx, 0FFFFh
  2951 0000C6BF 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  2952 0000C6C5 83F94F              <1> 	cmp	ecx, 79 ; max. 80 columns
  2953 0000C6C8 77A3                <1> 	ja	short sysvideo_7
  2954 0000C6CA 83FA4F              <1> 	cmp	edx, 79 ; max. 80 columns
  2955 0000C6CD 779E                <1> 	ja	short sysvideo_7
  2956                              <1> 	
  2957 0000C6CF 28CA                <1> 	sub	dl, cl
  2958 0000C6D1 769A                <1> 	jna	short sysvideo_7
  2959                              <1> 	
  2960 0000C6D3 0FB6C1              <1> 	movzx	eax, cl ; left column
  2961 0000C6D6 D0E0                <1> 	shl	al, 1  ; column * 2
  2962 0000C6D8 01C7                <1> 	add	edi, eax
  2963                              <1> 
  2964 0000C6DA FEC2                <1> 	inc	dl ; column count
  2965 0000C6DC D0E2                <1> 	shl	dl, 1
  2966 0000C6DE 88D1                <1> 	mov	cl, dl ; column count * 2
  2967 0000C6E0 B2A0                <1> 	mov	dl, 80*2
  2968 0000C6E2 58                  <1> 	pop	eax ; *** (swap address)
  2969 0000C6E3 5E                  <1> 	pop	esi ; ****
  2970 0000C6E4 FEC7                <1> 	inc	bh
  2971                              <1> 	
  2972                              <1> 	;mov	edx, 80*2
  2973 0000C6E6 B2A0                <1> 	mov	dl, 80*2
  2974                              <1> 	;
  2975 0000C6E8 80FB01              <1> 	cmp	bl, 1
  2976 0000C6EB 7735                <1> 	ja	short sysvideo_11
  2977                              <1> 
  2978                              <1> 	; user to system video/display page window transfer (mode 0)	
  2979 0000C6ED 21C0                <1> 	and	eax, eax ; swap address
  2980 0000C6EF 7413                <1> 	jz	short sysvideo_10 ; no window swap
  2981                              <1> 	; save previous window content in user's buffer (swap address)
  2982 0000C6F1 56                  <1> 	push	esi ; user buffer
  2983 0000C6F2 57                  <1> 	push	edi ; beginning address of the window
  2984 0000C6F3 89FE                <1> 	mov	esi, edi
  2985 0000C6F5 89C7                <1> 	mov	edi, eax
  2986 0000C6F7 E87E170000          <1> 	call	transfer_to_user_buffer ; fast transfer
  2987 0000C6FC 5F                  <1> 	pop	edi
  2988 0000C6FD 5E                  <1> 	pop	esi
  2989 0000C6FE 0F82A9F4FFFF        <1> 	jc	sysret
  2990                              <1> sysvideo_10: 
  2991                              <1> 	; user to system video/display page window transfer (mode 0)	
  2992                              <1> 	; esi =	user buffer
  2993 0000C704 E8BB170000          <1> 	call	transfer_from_user_buffer ; fast transfer
  2994 0000C709 0F829EF4FFFF        <1> 	jc	sysret
  2995 0000C70F 010D[1C470100]      <1> 	add	[u.r0], ecx
  2996 0000C715 01D7                <1> 	add	edi, edx ; next row
  2997 0000C717 01CE                <1> 	add	esi, ecx
  2998 0000C719 FECF                <1> 	dec	bh
  2999 0000C71B 75E7                <1> 	jnz	short sysvideo_10
  3000 0000C71D E98BF4FFFF          <1> 	jmp	sysret
  3001                              <1> 	
  3002                              <1> sysvideo_11:
  3003                              <1> 	; system to user video/display page window transfer (mode 0)
  3004 0000C722 87FE                <1> 	xchg	edi, esi
  3005                              <1> sysvideo_12:
  3006                              <1> 	; esi = beginning address of the window
  3007                              <1> 	; edi =	user buffer	
  3008 0000C724 E851170000          <1> 	call	transfer_to_user_buffer ; fast transfer
  3009 0000C729 0F827EF4FFFF        <1> 	jc	sysret
  3010 0000C72F 010D[1C470100]      <1> 	add	[u.r0], ecx
  3011 0000C735 01D6                <1> 	add	esi, edx ; next row
  3012 0000C737 01CF                <1> 	add	edi, ecx
  3013 0000C739 FECF                <1> 	dec	bh
  3014 0000C73B 75E7                <1> 	jnz	short sysvideo_12
  3015 0000C73D E96BF4FFFF          <1> 	jmp	sysret
  3016                              <1> 
  3017                              <1> sysvideo_13:
  3018 0000C742 80FF01              <1> 	cmp	bh, 1
  3019 0000C745 0F871F030000        <1>         ja      sysvideo_38
  3020                              <1> 	; BH = 1 = CGA Graphics (0B8000h) data transfers
  3021                              <1> 
  3022 0000C74B 20DB                <1> 	and	bl, bl
  3023 0000C74D 751A                <1> 	jnz	short sysvideo_14
  3024                              <1> 
  3025                              <1> 	; BL =	0 = Fill color (color in CL] (32K)
  3026                              <1> 
  3027 0000C74F 88C8                <1> 	mov	al, cl
  3028 0000C751 B900800000          <1> 	mov	ecx, 32768
  3029 0000C756 66890D[1C470100]    <1> 	mov	[u.r0], cx
  3030 0000C75D BF00800B00          <1> 	mov	edi, 0B8000h
  3031 0000C762 F3AB                <1> 	rep	stosd
  3032 0000C764 E944F4FFFF          <1> 	jmp	sysret
  3033                              <1> 
  3034                              <1> sysvideo_14:
  3035 0000C769 80FB01              <1> 	cmp	bl, 1
  3036 0000C76C 7723                <1> 	ja	short sysvideo_16
  3037                              <1> 
  3038 0000C76E 89CE                <1> 	mov	esi, ecx ; user buffer
  3039                              <1> 	; BL = 1 = user to system video/display page transfer
  3040                              <1> sysvideo_15:	
  3041 0000C770 BF00800B00          <1> 	mov	edi, 0B8000h
  3042                              <1> 	; edi = video page address
  3043 0000C775 B900800000          <1> 	mov	ecx, 32768
  3044 0000C77A E845170000          <1> 	call	transfer_from_user_buffer ; fast transfer
  3045 0000C77F 0F8228F4FFFF        <1> 	jc	sysret ; [u.r0] = 0
  3046 0000C785 66890D[1C470100]    <1> 	mov	[u.r0], cx		
  3047 0000C78C E91CF4FFFF          <1> 	jmp	sysret
  3048                              <1> 
  3049                              <1> sysvideo_16:
  3050 0000C791 80FB02              <1> 	cmp	bl, 2	
  3051 0000C794 7723                <1> 	ja	short sysvideo_18
  3052                              <1> 
  3053 0000C796 89CF                <1> 	mov	edi, ecx ; user buffer
  3054                              <1> 	; BL = 2 = system to user video/display page transfer
  3055                              <1> sysvideo_17:	
  3056 0000C798 BE00800B00          <1> 	mov	esi, 0B8000h
  3057 0000C79D B900800000          <1> 	mov	ecx, 32768
  3058 0000C7A2 E8D3160000          <1> 	call	transfer_to_user_buffer ; fast transfer
  3059 0000C7A7 0F8200F4FFFF        <1> 	jc	sysret ; [u.r0] = 0
  3060 0000C7AD 66890D[1C470100]    <1> 	mov	[u.r0], cx
  3061 0000C7B4 E9F4F3FFFF          <1> 	jmp	sysret 	
  3062                              <1> 
  3063                              <1> sysvideo_18:
  3064 0000C7B9 80FB03              <1> 	cmp	bl, 3
  3065 0000C7BC 777E                <1> 	ja	short sysvideo_23
  3066                              <1> 
  3067                              <1> 	; BL = 3 = NOT bits in window (ECX, EDX)
  3068                              <1> 
  3069 0000C7BE BF00800B00          <1> 	mov	edi, 0B8000h
  3070 0000C7C3 89FE                <1> 	mov	esi, edi
  3071                              <1> 	
  3072 0000C7C5 39CA                <1> 	cmp	edx, ecx ; bottom-right > top-left ?
  3073 0000C7C7 7716                <1> 	ja	short sysvideo_20 ; window
  3074                              <1> 	; full screen (update)
  3075 0000C7C9 B900800000          <1> 	mov	ecx, 32768
  3076 0000C7CE 66890D[1C470100]    <1> 	mov	[u.r0], cx
  3077                              <1> sysvideo_19:
  3078 0000C7D5 F616                <1> 	not	byte [esi] ; NOT operation
  3079 0000C7D7 46                  <1> 	inc	esi
  3080 0000C7D8 E2FB                <1> 	loop	sysvideo_19
  3081 0000C7DA E9CEF3FFFF          <1> 	jmp	sysret
  3082                              <1> sysvideo_20:
  3083 0000C7DF 0FB7C2              <1> 	movzx	eax, dx ; bottom right column
  3084 0000C7E2 6629C8              <1> 	sub	ax, cx  ; - top left column
  3085 0000C7E5 0F82C2F3FFFF        <1>         jb      sysret ; invalid
  3086 0000C7EB 6640                <1> 	inc	ax ; same column no == 1 column	 
  3087 0000C7ED 50                  <1> 	push	eax ; byte count per window row
  3088 0000C7EE 52                  <1> 	push	edx
  3089 0000C7EF BB40010000          <1> 	mov	ebx, 320 ; screen width
  3090 0000C7F4 89C8                <1> 	mov	eax, ecx
  3091 0000C7F6 C1E810              <1> 	shr	eax, 16  ; top row
  3092 0000C7F9 F7E3                <1> 	mul	ebx
  3093 0000C7FB 6689CA              <1> 	mov	dx, cx ; top left column
  3094 0000C7FE 01D0                <1> 	add	eax, edx
  3095 0000C800 01C6                <1> 	add	esi, eax ; start address 
  3096 0000C802 59                  <1> 	pop	ecx ; edx
  3097 0000C803 89C8                <1> 	mov	eax, ecx
  3098 0000C805 C1E810              <1> 	shr	eax, 16 ; bottom row
  3099 0000C808 F7E3                <1> 	mul	ebx
  3100 0000C80A 6689CA              <1> 	mov	dx, cx ; bottom right column
  3101 0000C80D 01D0                <1> 	add	eax, edx
  3102 0000C80F 01C7                <1> 	add	edi, eax ; stop address (included)
  3103 0000C811 5A                  <1> 	pop	edx ; byte count per window row
  3104 0000C812 81FFFFFF0B00        <1> 	cmp	edi, 0BFFFFh
  3105 0000C818 0F878FF3FFFF        <1> 	ja	sysret	
  3106 0000C81E 56                  <1> 	push	esi
  3107 0000C81F 4E                  <1> 	dec	esi
  3108                              <1> sysvideo_21:
  3109 0000C820 89D1                <1> 	mov	ecx, edx
  3110                              <1> sysvideo_22:
  3111 0000C822 46                  <1> 	inc	esi
  3112 0000C823 F616                <1> 	not	byte [esi]
  3113 0000C825 E2FB                <1> 	loop	sysvideo_22
  3114 0000C827 01DE                <1> 	add	esi, ebx ; bytes per screen row
  3115                              <1> 	;
  3116 0000C829 39FE                <1> 	cmp	esi, edi ; stop address (included in loop)
  3117 0000C82B 76F3                <1> 	jna	short sysvideo_21
  3118 0000C82D 5E                  <1> 	pop	esi
  3119 0000C82E 29F7                <1> 	sub	edi, esi
  3120 0000C830 66893D[1C470100]    <1> 	mov	[u.r0], di
  3121 0000C837 E971F3FFFF          <1> 	jmp	sysret
  3122                              <1> 
  3123                              <1> sysvideo_23:
  3124 0000C83C 80FB04              <1> 	cmp	bl, 4
  3125 0000C83F 0F87A7000000        <1>         ja      sysvideo_26
  3126                              <1> 
  3127                              <1> 	; BL = 4 = window copy (system to system)
  3128                              <1> 
  3129 0000C845 B800800B00          <1> 	mov	eax, 0B8000h
  3130 0000C84A 39C6                <1> 	cmp	esi, eax
  3131 0000C84C 0F825BF3FFFF        <1> 	jb	sysret
  3132 0000C852 39C7                <1> 	cmp	edi, eax
  3133 0000C854 0F8253F3FFFF        <1> 	jb	sysret
  3134 0000C85A 6605FF7F            <1> 	add	ax, 7FFFh ; 32767
  3135 0000C85E 39C6                <1> 	cmp	esi, eax
  3136 0000C860 0F8747F3FFFF        <1> 	ja	sysret
  3137 0000C866 39C7                <1> 	cmp	edi, eax
  3138 0000C868 0F873FF3FFFF        <1> 	ja	sysret
  3139                              <1> 	
  3140 0000C86E 39CA                <1> 	cmp	edx, ecx ; bottom-right > top-left ?
  3141 0000C870 7714                <1> 	ja	short sysvideo_24 ; window
  3142                              <1> 	; full screen copy
  3143 0000C872 89C1                <1> 	mov	ecx, eax
  3144 0000C874 29F9                <1> 	sub	ecx, edi
  3145 0000C876 6641                <1> 	inc	cx
  3146 0000C878 66890D[1C470100]    <1> 	mov	[u.r0], cx
  3147 0000C87F F3A4                <1> 	rep	movsb
  3148 0000C881 E927F3FFFF          <1> 	jmp	sysret
  3149                              <1> sysvideo_24:
  3150 0000C886 0FB7C2              <1> 	movzx	eax, dx ; bottom right column
  3151 0000C889 6629C8              <1> 	sub	ax, cx  ; - top left column
  3152 0000C88C 0F821BF3FFFF        <1>         jb      sysret ; invalid
  3153 0000C892 6640                <1> 	inc	ax ; same column no == 1 column	 
  3154 0000C894 50                  <1> 	push	eax ; byte count per window row
  3155                              <1> 	;
  3156 0000C895 52                  <1> 	push	edx
  3157 0000C896 BB40010000          <1> 	mov	ebx, 320 ; screen width
  3158 0000C89B 89C8                <1> 	mov	eax, ecx
  3159 0000C89D C1E810              <1> 	shr	eax, 16	; top row
  3160 0000C8A0 F7E3                <1> 	mul	ebx
  3161 0000C8A2 6689CA              <1> 	mov	dx, cx ; top left column
  3162 0000C8A5 01D0                <1> 	add	eax, edx
  3163 0000C8A7 01C7                <1> 	add	edi, eax ; start address 
  3164 0000C8A9 01C6                <1> 	add	esi, eax
  3165 0000C8AB 59                  <1> 	pop	ecx ; edx
  3166 0000C8AC 89C8                <1> 	mov	eax, ecx
  3167 0000C8AE C1E810              <1> 	shr	eax, 16 ; bottom row
  3168 0000C8B1 F7E3                <1> 	mul	ebx
  3169 0000C8B3 6689CA              <1> 	mov	dx, cx ; bottom right column
  3170 0000C8B6 01D0                <1> 	add	eax, edx
  3171 0000C8B8 5A                  <1> 	pop	edx ; byte count per window row
  3172 0000C8B9 0500800B00          <1> 	add	eax, 0B8000h
  3173 0000C8BE 3DFFFF0B00          <1> 	cmp	eax, 0BFFFFh
  3174 0000C8C3 0F87E4F2FFFF        <1> 	ja	sysret
  3175 0000C8C9 57                  <1> 	push	edi ; start address 
  3176 0000C8CA 50                  <1> 	push	eax ; stop address (included)
  3177                              <1> sysvideo_25:
  3178 0000C8CB 89D1                <1> 	mov	ecx, edx
  3179 0000C8CD F3A4                <1> 	rep	movsb
  3180 0000C8CF 4F                  <1> 	dec	edi
  3181 0000C8D0 4E                  <1> 	dec	esi
  3182 0000C8D1 01DF                <1> 	add	edi, ebx ; bytes per screen row
  3183 0000C8D3 01DE                <1> 	add	esi, ebx
  3184                              <1> 	;
  3185 0000C8D5 3B3C24              <1> 	cmp	edi, [esp] ; stop addr(included in loop)
  3186 0000C8D8 76F1                <1> 	jna	short sysvideo_25
  3187 0000C8DA 5B                  <1> 	pop	ebx ; stop address
  3188 0000C8DB 5F                  <1> 	pop	edi ; start address
  3189 0000C8DC 29FB                <1> 	sub	ebx, edi
  3190 0000C8DE 6643                <1> 	inc	bx
  3191 0000C8E0 66891D[1C470100]    <1> 	mov	[u.r0], bx	
  3192 0000C8E7 E9C1F2FFFF          <1> 	jmp	sysret
  3193                              <1> 
  3194                              <1> sysvideo_26:
  3195 0000C8EC 80FB05              <1> 	cmp	bl, 5
  3196 0000C8EF 0F8795000000        <1>         ja      sysvideo_29
  3197                              <1> 
  3198                              <1> 	; BL = 5 = window copy (user to system)
  3199                              <1> 
  3200 0000C8F5 B800800B00          <1> 	mov	eax, 0B8000h
  3201 0000C8FA 39C7                <1> 	cmp	edi, eax
  3202 0000C8FC 0F82ABF2FFFF        <1> 	jb	sysret
  3203 0000C902 6605FF7F            <1> 	add	ax, 7FFFh ; 32767
  3204 0000C906 39C7                <1> 	cmp	edi, eax
  3205 0000C908 0F879FF2FFFF        <1> 	ja	sysret
  3206                              <1> 
  3207                              <1> 	; esi = user buffer (in user's memory space)
  3208 0000C90E 39CA                <1> 	cmp	edx, ecx ; bottom-right > top-left ?
  3209 0000C910 0F865AFEFFFF        <1>         jna     sysvideo_15 ; full screen copy
  3210                              <1> 
  3211 0000C916 0FB7C2              <1> 	movzx	eax, dx ; bottom right column
  3212 0000C919 6629C8              <1> 	sub	ax, cx  ; - top left column
  3213 0000C91C 0F828BF2FFFF        <1>         jb      sysret ; invalid
  3214 0000C922 6640                <1> 	inc	ax ; same column no == 1 column	 
  3215 0000C924 50                  <1> 	push	eax ; byte count per window row
  3216                              <1> 
  3217 0000C925 52                  <1> 	push	edx
  3218 0000C926 BB40010000          <1> 	mov	ebx, 320 ; screen width
  3219 0000C92B 89C8                <1> 	mov	eax, ecx
  3220 0000C92D C1E810              <1> 	shr	eax, 16	; top row
  3221 0000C930 F7E3                <1> 	mul	ebx
  3222 0000C932 6689CA              <1> 	mov	dx, cx ; top left column
  3223 0000C935 01D0                <1> 	add	eax, edx
  3224 0000C937 01C7                <1> 	add	edi, eax ; start address 
  3225 0000C939 59                  <1> 	pop	ecx ; edx
  3226 0000C93A 89C8                <1> 	mov	eax, ecx
  3227 0000C93C C1E810              <1> 	shr	eax, 16 ; bottom row
  3228 0000C93F F7E3                <1> 	mul	ebx
  3229 0000C941 6689CA              <1> 	mov	dx, cx ; bottom right column
  3230 0000C944 01D0                <1> 	add	eax, edx
  3231 0000C946 5A                  <1> 	pop	edx ; byte count per window row
  3232 0000C947 0500800B00          <1> 	add	eax, 0B8000h
  3233 0000C94C 3DFFFF0B00          <1> 	cmp	eax, 0BFFFFh
  3234 0000C951 0F8756F2FFFF        <1> 	ja	sysret
  3235 0000C957 57                  <1> 	push	edi ; start address 
  3236 0000C958 50                  <1> 	push	eax ; stop address (included)
  3237                              <1> sysvideo_27:
  3238 0000C959 89D1                <1> 	mov	ecx, edx ; byte count
  3239                              <1> 	; user to system video/display page window transfer
  3240                              <1> 	; esi =	user buffer
  3241 0000C95B E864150000          <1> 	call	transfer_from_user_buffer ; fast transfer
  3242 0000C960 7221                <1> 	jc	short sysvideo_28
  3243 0000C962 010D[1C470100]      <1> 	add	[u.r0], ecx
  3244 0000C968 01DF                <1> 	add	edi, ebx ; next row
  3245 0000C96A 01CE                <1> 	add	esi, ecx
  3246 0000C96C 3B3C24              <1> 	cmp	edi, [esp] ; stop addr(included in loop)
  3247 0000C96F 76E8                <1> 	jna	short sysvideo_27
  3248 0000C971 5B                  <1> 	pop	ebx ; stop address
  3249 0000C972 5F                  <1> 	pop	edi ; start address
  3250 0000C973 29FB                <1> 	sub	ebx, edi
  3251 0000C975 6643                <1> 	inc	bx
  3252 0000C977 66891D[1C470100]    <1> 	mov	[u.r0], bx	
  3253 0000C97E E92AF2FFFF          <1> 	jmp	sysret
  3254                              <1> sysvideo_28:
  3255 0000C983 58                  <1> 	pop	eax
  3256 0000C984 5A                  <1> 	pop	edx
  3257 0000C985 E923F2FFFF          <1> 	jmp	sysret
  3258                              <1> 
  3259                              <1> sysvideo_29:
  3260 0000C98A 80FB06              <1> 	cmp	bl, 6
  3261 0000C98D 0F8797000000        <1>         ja      sysvideo_32
  3262                              <1> 
  3263                              <1> 	; BL = 6 = window copy (system to user)
  3264                              <1> 
  3265 0000C993 89F7                <1> 	mov	edi, esi ; user buffer
  3266                              <1> 
  3267 0000C995 B800800B00          <1> 	mov	eax, 0B8000h
  3268 0000C99A 39C6                <1> 	cmp	esi, eax
  3269 0000C99C 0F820BF2FFFF        <1> 	jb	sysret
  3270 0000C9A2 6605FF7F            <1> 	add	ax, 7FFFh ; 32767
  3271 0000C9A6 39C6                <1> 	cmp	esi, eax
  3272 0000C9A8 0F87FFF1FFFF        <1> 	ja	sysret
  3273                              <1> 
  3274                              <1> 	; edi = user buffer (in user's memory space)
  3275 0000C9AE 39CA                <1> 	cmp	edx, ecx ; bottom-right > top-left ?
  3276 0000C9B0 0F86E2FDFFFF        <1>         jna     sysvideo_17 ; full screen copy
  3277                              <1> 
  3278 0000C9B6 0FB7C2              <1> 	movzx	eax, dx ; bottom right column
  3279 0000C9B9 6629C8              <1> 	sub	ax, cx  ; - top left column
  3280 0000C9BC 0F82EBF1FFFF        <1>         jb      sysret ; invalid
  3281 0000C9C2 6640                <1> 	inc	ax ; same column no == 1 column	 
  3282 0000C9C4 50                  <1> 	push	eax ; byte count per window row
  3283                              <1> 
  3284 0000C9C5 52                  <1> 	push	edx
  3285 0000C9C6 BB40010000          <1> 	mov	ebx, 320 ; screen width
  3286 0000C9CB 89C8                <1> 	mov	eax, ecx
  3287 0000C9CD C1E810              <1> 	shr	eax, 16	; top row
  3288 0000C9D0 F7E3                <1> 	mul	ebx
  3289 0000C9D2 6689CA              <1> 	mov	dx, cx ; top left column
  3290 0000C9D5 01D0                <1> 	add	eax, edx
  3291 0000C9D7 01C6                <1> 	add	esi, eax ; start address 
  3292 0000C9D9 59                  <1> 	pop	ecx ; edx
  3293 0000C9DA 89C8                <1> 	mov	eax, ecx
  3294 0000C9DC C1E810              <1> 	shr	eax, 16 ; bottom row
  3295 0000C9DF F7E3                <1> 	mul	ebx
  3296 0000C9E1 6689CA              <1> 	mov	dx, cx ; bottom right column
  3297 0000C9E4 01D0                <1> 	add	eax, edx
  3298 0000C9E6 5A                  <1> 	pop	edx ; byte count per window row
  3299 0000C9E7 0500800B00          <1> 	add	eax, 0B8000h
  3300 0000C9EC 3DFFFF0B00          <1> 	cmp	eax, 0BFFFFh
  3301 0000C9F1 0F87B6F1FFFF        <1> 	ja	sysret
  3302 0000C9F7 56                  <1> 	push	esi ; start address 
  3303 0000C9F8 50                  <1> 	push	eax ; stop address (included)
  3304                              <1> sysvideo_30:
  3305 0000C9F9 89D1                <1> 	mov	ecx, edx ; byte count
  3306                              <1> 	; user to system video/display page window transfer
  3307                              <1> 	; esi =	user buffer
  3308 0000C9FB E87A140000          <1> 	call	transfer_to_user_buffer ; fast transfer
  3309 0000CA00 7221                <1> 	jc	short sysvideo_31
  3310 0000CA02 010D[1C470100]      <1> 	add	[u.r0], ecx
  3311 0000CA08 01DF                <1> 	add	edi, ebx ; next row
  3312 0000CA0A 01CE                <1> 	add	esi, ecx
  3313 0000CA0C 3B3C24              <1> 	cmp	edi, [esp] ; stop addr(included in loop)
  3314 0000CA0F 76E8                <1> 	jna	short sysvideo_30
  3315 0000CA11 5B                  <1> 	pop	ebx ; stop address
  3316 0000CA12 5F                  <1> 	pop	edi ; start address
  3317 0000CA13 29FB                <1> 	sub	ebx, edi
  3318 0000CA15 6643                <1> 	inc	bx
  3319 0000CA17 66891D[1C470100]    <1> 	mov	[u.r0], bx	
  3320 0000CA1E E98AF1FFFF          <1> 	jmp	sysret
  3321                              <1> sysvideo_31:
  3322 0000CA23 58                  <1> 	pop	eax
  3323 0000CA24 5A                  <1> 	pop	edx
  3324 0000CA25 E983F1FFFF          <1> 	jmp	sysret
  3325                              <1> 
  3326                              <1> sysvideo_32:
  3327 0000CA2A 80FB07              <1> 	cmp	bl, 7
  3328 0000CA2D 770F                <1> 	ja	short sysvideo_34
  3329                              <1> 
  3330                              <1> 	; BL = 7 = AND display page bytes with CL
  3331                              <1> 
  3332 0000CA2F BE00800B00          <1> 	mov	esi, 0B8000h
  3333 0000CA34 B900800000          <1> 	mov	ecx, 32768
  3334                              <1> sysvideo_33:
  3335 0000CA39 200E                <1> 	and	byte [esi], cl
  3336 0000CA3B 46                  <1> 	inc	esi
  3337 0000CA3C E2FB                <1> 	loop	sysvideo_33
  3338                              <1> 
  3339                              <1> sysvideo_34:
  3340 0000CA3E 80FB08              <1> 	cmp	bl, 8
  3341 0000CA41 770F                <1> 	ja	short sysvideo_36
  3342                              <1> 
  3343                              <1> 	; BL = 8 = OR display page bytes with CL
  3344                              <1> 
  3345 0000CA43 BE00800B00          <1> 	mov	esi, 0B8000h
  3346 0000CA48 B900800000          <1> 	mov	ecx, 32768
  3347                              <1> sysvideo_35:
  3348 0000CA4D 080E                <1> 	or	byte [esi], cl
  3349 0000CA4F 46                  <1> 	inc	esi
  3350 0000CA50 E2FB                <1> 	loop	sysvideo_35	
  3351                              <1> 
  3352                              <1> sysvideo_36:
  3353 0000CA52 80FB09              <1> 	cmp	bl, 9
  3354 0000CA55 0F8752F1FFFF        <1>         ja      sysret ; nothing to do
  3355                              <1> 
  3356                              <1> 	; BL = 9 = XOR display page bytes with CL
  3357                              <1> 
  3358 0000CA5B BE00800B00          <1> 	mov	esi, 0B8000h
  3359 0000CA60 B900800000          <1> 	mov	ecx, 32768
  3360                              <1> sysvideo_37:
  3361 0000CA65 300E                <1> 	xor	byte [esi], cl
  3362 0000CA67 46                  <1> 	inc	esi
  3363 0000CA68 E2FB                <1> 	loop	sysvideo_37
  3364                              <1> 
  3365                              <1> sysvideo_38:
  3366 0000CA6A 80FF02              <1> 	cmp	bh, 2
  3367 0000CA6D 0F8733030000        <1>         ja      sysvideo_64
  3368                              <1> 	; BH = 2 = VGA Graphics (0A0000h) data transfers
  3369                              <1> 
  3370 0000CA73 88DC                <1> 	mov	ah, bl
  3371 0000CA75 80E30F              <1> 	and	bl, 0Fh	
  3372 0000CA78 C0EC04              <1> 	shr	ah, 4
  3373 0000CA7B C1E310              <1> 	shl	ebx, 16
  3374 0000CA7E 66BB4001            <1> 	mov	bx, 320 ; 320*200, 320*240
  3375 0000CA82 20E4                <1> 	and	ah, ah
  3376 0000CA84 7413                <1> 	jz	short sysvideo_39
  3377 0000CA86 66D1E3              <1> 	shl	bx, 1 ; 640*200, 640 * 400, 640*480
  3378 0000CA89 80FC02              <1> 	cmp	ah, 2
  3379 0000CA8C 720B                <1> 	jb	short sysvideo_39 		
  3380 0000CA8E 0F8719F1FFFF        <1> 	ja	sysret ; invalid
  3381                              <1> 	; 800*600
  3382 0000CA94 6681C3A000          <1> 	add	bx, 160 ; 800
  3383                              <1> sysvideo_39:
  3384 0000CA99 C1CB10              <1> 	ror	ebx, 16
  3385                              <1> 		
  3386 0000CA9C 20DB                <1>  	and	bl, bl
  3387 0000CA9E 7519                <1> 	jnz	short sysvideo_40
  3388                              <1> 
  3389                              <1> 	; BL =	0 = Fill color (color in CL] (64K)
  3390                              <1> 
  3391 0000CAA0 88C8                <1> 	mov	al, cl
  3392 0000CAA2 B900000100          <1> 	mov	ecx, 65536
  3393 0000CAA7 890D[1C470100]      <1> 	mov	[u.r0], ecx
  3394 0000CAAD BF00000A00          <1> 	mov	edi, 0A0000h
  3395 0000CAB2 F3AB                <1> 	rep	stosd
  3396 0000CAB4 E9F4F0FFFF          <1> 	jmp	sysret
  3397                              <1> 
  3398                              <1> sysvideo_40:
  3399 0000CAB9 80FB01              <1> 	cmp	bl, 1
  3400 0000CABC 7722                <1> 	ja	short sysvideo_42
  3401                              <1> 
  3402 0000CABE 89CE                <1> 	mov	esi, ecx ; user buffer
  3403                              <1> 	; BL = 1 = user to system video/display page transfer
  3404                              <1> sysvideo_41:	
  3405 0000CAC0 BF00000A00          <1> 	mov	edi, 0A0000h
  3406                              <1> 	; edi = video page address
  3407 0000CAC5 B900000100          <1> 	mov	ecx, 65536
  3408 0000CACA E8F5130000          <1> 	call	transfer_from_user_buffer ; fast transfer
  3409 0000CACF 0F82D8F0FFFF        <1> 	jc	sysret ; [u.r0] = 0
  3410 0000CAD5 890D[1C470100]      <1> 	mov	[u.r0], ecx		
  3411 0000CADB E9CDF0FFFF          <1> 	jmp	sysret
  3412                              <1> 
  3413                              <1> sysvideo_42:
  3414 0000CAE0 80FB02              <1> 	cmp	bl, 2	
  3415 0000CAE3 7722                <1> 	ja	short sysvideo_44
  3416                              <1> 
  3417 0000CAE5 89CF                <1> 	mov	edi, ecx ; user buffer
  3418                              <1> 	; BL = 2 = system to user video/display page transfer
  3419                              <1> sysvideo_43:	
  3420 0000CAE7 BE00000A00          <1> 	mov	esi, 0A0000h
  3421 0000CAEC B900000100          <1> 	mov	ecx, 65536
  3422 0000CAF1 E884130000          <1> 	call	transfer_to_user_buffer ; fast transfer
  3423 0000CAF6 0F82B1F0FFFF        <1> 	jc	sysret ; [u.r0] = 0
  3424 0000CAFC 890D[1C470100]      <1> 	mov	[u.r0], ecx
  3425 0000CB02 E9A6F0FFFF          <1> 	jmp	sysret 	
  3426                              <1> 
  3427                              <1> sysvideo_44:
  3428 0000CB07 80FB03              <1> 	cmp	bl, 3
  3429 0000CB0A 777A                <1> 	ja	short sysvideo_49
  3430                              <1> 
  3431                              <1> 	; BL = 3 = NOT bits in window (ECX, EDX)
  3432                              <1> 
  3433 0000CB0C BF00000A00          <1> 	mov	edi, 0A0000h
  3434 0000CB11 89FE                <1> 	mov	esi, edi
  3435                              <1> 	
  3436 0000CB13 39CA                <1> 	cmp	edx, ecx ; bottom-right > top-left ?
  3437 0000CB15 770B                <1> 	ja	short sysvideo_45 ; window
  3438                              <1> 	; full screen (update)
  3439 0000CB17 B900000100          <1> 	mov	ecx, 65536
  3440 0000CB1C 890D[1C470100]      <1> 	mov	[u.r0], ecx
  3441                              <1> sysvideo_45:
  3442 0000CB22 F616                <1> 	not	byte [esi] ; NOT operation
  3443 0000CB24 46                  <1> 	inc	esi
  3444 0000CB25 E2FB                <1> 	loop	sysvideo_45
  3445 0000CB27 E981F0FFFF          <1> 	jmp	sysret
  3446                              <1> sysvideo_46:
  3447 0000CB2C 0FB7C2              <1> 	movzx	eax, dx ; bottom right column
  3448 0000CB2F 6629C8              <1> 	sub	ax, cx  ; - top left column
  3449 0000CB32 0F8275F0FFFF        <1>         jb      sysret ; invalid
  3450 0000CB38 6640                <1> 	inc	ax ; same column no == 1 column	 
  3451 0000CB3A 50                  <1> 	push	eax ; byte count per window row
  3452 0000CB3B 52                  <1> 	push	edx
  3453 0000CB3C C1EB10              <1> 	shr	ebx, 16 ; 320,640,800 : screen width
  3454 0000CB3F 89C8                <1> 	mov	eax, ecx
  3455 0000CB41 C1E810              <1> 	shr	eax, 16  ; top row
  3456 0000CB44 F7E3                <1> 	mul	ebx
  3457 0000CB46 6689CA              <1> 	mov	dx, cx ; top left column
  3458 0000CB49 01D0                <1> 	add	eax, edx
  3459 0000CB4B 01C6                <1> 	add	esi, eax ; start address 
  3460 0000CB4D 59                  <1> 	pop	ecx ; edx
  3461 0000CB4E 89C8                <1> 	mov	eax, ecx
  3462 0000CB50 C1E810              <1> 	shr	eax, 16 ; bottom row
  3463 0000CB53 F7E3                <1> 	mul	ebx
  3464 0000CB55 6689CA              <1> 	mov	dx, cx ; bottom right column
  3465 0000CB58 01D0                <1> 	add	eax, edx
  3466 0000CB5A 01C7                <1> 	add	edi, eax ; stop address (included)
  3467 0000CB5C 5A                  <1> 	pop	edx ; byte count per window row
  3468 0000CB5D 81FFFFFF0A00        <1> 	cmp	edi, 0AFFFFh
  3469 0000CB63 0F8744F0FFFF        <1> 	ja	sysret	
  3470 0000CB69 56                  <1> 	push	esi
  3471 0000CB6A 4E                  <1> 	dec	esi
  3472                              <1> sysvideo_47:
  3473 0000CB6B 89D1                <1> 	mov	ecx, edx
  3474                              <1> sysvideo_48:
  3475 0000CB6D 46                  <1> 	inc	esi
  3476 0000CB6E F616                <1> 	not	byte [esi]
  3477 0000CB70 E2FB                <1> 	loop	sysvideo_48
  3478 0000CB72 01DE                <1> 	add	esi, ebx ; bytes per screen row
  3479                              <1> 	;
  3480 0000CB74 39FE                <1> 	cmp	esi, edi ; stop address (included in loop)
  3481 0000CB76 76F3                <1> 	jna	short sysvideo_47
  3482 0000CB78 5E                  <1> 	pop	esi
  3483 0000CB79 29F7                <1> 	sub	edi, esi
  3484 0000CB7B 893D[1C470100]      <1> 	mov	[u.r0], edi
  3485 0000CB81 E927F0FFFF          <1> 	jmp	sysret
  3486                              <1> 
  3487                              <1> sysvideo_49:
  3488 0000CB86 80FB04              <1> 	cmp	bl, 4
  3489 0000CB89 0F87A1000000        <1>         ja      sysvideo_52
  3490                              <1> 
  3491                              <1> 	; BL = 4 = window copy (system to system)
  3492                              <1> 
  3493 0000CB8F B800000A00          <1> 	mov	eax, 0A0000h
  3494 0000CB94 39C6                <1> 	cmp	esi, eax
  3495 0000CB96 0F8211F0FFFF        <1> 	jb	sysret
  3496 0000CB9C 39C7                <1> 	cmp	edi, eax
  3497 0000CB9E 0F8209F0FFFF        <1> 	jb	sysret
  3498 0000CBA4 6683C0FF            <1> 	add	ax, 0FFFFh ; 65535
  3499 0000CBA8 39C6                <1> 	cmp	esi, eax
  3500 0000CBAA 0F87FDEFFFFF        <1> 	ja	sysret
  3501 0000CBB0 39C7                <1> 	cmp	edi, eax
  3502 0000CBB2 0F87F5EFFFFF        <1> 	ja	sysret
  3503                              <1> 	
  3504 0000CBB8 39CA                <1> 	cmp	edx, ecx ; bottom-right > top-left ?
  3505 0000CBBA 7712                <1> 	ja	short sysvideo_50 ; window
  3506                              <1> 	; full screen copy
  3507 0000CBBC 89C1                <1> 	mov	ecx, eax
  3508 0000CBBE 29F9                <1> 	sub	ecx, edi
  3509 0000CBC0 41                  <1> 	inc	ecx
  3510 0000CBC1 890D[1C470100]      <1> 	mov	[u.r0], ecx
  3511 0000CBC7 F3A4                <1> 	rep	movsb
  3512 0000CBC9 E9DFEFFFFF          <1> 	jmp	sysret
  3513                              <1> sysvideo_50:
  3514 0000CBCE 0FB7C2              <1> 	movzx	eax, dx ; bottom right column
  3515 0000CBD1 6629C8              <1> 	sub	ax, cx  ; - top left column
  3516 0000CBD4 0F82D3EFFFFF        <1>         jb      sysret ; invalid
  3517 0000CBDA 6640                <1> 	inc	ax ; same column no == 1 column	 
  3518 0000CBDC 50                  <1> 	push	eax ; byte count per window row
  3519                              <1> 	;
  3520 0000CBDD 52                  <1> 	push	edx
  3521 0000CBDE C1EB10              <1> 	shr	ebx, 16 ; 320,640,800 : screen width
  3522 0000CBE1 89C8                <1> 	mov	eax, ecx
  3523 0000CBE3 C1E810              <1> 	shr	eax, 16	; top row
  3524 0000CBE6 F7E3                <1> 	mul	ebx
  3525 0000CBE8 6689CA              <1> 	mov	dx, cx ; top left column
  3526 0000CBEB 01D0                <1> 	add	eax, edx
  3527 0000CBED 01C7                <1> 	add	edi, eax ; start address 
  3528 0000CBEF 01C6                <1> 	add	esi, eax
  3529 0000CBF1 59                  <1> 	pop	ecx ; edx
  3530 0000CBF2 89C8                <1> 	mov	eax, ecx
  3531 0000CBF4 C1E810              <1> 	shr	eax, 16 ; bottom row
  3532 0000CBF7 F7E3                <1> 	mul	ebx
  3533 0000CBF9 6689CA              <1> 	mov	dx, cx ; bottom right column
  3534 0000CBFC 01D0                <1> 	add	eax, edx
  3535 0000CBFE 5A                  <1> 	pop	edx ; byte count per window row
  3536 0000CBFF 0500000A00          <1> 	add	eax, 0A0000h
  3537 0000CC04 3DFFFF0A00          <1> 	cmp	eax, 0AFFFFh
  3538 0000CC09 0F879EEFFFFF        <1> 	ja	sysret
  3539 0000CC0F 57                  <1> 	push	edi ; start address 
  3540 0000CC10 50                  <1> 	push	eax ; stop address (included)
  3541                              <1> sysvideo_51:
  3542 0000CC11 89D1                <1> 	mov	ecx, edx
  3543 0000CC13 F3A4                <1> 	rep	movsb
  3544 0000CC15 4F                  <1> 	dec	edi
  3545 0000CC16 4E                  <1> 	dec	esi
  3546 0000CC17 01DF                <1> 	add	edi, ebx ; bytes per screen row
  3547 0000CC19 01DE                <1> 	add	esi, ebx
  3548                              <1> 	;
  3549 0000CC1B 3B3C24              <1> 	cmp	edi, [esp] ; stop addr(included in loop)
  3550 0000CC1E 76F1                <1> 	jna	short sysvideo_51
  3551 0000CC20 5B                  <1> 	pop	ebx ; stop address
  3552 0000CC21 5F                  <1> 	pop	edi ; start address
  3553 0000CC22 29FB                <1> 	sub	ebx, edi
  3554 0000CC24 43                  <1> 	inc	ebx
  3555 0000CC25 891D[1C470100]      <1> 	mov	[u.r0], ebx	
  3556 0000CC2B E97DEFFFFF          <1> 	jmp	sysret
  3557                              <1> 
  3558                              <1> sysvideo_52:
  3559 0000CC30 80FB05              <1> 	cmp	bl, 5
  3560 0000CC33 0F8791000000        <1>         ja      sysvideo_55
  3561                              <1> 
  3562                              <1> 	; BL = 5 = window copy (user to system)
  3563                              <1> 
  3564 0000CC39 B800000A00          <1> 	mov	eax, 0A0000h
  3565 0000CC3E 39C7                <1> 	cmp	edi, eax
  3566 0000CC40 0F8267EFFFFF        <1> 	jb	sysret
  3567 0000CC46 6683C0FF            <1> 	add	ax, 0FFFFh ; 65535
  3568 0000CC4A 39C7                <1> 	cmp	edi, eax
  3569 0000CC4C 0F875BEFFFFF        <1> 	ja	sysret
  3570                              <1> 
  3571                              <1> 	; esi = user buffer (in user's memory space)
  3572 0000CC52 39CA                <1> 	cmp	edx, ecx ; bottom-right > top-left ?
  3573 0000CC54 0F8666FEFFFF        <1>         jna     sysvideo_41 ; full screen copy
  3574                              <1> 
  3575 0000CC5A 0FB7C2              <1> 	movzx	eax, dx ; bottom right column
  3576 0000CC5D 6629C8              <1> 	sub	ax, cx  ; - top left column
  3577 0000CC60 0F8247EFFFFF        <1>         jb      sysret ; invalid
  3578 0000CC66 6640                <1> 	inc	ax ; same column no == 1 column	 
  3579 0000CC68 50                  <1> 	push	eax ; byte count per window row
  3580                              <1> 
  3581 0000CC69 52                  <1> 	push	edx
  3582 0000CC6A C1EB10              <1> 	shr	ebx, 16 ; 320,640,800 : screen width
  3583 0000CC6D 89C8                <1> 	mov	eax, ecx
  3584 0000CC6F C1E810              <1> 	shr	eax, 16	; top row
  3585 0000CC72 F7E3                <1> 	mul	ebx
  3586 0000CC74 6689CA              <1> 	mov	dx, cx ; top left column
  3587 0000CC77 01D0                <1> 	add	eax, edx
  3588 0000CC79 01C7                <1> 	add	edi, eax ; start address 
  3589 0000CC7B 59                  <1> 	pop	ecx ; edx
  3590 0000CC7C 89C8                <1> 	mov	eax, ecx
  3591 0000CC7E C1E810              <1> 	shr	eax, 16 ; bottom row
  3592 0000CC81 F7E3                <1> 	mul	ebx
  3593 0000CC83 6689CA              <1> 	mov	dx, cx ; bottom right column
  3594 0000CC86 01D0                <1> 	add	eax, edx
  3595 0000CC88 5A                  <1> 	pop	edx ; byte count per window row
  3596 0000CC89 0500000A00          <1> 	add	eax, 0A0000h
  3597 0000CC8E 3DFFFF0A00          <1> 	cmp	eax, 0AFFFFh
  3598 0000CC93 0F8714EFFFFF        <1> 	ja	sysret
  3599 0000CC99 57                  <1> 	push	edi ; start address 
  3600 0000CC9A 50                  <1> 	push	eax ; stop address (included)
  3601                              <1> sysvideo_53:
  3602 0000CC9B 89D1                <1> 	mov	ecx, edx ; byte count
  3603                              <1> 	; user to system video/display page window transfer
  3604                              <1> 	; esi =	user buffer
  3605 0000CC9D E822120000          <1> 	call	transfer_from_user_buffer ; fast transfer
  3606 0000CCA2 721F                <1> 	jc	short sysvideo_54
  3607 0000CCA4 010D[1C470100]      <1> 	add	[u.r0], ecx
  3608 0000CCAA 01DF                <1> 	add	edi, ebx ; next row
  3609 0000CCAC 01CE                <1> 	add	esi, ecx
  3610 0000CCAE 3B3C24              <1> 	cmp	edi, [esp] ; stop addr(included in loop)
  3611 0000CCB1 76E8                <1> 	jna	short sysvideo_53
  3612 0000CCB3 5B                  <1> 	pop	ebx ; stop address
  3613 0000CCB4 5F                  <1> 	pop	edi ; start address
  3614 0000CCB5 29FB                <1> 	sub	ebx, edi
  3615 0000CCB7 43                  <1> 	inc	ebx
  3616 0000CCB8 891D[1C470100]      <1> 	mov	[u.r0], ebx	
  3617 0000CCBE E9EAEEFFFF          <1> 	jmp	sysret
  3618                              <1> sysvideo_54:
  3619 0000CCC3 58                  <1> 	pop	eax
  3620 0000CCC4 5A                  <1> 	pop	edx
  3621 0000CCC5 E9E3EEFFFF          <1> 	jmp	sysret
  3622                              <1> 
  3623                              <1> sysvideo_55:
  3624 0000CCCA 80FB06              <1> 	cmp	bl, 6
  3625 0000CCCD 0F8793000000        <1>         ja      sysvideo_58
  3626                              <1> 
  3627                              <1> 	; BL = 6 = window copy (system to user)
  3628                              <1> 
  3629 0000CCD3 89F7                <1> 	mov	edi, esi ; user buffer
  3630                              <1> 
  3631 0000CCD5 B800000A00          <1> 	mov	eax, 0A0000h
  3632 0000CCDA 39C6                <1> 	cmp	esi, eax
  3633 0000CCDC 0F82CBEEFFFF        <1> 	jb	sysret
  3634 0000CCE2 6683C0FF            <1> 	add	ax, 0FFFFh ; 65535
  3635 0000CCE6 39C6                <1> 	cmp	esi, eax
  3636 0000CCE8 0F87BFEEFFFF        <1> 	ja	sysret
  3637                              <1> 
  3638                              <1> 	; edi = user buffer (in user's memory space)
  3639 0000CCEE 39CA                <1> 	cmp	edx, ecx ; bottom-right > top-left ?
  3640 0000CCF0 0F86A2FAFFFF        <1>         jna     sysvideo_17 ; full screen copy
  3641                              <1> 
  3642 0000CCF6 0FB7C2              <1> 	movzx	eax, dx ; bottom right column
  3643 0000CCF9 6629C8              <1> 	sub	ax, cx  ; - top left column
  3644 0000CCFC 0F82ABEEFFFF        <1>         jb      sysret ; invalid
  3645 0000CD02 6640                <1> 	inc	ax ; same column no == 1 column	 
  3646 0000CD04 50                  <1> 	push	eax ; byte count per window row
  3647                              <1> 
  3648 0000CD05 52                  <1> 	push	edx
  3649 0000CD06 C1EB10              <1> 	shr	ebx, 16 ; 320, 640,800 ; screen width
  3650 0000CD09 89C8                <1> 	mov	eax, ecx
  3651 0000CD0B C1E810              <1> 	shr	eax, 16	; top row
  3652 0000CD0E F7E3                <1> 	mul	ebx
  3653 0000CD10 6689CA              <1> 	mov	dx, cx ; top left column
  3654 0000CD13 01D0                <1> 	add	eax, edx
  3655 0000CD15 01C6                <1> 	add	esi, eax ; start address 
  3656 0000CD17 59                  <1> 	pop	ecx ; edx
  3657 0000CD18 89C8                <1> 	mov	eax, ecx
  3658 0000CD1A C1E810              <1> 	shr	eax, 16 ; bottom row
  3659 0000CD1D F7E3                <1> 	mul	ebx
  3660 0000CD1F 6689CA              <1> 	mov	dx, cx ; bottom right column
  3661 0000CD22 01D0                <1> 	add	eax, edx
  3662 0000CD24 5A                  <1> 	pop	edx ; byte count per window row
  3663 0000CD25 0500000A00          <1> 	add	eax, 0A0000h
  3664 0000CD2A 3DFFFF0A00          <1> 	cmp	eax, 0AFFFFh
  3665 0000CD2F 0F8778EEFFFF        <1> 	ja	sysret
  3666 0000CD35 56                  <1> 	push	esi ; start address 
  3667 0000CD36 50                  <1> 	push	eax ; stop address (included)
  3668                              <1> sysvideo_56:
  3669 0000CD37 89D1                <1> 	mov	ecx, edx ; byte count
  3670                              <1> 	; user to system video/display page window transfer
  3671                              <1> 	; esi =	user buffer
  3672 0000CD39 E83C110000          <1> 	call	transfer_to_user_buffer ; fast transfer
  3673 0000CD3E 721F                <1> 	jc	short sysvideo_57
  3674 0000CD40 010D[1C470100]      <1> 	add	[u.r0], ecx
  3675 0000CD46 01DF                <1> 	add	edi, ebx ; next row
  3676 0000CD48 01CE                <1> 	add	esi, ecx
  3677 0000CD4A 3B3C24              <1> 	cmp	edi, [esp] ; stop addr(included in loop)
  3678 0000CD4D 76E8                <1> 	jna	short sysvideo_56
  3679 0000CD4F 5B                  <1> 	pop	ebx ; stop address
  3680 0000CD50 5F                  <1> 	pop	edi ; start address
  3681 0000CD51 29FB                <1> 	sub	ebx, edi
  3682 0000CD53 43                  <1> 	inc	ebx
  3683 0000CD54 891D[1C470100]      <1> 	mov	[u.r0], ebx	
  3684 0000CD5A E94EEEFFFF          <1> 	jmp	sysret
  3685                              <1> sysvideo_57:
  3686 0000CD5F 58                  <1> 	pop	eax
  3687 0000CD60 5A                  <1> 	pop	edx
  3688 0000CD61 E947EEFFFF          <1> 	jmp	sysret
  3689                              <1> 
  3690                              <1> sysvideo_58:
  3691 0000CD66 80FB07              <1> 	cmp	bl, 7
  3692 0000CD69 770F                <1> 	ja	short sysvideo_60
  3693                              <1> 
  3694                              <1> 	; BL = 7 = AND display page bytes with CL
  3695                              <1> 
  3696 0000CD6B BE00000A00          <1> 	mov	esi, 0A0000h
  3697 0000CD70 B900000100          <1> 	mov	ecx, 65536
  3698                              <1> sysvideo_59:
  3699 0000CD75 200E                <1> 	and	byte [esi], cl
  3700 0000CD77 46                  <1> 	inc	esi
  3701 0000CD78 E2FB                <1> 	loop	sysvideo_59
  3702                              <1> 
  3703                              <1> sysvideo_60:
  3704 0000CD7A 80FB08              <1> 	cmp	bl, 8
  3705 0000CD7D 770F                <1> 	ja	short sysvideo_62
  3706                              <1> 
  3707                              <1> 	; BL = 8 = OR display page bytes with CL
  3708                              <1> 
  3709 0000CD7F BE00000A00          <1> 	mov	esi, 0A0000h
  3710 0000CD84 B900000100          <1> 	mov	ecx, 65536
  3711                              <1> sysvideo_61:
  3712 0000CD89 080E                <1> 	or	byte [esi], cl
  3713 0000CD8B 46                  <1> 	inc	esi
  3714 0000CD8C E2FB                <1> 	loop	sysvideo_61	
  3715                              <1> 
  3716                              <1> sysvideo_62:
  3717 0000CD8E 80FB09              <1> 	cmp	bl, 9
  3718 0000CD91 0F8716EEFFFF        <1>         ja      sysret ; nothing to do
  3719                              <1> 
  3720                              <1> 	; BL = 9 = XOR display page bytes with CL
  3721                              <1> 
  3722 0000CD97 BE00000A00          <1> 	mov	esi, 0A0000h
  3723 0000CD9C B900000100          <1> 	mov	ecx, 65536
  3724                              <1> sysvideo_63:
  3725 0000CDA1 300E                <1> 	xor	byte [esi], cl
  3726 0000CDA3 46                  <1> 	inc	esi
  3727 0000CDA4 E2FB                <1> 	loop	sysvideo_63
  3728                              <1> 
  3729                              <1> sysvideo_64:
  3730 0000CDA6 80FF03              <1> 	cmp	bh, 3
  3731 0000CDA9 7460                <1> 	je	short sysvideo_68
  3732 0000CDAB 80FF04              <1> 	cmp	bh, 4
  3733 0000CDAE 771F                <1> 	ja	short sysvideo_65
  3734                              <1> 	
  3735                              <1> 	; BH = 4
  3736                              <1> 	; Direct User Access for CGA video memory.
  3737                              <1> 	; Setup user's page tables for direct access to 0B8000h.
  3738                              <1> 	;
  3739                              <1> 	; Permission checks are not implemented yet !
  3740                              <1> 	; (11/07/2016)
  3741                              <1> 
  3742 0000CDB0 B800800B00          <1> 	mov	eax, 0B8000h
  3743 0000CDB5 B908000000          <1> 	mov	ecx, 8 ; 8 pages (8*4K=32K)
  3744 0000CDBA E82288FFFF          <1> 	call	direct_memory_access	
  3745 0000CDBF 0F82E8EDFFFF        <1> 	jc	sysret
  3746                              <1> 	; eax = 0B8000h if there is not an error
  3747 0000CDC5 A3[1C470100]        <1> 	mov	[u.r0], eax
  3748 0000CDCA E9DEEDFFFF          <1> 	jmp	sysret
  3749                              <1> 
  3750                              <1> sysvideo_65:
  3751 0000CDCF 80FF05              <1> 	cmp	bh, 5
  3752 0000CDD2 771F                <1> 	ja	short sysvideo_66
  3753                              <1> 
  3754                              <1> 	; BH = 5
  3755                              <1> 	; Direct User Access for VGA video memory.
  3756                              <1> 	; Setup user's page tables for direct access to 0A0000h.
  3757                              <1> 	;
  3758                              <1> 	; Permission checks are not implemented yet !
  3759                              <1> 	; (11/07/2016)
  3760                              <1> 
  3761 0000CDD4 B800000A00          <1> 	mov	eax, 0A0000h
  3762 0000CDD9 B910000000          <1> 	mov	ecx, 16 ; 16 pages (16*4K=64K)
  3763 0000CDDE E8FE87FFFF          <1> 	call	direct_memory_access	
  3764 0000CDE3 0F82C4EDFFFF        <1> 	jc	sysret
  3765                              <1> 	; eax = 0A0000h if there is not an error
  3766 0000CDE9 A3[1C470100]        <1> 	mov	[u.r0], eax
  3767 0000CDEE E9BAEDFFFF          <1> 	jmp	sysret
  3768                              <1> 
  3769                              <1> sysvideo_66:
  3770 0000CDF3 80FF06              <1> 	cmp	bh, 6
  3771 0000CDF6 7705                <1> 	ja	short sysvideo_67
  3772                              <1> 	; BH = 6
  3773                              <1> 	; Direct User Access for (Super VGA) Linear Frame Buffer.
  3774                              <1> 	; Setup user's page tables for direct access to LFB.
  3775                              <1> 	;
  3776                              <1> 	; Not implemented yet !
  3777                              <1> 	; (11/07/2016)
  3778 0000CDF8 E9B0EDFFFF          <1> 	jmp	sysret
  3779                              <1> 
  3780                              <1> sysvideo_67:
  3781 0000CDFD 80FF07              <1> 	cmp	bh, 7
  3782 0000CE00 0F87A7EDFFFF        <1> 	ja	sysret ; invalid !
  3783                              <1> 
  3784                              <1> 	; BH = 7
  3785                              <1> 	; Get (Super/Extended VGA) Linear Frame Buffer info.
  3786                              <1> 	;
  3787                              <1> 	; Not implemented yet !
  3788                              <1> 	; (11/07/2016)
  3789 0000CE06 E9A2EDFFFF          <1> 	jmp	sysret
  3790                              <1> 
  3791                              <1> sysvideo_68:
  3792                              <1> 	; BH = 3
  3793                              <1> 	; Super VGA, LINEAR FRAME BUFFER data transfers
  3794                              <1> 	; Not implemented for yet ! (11/07/2016)
  3795 0000CE0B E99DEDFFFF          <1> 	jmp	sysret
  3796                              <1> 
  3797                              <1> sysaudio: ; AUDIO FUNCTIONS
  3798                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
  3799                              <1> 	;
  3800                              <1> 	; Inputs:
  3801                              <1> 	;	BH = 0 -> Beep (PC Speaker)
  3802                              <1> 	;	     BL = Duration Counter (1 for 1/64 second)
  3803                              <1> 	;	     CX = Frequency Divisor (1193180/Frequency)
  3804                              <1> 	;		 (1331 for 886 Hz)			
  3805                              <1> 	;
  3806                              <1> 	; Outputs:
  3807                              <1> 	;	none
  3808                              <1> 	;
  3809 0000CE10 20FF                <1> 	and	bh, bh
  3810 0000CE12 0F8595EDFFFF        <1> 	jnz	sysret
  3811 0000CE18 E80A4FFFFF          <1> 	call	beep
  3812 0000CE1D E98BEDFFFF          <1> 	jmp	sysret
  3813                              <1>  
  3814                              <1> syslink:
  3815                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
  3816                              <1> 	; temporary !
  3817 0000CE22 B801000000          <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
  3818 0000CE27 A3[80470100]        <1>         mov     [u.error], eax
  3819 0000CE2C A3[1C470100]        <1>         mov     [u.r0], eax 
  3820 0000CE31 E957EDFFFF          <1> 	jmp	error
  3821                              <1> 
  3822                              <1> isdir:
  3823                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  3824                              <1> 	; 04/05/2013 - 02/08/2013 (Retro UNIX 8086 v1)
  3825                              <1> 	;
  3826                              <1> 	; 'isdir' check to see if the i-node whose i-number is in r1
  3827                              <1> 	;  is a directory. If it is, an error occurs, because 'isdir'
  3828                              <1> 	;  called by syslink and sysunlink to make sure directories
  3829                              <1> 	;  are not linked. If the user is the super user (u.uid=0),
  3830                              <1> 	; 'isdir' does not bother checking. The current i-node
  3831                              <1> 	;  is not disturbed.			
  3832                              <1> 	;		
  3833                              <1> 	; INPUTS ->
  3834                              <1> 	;    r1 - contains the i-number whose i-node is being checked.
  3835                              <1> 	;    u.uid - user id
  3836                              <1> 	; OUTPUTS ->
  3837                              <1> 	;    r1 - contains current i-number upon exit
  3838                              <1> 	;    	 (current i-node back in core) 
  3839                              <1> 	;	
  3840                              <1> 	; ((AX = R1))
  3841                              <1> 	;
  3842                              <1>         ; ((Modified registers: eAX, eDX, eBX, eCX, eSI, eDI, eBP))  
  3843                              <1> 	;
  3844                              <1> 
  3845                              <1> 	; / if the i-node whose i-number is in r1 is a directory 
  3846                              <1> 	; / there is an error unless super user made the call
  3847                              <1> 	
  3848 0000CE36 803D[68470100]00    <1> 	cmp	byte [u.uid], 0 
  3849                              <1> 		; tstb u.uid / super user
  3850 0000CE3D 762D                <1> 	jna	short isdir1
  3851                              <1> 		; beq 1f / yes, don't care
  3852 0000CE3F 66FF35[A5470100]    <1> 	push	word [ii]
  3853                              <1> 		; mov ii,-(sp) / put current i-number on stack
  3854 0000CE46 E805180000          <1> 	call	iget
  3855                              <1> 		; jsr r0,iget / get i-node into core (i-number in r1)
  3856 0000CE4B 66F705[B8430100]00- <1> 	test 	word [i.flgs], 4000h ; Bit 14 : Directory flag
  3856 0000CE53 40                  <1>
  3857                              <1> 		; bit $40000,i.flgs / is it a directory
  3858                              <1> 	;jnz	error
  3859                              <1> 		; bne error9 / yes, error
  3860 0000CE54 740F                <1> 	jz	short isdir0
  3861 0000CE56 C705[80470100]0B00- <1> 	mov 	dword [u.error], ERR_NOT_FILE  ; 11 ; ERR_DIR_ACCESS 
  3861 0000CE5E 0000                <1>
  3862                              <1> 				; 'permission denied !' error
  3863                              <1> 	; pop	ax
  3864 0000CE60 E928EDFFFF          <1> 	jmp	error	
  3865                              <1> isdir0:	
  3866 0000CE65 6658                <1> 	pop	ax
  3867                              <1> 		; mov (sp)+,r1 / no, put current i-number in r1 (ii)
  3868 0000CE67 E8E4170000          <1> 	call	iget
  3869                              <1> 		; jsr r0,iget / get it back in
  3870                              <1> isdir1: ; 1:
  3871 0000CE6C C3                  <1> 	retn
  3872                              <1> 		; rts r0
  3873                              <1> 
  3874                              <1> sysunlink:
  3875                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
  3876                              <1> 	; temporary !
  3877 0000CE6D B801000000          <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
  3878 0000CE72 A3[80470100]        <1>         mov     [u.error], eax
  3879 0000CE77 A3[1C470100]        <1>         mov     [u.r0], eax 
  3880 0000CE7C E90CEDFFFF          <1> 	jmp	error
  3881                              <1> mkdir:
  3882                              <1> 	; 04/12/2015 (14 byte directory names)
  3883                              <1> 	; 12/10/2015
  3884                              <1> 	; 17/06/2015 (Retro UNIX 386 v1 - Beginning)
  3885                              <1> 	; 29/04/2013 - 01/08/2013 (Retro UNIX 8086 v1)
  3886                              <1> 	;
  3887                              <1> 	; 'mkdir' makes a directory entry from the name pointed to
  3888                              <1> 	; by u.namep into the current directory.
  3889                              <1> 	;
  3890                              <1> 	; INPUTS ->
  3891                              <1> 	;    u.namep - points to a file name 
  3892                              <1> 	;	           that is about to be a directory entry.
  3893                              <1> 	;    ii - current directory's i-number.	
  3894                              <1> 	; OUTPUTS ->
  3895                              <1> 	;    u.dirbuf+2 - u.dirbuf+10 - contains file name. 
  3896                              <1> 	;    u.off - points to entry to be filled 
  3897                              <1> 	;	     in the current directory		
  3898                              <1> 	;    u.base - points to start of u.dirbuf.
  3899                              <1> 	;    r1 - contains i-number of current directory 
  3900                              <1> 	;	
  3901                              <1> 	; ((AX = R1)) output
  3902                              <1> 	;
  3903                              <1> 	;    (Retro UNIX Prototype : 11/11/2012, UNIXCOPY.ASM)
  3904                              <1>         ;    ((Modified registers: eAX, eDX, eBX, eCX, eSI, eDI, eBP))  
  3905                              <1> 	;
  3906                              <1> 
  3907                              <1> 	; 17/06/2015 - 32 bit modifications (Retro UNIX 386 v1)
  3908 0000CE81 31C0                <1> 	xor 	eax, eax
  3909 0000CE83 BF[52470100]        <1> 	mov     edi, u.dirbuf+2
  3910 0000CE88 89FE                <1> 	mov	esi, edi
  3911 0000CE8A AB                  <1> 	stosd
  3912 0000CE8B AB                  <1> 	stosd
  3913                              <1> 	; 04/12/2015 (14 byte directory names)
  3914 0000CE8C AB                  <1> 	stosd
  3915 0000CE8D 66AB                <1> 	stosw
  3916                              <1> 		; jsr r0,copyz; u.dirbuf+2; u.dirbuf+10. / clear this
  3917 0000CE8F 89F7                <1> 	mov	edi, esi ; offset to u.dirbuf
  3918                              <1> 	; 12/10/2015 ([u.namep] -> ebp)
  3919                              <1> 	;mov 	ebp, [u.namep]
  3920 0000CE91 E829040000          <1> 	call	trans_addr_nmbp ; convert virtual address to physical
  3921                              <1> 		; esi = physical address (page start + offset)
  3922                              <1> 		; ecx = byte count in the page (1 - 4096)
  3923                              <1> 	; edi = offset to u.dirbuf (edi is not modified in trans_addr_nm)
  3924                              <1> 		; mov u.namep,r2 / r2 points to name of directory entry
  3925                              <1> 		; mov $u.dirbuf+2,r3 / r3 points to u.dirbuf+2
  3926                              <1> mkdir_1: ; 1: 
  3927 0000CE96 45                  <1> 	inc	ebp ; 12/10/2015
  3928                              <1> 	;
  3929                              <1> 	; / put characters in the directory name in u.dirbuf+2 - u.dirbuf+10
  3930                              <1> 	 ; 01/08/2013
  3931 0000CE97 AC                  <1> 	lodsb
  3932                              <1> 		; movb (r2)+,r1 / move character in name to r1
  3933 0000CE98 20C0                <1> 	and 	al, al
  3934 0000CE9A 7427                <1> 	jz 	short mkdir_3 	  
  3935                              <1> 		; beq 1f / if null, done
  3936 0000CE9C 3C2F                <1> 	cmp	al, '/'
  3937                              <1> 		; cmp r1,$'/ / is it a "/"?
  3938 0000CE9E 7414                <1> 	je	short mkdir_err
  3939                              <1> 	;je	error
  3940                              <1> 		; beq error9 / yes, error
  3941                              <1> 	; 12/10/2015
  3942 0000CEA0 6649                <1> 	dec	cx
  3943 0000CEA2 7505                <1> 	jnz	short mkdir_2
  3944                              <1> 	; 12/10/2015 ([u.namep] -> ebp)
  3945 0000CEA4 E81C040000          <1> 	call	trans_addr_nm ; convert virtual address to physical
  3946                              <1> 		; esi = physical address (page start + offset)
  3947                              <1> 		; ecx = byte count in the page
  3948                              <1> 	; edi = offset to u.dirbuf (edi is not modified in trans_addr_nm)
  3949                              <1> mkdir_2:
  3950 0000CEA9 81FF[60470100]      <1> 	cmp     edi, u.dirbuf+16 ; ; 04/12/2015 (10 -> 16) 
  3951                              <1> 		; cmp r3,$u.dirbuf+10. / have we reached the last slot for
  3952                              <1> 				     ; / a char?
  3953 0000CEAF 74E5                <1> 	je	short mkdir_1
  3954                              <1> 		; beq 1b / yes, go back
  3955 0000CEB1 AA                  <1> 	stosb
  3956                              <1> 		; movb r1,(r3)+ / no, put the char in the u.dirbuf
  3957 0000CEB2 EBE2                <1> 	jmp 	short mkdir_1
  3958                              <1> 		; br 1b / get next char
  3959                              <1> mkdir_err:
  3960                              <1> 	; 17/06/2015
  3961 0000CEB4 C705[80470100]1300- <1> 	mov	dword [u.error], ERR_NOT_DIR ; 'not a valid directory !'
  3961 0000CEBC 0000                <1>
  3962 0000CEBE E9CAECFFFF          <1> 	jmp	error
  3963                              <1> 
  3964                              <1> mkdir_3: ; 1:
  3965 0000CEC3 A1[30470100]        <1> 	mov	eax, [u.dirp]
  3966 0000CEC8 A3[38470100]        <1> 	mov	[u.off], eax
  3967                              <1> 		; mov u.dirp,u.off / pointer to empty current directory
  3968                              <1> 				 ; / slot to u.off
  3969                              <1> wdir: ; 29/04/2013
  3970 0000CECD C705[3C470100]-     <1>         mov     dword [u.base], u.dirbuf
  3970 0000CED3 [50470100]          <1>
  3971                              <1> 		; mov $u.dirbuf,u.base / u.base points to created file name
  3972 0000CED7 C705[40470100]1000- <1>         mov     dword [u.count], 16 ; 04/12/2015 (10 -> 16) 
  3972 0000CEDF 0000                <1>
  3973                              <1> 		; mov $10.,u.count / u.count = 10
  3974 0000CEE1 66A1[A5470100]      <1> 	mov	ax, [ii] 
  3975                              <1> 		; mov ii,r1 / r1 has i-number of current directory
  3976 0000CEE7 B201                <1> 	mov	dl, 1 ; owner flag mask ; RETRO UNIX 8086 v1 modification !
  3977 0000CEE9 E86C170000          <1> 	call 	access
  3978                              <1> 		; jsr r0,access; 1 / get i-node and set its file up 
  3979                              <1> 				 ; / for writing
  3980                              <1> 	; AX = i-number of current directory
  3981                              <1> 	; 01/08/2013
  3982 0000CEEE FE05[7E470100]      <1> 	inc     byte [u.kcall] ; the caller is 'mkdir' sign	
  3983 0000CEF4 E8E3110000          <1> 	call	writei
  3984                              <1> 		; jsr r0,writei / write into directory
  3985 0000CEF9 C3                  <1> 	retn	
  3986                              <1> 		; rts r0
  3987                              <1> 
  3988                              <1> sysexec:
  3989                              <1> 	; 04/01/2017
  3990                              <1> 	; 24/10/2016
  3991                              <1> 	; 24/04/2016 - TRDOS 386 (TRDOS v2.0)
  3992                              <1> 	; 23/06/2015 - 23/10/2015 (Retro UNIX 386 v1)
  3993                              <1> 	; 03/06/2013 - 06/12/2013 (Retro UNIX 8086 v1)
  3994                              <1> 	;
  3995                              <1> 	; 'sysexec' initiates execution of a file whose path name if
  3996                              <1> 	; pointed to by 'name' in the sysexec call. 
  3997                              <1> 	; 'sysexec' performs the following operations:
  3998                              <1> 	;    1. obtains i-number of file to be executed via 'namei'.
  3999                              <1> 	;    2. obtains i-node of file to be exceuted via 'iget'.
  4000                              <1> 	;    3. sets trap vectors to system routines.
  4001                              <1> 	;    4. loads arguments to be passed to executing file into
  4002                              <1> 	;	highest locations of user's core
  4003                              <1> 	;    5. puts pointers to arguments in locations immediately
  4004                              <1> 	;	following arguments.
  4005                              <1> 	;    6.	saves number of arguments in next location.
  4006                              <1> 	;    7. intializes user's stack area so that all registers
  4007                              <1> 	;	will be zeroed and the PS is cleared and the PC set
  4008                              <1> 	;	to core when 'sysret' restores registers 
  4009                              <1> 	;	and does an rti.
  4010                              <1> 	;    8. inializes u.r0 and u.sp
  4011                              <1> 	;    9. zeros user's core down to u.r0
  4012                              <1> 	;   10.	reads executable file from storage device into core
  4013                              <1> 	;	starting at location 'core'.
  4014                              <1> 	;   11.	sets u.break to point to end of user's code with
  4015                              <1> 	;	data area appended.
  4016                              <1> 	;   12.	calls 'sysret' which returns control at location
  4017                              <1> 	;	'core' via 'rti' instruction. 		  		
  4018                              <1> 	;
  4019                              <1> 	; Calling sequence:
  4020                              <1> 	;	sysexec; namep; argp
  4021                              <1> 	; Arguments:
  4022                              <1> 	;	namep - points to pathname of file to be executed
  4023                              <1> 	;	argp  - address of table of argument pointers
  4024                              <1> 	;	argp1... argpn - table of argument pointers
  4025                              <1> 	;	argp1:<...0> ... argpn:<...0> - argument strings
  4026                              <1> 	; Inputs: (arguments)
  4027                              <1> 	; Outputs: -	
  4028                              <1> 	; ...............................................................
  4029                              <1> 	;
  4030                              <1> 	; Retro UNIX 386 v1 modification: 
  4031                              <1> 	;	User application runs in it's own virtual space 
  4032                              <1> 	;	which is izolated from kernel memory (and other
  4033                              <1> 	;	memory pages) via 80386	paging in ring 3 
  4034                              <1> 	;	privilige mode. Virtual start address is always 0.
  4035                              <1> 	;	User's core memory starts at linear address 400000h
  4036                              <1> 	;	(the end of the 1st 4MB).
  4037                              <1> 	;
  4038                              <1> 	; Retro UNIX 8086 v1 modification: 
  4039                              <1> 	;	user/application segment and system/kernel segment
  4040                              <1> 	;	are different and sysenter/sysret/sysrele routines
  4041                              <1> 	;	are different (user's registers are saved to 
  4042                              <1> 	;	and then restored from system's stack.)
  4043                              <1> 	;
  4044                              <1> 	;	NOTE: Retro UNIX 8086 v1 'arg2' routine gets these
  4045                              <1> 	;	      arguments which were in these registers;
  4046                              <1> 	;	      but, it returns by putting the 1st argument
  4047                              <1> 	;	      in 'u.namep' and the 2nd argument
  4048                              <1> 	;	      on top of stack. (1st argument is offset of the
  4049                              <1> 	;	      file/path name in the user's program segment.)		 	
  4050                              <1> 	
  4051                              <1> 	;call	arg2
  4052                              <1> 	; * name - 'u.namep' points to address of file/path name
  4053                              <1> 	;          in the user's program segment ('u.segmnt')
  4054                              <1> 	;          with offset in BX register (as sysopen argument 1).
  4055                              <1> 	; * argp - sysexec argument 2 is in CX register 
  4056                              <1> 	;          which is on top of stack.
  4057                              <1> 	;
  4058                              <1> 		; jsr r0,arg2 / arg0 in u.namep,arg1 on top of stack
  4059                              <1> 
  4060                              <1> 	; 23/06/2015 (32 bit modifications)
  4061                              <1> 
  4062 0000CEFA 891D[34470100]      <1> 	mov	[u.namep], ebx ; argument 1
  4063                              <1>         ; 18/10/2015
  4064 0000CF00 890D[A0470100]      <1> 	mov     [argv], ecx  ; * ; argument 2
  4065 0000CF06 E86F020000          <1> 	call	namei
  4066                              <1> 		; jsr r0,namei / namei returns i-number of file 
  4067                              <1> 			     ; / named in sysexec call in r1
  4068                              <1> 	;jc	error
  4069                              <1> 		; br error9
  4070 0000CF0B 731E                <1> 	jnc	short sysexec_0
  4071                              <1> 	;
  4072                              <1> 	; 'file not found !' error
  4073 0000CF0D C705[80470100]0C00- <1> 	mov	dword [u.error], ERR_FILE_NOT_FOUND
  4073 0000CF15 0000                <1>
  4074 0000CF17 E971ECFFFF          <1> 	jmp	error 
  4075                              <1> sysexec_not_exf:
  4076                              <1> 	; 'not executable file !' error
  4077 0000CF1C C705[80470100]1600- <1> 	mov	dword [u.error], ERR_NOT_EXECUTABLE
  4077 0000CF24 0000                <1>
  4078 0000CF26 E962ECFFFF          <1> 	jmp	error 
  4079                              <1> sysexec_0:
  4080 0000CF2B E820170000          <1> 	call	iget
  4081                              <1> 		; jsr r0,iget / get i-node for file to be executed
  4082 0000CF30 66F705[B8430100]10- <1>         test    word [i.flgs], 10h
  4082 0000CF38 00                  <1>
  4083                              <1> 		; bit $20,i.flgs / is file executable
  4084 0000CF39 74E1                <1> 	jz	short sysexec_not_exf
  4085                              <1> 	;jz	error
  4086                              <1> 		; beq error9
  4087                              <1> 	;;
  4088 0000CF3B E813170000          <1> 	call	iopen
  4089                              <1> 		; jsr r0,iopen / gets i-node for file with i-number
  4090                              <1> 			     ; / given in r1 (opens file)
  4091                              <1> 	; AX = i-number of the file
  4092 0000CF40 66F705[B8430100]20- <1> 	test	word [i.flgs], 20h
  4092 0000CF48 00                  <1>
  4093                              <1> 		; bit $40,i.flgs / test user id on execution bit
  4094 0000CF49 7415                <1> 	jz	short sysexec_1
  4095                              <1> 		; beq 1f
  4096 0000CF4B 803D[68470100]00    <1> 	cmp 	byte [u.uid], 0 ; 02/08/2013
  4097                              <1> 		; tstb u.uid / test user id
  4098 0000CF52 760C                <1> 	jna	short sysexec_1
  4099                              <1> 		; beq 1f / super user
  4100 0000CF54 8A0D[BB430100]      <1> 	mov	cl, [i.uid]
  4101 0000CF5A 880D[68470100]      <1> 	mov	[u.uid], cl ; 02/08/2013
  4102                              <1> 		; movb i.uid,u.uid / put user id of owner of file
  4103                              <1> 				 ; / as process user id
  4104                              <1> sysexec_1:
  4105                              <1> 	; 18/10/2215
  4106                              <1> 	; 10/10/2015
  4107                              <1> 	; 24/07/2015
  4108                              <1> 	; 21/07/2015
  4109                              <1> 	; 25/06/2015
  4110                              <1> 	; 24/06/2015
  4111                              <1>         ; Moving arguments to the end of [u.upage]
  4112                              <1> 	; (by regarding page borders in user's memory space)
  4113                              <1> 	;
  4114                              <1> 	; 10/10/2015
  4115                              <1> 	; 21/07/2015
  4116 0000CF60 89E5                <1> 	mov	ebp, esp ; (**)
  4117                              <1> 	; 18/10/2015
  4118 0000CF62 89EF                <1> 	mov 	edi, ebp
  4119 0000CF64 B900010000          <1> 	mov 	ecx, MAX_ARG_LEN ; 256
  4120                              <1> 	;sub	edi, MAX_ARG_LEN ; 256
  4121 0000CF69 29CF                <1> 	sub	edi, ecx
  4122 0000CF6B 89FC                <1> 	mov	esp, edi
  4123 0000CF6D 31C0                <1> 	xor	eax, eax
  4124 0000CF6F A3[44470100]        <1> 	mov 	[u.nread], eax ; 0
  4125 0000CF74 49                  <1> 	dec	ecx ; 256 - 1
  4126 0000CF75 890D[40470100]      <1> 	mov 	[u.count], ecx ; MAX_ARG_LEN - 1 ; 255
  4127                              <1> 	;mov 	dword [u.count], MAX_ARG_LEN - 1 ; 255
  4128                              <1> sysexec_2:
  4129 0000CF7B 8B35[A0470100]      <1> 	mov	esi, [argv] ; 18/10/2015 
  4130 0000CF81 E866000000          <1> 	call	get_argp
  4131 0000CF86 B904000000          <1> 	mov	ecx, 4 ; mov ecx, 4
  4132                              <1> sysexec_3:
  4133 0000CF8B 21C0                <1> 	and	eax, eax
  4134 0000CF8D 0F84E5070000        <1>         jz      sysexec_6
  4135                              <1> 	; 18/10/2015
  4136 0000CF93 010D[A0470100]      <1> 	add	[argv], ecx ; 4
  4137 0000CF99 66FF05[9E470100]    <1> 	inc	word [argc]
  4138                              <1> 	;
  4139 0000CFA0 A3[3C470100]        <1> 	mov	[u.base], eax
  4140                              <1>  	; 23/10/2015
  4141 0000CFA5 66C705[7C470100]00- <1> 	mov	word [u.pcount], 0
  4141 0000CFAD 00                  <1>
  4142                              <1> sysexec_4:
  4143 0000CFAE E8670E0000          <1> 	call	cpass ; get a character from user's core memory
  4144 0000CFB3 750E                <1>         jnz      short sysexec_5
  4145                              <1> 		; (max. 255 chars + null)
  4146                              <1> 	; 18/10/2015
  4147 0000CFB5 28C0                <1> 	sub 	al, al
  4148 0000CFB7 AA                  <1> 	stosb
  4149 0000CFB8 FF05[44470100]      <1> 	inc	dword [u.nread]
  4150 0000CFBE E9B5070000          <1> 	jmp	sysexec_6 ; 24/04/2016
  4151                              <1> sysexec_5:
  4152 0000CFC3 AA                  <1> 	stosb
  4153 0000CFC4 20C0                <1> 	and 	al, al
  4154 0000CFC6 75E6                <1> 	jnz	short sysexec_4
  4155 0000CFC8 B904000000          <1> 	mov	ecx, 4
  4156 0000CFCD 390D[9C470100]      <1> 	cmp	[ncount], ecx ; 4
  4157 0000CFD3 72A6                <1> 	jb	short sysexec_2
  4158 0000CFD5 8B35[98470100]      <1> 	mov	esi, [nbase]
  4159 0000CFDB 010D[98470100]      <1> 	add	[nbase], ecx ; 4	
  4160 0000CFE1 66290D[9C470100]    <1> 	sub	[ncount], cx 
  4161 0000CFE8 8B06                <1> 	mov	eax, [esi]
  4162 0000CFEA EB9F                <1> 	jmp	short sysexec_3
  4163                              <1> 
  4164                              <1> get_argp:
  4165                              <1> 	; 18/10/2015 (nbase, ncount)
  4166                              <1> 	; 21/07/2015
  4167                              <1> 	; 24/06/2015 (Retro UNIX 386 v1)
  4168                              <1> 	; Get (virtual) address of argument from user's core memory
  4169                              <1> 	;
  4170                              <1> 	; INPUT:
  4171                              <1> 	;	esi = virtual address of argument pointer
  4172                              <1> 	; OUTPUT:
  4173                              <1> 	;	eax = virtual address of argument
  4174                              <1> 	;
  4175                              <1> 	; Modified registers: EAX, EBX, ECX, EDX, ESI 
  4176                              <1> 	;
  4177 0000CFEC 833D[74470100]00    <1>  	cmp     dword [u.ppgdir], 0 ; /etc/init ?
  4178                              <1> 				    ; (the caller is kernel)
  4179 0000CFF3 7667                <1>         jna     short get_argpk 
  4180                              <1> 	;
  4181 0000CFF5 89F3                <1>      	mov	ebx, esi
  4182 0000CFF7 E81B82FFFF          <1> 	call	get_physical_addr ; get physical address
  4183 0000CFFC 0F8289000000        <1>         jc      get_argp_err
  4184 0000D002 A3[98470100]        <1> 	mov 	[nbase], eax ; physical address	
  4185 0000D007 66890D[9C470100]    <1> 	mov	[ncount], cx ; remain byte count in page (1-4096)
  4186 0000D00E B804000000          <1> 	mov	eax, 4 ; 21/07/2015
  4187 0000D013 6639C1              <1> 	cmp	cx, ax ; 4
  4188 0000D016 735D                <1> 	jnb	short get_argp2
  4189 0000D018 89F3                <1> 	mov	ebx, esi
  4190 0000D01A 01CB                <1> 	add	ebx, ecx
  4191 0000D01C E8F681FFFF          <1> 	call	get_physical_addr ; get physical address
  4192 0000D021 7268                <1> 	jc	short get_argp_err
  4193                              <1> 	;push	esi
  4194 0000D023 89C6                <1> 	mov	esi, eax
  4195 0000D025 66870D[9C470100]    <1> 	xchg	cx, [ncount]
  4196 0000D02C 8735[98470100]      <1> 	xchg	esi, [nbase]
  4197 0000D032 B504                <1> 	mov	ch, 4
  4198 0000D034 28CD                <1> 	sub	ch, cl
  4199                              <1> get_argp0:
  4200 0000D036 AC                  <1> 	lodsb
  4201 0000D037 6650                <1> 	push	ax
  4202 0000D039 FEC9                <1> 	dec	cl
  4203 0000D03B 75F9                <1>         jnz     short get_argp0
  4204 0000D03D 8B35[98470100]      <1> 	mov	esi, [nbase]
  4205                              <1> 	; 21/07/2015
  4206 0000D043 0FB6C5              <1> 	movzx	eax, ch
  4207 0000D046 0105[98470100]      <1> 	add	[nbase], eax
  4208 0000D04C 662905[9C470100]    <1> 	sub	[ncount], ax
  4209                              <1> get_argp1:
  4210 0000D053 AC                  <1> 	lodsb
  4211 0000D054 FECD                <1> 	dec	ch
  4212 0000D056 743D                <1>         jz      short get_argp3
  4213 0000D058 6650                <1>         push	ax
  4214 0000D05A EBF7                <1> 	jmp     short get_argp1
  4215                              <1> get_argpk:
  4216                              <1> 	; Argument is in kernel's memory space
  4217 0000D05C 66C705[9C470100]00- <1> 	mov	word [ncount], PAGE_SIZE ; 4096
  4217 0000D064 10                  <1>
  4218 0000D065 8935[98470100]      <1> 	mov	[nbase], esi
  4219 0000D06B 8305[98470100]04    <1> 	add	dword [nbase], 4
  4220 0000D072 8B06                <1> 	mov	eax, [esi] ; virtual addr. = physcal addr.
  4221 0000D074 C3                  <1> 	retn
  4222                              <1> get_argp2:
  4223                              <1> 	; 21/07/2015
  4224                              <1> 	;mov	eax, 4
  4225 0000D075 8B15[98470100]      <1> 	mov 	edx, [nbase] ; 18/10/2015
  4226 0000D07B 0105[98470100]      <1> 	add	[nbase], eax
  4227 0000D081 662905[9C470100]    <1> 	sub	[ncount], ax
  4228                              <1> 	;
  4229 0000D088 8B02                <1> 	mov	eax, [edx]
  4230 0000D08A C3                  <1> 	retn
  4231                              <1> get_argp_err:
  4232 0000D08B A3[80470100]        <1> 	mov	[u.error], eax
  4233 0000D090 E9F8EAFFFF          <1> 	jmp	error
  4234                              <1> get_argp3:
  4235 0000D095 B103                <1> 	mov	cl, 3
  4236                              <1> get_argp4:
  4237 0000D097 C1E008              <1> 	shl	eax, 8
  4238 0000D09A 665A                <1> 	pop	dx
  4239 0000D09C 88D0                <1> 	mov 	al, dl
  4240 0000D09E E2F7                <1>         loop    get_argp4
  4241                              <1> 	;pop	esi
  4242 0000D0A0 C3                  <1> 	retn	
  4243                              <1> 
  4244                              <1> sysstat: 
  4245                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
  4246                              <1> 	; temporary !
  4247 0000D0A1 B801000000          <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
  4248 0000D0A6 A3[80470100]        <1>         mov     [u.error], eax
  4249 0000D0AB A3[1C470100]        <1>         mov     [u.r0], eax 
  4250 0000D0B0 E9D8EAFFFF          <1> 	jmp	error
  4251                              <1> 
  4252                              <1> sysfstat: 
  4253                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
  4254                              <1> 	; temporary !
  4255 0000D0B5 B801000000          <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
  4256 0000D0BA A3[80470100]        <1>         mov     [u.error], eax
  4257 0000D0BF A3[1C470100]        <1>         mov     [u.r0], eax 
  4258 0000D0C4 E9C4EAFFFF          <1> 	jmp	error
  4259                              <1> 
  4260                              <1> fclose:
  4261                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
  4262                              <1> 	;
  4263                              <1> 	; 18/06/2015 (Retro UNIX 386 v1 - Beginning)
  4264                              <1> 	;            (32 bit offset pointer modification)
  4265                              <1> 	; 19/04/2013 - 12/01/2014 (Retro UNIX 8086 v1)
  4266                              <1> 	;
  4267                              <1> 	; Given the file descriptor (index to the u.fp list)
  4268                              <1> 	; 'fclose' first gets the i-number of the file via 'getf'.
  4269                              <1> 	; If i-node is active (i-number > 0) the entry in 
  4270                              <1> 	; u.fp list is cleared. If all the processes that opened
  4271                              <1> 	; that file close it, then fsp etry is freed and the file
  4272                              <1> 	; is closed. If not a return is taken. 
  4273                              <1> 	; If the file has been deleted while open, 'anyi' is called
  4274                              <1> 	; to see anyone else has it open, i.e., see if it is appears
  4275                              <1> 	; in another entry in the fsp table. Upon return from 'anyi'
  4276                              <1> 	; a check is made to see if the file is special.	
  4277                              <1> 	;
  4278                              <1> 	; INPUTS ->
  4279                              <1> 	;    r1 - contains the file descriptor (value=0,1,2...)
  4280                              <1> 	;    u.fp - list of entries in the fsp table
  4281                              <1> 	;    fsp - table of entries (4 words/entry) of open files.	 
  4282                              <1> 	; OUTPUTS ->
  4283                              <1> 	;    r1 - contains the same file descriptor
  4284                              <1> 	;    r2 - contains i-number
  4285                              <1> 	;
  4286                              <1> 	; ((AX = R1))
  4287                              <1> 	; ((Modified registers: eDX, eBX, eCX, eSI, eDI, eBP))
  4288                              <1> 	;
  4289                              <1> 	; Retro UNIX 8086 v1 modification : CF = 1
  4290                              <1> 	;              if i-number of the file is 0. (error)  	
  4291                              <1> 	;
  4292                              <1> 	; TRDOS 386 (06/10/2016)
  4293                              <1> 	; 
  4294                              <1> 	; INPUT:
  4295                              <1> 	;	EAX = File Handle (File Descriptor, File Index)
  4296                              <1> 	;
  4297                              <1> 	; OUTPUT:
  4298                              <1> 	;	CF = 1 -> File not open !
  4299                              <1> 	;	CF = 0 -> OK!
  4300                              <1> 	;	     EBX = File Number (System)
  4301                              <1> 	;	     [cdev] = Logical DOS Drive Number
  4302                              <1> 	;	     EAX = File Handle/Number (user) 	
  4303                              <1> 	;
  4304                              <1> 	; Modified Registers: EBX
  4305                              <1> 
  4306 0000D0C9 50                  <1> 	push	eax ; File handle
  4307                              <1> 	
  4308 0000D0CA E846000000          <1> 	call	getf
  4309 0000D0CF 0F821D1C0000        <1> 	jc	device_close ; eax = device number
  4310                              <1> 
  4311 0000D0D5 80BB[0A420100]01    <1> 	cmp	byte [ebx+OF_MODE], 1 ; open mode ; 0 = empty entry
  4312 0000D0DC 722E                <1> 	jb	short fclose_1	      ; 1 = read, 2 = write
  4313                              <1> 	
  4314 0000D0DE 83F801              <1> 	cmp	eax, 1 ; is the first cluster number > 0
  4315 0000D0E1 7229                <1> 	jb	short fclose_1 ; no, this is empty entry
  4316                              <1> 
  4317                              <1> fclose_0:
  4318 0000D0E3 FE8B[1E420100]      <1> 	dec	byte [ebx+OF_OPENCOUNT] ; decrement the number of processes 
  4319                              <1> 			                ; that have opened the file
  4320 0000D0E9 7921                <1> 	jns	short fclose_1 ; jump if not negative (jump if bit 7 is 0)	 
  4321                              <1> 			; if all processes haven't closed the file, return
  4322                              <1> 	;
  4323                              <1> 	; eax ; First cluster
  4324 0000D0EB 31C0                <1> 	xor	eax, eax ; 0
  4325 0000D0ED 8883[0A420100]      <1> 	mov	[ebx+OF_MODE], al ; 0 = empty entry
  4326                              <1> 	;mov	[ebx+OF_STATUS], al ; 0 = empty entry
  4327 0000D0F3 66C1E302            <1> 	shl	bx, 2 
  4328 0000D0F7 8983[D8410100]      <1> 	mov	[ebx+OF_FCLUSTER], eax ; 0
  4329 0000D0FD 8983[F0420100]      <1> 	mov	[ebx+OF_CCLUSTER], eax ; 0
  4330                              <1> 	;mov	[ebx+OF_CCINDEX], eax ; 0
  4331 0000D103 A3[2C470100]        <1> 	mov	[u.fofp], eax ; 0
  4332 0000D108 66C1EB02            <1> 	shr	bx, 2
  4333                              <1> fclose_1: ; 1:
  4334 0000D10C 58                  <1> 	pop	eax ; File handle (File Descriptor, File Index)
  4335 0000D10D C680[22470100]00    <1> 	mov	byte [eax+u.fp], 0 ; clear that entry in the u.fp list
  4336 0000D114 C3                  <1> 	retn
  4337                              <1> 
  4338                              <1> getf:
  4339                              <1> 	; 12/10/2016
  4340                              <1> 	; 11/10/2016
  4341                              <1> 	; 08/10/2016
  4342                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
  4343                              <1> 	; / get the device number and the i-number of an open file
  4344                              <1> 	; 13/05/2015
  4345                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  4346                              <1> 	; 19/04/2013 - 18/11/2013 (Retro UNIX 8086 v1)
  4347                              <1> 	;
  4348 0000D115 89C3                <1> 	mov	ebx, eax
  4349                              <1> getf1: 
  4350 0000D117 83FB0A              <1> 	cmp	ebx, 10
  4351 0000D11A 730A                <1>         jnb	short getf2
  4352 0000D11C 8A9B[22470100]      <1> 	mov	bl, [ebx+u.fp]
  4353 0000D122 08DB                <1> 	or	bl, bl
  4354 0000D124 7503                <1> 	jnz	short getf3
  4355                              <1> getf2:
  4356                              <1> 	; 'File not open !' error (ax=0)
  4357 0000D126 29C0                <1> 	sub	eax, eax
  4358 0000D128 C3                  <1> 	retn
  4359                              <1> getf3:	
  4360 0000D129 F6C380              <1> 	test	bl, 80h
  4361 0000D12C 7530                <1> 	jnz	short getf5 ; device
  4362 0000D12E FECB                <1> 	dec	bl ; 0 based
  4363 0000D130 8A83[00420100]      <1> 	mov	al, [ebx+OF_DRIVE]
  4364 0000D136 A2[FE460100]        <1> 	mov	[cdev], al
  4365 0000D13B C0E302              <1> 	shl	bl, 2 ; *4 (dword offset)
  4366 0000D13E 8B83[50420100]      <1> 	mov	eax, [ebx+OF_SIZE]
  4367 0000D144 A3[A9470100]        <1> 	mov	[i.size], eax ; file size
  4368 0000D149 8D83[28420100]      <1> 	lea	eax, [ebx+OF_POINTER] ;12/10/2016
  4369 0000D14F A3[2C470100]        <1> 	mov	[u.fofp], eax
  4370 0000D154 8B83[D8410100]      <1> 	mov	eax, [ebx+OF_FCLUSTER]
  4371 0000D15A C0EB02              <1> 	shr	bl, 2 ; /4 (byte offset) 
  4372                              <1> getf4:
  4373 0000D15D C3                  <1> 	retn
  4374                              <1> getf5: 
  4375                              <1> 	; get device number
  4376 0000D15E 80E37F              <1> 	and	bl, 7Fh ; 1 to 7Fh
  4377 0000D161 FECB                <1> 	dec	bl ; 0 based (0 to 7Eh)
  4378 0000D163 8A83[32400100]      <1> 	mov	al, [ebx+DEV_DRIVER]
  4379 0000D169 8AAB[9C3F0100]      <1> 	mov	ch, [ebx+DEV_ACCESS]
  4380 0000D16F 8A8B[50400100]      <1> 	mov	cl, [ebx+DEV_OPENMODE]
  4381 0000D175 80E5FE              <1> 	and	ch, 0FEh ; reset bit 0 ; dev_close
  4382 0000D178 F9                  <1> 	stc ; cf = 1 
  4383 0000D179 C3                  <1> 	retn	
  4384                              <1> 
  4385                              <1> namei:
  4386                              <1> 	; 04/12/2015 (14 byte file names)
  4387                              <1> 	; 18/10/2015 (nbase, ncount)
  4388                              <1> 	; 12/10/2015
  4389                              <1> 	; 21/08/2015
  4390                              <1> 	; 18/07/2015
  4391                              <1> 	; 02/07/2015
  4392                              <1> 	; 17/06/2015
  4393                              <1> 	; 16/06/2015 (Retro UNIX 386 v1 - Beginning)
  4394                              <1> 	; 24/04/2013 - 31/07/2013 (Retro UNIX 8086 v1)
  4395                              <1> 	;
  4396                              <1> 	; 'namei' takes a file path name and returns i-number of
  4397                              <1> 	; the file in the current directory or the root directory
  4398                              <1> 	; (if the first character of the pathname is '/').	
  4399                              <1> 	;
  4400                              <1> 	; INPUTS ->
  4401                              <1> 	;    u.namep - points to a file path name
  4402                              <1> 	;    u.cdir - i-number of users directory
  4403                              <1> 	;    u.cdev - device number on which user directory resides	
  4404                              <1> 	; OUTPUTS ->
  4405                              <1> 	;    r1 - i-number of file
  4406                              <1> 	;    cdev
  4407                              <1> 	;    u.dirbuf - points to directory entry where a match 
  4408                              <1> 	;               occurs in the search for file path name.
  4409                              <1> 	;	        If no match u.dirb points to the end of 
  4410                              <1> 	;               the directory and r1 = i-number of the current
  4411                              <1> 	;	        directory.	
  4412                              <1> 	; ((AX = R1))
  4413                              <1> 	;
  4414                              <1> 	; (Retro UNIX Prototype : 07/10/2012 - 05/01/2013, UNIXCOPY.ASM)
  4415                              <1>         ; ((Modified registers: eDX, eBX, eCX, eSI, eDI, eBP))  
  4416                              <1> 	;
  4417                              <1> 
  4418 0000D17A 66A1[20470100]      <1> 	mov	ax, [u.cdir]
  4419                              <1> 		; mov u.cdir,r1 / put the i-number of current directory
  4420                              <1> 			      ; / in r1
  4421 0000D180 668B15[66470100]    <1> 	mov	dx, [u.cdrv]
  4422 0000D187 668915[FE460100]    <1> 	mov	[cdev], dx 	    ; NOTE: Retro UNIX 8086 v1 
  4423                              <1> 				    ; device/drive number is in 1 byte, 
  4424                              <1> 				    ; not in 1 word!
  4425                              <1> 		; mov u.cdev,cdev / device number for users directory 
  4426                              <1> 				; / into cdev
  4427                              <1> 	; 12/10/2015
  4428                              <1> 	; 16/06/2015 - 32 bit modifications (Retro UNIX 386 v1)
  4429                              <1>       	 ; convert virtual (pathname) addr to physical address
  4430 0000D18E E82C010000          <1> 	call    trans_addr_nmbp ; 12/10/2015
  4431                              <1> 		; esi = physical address of [u.namep]
  4432                              <1> 		; ecx = byte count in the page
  4433 0000D193 803E2F              <1> 	cmp	byte [esi], '/'
  4434                              <1> 		; cmpb *u.namep,$'/ / is first char in file name a /
  4435 0000D196 751E                <1> 	jne	short namei_1
  4436                              <1> 		; bne 1f
  4437 0000D198 FF05[34470100]      <1> 	inc	dword [u.namep]
  4438                              <1> 		; inc u.namep / go to next char
  4439 0000D19E 6649                <1> 	dec	cx ; remain byte count in the page
  4440 0000D1A0 7506                <1> 	jnz	short namei_0
  4441                              <1> 	; 12/10/2015
  4442 0000D1A2 E818010000          <1> 	call	trans_addr_nmbp ; convert virtual address to physical
  4443                              <1> 		; esi = physical address (page start + offset)
  4444                              <1> 		; ecx = byte count in the page
  4445 0000D1A7 4E                  <1> 	dec	esi
  4446                              <1> namei_0:
  4447 0000D1A8 46                  <1> 	inc 	esi  ; go to next char
  4448 0000D1A9 66A1[08470100]      <1> 	mov	ax, [rootdir] ; 09/07/2013
  4449                              <1> 		; mov rootdir,r1 / put i-number of rootdirectory in r1
  4450 0000D1AF C605[FE460100]00    <1> 	mov	byte [cdev], 0
  4451                              <1> 		; clr cdev / clear device number
  4452                              <1> namei_1: ; 1:
  4453 0000D1B6 F606FF              <1> 	test	byte [esi], 0FFh
  4454 0000D1B9 74A2                <1> 	jz	short getf4
  4455                              <1> 	;jz      nig
  4456                              <1> 		; tstb *u.namep / is the character in file name a nul
  4457                              <1> 		; beq nig / yes, end of file name reached; 
  4458                              <1> 			; / branch to "nig"
  4459                              <1> namei_2: ; 1:
  4460                              <1> 	; 18/10/2015
  4461 0000D1BB 8935[98470100]      <1> 	mov 	[nbase], esi
  4462 0000D1C1 66890D[9C470100]    <1> 	mov 	[ncount], cx
  4463                              <1> 	;
  4464                              <1> 	;mov	dx, 2
  4465 0000D1C8 B202                <1> 	mov	dl, 2 ; user flag (read, non-owner)
  4466 0000D1CA E88B140000          <1> 	call	access
  4467                              <1> 		; jsr r0,access; 2 / get i-node with i-number r1
  4468                              <1> 	; 'access' will not return here if user has not "r" permission !
  4469 0000D1CF 66F705[B8430100]00- <1> 	test 	word [i.flgs], 4000h
  4469 0000D1D7 40                  <1>
  4470                              <1> 		; bit $40000,i.flgs / directory i-node?
  4471 0000D1D8 746A                <1>         jz      short namei_err
  4472                              <1> 		; beq error3 / no, got an error
  4473                              <1> 	; 16/06/2015 - 32 bit modifications (Retro UNIX 386 v1)
  4474 0000D1DA 31C0                <1> 	xor	eax, eax
  4475 0000D1DC A3[38470100]        <1> 	mov	[u.off], eax ; 0
  4476 0000D1E1 66A1[A9470100]      <1> 	mov	ax, [i.size]
  4477 0000D1E7 A3[30470100]        <1> 	mov	[u.dirp], eax
  4478                              <1> 		; mov i.size,u.dirp / put size of directory in u.dirp
  4479                              <1> 		; clr u.off / u.off is file offset used by user
  4480 0000D1EC C705[2C470100]-     <1> 	mov	dword [u.fofp], u.off
  4480 0000D1F2 [38470100]          <1>
  4481                              <1> 		; mov $u.off,u.fofp / u.fofp is a pointer to 
  4482                              <1> 				  ; / the offset portion of fsp entry
  4483                              <1> namei_3: ; 2:
  4484 0000D1F6 C705[3C470100]-     <1> 	mov	dword [u.base], u.dirbuf
  4484 0000D1FC [50470100]          <1>
  4485                              <1> 		; mov $u.dirbuf,u.base / u.dirbuf holds a file name 
  4486                              <1> 				    ; / copied from a directory
  4487 0000D200 C705[40470100]1000- <1> 	mov 	dword [u.count], 16 ; 04/12/2015 (10 -> 16) 	
  4487 0000D208 0000                <1>
  4488                              <1>  		; mov $10.,u.count / u.count is byte count 
  4489                              <1> 				 ; / for reads and writes
  4490 0000D20A 66A1[A5470100]      <1> 	mov 	ax, [ii]
  4491                              <1> 	; 31/07/2013 ('namei_r') - 16/06/2015 ('u.kcall')
  4492 0000D210 FE05[7E470100]      <1>  	inc     byte [u.kcall] ; the caller is 'namei' sign	
  4493 0000D216 E8A4070000          <1>     	call	readi
  4494                              <1> 		; jsr r0,readi / read 10. bytes of file 
  4495                              <1> 		      ; with i-number (r1); i.e. read a directory entry
  4496 0000D21B 8B0D[44470100]      <1> 	mov 	ecx, [u.nread]
  4497 0000D221 09C9                <1> 	or 	ecx, ecx
  4498                              <1> 		; tst u.nread
  4499 0000D223 741B                <1> 	jz	short nib
  4500                              <1> 		; ble nib / gives error return
  4501                              <1> 	;
  4502 0000D225 668B1D[50470100]    <1> 	mov 	bx, [u.dirbuf]
  4503 0000D22C 6621DB              <1> 	and 	bx, bx       
  4504                              <1> 		; tst u.dirbuf /
  4505 0000D22F 7522                <1> 	jnz	short namei_4
  4506                              <1> 		; bne 3f / branch when active directory entry 
  4507                              <1> 		       ; / (i-node word in entry non zero)
  4508 0000D231 A1[38470100]        <1> 	mov	eax, [u.off]
  4509 0000D236 83E810              <1> 	sub	eax, 16 ; 04/12/2015 (10 -> 16) 
  4510 0000D239 A3[30470100]        <1> 	mov	[u.dirp], eax
  4511                              <1> 		; mov u.off,u.dirp
  4512                              <1> 		; sub $10.,u.dirp
  4513 0000D23E EBB6                <1> 	jmp	short namei_3
  4514                              <1> 		; br 2b
  4515                              <1> 
  4516                              <1> 	; 18/07/2013
  4517                              <1> nib: 
  4518 0000D240 31C0                <1> 	xor	eax, eax  ; xor ax, ax ; ax = 0 -> file not found 
  4519 0000D242 F9                  <1> 	stc
  4520                              <1> nig:
  4521 0000D243 C3                  <1> 	retn
  4522                              <1> 
  4523                              <1> namei_err:
  4524                              <1> 	; 16/06/2015
  4525 0000D244 C705[80470100]1300- <1> 	mov	dword [u.error], ERR_NOT_DIR ; 'not a directory !' error
  4525 0000D24C 0000                <1>
  4526 0000D24E E93AE9FFFF          <1> 	jmp	error
  4527                              <1> 
  4528                              <1> namei_4: ; 3:
  4529                              <1> 	; 18/10/2015
  4530                              <1> 	; 12/10/2015
  4531                              <1> 	; 21/08/2015
  4532                              <1> 	; 18/07/2015
  4533 0000D253 8B2D[34470100]      <1> 	mov	ebp, [u.namep]
  4534                              <1> 		; mov u.namep,r2 / u.namep points into a file name string
  4535 0000D259 BF[52470100]        <1> 	mov 	edi, u.dirbuf + 2
  4536                              <1> 		; mov $u.dirbuf+2,r3 / points to file name of directory entry
  4537                              <1> 	; 18/10/2015
  4538 0000D25E 8B35[98470100]      <1> 	mov	esi, [nbase]	
  4539 0000D264 668B0D[9C470100]    <1> 	mov	cx, [ncount]
  4540                              <1> 	;
  4541 0000D26B 6621C9              <1> 	and	cx, cx
  4542 0000D26E 7505                <1> 	jnz	short namei_5	
  4543                              <1> 	;
  4544 0000D270 E850000000          <1> 	call	trans_addr_nm ; convert virtual address to physical
  4545                              <1> 		; esi = physical address (page start + offset)
  4546                              <1> 		; ecx = byte count in the page
  4547                              <1> namei_5: ; 3:
  4548 0000D275 45                  <1> 	inc	ebp ; 18/07/2015
  4549 0000D276 AC                  <1> 	lodsb   ; mov al, [esi] ; inc esi (al = r4)
  4550                              <1> 		; movb (r2)+,r4 / move a character from u.namep string into r4
  4551 0000D277 08C0                <1> 	or 	al, al
  4552 0000D279 741D                <1> 	jz 	short namei_7
  4553                              <1> 		; beq 3f / if char is nul, then the last char in string
  4554                              <1> 			; / has been moved
  4555 0000D27B 3C2F                <1> 	cmp	al, '/'
  4556                              <1> 		; cmp r4,$'/ / is char a </>
  4557 0000D27D 7419                <1> 	je 	short namei_7
  4558                              <1> 		; beq 3f	
  4559                              <1> 	; 12/10/2015
  4560 0000D27F 6649                <1> 	dec	cx ; remain byte count in the page
  4561 0000D281 7505                <1> 	jnz	short namei_6
  4562 0000D283 E83D000000          <1> 	call	trans_addr_nm ; convert virtual address to physical
  4563                              <1> 		; esi = physical address (page start + offset)
  4564                              <1> 		; ecx = byte count in the page
  4565                              <1> namei_6:
  4566 0000D288 81FF[60470100]      <1>         cmp     edi, u.dirbuf + 16 ; 04/12/2015 (10 -> 16) 
  4567                              <1> 		; cmp r3,$u.dirbuf+10. / have I checked
  4568                              <1> 				     ; / all 8 bytes of file name
  4569 0000D28E 74E5                <1> 	je	short namei_5
  4570                              <1> 		; beq 3b
  4571 0000D290 AE                  <1> 	scasb	
  4572                              <1> 		; cmpb (r3)+,r4 / compare char in u.namep string to file name 
  4573                              <1> 			      ; / char read from directory
  4574 0000D291 74E2                <1> 	je 	short namei_5
  4575                              <1> 		; beq 3b / branch if chars match
  4576                              <1> 
  4577 0000D293 E95EFFFFFF          <1>         jmp    namei_3 ; 2b
  4578                              <1> 		; br 2b / file names do not match go to next directory entry
  4579                              <1> namei_7: ; 3:
  4580 0000D298 81FF[60470100]      <1> 	cmp	edi, u.dirbuf + 16 ; 04/12/2015 (10 -> 16) 
  4581                              <1> 		; cmp r3,$u.dirbuf+10. / if equal all 8 bytes were matched
  4582 0000D29E 740A                <1> 	je	short namei_8
  4583                              <1> 		; beq 3f
  4584 0000D2A0 8A27                <1> 	mov 	ah, [edi]
  4585                              <1> 	;inc 	edi 
  4586 0000D2A2 20E4                <1> 	and 	ah, ah
  4587                              <1> 		; tstb (r3)+ /
  4588 0000D2A4 0F854CFFFFFF        <1>         jnz     namei_3
  4589                              <1> 		; bne 2b
  4590                              <1> namei_8: ; 3
  4591 0000D2AA 892D[34470100]      <1> 	mov	[u.namep], ebp ; 18/07/2015
  4592                              <1> 		; mov r2,u.namep / u.namep points to char 
  4593                              <1> 			       ; / following a / or nul
  4594                              <1> 	;mov	bx, [u.dirbuf]
  4595                              <1> 		; mov u.dirbuf,r1 / move i-node number in directory 
  4596                              <1> 				; / entry to r1
  4597 0000D2B0 20C0                <1> 	and 	al, al
  4598                              <1> 		; tst r4 / if r4 = 0 the end of file name reached,
  4599                              <1> 		      ;  / if r4 = </> then go to next directory
  4600                              <1> 	; mov	ax, bx
  4601 0000D2B2 66A1[50470100]      <1> 	mov 	ax, [u.dirbuf] ; 17/06/2015
  4602 0000D2B8 0F85FDFEFFFF        <1>         jnz     namei_2 
  4603                              <1> 		; bne 1b
  4604                              <1> 	; AX = i-number of the file
  4605                              <1> ;;nig:
  4606 0000D2BE C3                  <1> 	retn
  4607                              <1> 		; tst (r0)+ / gives non-error return
  4608                              <1> ;;nib:
  4609                              <1> ;;	xor	ax, ax ; Retro UNIX 8086 v1 modification !
  4610                              <1> 		       ; ax = 0 -> file not found 
  4611                              <1> ;;	stc	; 27/05/2013
  4612                              <1> ;;	retn
  4613                              <1> 		; rts r0
  4614                              <1> 
  4615                              <1> trans_addr_nmbp:
  4616                              <1> 	; 18/10/2015
  4617                              <1> 	; 12/10/2015
  4618 0000D2BF 8B2D[34470100]      <1> 	mov 	ebp, [u.namep]
  4619                              <1> trans_addr_nm: 
  4620                              <1> 	; Convert virtual (pathname) address to physical address
  4621                              <1> 	; (Retro UNIX 386 v1 feature only !)
  4622                              <1> 	; 18/10/2015
  4623                              <1> 	; 12/10/2015 (u.pnbase & u.pncount has been removed from code)
  4624                              <1> 	; 02/07/2015
  4625                              <1> 	; 17/06/2015
  4626                              <1> 	; 16/06/2015
  4627                              <1> 	;
  4628                              <1> 	; INPUTS: 
  4629                              <1> 	;	ebp = pathname address (virtual) ; [u.namep]
  4630                              <1> 	;	[u.pgdir] = user's page directory
  4631                              <1> 	; OUTPUT:
  4632                              <1> 	;       esi = physical address of the pathname
  4633                              <1> 	;	ecx = remain byte count in the page
  4634                              <1> 	;
  4635                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, ESI)
  4636                              <1> 	;
  4637 0000D2C5 833D[74470100]00    <1>         cmp     dword [u.ppgdir], 0  ; /etc/init ? (sysexec)
  4638 0000D2CC 7618                <1> 	jna	short trans_addr_nmk ; the caller is os kernel;
  4639                              <1> 				     ; it is already physical address
  4640 0000D2CE 50                  <1>    	push	eax	
  4641 0000D2CF 89EB                <1> 	mov	ebx, ebp ; [u.namep] ; pathname address (virtual)
  4642 0000D2D1 E8417FFFFF          <1>        	call	get_physical_addr ; get physical address
  4643 0000D2D6 7204                <1> 	jc	short tr_addr_nm_err
  4644                              <1> 	; 18/10/2015
  4645                              <1> 	; eax = physical address 
  4646                              <1> 	; cx = remain byte count in page (1-4096) 
  4647                              <1> 		; 12/10/2015 (cx = [u.pncount])
  4648 0000D2D8 89C6                <1> 	mov	esi, eax ; 12/10/2015 (esi=[u.pnbase])
  4649 0000D2DA 58                  <1> 	pop	eax 
  4650 0000D2DB C3                  <1> 	retn
  4651                              <1> 
  4652                              <1> tr_addr_nm_err:
  4653 0000D2DC A3[80470100]        <1> 	mov	[u.error], eax
  4654                              <1> 	;pop 	eax
  4655 0000D2E1 E9A7E8FFFF          <1> 	jmp	error
  4656                              <1> 
  4657                              <1> trans_addr_nmk:
  4658                              <1> 	; 12/10/2015
  4659                              <1> 	; 02/07/2015
  4660 0000D2E6 8B35[34470100]      <1> 	mov	esi, [u.namep]  ; [u.pnbase]
  4661 0000D2EC 66B90010            <1> 	mov	cx, PAGE_SIZE ; 4096 ; [u.pncount]
  4662 0000D2F0 C3                  <1> 	retn
  4663                              <1> 
  4664                              <1> syschdir:
  4665                              <1> 	; / makes the directory specified in the argument
  4666                              <1> 	; / the current directory
  4667                              <1> 	;
  4668                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
  4669                              <1> 	; 19/06/2013 (Retro UNIX 8086 v1)
  4670                              <1> 	;
  4671                              <1> 	; 'syschdir' makes the directory specified in its argument
  4672                              <1> 	; the current working directory.
  4673                              <1> 	;
  4674                              <1> 	; Calling sequence:
  4675                              <1> 	;	syschdir; name
  4676                              <1> 	; Arguments:
  4677                              <1> 	;	name - address of the path name of a directory
  4678                              <1> 	;	       terminated by nul byte.	
  4679                              <1> 	; Inputs: -
  4680                              <1> 	; Outputs: -
  4681                              <1> 	; ...............................................................
  4682                              <1> 	;				
  4683                              <1> 	; Retro UNIX 8086 v1 modification:
  4684                              <1> 	;	 The user/application program puts address of 
  4685                              <1> 	;	 the path name in BX register as 'syschdir' 
  4686                              <1> 	; 	 system call argument.
  4687                              <1> 
  4688 0000D2F1 891D[34470100]      <1> 	mov	[u.namep], ebx
  4689                              <1> 		;jsr r0,arg; u.namep / u.namep points to path name
  4690 0000D2F7 E87EFEFFFF          <1> 	call	namei
  4691                              <1> 		; jsr r0,namei / find its i-number
  4692                              <1> 	;jc	error
  4693                              <1> 		; br error3
  4694 0000D2FC 730F                <1> 	jnc	short syschdir0
  4695                              <1> 	; 'directory not found !' error
  4696 0000D2FE C705[80470100]0C00- <1> 	mov	dword [u.error], ERR_DIR_NOT_FOUND ; 12
  4696 0000D306 0000                <1>
  4697 0000D308 E980E8FFFF          <1> 	jmp	error
  4698                              <1> syschdir0:
  4699 0000D30D E848130000          <1> 	call	access
  4700                              <1> 		; jsr r0,access; 2 / get i-node into core
  4701 0000D312 66F705[B8430100]00- <1> 	test	word [i.flgs], 4000h
  4701 0000D31A 40                  <1>
  4702                              <1> 		; bit $40000,i.flgs / is it a directory?
  4703                              <1> 	;jz	error 
  4704                              <1> 		; beq error3 / no error
  4705 0000D31B 750F                <1> 	jnz	short syschdir1
  4706 0000D31D C705[80470100]1300- <1> 	mov	dword [u.error], ERR_NOT_DIR ; 'not a valid directory !'
  4706 0000D325 0000                <1>
  4707 0000D327 E961E8FFFF          <1> 	jmp	error
  4708                              <1> syschdir1:
  4709 0000D32C 66A3[20470100]      <1> 	mov	[u.cdir], ax
  4710                              <1> 		; mov r1,u.cdir / move i-number to users 
  4711                              <1> 			      ; / current directory
  4712 0000D332 66A1[FE460100]      <1> 	mov	ax, [cdev]
  4713 0000D338 66A3[66470100]      <1> 	mov	[u.cdrv], ax
  4714                              <1> 		; mov cdev,u.cdev / move its device to users 
  4715                              <1> 			        ; / current device
  4716 0000D33E E96AE8FFFF          <1> 	jmp	sysret
  4717                              <1> 		; br sysret3
  4718                              <1> 	
  4719                              <1> syschmod: ; < change mode of file >
  4720                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
  4721                              <1> 	; temporary !
  4722 0000D343 B801000000          <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
  4723 0000D348 A3[80470100]        <1>         mov     [u.error], eax
  4724 0000D34D A3[1C470100]        <1>         mov     [u.r0], eax 
  4725 0000D352 E936E8FFFF          <1> 	jmp	error
  4726                              <1> 
  4727                              <1> isown:
  4728                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  4729                              <1> 	; 04/05/2013 - 07/07/2013 (Retro UNIX 8086 v1)
  4730                              <1> 	;
  4731                              <1> 	; 'isown' is given a file name (the 1st argument).
  4732                              <1> 	;  It find the i-number of that file via 'namei' 
  4733                              <1> 	;  then gets the i-node into core via 'iget'.
  4734                              <1> 	;  It then tests to see if the user is super user. 
  4735                              <1> 	;  If not, it cheks to see if the user is owner of 
  4736                              <1> 	;  the file. If he is not an error occurs.
  4737                              <1> 	;  If user is the owner 'setimod' is called to indicate
  4738                              <1> 	;  the inode has been modificed and the 2nd argument of
  4739                              <1> 	;  the call is put in r2.
  4740                              <1> 	;
  4741                              <1> 	; INPUTS ->
  4742                              <1> 	;    arguments of syschmod and syschown calls
  4743                              <1> 	; OUTPUTS ->
  4744                              <1> 	;    u.uid - id of user
  4745                              <1> 	;    imod - set to a 1
  4746                              <1> 	;    r2 - contains second argument of the system call				 	
  4747                              <1> 	;
  4748                              <1> 	;   ((AX=R2) output as 2nd argument)
  4749                              <1> 	;
  4750                              <1>         ; ((Modified registers: eAX, eDX, eBX, eCX, eSI, eDI, eBP))  
  4751                              <1> 	;
  4752                              <1> 		; jsr r0,arg2 / u.namep points to file name
  4753                              <1> 	;; ! 2nd argument on top of stack !
  4754                              <1> 	;; 22/06/2015 - 32 bit modifications
  4755                              <1> 	;; 07/07/2013
  4756 0000D357 891D[34470100]      <1> 	mov	[u.namep], ebx ;; 1st argument
  4757 0000D35D 51                  <1> 	push 	ecx ;; 2nd argument
  4758                              <1> 	;;
  4759 0000D35E E817FEFFFF          <1> 	call	namei
  4760                              <1> 		; jsr r0,namei / get its i-number
  4761                              <1>        ; Retro UNIX 8086 v1 modification !
  4762                              <1>        ; ax = 0 -> file not found 
  4763                              <1> 	;and	ax, ax
  4764                              <1> 	;jz	error
  4765                              <1> 	;jc	error ; 27/05/2013
  4766                              <1> 		; br error3
  4767 0000D363 730F                <1> 	jnc	short isown0
  4768                              <1> 	; 'file not found !' error
  4769 0000D365 C705[80470100]0C00- <1> 	mov	dword [u.error], ERR_FILE_NOT_FOUND ; 12
  4769 0000D36D 0000                <1>
  4770 0000D36F E919E8FFFF          <1> 	jmp	error
  4771                              <1> isown0:
  4772 0000D374 E8D7120000          <1> 	call	iget
  4773                              <1> 		; jsr r0,iget / get i-node into core
  4774 0000D379 A0[68470100]        <1> 	mov	al, [u.uid] ; 02/08/2013
  4775 0000D37E 08C0                <1> 	or	al, al
  4776                              <1> 		; tstb u.uid / super user?
  4777 0000D380 7417                <1> 	jz	short isown1
  4778                              <1> 		; beq 1f / yes, branch
  4779 0000D382 3A05[BB430100]      <1> 	cmp	al, [i.uid]
  4780                              <1> 		; cmpb i.uid,u.uid / no, is this the owner of
  4781                              <1> 				 ; / the file
  4782                              <1> 	;jne	error
  4783                              <1> 		; beq 1f / yes
  4784                              <1> 		; jmp error3 / no, error
  4785 0000D388 740F                <1> 	je	short isown1
  4786                              <1> 
  4787 0000D38A C705[80470100]0B00- <1> 	mov	dword [u.error], ERR_NOT_OWNER  ; 11
  4787 0000D392 0000                <1>
  4788                              <1> 			;  'permission denied !' error
  4789 0000D394 E9F4E7FFFF          <1> 	jmp	error
  4790                              <1> isown1: ; 1:
  4791 0000D399 E8B8120000          <1> 	call	setimod
  4792                              <1> 		; jsr r0,setimod / indicates 
  4793                              <1> 		;	       ; / i-node has been modified
  4794 0000D39E 58                  <1> 	pop	eax ; 2nd argument
  4795                              <1> 		; mov (sp)+,r2 / mode is put in r2 
  4796                              <1> 		       ; / (u.off put on stack with 2nd arg)
  4797 0000D39F C3                  <1> 	retn
  4798                              <1> 		; rts r0
  4799                              <1> 
  4800                              <1> ;;arg:  ; < get system call arguments >
  4801                              <1> 	; 'arg' extracts an argument for a routine whose call is 
  4802                              <1> 	; of form:
  4803                              <1> 	;	sys 'routine' ; arg1
  4804                              <1> 	;		or
  4805                              <1> 	;	sys 'routine' ; arg1 ; arg2
  4806                              <1> 	;		or
  4807                              <1> 	;	sys 'routine' ; arg1;...;arg10 (sys exec) 
  4808                              <1> 	;	
  4809                              <1> 	; INPUTS ->
  4810                              <1> 	;    u.sp+18 - contains a pointer to one of arg1..argn
  4811                              <1> 	;	This pointers's value is actually the value of
  4812                              <1> 	;	update pc at the the trap to sysent (unkni) is
  4813                              <1> 	;	made to process the sys instruction
  4814                              <1> 	;    r0 - contains the return address for the routine
  4815                              <1> 	;	that called arg. The data in the word pointer 
  4816                              <1> 	;	to by the return address is used as address
  4817                              <1> 	;	in which the extracted argument is stored   		
  4818                              <1> 	;    	
  4819                              <1> 	; OUTPUTS ->
  4820                              <1> 	;    'address' - contains the extracted argument 
  4821                              <1> 	;    u.sp+18 - is incremented by 2 
  4822                              <1> 	;    r1 - contains the extracted argument
  4823                              <1> 	;    r0 - points to the next instruction to be
  4824                              <1> 	;	 executed in the calling routine.
  4825                              <1> 	;
  4826                              <1>   
  4827                              <1> 	; mov u.sp,r1
  4828                              <1> 	; mov *18.(r1),*(r0)+ / put argument of system call
  4829                              <1> 			; / into argument of arg2
  4830                              <1> 	; add $2,18.(r1) / point pc on stack 
  4831                              <1> 			      ; / to next system argument
  4832                              <1> 	; rts r0
  4833                              <1> 
  4834                              <1> ;;arg2: ; < get system calls arguments - with file name pointer>
  4835                              <1> 	; 'arg2' takes first argument in system call
  4836                              <1> 	;  (pointer to name of the file) and puts it in location
  4837                              <1> 	;  u.namep; takes second argument and puts it in u.off
  4838                              <1> 	;  and on top of the stack
  4839                              <1> 	;	
  4840                              <1> 	; INPUTS ->
  4841                              <1> 	;    u.sp, r0
  4842                              <1> 	;    	
  4843                              <1> 	; OUTPUTS ->
  4844                              <1> 	;    u.namep
  4845                              <1> 	;    u.off 
  4846                              <1> 	;    u.off pushed on stack
  4847                              <1> 	;    r1
  4848                              <1> 	;
  4849                              <1> 
  4850                              <1> 	; jsr	r0,arg; u.namep / u.namep contains value of
  4851                              <1> 				; / first arg in sys call
  4852                              <1> 	; jsr r0,arg; u.off / u.off contains value of 
  4853                              <1> 				; / second arg in sys call
  4854                              <1> 	; mov r0,r1 / r0 points to calling routine
  4855                              <1> 	; mov (sp),r0 / put operation code back in r0
  4856                              <1> 	; mov u.off,(sp) / put pointer to second argument 
  4857                              <1> 			; / on stack
  4858                              <1> 	; jmp (r1) / return to calling routine
  4859                              <1> 
  4860                              <1> syschown: ; < change owner of file >
  4861                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
  4862                              <1> 	; 20/06/2013 - 02/08/2013 (Retro UNIX 8086 v1)
  4863                              <1> 	;
  4864                              <1> 	; 'syschown' changes the owner of the file whose name is given
  4865                              <1> 	; as null terminated string pointed to by 'name' has it's owner
  4866                              <1> 	; changed to 'owner'
  4867                              <1> 	;
  4868                              <1> 	; Calling sequence:
  4869                              <1> 	;	syschown; name; owner
  4870                              <1> 	; Arguments:
  4871                              <1> 	;	name - address of the file name
  4872                              <1> 	;	       terminated by null byte.
  4873                              <1> 	;	owner - (new) owner (number/ID)
  4874                              <1> 	;	
  4875                              <1> 	; Inputs: -
  4876                              <1> 	; Outputs: -
  4877                              <1> 	; ...............................................................
  4878                              <1> 	;				
  4879                              <1> 	; Retro UNIX 8086 v1 modification: 
  4880                              <1> 	;       'syschown' system call has two arguments; so,
  4881                              <1> 	;	* 1st argument, name is pointed to by BX register
  4882                              <1> 	;	* 2nd argument, owner number is in CX register
  4883                              <1> 	;
  4884                              <1> 	; / name; owner
  4885 0000D3A0 E8B2FFFFFF          <1> 	call	isown
  4886                              <1> 		; jsr r0,isown / get the i-node and check user status
  4887 0000D3A5 803D[68470100]00    <1> 	cmp 	byte [u.uid], 0 ; 02/08/2013 
  4888                              <1> 		; tstb u.uid / super user
  4889 0000D3AC 7418                <1> 	jz	short syschown1
  4890                              <1> 		; beq 2f / yes, 2f
  4891 0000D3AE F605[B8430100]20    <1>         test    byte [i.flgs], 20h ; 32
  4892                              <1> 		; bit $40,i.flgs / no, set userid on execution?
  4893                              <1> 	;jnz	error
  4894                              <1> 		; bne 3f / yes error, could create Trojan Horses
  4895 0000D3B5 740F                <1> 	jz	short syschown1
  4896                              <1> 	; 'permission denied !'
  4897 0000D3B7 C705[80470100]0B00- <1> 	mov	dword [u.error], ERR_FILE_ACCESS  ; 11
  4897 0000D3BF 0000                <1>
  4898 0000D3C1 E9C7E7FFFF          <1> 	jmp	error
  4899                              <1> syschown1: ; 2:
  4900                              <1> 	; AL = owner (number/ID)
  4901 0000D3C6 A2[BB430100]        <1> 	mov	[i.uid], al ; 23/06/2015
  4902                              <1> 		;  movb	r2,i.uid / no, put the new owners id 
  4903                              <1> 			       ; / in the i-node
  4904 0000D3CB E9DDE7FFFF          <1> 	jmp	sysret
  4905                              <1> 	; 1: 
  4906                              <1> 		; jmp sysret4
  4907                              <1> 	; 3:
  4908                              <1> 		; jmp	error
  4909                              <1> 
  4910                              <1> systime: ; / get time of year
  4911                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
  4912                              <1> 	; 20/06/2013 (Retro UNIX 8086 v1)
  4913                              <1> 	;
  4914                              <1> 	; 20/06/2013
  4915                              <1> 	; 'systime' gets the time of the year.
  4916                              <1> 	; The present time is put on the stack.
  4917                              <1> 	;
  4918                              <1> 	; Calling sequence:
  4919                              <1> 	;	systime
  4920                              <1> 	; Arguments: -
  4921                              <1> 	;	
  4922                              <1> 	; Inputs: -
  4923                              <1> 	; Outputs: sp+2, sp+4 - present time
  4924                              <1> 	; ...............................................................
  4925                              <1> 	;	
  4926                              <1> 	; Retro UNIX 8086 v1 modification: 
  4927                              <1> 	;       'systime' system call will return to the user
  4928                              <1> 	;	with unix time (epoch) in DX:AX register pair
  4929                              <1> 	;
  4930                              <1> 	; 	!! Major modification on original Unix v1 'systime' 
  4931                              <1> 	;	system call for PC compatibility !!		 	
  4932                              <1> 
  4933 0000D3D0 E887120000          <1> 	call 	epoch
  4934 0000D3D5 A3[1C470100]        <1> 	mov 	[u.r0], eax
  4935                              <1> 		; mov s.time,4(sp)
  4936                              <1> 		; mov s.time+2,2(sp) / put the present time 
  4937                              <1> 				   ; / on the stack
  4938                              <1> 		; br sysret4
  4939 0000D3DA E9CEE7FFFF          <1> 	jmp	sysret 
  4940                              <1> 
  4941                              <1> sysstime: ; / set time
  4942                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
  4943                              <1> 	; 20/06/2013 - 02/08/2013 (Retro UNIX 8086 v1)
  4944                              <1> 	;
  4945                              <1> 	; 'sysstime' sets the time. Only super user can use this call.
  4946                              <1> 	;
  4947                              <1> 	; Calling sequence:
  4948                              <1> 	;	sysstime
  4949                              <1> 	; Arguments: -
  4950                              <1> 	;	
  4951                              <1> 	; Inputs: sp+2, sp+4 - time system is to be set to.
  4952                              <1> 	; Outputs: -
  4953                              <1> 	; ...............................................................
  4954                              <1> 	;	
  4955                              <1> 	; Retro UNIX 8086 v1 modification: 
  4956                              <1> 	;	the user calls 'sysstime' with unix (epoch) time
  4957                              <1> 	;	(to be set) is in CX:BX register pair as two arguments.
  4958                              <1> 	; 
  4959                              <1> 	;	Retro UNIX 8086 v1 argument transfer method 2 is used
  4960                              <1> 	;	to get sysstime system call arguments from the user;
  4961                              <1> 	;	* 1st argument, lowword of unix time is in BX register
  4962                              <1> 	;	* 2nd argument, highword of unix time is in CX register		 	
  4963                              <1> 	;
  4964                              <1> 	; 	!! Major modification on original Unix v1 'sysstime' 
  4965                              <1> 	;	system call for PC compatibility !!	
  4966                              <1> 
  4967 0000D3DF 803D[68470100]00    <1> 	cmp	byte [u.uid], 0
  4968                              <1> 		; tstb u.uid / is user the super user
  4969                              <1> 	;ja	error
  4970                              <1> 		; bne error4 / no, error
  4971 0000D3E6 760F                <1> 	jna	short systime1
  4972                              <1> 	; 'permission denied !'
  4973 0000D3E8 C705[80470100]0B00- <1> 	mov	dword [u.error], ERR_NOT_SUPERUSER  ; 11 
  4973 0000D3F0 0000                <1>
  4974 0000D3F2 E996E7FFFF          <1> 	jmp	error
  4975                              <1> systime1:
  4976                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - 32 bit version)
  4977                              <1> 	; EBX = unix (epoch) time (from user)
  4978 0000D3F7 89D8                <1> 	mov	eax, ebx
  4979 0000D3F9 E85F120000          <1> 	call 	set_date_time
  4980                              <1> 		; mov 4(sp),s.time
  4981                              <1> 		; mov 2(sp),s.time+2 / set the system time
  4982 0000D3FE E9AAE7FFFF          <1> 	jmp	sysret
  4983                              <1> 		; br sysret4
  4984                              <1> 
  4985                              <1> sysbreak:
  4986                              <1> 	; 18/10/2015
  4987                              <1> 	; 07/10/2015
  4988                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
  4989                              <1> 	; 20/06/2013 - 24/03/2014 (Retro UNIX 8086 v1)
  4990                              <1> 	;
  4991                              <1> 	; 'sysbreak' sets the programs break points. 
  4992                              <1> 	; It checks the current break point (u.break) to see if it is
  4993                              <1> 	; between "core" and the stack (sp). If it is, it is made an
  4994                              <1> 	; even address (if it was odd) and the area between u.break
  4995                              <1> 	; and the stack is cleared. The new breakpoint is then put
  4996                              <1> 	; in u.break and control is passed to 'sysret'.
  4997                              <1> 	;
  4998                              <1> 	; Calling sequence:
  4999                              <1> 	;	sysbreak; addr
  5000                              <1> 	; Arguments: -
  5001                              <1> 	;	
  5002                              <1> 	; Inputs: u.break - current breakpoint
  5003                              <1> 	; Outputs: u.break - new breakpoint 
  5004                              <1> 	;	area between old u.break and the stack (sp) is cleared.
  5005                              <1> 	; ...............................................................
  5006                              <1> 	;	
  5007                              <1> 	; Retro UNIX 8086 v1 modification:
  5008                              <1> 	;	The user/application program puts breakpoint address
  5009                              <1> 	;       in BX register as 'sysbreak' system call argument.
  5010                              <1> 	; 	(argument transfer method 1)
  5011                              <1> 	;
  5012                              <1> 	;  NOTE: Beginning of core is 0 in Retro UNIX 8086 v1 !
  5013                              <1> 	; 	((!'sysbreak' is not needed in Retro UNIX 8086 v1!))
  5014                              <1> 	;  NOTE:
  5015                              <1> 	; 	'sysbreak' clears extended part (beyond of previous
  5016                              <1> 	;	'u.break' address) of user's memory for original unix's
  5017                              <1> 	;	'bss' compatibility with Retro UNIX 8086 v1 (19/11/2013)
  5018                              <1> 
  5019                              <1> 		; mov u.break,r1 / move users break point to r1
  5020                              <1> 		; cmp r1,$core / is it the same or lower than core?
  5021                              <1> 		; blos 1f / yes, 1f
  5022                              <1> 	; 23/06/2015
  5023 0000D403 8B2D[48470100]      <1> 	mov	ebp, [u.break] ; virtual address (offset)
  5024                              <1> 	;and	ebp, ebp
  5025                              <1> 	;jz	short sysbreak_3 
  5026                              <1> 	; Retro UNIX 386 v1 NOTE: u.break points to virtual address !!!
  5027                              <1> 	; (Even break point address is not needed for Retro UNIX 386 v1)
  5028 0000D409 8B15[14470100]      <1> 	mov	edx, [u.sp] ; kernel stack at the beginning of sys call
  5029 0000D40F 83C20C              <1> 	add	edx, 12 ; EIP -4-> CS -4-> EFLAGS -4-> ESP (user) 
  5030                              <1> 	; 07/10/2015
  5031 0000D412 891D[48470100]      <1> 	mov	[u.break], ebx ; virtual address !!!
  5032                              <1> 	;
  5033 0000D418 3B1A                <1> 	cmp	ebx, [edx] ; compare new break point with 
  5034                              <1> 			   ; with top of user's stack (virtual!)
  5035 0000D41A 7327                <1> 	jnb	short sysbreak_3
  5036                              <1> 		; cmp r1,sp / is it the same or higher 
  5037                              <1> 			  ; / than the stack?
  5038                              <1> 		; bhis 1f / yes, 1f
  5039 0000D41C 89DE                <1> 	mov	esi, ebx
  5040 0000D41E 29EE                <1> 	sub	esi, ebp ; new break point - old break point
  5041 0000D420 7621                <1> 	jna	short sysbreak_3 
  5042                              <1> 	;push	ebx
  5043                              <1> sysbreak_1:
  5044 0000D422 89EB                <1> 	mov	ebx, ebp  
  5045 0000D424 E8EE7DFFFF          <1> 	call	get_physical_addr ; get physical address
  5046 0000D429 0F82ADFEFFFF        <1> 	jc	tr_addr_nm_err
  5047                              <1> 	; 18/10/2015
  5048 0000D42F 89C7                <1> 	mov	edi, eax 
  5049 0000D431 29C0                <1> 	sub	eax, eax ; 0
  5050                              <1> 		 ; ECX = remain byte count in page (1-4096)
  5051 0000D433 39CE                <1> 	cmp	esi, ecx
  5052 0000D435 7302                <1> 	jnb	short sysbreak_2
  5053 0000D437 89F1                <1> 	mov	ecx, esi
  5054                              <1> sysbreak_2:
  5055 0000D439 29CE                <1> 	sub	esi, ecx
  5056 0000D43B 01CD                <1> 	add	ebp, ecx
  5057 0000D43D F3AA                <1> 	rep 	stosb
  5058 0000D43F 09F6                <1> 	or	esi, esi
  5059 0000D441 75DF                <1> 	jnz	short sysbreak_1
  5060                              <1> 	;
  5061                              <1> 		; bit $1,r1 / is it an odd address
  5062                              <1> 		; beq 2f / no, its even
  5063                              <1> 		; clrb (r1)+ / yes, make it even
  5064                              <1> 	; 2: / clear area between the break point and the stack
  5065                              <1> 		; cmp r1,sp / is it higher or same than the stack
  5066                              <1> 		; bhis 1f / yes, quit
  5067                              <1> 		; clr (r1)+ / clear word
  5068                              <1> 		; br 2b / go back
  5069                              <1> 	;pop	ebx
  5070                              <1> sysbreak_3: ; 1:
  5071                              <1> 	;mov	[u.break], ebx ; virtual address !!!
  5072                              <1> 		; jsr r0,arg; u.break / put the "address" 
  5073                              <1> 			; / in u.break (set new break point)
  5074                              <1> 		; br sysret4 / br sysret
  5075 0000D443 E965E7FFFF          <1> 	jmp	sysret
  5076                              <1> 
  5077                              <1> sysseek: ; / moves read write pointer in an fsp entry
  5078                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0)
  5079                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  5080                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
  5081                              <1> 	;
  5082                              <1> 	; 'sysseek' changes the r/w pointer of (3rd word of in an
  5083                              <1> 	; fsp entry) of an open file whose file descriptor is in u.r0.
  5084                              <1> 	; The file descriptor refers to a file open for reading or
  5085                              <1> 	; writing. The read (or write) pointer is set as follows:
  5086                              <1> 	;	* if 'ptrname' is 0, the pointer is set to offset.
  5087                              <1> 	;	* if 'ptrname' is 1, the pointer is set to its
  5088                              <1> 	;	  current location plus offset.
  5089                              <1> 	;	* if 'ptrname' is 2, the pointer is set to the
  5090                              <1> 	;	  size of file plus offset.
  5091                              <1> 	; The error bit (e-bit) is set for an undefined descriptor.
  5092                              <1> 	;
  5093                              <1> 	; Calling sequence:
  5094                              <1> 	;	sysseek; offset; ptrname
  5095                              <1> 	; Arguments:
  5096                              <1> 	;	offset - number of bytes desired to move 
  5097                              <1> 	;		 the r/w pointer
  5098                              <1> 	;	ptrname - a switch indicated above
  5099                              <1> 	;
  5100                              <1> 	; Inputs: r0 - file descriptor 
  5101                              <1> 	; Outputs: -
  5102                              <1> 	; ...............................................................
  5103                              <1> 	;	
  5104                              <1> 	; Retro UNIX 8086 v1 modification: 
  5105                              <1> 	;       'sysseek' system call has three arguments; so,
  5106                              <1> 	;	* 1st argument, file descriptor is in BX (BL) register
  5107                              <1> 	;	* 2nd argument, offset is in CX register
  5108                              <1> 	;	* 3rd argument, ptrname/switch is in DX (DL) register	
  5109                              <1> 
  5110 0000D448 E821000000          <1> 	call	seektell
  5111                              <1> 	; EAX = Current R/W pointer of the file
  5112                              <1> 	; EBX = [u.fofp]
  5113                              <1> 	; [u.base] = offset (ECX input)
  5114                              <1> 
  5115 0000D44D 0305[3C470100]      <1> 	add	eax, [u.base]
  5116 0000D453 8903                <1> 	mov	[ebx], eax
  5117 0000D455 E953E7FFFF          <1> 	jmp	sysret
  5118                              <1> 
  5119                              <1> systell: ; / get the r/w pointer
  5120                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0) - temporary !-
  5121                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  5122                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
  5123                              <1> 	;
  5124                              <1> 	; Retro UNIX 8086 v1 modification:
  5125                              <1> 	; ! 'systell' does not work in original UNIX v1,
  5126                              <1> 	; 	    it returns with error !
  5127                              <1> 	; Inputs: r0 - file descriptor 
  5128                              <1> 	; Outputs: r0 - file r/w pointer
  5129                              <1> 
  5130                              <1> 	;xor	ecx, ecx ; 0
  5131 0000D45A BA01000000          <1> 	mov	edx, 1 ; 05/08/2013
  5132                              <1> 	;call 	seektell
  5133 0000D45F E810000000          <1> 	call 	seektell0 ; 05/08/2013
  5134                              <1> 	;; 06/11/2016
  5135                              <1> 	;; mov	eax, [ebx]
  5136 0000D464 A3[1C470100]        <1> 	mov	[u.r0], eax
  5137 0000D469 E93FE7FFFF          <1> 	jmp	sysret
  5138                              <1> 
  5139                              <1> ; Original unix v1 'systell' system call:
  5140                              <1> 		; jsr r0,seektell
  5141                              <1> 		; br error4
  5142                              <1> 
  5143                              <1> seektell:
  5144                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0)
  5145                              <1> 	; 03/01/2016
  5146                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  5147                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
  5148                              <1> 	;
  5149                              <1> 	; 'seektell' puts the arguments from sysseek and systell
  5150                              <1> 	; call in u.base and u.count. It then gets the i-number of
  5151                              <1> 	; the file from the file descriptor in u.r0 and by calling
  5152                              <1> 	; getf. The i-node is brought into core and then u.count
  5153                              <1> 	; is checked to see it is a 0, 1, or 2.
  5154                              <1> 	; If it is 0 - u.count stays the same
  5155                              <1> 	;          1 - u.count = offset (u.fofp)
  5156                              <1> 	;	   2 - u.count = i.size (size of file)
  5157                              <1> 	; 	 		
  5158                              <1> 	; !! Retro UNIX 8086 v1 modification:
  5159                              <1> 	;	Argument 1, file descriptor is in BX;
  5160                              <1> 	;	Argument 2, offset is in CX;
  5161                              <1> 	;	Argument 3, ptrname/switch is in DX register.	
  5162                              <1> 	;
  5163                              <1> 	; ((Return -> eax = base for offset (position= base+offset))
  5164                              <1> 	;
  5165 0000D46E 890D[3C470100]      <1> 	mov 	[u.base], ecx ; offset
  5166                              <1> seektell0:
  5167 0000D474 8915[40470100]      <1> 	mov 	[u.count], edx
  5168                              <1> 	; EBX = file descriptor (file number)
  5169 0000D47A E898FCFFFF          <1> 	call	getf1
  5170                              <1> 	; EAX = First cluster of the file
  5171                              <1> 	; EBX = File number (Open file number)
  5172                              <1> 	; [u.fofp] = Pointer to File pointer
  5173                              <1> 	; [i.size] = File size
  5174                              <1> 
  5175 0000D47F 09C0                <1> 	or	eax, eax
  5176 0000D481 7514                <1> 	jnz	short seektell1
  5177                              <1> 
  5178 0000D483 B80A000000          <1> 	mov	eax, ERR_FILE_NOT_OPEN
  5179 0000D488 A3[1C470100]        <1> 	mov	[u.r0], eax 
  5180 0000D48D A3[80470100]        <1> 	mov	dword [u.error], eax ; 'file not open !'
  5181 0000D492 E9F6E6FFFF          <1> 	jmp	error
  5182                              <1> 
  5183                              <1> seektell1:
  5184 0000D497 8B1D[2C470100]      <1>         mov     ebx, [u.fofp]
  5185 0000D49D 803D[40470100]01    <1> 	cmp	byte [u.count], 1
  5186 0000D4A4 7705                <1> 	ja	short seektell2
  5187 0000D4A6 7409                <1> 	je	short seektell3
  5188 0000D4A8 31C0                <1> 	xor	eax, eax
  5189 0000D4AA C3                  <1> 	retn
  5190                              <1> 
  5191                              <1> seektell2:
  5192 0000D4AB A1[A9470100]        <1>         mov   	eax, [i.size]
  5193 0000D4B0 C3                  <1> 	retn
  5194                              <1> 
  5195                              <1> seektell3:
  5196 0000D4B1 8B03                <1> 	mov	eax, [ebx]
  5197 0000D4B3 C3                  <1> 	retn
  5198                              <1> 
  5199                              <1> sysintr: ; / set interrupt handling
  5200                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  5201                              <1> 	; 07/07/2013 (Retro UNIX 8086 v1)
  5202                              <1> 	;
  5203                              <1> 	; 'sysintr' sets the interrupt handling value. It puts
  5204                              <1> 	; argument of its call in u.intr then branches into 'sysquit'
  5205                              <1> 	; routine. u.tty is checked if to see if a control tty exists.
  5206                              <1> 	; If one does the interrupt character in the tty buffer is
  5207                              <1> 	; cleared and 'sysret'is called. If one does not exits
  5208                              <1> 	; 'sysret' is just called.	
  5209                              <1> 	;
  5210                              <1> 	; Calling sequence:
  5211                              <1> 	;	sysintr; arg
  5212                              <1> 	; Argument:
  5213                              <1> 	;	arg - if 0, interrupts (ASCII DELETE) are ignored.
  5214                              <1> 	;	    - if 1, intterupts cause their normal result
  5215                              <1> 	;		 i.e force an exit.
  5216                              <1> 	;	    - if arg is a location within the program,
  5217                              <1> 	;		control is passed to that location when
  5218                              <1> 	;		an interrupt occurs.	
  5219                              <1> 	; Inputs: -
  5220                              <1> 	; Outputs: -
  5221                              <1> 	; ...............................................................
  5222                              <1> 	;	
  5223                              <1> 	; Retro UNIX 8086 v1 modification: 
  5224                              <1> 	;       'sysintr' system call sets u.intr to value of BX
  5225                              <1> 	;	then branches into sysquit.
  5226                              <1> 	;
  5227 0000D4B4 66891D[62470100]    <1> 	mov	[u.intr], bx
  5228                              <1> 		; jsr r0,arg; u.intr / put the argument in u.intr
  5229                              <1> 		; br 1f / go into quit routine
  5230 0000D4BB E9EDE6FFFF          <1> 	jmp	sysret
  5231                              <1> 
  5232                              <1> sysquit:
  5233                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  5234                              <1> 	; 07/07/2013 (Retro UNIX 8086 v1)
  5235                              <1> 	;
  5236                              <1> 	; 'sysquit' turns off the quit signal. it puts the argument of
  5237                              <1> 	; the call in u.quit. u.tty is checked if to see if a control 
  5238                              <1> 	; tty exists. If one does the interrupt character in the tty
  5239                              <1> 	; buffer is cleared and 'sysret'is called. If one does not exits
  5240                              <1> 	; 'sysret' is just called.	
  5241                              <1> 	;
  5242                              <1> 	; Calling sequence:
  5243                              <1> 	;	sysquit; arg
  5244                              <1> 	; Argument:
  5245                              <1> 	;	arg - if 0, this call diables quit signals from the
  5246                              <1> 	;		typewriter (ASCII FS)
  5247                              <1> 	;	    - if 1, quits are re-enabled and cause execution to
  5248                              <1> 	;		cease and a core image to be produced.
  5249                              <1> 	;		 i.e force an exit.
  5250                              <1> 	;	    - if arg is an addres in the program,
  5251                              <1> 	;		a quit causes control to sent to that
  5252                              <1> 	;		location.	
  5253                              <1> 	; Inputs: -
  5254                              <1> 	; Outputs: -
  5255                              <1> 	; ...............................................................
  5256                              <1> 	;	
  5257                              <1> 	; Retro UNIX 8086 v1 modification: 
  5258                              <1> 	;       'sysquit' system call sets u.quit to value of BX
  5259                              <1> 	;	then branches into 'sysret'.
  5260                              <1> 	;
  5261 0000D4C0 66891D[64470100]    <1> 	mov	[u.quit], bx
  5262 0000D4C7 E9E1E6FFFF          <1> 	jmp	sysret
  5263                              <1> 		; jsr r0,arg; u.quit / put argument in u.quit
  5264                              <1> 	;1:
  5265                              <1> 		; mov u.ttyp,r1 / move pointer to control tty buffer
  5266                              <1> 			      ; / to r1
  5267                              <1> 		; beq sysret4 / return to user
  5268                              <1> 		; clrb 6(r1) / clear the interrupt character 
  5269                              <1> 			   ; / in the tty buffer
  5270                              <1> 		; br sysret4 / return to user
  5271                              <1> 
  5272                              <1> syssetuid: ; / set process id
  5273                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  5274                              <1> 	; 07/07/2013 - 02/08/2013 (Retro UNIX 8086 v1)
  5275                              <1> 	;
  5276                              <1> 	; 'syssetuid' sets the user id (u.uid) of the current process
  5277                              <1> 	; to the process id in (u.r0). Both the effective user and 
  5278                              <1> 	; u.uid and the real user u.ruid are set to this. 
  5279                              <1> 	; Only the super user can make this call.	
  5280                              <1> 	;
  5281                              <1> 	; Calling sequence:
  5282                              <1> 	;	syssetuid
  5283                              <1> 	; Arguments: -
  5284                              <1> 	;
  5285                              <1> 	; Inputs: (u.r0) - contains the process id.
  5286                              <1> 	; Outputs: -
  5287                              <1> 	; ...............................................................
  5288                              <1> 	;	
  5289                              <1> 	; Retro UNIX 8086 v1 modification: 
  5290                              <1> 	;       BL contains the (new) user ID of the current process
  5291                              <1> 
  5292                              <1> 		; movb *u.r0,r1 / move process id (number) to r1
  5293 0000D4CC 3A1D[69470100]      <1> 	cmp	bl, [u.ruid] 
  5294                              <1> 		; cmpb r1,u.ruid / is it equal to the real user 
  5295                              <1> 			       ; / id number
  5296 0000D4D2 741E                <1> 	je	short setuid1
  5297                              <1> 		; beq 1f / yes
  5298 0000D4D4 803D[68470100]00    <1> 	cmp	byte [u.uid], 0 ; 02/08/2013
  5299                              <1> 		; tstb u.uid / no, is current user the super user?
  5300                              <1> 	;ja	error
  5301                              <1> 		; bne error4 / no, error
  5302 0000D4DB 760F                <1> 	jna	short setuid0
  5303 0000D4DD C705[80470100]0B00- <1> 	mov	dword [u.error], ERR_NOT_SUPERUSER  ; 11
  5303 0000D4E5 0000                <1>
  5304                              <1> 				;  'permission denied !' error
  5305 0000D4E7 E9A1E6FFFF          <1> 	jmp	error
  5306                              <1> setuid0:
  5307 0000D4EC 881D[69470100]      <1> 	mov	[u.ruid], bl
  5308                              <1> setuid1: ; 1:
  5309 0000D4F2 881D[68470100]      <1> 	mov	[u.uid], bl ; 02/08/2013
  5310                              <1> 		; movb r1,u.uid / put process id in u.uid
  5311                              <1> 		; movb r1,u.ruid / put process id in u.ruid
  5312 0000D4F8 E9B0E6FFFF          <1> 	jmp	sysret
  5313                              <1> 		; br sysret4 / system return
  5314                              <1> 
  5315                              <1> sysgetuid: ; < get user id >
  5316                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  5317                              <1> 	; 07/07/2013 (Retro UNIX 8086 v1)
  5318                              <1> 	;
  5319                              <1> 	; 'sysgetuid' returns the real user ID of the current process.
  5320                              <1> 	; The real user ID identifies the person who is logged in,
  5321                              <1> 	; in contradistinction to the effective user ID, which
  5322                              <1> 	; determines his access permission at each moment. It is thus
  5323                              <1> 	; useful to programs which operate using the 'set user ID'
  5324                              <1> 	; mode, to find out who invoked them.	
  5325                              <1> 	;
  5326                              <1> 	; Calling sequence:
  5327                              <1> 	;	syssetuid
  5328                              <1> 	; Arguments: -
  5329                              <1> 	;
  5330                              <1> 	; Inputs: -
  5331                              <1> 	; Outputs: (u.r0) - contains the real user's id.
  5332                              <1> 	; ...............................................................
  5333                              <1> 	;	
  5334                              <1> 	; Retro UNIX 8086 v1 modification: 
  5335                              <1> 	;       AL contains the real user ID at return.
  5336                              <1> 	;
  5337 0000D4FD 0FB605[69470100]    <1> 	movzx 	eax, byte [u.ruid]
  5338 0000D504 A3[1C470100]        <1> 	mov	[u.r0], eax
  5339                              <1> 		; movb	u.ruid,*u.r0 / move the real user id to (u.r0)
  5340 0000D509 E99FE6FFFF          <1> 	jmp	sysret
  5341                              <1> 		; br sysret4 / systerm return, sysret
  5342                              <1> 
  5343                              <1> anyi: 
  5344                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
  5345                              <1> 	; Major Modification!
  5346                              <1> 	; TRDOS 386 does not permit to delete a file while it is open 
  5347                              <1> 	; The role of 'anyi' procedure has beeen changed to ensure that.
  5348                              <1> 	; 	
  5349                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
  5350                              <1> 	; 25/04/2013 (Retro UNIX 8086 v1)
  5351                              <1> 	;
  5352                              <1> 	; 'anyi' is called if a file deleted while open.
  5353                              <1> 	; "anyi" checks to see if someone else has opened this file.
  5354                              <1> 	;
  5355                              <1> 	; INPUTS ->
  5356                              <1> 	;    r1 - contains an i-number
  5357                              <1> 	;    fsp - start of table containing open files
  5358                              <1> 	;
  5359                              <1> 	; OUTPUTS ->
  5360                              <1> 	;    "deleted" flag set in fsp entry of another occurrence of
  5361                              <1> 	;	   this file and r2 points 1st word of this fsp entry.
  5362                              <1> 	;    if file not found - bit in i-node map is cleared
  5363                              <1> 	;    			 (i-node is freed)
  5364                              <1> 	;               all blocks related to i-node are freed
  5365                              <1> 	;	        all flags in i-node are cleared
  5366                              <1> 	; ((AX = R1)) input
  5367                              <1> 	;
  5368                              <1> 	;    (Retro UNIX Prototype : 02/12/2012, UNIXCOPY.ASM)
  5369                              <1>         ;    ((Modified registers: eDX, eCX, eBX, eSI, eDI, eBP))  
  5370                              <1> 	;
  5371                              <1> 	; / r1 contains an i-number
  5372                              <1> 
  5373                              <1> 	; TRDOS 386 (06/10/2016)
  5374                              <1> 	; 
  5375                              <1> 	; INPUT:
  5376                              <1> 	;	EAX = First Cluster
  5377                              <1> 	;	 DL = Logical DOS Drive Number
  5378                              <1> 	;
  5379                              <1> 	; OUTPUT:
  5380                              <1> 	;	CF = 1 -> EBX = File Handle/Number/Index
  5381                              <1> 	;	CF = 0 -> EBX = 0
  5382                              <1> 	;
  5383                              <1> 	; Modified Registers: EBX
  5384                              <1> 
  5385 0000D50E 31DB                <1> 	xor	ebx, ebx
  5386                              <1> anyi_0: 
  5387 0000D510 80BB[0A420100]00    <1> 	cmp	byte [ebx+OF_MODE], 0 ; 0 = empty entry
  5388 0000D517 770A                <1> 	ja	short anyi_2 ; 1 (r), 2 (w) or 3 (r&w)
  5389                              <1> anyi_1:
  5390 0000D519 FEC3                <1> 	inc	bl
  5391 0000D51B 80FB0A              <1> 	cmp	bl, OPENFILES ; max. count of open files
  5392 0000D51E 72F0                <1> 	jb	short anyi_0
  5393 0000D520 31C0                <1> 	xor	eax, eax
  5394 0000D522 C3                  <1> 	retn 
  5395                              <1> anyi_2:
  5396 0000D523 3A93[00420100]      <1> 	cmp	dl, [ebx+OF_DRIVE]
  5397 0000D529 75EE                <1> 	jne	short anyi_1
  5398 0000D52B 66C1E302            <1> 	shl	bx, 2 ; *4 (dword offset)
  5399 0000D52F 3B83[D8410100]      <1> 	cmp	eax, [ebx+OF_FCLUSTER]
  5400 0000D535 7406                <1> 	je	short anyi_3
  5401 0000D537 66C1EB02            <1> 	shr	bx, 2 ; /4 (byte offset)
  5402 0000D53B EBDC                <1> 	jmp	short anyi_1 	
  5403                              <1> anyi_3:
  5404 0000D53D 66C1EB02            <1> 	shr	bx, 2 ; /4 (bytes offset) (index)
  5405 0000D541 F9                  <1> 	stc
  5406 0000D542 C3                  <1> 	retn
  5407                              <1> 
  5408                              <1> ; Retro UNIX 386 v1 Kernel (v0.2) - u7.s
  5409                              <1> ; Last Modification: 14/11/2015
  5410                              <1> 
  5411                              <1> sysmount: ; / mount file system
  5412                              <1> 	; 24/10/2016 - TRDOS 386 (TRDOS v2.0)
  5413                              <1> 	; temporary !
  5414 0000D543 B80F000000          <1> 	mov	eax, ERR_DRV_NOT_RDY ; drive not ready !
  5415 0000D548 A3[80470100]        <1>         mov     [u.error], eax
  5416 0000D54D A3[1C470100]        <1>         mov     [u.r0], eax 
  5417 0000D552 E936E6FFFF          <1> 	jmp	error
  5418                              <1> 
  5419                              <1> sysumount: ; / special dismount file system
  5420                              <1> 	; 24/10/2016 - TRDOS 386 (TRDOS v2.0)
  5421                              <1> 	; temporary !
  5422 0000D557 B80F000000          <1> 	mov	eax, ERR_DRV_NOT_RDY ; drive not ready !
  5423 0000D55C A3[80470100]        <1>         mov     [u.error], eax
  5424 0000D561 A3[1C470100]        <1>         mov     [u.r0], eax 
  5425 0000D566 E922E6FFFF          <1> 	jmp	error
  5426                              <1> 
  5427                              <1> ; Retro UNIX 386 v1 Kernel (v0.2) - SYS9.INC
  5428                              <1> ; Last Modification: 09/12/2015
  5429                              <1> 
  5430                              <1> syssleep:
  5431                              <1> 	; 29/06/2015 - (Retro UNIX 386 v1)
  5432                              <1> 	; 11/06/2014 - (Retro UNIX 8086 v1)
  5433                              <1> 	;
  5434                              <1> 	; Retro UNIX 8086 v1 feature only
  5435                              <1> 	; (INPUT -> none)
  5436                              <1> 	;
  5437 0000D56B 0FB61D[6B470100]    <1> 	movzx	ebx, byte [u.uno] ; process number
  5438 0000D572 8AA3[37440100]      <1> 	mov	ah, [ebx+p.ttyc-1] ; current/console tty
  5439 0000D578 E8E4100000          <1> 	call	sleep
  5440 0000D57D E92BE6FFFF          <1> 	jmp	sysret
  5441                              <1> 
  5442                              <1> _vp_clr:
  5443                              <1> 	; Reset/Clear Video Page
  5444                              <1> 	;
  5445                              <1> 	; 30/06/2015 - (Retro UNIX 386 v1)
  5446                              <1> 	; 21/05/2013 - 30/10/2013(Retro UNIX 8086 v1) (U0.ASM)
  5447                              <1> 	;
  5448                              <1> 	; Retro UNIX 8086 v1 feature only !
  5449                              <1> 	;
  5450                              <1> 	; INPUTS -> 
  5451                              <1> 	;   BH = video page number	 
  5452                              <1> 	;
  5453                              <1> 	; OUTPUT ->
  5454                              <1> 	;   none
  5455                              <1> 	; ((Modified registers: eAX, BH, eCX, eDX, eSI, eDI))
  5456                              <1> 	;
  5457                              <1> 	; 04/12/2013
  5458 0000D582 28C0                <1> 	sub	al, al
  5459                              <1> 	; al = 0 (clear video page)
  5460                              <1> 	; bh = video page ; 13/05/2016
  5461 0000D584 B407                <1> 	mov	ah, 07h
  5462                              <1> 	; ah = 7 (attribute/color)
  5463 0000D586 6631C9              <1> 	xor 	cx, cx ; 0, left upper column (cl) & row (cl)
  5464 0000D589 66BA4F18            <1> 	mov	dx, 184Fh ; right lower column & row (dl=24, dh=79)
  5465 0000D58D E8FE43FFFF          <1> 	call	_scroll_up
  5466                              <1> 	; bh = video page
  5467 0000D592 6631D2              <1> 	xor	dx, dx ; 0 (cursor position) 
  5468 0000D595 E93447FFFF          <1> 	jmp 	_set_cpos
  5469                              <1> 
  5470                              <1> sysmsg:
  5471                              <1> 	; 13/05/2016
  5472                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  5473                              <1> 	; 01/07/2015 - 11/11/2015 (Retro UNIX 386 v1)
  5474                              <1> 	; Print user-application message on user's console tty
  5475                              <1> 	;
  5476                              <1> 	; Input -> EBX = Message address
  5477                              <1> 	;	   ECX = Message length (max. 255)
  5478                              <1> 	;	   DL = Color (IBM PC Rombios color attributes)
  5479                              <1> 	;
  5480 0000D59A 81F9FF000000        <1> 	cmp	ecx, MAX_MSG_LEN ; 255
  5481 0000D5A0 0F8707E6FFFF        <1> 	ja	sysret ; nothing to do with big message size
  5482 0000D5A6 08C9                <1> 	or	cl, cl
  5483 0000D5A8 0F84FFE5FFFF        <1> 	jz	sysret
  5484 0000D5AE 20D2                <1> 	and	dl, dl
  5485 0000D5B0 7502                <1> 	jnz	short sysmsg0
  5486 0000D5B2 B207                <1> 	mov	dl, 07h ; default color
  5487                              <1> 		; (black background, light gray character) 
  5488                              <1> sysmsg0:
  5489 0000D5B4 891D[3C470100]      <1> 	mov	[u.base], ebx
  5490 0000D5BA 8815[0F310100]      <1> 	mov	[ccolor], dl ; color attributes
  5491 0000D5C0 89E5                <1> 	mov	ebp, esp
  5492 0000D5C2 31DB                <1> 	xor	ebx, ebx ; 0
  5493 0000D5C4 891D[44470100]      <1> 	mov	[u.nread], ebx ; 0
  5494                              <1> 	;
  5495 0000D5CA 381D[7E470100]      <1> 	cmp	[u.kcall], bl ; 0
  5496 0000D5D0 7769                <1> 	ja	short sysmsgk ; Temporary (01/07/2015)
  5497                              <1> 	;
  5498 0000D5D2 890D[40470100]      <1> 	mov	[u.count], ecx
  5499 0000D5D8 41                  <1> 	inc	ecx ; + 00h ; ASCIIZ
  5500 0000D5D9 29CC                <1> 	sub	esp, ecx
  5501 0000D5DB 89E7                <1> 	mov	edi, esp
  5502 0000D5DD 89E6                <1> 	mov	esi, esp
  5503 0000D5DF 66891D[7C470100]    <1> 	mov	[u.pcount], bx ; reset page (phy. addr.) counter
  5504                              <1> 	; 11/11/2015
  5505 0000D5E6 8A25[4C470100]      <1> 	mov 	ah, [u.ttyp] ; recent open tty
  5506                              <1> 	; 0 = none
  5507 0000D5EC FECC                <1> 	dec	ah
  5508 0000D5EE 790C                <1> 	jns	short sysmsg1 
  5509 0000D5F0 8A1D[6B470100]      <1> 	mov	bl, [u.uno] ; process number	
  5510 0000D5F6 8AA3[37440100]      <1> 	mov	ah, [ebx+p.ttyc-1] ; user's (process's) console tty
  5511                              <1> sysmsg1:
  5512 0000D5FC 8825[4E470100]      <1> 	mov	[u.ttyn], ah
  5513                              <1> sysmsg2:
  5514 0000D602 E813080000          <1> 	call	cpass
  5515 0000D607 7416                <1> 	jz	short sysmsg5
  5516 0000D609 AA                  <1> 	stosb
  5517 0000D60A 20C0                <1> 	and	al, al
  5518 0000D60C 75F4                <1> 	jnz	short sysmsg2
  5519                              <1> sysmsg3:
  5520 0000D60E 80FC07              <1> 	cmp	ah, 7 ; tty number
  5521 0000D611 7711                <1> 	ja	short sysmsg6 ; serial port
  5522 0000D613 E83E000000          <1> 	call	print_cmsg
  5523                              <1> sysmsg4:
  5524 0000D618 89EC                <1> 	mov	esp, ebp	
  5525 0000D61A E98EE5FFFF          <1> 	jmp	sysret
  5526                              <1> sysmsg5:
  5527 0000D61F C60700              <1> 	mov	byte [edi], 0
  5528 0000D622 EBEA                <1> 	jmp	short sysmsg3
  5529                              <1> sysmsg6:
  5530 0000D624 8A06                <1> 	mov	al, [esi]
  5531 0000D626 E82E100000          <1> 	call	sndc
  5532 0000D62B 72EB                <1> 	jc	short sysmsg4
  5533 0000D62D 803E00              <1> 	cmp	byte [esi], 0  ; 0 is stop character
  5534 0000D630 76E6                <1> 	jna	short sysmsg4
  5535 0000D632 46                  <1> 	inc 	esi
  5536 0000D633 8A25[4E470100]      <1> 	mov	ah, [u.ttyn]
  5537 0000D639 EBE9                <1> 	jmp	short sysmsg6
  5538                              <1> 
  5539                              <1> sysmsgk: ; Temporary (01/07/2015)
  5540                              <1> 	; The message has been sent by Kernel (ASCIIZ string)
  5541                              <1> 	; (ECX -character count- will not be considered)
  5542 0000D63B 8B35[3C470100]      <1> 	mov	esi, [u.base]
  5543 0000D641 8A25[0E310100]      <1> 	mov	ah, [ptty] ; present/current screen (video page)
  5544 0000D647 8825[4E470100]      <1> 	mov	[u.ttyn], ah
  5545 0000D64D C605[7E470100]00    <1> 	mov	byte [u.kcall], 0
  5546 0000D654 EBB8                <1> 	jmp	short sysmsg3
  5547                              <1> 	
  5548                              <1> print_cmsg: 
  5549                              <1> 	; 13/05/2016 - TRDOS 386 (TRDOS v2.0)
  5550                              <1> 	; 01/07/2015 (Retro UNIX 386 v1)
  5551                              <1> 	;
  5552                              <1> 	; print message (on user's console tty) 
  5553                              <1> 	;	with requested color
  5554                              <1> 	;
  5555                              <1> 	; INPUTS:
  5556                              <1> 	;	esi = message address
  5557                              <1> 	;	[u.ttyn] = tty number (0 to 7)
  5558                              <1> 	;	[ccolor] = color attributes (IBM PC BIOS colors)
  5559                              <1> 	
  5560 0000D656 8A3D[4E470100]      <1> 	mov	bh, [u.ttyn]
  5561                              <1> 	;mov	bh, ah
  5562                              <1> 
  5563 0000D65C AC                  <1> 	lodsb
  5564                              <1> pcmsg1:
  5565 0000D65D 56                  <1> 	push 	esi
  5566 0000D65E 8A1D[0F310100]      <1> 	mov	bl, [ccolor]
  5567                              <1> 	;mov	bh, [u.ttyn]
  5568 0000D664 E8CF45FFFF          <1> 	call 	_write_tty
  5569 0000D669 5E                  <1> 	pop	esi
  5570 0000D66A AC                  <1> 	lodsb
  5571 0000D66B 20C0                <1> 	and 	al, al  ; 0
  5572 0000D66D 75EE                <1> 	jnz 	short pcmsg1
  5573 0000D66F C3                  <1> 	retn
  5574                              <1> 
  5575                              <1> sysgeterr:
  5576                              <1> 	; 09/12/2015
  5577                              <1> 	; 21/09/2015 - (Retro UNIX 386 v1 feature only!)
  5578                              <1> 	; Get last error number or page fault count
  5579                              <1> 	; (for debugging)
  5580                              <1> 	;
  5581                              <1> 	; Input -> EBX = return type
  5582                              <1> 	;	   0 = last error code (which is in 'u.error')	
  5583                              <1> 	;	   FFFFFFFFh = page fault count for running process
  5584                              <1> 	;	   FFFFFFFEh = total page fault count
  5585                              <1> 	;	   1 .. FFFFFFFDh = undefined 
  5586                              <1> 	;
  5587                              <1> 	; Output -> EAX = last error number or page fault count
  5588                              <1> 	;	   (depending on EBX input)
  5589                              <1> 	; 	
  5590 0000D670 21DB                <1> 	and 	ebx, ebx
  5591 0000D672 750B                <1> 	jnz	short glerr_2
  5592                              <1> glerr_0:
  5593 0000D674 A1[80470100]        <1> 	mov	eax, [u.error]
  5594                              <1> glerr_1:
  5595 0000D679 A3[1C470100]        <1> 	mov	[u.r0], eax
  5596 0000D67E C3                  <1>  	retn
  5597                              <1> glerr_2:
  5598 0000D67F 43                  <1> 	inc	ebx ; FFFFFFFFh -> 0, FFFFFFFEh -> FFFFFFFFh
  5599 0000D680 74FD                <1> 	jz	short glerr_2 ; page fault count for process
  5600 0000D682 43                  <1> 	inc	ebx ; FFFFFFFFh -> 0	
  5601 0000D683 75EF                <1> 	jnz	short glerr_0
  5602 0000D685 A1[D4480100]        <1> 	mov	eax, [PF_Count] ; total page fault count
  5603 0000D68A EBED                <1>         jmp     short glerr_1
  5604                              <1> glerr_3:
  5605 0000D68C A1[84470100]        <1> 	mov 	eax, [u.pfcount]
  5606 0000D691 EBE6                <1> 	jmp	short glerr_1
  5607                              <1> 
  5608                              <1> load_and_run_file:
  5609                              <1> 	; 07/01/2017
  5610                              <1> 	; 04/01/2017
  5611                              <1> 	; 24/10/2016
  5612                              <1> 	; 24/04/2016, 02/05/2016, 03/05/2016, 06/05/2016
  5613                              <1> 	; 23/04/2016 (TRDOS 386 = TRDOS v2.0)
  5614                              <1> 	; 23/10/2015 (Retro UNIX 386 v1, 'sysexec')
  5615                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
  5616                              <1> 	; 03/06/2013 - 06/12/2013 (Retro UNIX 8086 v1)
  5617                              <1> 	; EAX = First Cluster number
  5618                              <1> 	; EDX = File Size
  5619                              <1> 	; ESI = Argument list address
  5620                              <1> 	; [argc] = argument count
  5621                              <1> 	; [u.nread] = argument list length
  5622                              <1> 	; [esp] = return address to the caller (*)
  5623                              <1> 	;
  5624 0000D693 8935[A0470100]      <1> 	mov	[argv], esi
  5625 0000D699 8915[A9470100]      <1> 	mov	[i.size], edx
  5626 0000D69F A3[A5470100]        <1> 	mov	[ii], eax
  5627                              <1> 
  5628                              <1> 	;; 07/01/2017
  5629                              <1> 	;sti
  5630                              <1> 	;mov	eax, [k_page_dir]
  5631                              <1> 	;mov	[u.pgdir], eax
  5632 0000D6A4 31C0                <1> 	xor 	eax, eax ; clc ; *** ; 04/01/2017
  5633                              <1> 	;mov	[u.r0], eax ; 0 ; 07/01/2017
  5634                              <1> 
  5635                              <1> 	; 06/05/2016
  5636                              <1> 	; Set 'sysexit' return order to MainProg
  5637                              <1> 	;
  5638 0000D6A6 58                  <1> 	pop	eax ; * 'loc_load_and_run_file_8:' address
  5639 0000D6A7 FA                  <1> 	cli ; 07/01/2017
  5640 0000D6A8 8B25[7C300100]      <1> 	mov	esp, [tss.esp0]
  5641                              <1> 	;
  5642                              <1> 	; 'loc_load_run_file_8' address has 
  5643                              <1> 	; 'jmp loc_file_rw_restore_retn' instruction
  5644                              <1> 	; 'loc_file_rw_restore_retn:' will return to
  5645                              <1> 	; [mainprog_return_addr] 
  5646                              <1> 	; just after 'call command_interpreter'
  5647                              <1> 	;
  5648 0000D6AE 68[4A5A0000]        <1> 	push	_end_of_mainprog ; we must not return to here !
  5649 0000D6B3 FF35[643E0100]      <1> 	push	dword [mainprog_return_addr]
  5650 0000D6B9 89E5                <1> 	mov	ebp, esp ; **
  5651                              <1> 	;	
  5652 0000D6BB 9C                  <1> 	pushfd  ; EFLAGS      ; IRETD ; ***
  5653 0000D6BC 6A08                <1> 	push	KCODE ; cs    ; IRETD
  5654 0000D6BE 50                  <1> 	push	eax ; * (eip) ; IRETD
  5655 0000D6BF 8925[14470100]      <1> 	mov	[u.sp], esp
  5656                              <1> 	;mov	byte [u.quant], time_count
  5657 0000D6C5 1E                  <1> 	push	ds
  5658 0000D6C6 06                  <1> 	push	es
  5659 0000D6C7 0FA0                <1> 	push	fs
  5660 0000D6C9 0FA8                <1> 	push	gs	
  5661                              <1> 	;mov	eax, [u.r0]
  5662 0000D6CB 29C0                <1> 	sub	eax, eax
  5663 0000D6CD 60                  <1> 	pushad
  5664 0000D6CE 68[ADBB0000]        <1> 	push	sysret
  5665                              <1> 	;push	sysrel1 ; 07/01/2017
  5666 0000D6D3 8925[18470100]      <1> 	mov	[u.usp], esp
  5667                              <1> 	;
  5668 0000D6D9 E85F060000          <1> 	call	wswap ; Save MainProg (process 1) 'u' structure
  5669                              <1> 		      ; and registers for return (from program)	
  5670 0000D6DE 89EC                <1> 	mov	esp, ebp ; **
  5671 0000D6E0 FB                  <1> 	sti ; 07/01/2017
  5672 0000D6E1 50                  <1> 	push	eax  ; * 'loc_load_and_run_file_8:' address
  5673                              <1> 	;
  5674                              <1> 	;;; 02/05/2016
  5675                              <1> 	;;; Create a new process (parent: MainProg)	
  5676 0000D6E2 31F6                <1> 	xor 	esi, esi
  5677                              <1> cnpm_1: ; search p.stat table for unused process number
  5678 0000D6E4 46                  <1> 	inc	esi
  5679 0000D6E5 80BE[67440100]00    <1> 	cmp	byte [esi+p.stat-1], 0 ; SFREE
  5680                              <1> 				; is process active, unused, dead
  5681 0000D6EC 760B                <1> 	jna	short cnpm_2	; it's unused so branch
  5682 0000D6EE 6683FE10            <1> 	cmp	si, nproc 	; all processes checked
  5683 0000D6F2 72F0                <1> 	jb	short cnpm_1    ; no, branch back
  5684 0000D6F4 E9C783FFFF          <1> 	jmp	panic 
  5685                              <1> cnpm_2:
  5686 0000D6F9 A1[70470100]        <1> 	mov	eax, [u.pgdir] ; page directory of MainProg
  5687 0000D6FE A3[74470100]        <1> 	mov	[u.ppgdir], eax ; parent's page directory
  5688 0000D703 E8F773FFFF          <1> 	call	allocate_page
  5689 0000D708 0F82B283FFFF        <1> 	jc	panic
  5690                              <1> 	; EAX = UPAGE (user structure page) address
  5691 0000D70E A3[6C470100]        <1> 	mov	[u.upage], eax ; memory page for 'user' struct (child)
  5692 0000D713 89F7                <1> 	mov	edi, esi
  5693 0000D715 66C1E702            <1> 	shl	di, 2
  5694 0000D719 8987[74440100]      <1> 	mov	[edi+p.upage-4], eax ; memory page for 'user' struct
  5695 0000D71F E85574FFFF          <1> 	call	clear_page ; 03/05/2016
  5696                              <1> 	;movzx	eax, byte [p.ttyc] ; console tty (for MainProg)
  5697 0000D724 6629C0              <1> 	sub	ax, ax ; 0
  5698 0000D727 668986[37440100]    <1> 	mov     [esi+p.ttyc-1], ax ; al - set child's console tty
  5699                              <1> 				   ; ah - reset child's wait channel	
  5700 0000D72E 89F0                <1> 	mov	eax, esi
  5701 0000D730 A2[6B470100]        <1> 	mov	[u.uno], al ; child process number
  5702 0000D735 FE86[67440100]      <1>         inc     byte [esi+p.stat-1] ; 1, SRUN
  5703 0000D73B 66D1E6              <1> 	shl	si, 1 ; multiply si by 2 to get index into p.pid table
  5704 0000D73E 66FF05[06470100]    <1> 	inc	word [mpid] ; increment m.pid; get a new process name
  5705 0000D745 66A1[06470100]      <1> 	mov	ax, [mpid]
  5706 0000D74B 668986[D6430100]    <1> 	mov	[esi+p.pid-2], ax ; put new process name 
  5707                              <1> 				  ; in child process' name slot
  5708                              <1> 	;mov	ax, [p.pid]  ; get process name of MainProg
  5709 0000D752 66B80100            <1> 	mov	ax, 1
  5710 0000D756 668986[F6430100]    <1> 	mov	[esi+p.ppid-2], ax ; put parent process name 
  5711                              <1> 			           ; in parent process slot for child
  5712 0000D75D 6648                <1> 	dec	ax ; 0
  5713 0000D75F 66A3[4C470100]      <1> 	mov 	[u.ttyp], ax ; 0
  5714                              <1> 	;;;
  5715 0000D765 A1[A5470100]        <1> 	mov 	eax,  [ii]
  5716                              <1> 	; Retro UNIX 386 v1, 'sysexec' (u2.s)
  5717 0000D76A E8E40E0000          <1> 	call	iopen
  5718                              <1> 	; 06/06/2016
  5719 0000D76F C605[61470100]01    <1> 	mov	byte [u.pri], 1 ; normal priority
  5720                              <1> 	;
  5721 0000D776 EB0A                <1> 	jmp	short sysexec_7 ; 02/05/2016
  5722                              <1> 
  5723                              <1> sysexec_6:
  5724                              <1> 	; 04/01/2017
  5725                              <1> 	; 24/10/2016
  5726                              <1> 	;;02/05/2016
  5727                              <1> 	; 23/04/2016
  5728                              <1> 	; 18/10/2015 ('sysexec_6')
  5729                              <1> 	; 23/06/2015
  5730 0000D778 A1[70470100]        <1> 	mov	eax, [u.pgdir] ; physical address of page directory
  5731                              <1> 	;;cmp 	eax, [k_page_dir] ; TRDOS MainProg ? 
  5732                              <1> 	;;je	short sysexec_7
  5733 0000D77D E8B674FFFF          <1> 	call	deallocate_page_dir
  5734                              <1> sysexec_7:
  5735 0000D782 E8E673FFFF          <1> 	call	make_page_dir
  5736 0000D787 0F823383FFFF        <1> 	jc	panic  ; allocation error 
  5737                              <1> 		       ; after a deallocation would be nonsence !?
  5738                              <1> 	; 24/07/2015
  5739                              <1> 	; map kernel pages (1st 4MB) to PDE 0
  5740                              <1> 	;     of the user's page directory
  5741                              <1> 	;     (It is needed for interrupts!)
  5742                              <1> 	; 18/10/2015
  5743 0000D78D 8B15[E0300100]      <1> 	mov	edx, [k_page_dir] ; Kernel's page directory
  5744 0000D793 8B02                <1> 	mov	eax, [edx] ; physical address of
  5745                              <1> 			   ; kernel's first page table (1st 4 MB)
  5746                              <1> 			   ; (PDE 0 of kernel's page directory)
  5747 0000D795 8B15[70470100]      <1> 	mov 	edx, [u.pgdir]
  5748 0000D79B 8902                <1> 	mov	[edx], eax ; PDE 0 (1st 4MB)
  5749                              <1> 	;
  5750                              <1> 	; 20/07/2015
  5751 0000D79D BB00004000          <1> 	mov	ebx, CORE ; start address = 0 (virtual) + CORE
  5752                              <1> 	; 18/10/2015
  5753 0000D7A2 BE[90470100]        <1> 	mov	esi, pcore ; physical start address
  5754                              <1> sysexec_8:	
  5755 0000D7A7 B907000000          <1> 	mov	ecx, PDE_A_USER + PDE_A_WRITE + PDE_A_PRESENT
  5756 0000D7AC E8DA73FFFF          <1> 	call	make_page_table
  5757 0000D7B1 0F820983FFFF        <1> 	jc	panic
  5758                              <1> 	;mov	ecx, PTE_A_USER + PTE_A_WRITE + PTE_A_PRESENT
  5759 0000D7B7 E8DD73FFFF          <1> 	call	make_page ; make new page, clear and set the pte 
  5760 0000D7BC 0F82FE82FFFF        <1> 	jc	panic
  5761                              <1> 	;
  5762 0000D7C2 8906                <1> 	mov	[esi], eax ; 24/06/2015
  5763                              <1> 	; ebx = virtual address (24/07/2015)
  5764 0000D7C4 E87879FFFF          <1> 	call 	add_to_swap_queue
  5765                              <1> 	; 18/10/2015
  5766 0000D7C9 81FE[94470100]      <1> 	cmp	esi, ecore ; user's stack (last) page ?
  5767 0000D7CF 740C                <1> 	je	short sysexec_9 ; yes
  5768 0000D7D1 BE[94470100]        <1> 	mov	esi, ecore  ; physical address of the last page 
  5769                              <1> 	; 20/07/2015
  5770 0000D7D6 BB00F0FFFF          <1> 	mov	ebx, (ECORE - PAGE_SIZE) + CORE
  5771                              <1> 	; ebx = virtual end address + segment base address - 4K
  5772 0000D7DB EBCA                <1>         jmp     short sysexec_8
  5773                              <1> sysexec_9:
  5774                              <1> 	; 24/04/2016
  5775                              <1> 	; 18/10/2015
  5776                              <1> 	; 26/08/2015
  5777                              <1> 	; 25/06/2015
  5778                              <1> 	; move arguments from kernel stack to [ecore]
  5779                              <1> 	; (argument list/line will be copied from kernel stack
  5780                              <1> 	; frame to the last (stack) page of user's core memory)
  5781                              <1> 	; 18/10/2015
  5782 0000D7DD 8B3D[94470100]      <1> 	mov	edi, [ecore]
  5783 0000D7E3 81C700100000        <1> 	add	edi, PAGE_SIZE
  5784 0000D7E9 0FB705[9E470100]    <1> 	movzx	eax, word [argc]
  5785 0000D7F0 09C0                <1> 	or	eax, eax
  5786 0000D7F2 7509                <1> 	jnz	short sysexec_10
  5787 0000D7F4 89FB                <1> 	mov 	ebx, edi
  5788 0000D7F6 83EB04              <1> 	sub	ebx, 4 
  5789 0000D7F9 8903                <1> 	mov	[ebx], eax ; 0
  5790 0000D7FB EB44                <1> 	jmp 	short sysexec_13
  5791                              <1> sysexec_10:
  5792 0000D7FD 8B0D[44470100]      <1> 	mov	ecx, [u.nread]
  5793                              <1> 	;mov	esi, TextBuffer
  5794 0000D803 8B35[A0470100]      <1> 	mov	esi, [argv] ; 24/04/2016 (TRDOS 386  = TRDOS v2.0)
  5795 0000D809 29CF                <1> 	sub	edi, ecx ; page end address - argument list length
  5796 0000D80B 89C2                <1> 	mov	edx, eax
  5797 0000D80D FEC2                <1> 	inc	dl ; argument count + 1 for argc value  
  5798 0000D80F C0E202              <1> 	shl 	dl, 2  ; 4 * (argument count + 1)
  5799 0000D812 89FB                <1> 	mov	ebx, edi
  5800 0000D814 80E3FC              <1> 	and	bl, 0FCh ; 32 bit (dword) alignment
  5801 0000D817 29D3                <1> 	sub 	ebx, edx
  5802 0000D819 89FA                <1> 	mov	edx, edi
  5803 0000D81B F3A4                <1> 	rep	movsb
  5804 0000D81D 89D6                <1> 	mov 	esi, edx
  5805 0000D81F 89DF                <1> 	mov 	edi, ebx
  5806 0000D821 BA00F0BFFF          <1> 	mov	edx, ECORE - PAGE_SIZE ; virtual addr. of the last page
  5807 0000D826 2B15[94470100]      <1> 	sub 	edx, [ecore] ; difference (virtual - physical) 
  5808 0000D82C AB                  <1> 	stosd	; eax = argument count	
  5809                              <1> sysexec_11:
  5810 0000D82D 89F0                <1> 	mov	eax, esi
  5811 0000D82F 01D0                <1> 	add	eax, edx
  5812 0000D831 AB                  <1> 	stosd  ; eax = virtual address
  5813 0000D832 FE0D[9E470100]      <1> 	dec	byte [argc]
  5814 0000D838 7407                <1> 	jz	short sysexec_13
  5815                              <1> sysexec_12:
  5816 0000D83A AC                  <1> 	lodsb
  5817 0000D83B 20C0                <1> 	and	al, al
  5818 0000D83D 75FB                <1> 	jnz	short sysexec_12
  5819 0000D83F EBEC                <1> 	jmp	short sysexec_11
  5820                              <1> sysexec_13:
  5821                              <1> 	; 24/10/2016
  5822                              <1> 	; 24/04/2016 - TRDOS 386 (TRDOS v2.0)
  5823                              <1> 	; 23/06/2015 - 19/10/2015 (Retro UNIX 386 v1, 'sysexec_13')
  5824                              <1> 	;
  5825                              <1> 	; moving arguments to [ecore] is OK here..
  5826                              <1> 	;
  5827                              <1> 	; ebx = beginning addres of argument list pointers
  5828                              <1> 		;	in user's stack
  5829 0000D841 2B1D[94470100]      <1> 	sub 	ebx, [ecore]
  5830 0000D847 81C300F0BFFF        <1> 	add     ebx, (ECORE - PAGE_SIZE)
  5831                              <1> 			; end of core - 4096 (last page)
  5832                              <1> 			; (virtual address)
  5833 0000D84D 891D[A0470100]      <1> 	mov	[argv], ebx
  5834 0000D853 891D[48470100]      <1> 	mov	[u.break], ebx ; available user memory
  5835                              <1> 	;
  5836 0000D859 29C0                <1> 	sub	eax, eax
  5837 0000D85B C705[40470100]2000- <1> 	mov	dword [u.count], 32 ; Executable file header size
  5837 0000D863 0000                <1>
  5838 0000D865 C705[2C470100]-     <1> 	mov	dword [u.fofp], u.off
  5838 0000D86B [38470100]          <1>
  5839 0000D86F A3[38470100]        <1> 	mov	[u.off], eax ; 0
  5840 0000D874 A3[3C470100]        <1> 	mov	[u.base], eax ; 0, start of user's core (virtual)
  5841                              <1> 	; 24/10/2016
  5842 0000D879 A0[A6310100]        <1> 	mov	al, [Current_Drv]
  5843 0000D87E A2[FE460100]        <1> 	mov	[cdev], al
  5844                              <1> 	;
  5845 0000D883 A1[A5470100]        <1> 	mov	eax, [ii] ; Fist Cluster of the Program (PRG) file
  5846                              <1> 	; EAX = First cluster of the executable file
  5847 0000D888 E832010000          <1> 	call	readi
  5848                              <1> 
  5849 0000D88D 8B0D[48470100]      <1> 	mov	ecx, [u.break] ; top of user's stack (physical addr.)
  5850 0000D893 890D[40470100]      <1> 	mov	[u.count], ecx ; save for overrun check
  5851                              <1> 	;
  5852 0000D899 8B0D[44470100]      <1> 	mov	ecx, [u.nread]
  5853 0000D89F 890D[48470100]      <1> 	mov	[u.break], ecx ; virtual address (offset from start)
  5854 0000D8A5 80F920              <1> 	cmp	cl, 32
  5855 0000D8A8 7540                <1>         jne     short sysexec_15
  5856                              <1> 	;:
  5857                              <1> 	; Retro UNIX 386 v1 (32 bit) executable file header format
  5858 0000D8AA 8B35[90470100]      <1> 	mov	esi, [pcore] ; start address of user's core memory 
  5859                              <1> 		             ; (phys. start addr. of the exec. file)
  5860 0000D8B0 AD                  <1> 	lodsd
  5861 0000D8B1 663DEB1E            <1> 	cmp	ax, 1EEBh ; EBH, 1Eh -> jump to +32
  5862 0000D8B5 7533                <1> 	jne	short sysexec_15
  5863 0000D8B7 AD                  <1> 	lodsd
  5864 0000D8B8 89C1                <1> 	mov	ecx, eax ; text (code) section size
  5865 0000D8BA AD                  <1> 	lodsd
  5866 0000D8BB 01C1                <1> 	add	ecx, eax ; + data section size (initialized data)
  5867 0000D8BD 89CB                <1> 	mov	ebx, ecx
  5868 0000D8BF AD                  <1> 	lodsd	
  5869 0000D8C0 01C3                <1> 	add	ebx, eax ; + bss section size (for overrun checking)
  5870 0000D8C2 3B1D[40470100]      <1> 	cmp	ebx, [u.count]
  5871 0000D8C8 7711                <1> 	ja	short sysexec_14  ; program overruns stack !
  5872                              <1> 	;
  5873                              <1> 	; add bss section size to [u.break]
  5874 0000D8CA 0105[48470100]      <1> 	add 	[u.break], eax
  5875                              <1> 	;
  5876 0000D8D0 83E920              <1> 	sub	ecx, 32  ; header size (already loaded)
  5877                              <1> 	;cmp	ecx, [u.count]
  5878                              <1> 	;jnb	short sysexec_16
  5879 0000D8D3 890D[40470100]      <1> 	mov	[u.count], ecx ; required read count
  5880 0000D8D9 EB29                <1> 	jmp	short sysexec_16
  5881                              <1> sysexec_14:
  5882                              <1> 	; insufficient (out of) memory
  5883 0000D8DB C705[80470100]0400- <1> 	mov	dword [u.error], ERR_MINOR_IM ; 1
  5883 0000D8E3 0000                <1>
  5884 0000D8E5 E9A3E2FFFF          <1> 	jmp	error
  5885                              <1> sysexec_15:
  5886 0000D8EA 8B15[A9470100]      <1>         mov	edx, [i.size] ; file size
  5887 0000D8F0 29CA                <1> 	sub	edx, ecx ; file size - loaded bytes
  5888 0000D8F2 7626                <1> 	jna	short sysexec_17 ; no need to next read
  5889 0000D8F4 01D1                <1> 	add	ecx, edx ; [i.size]
  5890 0000D8F6 3B0D[40470100]      <1> 	cmp	ecx, [u.count] ; overrun check (!)
  5891 0000D8FC 77DD                <1> 	ja	short sysexec_14
  5892 0000D8FE 8915[40470100]      <1> 	mov	[u.count], edx
  5893                              <1> sysexec_16:
  5894 0000D904 A1[A5470100]        <1> 	mov	eax, [ii] ; first cluster
  5895 0000D909 E8B1000000          <1> 	call	readi
  5896 0000D90E 8B0D[44470100]      <1> 	mov	ecx, [u.nread]
  5897 0000D914 010D[48470100]      <1> 	add	[u.break], ecx
  5898                              <1> sysexec_17:
  5899 0000D91A A1[A5470100]        <1> 	mov	eax, [ii] ; first cluster
  5900 0000D91F E8300D0000          <1> 	call	iclose
  5901 0000D924 31C0                <1> 	xor     eax, eax
  5902 0000D926 FEC0                <1> 	inc	al
  5903 0000D928 66A3[62470100]      <1> 	mov	[u.intr], ax ; 1 (interrupt/time-out is enabled)
  5904 0000D92E 66A3[64470100]      <1> 	mov	[u.quit], ax ; 1 ('crtl+brk' signal is enabled) 
  5905 0000D934 833D[74470100]00    <1>         cmp	dword [u.ppgdir], 0  ; is the caller MainProg (kernel) ?
  5906 0000D93B 770C                <1> 	ja	short sysexec_18 ; no, the caller is user process
  5907                              <1> 	; If the caller is kernel (MainProg), 'sysexec' will come here
  5908 0000D93D 8B15[E0300100]      <1> 	mov	edx, [k_page_dir] ; kernel's page directory
  5909 0000D943 8915[74470100]      <1> 	mov	[u.ppgdir], edx ; next time 'sysexec' must not come here 
  5910                              <1> sysexec_18:
  5911                              <1> 	; 02/05/2016
  5912                              <1> 	; 24/04/2016 (TRDOS 386 = TRDOS v2.0)
  5913                              <1> 	; 18/10/2015 (Retro UNIX 386 v1)
  5914                              <1> 	; 05/08/2015
  5915                              <1> 	; 29/07/2015
  5916 0000D949 8B2D[A0470100]      <1> 	mov	ebp, [argv] ; user's stack pointer must point to argument
  5917                              <1> 			    ; list pointers (argument count)
  5918 0000D94F FA                  <1> 	cli
  5919 0000D950 8B25[7C300100]      <1>         mov     esp, [tss.esp0]  ; ring 0 (kernel) stack pointer
  5920                              <1> 	;mov   	esp, [u.sp] ; Restore Kernel stack
  5921                              <1> 			    ; for this process	 
  5922                              <1> 	;add	esp, 20 ; --> EIP, CS, EFLAGS, ESP, SS
  5923                              <1> 	;xor	eax, eax ; 0
  5924 0000D956 FEC8                <1> 	dec	al ; eax = 0
  5925 0000D958 66BA2300            <1> 	mov	dx, UDATA
  5926 0000D95C 6652                <1> 	push	dx  ; user's stack segment
  5927 0000D95E 55                  <1> 	push	ebp ; user's stack pointer
  5928                              <1> 		    ; (points to number of arguments)
  5929                              <1> 	
  5930                              <1> 	; 04/01/2017
  5931                              <1> 	; MainProg comes here while [sysflg]= 0FFh
  5932                              <1> 	; (but sysexec comes here while [sysflg]= 0)
  5933 0000D95F C605[13470100]00    <1> 	mov	byte [sysflg], 0 ; 04/01/2017
  5934                              <1> 				 ; (timer_int sysflg control)
  5935 0000D966 FB                  <1> 	sti
  5936 0000D967 9C                  <1> 	pushfd	; EFLAGS
  5937                              <1> 		; Set IF for enabling interrupts in user mode	
  5938                              <1> 	;or	dword [esp], 200h 
  5939                              <1> 	;
  5940                              <1> 	;mov	bx, UCODE
  5941                              <1> 	;push	bx ; user's code segment
  5942 0000D968 6A1B                <1> 	push	UCODE
  5943                              <1> 	;push	0
  5944 0000D96A 50                  <1> 	push	eax ; EIP (=0) - start address -	
  5945 0000D96B 8925[14470100]      <1> 	mov	[u.sp], esp ; 29/07/2015
  5946                              <1> 	; 05/08/2015
  5947                              <1> 	; Remedy of a General Protection Fault during 'iretd' is here !
  5948                              <1> 	; ('push dx' would cause to general protection fault, 
  5949                              <1> 	; after 'pop ds' etc.)
  5950                              <1> 	;
  5951                              <1> 	;; push dx ; ds (UDATA)
  5952                              <1> 	;; push dx ; es (UDATA)
  5953                              <1> 	;; push dx ; fs (UDATA)
  5954                              <1> 	;; push dx ; gs (UDATA)
  5955                              <1> 	;
  5956                              <1> 	; This is a trick to prevent general protection fault
  5957                              <1> 	; during 'iretd' intruction at the end of 'sysrele' (in u1.s):
  5958 0000D971 8EC2                <1> 	mov 	es, dx ; UDATA
  5959 0000D973 06                  <1> 	push 	es ; ds (UDATA)
  5960 0000D974 06                  <1> 	push 	es ; es (UDATA)
  5961 0000D975 06                  <1> 	push 	es ; fs (UDATA)
  5962 0000D976 06                  <1> 	push	es ; gs (UDATA)
  5963 0000D977 66BA1000            <1> 	mov	dx, KDATA
  5964 0000D97B 8EC2                <1> 	mov	es, dx
  5965                              <1> 	;
  5966                              <1> 	;; pushad simulation
  5967 0000D97D 89E5                <1> 	mov	ebp, esp ; esp before pushad
  5968 0000D97F 50                  <1> 	push	eax ; eax (0)
  5969 0000D980 50                  <1> 	push	eax ; ecx (0)
  5970 0000D981 50                  <1> 	push	eax ; edx (0)
  5971 0000D982 50                  <1> 	push	eax ; ebx (0)
  5972 0000D983 55                  <1> 	push	ebp ; esp before pushad
  5973 0000D984 50                  <1> 	push	eax ; ebp (0)
  5974 0000D985 50                  <1> 	push	eax ; esi (0)		
  5975 0000D986 50                  <1> 	push	eax ; edi (0)	
  5976                              <1> 	;
  5977 0000D987 A3[1C470100]        <1> 	mov	[u.r0], eax ; eax = 0
  5978 0000D98C 8925[18470100]      <1> 	mov	[u.usp], esp
  5979                              <1> 
  5980                              <1> 	; 02/05/2016
  5981                              <1> 	;inc	byte [sysflg] ; 0FFh -> 0
  5982                              <1> 	;mov	byte [sysflg], 0 ; 04/01/2017
  5983 0000D992 0FB61D[6B470100]    <1> 	movzx	ebx, byte [u.uno]	
  5984 0000D999 6683BB[F6430100]01  <1> 	cmp	word [ebx+p.ppid-2], 1 ; MainProg
  5985 0000D9A1 0F8709E2FFFF        <1> 	ja	sysret0 ; 03/05/2016
  5986 0000D9A7 68[ADBB0000]        <1> 	push	sysret ; * 
  5987 0000D9AC 8925[18470100]      <1> 	mov	[u.usp], esp
  5988 0000D9B2 E886030000          <1> 	call	wswap ; save child process 'u' structure and
  5989                              <1> 		      ; registers
  5990 0000D9B7 8305[18470100]04    <1> 	add	dword [u.usp], 4 ; 03/05/2016 
  5991                              <1> sysexec_19: ; 02/05/2016
  5992 0000D9BE C3                  <1> 	retn ; * 'sysret' ; byte [sysflg] -> 0FFh
  5993                              <1> 
  5994                              <1> readi:
  5995                              <1> 	; 01/05/2016
  5996                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
  5997                              <1> 	; 20/05/2015 - Retro UNIX 386 v1
  5998                              <1> 	; 11/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
  5999                              <1> 	;
  6000                              <1> 	; Reads from a file whose the first cluster number in EAX
  6001                              <1> 	; 
  6002                              <1> 	; INPUTS ->
  6003                              <1> 	;    EAX - First cluster number of the file
  6004                              <1> 	;    u.count - byte count user desires
  6005                              <1> 	;    u.base - points to user buffer
  6006                              <1> 	;    u.fofp - points to dword with current file offset
  6007                              <1> 	;    i.size - file size
  6008                              <1> 	;    cdev - logical dos drive number of the file
  6009                              <1> 	; OUTPUTS ->
  6010                              <1> 	;    u.count - cleared
  6011                              <1> 	;    u.nread - accumulates total bytes passed back
  6012                              <1> 	;
  6013                              <1> 	; ((EAX)) input/output
  6014                              <1> 	; (Retro UNIX Prototype : 14/12/2012 - 01/03/2013, UNIXCOPY.ASM)
  6015                              <1>         ; ((Modified registers: edx, ebx, ecx, esi, edi))  
  6016                              <1> 
  6017 0000D9BF 31D2                <1> 	xor	edx, edx ; 0
  6018 0000D9C1 8915[44470100]      <1> 	mov 	[u.nread], edx ; 0
  6019 0000D9C7 668915[7C470100]    <1> 	mov	[u.pcount], dx ; 19/05/2015
  6020 0000D9CE 3915[40470100]      <1> 	cmp 	[u.count], edx ; 0
  6021 0000D9D4 7701                <1> 	ja 	short readi_1
  6022 0000D9D6 C3                  <1> 	retn
  6023                              <1> readi_1:
  6024                              <1> dskr:
  6025                              <1> 	; 01/05/2016
  6026                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
  6027                              <1> 	; 24/05/2015 - 12/10/2015 (Retro UNIX 386 v1)
  6028                              <1> 	; 26/04/2013 - 03/08/2013 (Retro UNIX 8086 v1)
  6029                              <1> dskr_0:
  6030 0000D9D7 8B15[A9470100]      <1>         mov	edx, [i.size]
  6031 0000D9DD 8B1D[2C470100]      <1> 	mov	ebx, [u.fofp]
  6032 0000D9E3 2B13                <1> 	sub	edx, [ebx]
  6033 0000D9E5 7647                <1> 	jna	short dskr_4
  6034                              <1> 	;
  6035 0000D9E7 50                  <1> 	push	eax ; 01/05/2016
  6036 0000D9E8 3B15[40470100]      <1> 	cmp     edx, [u.count] 
  6037 0000D9EE 7306                <1> 	jnb	short dskr_1
  6038 0000D9F0 8915[40470100]      <1> 	mov	[u.count], edx
  6039                              <1> dskr_1:
  6040                              <1> 	; EAX = First Cluster
  6041                              <1> 	; [Current_Drv] = Physical drive number 
  6042 0000D9F6 E83B000000          <1> 	call	mget_r
  6043                              <1> 	; NOTE: in 'mget_r', relevant sector will be read in buffer
  6044                              <1> 	; if it is not already in buffer !
  6045 0000D9FB BB[E0480100]        <1> 	mov	ebx, readi_buffer
  6046 0000DA00 803D[7E470100]00    <1> 	cmp	byte [u.kcall], 0 ; the caller is 'namei' sign (=1)
  6047 0000DA07 770F                <1> 	ja	short dskr_3	  ; zf=0 -> the caller is 'namei'
  6048 0000DA09 66833D[7C470100]00  <1> 	cmp	word [u.pcount], 0
  6049 0000DA11 7705                <1> 	ja	short dskr_3
  6050                              <1> dskr_2:
  6051                              <1> 	; [u.base] = virtual address to transfer (as destination address)
  6052 0000DA13 E894010000          <1> 	call	trans_addr_w ; translate virtual address to physical (w)
  6053                              <1> dskr_3:
  6054                              <1> 	; EBX (r5) = system (I/O) buffer address -physical-
  6055 0000DA18 E8F7010000          <1> 	call	sioreg
  6056 0000DA1D 87F7                <1> 	xchg	esi, edi
  6057                              <1> 	; EDI = file (user data) offset
  6058                              <1> 	; ESI = sector (I/O) buffer offset
  6059                              <1> 	; ECX = byte count
  6060 0000DA1F F3A4                <1> 	rep	movsb
  6061                              <1> 	; eax = remain bytes in buffer
  6062                              <1>         ;       (check if remain bytes in the buffer > [u.pcount])
  6063 0000DA21 09C0                <1> 	or	eax, eax
  6064 0000DA23 75EE                <1> 	jnz	short dskr_2 ; (page end before system buffer end!)		
  6065 0000DA25 58                  <1> 	pop	eax  ; (first cluster number)
  6066 0000DA26 390D[40470100]      <1> 	cmp	[u.count], ecx ; 0
  6067 0000DA2C 77A9                <1> 	ja	short dskr_0
  6068                              <1> dskr_4:
  6069 0000DA2E C605[7E470100]00    <1> 	mov	byte [u.kcall], 0
  6070 0000DA35 C3                  <1> 	retn
  6071                              <1> 
  6072                              <1> mget_r:
  6073                              <1> 	; 24/10/2016
  6074                              <1> 	; 22/10/2016
  6075                              <1> 	; 12/10/2016
  6076                              <1> 	; 29/04/2016
  6077                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
  6078                              <1> 	; 03/06/2015 (Retro UNIX 386 v1, 'mget', u.5s)
  6079                              <1> 	; 22/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
  6080                              <1> 	;
  6081                              <1> 	; Get existing or (allocate) a new disk block for file
  6082                              <1> 	; 
  6083                              <1> 	; INPUTS ->
  6084                              <1> 	;    [u.fofp] = file offset pointer
  6085                              <1> 	;    EAX = First Cluster
  6086                              <1> 	;    [cdev] = Logical dos drive number 	  
  6087                              <1> 	;    ([u.off] = file offset)
  6088                              <1> 	; OUTPUTS ->
  6089                              <1> 	;    EAX = logical sector number
  6090                              <1> 	;    ESI = Logical Dos Drive Description Table address	
  6091                              <1> 	;
  6092                              <1> 	; Modified registers: EDX, EBX, ECX, ESI, EDI
  6093                              <1> 
  6094 0000DA36 8B35[2C470100]      <1> 	mov     esi, [u.fofp]
  6095 0000DA3C 8B1E                <1> 	mov	ebx, [esi] ; (u.off)
  6096                              <1> 
  6097 0000DA3E 29C9                <1> 	sub	ecx, ecx
  6098 0000DA40 8A2D[FE460100]      <1> 	mov	ch, [cdev]
  6099                              <1> 
  6100 0000DA46 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  6101 0000DA4B 01CE                <1> 	add	esi, ecx
  6102                              <1> 
  6103 0000DA4D 380D[183E0100]      <1> 	cmp	[readi.valid], cl ; 0
  6104 0000DA53 7649                <1> 	jna	short mget_r_0
  6105                              <1> 	
  6106 0000DA55 3A2D[193E0100]      <1> 	cmp	ch, [readi.drv]
  6107 0000DA5B 7541                <1> 	jne	short mget_r_0
  6108                              <1> 
  6109 0000DA5D 3B05[2C3E0100]      <1> 	cmp	eax, [readi.fclust]
  6110 0000DA63 7565                <1> 	jne	short mget_r_3
  6111                              <1> 	
  6112 0000DA65 89D8                <1> 	mov	eax, ebx ; file offset
  6113 0000DA67 668B0D[203E0100]    <1> 	mov	cx, [readi.bpc]
  6114 0000DA6E 41                  <1> 	inc	ecx ; <= 65536
  6115 0000DA6F 29D2                <1> 	sub	edx, edx
  6116 0000DA71 F7F1                <1> 	div	ecx
  6117                              <1> 
  6118 0000DA73 8B3D[283E0100]      <1> 	mov	edi, [readi.c_index] ; cluster index
  6119                              <1> 
  6120 0000DA79 39F8                <1> 	cmp	eax, edi
  6121 0000DA7B 757A                <1>         jne     short mget_r_4  ; (*)
  6122                              <1> 
  6123                              <1> 	; edx = byte offset in cluster (<= 65535)
  6124 0000DA7D 668915[223E0100]    <1> 	mov	[readi.offset], dx
  6125 0000DA84 66C1EA09            <1> 	shr	dx, 9 ; / 512
  6126 0000DA88 8815[1B3E0100]      <1> 	mov	[readi.s_index], dl ; sector index in cluster (0 to spc -1)
  6127                              <1> 	
  6128 0000DA8E A1[243E0100]        <1> 	mov	eax, [readi.cluster]  ; > 0 if [readi.valid] = 1
  6129 0000DA93 8B15[303E0100]      <1> 	mov	edx, [readi.fs_index]
  6130 0000DA99 E99A000000          <1>         jmp     mget_r_7
  6131                              <1> 	
  6132                              <1> mget_r_0:
  6133 0000DA9E 882D[193E0100]      <1> 	mov	[readi.drv], ch ; physical drive number
  6134 0000DAA4 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  6135 0000DAA8 7707                <1> 	ja	short mget_r_1
  6136 0000DAAA 8A4E12              <1> 	mov	cl, [esi+LD_FS_BytesPerSec+1]
  6137 0000DAAD D0E9                <1> 	shr	cl, 1 ;  ; 1 for 512 bytes, 4 for 2048 bytes
  6138 0000DAAF EB03                <1> 	jmp	short mget_r_2	
  6139                              <1> mget_r_1:
  6140 0000DAB1 8A4E13              <1> 	mov	cl, [esi+LD_BPB+BPB_SecPerClust]
  6141                              <1> mget_r_2:
  6142 0000DAB4 880D[1A3E0100]      <1> 	mov	[readi.spc], cl  ; sectors per cluster
  6143                              <1> 	; NOTE: readi bytes per sector value is always 512 ! 
  6144 0000DABA 66C1E109            <1> 	shl	cx, 9 ; * 512
  6145 0000DABE 6649                <1> 	dec	cx ; bytes per cluster - 1
  6146 0000DAC0 66890D[203E0100]    <1> 	mov	[readi.bpc], cx
  6147 0000DAC7 6629C9              <1> 	sub	cx, cx
  6148                              <1> mget_r_3:
  6149 0000DACA A3[2C3E0100]        <1> 	mov	[readi.fclust], eax ; first cluster (or FDT address)
  6150 0000DACF 880D[183E0100]      <1> 	mov	[readi.valid], cl ; 0 
  6151                              <1> 	;mov	[readi.s_index], cl ; 0
  6152                              <1> 	;mov	[readi.offset], cx ; 0
  6153 0000DAD5 890D[283E0100]      <1> 	mov	[readi.c_index], ecx ; 0
  6154 0000DADB 890D[243E0100]      <1> 	mov	[readi.cluster], ecx ; 0
  6155 0000DAE1 890D[1C3E0100]      <1> 	mov	[readi.sector], ecx ; 0
  6156                              <1> 	
  6157 0000DAE7 89D8                <1> 	mov	eax, ebx ; file offset
  6158 0000DAE9 668B0D[203E0100]    <1> 	mov	cx, [readi.bpc]
  6159 0000DAF0 41                  <1> 	inc	ecx ; <= 65536
  6160 0000DAF1 29D2                <1> 	sub	edx, edx
  6161 0000DAF3 F7F1                <1> 	div	ecx
  6162                              <1> 	;mov	edi, [readi.c_index] ; previous cluster index
  6163 0000DAF5 29FF                <1> 	sub	edi, edi
  6164                              <1> mget_r_4:
  6165 0000DAF7 A3[283E0100]        <1> 	mov	[readi.c_index], eax ; cluster index
  6166                              <1> 	; edx = byte offset in cluster (<= 65535)
  6167 0000DAFC 668915[223E0100]    <1> 	mov	[readi.offset], dx
  6168 0000DB03 66C1EA09            <1> 	shr	dx, 9 ; / 512
  6169 0000DB07 8815[1B3E0100]      <1> 	mov	[readi.s_index], dl ; sector index in cluster (0 to spc -1)
  6170                              <1> 
  6171 0000DB0D 89C1                <1> 	mov	ecx, eax ; current cluster index
  6172 0000DB0F A1[2C3E0100]        <1> 	mov	eax, [readi.fclust]
  6173 0000DB14 09C9                <1> 	or	ecx, ecx ; cluster index
  6174 0000DB16 741B                <1> 	jz	short mget_r_6
  6175                              <1> 
  6176 0000DB18 39CF                <1> 	cmp	edi, ecx
  6177 0000DB1A 7710                <1> 	ja	short mget_r_5 ; old cluster index is higher
  6178 0000DB1C 8B15[243E0100]      <1> 	mov	edx, [readi.cluster]
  6179 0000DB22 21D2                <1> 	and	edx, edx
  6180 0000DB24 7406                <1> 	jz	short mget_r_5
  6181                              <1> 	; valid 'readi' parameters (*)
  6182 0000DB26 89D0                <1> 	mov	eax, edx
  6183 0000DB28 29F9                <1> 	sub	ecx, edi
  6184 0000DB2A 740C                <1> 	jz	short mget_r_7
  6185                              <1> mget_r_5:
  6186                              <1> 	; EAX = Beginning cluster
  6187                              <1> 	; EDX = Sector index in disk/file section
  6188                              <1> 	;	(Only for SINGLIX file system!)
  6189                              <1> 	; ECX = Cluster sequence number after the beginning cluster
  6190                              <1> 	; ESI = Logical DOS Drive Description Table address
  6191 0000DB2C E80ADFFFFF          <1> 	call	get_cluster_by_index
  6192 0000DB31 724E                <1> 	jc	short mget_r_err
  6193                              <1> 	; EAX = Cluster number		
  6194                              <1> mget_r_6:
  6195 0000DB33 A3[243E0100]        <1> 	mov	[readi.cluster], eax ; FDT number for Singlix File System
  6196                              <1> mget_r_7:
  6197 0000DB38 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  6198 0000DB3C 765F                <1> 	jna	short mget_r_12
  6199                              <1> 
  6200 0000DB3E 83E802              <1> 	sub	eax, 2
  6201 0000DB41 0FB615[1A3E0100]    <1> 	movzx	edx, byte [readi.spc]
  6202 0000DB48 F7E2                <1> 	mul	edx
  6203                              <1> 
  6204 0000DB4A 034668              <1> 	add	eax, [esi+LD_DATABegin]
  6205 0000DB4D 8A15[1B3E0100]      <1> 	mov	dl, [readi.s_index]
  6206 0000DB53 01D0                <1> 	add	eax, edx
  6207                              <1> mget_r_8:
  6208                              <1> 	; eax = logical sector number
  6209 0000DB55 803D[183E0100]00    <1> 	cmp	byte [readi.valid], 0
  6210 0000DB5C 7608                <1> 	jna	short mget_r_9
  6211 0000DB5E 3B05[1C3E0100]      <1> 	cmp	eax, [readi.sector]
  6212 0000DB64 7436                <1> 	je	short mget_r_11 ; sector is already in 'readi' buffer
  6213                              <1> mget_r_9:
  6214 0000DB66 A3[1C3E0100]        <1> 	mov	[readi.sector], eax
  6215 0000DB6B BB[E0480100]        <1> 	mov	ebx, readi_buffer ; buffer address
  6216 0000DB70 B901000000          <1> 	mov	ecx, 1
  6217                              <1> 	; 29/04/2016
  6218                              <1> 	;xor	dl, dl
  6219                              <1> 
  6220                              <1> 	; EAX = Logical sector number
  6221                              <1> 	; ECX = Sector count
  6222                              <1> 	; EBX = Buffer address
  6223                              <1> 	; (EDX = 0)
  6224                              <1> 	; ESI = Logical DOS drive description table address	
  6225                              <1> 
  6226 0000DB75 E8F70A0000          <1> 	call	disk_read
  6227 0000DB7A 7314                <1> 	jnc	short mget_r_10
  6228                              <1> 
  6229                              <1> 	; 22/10/2016 (15h -> 17)
  6230 0000DB7C B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
  6231                              <1> mget_r_err:
  6232 0000DB81 A3[80470100]        <1> 	mov	[u.error], eax
  6233                              <1> 	; 12/10/2016
  6234 0000DB86 A3[1C470100]        <1> 	mov	[u.r0], eax
  6235 0000DB8B E9FDDFFFFF          <1> 	jmp	error
  6236                              <1> mget_r_10:
  6237 0000DB90 C605[183E0100]01    <1> 	mov	byte [readi.valid], 1 ; 24/10/2016
  6238 0000DB97 A1[1C3E0100]        <1> 	mov	eax, [readi.sector]
  6239                              <1> mget_r_11:
  6240 0000DB9C C3                  <1> 	retn
  6241                              <1> mget_r_12:
  6242                              <1> 	; EAX = FDT number
  6243                              <1> 	; EDX = Sector index from FDT sector (0,1,2,3,4...)
  6244 0000DB9D 40                  <1> 	inc	eax ; the first data sector in FS disk section	
  6245 0000DB9E 8915[303E0100]      <1> 	mov	[readi.fs_index], edx
  6246 0000DBA4 01D0                <1> 	add	eax, edx
  6247 0000DBA6 EBAD                <1> 	jmp	short mget_r_8
  6248                              <1> 
  6249                              <1> trans_addr_r:
  6250                              <1> 	; 12/10/2016
  6251                              <1> 	; 02/05/2016 - TRDOS 386 (TRDOS v2.0)
  6252                              <1> 	; Translate virtual address to physical address 
  6253                              <1> 	; for reading from user's memory space
  6254                              <1> 	; 04/06/2015 - 18/10/2015 (Retro UNIX 386 v1)
  6255                              <1> 
  6256 0000DBA8 31D2                <1> 	xor	edx, edx ; 0 (read access sign)
  6257 0000DBAA EB04                <1> 	jmp 	short trans_addr_rw
  6258                              <1> 
  6259                              <1> trans_addr_w:
  6260                              <1> 	; 12/10/2016
  6261                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  6262                              <1> 	; Translate virtual address to physical address 
  6263                              <1> 	; for writing to user's memory space
  6264                              <1> 	; 04/06/2015 - 18/10/2015 (Retro UNIX 386 v1)
  6265                              <1> 	
  6266 0000DBAC 29D2                <1> 	sub	edx, edx
  6267 0000DBAE FEC2                <1> 	inc	dl ; 1 (write access sign)
  6268                              <1> trans_addr_rw:
  6269 0000DBB0 50                  <1> 	push	eax
  6270 0000DBB1 53                  <1> 	push	ebx
  6271 0000DBB2 52                  <1> 	push 	edx ; r/w sign (in DL)
  6272                              <1> 	;
  6273 0000DBB3 8B1D[3C470100]      <1> 	mov	ebx, [u.base]
  6274 0000DBB9 E85976FFFF          <1> 	call	get_physical_addr ; get physical address
  6275 0000DBBE 730F                <1> 	jnc	short passc_0
  6276 0000DBC0 A3[80470100]        <1> 	mov	[u.error], eax
  6277 0000DBC5 A3[1C470100]        <1> 	mov	[u.r0], eax ; 12/10/2016
  6278                              <1> 	;pop	edx
  6279                              <1> 	;pop 	ebx
  6280                              <1> 	;pop	eax
  6281 0000DBCA E9BEDFFFFF          <1> 	jmp	error
  6282                              <1> passc_0:
  6283 0000DBCF F6C202              <1> 	test	dl, PTE_A_WRITE ; writable page
  6284 0000DBD2 5A                  <1> 	pop	edx
  6285 0000DBD3 751C                <1> 	jnz	short passc_1
  6286                              <1> 	
  6287 0000DBD5 20D2                <1> 	and 	dl, dl
  6288 0000DBD7 7418                <1> 	jz	short passc_1
  6289                              <1> 	; read only (duplicated) page -must be copied to a new page-
  6290                              <1> 	; EBX = linear address
  6291 0000DBD9 51                  <1> 	push 	ecx
  6292 0000DBDA E8CE72FFFF          <1> 	call 	copy_page
  6293 0000DBDF 59                  <1> 	pop	ecx
  6294 0000DBE0 721E                <1> 	jc	short passc_2
  6295 0000DBE2 50                  <1> 	push	eax ; physical address of the new/allocated page
  6296 0000DBE3 E85975FFFF          <1> 	call	add_to_swap_queue	
  6297 0000DBE8 58                  <1> 	pop	eax
  6298 0000DBE9 81E3FF0F0000        <1> 	and 	ebx, PAGE_OFF ; 0FFFh
  6299                              <1> 	;mov 	ecx, PAGE_SIZE
  6300                              <1> 	;sub	ecx, ebx 
  6301 0000DBEF 01D8                <1> 	add	eax, ebx  
  6302                              <1> passc_1: 
  6303 0000DBF1 A3[78470100]        <1> 	mov 	[u.pbase], eax ; physical address	
  6304 0000DBF6 66890D[7C470100]    <1> 	mov	[u.pcount], cx ; remain byte count in page (1-4096)
  6305 0000DBFD 5B                  <1> 	pop	ebx
  6306 0000DBFE 58                  <1> 	pop	eax
  6307 0000DBFF C3                  <1> 	retn
  6308                              <1> passc_2:
  6309 0000DC00 B804000000          <1> 	mov	eax, ERR_MINOR_IM ; "Insufficient memory !" error
  6310 0000DC05 A3[1C470100]        <1> 	mov	[u.r0], eax ; 12/10/2016
  6311 0000DC0A A3[80470100]        <1> 	mov	dword [u.error], eax
  6312                              <1> 	;pop 	ebx
  6313                              <1> 	;pop	eax
  6314 0000DC0F E979DFFFFF          <1> 	jmp	error
  6315                              <1> 
  6316                              <1> sioreg: 
  6317                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  6318                              <1> 	; 19/05/2015 - 25/07/2015 (Retro UNIX 386 v1)
  6319                              <1> 	; 12/03/2013 - 22/07/2013 (Retro UNIX 8086 v1)
  6320                              <1> 	; INPUTS -> 
  6321                              <1> 	;     EBX = system buffer (data) address (r5)
  6322                              <1> 	;     [u.fofp] = pointer to file offset pointer
  6323                              <1> 	;     [u.base] = virtual address of the user buffer
  6324                              <1> 	;     [u.pbase] = physical address of the user buffer
  6325                              <1> 	;     [u.count] = byte count
  6326                              <1> 	;     [u.pcount] = byte count within page frame 			
  6327                              <1> 	; OUTPUTS -> 
  6328                              <1> 	;     ESI = user data offset (r1)
  6329                              <1> 	;     EDI = system (I/O) buffer offset (r2)
  6330                              <1> 	;     ECX = byte count (r3)
  6331                              <1> 	;     EAX = remain bytes after byte count within page frame
  6332                              <1> 	;	(If EAX > 0, transfer will continue from the next page)
  6333                              <1>         ;
  6334                              <1> 	; ((Modified registers:  EDX))
  6335                              <1>  
  6336 0000DC14 8B35[2C470100]      <1>         mov     esi, [u.fofp]
  6337 0000DC1A 8B3E                <1>         mov     edi, [esi]
  6338 0000DC1C 89F9                <1> 	mov	ecx, edi
  6339 0000DC1E 81C900FEFFFF        <1> 	or	ecx, 0FFFFFE00h
  6340 0000DC24 81E7FF010000        <1> 	and	edi, 1FFh
  6341 0000DC2A 01DF                <1> 	add	edi, ebx ; EBX = system buffer (data) address
  6342 0000DC2C F7D9                <1> 	neg	ecx
  6343 0000DC2E 3B0D[40470100]      <1> 	cmp	ecx, [u.count]
  6344 0000DC34 7606                <1> 	jna	short sioreg_0
  6345 0000DC36 8B0D[40470100]      <1> 	mov	ecx, [u.count]
  6346                              <1> sioreg_0:
  6347 0000DC3C 803D[7E470100]00    <1> 	cmp	byte [u.kcall], 0 
  6348 0000DC43 7613                <1> 	jna	short sioreg_1
  6349                              <1> 	 ; the caller is 'mkdir' or 'namei'
  6350 0000DC45 A1[3C470100]        <1> 	mov	eax, [u.base]
  6351 0000DC4A A3[78470100]        <1> 	mov 	[u.pbase], eax ; physical address = virtual address
  6352 0000DC4F 66890D[7C470100]    <1> 	mov	word [u.pcount], cx ; remain bytes in buffer (1 sector)
  6353 0000DC56 EB0B                <1> 	jmp	short sioreg_2
  6354                              <1> sioreg_1:
  6355 0000DC58 0FB715[7C470100]    <1> 	movzx	edx, word [u.pcount]
  6356 0000DC5F 39D1                <1> 	cmp	ecx, edx	
  6357 0000DC61 772A                <1> 	ja	short sioreg_4 ; transfer count > [u.pcount]
  6358                              <1> sioreg_2: ; 2:
  6359 0000DC63 31C0                <1> 	xor 	eax, eax
  6360                              <1> sioreg_3:
  6361 0000DC65 010D[44470100]      <1> 	add 	[u.nread], ecx
  6362 0000DC6B 290D[40470100]      <1> 	sub 	[u.count], ecx
  6363 0000DC71 010D[3C470100]      <1> 	add 	[u.base], ecx
  6364 0000DC77 010E                <1>         add 	[esi], ecx 
  6365 0000DC79 8B35[78470100]      <1> 	mov	esi, [u.pbase]
  6366 0000DC7F 66290D[7C470100]    <1> 	sub	[u.pcount], cx
  6367 0000DC86 010D[78470100]      <1> 	add	[u.pbase], ecx
  6368 0000DC8C C3                  <1>         retn
  6369                              <1> sioreg_4:
  6370                              <1> 	; transfer count > [u.pcount] 
  6371                              <1> 	; (ecx > edx)
  6372 0000DC8D 89C8                <1> 	mov	eax, ecx
  6373 0000DC8F 29D0                <1> 	sub	eax, edx ; remain bytes for 1 sector (block) transfer 
  6374 0000DC91 89D1                <1> 	mov	ecx, edx ; current transfer count = [u.pcount]
  6375 0000DC93 EBD0                <1> 	jmp	short sioreg_3
  6376                              <1> 
  6377                              <1> tswitch: ; Retro UNIX 386 v1
  6378                              <1> tswap:
  6379                              <1> 	; 16/01/2017
  6380                              <1> 	; 21/05/2016 - TRDOS 386 (TRDOS v2.0)
  6381                              <1> 	; 10/05/2015 - 01/09/2015 (Retro UNIX 386 v1)
  6382                              <1> 	; 14/04/2013 - 14/02/2014 (Retro UNIX 8086 v1)
  6383                              <1> 	; time out swap, called when a user times out.
  6384                              <1> 	; the user is put on the low priority queue.
  6385                              <1> 	; This is done by making a link from the last user
  6386                              <1> 	; on the low priority queue to him via a call to 'putlu'.
  6387                              <1> 	; then he is swapped out.
  6388                              <1> 
  6389                              <1> 	; TRDOS 386 (TRDOS v2.0) modification ->  ** 21/05/2016 **
  6390                              <1> 	;     * when a high priority (event) process will be stopped
  6391                              <1> 	;	(swapped out, swithched out/off), 'tswap/tswitch' will
  6392                              <1> 	;	not add it to a run queue. 
  6393                              <1> 	;	/// What for: Process may be already in a run queue, 
  6394                              <1> 	;	it is unspeficied state because process might be started
  6395                              <1> 	;	by a timer event which does not regard previous priority
  6396                              <1> 	;	level and run queue of the process (for fast executing!).
  6397                              <1> 	;	After the 'run for event', process will be sequenced
  6398                              <1> 	;	to run by it's actual run queue. ///
  6399                              <1> 	;
  6400                              <1> 	; Retro UNIX 386 v1 modification ->
  6401                              <1> 	;       swap (software task switch) is performed by changing
  6402                              <1> 	;	user's page directory (u.pgdir) instead of segment change
  6403                              <1> 	;	as in Retro UNIX 8086 v1.
  6404                              <1> 	;
  6405                              <1> 	; RETRO UNIX 8086 v1 modification ->
  6406                              <1> 	;       'swap to disk' is replaced with 'change running segment'
  6407                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
  6408                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
  6409                              <1> 	;	compatibles was using 1MB segmented memory 
  6410                              <1> 	;	in 8086/8088 times.
  6411                              <1> 	;
  6412                              <1> 	; INPUTS ->
  6413                              <1> 	;    u.uno - users process number
  6414                              <1> 	;    runq+4 - lowest priority queue
  6415                              <1> 	; OUTPUTS ->
  6416                              <1> 	;    r0 - users process number
  6417                              <1> 	;    r2 - lowest priority queue address
  6418                              <1> 	;
  6419                              <1> 	; ((AX = R0, BX = R2)) output
  6420                              <1> 	; ((Modified registers: EDX, EBX, ECX, ESI, EDI))  	
  6421                              <1> 	;
  6422                              <1> 
  6423                              <1> 	NOTE:
  6424                              <1> 	;* [u.pri] priority level is specified by run queue which is process 
  6425                              <1> 	;  comes to run from.
  6426                              <1> 	;* Initial [u.pri] is 1 ('normal/regular') for programs 
  6427                              <1> 	;  (which are launched by MainProg or 'sysexec'), it is changed
  6428                              <1> 	;  to 2 ('high') by timer event, if program uses 'systimer' system call.
  6429                              <1> 	;* Program (Process) also can change it's running priority 
  6430                              <1> 	;  from 1 to 0 or up to 2 by using 'syspri' system call; but,
  6431                              <1> 	;  if program selects priority level 2 (high) for running, next time 
  6432                              <1> 	;  it is reduced to 1 (normal/regular) because 'syspri' adds this
  6433                              <1> 	;  program to 'run for normal' queue while running duration is a bit
  6434                              <1> 	;  protected from swap/switch out immediate, behalf of other high 
  6435                              <1> 	;  priority process in sequence. Program (with high priority) will not 
  6436                              <1> 	;  be swapped/switched out (by timer event) before it's time quantum 
  6437                              <1> 	;  will be elapsed, but, this will be temporary if program is not using 
  6438                              <1> 	;  timer event function.	  			 	
  6439                              <1> 
  6440                              <1> 	;For example:
  6441                              <1> 	;If a process frequently gets a timer event, it runs at high priority
  6442                              <1> 	;level but when it returns from running it returns to actual run queue,
  6443                              <1> 	;not to 'run for event' queue again.
  6444                              <1> 	;'tswap' will not change the sequence at return/stop(swap out) stage.
  6445                              <1> 	;But if priority level not high (=2, 'run for event'), 'tswap/tswitch'
  6446                              <1> 	;will add the stopping process to relevant run queue according to
  6447                              <1> 	;[u.pri] priority level.
  6448                              <1> 
  6449                              <1> 	; 16/01/2017
  6450 0000DC95 BB[0C470100]        <1> 	mov	ebx, runq+2 	; 'runq_normal' ; normal/regular priority
  6451                              <1> 	; 21/05/2016
  6452                              <1> 	;cmp	byte [u.pri], 2	; high priority (run for event) ?
  6453                              <1> 	;jnb	short swap
  6454                              <1> 	; 16/01/2017
  6455                              <1> 	; (Normal and also high/event priority processes will be added to
  6456                              <1> 	; normal priority run queue for ensuring circular running sequence!)
  6457                              <1> 	; (Timer interrupt or 'syspri' system call may change priority and run
  6458                              <1> 	; queue to high/event level.)
  6459 0000DC9A 803D[61470100]00    <1> 	cmp	byte [u.pri], 0
  6460 0000DCA1 7702                <1> 	ja	short tswap_1	; normal priority run queue
  6461                              <1> 	;
  6462 0000DCA3 43                  <1> 	inc	ebx
  6463 0000DCA4 43                  <1> 	inc	ebx		; runq+4, 'runq_background', low priority
  6464                              <1> tswap_1:
  6465 0000DCA5 A0[6B470100]        <1> 	mov 	al, [u.uno]
  6466                              <1> 	       	; movb u.uno,r1 / move users process number to r1
  6467                              <1> 		; mov  $runq+4,r2 
  6468                              <1> 			; / move lowest priority queue address to r2
  6469                              <1>       	; ebx = run queue
  6470 0000DCAA E8E0000000          <1> 	call 	putlu
  6471                              <1> 		; jsr r0,putlu / create link from last user on Q to 
  6472                              <1> 		             ; / u.uno's user
  6473                              <1> 
  6474                              <1> switch: ; Retro UNIX 386 v1
  6475                              <1> swap:
  6476                              <1> 	; 02/01/2017
  6477                              <1> 	; 21/05/2016
  6478                              <1> 	; 20/05/2016
  6479                              <1> 	; 02/05/2016
  6480                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  6481                              <1> 	; 10/05/2015 - 02/09/2015 (Retro UNIX 386 v1)
  6482                              <1> 	; 14/04/2013 - 08/03/2014 (Retro UNIX 8086 v1)
  6483                              <1> 	;
  6484                              <1> 	; 'swap' is routine that controls the swapping of processes
  6485                              <1> 	; in and out of core.
  6486                              <1> 	;
  6487                              <1> 	; TRDOS 386 (TRDOS v2.0) modification ->  ** 20/05/2016 **
  6488                              <1> 	;     * 3 different priority level is applied 
  6489                              <1> 	;	(just as original unix v1)
  6490                              <1> 	;	1) high priority (event) run queue, 'runq_event'
  6491                              <1> 	;	2) normal priority (regular) run queue, 'runq_normal'
  6492                              <1> 	;	3) low priority (background) run queue, 'runq_backgroud'
  6493                              <1> 	;	'swap' code will run a process which has max. priority
  6494                              <1>         ;       (for earliest event at first)
  6495                              <1> 	;
  6496                              <1> 	; Retro UNIX 386 v1 modification ->
  6497                              <1> 	;       swap (software task switch) is performed by changing
  6498                              <1> 	;	user's page directory (u.pgdir) instead of segment change
  6499                              <1> 	;	as in Retro UNIX 8086 v1.
  6500                              <1> 	;
  6501                              <1> 	; RETRO UNIX 8086 v1 modification ->
  6502                              <1> 	;       'swap to disk' is replaced with 'change running segment'
  6503                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
  6504                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
  6505                              <1> 	;	compatibles was using 1MB segmented memory 
  6506                              <1> 	;	in 8086/8088 times.
  6507                              <1> 	;
  6508                              <1> 	; INPUTS ->
  6509                              <1> 	;    runq table - contains processes to run.
  6510                              <1> 	;    p.link - contains next process in line to be run.
  6511                              <1> 	;    u.uno - process number of process in core	
  6512                              <1> 	;    s.stack - swap stack used as an internal stack for swapping.	
  6513                              <1> 	; OUTPUTS ->
  6514                              <1> 	;    (original unix v1 -> present process to its disk block)
  6515                              <1> 	;    (original unix v1 -> new process into core -> 
  6516                              <1> 	;	   Retro Unix 8086 v1 -> segment registers changed 
  6517                              <1> 	;	   for new process)
  6518                              <1> 	;    u.quant = 3 (Time quantum for a process)
  6519                              <1> 	; 	((INT 1Ch count down speed -> 18.2 times per second)	 	
  6520                              <1> 	;    RETRO UNIX 8086 v1 will use INT 1Ch (18.2 times per second)
  6521                              <1> 	;	 for now, it will swap the process if there is not
  6522                              <1> 	;	 a keyboard event (keystroke) (Int 15h, function 4Fh)
  6523                              <1> 	;	 or will count down from 3 to 0 even if there is a
  6524                              <1> 	;        keyboard event locking due to repetitive key strokes.
  6525                              <1> 	;	 u.quant will be reset to 3 for RETRO UNIX 8086 v1.
  6526                              <1> 	;
  6527                              <1> 	; ((Modified registers: EAX, EDX, EBX, ECX, ESI, EDI))  	
  6528                              <1> 
  6529                              <1> 	;NOTE:
  6530                              <1> 	;High priority queue is the first for selecting a process to run.
  6531                              <1> 	;If there is not a process in high priority level run queue,
  6532                              <1> 	;a process in normal priority run queue will be selected
  6533                              <1> 	;or a proces in low priority run queue will be selected if normal
  6534                              <1> 	;priority level run queue is empty.
  6535                              <1> 	
  6536                              <1> 	; 21/05/2016 -(3 priority levels, 3 run queues)
  6537 0000DCAF BE[0A470100]        <1> 	mov	esi, runq ; 'runq_event' ; high priority, 'run for event'
  6538 0000DCB4 C605[743E0100]03    <1> 	mov	byte [priority], 3 ; high priority + 1
  6539 0000DCBB 31DB                <1> 	xor	ebx, ebx ; 02/01/2017
  6540                              <1> swap_0: ; 1: / search runq table for highest priority process
  6541 0000DCBD 66AD                <1> 	lodsw  ; mov ax, [esi], add esi+2
  6542                              <1> 	;xor	ebx, ebx ; 02/05/2016
  6543 0000DCBF 6621C0              <1> 	and 	ax, ax ; are there any processes to run in this Q entry
  6544 0000DCC2 750E                <1> 	jnz	short swap_2 
  6545                              <1> 	; 21/05/2026
  6546                              <1> 	; runq_normal = runq+2, runq_background = runq+4
  6547 0000DCC4 FE0D[743E0100]      <1> 	dec	byte [priority] ; 3 -> 3, 2 -> 1, 1-> 0
  6548 0000DCCA 75F1                <1> 	jnz	short swap_0	
  6549                              <1> 	;cmp	esi, runq+6  ; if zero compare address to end of table
  6550                              <1> 	;jb	short swap_0 ; if not at end, go back
  6551                              <1> swap_1:
  6552                              <1> 	; 02/05/2016
  6553                              <1> 	; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
  6554                              <1> 	; No user process to run...
  6555                              <1> 	; Run the kernel process... MainProg: Internal Command Interpreter  
  6556 0000DCCC FEC0                <1> 	inc	al ; mov al, 1  ; process number of MainProg
  6557 0000DCCE FEC3                <1> 	inc	bl ; mov bl, al ; 1
  6558 0000DCD0 EB1E                <1> 	jmp	short swap_4
  6559                              <1> swap_2:
  6560                              <1> 	; 21/05/2016
  6561 0000DCD2 FE0D[743E0100]      <1> 	dec	byte [priority] ; priority level of present user/process
  6562                              <1> 			        ; 0, 1, 2	   
  6563 0000DCD8 4E                  <1> 	dec	esi
  6564 0000DCD9 4E                  <1>         dec     esi
  6565                              <1> 	;
  6566 0000DCDA 88C3                <1> 	mov	bl, al
  6567 0000DCDC 38E0                <1> 	cmp	al, ah ; is there only 1 process in the queue to be run
  6568 0000DCDE 740A                <1> 	je	short swap_3 ; yes
  6569 0000DCE0 8AA3[57440100]      <1> 	mov	ah, [ebx+p.link-1] 
  6570 0000DCE6 8826                <1>        	mov	[esi], ah ; move next process in line into run queue
  6571 0000DCE8 EB06                <1> 	jmp	short swap_4
  6572                              <1> swap_3: 
  6573 0000DCEA 6631D2              <1> 	xor	dx, dx
  6574 0000DCED 668916              <1> 	mov	[esi], dx ; zero the entry; no processes on the Q
  6575                              <1> swap_4: 
  6576 0000DCF0 8A25[6B470100]      <1> 	mov 	ah, [u.uno]
  6577 0000DCF6 38C4                <1> 	cmp	ah, al ;is this process the same as the process in core?
  6578 0000DCF8 743B                <1>        	je	short swap_8 ; yes, don't have to swap
  6579 0000DCFA 08E4                <1> 	or	ah, ah  ; is the process # = 0
  6580 0000DCFC 740D                <1>        	jz	short swap_6 ; 'sysexit'
  6581                              <1> 	;cmp	ah, al ;is this process the same as the process in core?
  6582                              <1>        	;je	short swap_8 ; yes, don't have to swap
  6583 0000DCFE 8925[18470100]      <1> 	mov	[u.usp], esp ; return  address for 'syswait' & 'sleep'
  6584 0000DD04 E834000000          <1> 	call	wswap   ; write out core to disk
  6585 0000DD09 EB1C                <1> 	jmp 	short swap_7
  6586                              <1> swap_6:
  6587                              <1> 	; Deallocate memory pages belong to the process
  6588                              <1> 	; which is being terminated.
  6589                              <1> 	; (Retro UNIX 386 v1 modification !)
  6590                              <1> 	;
  6591 0000DD0B 53                  <1> 	push	ebx
  6592 0000DD0C A1[70470100]        <1> 	mov 	eax, [u.pgdir]  ; page directory of the process
  6593 0000DD11 8B1D[74470100]      <1> 	mov	ebx, [u.ppgdir] ; page directory of the parent process
  6594 0000DD17 E81C6FFFFF          <1> 	call	deallocate_page_dir
  6595 0000DD1C A1[6C470100]        <1> 	mov	eax, [u.upage] ; 'user' structure page of the process
  6596 0000DD21 E8B76FFFFF          <1> 	call	deallocate_page
  6597 0000DD26 5B                  <1> 	pop	ebx
  6598                              <1> swap_7: 
  6599 0000DD27 C0E302              <1> 	shl	bl, 2 ; * 4 
  6600 0000DD2A 8B83[74440100]      <1> 	mov	eax, [ebx+p.upage-4] ; the 'u' page of the new process
  6601 0000DD30 E831000000          <1> 	call	rswap ; read new process into core
  6602                              <1> swap_8: 
  6603                              <1> 	; Retro UNIX  8086 v1 modification !
  6604 0000DD35 C605[60470100]04    <1> 	mov	byte [u.quant], time_count 
  6605 0000DD3C C3                  <1> 	retn
  6606                              <1> 
  6607                              <1> wswap:  ; < swap out, swap to disk >
  6608                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  6609                              <1> 	; 09/05/2015 (Retro UNIX 386 v1)
  6610                              <1> 	; 26/05/2013 - 08/03/2014 (Retro UNIX 8086 v1)
  6611                              <1> 	; 'wswap' writes out the process that is in core onto its 
  6612                              <1> 	; appropriate disk area.
  6613                              <1> 	;
  6614                              <1> 	; Retro UNIX 386 v1 modification ->
  6615                              <1> 	;       User (u) structure content and the user's register content
  6616                              <1> 	;	will be copied to the process's/user's UPAGE (a page for
  6617                              <1> 	;	saving 'u' structure and user registers for task switching).
  6618                              <1> 	;	u.usp - points to kernel stack address which contains
  6619                              <1> 	;		user's registers while entering system call.  
  6620                              <1> 	;	u.sp  - points to kernel stack address 
  6621                              <1> 	;		to return from system call -for IRET-.
  6622                              <1> 	;	[u.usp]+32+16 = [u.sp] 
  6623                              <1> 	;	[u.usp] -> edi, esi, ebp, esp (= [u.usp]+32), ebx, 
  6624                              <1> 	;		edx, ecx, eax, gs, fs, es, ds, -> [u.sp].
  6625                              <1> 	;
  6626                              <1> 	; Retro UNIX 8086 v1 modification ->
  6627                              <1> 	;       'swap to disk' is replaced with 'change running segment'
  6628                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
  6629                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
  6630                              <1> 	;	compatibles was using 1MB segmented memory 
  6631                              <1> 	;	in 8086/8088 times.
  6632                              <1> 	;
  6633                              <1> 	; INPUTS ->
  6634                              <1> 	;    u.break - points to end of program
  6635                              <1> 	;    u.usp - stack pointer at the moment of swap
  6636                              <1> 	;    core - beginning of process program		
  6637                              <1> 	;    ecore - end of core 	
  6638                              <1> 	;    user - start of user parameter area		
  6639                              <1> 	;    u.uno - user process number	
  6640                              <1> 	;    p.dska - holds block number of process	
  6641                              <1> 	; OUTPUTS ->
  6642                              <1> 	;    swp I/O queue
  6643                              <1> 	;    p.break - negative word count of process 
  6644                              <1> 	;    r1 - process disk address	
  6645                              <1> 	;    r2 - negative word count
  6646                              <1> 	;
  6647                              <1> 	; RETRO UNIX 8086 v1 input/output:
  6648                              <1> 	;
  6649                              <1> 	; INPUTS ->
  6650                              <1> 	;    u.uno - process number (to be swapped out)
  6651                              <1> 	; OUTPUTS ->
  6652                              <1> 	;    none
  6653                              <1> 	;
  6654                              <1> 	;   ((Modified registers: ECX, ESI, EDI))  
  6655                              <1> 	;
  6656 0000DD3D 8B3D[6C470100]      <1> 	mov	edi, [u.upage] ; process's user (u) structure page addr
  6657 0000DD43 B91F000000          <1> 	mov	ecx, (U_SIZE + 3) / 4
  6658 0000DD48 BE[14470100]        <1> 	mov	esi, user ; active user (u) structure	
  6659 0000DD4D F3A5                <1> 	rep	movsd
  6660                              <1> 	;
  6661 0000DD4F 8B35[18470100]      <1> 	mov	esi, [u.usp] ; esp (system stack pointer, 
  6662                              <1> 			     ;      points to user registers)
  6663 0000DD55 8B0D[14470100]      <1> 	mov	ecx, [u.sp]  ; return address from the system call
  6664                              <1> 			     ; (for IRET)
  6665                              <1> 			     ; [u.sp] -> EIP (user)
  6666                              <1> 			     ; [u.sp+4]-> CS (user)
  6667                              <1> 			     ; [u.sp+8] -> EFLAGS (user)
  6668                              <1> 			     ; [u.sp+12] -> ESP (user)
  6669                              <1> 			     ; [u.sp+16] -> SS (user)	
  6670 0000DD5B 29F1                <1> 	sub	ecx, esi     ; required space for user registers
  6671 0000DD5D 83C114              <1> 	add	ecx, 20	     ; +5 dwords to return from system call
  6672                              <1> 			     ; (for IRET) 	
  6673 0000DD60 C1E902              <1> 	shr	ecx, 2	     		
  6674 0000DD63 F3A5                <1> 	rep	movsd
  6675 0000DD65 C3                  <1> 	retn
  6676                              <1> 
  6677                              <1> rswap:  ; < swap in, swap from disk >
  6678                              <1> 	; 15/01/2017
  6679                              <1> 	; 14/01/2017
  6680                              <1> 	; 21/05/2016
  6681                              <1> 	; 03/05/2016
  6682                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  6683                              <1> 	; 09/05/2015 - 15/09/2015 (Retro UNIX 386 v1)
  6684                              <1> 	; 26/05/2013 - 08/03/2014 (Retro UNIX 8086 v1)
  6685                              <1> 	; 'rswap' reads a process whose number is in r1, 
  6686                              <1> 	; from disk into core.
  6687                              <1> 	;
  6688                              <1> 	; Retro UNIX 386 v1 modification ->
  6689                              <1> 	;       User (u) structure content and the user's register content
  6690                              <1> 	;	will be restored from process's/user's UPAGE (a page for
  6691                              <1> 	;	saving 'u' structure and user registers for task switching).
  6692                              <1> 	;	u.usp - points to kernel stack address which contains
  6693                              <1> 	;		user's registers while entering system call.  
  6694                              <1> 	;	u.sp  - points to kernel stack address 
  6695                              <1> 	;		to return from system call -for IRET-.
  6696                              <1> 	;	[u.usp]+32+16 = [u.sp] 
  6697                              <1> 	;	[u.usp] -> edi, esi, ebp, esp (= [u.usp]+32), ebx, 
  6698                              <1> 	;		edx, ecx, eax, gs, fs, es, ds, -> [u.sp].
  6699                              <1> 	;
  6700                              <1> 	; RETRO UNIX 8086 v1 modification ->
  6701                              <1> 	;       'swap to disk' is replaced with 'change running segment'
  6702                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
  6703                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
  6704                              <1> 	;	compatibles was using 1MB segmented memory 
  6705                              <1> 	;	in 8086/8088 times.
  6706                              <1> 	;
  6707                              <1> 	; INPUTS ->
  6708                              <1> 	;    r1 - process number of process to be read in
  6709                              <1> 	;    p.break - negative of word count of process 
  6710                              <1> 	;    p.dska - disk address of the process		
  6711                              <1> 	;    u.emt - determines handling of emt's 	
  6712                              <1> 	;    u.ilgins - determines handling of illegal instructions		
  6713                              <1> 	; OUTPUTS ->
  6714                              <1> 	;    8 = (u.ilgins)
  6715                              <1> 	;    24 = (u.emt)
  6716                              <1> 	;    swp - bit 10 is set to indicate read 
  6717                              <1> 	;		(bit 15=0 when reading is done)	
  6718                              <1> 	;    swp+2 - disk block address
  6719                              <1> 	;    swp+4 - negative word count 	
  6720                              <1> 	;      ((swp+6 - address of user structure)) 
  6721                              <1> 	;
  6722                              <1> 	; RETRO UNIX 8086 v1 input/output:
  6723                              <1> 	;
  6724                              <1> 	; INPUTS ->
  6725                              <1> 	;    AL	- new process number (to be swapped in)	 
  6726                              <1> 	; OUTPUTS ->
  6727                              <1> 	;    none
  6728                              <1> 	;
  6729                              <1> 	;   ((Modified registers: EAX, ECX, ESI, EDI, ESP)) 
  6730                              <1> 	;
  6731                              <1> 	; Retro UNIX 386 v1 - modification ! 14/05/2015
  6732 0000DD66 89C6                <1> 	mov	esi, eax  ; process's user (u) structure page addr
  6733 0000DD68 B91F000000          <1> 	mov	ecx, (U_SIZE + 3) / 4
  6734 0000DD6D BF[14470100]        <1> 	mov	edi, user ; active user (u) structure	
  6735 0000DD72 F3A5                <1> 	rep	movsd
  6736 0000DD74 58                  <1> 	pop	eax	; 'rswap' return address
  6737                              <1> 	; 
  6738                              <1> 	;cli
  6739 0000DD75 8B3D[18470100]      <1> 	mov	edi, [u.usp] ; esp (system stack pointer, 
  6740                              <1> 			     ;     points to user registers)
  6741 0000DD7B 89FC                <1> 	mov	esp, edi     ; 14/01/2017
  6742 0000DD7D 8B0D[14470100]      <1> 	mov	ecx, [u.sp]  ; return address from the system call
  6743                              <1> 			     ; (for IRET)
  6744                              <1> 			     ; [u.sp] -> EIP (user)
  6745                              <1> 			     ; [u.sp+4]-> CS (user)
  6746                              <1> 			     ; [u.sp+8] -> EFLAGS (user)
  6747                              <1> 			     ; [u.sp+12] -> ESP (user)
  6748                              <1> 			     ; [u.sp+16] -> SS (user)		
  6749 0000DD83 29F9                <1> 	sub	ecx, edi     ; required space for user registers
  6750 0000DD85 83C114              <1> 	add	ecx, 20	     ; +5 dwords to return from system call
  6751                              <1> 			     ; (for IRET) 	
  6752 0000DD88 C1E902              <1> 	shr	ecx, 2	       		
  6753 0000DD8B F3A5                <1> 	rep	movsd
  6754                              <1> 	;mov	esp, [u.usp] ; 15/09/2015
  6755                              <1> 	;sti
  6756 0000DD8D 50                  <1> 	push	eax	; 'rswap' return address
  6757 0000DD8E C3                  <1> 	retn
  6758                              <1> 
  6759                              <1> putlu: 
  6760                              <1> 	; 20/05/2016
  6761                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  6762                              <1> 	; 10/05/2015 - 12/09/2015 (Retro UNIX 386 v1)
  6763                              <1> 	; 15/04/2013 - 23/02/2014 (Retro UNIX 8086 v1)
  6764                              <1> 	; 'putlu' is called with a process number in r1 and a pointer
  6765                              <1> 	; to lowest priority Q (runq+4) in r2. A link is created from
  6766                              <1> 	; the last process on the queue to process in r1 by putting
  6767                              <1> 	; the process number in r1 into the last process's link.
  6768                              <1> 	;
  6769                              <1> 	; INPUTS ->
  6770                              <1> 	;    r1 - user process number
  6771                              <1> 	;    r2 - points to lowest priority queue 
  6772                              <1> 	;    p.dska - disk address of the process		
  6773                              <1> 	;    u.emt - determines handling of emt's 	
  6774                              <1> 	;    u.ilgins - determines handling of illegal instructions		
  6775                              <1> 	; OUTPUTS ->
  6776                              <1> 	;    r3 - process number of last process on the queue upon
  6777                              <1> 	;	  entering putlu
  6778                              <1> 	;    p.link-1 + r3 - process number in r1
  6779                              <1> 	;    r2 - points to lowest priority queue
  6780                              <1> 	;
  6781                              <1> 	; ((Modified registers: EDX, EBX)) 
  6782                              <1> 	;
  6783                              <1> 	; / r1 = user process no.; r2 points to lowest priority queue
  6784                              <1> 
  6785                              <1> 	; EBX = r2
  6786                              <1> 	; EAX = r1 (AL=r1b)
  6787                              <1> 
  6788                              <1> 	; 20/05/2016
  6789                              <1> 	; AL = process number (1 to 16) // Retro UNIX 8086, 386 v1 // 
  6790                              <1> 	;     (max. 16 processes available for current kernel version) 
  6791                              <1> 	; EBX = run queue address ; 20/05/2016 (TRDOS 386)
  6792                              <1> 		; which is one of following addresses:
  6793                              <1> 		;  1) 'runq_event' high priority run queue	 	
  6794                              <1> 		;  2) 'runq_normal' normal/regular priority run queue
  6795                              <1> 		;  3) 'runq_background' low priority run queue
  6796                              <1> 
  6797                              <1> 	;mov	ebx, runq
  6798 0000DD8F 0FB613              <1> 	movzx  	edx, byte [ebx]
  6799 0000DD92 43                  <1> 	inc	ebx
  6800 0000DD93 20D2                <1> 	and	dl, dl
  6801                              <1> 		; tstb (r2)+ / is queue empty?
  6802 0000DD95 740A                <1>        	jz	short putlu_1
  6803                              <1> 		; beq 1f / yes, branch
  6804 0000DD97 8A13                <1> 	mov 	dl, [ebx] ; 12/09/2015
  6805                              <1> 		; movb (r2),r3 / no, save the "last user" process number
  6806                              <1> 			     ; / in r3
  6807 0000DD99 8882[57440100]      <1>        	mov	[edx+p.link-1], al
  6808                              <1> 		; movb r1,p.link-1(r3) / put pointer to user on 
  6809                              <1> 			     ; / "last users" link
  6810 0000DD9F EB03                <1> 	jmp	short putlu_2
  6811                              <1> 		; br 2f /
  6812                              <1> putlu_1: ; 1:
  6813 0000DDA1 8843FF              <1> 	mov	[ebx-1], al
  6814                              <1>        		; movb r1,-1(r2) / user is only user; 
  6815                              <1> 			    ; / put process no. at beginning and at end
  6816                              <1> putlu_2: ; 2: 
  6817 0000DDA4 8803                <1> 	mov	[ebx], al
  6818                              <1>        		; movb r1,(r2) / user process in r1 is now the last entry
  6819                              <1> 			     ; / on the queue
  6820 0000DDA6 88C2                <1> 	mov	dl, al
  6821 0000DDA8 88B2[57440100]      <1>         mov     [edx+p.link-1], dh ; 0
  6822                              <1> 		; dec r2 / restore r2
  6823 0000DDAE C3                  <1>         retn
  6824                              <1> 		; rts r0
  6825                              <1> sysver:
  6826                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  6827 0000DDAF C705[1C470100]0002- <1> 	mov	dword [u.r0], 200h ; AH = major version, AL = minor version 
  6827 0000DDB7 0000                <1>
  6828 0000DDB9 E9EFDDFFFF          <1> 	jmp	sysret
  6829                              <1> 
  6830                              <1> sysreserved1:
  6831                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  6832                              <1> 	; // name and content will be changed later //
  6833 0000DDBE C705[1C470100]E007- <1> 	mov	dword [u.r0], 2016
  6833 0000DDC6 0000                <1>
  6834 0000DDC8 E9E0DDFFFF          <1> 	jmp	sysret
  6835                              <1> 
  6836                              <1> syspri: ; change running priority (of the process)
  6837                              <1> 	; 21/05/2016
  6838                              <1> 	; 20/05/2026 - TRDOS 386 (TRDOS v2.0)
  6839                              <1> 	; INPUT ->
  6840                              <1> 	;	BL = priority level
  6841                              <1> 	;	   0 = low running priority (running on background)
  6842                              <1> 	;	   1 = normal/regular priority (running as regular)
  6843                              <1> 	;	   2 = high/event priority (running for event)
  6844                              <1> 	;	   >2 = invalid, it will accepted as 2 (event)
  6845                              <1> 	;	   0FFh = get/return current running priority only	
  6846                              <1> 	; OUTPUT -> 	
  6847                              <1> 	;	* if current [u.pri] < 2
  6848                              <1> 	;	  if BL input < 0FFh ->
  6849                              <1> 	;	     [u.pri] is updated as in BL input (0,1,2)
  6850                              <1> 	;	  if BL input = 0FFh -> AL = [u.pri] (current)
  6851                              <1> 	;	      
  6852                              <1> 	;	* if current [u.pri] = 2
  6853                              <1> 	;	  if BL input < 0FFh -> cf = 1 & AL = 2
  6854                              <1> 	;	  if BL input = 0FFh -> cf = 0 & AL = 2  
  6855                              <1> 	;	
  6856                              <1> 	;	NOTE: 	
  6857                              <1> 	;	If [u.pri] = 2, it can not be changed to 1 or 0;
  6858                              <1> 	;	because, run queue of the running process is unspecified
  6859                              <1> 	;	at this	stage. Process might be started by a timer event
  6860                              <1> 	;	or priority might be changed to high by previous
  6861                              <1> 	;	'syspri' system	call. In both cases, the process is in
  6862                              <1> 	;	'runq_normal' or 'runq_background' queue.
  6863                              <1> 	;	As result of this fact, when the [u.quant] time quantum
  6864                              <1> 	;	of the process is elapsed or 'sysrele' system call is
  6865                              <1> 	;	instructed by the process, 'tswap' ('tswitch') procedure
  6866                              <1> 	;	will be called (to 'swap' or 'switch' out the procedure)
  6867                              <1> 	;	and it will not call 'putlu' to add the (stopping)
  6868                              <1> 	;	process to relevant run queue when [u.pri] = 2.
  6869                              <1> 	;	(Otherwise, it would be possible to add process to
  6870                              <1> 	;	a run queue while it is already in a run queue, wrongly.)
  6871                              <1>   	;
  6872                              <1> 	;	If [u.pri]< 2, 'tswap/tswitch' procedure will call 
  6873                              <1> 	;	'putlu' to add process to relevant run queue
  6874                              <1> 	;	according to [u.pri] value. ('runq_normal' for 1, 
  6875                              <1> 	;	'runq_background' for 0).
  6876                              <1> 	;
  6877                              <1> 	;	If BL input >= 2 and < 0FFh while [u.pri] < 2,
  6878                              <1> 	;	process will be added to 'runq_normal' queue and
  6879                              <1> 	;	[u.pri] will be set to 2. (in 'syspri' system call)
  6880                              <1> 	;
  6881                              <1> 
  6882 0000DDCD 29C0                <1> 	sub	eax, eax ; 0
  6883 0000DDCF A3[80470100]        <1> 	mov	[u.error], eax
  6884                              <1> 
  6885 0000DDD4 A0[61470100]        <1> 	mov	al, [u.pri]
  6886 0000DDD9 A3[1C470100]        <1> 	mov	[u.r0], eax
  6887                              <1> 
  6888 0000DDDE FEC3                <1> 	inc	bl
  6889 0000DDE0 0F84C7DDFFFF        <1> 	jz	sysret ; 0FFh -> 0, get priority level
  6890                              <1> 	
  6891 0000DDE6 3C02                <1> 	cmp	al, 2
  6892 0000DDE8 0F839FDDFFFF        <1> 	jnb	error ; CF = 1 & AL = 2 (& last error = 0)
  6893                              <1> 
  6894 0000DDEE FECB                <1> 	dec	bl
  6895 0000DDF0 80FB02              <1> 	cmp	bl, 2
  6896 0000DDF3 7602                <1> 	jna	short syspri_1
  6897 0000DDF5 B302                <1> 	mov	bl, 2
  6898                              <1> syspri_1:
  6899 0000DDF7 881D[61470100]      <1> 	mov	[u.pri], bl
  6900 0000DDFD 80FB02              <1> 	cmp	bl, 2
  6901 0000DE00 0F82A7DDFFFF        <1>         jb      sysret
  6902                              <1> 
  6903                              <1> 	; here...
  6904                              <1> 	; Priority of current process has been changed to high
  6905                              <1> 	; ('run for event') but current process will be added to
  6906                              <1> 	; 'run as normal' queue. ('run for event' high priority
  6907                              <1> 	; queue is under control of timer -& RTC- interrupt only!) 
  6908                              <1> 	;
  6909                              <1> 	; (Otherwise, process can fall into black hole!
  6910                              <1> 	; e.g. if it is not in waiting list and it has not got 
  6911                              <1> 	; a timer event and it is not in a run queue!
  6912                              <1> 	; Because, when [u.pri] is 2, 'tswap/tswitch' will not 
  6913                              <1> 	; add the stopping process to a run queue.)
  6914                              <1> 
  6915 0000DE06 A0[6B470100]        <1> 	mov	al, [u.uno]
  6916 0000DE0B BB[0C470100]        <1> 	mov	ebx, runq_normal ; normal priority !
  6917                              <1> 				 ; [u.pri] is set to high
  6918                              <1> 				 ; but 'runq_event' queue is set
  6919                              <1> 				 ; only by the kernel's timer
  6920                              <1> 				 ; event function (timer interrupt). 
  6921 0000DE10 E87AFFFFFF          <1> 	call	putlu
  6922 0000DE15 E993DDFFFF          <1> 	jmp	sysret
  6923                              <1> 
  6924                              <1> cpass: ; / get next character from user area of core and put it in AL (r1)
  6925                              <1> 	; 02/05/2016 - TRDOS 386 (TRDOS v2.0)
  6926                              <1> 	; 19/05/2015 - 18/10/2015 (Retro UNIX 386 v1)
  6927                              <1> 	; 14/08/2013 - 20/09/2013 (Retro UNIX 8086 v1)
  6928                              <1> 	; INPUTS -> 
  6929                              <1> 	;     [u.base] = virtual address in user area
  6930                              <1> 	;     [u.count] = byte count (max.)
  6931                              <1> 	;     [u.pcount] = byte count in page (0 = reset)		
  6932                              <1> 	; OUTPUTS -> 
  6933                              <1> 	;     AL = the character which is pointed by [u.base]
  6934                              <1> 	;     zf = 1 -> transfer count has been completed	
  6935                              <1>         ;
  6936                              <1> 	; ((Modified registers:  EAX, EDX, ECX))
  6937                              <1> 	;
  6938 0000DE1A 833D[40470100]00    <1> 	cmp 	dword [u.count], 0  ; have all the characters been transferred
  6939                              <1> 			    	    ; i.e., u.count, # of chars. left
  6940 0000DE21 763F                <1> 	jna	short cpass_3	    ; to be transferred = 0?) yes, branch
  6941 0000DE23 FF0D[40470100]      <1> 	dec	dword [u.count]	    ; no, decrement u.count
  6942                              <1>         ; 19/05/2015 
  6943                              <1> 	;(Retro UNIX 386 v1 - translation from user's virtual address
  6944                              <1> 	;		      to physical address
  6945 0000DE29 66833D[7C470100]00  <1> 	cmp	word [u.pcount], 0 ; byte count in page = 0 (initial value)
  6946                              <1> 			     ; 1-4095 --> use previous physical base address
  6947                              <1> 			     ; in [u.pbase]
  6948 0000DE31 770E                <1> 	ja	short cpass_1
  6949 0000DE33 833D[74470100]00    <1> 	cmp     dword [u.ppgdir], 0  ; is the caller os kernel
  6950 0000DE3A 7427                <1>         je      short cpass_k       ; (sysexec, '/etc/init') ?  (MainProg)
  6951 0000DE3C E867FDFFFF          <1> 	call	trans_addr_r
  6952                              <1> cpass_1:
  6953 0000DE41 66FF0D[7C470100]    <1> 	dec	word [u.pcount]
  6954                              <1> cpass_2: 
  6955 0000DE48 8B15[78470100]      <1> 	mov	edx, [u.pbase]
  6956 0000DE4E 8A02                <1> 	mov	al, [edx]	; take the character pointed to 
  6957                              <1> 				; by u.base and put it in r1
  6958 0000DE50 FF05[44470100]      <1> 	inc	dword [u.nread] ; increment no. of bytes transferred
  6959 0000DE56 FF05[3C470100]      <1> 	inc	dword [u.base]  ; increment the buffer address to point to the
  6960                              <1> 			        ; next byte
  6961 0000DE5C FF05[78470100]      <1> 	inc	dword [u.pbase]
  6962                              <1> cpass_3:
  6963 0000DE62 C3                  <1> 	retn
  6964                              <1> cpass_k:
  6965                              <1> 	; 02/07/2015
  6966                              <1> 	; The caller is os kernel 
  6967                              <1> 	; (get sysexec arguments from kernel's memory space)
  6968 0000DE63 8B1D[3C470100]      <1> 	mov	ebx, [u.base]
  6969 0000DE69 66C705[7C470100]00- <1>         mov     word [u.pcount], PAGE_SIZE ; 4096
  6969 0000DE71 10                  <1>
  6970 0000DE72 891D[78470100]      <1> 	mov	[u.pbase], ebx
  6971 0000DE78 EBCE                <1> 	jmp	short cpass_2
  6972                              <1> 
  6973                              <1> transfer_to_user_buffer: ; fast transfer
  6974                              <1> 	; 27/05/2016
  6975                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
  6976                              <1> 	;
  6977                              <1> 	; INPUT ->
  6978                              <1> 	;	ESI = source address in system space
  6979                              <1> 	;	EDI = user's buffer address
  6980                              <1> 	;	ECX = transfer (byte) count
  6981                              <1> 	;	[u.pgdir] = user's page directory
  6982                              <1> 	; OUTPUT ->
  6983                              <1> 	;	ECX = actual transfer count
  6984                              <1> 	;	cf = 1 -> error
  6985                              <1> 	;	[u.count] = remain byte count
  6986                              <1> 	;
  6987                              <1> 	; Modified registers: eax, ecx
  6988                              <1> 	;
  6989                              <1> 
  6990 0000DE7A 21C9                <1> 	and	ecx, ecx
  6991 0000DE7C 743B                <1> 	jz	short ttub_4
  6992                              <1> 
  6993 0000DE7E 890D[40470100]      <1> 	mov	[u.count], ecx
  6994                              <1> 	
  6995 0000DE84 57                  <1> 	push	edi
  6996 0000DE85 56                  <1> 	push	esi
  6997 0000DE86 53                  <1> 	push	ebx
  6998 0000DE87 52                  <1> 	push	edx
  6999 0000DE88 51                  <1> 	push	ecx
  7000                              <1> 
  7001 0000DE89 89FB                <1> 	mov	ebx, edi
  7002 0000DE8B 81C300004000        <1> 	add	ebx, CORE ; 27/05/2016
  7003                              <1> ttub_1:
  7004                              <1> 	; ebx = virtual (linear) address
  7005                              <1> 	; [u.pgdir] = user's page directory
  7006 0000DE91 E88773FFFF          <1>        	call	get_physical_addr_x ; get physical address
  7007 0000DE96 7222                <1> 	jc	short ttub_5
  7008                              <1> 	; eax = physical address 
  7009                              <1> 	; ecx = remain byte count in page (1-4096)
  7010 0000DE98 89C7                <1> 	mov	edi, eax
  7011 0000DE9A A1[40470100]        <1> 	mov	eax, [u.count]
  7012 0000DE9F 39C1                <1> 	cmp	ecx, eax
  7013 0000DEA1 7602                <1> 	jna	short ttub_2
  7014 0000DEA3 89C1                <1> 	mov	ecx, eax
  7015                              <1> ttub_2:	
  7016 0000DEA5 29C8                <1> 	sub	eax, ecx
  7017 0000DEA7 01CB                <1> 	add	ebx, ecx
  7018 0000DEA9 F3A4                <1> 	rep	movsb
  7019 0000DEAB A3[40470100]        <1> 	mov	[u.count], eax
  7020 0000DEB0 09C0                <1> 	or	eax, eax
  7021 0000DEB2 75DD                <1> 	jnz	short ttub_1
  7022                              <1> ttub_retn:
  7023                              <1> tfub_retn:
  7024 0000DEB4 59                  <1> 	pop	ecx ; transfer count = actual transfer count
  7025                              <1> ttub_3:
  7026 0000DEB5 5A                  <1> 	pop	edx
  7027 0000DEB6 5B                  <1> 	pop	ebx
  7028 0000DEB7 5E                  <1> 	pop	esi
  7029 0000DEB8 5F                  <1> 	pop	edi
  7030                              <1> ttub_4:
  7031 0000DEB9 C3                  <1> 	retn
  7032                              <1> ttub_5:
  7033 0000DEBA 59                  <1> 	pop	ecx
  7034 0000DEBB 2B0D[40470100]      <1> 	sub	ecx, [u.count] ; actual transfer count
  7035 0000DEC1 F9                  <1> 	stc
  7036 0000DEC2 EBF1                <1> 	jmp	short ttub_3
  7037                              <1> 
  7038                              <1> transfer_from_user_buffer: ; fast transfer
  7039                              <1> 	; 27/05/2016
  7040                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
  7041                              <1> 	;
  7042                              <1> 	; INPUT ->
  7043                              <1> 	;	ESI = user's buffer address
  7044                              <1> 	;	EDI = destination address in system space
  7045                              <1> 	;	ECX = transfer (byte) count
  7046                              <1> 	;	[u.pgdir] = user's page directory
  7047                              <1> 	; OUTPUT ->
  7048                              <1> 	;	ecx = actual transfer count
  7049                              <1> 	;	cf = 1 -> error
  7050                              <1> 	;	[u.count] = remain byte count
  7051                              <1> 	;
  7052                              <1> 	; Modified registers: eax, ecx
  7053                              <1> 	;
  7054                              <1> 
  7055 0000DEC4 21C9                <1> 	and	ecx, ecx
  7056                              <1> 	;jz	short tfub_4
  7057 0000DEC6 74F1                <1> 	jz	short ttub_4
  7058                              <1> 
  7059 0000DEC8 890D[40470100]      <1> 	mov	[u.count], ecx
  7060                              <1> 	
  7061 0000DECE 57                  <1> 	push	edi
  7062 0000DECF 56                  <1> 	push	esi
  7063 0000DED0 53                  <1> 	push	ebx
  7064 0000DED1 52                  <1> 	push	edx
  7065 0000DED2 51                  <1> 	push	ecx
  7066                              <1> 
  7067 0000DED3 89F3                <1> 	mov	ebx, esi
  7068 0000DED5 81C300004000        <1> 	add	ebx, CORE ; 27/05/2016
  7069                              <1> tfub_1:
  7070                              <1> 	; ebx = virtual (linear) address
  7071                              <1> 	; [u.pgdir] = user's page directory
  7072 0000DEDB E83D73FFFF          <1>        	call	get_physical_addr_x ; get physical address
  7073                              <1> 	;jc	short tfub_5
  7074 0000DEE0 72D8                <1> 	jc	short ttub_5
  7075                              <1> 	; eax = physical address 
  7076                              <1> 	; ecx = remain byte count in page (1-4096)
  7077 0000DEE2 89C6                <1> 	mov	esi, eax
  7078 0000DEE4 A1[40470100]        <1> 	mov	eax, [u.count]
  7079 0000DEE9 39C1                <1> 	cmp	ecx, eax
  7080 0000DEEB 7602                <1> 	jna	short tfub_2
  7081 0000DEED 89C1                <1> 	mov	ecx, eax
  7082                              <1> tfub_2:	
  7083 0000DEEF 29C8                <1> 	sub	eax, ecx
  7084 0000DEF1 01CB                <1> 	add	ebx, ecx
  7085 0000DEF3 F3A4                <1> 	rep	movsb
  7086 0000DEF5 A3[40470100]        <1> 	mov	[u.count], eax
  7087 0000DEFA 09C0                <1> 	or	eax, eax
  7088 0000DEFC 75DD                <1> 	jnz	short tfub_1
  7089                              <1> 
  7090 0000DEFE EBB4                <1> 	jmp	short tfub_retn
  7091                              <1> 
  7092                              <1> ;tfub_retn:
  7093                              <1> ;	pop	ecx ; transfer count = actual transfer count
  7094                              <1> ;tfub_3:
  7095                              <1> ;	pop	edx
  7096                              <1> ;	pop	ebx
  7097                              <1> ;	pop	esi
  7098                              <1> ;	pop	edi
  7099                              <1> ;tfub_4:
  7100                              <1> ;	retn
  7101                              <1> ;tfub_5:
  7102                              <1> ;	pop	ecx
  7103                              <1> ;	sub	ecx, [u.count] ; actual transfer count
  7104                              <1> ;	stc
  7105                              <1> ;	jmp	short tfub_3
  7106                              <1> 
  7107                              <1> sysfff: ; <Find First File>
  7108                              <1> 	; 17/10/2016
  7109                              <1> 	; 16/10/2016
  7110                              <1> 	; 15/10/2016 TRDOS 386 (TRDOS v2.0) feature only ! 
  7111                              <1> 	;           -derived from TRDOS v1.0, INT_21H.ASM-
  7112                              <1> 	;            ("loc_INT21h_find_first_file")
  7113                              <1> 	; TRDOS 8086 (v1.0)
  7114                              <1>         ; 	07/08/2011 
  7115                              <1>         ;	Find First File
  7116                              <1> 	;	INPUT:
  7117                              <1>         ;	    CX= Attributes
  7118                              <1>         ;	    DS:DX= Pointer to filename
  7119                              <1> 	;	MSDOS OUTPUT:
  7120                              <1> 	;	    DTA: (Default address: PSP offset 80h)
  7121                              <1> 	;	    Offset  Descrription
  7122                              <1> 	;	    0	    Reserved for use find next file
  7123                              <1> 	;	    21	    Attribute of file found
  7124                              <1> 	;	    22	    Time stamp of file
  7125                              <1> 	;	    24	    Date stamp of file
  7126                              <1> 	;	    26	    File size in bytes
  7127                              <1> 	;	    30	    Filename and extension (zero terminated)
  7128                              <1> 	;	If cf = 1:
  7129                              <1> 	;	    Error Codes: (in AX)
  7130                              <1> 	;	    	2 - File not found
  7131                              <1> 	;	       18 - No more files  			
  7132                              <1>         ;
  7133                              <1> 	; TRDOS 386 (v2.0) 
  7134                              <1> 	; 15/10/2016
  7135                              <1> 	;	
  7136                              <1>         ; INPUT ->
  7137                              <1>         ;	   CL = File attributes
  7138                              <1> 	;     	      bit 0 (1) - Read only file (R)
  7139                              <1> 	;             bit 1 (1) - Hidden file (H)
  7140                              <1>         ;             bit 2 (1) - System file (R)
  7141                              <1> 	;             bit 3 (1) - Volume label/name (V)
  7142                              <1>         ;             bit 4 (1) - Subdirectory (D)
  7143                              <1> 	;	      bit 5 (1) - File has been archived (A)
  7144                              <1> 	;	   CH = 0 -> Return basic parameters (24 bytes)
  7145                              <1> 	;	   CH > 0 -> Return FindFile structure/table (128 bytes)
  7146                              <1>         ;          EBX = Pointer to filename (ASCIIZ) -path-
  7147                              <1> 	;	   EDX = File parameters buffer address
  7148                              <1> 	;		(buffer size = 24 bytes if CH input = 0)
  7149                              <1> 	;		(buffer size = 128 bytes if CH input > 0)
  7150                              <1> 	;		 
  7151                              <1> 	; OUTPUT ->
  7152                              <1> 	;	   EAX = 0 if CH input > 0
  7153                              <1> 	;	   EAX = First cluster number of file if CH input = 0	
  7154                              <1> 	;	   EDX = File parameters table/structure address
  7155                              <1> 	;	   Basic Parameters:
  7156                              <1> 	;		Offset  Description
  7157                              <1> 	;		------	---------------
  7158                              <1> 	;		0	File Attributes
  7159                              <1> 	;		1	Ambiguous filename chars are used sign
  7160                              <1> 	;			(0 = filename fits exactly with request)
  7161                              <1> 	;			(>0 = ambiguous filename chars are used)
  7162                              <1> 	;	      	2	Time stamp of file
  7163                              <1> 	;		4	Date stamp of file
  7164                              <1> 	;		6	File size in bytes
  7165                              <1> 	;		10	Short Filename (ASCIIZ, max. 13 bytes)
  7166                              <1> 	;		23	Longname Length (1-255) if existing 
  7167                              <1> 	;  
  7168                              <1> 	;          cf = 1 -> Error code in AL
  7169                              <1> 	;
  7170                              <1> 	; Modified Registers: EAX (at the return of system call)
  7171                              <1> 	;  
  7172                              <1> 	; TR-DOS FindFile (FFF) Structure (128 bytes):
  7173                              <1> 	; 09/10/2011 (DIR.ASM) - 10/02/2016 (trdoskx.s)
  7174                              <1> 	;	
  7175                              <1> 	; Offset	Parameter		Size
  7176                              <1> 	; ------	------------------	-------- 
  7177                              <1> 	; 0		FindFile_Drv		1 byte
  7178                              <1> 	; 1		FindFile_Directory	65 bytes
  7179                              <1> 	; 66		FindFile_Name		13 bytes
  7180                              <1> 	; 79		FindFile_LongNameEntryLength 1 byte
  7181                              <1> 	;Above 80 bytes form
  7182                              <1> 	;TR-DOS Source/Destination File FullName Format/Structure
  7183                              <1> 	; 80		FindFile_AttributesMask 1 word
  7184                              <1> 	; 82		FindFile_DirEntry	32 bytes (*)
  7185                              <1> 	; 114		FindFile_DirFirstCluster 1 double word
  7186                              <1> 	; 118		FindFile_DirCluster	1 double word
  7187                              <1> 	; 122		FindFile_DirEntryNumber 1 word
  7188                              <1> 	; 124		FindFile_MatchCounter	1 word
  7189                              <1> 	; 126		FindFile_Reserved	1 word
  7190                              <1>    	; (*) MS-DOS, FAT 12-16-32 classic directory entry (32 bytes)
  7191                              <1> 
  7192                              <1> 	;mov	[u.namep], ebx
  7193                              <1> 	; 16/10/2016
  7194 0000DF00 8915[943E0100]      <1> 	mov	[FFF_UBuffer], edx
  7195 0000DF06 66890D[993E0100]    <1> 	mov	[FFF_Attrib], cx ; [FFF_RType] = ch
  7196                              <1> 		    ; Attributes in CL, return data type in CH
  7197 0000DF0D 89DE                <1> 	mov	esi, ebx
  7198                              <1> 	; file name is forced, change directory as temporary
  7199                              <1> 	;mov	ax, 1
  7200                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
  7201                              <1> 	;call	set_working_path 
  7202 0000DF0F E8620B0000          <1> 	call	set_working_path_x ; 17/10/2016	
  7203 0000DF14 731D                <1> 	jnc	short sysfff_0
  7204                              <1>  
  7205 0000DF16 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
  7206 0000DF18 7505                <1> 	jnz	short sysfff_err
  7207                              <1> 
  7208                              <1> 	; eax = 0
  7209 0000DF1A B80C000000          <1> 	mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
  7210                              <1> sysfff_err:
  7211 0000DF1F A3[1C470100]        <1> 	mov	[u.r0], eax
  7212 0000DF24 A3[80470100]        <1> 	mov	[u.error], eax
  7213 0000DF29 E81D0C0000          <1>         call 	reset_working_path
  7214 0000DF2E E95ADCFFFF          <1> 	jmp	error
  7215                              <1> 
  7216                              <1> sysfff_0:
  7217                              <1> 	;sub	ah, ah ; ah = 0
  7218 0000DF33 8A0424              <1> 	mov	al, [esp]
  7219 0000DF36 08C0                <1> 	or	al, al
  7220 0000DF38 7412                <1> 	jz	short sysfff_2
  7221 0000DF3A B410                <1> 	mov	ah, 10h
  7222 0000DF3C A808                <1> 	test	al, 08h
  7223 0000DF3E 7503                <1> 	jnz	short sysfff_1
  7224 0000DF40 80CC08              <1> 	or	ah, 08h
  7225                              <1> sysfff_1:
  7226 0000DF43 2410                <1> 	and	al, 10h ; Directory
  7227 0000DF45 7405                <1> 	jz	short sysfff_2
  7228 0000DF47 80E408              <1> 	and	ah, 08h
  7229 0000DF4A 30C0                <1> 	xor	al, al ; When a directory is searched,
  7230                              <1> 		       ; filename will be returned even if
  7231                              <1> 		       ; it is not a directory!
  7232                              <1> 		       ; Because: (in order to prevent
  7233                              <1> 		       ; creating a dir with existing file name)
  7234                              <1> 		       ; Dir and file names must not be same!
  7235                              <1> 		       ; (return attribute must be checked)  	  	 	
  7236                              <1> sysfff_2:
  7237                              <1> 	; AX = Attributes mask 
  7238                              <1> 		; AL = AND mask (result must be equal to AL)
  7239                              <1> 		; AH = Negative AND mask (result must be ZERO)			
  7240                              <1>  	; ESI = FindFile_Name address
  7241                              <1> 
  7242 0000DF4C E8AD97FFFF          <1> 	call	find_first_file
  7243 0000DF51 72CC                <1> 	jc	short sysfff_err ; eax = 2 (File not found !)
  7244                              <1> 
  7245                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
  7246                              <1> 	; EDI = Directory Buffer Directory Entry Location
  7247                              <1> 	; EAX = File Size
  7248                              <1> 	;  BL = Attributes of The File/Directory
  7249                              <1> 	;  BH = Long Name Yes/No Status (>0 is YES)
  7250                              <1> 	;  DX > 0 : Ambiguous filename chars are used
  7251                              <1> 
  7252                              <1> sysfff_3:
  7253                              <1> 	; 16/10/2016
  7254 0000DF53 668B0D[993E0100]    <1> 	mov	cx, [FFF_Attrib]
  7255                              <1> 	; Attribs in CL, return data type in CH
  7256                              <1> 
  7257                              <1> 	;or	cl, cl
  7258                              <1> 	;jz	short sysfff_4 ; 0 = No filter
  7259 0000DF5A 80F1FF              <1> 	xor	cl, 0FFh
  7260 0000DF5D 20D9                <1> 	and	cl, bl
  7261 0000DF5F 7409                <1> 	jz	short sysfff_4
  7262                              <1> 
  7263                              <1> 	;mov	eax, 2 ; 'file not found !' error
  7264                              <1> 	;jmp	short sysfff_err_1
  7265                              <1> 
  7266                              <1> 	; 16/10/2016
  7267 0000DF61 E84798FFFF          <1> 	call	find_next_file
  7268 0000DF66 72B7                <1> 	jc	short sysfff_err ; eax = 12 (no more files !)
  7269 0000DF68 EBE9                <1> 	jmp	short sysfff_3
  7270                              <1> 
  7271                              <1> sysfff_4:
  7272 0000DF6A 20ED                <1> 	and	ch, ch ; [FFF_RType]
  7273 0000DF6C 7412                <1> 	jz	short sysfff_5
  7274 0000DF6E B980000000          <1> 	mov	ecx, 128 ; ; transfer length
  7275 0000DF73 880D[983E0100]      <1> 	mov	[FFF_Valid], cl
  7276                              <1> sysfnf_11:
  7277 0000DF79 BE[4A3B0100]        <1> 	mov	esi, FindFile_Drv
  7278 0000DF7E EB44                <1> 	jmp	short sysfff_6	
  7279                              <1> sysfff_5:
  7280                              <1> 	;mov	esi, FindFile_DirEntry
  7281 0000DF80 B918000000          <1> 	mov	ecx, 24  ; transfer length
  7282 0000DF85 880D[983E0100]      <1> 	mov	[FFF_Valid], cl
  7283                              <1> sysfnf_12:
  7284 0000DF8B BF[54430100]        <1> 	mov	edi, DTA ; FFF data transfer address
  7285                              <1> 	;mov	al, [esi+DirEntry_Attr] ; 11
  7286 0000DF90 88D8                <1> 	mov	al, bl ; File/Dir Attributes
  7287 0000DF92 887F17              <1> 	mov	[edi+23], bh ; Longname length (0= none)
  7288 0000DF95 AA                  <1> 	stosb
  7289 0000DF96 88D0                <1> 	mov	al, dl ; DL is for '?'
  7290 0000DF98 00F0                <1> 	add	al, dh ; DH is for '*'
  7291                              <1> 	; AL > 0 if ambiguous file name wildcards are used
  7292 0000DF9A AA                  <1> 	stosb
  7293 0000DF9B 8B4616              <1> 	mov	eax, [esi+DirEntry_WrtTime] ; 22	
  7294 0000DF9E AB                  <1>         stosd	; DirEntry_WrtTime & DirEntry_WrtDate
  7295 0000DF9F 8B461C              <1>         mov	eax, [esi+DirEntry_FileSize] ; 28
  7296 0000DFA2 AB                  <1>         stosd
  7297 0000DFA3 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI] ; 20
  7298 0000DFA7 66C1E010            <1> 	shl	ax, 16
  7299 0000DFAB 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO] ; 26 
  7300 0000DFAF A3[1C470100]        <1> 	mov	[u.r0], eax ; First Cluster
  7301                              <1> 
  7302                              <1>         ;mov	esi, FindFile_DirEntry
  7303 0000DFB4 E8CF0B0000          <1> 	call	get_file_name
  7304                              <1> 
  7305 0000DFB9 8A0D[983E0100]      <1> 	mov	cl, [FFF_Valid]
  7306 0000DFBF BE[54430100]        <1>        	mov	esi, DTA ; FFF data transfer address
  7307                              <1> sysfff_6:
  7308 0000DFC4 8B3D[943E0100]      <1> 	mov	edi, [FFF_UBuffer] ; user's buffer address (edx)
  7309 0000DFCA E8ABFEFFFF          <1> 	call	transfer_to_user_buffer
  7310                              <1> 
  7311 0000DFCF 890D[1C470100]      <1> 	mov	[u.r0], ecx ; actual transfer count
  7312 0000DFD5 E8710B0000          <1>         call 	reset_working_path
  7313 0000DFDA E9CEDBFFFF          <1> 	jmp	sysret
  7314                              <1> 
  7315                              <1> sysfnf: ; <Find Next File>
  7316                              <1> 	; 16/10/2016 TRDOS 386 (TRDOS v2.0) feature only ! 
  7317                              <1> 	;           -derived from TRDOS v1.0, INT_21H.ASM-
  7318                              <1> 	;            ("loc_INT21h_find_next_file")
  7319                              <1> 	; TRDOS 8086 (v1.0)
  7320                              <1>         ; 	07/08/2011 
  7321                              <1>         ;	Find First File
  7322                              <1> 	;	INPUT:
  7323                              <1>         ;	    none
  7324                              <1> 	;	MSDOS OUTPUT:
  7325                              <1> 	;	    DTA: (Default address: PSP offset 80h)
  7326                              <1> 	;	    Offset  Descrription
  7327                              <1> 	;	    0	    Reserved for use find next file
  7328                              <1> 	;	    21	    Attribute of file found
  7329                              <1> 	;	    22	    Time stamp of file
  7330                              <1> 	;	    24	    Date stamp of file
  7331                              <1> 	;	    26	    File size in bytes
  7332                              <1> 	;	    30	    Filename and extension (zero terminated)
  7333                              <1> 	;	If cf = 1:
  7334                              <1> 	;	    Error Codes: (in AX)
  7335                              <1> 	;	       18 - No more files  			
  7336                              <1>         ;
  7337                              <1> 	; TRDOS 386 (v2.0) 
  7338                              <1> 	; 16/10/2016
  7339                              <1> 	;	
  7340                              <1>         ; INPUT ->
  7341                              <1>        	; 	   none
  7342                              <1> 	; OUTPUT ->
  7343                              <1> 	;	   EAX = 0 if CH input of 'Find First File' > 0
  7344                              <1> 	;	   EAX = First cluster number of file
  7345                              <1> 	;		 if CH input of 'Find First File' = 0	
  7346                              <1> 	;	   EDX = File parameters table/structure address
  7347                              <1> 	;
  7348                              <1> 	;          cf = 1 -> Error code in AL
  7349                              <1> 	;
  7350                              <1>  	; Modified Registers: EAX (at the return of system call)	
  7351                              <1> 
  7352                              <1> 	;	
  7353                              <1> 	; Note: If byte [FFF_Valid] = 0
  7354                              <1> 	;	'sysfnf' will return with 'no more files' error.
  7355                              <1> 	;	If byte [FFF_Valid] = 24
  7356                              <1> 	;	'sysfnf' will return with 32 bytes basic parameters
  7357                              <1> 	;	at the address which is in EDX.
  7358                              <1> 	;	If byte [FFF_Valid] = 128
  7359                              <1> 	;	'sysfnf' will return with 128 bytes Find File 
  7360                              <1> 	;	Structure/Table at the address which is in EDX.
  7361                              <1> 	
  7362 0000DFDF 803D[983E0100]00    <1> 	cmp	byte [FFF_Valid], 0
  7363 0000DFE6 7714                <1> 	ja	short stsfnf_0
  7364                              <1>  	; 'no more files !' error 
  7365 0000DFE8 B80C000000          <1> 	mov	eax, ERR_NO_MORE_FILES ; 12
  7366 0000DFED A3[1C470100]        <1> 	mov	[u.r0], eax
  7367 0000DFF2 A3[80470100]        <1> 	mov	[u.error], eax
  7368 0000DFF7 E991DBFFFF          <1> 	jmp	error
  7369                              <1> stsfnf_0:
  7370                              <1> 	;cmp	byte [FFF_Valid], 128
  7371                              <1> 	;je	short stsfnf_1
  7372                              <1> 	;cmp	byte [FFF_Valid], 24
  7373                              <1> 	;je	short stsfnf_1
  7374                              <1> 	;mov	[FFF_Valid], 24 ; Default
  7375                              <1> stsfnf_1:
  7376 0000DFFC 0FB61D[A6310100]    <1> 	movzx	ebx, byte [Current_Drv]
  7377 0000E003 66891D[9E3E0100]    <1> 	mov	[SWP_DRV], bx
  7378 0000E00A 8A15[4A3B0100]      <1> 	mov	dl, [FindFile_Drv]
  7379 0000E010 38DA                <1> 	cmp	dl, bl
  7380 0000E012 750B                <1> 	jne	short stsfnf_2
  7381 0000E014 86FB                <1> 	xchg	bh, bl
  7382 0000E016 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  7383 0000E01B 01DE                <1> 	add	esi, ebx
  7384 0000E01D EB0D                <1> 	jmp	short sysfnf_3
  7385                              <1> 
  7386                              <1> stsfnf_2:
  7387 0000E01F FE05[9F3E0100]      <1> 	inc	byte [SWP_DRV_chg]
  7388                              <1> 
  7389 0000E025 E84283FFFF          <1> 	call	change_current_drive
  7390 0000E02A 7245                <1> 	jc	short sysfnf_err_1 ; read error ! 
  7391                              <1> 				   ; (do not stop, because
  7392                              <1> 				   ; we don't have a
  7393                              <1> 				   ; 'no more files'
  7394                              <1> 				   ; -file not found- error,	
  7395                              <1> 				   ; next sysfnf system call
  7396                              <1> 				   ; may solve the problem,
  7397                              <1> 				   ; after re-placing the disk)				
  7398                              <1> sysfnf_3:
  7399 0000E02C A1[C03B0100]        <1> 	mov	eax, [FindFile_DirCluster]
  7400 0000E031 21C0                <1> 	and	eax, eax
  7401 0000E033 7550                <1> 	jnz	short sysfnf_6
  7402                              <1>         
  7403 0000E035 803D[A5310100]02    <1> 	cmp	byte [Current_FATType], 2
  7404 0000E03C 772C                <1> 	ja	short sysfnf_err_0 ; invalid, we neeed to stop !?
  7405 0000E03E 803D[A5310100]01    <1> 	cmp	byte [Current_FATType], 1
  7406 0000E045 7223                <1> 	jb	short sysfnf_err_0 ; invalid, we neeed to stop !?
  7407                              <1> 
  7408 0000E047 3805[D0390100]      <1> 	cmp	byte [DirBuff_ValidData], al ; 0
  7409 0000E04D 7608                <1> 	jna	short sysfnf_4 
  7410                              <1> 
  7411 0000E04F 3B05[D5390100]      <1> 	cmp	eax, [DirBuff_Cluster] ; 0 ?
  7412 0000E055 745E                <1> 	je	short sysfnf_9
  7413                              <1> 
  7414                              <1> 	;cmp	byte [Current_Dir_Level], 0
  7415                              <1>         ;ja	short sysfnf_4  
  7416                              <1>         ;jna	short sysfnf_9 
  7417                              <1> 
  7418                              <1> sysfnf_4:
  7419 0000E057 FE05[9F3E0100]      <1> 	inc	byte [SWP_DRV_chg]
  7420 0000E05D E825D1FFFF          <1> 	call 	load_FAT_root_directory
  7421 0000E062 7351                <1> 	jnc	short sysfnf_9
  7422                              <1> 	; eax = error code (17, 'drv not ready or read error')
  7423 0000E064 EB0B                <1> 	jmp	short sysfnf_err_1 ; read error ! (no FNF stop)
  7424                              <1> 				   ; (if you want, try again, 
  7425                              <1> 				   ;  after re-placing the disk)
  7426                              <1> sysfnf_5:	
  7427 0000E066 3C0C                <1> 	cmp	al, 12 ; 'no more files' error
  7428 0000E068 7507                <1> 	jne	short sysfnf_err_1 ; (no FNF stop -sysfnf will try
  7429                              <1> 				   ;  to read the directory again,
  7430                              <1> 				   ;  if the user calls sysfnf
  7431                              <1> 				   ;  just after this error return-)
  7432                              <1> 	; (FNF stop -sysfnf will not try
  7433                              <1> 	;  to read the directory again-)	
  7434                              <1> 
  7435                              <1> sysfnf_err_0:
  7436 0000E06A C605[983E0100]00    <1> 	mov	byte [FFF_Valid], 0 ; FNF stop sign
  7437                              <1> sysfnf_err_1:
  7438 0000E071 A3[1C470100]        <1> 	mov	[u.r0], eax
  7439 0000E076 A3[80470100]        <1> 	mov	[u.error], eax
  7440 0000E07B E8CB0A0000          <1> 	call	reset_working_path
  7441 0000E080 E908DBFFFF          <1> 	jmp	error
  7442                              <1> 	  
  7443                              <1> sysfnf_6:
  7444 0000E085 803D[D0390100]00    <1> 	cmp	byte [DirBuff_ValidData], 0
  7445 0000E08C 7608                <1> 	jna	short sysfnf_7
  7446                              <1> 
  7447 0000E08E 3B05[D5390100]      <1> 	cmp	eax, [DirBuff_Cluster]
  7448 0000E094 741F                <1> 	je	short sysfnf_9
  7449                              <1> 
  7450                              <1> sysfnf_7:
  7451 0000E096 FE05[9F3E0100]      <1> 	inc	byte [SWP_DRV_chg]
  7452 0000E09C 803D[A5310100]01    <1> 	cmp	byte [Current_FATType], 1
  7453 0000E0A3 7309                <1> 	jnb	short sysfnf_8
  7454                              <1> 
  7455                              <1> 	; Singlix (TRFS) File System 
  7456                              <1> 	; (access via compatibility buffer)
  7457 0000E0A5 E8A5D1FFFF          <1> 	call	load_FS_sub_directory
  7458 0000E0AA 7309                <1> 	jnc	short sysfnf_9
  7459                              <1> 
  7460 0000E0AC EBC3                <1> 	jmp	short sysfnf_err_1 ; read error (no FNF stop)
  7461                              <1> 
  7462                              <1> sysfnf_8:
  7463 0000E0AE E85FD1FFFF          <1> 	call	load_FAT_sub_directory	 
  7464 0000E0B3 72BC                <1> 	jc	short sysfnf_err_1 ; read error (no FNF stop)
  7465                              <1> 
  7466                              <1> sysfnf_9:
  7467 0000E0B5 E8F396FFFF          <1> 	call	find_next_file
  7468 0000E0BA 72AA                <1> 	jc	short sysfnf_5
  7469                              <1> 
  7470 0000E0BC A0[993E0100]        <1> 	mov	al, [FFF_Attrib]
  7471                              <1> 	;or	al, al
  7472                              <1> 	;jz	short sysfnf_10 ; 0 = No filter
  7473 0000E0C1 34FF                <1> 	xor	al, 0FFh
  7474 0000E0C3 20D8                <1> 	and	al, bl
  7475 0000E0C5 75EE                <1> 	jnz	short sysfnf_9 ; search for next file until
  7476                              <1> 			       ; an error return from
  7477                              <1> 			       ; find_next_file procedure	
  7478                              <1> sysfnf_10:
  7479 0000E0C7 0FB60D[983E0100]    <1>         movzx	ecx, byte [FFF_Valid]
  7480 0000E0CE 80F980              <1> 	cmp	cl, 128 ; complete FindFile structure/table 
  7481 0000E0D1 0F84A2FEFFFF        <1> 	je	sysfnf_11
  7482                              <1> 	;cmp	cl, 24  ; basic parameters
  7483                              <1> 	;je	sysfnf_12       
  7484 0000E0D7 E9AFFEFFFF          <1> 	jmp	sysfnf_12
  7485                              <1> 
  7486                              <1> writei:
  7487                              <1> 	; 26/10/2016
  7488                              <1> 	; 25/10/2016
  7489                              <1> 	; 23/10/2016
  7490                              <1> 	; 22/10/2016
  7491                              <1> 	; 19/10/2016 - TRDOS 386 (TRDOS v2.0)
  7492                              <1> 	; 19/05/2015 - 20/05/2015 (Retro UNIX 386 v1)
  7493                              <1> 	; 12/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
  7494                              <1> 	;
  7495                              <1> 	; Write data to file with first cluster number in EAX
  7496                              <1> 	; 
  7497                              <1> 	; INPUTS ->
  7498                              <1> 	;    EAX - First cluster number of the file
  7499                              <1> 	;    EBX - File number (Open file index number)
  7500                              <1> 	;    u.count - byte count to be written
  7501                              <1> 	;    u.base - points to user buffer
  7502                              <1> 	;    u.fofp - points to dword with current file offset
  7503                              <1> 	;    i.size - file size
  7504                              <1> 	;    cdev - logical dos drive number of the file
  7505                              <1> 	; OUTPUTS ->
  7506                              <1> 	;    u.count - cleared
  7507                              <1> 	;    u.nread - accumulates total bytes passed back
  7508                              <1> 	;    i.size - new file size (if file byte offset overs file size)
  7509                              <1> 	;    u.fofp - points to u.off (with new offset value)	
  7510                              <1> 	;
  7511                              <1> 	; (Retro UNIX Prototype : 11/11/2012 - 18/11/2012, UNIXCOPY.ASM)
  7512                              <1> 	; ((Modified registers: eax, edx, ebx, ecx, esi, edi, ebp)) 	
  7513                              <1> 
  7514 0000E0DC 31C9                <1> 	xor	ecx, ecx
  7515 0000E0DE 890D[44470100]      <1> 	mov 	[u.nread], ecx  ; 0
  7516 0000E0E4 66890D[7C470100]    <1> 	mov	[u.pcount], cx ; 19/05/2015
  7517 0000E0EB 390D[40470100]      <1> 	cmp 	[u.count], ecx
  7518 0000E0F1 7701                <1> 	ja 	short writei_1 
  7519 0000E0F3 C3                  <1> 	retn
  7520                              <1> writei_1:
  7521 0000E0F4 881D[583E0100]      <1> 	mov	[writei.ofn], bl ; Open file number
  7522 0000E0FA 880D[933E0100]      <1> 	mov	[setfmod], cl ; 0 ; reset 'update lm date&time' sign
  7523                              <1> dskw_0: 
  7524                              <1> 	; 26/10/2016
  7525                              <1> 	; 22/10/2016, 23/10/2016, 25/10/2016
  7526                              <1> 	; 19/10/2016 - TRDOS 386 (TRDOS v2.0)
  7527                              <1> 	; 31/05/2015 - 25/07/2015 (Retro UNIX 386 v1)
  7528                              <1> 	; 26/04/2013 - 20/09/2013 (Retro UNIX 8086 v1)
  7529                              <1> 	;
  7530                              <1> 	; 01/08/2013 (mkdir_w check)
  7531 0000E100 E8D7000000          <1>  	call	mget_w
  7532                              <1> 	; eax = sector/block number
  7533                              <1> 
  7534 0000E105 8B1D[2C470100]      <1> 	mov     ebx, [u.fofp]
  7535 0000E10B 8B13                <1> 	mov	edx, [ebx]
  7536 0000E10D 81E2FF010000        <1> 	and	edx, 1FFh  ; / test the lower 9 bits of the file offset
  7537 0000E113 750C                <1> 	jnz	short dskw_1 ; / if its non-zero, branch
  7538                              <1> 			     ; if zero, file offset = 0,
  7539                              <1> 		       	     ; / 512, 1024,...(i.e., start of new block)
  7540 0000E115 813D[40470100]0002- <1> 	cmp	dword [u.count], 512
  7540 0000E11D 0000                <1>
  7541                              <1> 				; / if zero, is there enough data to fill
  7542                              <1> 				; / an entire block? (i.e., no. of
  7543 0000E11F 7337                <1> 	jnb	short dskw_2 ; / bytes to be written greater than 512.? 
  7544                              <1> 			     ; / Yes, branch. Don't have to read block
  7545                              <1> dskw_1: ; in as no past info. is to be saved 
  7546                              <1> 	; (the entire block will be overwritten).
  7547                              <1> 	; 23/10/2016
  7548                              <1> 
  7549 0000E121 BB[E84A0100]        <1> 	mov	ebx, writei_buffer
  7550                              <1> 	; esi = logical dos drive description table address
  7551                              <1> 	; eax = sector number
  7552                              <1> 	; ebx = buffer address (in kernel's memory space)
  7553                              <1> 	; ecx = sector count
  7554 0000E126 B901000000          <1> 	mov	ecx, 1
  7555 0000E12B E841050000          <1> 	call	disk_read
  7556                              <1> 	;call	dskrd 	; / no, must retain old info.. 
  7557                              <1> 		       	; / Hence, read block 'r1' into an I/O buffer
  7558 0000E130 7326                <1> 	jnc	short dskw_2
  7559                              <1> 
  7560                              <1> 	; disk read error
  7561 0000E132 B811000000          <1> 	mov	eax, 17 ; drive not ready or READ ERROR !
  7562                              <1> dskw_err: ; jump from disk write error
  7563 0000E137 A3[1C470100]        <1> 	mov	[u.r0], eax
  7564 0000E13C A3[80470100]        <1> 	mov	[u.error], eax
  7565                              <1> 
  7566 0000E141 803D[933E0100]00    <1> 	cmp	byte [setfmod], 0
  7567 0000E148 0F863FDAFFFF        <1> 	jna	error
  7568                              <1> 
  7569 0000E14E E8AF030000          <1> 	call	update_file_lmdt ; update last modif. date&time of the file
  7570                              <1> 	;mov	byte [setfmod], 0	
  7571                              <1> 
  7572 0000E153 E935DAFFFF          <1> 	jmp	error
  7573                              <1> 
  7574                              <1> dskw_2: ; 3:
  7575                              <1> 	; 23/10/2016
  7576 0000E158 C605[343E0100]01    <1> 	mov	byte [writei.valid], 1 ; writei buffer contains valid data
  7577 0000E15F 56                  <1> 	push	esi ; logical dos drive description table address
  7578                              <1> 	; EAX (r1) = block/sector number
  7579                              <1> 	;call	wslot
  7580                              <1> 		; jsr r0,wslot / set write and inhibit bits in I/O queue, 
  7581                              <1> 			   ; / proc. status=0, r5 points to 1st word of data
  7582 0000E160 803D[7E470100]00    <1> 	cmp	byte [u.kcall], 0
  7583 0000E167 770F                <1> 	ja	short dskw_4 ; zf=0 -> the caller is 'mkdir'
  7584                              <1> 	;
  7585 0000E169 66833D[7C470100]00  <1> 	cmp	word [u.pcount], 0
  7586 0000E171 7705                <1> 	ja	short dskw_4
  7587                              <1> dskw_3:
  7588                              <1> 	; [u.base] = virtual address to transfer (as source address)
  7589 0000E173 E830FAFFFF          <1> 	call	trans_addr_r ; translate virtual address to physical (r)
  7590                              <1> dskw_4:
  7591 0000E178 BB[E84A0100]        <1> 	mov	ebx, writei_buffer
  7592                              <1> 	; EBX (r5) = system (I/O) buffer address
  7593 0000E17D E892FAFFFF          <1> 	call	sioreg
  7594                              <1> 	; ESI = file (user data) offset
  7595                              <1> 	; EDI = sector (I/O) buffer offset
  7596                              <1> 	; ECX = byte count
  7597                              <1> 	;
  7598 0000E182 F3A4                <1>   	rep	movsb
  7599                              <1> 	; 25/07/2015
  7600                              <1> 	; eax = remain bytes in buffer
  7601                              <1>         ;       (check if remain bytes in the buffer > [u.pcount])
  7602 0000E184 09C0                <1> 	or	eax, eax
  7603 0000E186 75EB                <1> 	jnz	short dskw_3 ; (page end before system buffer end!)	
  7604                              <1> 
  7605                              <1> 	; 23/10/2016
  7606 0000E188 B101                <1> 	mov	cl, 1
  7607 0000E18A 5E                  <1> 	pop	esi
  7608 0000E18B A1[383E0100]        <1> 	mov	eax, [writei.sector]
  7609                              <1> 	; esi = logical dos drive description table address
  7610                              <1> 	; eax = sector number
  7611                              <1> 	; ebx = writei buffer address
  7612                              <1> 	; ecx = sector count
  7613 0000E190 E8CD040000          <1> 	call	disk_write ; / yes, write the block
  7614 0000E195 7307                <1> 	jnc	short dskw_5
  7615                              <1> 
  7616 0000E197 B812000000          <1> 	mov	eax, 18 ; drive not ready or WRITE ERROR !
  7617 0000E19C EB99                <1> 	jmp	short dskw_err
  7618                              <1> 
  7619                              <1> dskw_5:
  7620                              <1> 	; 26/10/2016
  7621 0000E19E 0FB61D[583E0100]    <1> 	movzx	ebx, byte [writei.ofn] ; open file number
  7622 0000E1A5 C0E302              <1> 	shl	bl, 2 ; *4
  7623 0000E1A8 8B83[28420100]      <1> 	mov	eax, [ebx+OF_POINTER]
  7624 0000E1AE 3B83[50420100]      <1> 	cmp	eax, [ebx+OF_SIZE]
  7625 0000E1B4 7606                <1> 	jna	short dskw_6
  7626 0000E1B6 8983[50420100]      <1> 	mov	[ebx+OF_SIZE], eax
  7627                              <1> dskw_6:
  7628                              <1> 	;shr	bl, 2
  7629 0000E1BC 833D[40470100]00    <1>         cmp     dword [u.count], 0 ; / any more data to write?
  7630 0000E1C3 760A                <1> 	jna	short dskw_7
  7631 0000E1C5 A1[483E0100]        <1> 	mov	eax, [writei.fclust]
  7632 0000E1CA E931FFFFFF          <1> 	jmp	dskw_0 ; / yes, branch
  7633                              <1> dskw_7:
  7634                              <1>  	; update last modif. date&time of the file
  7635                              <1> 	; (also updates file size as OF_SIZE)
  7636 0000E1CF E82E030000          <1> 	call	update_file_lmdt
  7637                              <1> 	;mov	byte [setfmod], 0	
  7638                              <1> 
  7639                              <1> 	; 03/08/2013
  7640 0000E1D4 C605[7E470100]00    <1> 	mov	byte [u.kcall], 0
  7641                              <1> 	; 23/10/2016
  7642                              <1> 	;mov	eax, [writei.fclust]
  7643 0000E1DB C3                  <1> 	retn
  7644                              <1> 
  7645                              <1> mget_w:
  7646                              <1> 	; 02/11/2016
  7647                              <1> 	; 01/11/2016
  7648                              <1> 	; 23/10/2016, 31/10/2016
  7649                              <1> 	; 22/10/2016 - TRDOS 386 (TRDOS v2.0)
  7650                              <1> 	; 03/06/2015 (Retro UNIX 386 v1, 'mget', u.5s)
  7651                              <1> 	; 22/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
  7652                              <1> 	;
  7653                              <1> 	; Get existing or (allocate) a new disk block for file
  7654                              <1> 	; 
  7655                              <1> 	; INPUTS ->
  7656                              <1> 	;    [u.fofp] = file offset pointer
  7657                              <1> 	;    [i.size] = file size
  7658                              <1> 	;    [u.count] = byte count	 
  7659                              <1> 	;    EAX = First cluster
  7660                              <1> 	;    [cdev] = Logical dos drive number 	  
  7661                              <1> 	;    [writei.ofn] = File Number
  7662                              <1> 	;		   (Open file index, 0 based)
  7663                              <1> 	;    ([u.off] = file offset)
  7664                              <1> 	; OUTPUTS ->
  7665                              <1> 	;    EAX = logical sector number
  7666                              <1> 	;    ESI = Logical Dos Drive Description Table address
  7667                              <1> 	;
  7668                              <1> 	; Modified registers: EDX, EBX, ECX, ESI, EDI, EBP  
  7669                              <1> 
  7670 0000E1DC 8B35[2C470100]      <1>         mov     esi, [u.fofp]
  7671 0000E1E2 8B2E                <1> 	mov	ebp, [esi] ; u.off (or EBX*4+OF_POINTER)
  7672                              <1> 
  7673 0000E1E4 29C9                <1> 	sub	ecx, ecx
  7674 0000E1E6 8A2D[FE460100]      <1> 	mov	ch, [cdev]
  7675                              <1> 
  7676 0000E1EC BE00010900          <1> 	mov	esi, Logical_DOSDisks
  7677 0000E1F1 01CE                <1> 	add	esi, ecx
  7678                              <1> 
  7679                              <1> 	; 31/10/2016
  7680 0000E1F3 89C3                <1> 	mov	ebx, eax ; First Cluster or FDT address
  7681                              <1> 
  7682 0000E1F5 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  7683 0000E1F9 0F86DD010000        <1> 	jna	mget_w_14 ; Singlix FS
  7684                              <1> 
  7685 0000E1FF 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
  7686 0000E203 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
  7687 0000E207 8815[363E0100]      <1> 	mov	[writei.spc], dl  ; sectors per cluster
  7688 0000E20D F7E2                <1> 	mul	edx
  7689                              <1> 	; edx = 0
  7690                              <1> 	; eax = bytes per cluster (<= 65536)
  7691                              <1> 
  7692                              <1> 	; 02/11/2016
  7693 0000E20F 89C1                <1> 	mov	ecx, eax
  7694 0000E211 48                  <1> 	dec	eax
  7695 0000E212 66A3[3C3E0100]      <1> 	mov	[writei.bpc], ax	
  7696                              <1> 	
  7697 0000E218 89E8                <1> 	mov	eax, ebp
  7698 0000E21A 0305[40470100]      <1> 	add	eax, [u.count] ; next file position
  7699 0000E220 3B05[A9470100]      <1> 	cmp	eax, [i.size] ; <= file size ?
  7700 0000E226 0F86FC000000        <1> 	jna	mget_w_4 ; no
  7701                              <1> 
  7702 0000E22C F7F1                <1> 	div	ecx
  7703 0000E22E A3[443E0100]        <1> 	mov	[writei.c_index], eax ; cluster index
  7704                              <1> 	; edx = byte offset in cluster (<= 65535)
  7705                              <1> 	;mov	[writei.offset], dx
  7706                              <1> 	;shr	dx, 9 ; / 512
  7707                              <1> 	;mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
  7708                              <1> 
  7709 0000E233 29D2                <1> 	sub	edx, edx ; 01/11/2016
  7710 0000E235 8915[383E0100]      <1> 	mov 	[writei.sector], edx ; 0
  7711 0000E23B 668915[3E3E0100]    <1> 	mov	[writei.offset], dx  ; byte offset in cluster 
  7712 0000E242 8815[373E0100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
  7713                              <1> 
  7714 0000E248 89D8                <1> 	mov	eax, ebx ; First Cluster
  7715                              <1> 
  7716                              <1> 	; is this the 1st mget_w or a next mget_w call ? (by 'writei')
  7717 0000E24A 3815[343E0100]      <1> 	cmp	byte [writei.valid], dl ; 0 
  7718 0000E250 7624                <1> 	jna	short mget_w_0
  7719                              <1> 
  7720 0000E252 8815[343E0100]      <1> 	mov 	byte [writei.valid], dl ; 0 ; reset ('writei' will set it) 
  7721                              <1> 
  7722 0000E258 3B05[483E0100]      <1> 	cmp	eax, [writei.fclust]
  7723 0000E25E 7516                <1> 	jne	short mget_w_0
  7724                              <1> 
  7725 0000E260 8A0D[FE460100]      <1> 	mov	cl, [cdev]
  7726 0000E266 3A0D[353E0100]      <1> 	cmp	cl, [writei.drv]
  7727 0000E26C 7508                <1> 	jne	short mget_w_0
  7728                              <1>  	; [writei.l_clust] & [writei.l_index] are valid, 
  7729                              <1> 	;  we don't need to get last cluster & last cluster index
  7730 0000E26E 8B0D[543E0100]      <1> 	mov	ecx, [writei.l_index]
  7731 0000E274 EB64                <1> 	jmp	short mget_w_2
  7732                              <1> mget_w_0:
  7733 0000E276 A3[483E0100]        <1> 	mov	[writei.fclust], eax ; first cluster
  7734                              <1> 	; edx = 0
  7735 0000E27B A3[403E0100]        <1> 	mov	[writei.cluster], eax ; first cluster ; 01/11/2016
  7736 0000E280 8915[4C3E0100]      <1> 	mov 	[writei.fs_index], edx ; 0 ; curret cluster index
  7737                              <1> 
  7738                              <1> 	; FAT file system (FAT12, FAT16, FAT32)
  7739 0000E286 E89CD5FFFF          <1> 	call	get_last_cluster
  7740 0000E28B 0F822B010000        <1> 	jc	mget_w_err ; eax = error code
  7741                              <1> 		
  7742 0000E291 A3[503E0100]        <1> 	mov	[writei.lclust], eax ; last cluster
  7743                              <1> 
  7744 0000E296 8B0D[743C0100]      <1> 	mov	ecx, [glc_index] ; last cluster index
  7745 0000E29C 890D[543E0100]      <1> 	mov	[writei.l_index], ecx
  7746                              <1> 
  7747 0000E2A2 A0[583E0100]        <1> 	mov	al, [writei.ofn]
  7748 0000E2A7 FEC0                <1> 	inc	al
  7749 0000E2A9 A2[933E0100]        <1> 	mov	[setfmod], al ; update lm date&time sign
  7750                              <1> 
  7751                              <1> mget_w_1:
  7752 0000E2AE 3B0D[443E0100]      <1> 	cmp	ecx, [writei.c_index]  ; last cluster index
  7753 0000E2B4 7324                <1> 	jnb	short mget_w_2 ; 01/11/2016
  7754                              <1> 
  7755 0000E2B6 A1[503E0100]        <1> 	mov	eax, [writei.lclust]
  7756                              <1> 	; EAX = Last cluster
  7757 0000E2BB E875D6FFFF          <1> 	call	add_new_cluster
  7758 0000E2C0 0F82F6000000        <1> 	jc	mget_w_err ; eax = error code
  7759                              <1> 	; edx = 0
  7760 0000E2C6 A3[503E0100]        <1> 	mov	[writei.lclust], eax ; (new) last cluster
  7761 0000E2CB 8B0D[543E0100]      <1> 	mov	ecx, [writei.l_index]
  7762 0000E2D1 41                  <1> 	inc	ecx ; add 1 to last cluster index
  7763 0000E2D2 890D[543E0100]      <1> 	mov	[writei.l_index], ecx ; current last cluster index
  7764                              <1> 
  7765 0000E2D8 EBD4                <1> 	jmp	short mget_w_1
  7766                              <1> 
  7767                              <1> mget_w_2:
  7768 0000E2DA 89E9                <1> 	mov	ecx, ebp
  7769 0000E2DC 030D[40470100]      <1> 	add	ecx, [u.count]
  7770 0000E2E2 890D[A9470100]      <1> 	mov	[i.size], ecx ; save new file size
  7771                              <1> 	;sub	edx, edx ; 0
  7772                              <1> 
  7773 0000E2E8 A0[FE460100]        <1> 	mov	al, [cdev]
  7774 0000E2ED A2[353E0100]        <1> 	mov	[writei.drv], al ; physical drive number
  7775                              <1> 	; edx = 0
  7776 0000E2F2 89E8                <1> 	mov	eax, ebp ; file offset
  7777 0000E2F4 0FB70D[3C3E0100]    <1> 	movzx	ecx, word [writei.bpc] ; bytes per cluster - 1
  7778 0000E2FB 41                  <1> 	inc	ecx ; bytes per cluster
  7779 0000E2FC F7F1                <1> 	div	ecx
  7780                              <1> 	; edx = byte offset in cluster (<= 65535)
  7781                              <1> 	; eax = cluster index
  7782 0000E2FE A3[443E0100]        <1> 	mov	[writei.c_index], eax
  7783 0000E303 668915[3E3E0100]    <1> 	mov	[writei.offset], dx
  7784 0000E30A 66C1EA09            <1> 	shr	dx, 9 ; / 512
  7785 0000E30E 8815[373E0100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
  7786                              <1> 
  7787                              <1> mget_w_3:
  7788 0000E314 3B05[543E0100]      <1> 	cmp	eax, [writei.l_index] ; last cluster index
  7789 0000E31A 752A                <1> 	jne	short mget_w_5
  7790                              <1> 
  7791 0000E31C A3[4C3E0100]        <1> 	mov	[writei.fs_index], eax ; cluster index (for next check)
  7792 0000E321 A1[503E0100]        <1> 	mov	eax, [writei.lclust] ; last cluster
  7793 0000E326 EB60                <1> 	jmp	short mget_w_10
  7794                              <1> 
  7795                              <1> mget_w_4: ; 02/11/2016
  7796                              <1> 	; eax = next file position
  7797 0000E328 2B05[40470100]      <1> 	sub	eax, [u.count] ; current file position
  7798                              <1> 	; edx = 0
  7799                              <1> 	; ecx = bytes per cluster
  7800 0000E32E F7F1                <1> 	div	ecx
  7801 0000E330 A3[443E0100]        <1> 	mov	[writei.c_index], eax ; cluster index
  7802 0000E335 668915[3E3E0100]    <1> 	mov	[writei.offset], dx
  7803 0000E33C 66C1EA09            <1> 	shr	dx, 9 ; / 512
  7804 0000E340 8815[373E0100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
  7805                              <1> 
  7806                              <1> mget_w_5:
  7807 0000E346 21C0                <1> 	and	eax, eax ; 0 = First Cluster's index number
  7808 0000E348 750C                <1> 	jnz	short mget_w_6
  7809                              <1> 
  7810 0000E34A A3[4C3E0100]        <1> 	mov	[writei.fs_index], eax ; cluster index (for next check)
  7811 0000E34F A1[483E0100]        <1> 	mov	eax, [writei.fclust] ; first cluster
  7812 0000E354 EB32                <1> 	jmp	short mget_w_10
  7813                              <1> 
  7814                              <1> mget_w_6:
  7815 0000E356 3B05[4C3E0100]      <1> 	cmp	eax, [writei.fs_index] ; current cluster index (>0)
  7816 0000E35C 7507                <1> 	jne	short mget_w_7
  7817 0000E35E A1[403E0100]        <1> 	mov	eax, [writei.cluster] ; current cluster 
  7818 0000E363 EB3A                <1> 	jmp	short mget_w_11
  7819                              <1> 
  7820                              <1> mget_w_7:
  7821 0000E365 89C1                <1> 	mov	ecx, eax
  7822 0000E367 2B0D[4C3E0100]      <1> 	sub	ecx, [writei.fs_index]
  7823 0000E36D 730D                <1> 	jnc	short mget_w_8
  7824                              <1> 	; get cluster by index from the first cluster
  7825 0000E36F A1[483E0100]        <1> 	mov	eax, [writei.fclust]
  7826 0000E374 8B0D[443E0100]      <1> 	mov	ecx, [writei.c_index]
  7827 0000E37A EB05                <1> 	jmp	short mget_w_9
  7828                              <1> 
  7829                              <1> mget_w_8:
  7830 0000E37C A1[403E0100]        <1> 	mov	eax, [writei.cluster] ; beginning cluster
  7831                              <1> 	; ecx = cluster sequence number after the beginning cluster
  7832                              <1> 	; sub	edx, edx ; 0
  7833                              <1> 
  7834                              <1> mget_w_9:
  7835                              <1> 	; EAX = Beginning cluster
  7836                              <1> 	; EDX = Sector index in disk/file section
  7837                              <1> 	;	(Only for SINGLIX file system!)
  7838                              <1> 	; ECX = Cluster sequence number after the beginning cluster
  7839                              <1> 	; ESI = Logical DOS Drive Description Table address
  7840 0000E381 E8B5D6FFFF          <1> 	call	get_cluster_by_index
  7841 0000E386 7234                <1> 	jc	short mget_w_err ; error code in EAX
  7842                              <1> 	; EAX = Cluster number		
  7843                              <1> mget_w_10:
  7844 0000E388 A3[403E0100]        <1> 	mov	[writei.cluster], eax ; FDT number for Singlix File System
  7845                              <1> 
  7846 0000E38D 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  7847 0000E391 7638                <1> 	jna	short mget_w_13
  7848                              <1> 	; 01/11/2016
  7849 0000E393 8B15[443E0100]      <1> 	mov	edx, [writei.c_index]
  7850 0000E399 8915[4C3E0100]      <1> 	mov	[writei.fs_index], edx
  7851                              <1> mget_w_11:
  7852 0000E39F 83E802              <1> 	sub	eax, 2
  7853 0000E3A2 0FB615[363E0100]    <1> 	movzx	edx, byte [writei.spc]
  7854 0000E3A9 F7E2                <1> 	mul	edx
  7855                              <1> 
  7856 0000E3AB 034668              <1> 	add	eax, [esi+LD_DATABegin]
  7857 0000E3AE 8A15[373E0100]      <1> 	mov	dl, [writei.s_index]
  7858 0000E3B4 01D0                <1> 	add	eax, edx
  7859                              <1> mget_w_12:
  7860 0000E3B6 A3[383E0100]        <1> 	mov	[writei.sector], eax
  7861                              <1> 	;; buffer validation must be done in writei
  7862                              <1> 	;;mov	byte [writei.valid], 1 
  7863 0000E3BB C3                  <1> 	retn
  7864                              <1> 
  7865                              <1> mget_w_err:
  7866 0000E3BC A3[80470100]        <1> 	mov	[u.error], eax
  7867 0000E3C1 A3[1C470100]        <1> 	mov	[u.r0], eax
  7868 0000E3C6 E9C2D7FFFF          <1> 	jmp	error
  7869                              <1> 
  7870                              <1> mget_w_13:
  7871                              <1> 	; EAX = FDT number (Current Section)
  7872                              <1> 	; EDX = Sector index from the first section (0,1,2,3,4...)
  7873 0000E3CB 2B15[4C3E0100]      <1> 	sub	edx, [writei.fs_index]	
  7874                              <1> 	; EDX = Sector index from current section
  7875 0000E3D1 8915[4C3E0100]      <1> 	mov	[writei.fs_index], edx
  7876 0000E3D7 40                  <1> 	inc	eax ; the first data sector in FS disk section	
  7877 0000E3D8 01D0                <1> 	add	eax, edx
  7878 0000E3DA EBDA                <1> 	jmp	short mget_w_12
  7879                              <1> 
  7880                              <1> mget_w_14:
  7881 0000E3DC 8A4E12              <1> 	mov	cl, [esi+LD_FS_BytesPerSec+1]
  7882 0000E3DF D0E9                <1> 	shr	cl, 1 ;  ; 1 for 512 bytes, 4 for 2048 bytes
  7883 0000E3E1 880D[363E0100]      <1> 	mov	[writei.spc], cl  ; sectors per cluster
  7884                              <1> 	; NOTE: writei bytes per sector value is always 512 ! 
  7885 0000E3E7 66C705[3C3E0100]00- <1> 	mov	word [writei.bpc], 512
  7885 0000E3EF 02                  <1>
  7886                              <1> 
  7887 0000E3F0 89E9                <1> 	mov	ecx, ebp
  7888 0000E3F2 030D[40470100]      <1> 	add	ecx, [u.count] ; next file position
  7889 0000E3F8 3B0D[A9470100]      <1> 	cmp	ecx, [i.size] ; <= file size ?
  7890 0000E3FE 0F86C8000000        <1> 	jna	mget_w_19 ; no
  7891                              <1> 
  7892 0000E404 29D2                <1> 	sub	edx, edx ; 0
  7893 0000E406 8915[383E0100]      <1> 	mov 	[writei.sector], edx ; 0
  7894 0000E40C 668915[3E3E0100]    <1> 	mov	[writei.offset], dx  ; byte offset in cluster 
  7895 0000E413 8815[373E0100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
  7896                              <1> 
  7897 0000E419 C1E909              <1> 	shr	ecx, 9 ; 1 cluster = 512 bytes
  7898 0000E41C 890D[443E0100]      <1> 	mov	[writei.c_index], ecx ; section/cluster index
  7899                              <1> 	
  7900 0000E422 89D8                <1> 	mov	eax, ebx ; FDT number (First FDT address)
  7901                              <1> 
  7902                              <1> 	; is this the 1st mget_w or a next mget_w call ? (by 'writei')
  7903 0000E424 3815[343E0100]      <1> 	cmp	byte [writei.valid], dl ; 0 
  7904 0000E42A 7624                <1> 	jna	short mget_w_15
  7905                              <1> 
  7906 0000E42C 8815[343E0100]      <1> 	mov 	byte [writei.valid], dl ; 0 ; reset ('writei' will set it) 
  7907                              <1> 
  7908 0000E432 3B05[483E0100]      <1> 	cmp	eax, [writei.fclust]
  7909 0000E438 7516                <1> 	jne	short mget_w_15
  7910                              <1> 
  7911 0000E43A 8A0D[FE460100]      <1> 	mov	cl, [cdev]
  7912 0000E440 3A0D[353E0100]      <1> 	cmp	cl, [writei.drv]
  7913 0000E446 7508                <1> 	jne	short mget_w_15
  7914                              <1>  	; [writei.l_clust] & [writei.l_index] are valid, 
  7915                              <1> 	;  we don't need to get last cluster & last cluster index
  7916 0000E448 8B0D[543E0100]      <1> 	mov	ecx, [writei.l_index]
  7917 0000E44E EB49                <1> 	jmp	short mget_w_17
  7918                              <1> mget_w_15:
  7919 0000E450 A3[483E0100]        <1> 	mov	[writei.fclust], eax ; first section (FDT number)
  7920                              <1> 	; edx = 0
  7921 0000E455 8915[403E0100]      <1> 	mov	[writei.cluster], edx ; 0 ; current section
  7922 0000E45B 8915[4C3E0100]      <1> 	mov 	[writei.fs_index], edx ; 0 ; curret section index
  7923                              <1> 
  7924                              <1> 	; eax = FDT number (section 0 header address)
  7925 0000E461 E8FFD5FFFF          <1> 	call	get_last_section
  7926 0000E466 0F8250FFFFFF        <1> 	jc	mget_w_err ; eax = error code
  7927                              <1> 
  7928 0000E46C 8915[4C3E0100]      <1> 	mov 	[writei.fs_index], edx ; sector index in last section
  7929                              <1> 		
  7930 0000E472 A3[503E0100]        <1> 	mov	[writei.lclust], eax ; last section address
  7931                              <1> 
  7932 0000E477 8B0D[743C0100]      <1> 	mov	ecx, [glc_index] ; last section index
  7933 0000E47D 890D[543E0100]      <1> 	mov	[writei.l_index], ecx
  7934                              <1> 
  7935 0000E483 A0[583E0100]        <1> 	mov	al, [writei.ofn]
  7936 0000E488 FEC0                <1> 	inc	al
  7937 0000E48A A2[933E0100]        <1> 	mov	[setfmod], al ; update lm date&time sign
  7938                              <1> 
  7939                              <1> mget_w_16:
  7940                              <1> 	; edx = (existing) last section (sector) index
  7941 0000E48F 8B0D[443E0100]      <1> 	mov	ecx, [writei.c_index] ; final section (sector) index
  7942 0000E495 29D1                <1> 	sub	ecx, edx
  7943 0000E497 7633                <1> 	jna	short mget_w_19
  7944                              <1> 	 ; ecx = sector count
  7945                              <1> mget_w_17:
  7946 0000E499 A1[503E0100]        <1> 	mov	eax, [writei.lclust]
  7947                              <1> 	; ESI = Logical dos drv desc. table address
  7948                              <1>         ; EAX = Last section
  7949                              <1>         ; (ECX = 0 for directory) 
  7950                              <1>         ; ECX = sector count (except FDT)
  7951 0000E49E E885CBFFFF          <1> 	call	add_new_fs_section
  7952 0000E4A3 7312                <1> 	jnc	short mget_w_18
  7953                              <1> 
  7954                              <1> 	; If error number = 27h (insufficient disk space)
  7955                              <1> 	; it is needed to check free consequent sectors
  7956                              <1> 	; (1 data sector at least and +1 section header sector) 
  7957                              <1> 
  7958 0000E4A5 83F827              <1> 	cmp	eax, 27h
  7959 0000E4A8 0F850EFFFFFF        <1> 	jne	mget_w_err ; eax = error code
  7960                              <1> 
  7961                              <1> 	; ecx = count of free consequent sectors
  7962                              <1> 	; ecx must be > 1 (1 data + 1 header sector)
  7963 0000E4AE 49                  <1> 	dec	ecx
  7964 0000E4AF 0F8407FFFFFF        <1> 	jz	mget_w_err
  7965 0000E4B5 EBE2                <1> 	jmp	short mget_w_17
  7966                              <1> 
  7967                              <1> mget_w_18:
  7968 0000E4B7 A3[503E0100]        <1> 	mov	[writei.lclust], eax ; (new) last section
  7969                              <1> 	; ecx = sector count (except section header)
  7970 0000E4BC 8B15[543E0100]      <1> 	mov	edx, [writei.l_index]
  7971 0000E4C2 01CA                <1> 	add	edx, ecx ; add sector count to index
  7972 0000E4C4 8915[543E0100]      <1> 	mov	[writei.l_index], edx
  7973 0000E4CA EBC3                <1> 	jmp	short mget_w_16
  7974                              <1> 
  7975                              <1> mget_w_19:
  7976 0000E4CC 89E9                <1> 	mov	ecx, ebp
  7977 0000E4CE 030D[40470100]      <1> 	add	ecx, [u.count]
  7978 0000E4D4 890D[A9470100]      <1> 	mov	[i.size], ecx ; save new file size
  7979                              <1> 	;sub	edx, edx ; 0
  7980                              <1> 
  7981 0000E4DA A0[FE460100]        <1> 	mov	al, [cdev]
  7982 0000E4DF A2[353E0100]        <1> 	mov	[writei.drv], al ; physical drive number
  7983                              <1> 	; edx = 0
  7984 0000E4E4 89E8                <1> 	mov	eax, ebp ; file offset
  7985 0000E4E6 89C2                <1> 	mov	edx, eax
  7986                              <1> 	; 1 cluster = 512 bytes (for Singlix FS)
  7987 0000E4E8 C1E809              <1> 	shr	eax, 9  ; / 512
  7988 0000E4EB 81E2FF010000        <1> 	and	edx, 1FFh
  7989                              <1> 	; edx = byte offset in cluster/sector (<= 511)
  7990                              <1> 	; eax = section (sector/cluster) index
  7991 0000E4F1 A3[443E0100]        <1> 	mov	[writei.c_index], eax
  7992 0000E4F6 668915[3E3E0100]    <1> 	mov	[writei.offset], dx
  7993                              <1> 	;mov	byte [writei.s_index], 0 ; sector index in cluster
  7994 0000E4FD E912FEFFFF          <1> 	jmp	mget_w_3
  7995                              <1> 
  7996                              <1> update_file_lmdt: ; & update file size
  7997                              <1> 	; 26/10/2016
  7998                              <1> 	; 24/10/2016
  7999                              <1> 	; 23/10/2016
  8000                              <1> 	; 22/10/2016 - TRDOS 386 (TRDOS v2.0)
  8001                              <1> 	;
  8002                              <1> 	; Update last modification date&time of file
  8003                              <1> 	; (call from syswrite -> writei)
  8004                              <1> 	; ((also updates file size)) // 26/10/2016
  8005                              <1> 	; 
  8006                              <1> 	; INPUT:
  8007                              <1> 	;      byte [setfmod] = open file number
  8008                              <1> 	; OUTPUT:
  8009                              <1> 	;      cf = 0 -> success !
  8010                              <1> 	;      cf = 1 -> lmdt update has been failed! 	 
  8011                              <1> 	;
  8012                              <1> 	; Modified registers: eax, ebx, ecx, edx, esi, edi       				
  8013                              <1> 	;
  8014                              <1> 
  8015                              <1> 	;cmp	byte [setfmod], 0
  8016                              <1> 	;jna	short uflmdt_2 ; nothing to do
  8017                              <1> 
  8018 0000E502 31C0                <1> 	xor	eax, eax
  8019                              <1> 
  8020 0000E504 0FB61D[933E0100]    <1> 	movzx	ebx, byte [setfmod]
  8021 0000E50B FECB                <1> 	dec	bl ; open file index number (0 based)
  8022                              <1> 
  8023 0000E50D 8AA3[00420100]      <1> 	mov	ah, [ebx+OF_DRIVE]
  8024 0000E513 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  8025 0000E518 01C6                <1> 	add	esi, eax
  8026 0000E51A C0E302              <1> 	shl	bl, 2 ; *4	
  8027 0000E51D 8B8B[D8410100]      <1> 	mov	ecx, [ebx+OF_FCLUSTER] ; first cluster
  8028 0000E523 8B93[A0420100]      <1> 	mov	edx, [ebx+OF_DIRCLUSTER] ; dir cluster
  8029                              <1> 
  8030 0000E529 D0EB                <1> 	shr	bl, 1 ; /2
  8031 0000E52B 0FB7BB[40430100]    <1> 	movzx	edi, word [ebx+OF_DIRENTRY]
  8032                              <1> 	
  8033 0000E532 803D[D0390100]01    <1> 	cmp	byte [DirBuff_ValidData], 1
  8034 0000E539 726E                <1> 	jb	short uflmdt_4
  8035                              <1> 
  8036 0000E53B A0[CE390100]        <1> 	mov	al, [DirBuff_DRV]
  8037 0000E540 2C41                <1> 	sub	al, 'A'	
  8038 0000E542 38E0                <1> 	cmp	al, ah
  8039 0000E544 7563                <1> 	jne	short uflmdt_4 ; different drive
  8040 0000E546 8A4603              <1> 	mov	al, [esi+LD_FATType] 
  8041 0000E549 3A05[CF390100]      <1> 	cmp	al, [DirBuff_FATType]
  8042 0000E54F 755B                <1> 	jne	short uflmdt_5 ; different FS type
  8043 0000E551 3B15[D5390100]      <1> 	cmp	edx, [DirBuff_Cluster]
  8044 0000E557 7553                <1> 	jne	short uflmdt_5 ; different cluster
  8045                              <1> 
  8046                              <1> uflmdt_1:
  8047                              <1> 	; Directory buffer is ready here!
  8048                              <1> 	; OF_FCLUSTER must be compared/verified
  8049 0000E559 BE00000800          <1> 	mov	esi, Directory_Buffer
  8050 0000E55E 66C1E705            <1> 	shl	di, 5 ; dir entry index * 32
  8051 0000E562 01FE                <1> 	add	esi, edi ; offset
  8052                              <1> 	;
  8053 0000E564 F6460B18            <1> 	test	byte [esi+DirEntry_Attr], 18h ; Vol & Dir
  8054 0000E568 750F                <1> 	jnz	short uflmdt_2 ; not a valid file !
  8055 0000E56A 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI]
  8056 0000E56E C1E010              <1> 	shl	eax, 16
  8057 0000E571 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO]
  8058 0000E575 39C8                <1> 	cmp	eax, ecx ; same first cluster ?
  8059 0000E577 7407                <1> 	je	short uflmdt_3 ; yes, it is OK !!!	
  8060                              <1> 
  8061                              <1> uflmdt_2:	
  8062                              <1> 	; save directory buffer if has modified/changed sign
  8063                              <1> 	; (It is good to save dir buff even if the searched
  8064                              <1> 	; directory entry is not found !?)
  8065 0000E579 E8FBB7FFFF          <1> 	call	save_directory_buffer
  8066 0000E57E F9                  <1> 	stc	; update failed
  8067 0000E57F C3                  <1> 	retn
  8068                              <1> 	
  8069                              <1> uflmdt_3:
  8070                              <1> 	; Update directory entry
  8071                              <1> 	; 26/10/2016
  8072 0000E580 D0E3                <1> 	shl	bl, 1 ; *2 
  8073 0000E582 8B83[50420100]      <1> 	mov	eax, [ebx+OF_SIZE] ; file size
  8074 0000E588 89461C              <1> 	mov	[esi+DirEntry_FileSize], eax
  8075                              <1> 	;
  8076 0000E58B E84BB7FFFF          <1> 	call	convert_current_date_time
  8077                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  8078                              <1>         ; 	    AX = Time in dos dir entry format	
  8079 0000E590 66894616            <1> 	mov	[esi+DirEntry_WrtTime], ax
  8080 0000E594 66895618            <1> 	mov	[esi+DirEntry_WrtDate], dx	
  8081 0000E598 66895612            <1> 	mov	[esi+DirEntry_LastAccDate], dx
  8082 0000E59C C605[D0390100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  8083 0000E5A3 E8D1B7FFFF          <1> 	call	save_directory_buffer
  8084 0000E5A8 C3                  <1> 	retn
  8085                              <1> 
  8086                              <1> uflmdt_4:
  8087                              <1> 	; Directory buffer sector read&write
  8088                              <1> 	; 23/10/2016
  8089                              <1> 	;
  8090 0000E5A9 8A4603              <1> 	mov	al, [esi+LD_FATType]
  8091                              <1> uflmdt_5:
  8092 0000E5AC BB[F04C0100]        <1> 	mov	ebx, rw_buffer ; Common r/w sector buffer addr
  8093                              <1> 		
  8094 0000E5B1 20C0                <1> 	and	al, al ; 0 = Singlix FS
  8095 0000E5B3 0F8492000000        <1> 	jz	uflmdt_11
  8096                              <1> 
  8097 0000E5B9 21D2                <1> 	and	edx, edx
  8098 0000E5BB 7521                <1> 	jnz	short uflmdt_9
  8099                              <1> 
  8100 0000E5BD 3C02                <1> 	cmp	al, 2  ; 3 = FAT32
  8101 0000E5BF 771A                <1> 	ja	short uflmdt_8
  8102                              <1> 
  8103 0000E5C1 89F8                <1> 	mov	eax, edi ; directory entry index number
  8104 0000E5C3 66C1E804            <1> 	shr	ax, 4 ; 16 entries per sector	 
  8105 0000E5C7 034664              <1> 	add	eax, [esi+LD_ROOTBegin]
  8106                              <1> 	; eax = root directory sector
  8107                              <1> uflmdt_6:
  8108 0000E5CA 50                  <1> 	push	eax ; * ; disk sector address
  8109 0000E5CB 51                  <1> 	push	ecx ; first cluster	
  8110 0000E5CC B901000000          <1> 	mov	ecx, 1
  8111                              <1> 	; ecx = sector count
  8112 0000E5D1 E89B000000          <1> 	call	disk_read
  8113 0000E5D6 59                  <1> 	pop	ecx
  8114 0000E5D7 731A                <1> 	jnc	short uflmdt_10
  8115 0000E5D9 58                  <1> 	pop	eax ; *
  8116                              <1> uflmdt_7:
  8117 0000E5DA C3                  <1> 	retn	
  8118                              <1> 
  8119                              <1> uflmdt_8:
  8120 0000E5DB 8B5632              <1> 	mov	edx, [esi+LD_BPB+FAT32_RootFClust]
  8121                              <1> uflmdt_9:
  8122 0000E5DE 83FA02              <1> 	cmp	edx, 2
  8123 0000E5E1 72F7                <1> 	jb	short uflmdt_7 ; invalid, nothing to do
  8124                              <1> 
  8125 0000E5E3 83EA02              <1> 	sub	edx, 2
  8126 0000E5E6 89D0                <1> 	mov	eax, edx
  8127 0000E5E8 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
  8128 0000E5EC F7E2                <1> 	mul	edx
  8129 0000E5EE 034668              <1> 	add	eax, [esi+LD_DATABegin]
  8130                              <1> 	; eax = sub directory (data) sector 
  8131 0000E5F1 EBD7                <1> 	jmp	short uflmdt_6
  8132                              <1> 
  8133                              <1> uflmdt_10:
  8134                              <1> 	; Directory sector buffer is ready here!
  8135                              <1> 	; OF_FCLUSTER must be compared/verified
  8136                              <1> 	; edi = dir entry index number (<= 2047)
  8137 0000E5F3 6683E70F            <1> 	and	di, 0Fh ; 16 entries per sector
  8138 0000E5F7 66C1E705            <1> 	shl	di, 5 ; dir entry index * 32
  8139 0000E5FB 81C7[F04C0100]      <1> 	add	edi, rw_buffer
  8140                              <1> 	;
  8141 0000E601 F6470B18            <1> 	test	byte [edi+DirEntry_Attr], 18h ; Vol & Dir
  8142 0000E605 0F856EFFFFFF        <1> 	jnz	uflmdt_2 ; not a valid file !
  8143 0000E60B 668B5714            <1> 	mov	dx, [edi+DirEntry_FstClusHI]
  8144 0000E60F C1E210              <1> 	shl	edx, 16
  8145 0000E612 668B571A            <1> 	mov	dx, [edi+DirEntry_FstClusLO]
  8146 0000E616 39CA                <1> 	cmp	edx, ecx ; same first cluster ?
  8147 0000E618 0F855BFFFFFF        <1> 	jne	uflmdt_2 ; no !?
  8148                              <1> 
  8149                              <1> 	; Update directory entry
  8150 0000E61E E8B8B6FFFF          <1> 	call	convert_current_date_time
  8151                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  8152                              <1>         ; 	    AX = Time in dos dir entry format	
  8153 0000E623 66894716            <1> 	mov	[edi+DirEntry_WrtTime], ax
  8154 0000E627 66895718            <1> 	mov	[edi+DirEntry_WrtDate], dx	
  8155 0000E62B 66895712            <1> 	mov	[edi+DirEntry_LastAccDate], dx
  8156                              <1> 	
  8157 0000E62F 58                  <1> 	pop	eax ; *
  8158                              <1> 
  8159 0000E630 BB[F04C0100]        <1> 	mov	ebx, rw_buffer ; Common r/w sector buffer addr
  8160 0000E635 B901000000          <1> 	mov	ecx, 1
  8161                              <1> 	; esi = logical dos description table address
  8162                              <1> 	; eax = disk sector number/address (LBA)
  8163                              <1> 	; ecx = sector count
  8164                              <1> 	; ebx = buffer address
  8165 0000E63A E823000000          <1> 	call	disk_write
  8166 0000E63F 0F8234FFFFFF        <1> 	jc	uflmdt_2
  8167                              <1> 	
  8168                              <1> 	; save directory buffer if has modified/changed sign
  8169 0000E645 E82FB7FFFF          <1> 	call	save_directory_buffer
  8170 0000E64A C3                  <1> 	retn
  8171                              <1> 
  8172                              <1> uflmdt_11:
  8173                              <1> 	; 24/10/2016
  8174                              <1> 	; Update last modification date & time of a file
  8175                              <1> 	; on a disk with Singlix File System.
  8176                              <1> 	;
  8177                              <1> 	; (Method: Read the FDT -File Description Table-
  8178                              <1> 	; sector of the file and update the lmdt data fields,
  8179                              <1> 	; then write FDT sector to the disk.
  8180                              <1> 	; /// It is easy but there is compatibility buffer
  8181                              <1> 	; method also for changing directory entry data and
  8182                              <1> 	; also there are some programming issues for Singlix
  8183                              <1> 	; file system (TRFS), which are not completed yet!)
  8184                              <1> 	;
  8185                              <1> 	; Not ready yet ! (24/10/2016)
  8186                              <1> 	; /// Temporary code for error return ! ///
  8187 0000E64B 31C0                <1> 	xor	eax, eax
  8188 0000E64D F9                  <1> 	stc
  8189 0000E64E C3                  <1> 	retn
  8190                              <1> 
  8191                              <1> maknod: 
  8192                              <1> 	; 26/10/2016
  8193                              <1> 	; temporary
  8194 0000E64F C3                  <1> 	retn
  8195                              <1> 	
  8196                              <1> ; temporary - 24/01/2016
  8197                              <1> 
  8198                              <1> iget:
  8199 0000E650 C3                  <1> 	retn
  8200                              <1> poke:
  8201 0000E651 C3                  <1> 	retn
  8202                              <1> isintr:
  8203 0000E652 C3                  <1> 	retn
  8204                              <1> iopen:
  8205 0000E653 C3                  <1> 	retn
  8206                              <1> iclose:
  8207 0000E654 C3                  <1> 	retn
  8208                              <1> itrunc:
  8209 0000E655 C3                  <1> 	retn
  8210                              <1> setimod:
  8211 0000E656 C3                  <1> 	retn
  8212                              <1> ottyp:
  8213 0000E657 C3                  <1> 	retn
  8214                              <1> cttyp:
  8215 0000E658 C3                  <1> 	retn
  8216                              <1> sndc:
  8217 0000E659 C3                  <1> 	retn
  8218                              <1> access:
  8219 0000E65A C3                  <1> 	retn
  8220                              <1> passc:
  8221 0000E65B C3                  <1> 	retn
  8222                              <1> epoch:
  8223 0000E65C C3                  <1> 	retn
  8224                              <1> set_date_time:
  8225 0000E65D C3                  <1> 	retn
  8226                              <1> imap:
  8227 0000E65E C3                  <1> 	retn
  8228                              <1> diskio:
  8229 0000E65F C3                  <1> 	retn
  8230                              <1> idle:
  8231 0000E660 C3                  <1> 	retn
  8232                              <1> sleep:
  8233 0000E661 C3                  <1> 	retn
  2139                                  %include 'trdosk7.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - DISK READ&WRITE : trdosk7.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 25/02/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    11                              <1> ; DISK_IO.ASM (20/07/2011)
    12                              <1> ; ****************************************************************************
    13                              <1> ; DISK_IO.ASM (c) 2009-2011 Erdogan TAN [ 04/07/2009 ] Last Update: 20/07/2011
    14                              <1> 
    15                              <1> disk_write:
    16                              <1> 	; 25/02/2016
    17                              <1> 	; 24/02/2016
    18                              <1> 	; 23/02/2016
    19 0000E662 807E0500            <1> 	cmp	byte [esi+LD_LBAYes], 0
    20 0000E666 777B                <1>         ja      short lba_write
    21                              <1> 
    22                              <1> chs_write:
    23                              <1> 	; 25/02/2016
    24                              <1> 	; 23/02/2016
    25 0000E668 C605[993A0100]03    <1> 	mov	byte [disk_rw_op], 3 ; CHS write
    26 0000E66F EB0D                <1> 	jmp	short chs_rw
    27                              <1> 
    28                              <1> disk_read:
    29                              <1> 	; 25/02/2016
    30                              <1> 	; 24/02/2016
    31                              <1> 	; 23/02/2016
    32                              <1> 	; 17/02/2016
    33                              <1> 	; 14/02/2016
    34                              <1> 	; 31/01/2016 (TRDOS 386 =  TRDOS v2.0)
    35                              <1> 	; 17/10/2010
    36                              <1> 	; 18/04/2010
    37                              <1> 	;
    38                              <1> 	; INPUT -> EAX = Logical Block Address
    39                              <1> 	;	   ESI = Logical Dos Disk Table Offset (DRV)	
    40                              <1> 	;	   ECX = Sector Count	
    41                              <1> 	; 	   EBX = Destination Buffer
    42                              <1> 	; OUTPUT -> 
    43                              <1> 	;	   cf = 0 or cf = 1
    44                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
    45                              <1> 
    46 0000E671 807E0500            <1> 	cmp	byte [esi+LD_LBAYes], 0
    47 0000E675 7775                <1>         ja      short lba_read
    48                              <1> 
    49                              <1> chs_read:
    50                              <1> 	; 25/02/2016
    51                              <1> 	; 24/02/2016
    52                              <1> 	; 23/02/2016
    53                              <1> 	; 31/01/2016 (TRDOS 386 =  TRDOS v2.0)
    54                              <1> 	; 20/07/2011
    55                              <1> 	; 04/07/2009
    56                              <1> 	;
    57                              <1> 	; INPUT -> EAX = Logical Block Address
    58                              <1> 	;	   ECX = Number of sectors to read
    59                              <1> 	; 	   ESI = Logical Dos Disk Table Offset (DRV)
    60                              <1> 	; 	   EBX = Destination Buffer
    61                              <1> 	; OUTPUT -> 
    62                              <1> 	;	   cf = 0 or cf = 1
    63                              <1> 	; (Modified registers: EAX; EBX, ECX, EDX)
    64                              <1> 
    65                              <1> 	; 23/02/2016
    66 0000E677 C605[993A0100]02    <1> 	mov	byte [disk_rw_op], 2 ; CHS read
    67                              <1> 
    68                              <1> chs_rw:
    69                              <1> 	;;movzx	edx, word [esi+LD_BPB+SecPerTrack]
    70                              <1> 	;movzx	edx, byte [esi+LD_BPB+SecPerTrack] ; <= 63
    71                              <1> 	;mov	[disk_rw_spt], dl
    72                              <1> 
    73                              <1> chs_read_next_sector:
    74 0000E67E C605[9A3A0100]04    <1> 	mov	byte [retry_count], 4
    75                              <1>      
    76                              <1> chs_read_retry:
    77                              <1> 	;mov	[sector_count], ecx ; 23/02/2016
    78                              <1> 
    79 0000E685 50                  <1> 	push	eax			; Linear sector #
    80 0000E686 51                  <1> 	push	ecx			; # of FAT/FILE/DIR sectors
    81                              <1>                 
    82 0000E687 0FB74E1E            <1> 	movzx	ecx, word [esi+LD_BPB+SecPerTrack]
    83                              <1> 	;movzx	ecx, byte [disk_rw_spt] ; 23/02/2016
    84 0000E68B 29D2                <1> 	sub	edx, edx
    85 0000E68D F7F1                <1> 	div	ecx
    86                              <1> 	; eax = track, dx (dl ) = sector (on track)
    87                              <1> 	;sub	cl, dl ; 24/02/2016 (spt - sec)
    88                              <1> 	;push	ecx ; *
    89 0000E68F 6689D1              <1> 	mov	cx, dx			; Sector (zero based)
    90 0000E692 6641                <1> 	inc	cx			; To make it 1 based
    91 0000E694 6651                <1> 	push	cx
    92 0000E696 668B4E20            <1> 	mov	cx, [esi+LD_BPB+Heads]
    93 0000E69A 6629D2              <1> 	sub	dx, dx
    94 0000E69D F7F1                <1> 	div	ecx			; Convert track to head & cyl
    95                              <1> 	; eax (ax) = cylinder, dx (dl) = head (max. FFh)
    96 0000E69F 88D6                <1> 	mov	dh, dl
    97 0000E6A1 6659                <1> 	pop	cx			; AX=Cyl, DH=Head, CX=Sector
    98 0000E6A3 8A5602              <1> 	mov	dl, [esi+LD_PhyDrvNo]
    99                              <1> 
   100 0000E6A6 88C5                <1> 	mov	ch, al			; NOTE: max. 1023 cylinders !                   
   101 0000E6A8 C0CC02              <1> 	ror	ah, 2			; Rotate 2 bits right
   102 0000E6AB 08E1                <1> 	or	cl, ah
   103                              <1> 
   104                              <1> 	; 24/02/2016
   105                              <1> 	;pop	eax ; * (spt - sec) (example: 63 - 0 = 63)
   106                              <1> 	;cmp	eax, [sector_count]
   107                              <1> 	;jb	short chs_write_sectors
   108                              <1> 	;je	short chs_read_sectors
   109                              <1> 	;; (# of sectors to read is more than remaining sectors on the track)
   110                              <1> 	;mov	al, [sector_count]
   111                              <1> ;chs_read_sectors: ; read or write !
   112 0000E6AD B001                <1> 	mov	al, 1 ; 25/02/2016
   113 0000E6AF 8A25[993A0100]      <1> 	mov	ah, [disk_rw_op]  ; 02h = chs read, 03h = chs write 
   114                              <1> 	;
   115 0000E6B5 E8D25AFFFF          <1> 	call	int13h			; BIOS Service func ( ah ) = 2
   116                              <1>                                         ; Read disk sectors
   117                              <1>                                         ; AL-sec num CH-track CL-sec
   118                              <1>                                         ; DH-head DL-drive ES:BX-buffer
   119                              <1>                                         ; CF-flag AH-stat AL-sec read
   120                              <1> 	                                ; If CF = 1 then (If AH > 0)
   121 0000E6BA 8825[9B3A0100]      <1> 	mov	[disk_rw_err], ah
   122                              <1> 	
   123 0000E6C0 59                  <1> 	pop	ecx
   124 0000E6C1 58                  <1> 	pop	eax
   125 0000E6C2 7314                <1> 	jnc	short chs_read_ok
   126                              <1> 
   127 0000E6C4 803D[9B3A0100]09    <1> 	cmp	byte [disk_rw_err], 09h ; DMA crossed 64K segment boundary
   128 0000E6CB 7408                <1> 	je	short chs_read_error_retn
   129                              <1>              
   130 0000E6CD FE0D[9A3A0100]      <1> 	dec	byte [retry_count]
   131 0000E6D3 75B0                <1> 	jnz	short chs_read_retry
   132                              <1> 
   133                              <1> chs_read_error_retn:
   134 0000E6D5 F9                  <1> 	stc
   135                              <1> 	;retn
   136 0000E6D6 EB69                <1> 	jmp	short update_drv_error_byte
   137                              <1> 
   138                              <1> ;chs_write_sectors: ; read or write 
   139                              <1> 	;; (# of sectors to read is less than remaining sectors on the track)
   140                              <1> 	;mov	[sector_count], al
   141                              <1> 	;jmp	short chs_read_sectors
   142                              <1> 
   143                              <1> chs_read_ok:
   144                              <1> 	;; 23/02/2016
   145                              <1> 	;movzx	edx, byte [sector_count] ; sector count (<= spt)	
   146                              <1>         ;sub    ecx, edx  ; remaining sector count
   147                              <1> 	;jna	short update_drv_error_byte	
   148                              <1> 	;add	eax, edx ; next disk sector
   149                              <1> 	;shl	edx, 9 ; 512 * sector count
   150                              <1> 	;add	ebx, edx ; next buffer byte address 
   151                              <1>         ;jmp     chs_read_next_sector        
   152                              <1> 	; 25/02/2016
   153 0000E6D8 40                  <1> 	inc	eax ; next sector
   154 0000E6D9 81C300020000        <1> 	add	ebx, 512
   155 0000E6DF E29D                <1> 	loop	chs_read_next_sector
   156 0000E6E1 EB5E                <1> 	jmp	short update_drv_error_byte
   157                              <1> 
   158                              <1> lba_write:
   159                              <1> 	; 23/02/2016
   160 0000E6E3 C605[993A0100]1C    <1> 	mov	byte [disk_rw_op], 1Ch ; LBA write
   161 0000E6EA EB07                <1> 	jmp	short lba_rw
   162                              <1> 
   163                              <1> lba_read:
   164                              <1> 	; 23/02/2016
   165                              <1> 	; 17/02/2016
   166                              <1> 	; 14/02/2016
   167                              <1> 	; 13/02/2016
   168                              <1> 	; 31/01/2016 (TRDOS 386 =  TRDOS v2.0)
   169                              <1> 	; 10/07/2015 (Retro UNIX 386 v1)
   170                              <1> 	;
   171                              <1> 	; INPUT -> EAX = Logical Block Address
   172                              <1> 	;	   ESI = Logical Dos Disk Table Offset (DRV)	
   173                              <1> 	;	   ECX = Sector Count	
   174                              <1> 	; 	   EBX = Destination Buffer
   175                              <1> 	; OUTPUT -> 
   176                              <1> 	;	   cf = 0 or cf = 1
   177                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
   178                              <1> 
   179                              <1> 	; LBA read/write (with private LBA function) 
   180                              <1> 	;((Retro UNIX 386 v1 - DISK I/O code by Erdogan Tan))
   181                              <1> 
   182                              <1> 
   183                              <1> 	; 23/02/2016
   184 0000E6EC C605[993A0100]1B    <1> 	mov	byte [disk_rw_op], 1Bh ; LBA read
   185                              <1> 
   186                              <1> lba_rw:
   187                              <1> 	; 17/02/2016
   188 0000E6F3 57                  <1> 	push	edi
   189                              <1> 
   190 0000E6F4 890D[9C3A0100]      <1> 	mov	[sector_count], ecx ; total sector (read) count
   191                              <1> 
   192 0000E6FA 8A5602              <1> 	mov	dl, [esi+LD_PhyDrvNo]
   193                              <1> 	; dl = physical drive number (0,1, 80h, 81h, 82h, 83h)
   194                              <1> 
   195                              <1> lba_read_next:
   196 0000E6FD 81F900010000        <1> 	cmp	ecx, 256
   197 0000E703 7605                <1> 	jna	short lba_read_rsc
   198 0000E705 B900010000          <1> 	mov	ecx, 256 ; 17/02/2016
   199                              <1> lba_read_rsc:
   200 0000E70A 290D[9C3A0100]      <1> 	sub	[sector_count], ecx ; remain sectors
   201                              <1> 
   202 0000E710 89CF                <1> 	mov	edi, ecx 
   203 0000E712 89C1                <1> 	mov	ecx, eax ; sector number/address
   204                              <1> 
   205 0000E714 C605[9A3A0100]04    <1> 	mov	byte [retry_count], 4
   206                              <1> lba_read_retry:
   207 0000E71B 89F8                <1> 	mov	eax, edi
   208                              <1> 	;
   209                              <1> 	; ecx = sector number
   210                              <1> 	; al = sector count (0 - 255) /// (0 = 256)
   211                              <1> 	; dl = drive number
   212                              <1> 	; ebx = buffer offset
   213                              <1> 	;
   214                              <1> 	; Function 1Bh = LBA read, 1Ch = LBA write
   215                              <1> 	; 23/02/2016
   216 0000E71D 8A25[993A0100]      <1> 	mov	ah, [disk_rw_op] ; 1Bh = LBA read, 1Ch = LBA write
   217 0000E723 E8645AFFFF          <1> 	call	int13h
   218                              <1> 	; al = ? (changed)
   219                              <1> 	; ah = error code
   220 0000E728 8825[9B3A0100]      <1> 	mov	[disk_rw_err], ah
   221 0000E72E 7334                <1> 	jnc	short lba_read_ok
   222 0000E730 80FC80              <1> 	cmp	ah, 80h ; time out?
   223 0000E733 740A                <1>         je      short lba_read_stc_retn
   224 0000E735 FE0D[9A3A0100]      <1> 	dec	byte [retry_count]
   225 0000E73B 7FDE                <1> 	jg	short lba_read_retry
   226 0000E73D 743A                <1> 	jz	short lba_read_reset
   227                              <1> 	; sf =  1
   228                              <1> 
   229                              <1> lba_read_stc_retn:
   230 0000E73F F9                  <1> 	stc
   231                              <1> lba_read_retn:
   232 0000E740 5F                  <1> 	pop	edi
   233                              <1> 
   234                              <1> update_drv_error_byte:
   235 0000E741 9C                  <1> 	pushf
   236 0000E742 53                  <1> 	push	ebx
   237 0000E743 6651                <1> 	push	cx
   238                              <1> 	;or	ecx, ecx
   239                              <1> 	;jz	short udrv_errb0
   240 0000E745 8A0D[9B3A0100]      <1> 	mov	cl, [disk_rw_err]
   241                              <1> udrv_errb0:
   242 0000E74B 0FB65E02            <1> 	movzx	ebx, byte [esi+LD_PhyDrvNo]
   243 0000E74F 80FB02              <1> 	cmp	bl, 2
   244 0000E752 7203                <1>         jb      short udrv_errb1
   245 0000E754 80EB7E              <1> 	sub	bl, 7Eh
   246                              <1> 	;cmp	bl, 5
   247                              <1> 	;ja	short udrv_errb2	
   248                              <1> udrv_errb1:
   249 0000E757 81C3[57FC0000]      <1>         add     ebx, drv.error ; 13/02/2016
   250 0000E75D 880B                <1> 	mov	[ebx], cl ; error code
   251                              <1> udrv_errb2:
   252 0000E75F 6659                <1> 	pop	cx
   253 0000E761 5B                  <1> 	pop	ebx
   254 0000E762 9D                  <1> 	popf
   255 0000E763 C3                  <1> 	retn
   256                              <1> 
   257                              <1> lba_read_ok:
   258 0000E764 89C8                <1> 	mov	eax, ecx ; sector number
   259 0000E766 01F8                <1> 	add	eax, edi ; sector number (next)
   260 0000E768 C1E709              <1> 	shl	edi, 9 ; sector count * 512
   261 0000E76B 01FB                <1> 	add	ebx, edi ; next buffer offset
   262                              <1> 
   263 0000E76D 8B0D[9C3A0100]      <1> 	mov	ecx, [sector_count] ; remaining sectors
   264 0000E773 09C9                <1> 	or	ecx, ecx
   265 0000E775 7586                <1> 	jnz	short lba_read_next
   266 0000E777 EBC7                <1> 	jmp	short lba_read_retn
   267                              <1> 
   268                              <1> lba_read_reset:
   269 0000E779 B40D                <1> 	mov	ah, 0Dh ; Alternate reset
   270 0000E77B E80C5AFFFF          <1>         call	int13h
   271                              <1> 	; al = ? (changed)
   272                              <1> 	; ah = error code
   273 0000E780 7399                <1> 	jnc	short lba_read_retry
   274 0000E782 EBBC                <1> 	jmp	short lba_read_retn
  2140                                  %include 'trdosk8.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - MAIN PROGRAM : trdosk8.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 15/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    11                              <1> ; u0.s (20/11/2015), u4.s (14/10/2015)
    12                              <1> ; ****************************************************************************
    13                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    14                              <1> ; TRDOS2.ASM (09/11/2011)
    15                              <1> ; ----------------------------------------------------------------------------
    16                              <1> ; DIR.ASM (c) 2004-2011 Erdogan TAN  [07/01/2004] Last Update: 09/10/2011
    17                              <1> 
    18                              <1> set_run_sequence:
    19                              <1> 	; 23/12/2016
    20                              <1> 	; 10/06/2016
    21                              <1> 	; 22/05/2016
    22                              <1> 	; 20/05/2016
    23                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
    24                              <1> 	; TRDOS 386 feature only !
    25                              <1> 	;
    26                              <1> 	; INPUT ->
    27                              <1> 	;	AL = process number (next process)
    28                              <1> 	;
    29                              <1> 	;	this process must be added to run sequence
    30                              <1> 	;
    31                              <1> 	;	[u.pri] = priority of present process
    32                              <1> 	;
    33                              <1> 	;	DL = priority (queue)
    34                              <1> 	;	     0 = background (low) ; run on background 
    35                              <1> 	;	     1 = regular (normal) ; run as regular
    36                              <1> 	;	     2 = event (high)     ; run for event
    37                              <1> 	;
    38                              <1> 	;	1) If the requested process is already running:
    39                              <1> 	;	   a) If present priority is high ([u.pri]=2) 
    40                              <1> 	;	      and requested priority is also high, 
    41                              <1> 	;	      there is nothing to do! Because it has been
    42                              <1> 	;	      done already (before this attempt).		 	
    43                              <1> 	;	   b) If present priority is high ([u.pri]=2)
    44                              <1> 	;	      and requested priority is not high, there is
    45                              <1> 	;	      nothing to do! Because, it's current
    46                              <1> 	;	      run queue is unspecified, here. (It may be in
    47                              <1> 	;	      a waiting list or in a run queue; if the new
    48                              <1> 	;	      priority would be used to add it to relavant
    49                              <1>         ;             run queue, this would be wrong, unnecessary
    50                              <1> 	;	      and destabilizing duplication!)
    51                              <1> 	;	   c) If present priority is not high ([u.pri]<2)
    52                              <1>         ;             and requested priority is high (event),
    53                              <1> 	;	      process will be added to present priority's
    54                              <1> 	;	      run queue and then, priority will be changed
    55                              <1> 	;	      to high ([u.pri]=2).
    56                              <1> 	;	   d) If present priority is not high ([u.pri]<2)
    57                              <1> 	;	      and requested priority is not high, [u.pri]
    58                              <1> 	;	      value will be changed. There is nothing to do
    59                              <1> 	;	      in addition. (The new priority value will be
    60                              <1> 	;	      used by 'tswap/tswitch' procedure at 'sysret'
    61                              <1> 	;	      or 'sysrele' stage.)
    62                              <1> 	;
    63                              <1> 	;	2) If the requested process is not running:
    64                              <1> 	;	   a) If requested priority of the requested
    65                              <1> 	;	      (next) process is high (event) and priority
    66                              <1> 	;	      of present process is not high, the requested
    67                              <1> 	;	      process will be added to ('runq_event') high
    68                              <1> 	;	      priority run queue and then present (running)
    69                              <1> 	;	      process will be stopped (swapped/switched out)
    70                              <1> 	;	      immediately if it is in user mode, or it's 
    71                              <1> 	;	      [u.quant] value will be reset to 0 and (then) 
    72                              <1> 	;	      it will be stopped at 'sysret' stage.			
    73                              <1> 	;	   b) If requested priority of the requested
    74                              <1> 	;	      (next) process is high (event) and priority
    75                              <1> 	;	      of present process is also high, the requested
    76                              <1> 	;	      process will be added to ('runq_event') high
    77                              <1> 	;	      priority run queue and present (running) 
    78                              <1> 	;	      process will be allowed to run until it's 
    79                              <1> 	;	      time quantum will be elapsed ([u.quant]=0).	
    80                              <1> 	;	   c) If requested priority of the requested
    81                              <1> 	;	      (next) process is not high ('run for event'), 
    82                              <1> 	;	      there is nothing to do. Because, it's current
    83                              <1> 	;	      run queue is unspecified, here. (It may be in
    84                              <1> 	;	      a waiting list or in a run queue; if the new
    85                              <1> 	;	      priority would be used to add it to relavant
    86                              <1>         ;             run queue, this would be wrong, unnecessary
    87                              <1> 	;	      and destabilizing duplication!) 
    88                              <1> 	;
    89                              <1> 	; OUTPUT ->
    90                              <1> 	;	none
    91                              <1> 	;
    92                              <1> 	;	[u.pri] = priority of present process
    93                              <1> 	;
    94                              <1> 	;	cf = 1, if the request could not be fulfilled.
    95                              <1> 	;			 	     	  
    96                              <1> 	;	NOTE: 
    97                              <1>         ;          * Processes in 'run as regular' queue can run
    98                              <1> 	;	     if there is no process in 'run for event' queue
    99                              <1> 	;	     ('run for event' processes have higher priority)	 		 
   100                              <1> 	;	   * When [u.quant] time quantum of a process is
   101                              <1> 	;	     elapsed, it's high priority ('run for event')
   102                              <1> 	;	     status will be disabled, it can be run in sequence
   103                              <1> 	;	     of it's actual run queue.
   104                              <1> 	;	   * A 'run on background' process will always be 
   105                              <1> 	;	     sequenced in 'run on background' (low priority)
   106                              <1> 	;	     queue, it can run only when other priority queues
   107                              <1> 	;	     are empty. (idle time processes, e.g. printing)  	 	
   108                              <1> 	;
   109                              <1> 	; Modified registers: eax, ebx, edx
   110                              <1> 	;
   111                              <1> 
   112                              <1> srunseq_0:
   113 0000E784 3A05[6B470100]      <1>         cmp     al, [u.uno]     ; same process ?
   114 0000E78A 750C                <1> 	jne	short srunseq_2 ; no
   115                              <1> 
   116 0000E78C 8A25[61470100]      <1> 	mov	ah, [u.pri] 	; present/current priority
   117 0000E792 80FC02              <1> 	cmp	ah, 2       	; 'run for event' priority level
   118 0000E795 7221                <1> 	jb	short srunseq_6 ; no
   119                              <1> 
   120                              <1> srunseq_1:
   121                              <1> 	; there is nothing to do!
   122 0000E797 C3                  <1> 	retn
   123                              <1> 
   124                              <1> srunseq_2:
   125                              <1> 	;;this not necessary ! 23/12/2016
   126                              <1>         ;;cmp	al, nproc	; number of processes = 16 
   127                              <1> 	;;jnb	short srunseq_5	; error ! invalid process number 
   128                              <1> 
   129                              <1> 	; dl = priority
   130 0000E798 80FA02              <1> 	cmp	dl, 2 		; event queue
   131 0000E79B 72FA                <1> 	jb	short srunseq_1 ; requested process is not present
   132                              <1> 				; process and priority of requested
   133                              <1> 				; process is not high (event), 
   134                              <1> 				; there is nothing to do!
   135                              <1> 	
   136                              <1> 	; requested process is not present process
   137                              <1> 	; & priority of requested process is high
   138 0000E79D 3A15[61470100]      <1> 	cmp	dl, [u.pri] 	; priority of present process
   139 0000E7A3 7606                <1> 	jna	short srunseq_3 ; is high, also
   140                              <1> 	;
   141                              <1> 	; present process will be swapped/switched out
   142 0000E7A5 FE05[753E0100]      <1> 	inc	byte [p_change] ; 1
   143                              <1> 
   144                              <1> srunseq_3:
   145                              <1> 	; add process to 'runq_event' queue for new event
   146 0000E7AB BB[0A470100]        <1> 	mov	ebx, runq_event ; high priority run queue
   147                              <1> 
   148                              <1> srunseq_4:
   149                              <1> 	; al = process number
   150                              <1> 	; ebx = run queue
   151 0000E7B0 E8DAF5FFFF          <1> 	call	putlu
   152 0000E7B5 C3                  <1> 	retn
   153                              <1> 
   154                              <1> srunseq_5:
   155 0000E7B6 F5                  <1> 	cmc
   156 0000E7B7 C3                  <1> 	retn
   157                              <1> 
   158                              <1> srunseq_6:
   159                              <1> 	; present priority of the process is not high
   160                              <1> 	
   161 0000E7B8 8815[61470100]      <1> 	mov	[u.pri], dl ; new priority 
   162                              <1> 			    ; (will be used by 'tswap')
   163                              <1> 
   164 0000E7BE 80FA02              <1> 	cmp	dl, 2 		; high priority ?
   165 0000E7C1 72F3                <1> 	jb	short srunseq_5 ; no, there is nothing to do
   166                              <1> 				; in addition
   167                              <1> 
   168                              <1> 	; process must be added to relevant run queue, here!
   169                              <1> 	; (new priority is high/event priority and process
   170                              <1> 	; will not be added to a run queue by 'tswap')
   171                              <1> 
   172 0000E7C3 BB[0C470100]        <1> 	mov	ebx, runq_normal ; 'run as regular' queue
   173                              <1> 
   174 0000E7C8 20E4                <1> 	and	ah, ah  ;  previous value of [u.pri]
   175 0000E7CA 75E4                <1> 	jnz	short srunseq_4
   176                              <1> 
   177 0000E7CC 43                  <1> 	inc	ebx
   178 0000E7CD 43                  <1> 	inc	ebx
   179                              <1> 	; ebx = runq_background ; 'run on backgroud' queue 
   180                              <1> 
   181 0000E7CE EBE0                <1> 	jmp	short srunseq_4
   182                              <1> clock:
   183                              <1> 	; 23/05/2016
   184                              <1> 	; 22/05/2016
   185                              <1> 	; 20/05/2016
   186                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
   187                              <1> 	; 14/05/2015 - 14/10/2015 (Retro UNIX 386 v1)
   188                              <1> 	; 07/12/2013 - 10/04/2014 (Retro UNIX 8086 v1)
   189                              <1> 
   190 0000E7D0 803D[60470100]00    <1> 	cmp	byte [u.quant], 0
   191 0000E7D7 772C                <1> 	ja	short clk_1
   192                              <1> 	;
   193 0000E7D9 803D[6B470100]01    <1> 	cmp     byte [u.uno], 1 ; /etc/init ? (for Retro UNIX 8086 & 386 v1)
   194                              <1> 				; MainProg (Kernel's Command Interpreter)
   195                              <1> 				; for TRDOS 386.
   196 0000E7E0 7623                <1> 	jna	short clk_1 ; yes, do not swap out
   197                              <1> 	;
   198 0000E7E2 803D[13470100]FF    <1> 	cmp     byte [sysflg], 0FFh ; user or system space ?
   199 0000E7E9 7520                <1> 	jne	short clk_2 	    ; system space (sysflg <> 0FFh)
   200                              <1> 	;
   201 0000E7EB 66833D[62470100]00  <1> 	cmp	word [u.intr], 0
   202 0000E7F3 7616                <1> 	jna	short clk_2
   203                              <1> 	;
   204                              <1> 	; 23/05/2016
   205 0000E7F5 803D[763E0100]00    <1> 	cmp	byte [multi_tasking], 0
   206 0000E7FC 760D                <1> 	jna	short clk_2
   207                              <1> 	;
   208 0000E7FE FE05[753E0100]      <1> 	inc	byte [p_change] ; it is time to change running process	
   209 0000E804 C3                  <1> 	retn
   210                              <1> clk_1:
   211 0000E805 FE0D[60470100]      <1> 	dec	byte [u.quant]
   212                              <1> clk_2:
   213 0000E80B C3                  <1> 	retn   ; return to (hardware) timer interrupt routine
   214                              <1> 
   215                              <1> ; 15/01/2017
   216                              <1> ; 14/01/2017
   217                              <1> ; 07/01/2017
   218                              <1> ; 02/01/2017
   219                              <1> ; 17/08/2016
   220                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   221                              <1> int34h:  ; #IOCTL# (I/O port access support for ring 3)
   222                              <1> ; 23/05/2016
   223                              <1> 	; 20/06/2016
   224                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   225                              <1> 	;
   226                              <1> 	; INPUT ->
   227                              <1> 	;	AH = 0 -> read port  (physical IO port) -byte-
   228                              <1> 	;	AH = 1 -> write port (physical IO port) -byte-
   229                              <1> 	;		AL = data byte
   230                              <1> 	;	AH = 2 -> read port  (physical IO port) -word-
   231                              <1> 	;	AH = 3 -> write port (physical IO port) -word-
   232                              <1> 	;		BX = data word
   233                              <1> 	;	AH = 4 -> read port  (physical IO port) -dword-
   234                              <1> 	;	AH = 5 -> write port (physical IO port) -dword-
   235                              <1> 	;		EBX = data dword
   236                              <1> 	;
   237                              <1> 	;	DX = Port number (<= 0FFFFh)
   238                              <1> 	;
   239                              <1> 	; OUTPUT ->
   240                              <1> 	;	AL = data byte (in al, dx)
   241                              <1> 	;	AX = data word (in ax, dx)
   242                              <1> 	;	EAX = data dword (in eax, dx)
   243                              <1> 	;
   244                              <1> 	;	(ECX = actual TRANSFER COUNT for string functions)
   245                              <1> 	;
   246                              <1> 	;
   247                              <1> 	; Modified registers: EAX
   248                              <1> 	;
   249                              <1> 
   250 0000E80C 80FC05              <1> 	cmp	ah, 5
   251 0000E80F 7739                <1> 	ja	short int34h_5 ; invalid function !
   252                              <1> 
   253                              <1> 	;; 15/01/2017
   254                              <1> 	; 14/01/2017
   255                              <1> 	; 02/01/2017
   256                              <1> 	;;mov	byte [ss:intflg], 34h	; IOCTL interrupt 
   257 0000E811 FB                  <1> 	sti
   258                              <1> 	
   259                              <1> 	;sti	; enable interrupts
   260 0000E812 80642408FE          <1> 	and	byte [esp+8], 11111110b	; clear carry bit of eflags register
   261                              <1> 
   262 0000E817 80FC01              <1> 	cmp	ah, 1
   263 0000E81A 7205                <1> 	jb	short int34h_0
   264 0000E81C 7705                <1> 	ja	short int34h_1
   265                              <1> 
   266 0000E81E EE                  <1> 	out	dx, al
   267                              <1> 	;iretd
   268 0000E81F EB01                <1> 	jmp short int34h_iret
   269                              <1> 
   270                              <1> int34h_0:
   271 0000E821 EC                  <1> 	in	al, dx
   272                              <1> 	;iretd
   273                              <1> int34h_iret:
   274                              <1> 	;cli	; 07/01/2017
   275                              <1> 	;; 15/01/2017
   276                              <1> 	;;mov	byte [ss:intflg], 0 ; reset
   277 0000E822 CF                  <1> 	iretd 
   278                              <1> 
   279                              <1> int34h_1:
   280 0000E823 F6C401              <1> 	test	ah, 1
   281 0000E826 7511                <1> 	jnz	short int34h_3 ; out
   282                              <1> 
   283                              <1> 	; in
   284 0000E828 80FC02              <1> 	cmp	ah, 2
   285 0000E82B 7707                <1> 	ja	short int34h_2
   286                              <1> 
   287 0000E82D 6689D8              <1> 	mov	ax, bx
   288 0000E830 66ED                <1> 	in	ax, dx
   289                              <1> 	;iretd
   290 0000E832 EBEE                <1> 	jmp	short int34h_iret
   291                              <1> 
   292                              <1> int34h_2:
   293                              <1> 	; ah = 4
   294 0000E834 89D8                <1> 	mov	eax, ebx
   295 0000E836 ED                  <1> 	in	eax, dx
   296                              <1> 	;iretd
   297 0000E837 EBE9                <1> 	jmp	short int34h_iret
   298                              <1> 
   299                              <1> int34h_3:
   300 0000E839 80FC03              <1> 	cmp	ah, 3
   301 0000E83C 7707                <1> 	ja	short int34h_4
   302                              <1> 
   303 0000E83E 6689D8              <1> 	mov	ax, bx
   304 0000E841 66EF                <1> 	out	dx, ax
   305                              <1> 	;iretd
   306 0000E843 EBDD                <1> 	jmp	short int34h_iret
   307                              <1> 
   308                              <1> int34h_4:
   309                              <1> 	; ah = 5
   310 0000E845 89D8                <1> 	mov	eax, ebx
   311 0000E847 EF                  <1> 	out	dx, eax
   312                              <1> 	;iretd
   313 0000E848 EBD8                <1> 	jmp	short int34h_iret
   314                              <1> 
   315                              <1> int34h_5:
   316 0000E84A 804C240801          <1> 	or	byte [esp+8], 1	; set carry bit of eflags register
   317 0000E84F CF                  <1> 	iretd
   318                              <1> 
   319                              <1> INT4Ah:
   320                              <1> 	; 24/01/2016
   321                              <1> 	; this procedure will be called by 'RTC_INT' (in 'timer.s')
   322 0000E850 C3                  <1> 	retn
   323                              <1> 
   324                              <1> ; u0.s
   325                              <1> ; Retro UNIX 386 v1 Kernel (v0.2) - SYS0.INC
   326                              <1> ; Last Modification: 20/11/2015
   327                              <1> 
   328                              <1> com2_int:
   329                              <1> 	; 07/11/2015 
   330                              <1> 	; 24/10/2015
   331                              <1> 	; 23/10/2015
   332                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - Beginning)
   333                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1)
   334                              <1> 	; < serial port 2 interrupt handler >
   335                              <1> 	;
   336 0000E851 890424              <1> 	mov 	[esp], eax ; overwrite call return address
   337                              <1> 	;push	eax
   338 0000E854 66B80900            <1> 	mov	ax, 9
   339 0000E858 EB07                <1> 	jmp	short comm_int
   340                              <1> com1_int:
   341                              <1> 	; 07/11/2015
   342                              <1> 	; 24/10/2015
   343 0000E85A 890424              <1> 	mov 	[esp], eax ; overwrite call return address
   344                              <1> 	; 23/10/2015
   345                              <1> 	;push	eax
   346 0000E85D 66B80800            <1> 	mov	ax, 8
   347                              <1> comm_int:
   348                              <1> 	; 20/11/2015
   349                              <1> 	; 18/11/2015
   350                              <1> 	; 17/11/2015
   351                              <1> 	; 16/11/2015
   352                              <1> 	; 09/11/2015
   353                              <1> 	; 08/11/2015
   354                              <1> 	; 07/11/2015
   355                              <1> 	; 06/11/2015 (serial4.asm, 'serial')	
   356                              <1> 	; 01/11/2015
   357                              <1> 	; 26/10/2015
   358                              <1> 	; 23/10/2015
   359 0000E861 53                  <1> 	push	ebx
   360 0000E862 56                  <1> 	push	esi
   361 0000E863 57                  <1> 	push	edi
   362 0000E864 1E                  <1> 	push 	ds
   363 0000E865 06                  <1> 	push 	es
   364                              <1> 	; 18/11/2015
   365 0000E866 0F20DB              <1> 	mov	ebx, cr3
   366 0000E869 53                  <1> 	push	ebx ; ****
   367                              <1> 	;
   368 0000E86A 51                  <1> 	push	ecx ; ***
   369 0000E86B 52                  <1> 	push	edx ; **
   370                              <1> 	;
   371 0000E86C BB10000000          <1> 	mov	ebx, KDATA
   372 0000E871 8EDB                <1> 	mov	ds, bx
   373 0000E873 8EC3                <1> 	mov	es, bx
   374                              <1> 	;
   375 0000E875 8B0D[E0300100]      <1> 	mov	ecx, [k_page_dir]
   376 0000E87B 0F22D9              <1> 	mov	cr3, ecx
   377                              <1> 	; 20/11/2015
   378                              <1> 	; Interrupt identification register
   379 0000E87E 66BAFA02            <1> 	mov	dx, 2FAh ; COM2
   380                              <1> 	;
   381 0000E882 3C08                <1> 	cmp 	al, 8 
   382 0000E884 7702                <1> 	ja 	short com_i0
   383                              <1> 	;
   384                              <1> 	; 20/11/2015
   385                              <1> 	; 17/11/2015
   386                              <1> 	; 16/11/2015
   387                              <1> 	; 15/11/2015
   388                              <1> 	; 24/10/2015
   389                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - Beginning)
   390                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1)
   391                              <1> 	; < serial port 1 interrupt handler >
   392                              <1> 	;
   393 0000E886 FEC6                <1> 	inc	dh ; 3FAh ; COM1 Interrupt id. register
   394                              <1> com_i0:
   395                              <1> 	;push	eax ; *
   396                              <1> 	; 07/11/2015
   397 0000E888 A2[4A310100]        <1> 	mov 	byte [ccomport], al
   398                              <1> 	; 09/11/2015
   399 0000E88D 0FB7D8              <1> 	movzx	ebx, ax ; 8 or 9
   400                              <1> 	; 17/11/2015
   401                              <1>  	; reset request for response status
   402 0000E890 88A3[40310100]      <1> 	mov	[ebx+req_resp-8], ah ; 0
   403                              <1> 	;
   404                              <1> 	; 20/11/2015
   405 0000E896 EC                  <1> 	in	al, dx		; read interrupt id. register
   406 0000E897 EB00                <1> 	JMP	$+2	   	; I/O DELAY
   407 0000E899 2404                <1> 	and	al, 4		; received data available?	
   408 0000E89B 7470                <1> 	jz	short com_eoi	; (transmit. holding reg. empty)
   409                              <1> 	;
   410                              <1> 	; 20/11/2015
   411 0000E89D 80EA02              <1> 	sub	dl, 3FAh-3F8h	; data register (3F8h, 2F8h)
   412 0000E8A0 EC                  <1> 	in	al, dx     	; read character
   413                              <1> 	;JMP	$+2	   	; I/O DELAY
   414                              <1> 	; 08/11/2015
   415                              <1> 	; 07/11/2015
   416 0000E8A1 89DE                <1> 	mov	esi, ebx 
   417 0000E8A3 89DF                <1> 	mov	edi, ebx
   418 0000E8A5 81C6[44310100]      <1> 	add 	esi, rchar - 8 ; points to last received char
   419 0000E8AB 81C7[46310100]      <1> 	add	edi, schar - 8 ; points to last sent char
   420 0000E8B1 8806                <1> 	mov	[esi], al ; received char (current char)
   421                              <1> 	; query
   422 0000E8B3 20C0                <1> 	and	al, al
   423 0000E8B5 7527                <1> 	jnz	short com_i2
   424                              <1>    	; response
   425                              <1> 	; 17/11/2015
   426                              <1> 	; set request for response status
   427 0000E8B7 FE83[40310100]      <1>         inc     byte [ebx+req_resp-8] ; 1 
   428                              <1> 	;
   429 0000E8BD 6683C205            <1> 	add	dx, 3FDh-3F8h	; (3FDh, 2FDh)
   430 0000E8C1 EC                  <1> 	in	al, dx	   	; read line status register 
   431 0000E8C2 EB00                <1> 	JMP	$+2	   	; I/O DELAY
   432 0000E8C4 2420                <1> 	and	al, 20h	   	; transmitter holding reg. empty?
   433 0000E8C6 7445                <1> 	jz	short com_eoi 	; no
   434 0000E8C8 B0FF                <1> 	mov 	al, 0FFh   	; response			
   435 0000E8CA 6683EA05            <1> 	sub	dx, 3FDh-3F8h 	; data port (3F8h, 2F8h)
   436 0000E8CE EE                  <1> 	out	dx, al	   	; send on serial port
   437                              <1> 	; 17/11/2015
   438 0000E8CF 803F00              <1> 	cmp 	byte [edi], 0   ; query ? (schar)
   439 0000E8D2 7502                <1> 	jne 	short com_i1    ; no
   440 0000E8D4 8807                <1> 	mov	[edi], al 	; 0FFh (responded)
   441                              <1> com_i1:
   442                              <1> 	; 17/11/2015
   443                              <1> 	; reset request for response status (again)
   444 0000E8D6 FE8B[40310100]      <1>         dec     byte [ebx+req_resp-8] ; 0 
   445 0000E8DC EB2F                <1> 	jmp	short com_eoi
   446                              <1> com_i2:	
   447                              <1> 	; 08/11/2015
   448 0000E8DE 3CFF                <1> 	cmp 	al, 0FFh	; (response ?)
   449 0000E8E0 7417                <1> 	je	short com_i3	; (check for response signal)
   450                              <1> 	; 07/11/2015
   451 0000E8E2 3C04                <1> 	cmp	al, 04h	; EOT
   452 0000E8E4 751C                <1> 	jne	short com_i4	
   453                              <1> 	; EOT = 04h (End of Transmit) - 'CTRL + D'
   454                              <1> 	;(an EOT char is supposed as a ctrl+brk from the terminal)
   455                              <1> 	; 08/11/2015
   456                              <1> 		; ptty -> tty 0 to 7 (pseudo screens)
   457 0000E8E6 861D[0E310100]      <1> 	xchg	bl, [ptty]  ; tty number (8 or 9)
   458 0000E8EC E8F471FFFF          <1> 	call 	ctrlbrk
   459 0000E8F1 861D[0E310100]      <1> 	xchg	[ptty], bl ; (restore ptty value and BL value)
   460                              <1> 	;mov	al, 04h ; EOT
   461                              <1> 	; 08/11/2015
   462 0000E8F7 EB09                <1> 	jmp	short com_i4	
   463                              <1> com_i3:
   464                              <1> 	; 08/11/2015
   465                              <1> 	; If 0FFh has been received just after a query
   466                              <1> 	; (schar, ZERO), it is a response signal.
   467                              <1> 	; 17/11/2015
   468 0000E8F9 803F00              <1>         cmp     byte [edi], 0 ; query ? (schar)
   469 0000E8FC 7704                <1> 	ja	short com_i4 ; no
   470                              <1> 	; reset query status (schar)
   471 0000E8FE 8807                <1> 	mov	[edi], al ; 0FFh
   472 0000E900 FEC0                <1> 	inc	al ; 0
   473                              <1> com_i4:
   474                              <1> 	; 27/07/2014
   475                              <1> 	; 09/07/2014
   476 0000E902 D0E3                <1> 	shl	bl, 1	
   477 0000E904 81C3[10310100]      <1> 	add	ebx, ttychr
   478                              <1> 	; 23/07/2014 (always overwrite)
   479                              <1> 	;;cmp	word [ebx], 0
   480                              <1> 	;;ja	short com_eoi
   481                              <1> 	;
   482 0000E90A 668903              <1> 	mov	[ebx], ax   ; Save ascii code
   483                              <1> 			    ; scan code = 0
   484                              <1> com_eoi:
   485                              <1> 	;mov	al, 20h
   486                              <1> 	;out	20h, al	   ; end of interrupt
   487                              <1> 	;
   488                              <1> 	; 07/11/2015
   489                              <1>       	;pop	eax ; *
   490 0000E90D A0[4A310100]        <1> 	mov	al, byte [ccomport] ; current COM port
   491                              <1> 	 ; al = tty number (8 or 9)
   492 0000E912 E85E010000          <1>         call	wakeup
   493                              <1> com_iret:
   494                              <1> 	; 23/10/2015
   495 0000E917 5A                  <1> 	pop	edx ; **
   496 0000E918 59                  <1> 	pop	ecx ; ***
   497                              <1> 	; 18/11/2015
   498                              <1> 	;pop	eax ; ****
   499                              <1> 	;mov	cr3, eax
   500                              <1> 	;jmp	iiret
   501 0000E919 E94421FFFF          <1> 	jmp	iiretp
   502                              <1> 
   503                              <1> ;iiretp: ; 01/09/2015
   504                              <1> ;	; 28/08/2015
   505                              <1> ;	pop	eax ; (*) page directory
   506                              <1> ;	mov	cr3, eax
   507                              <1> ;iiret:
   508                              <1> ;	; 22/08/2014
   509                              <1> ;	mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
   510                              <1> ;	out	20h, al	; 8259 PORT
   511                              <1> ;	;
   512                              <1> ;	pop	es
   513                              <1> ;	pop	ds
   514                              <1> ;	pop	edi
   515                              <1> ;	pop	esi
   516                              <1> ;	pop	ebx ; 29/08/2014
   517                              <1> ;	pop 	eax
   518                              <1> ;	iretd
   519                              <1> 
   520                              <1> sp_init:
   521                              <1> 	; 07/11/2015
   522                              <1> 	; 29/10/2015
   523                              <1> 	; 26/10/2015
   524                              <1> 	; 23/10/2015
   525                              <1> 	; 29/06/2015
   526                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - 115200 baud)
   527                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1 - 9600 baud)
   528                              <1> 	; Initialization of Serial Port Communication Parameters
   529                              <1> 	; (COM1 base port address = 3F8h, COM1 Interrupt = IRQ 4)
   530                              <1> 	; (COM2 base port address = 2F8h, COM1 Interrupt = IRQ 3)
   531                              <1> 	;
   532                              <1> 	; ((Modified registers: EAX, ECX, EDX, EBX))
   533                              <1> 	;
   534                              <1> 	; INPUT:  (29/06/2015)
   535                              <1> 	;	AL = 0 for COM1
   536                              <1> 	;	     1 for COM2
   537                              <1> 	;	AH = Communication parameters	
   538                              <1> 	;
   539                              <1> 	;  (*) Communication parameters (except BAUD RATE):
   540                              <1> 	;	Bit	4	3	2	1	0
   541                              <1> 	;		-PARITY--   STOP BIT  -WORD LENGTH-	 		 
   542                              <1> 	;  this one -->	00 = none    0 = 1 bit  11 = 8 bits
   543                              <1> 	;		01 = odd     1 = 2 bits	10 = 7 bits
   544                              <1> 	;		11 = even
   545                              <1> 	;  Baud rate setting bits: (29/06/2015)
   546                              <1> 	;		Retro UNIX 386 v1 feature only !
   547                              <1> 	;	Bit	7    6    5  | Baud rate
   548                              <1> 	;		------------------------
   549                              <1> 	;	value	0    0    0  | Default (Divisor = 1)
   550                              <1> 	;		0    0    1  | 9600 (12)
   551                              <1> 	;		0    1    0  | 19200 (6) 
   552                              <1> 	;		0    1	  1  | 38400 (3) 
   553                              <1> 	;		1    0	  0  | 14400 (8)
   554                              <1> 	;		1    0	  1  | 28800 (4)
   555                              <1> 	;		1    1    0  | 57600 (2)
   556                              <1> 	;		1    1    1  | 115200 (1) 	
   557                              <1> 	
   558                              <1> 	; References:	
   559                              <1> 	; (1) IBM PC-XT Model 286 BIOS Source Code
   560                              <1> 	;     RS232.ASM --- 10/06/1985 COMMUNICATIONS BIOS (RS232)
   561                              <1> 	; (2) Award BIOS 1999 - ATORGS.ASM
   562                              <1> 	; (3) http://wiki.osdev.org/Serial_Ports
   563                              <1> 	;
   564                              <1> 	; Set communication parameters for COM1 (= 03h)	
   565                              <1> 	;
   566 0000E91E BB[46310100]        <1> 	mov	ebx, com1p		; COM1 parameters  
   567 0000E923 66BAF803            <1> 	mov	dx, 3F8h		; COM1
   568                              <1> 	 ; 29/10/2015
   569 0000E927 66B90103            <1> 	mov	cx, 301h  ; divisor = 1 (115200 baud)
   570 0000E92B E86F000000          <1> 	call	sp_i3	; call A4	
   571 0000E930 A880                <1> 	test	al, 80h
   572 0000E932 7410                <1> 	jz	short sp_i0 ; OK..
   573                              <1> 		; Error !
   574                              <1> 	;mov	dx, 3F8h
   575 0000E934 80EA05              <1> 	sub	dl, 5 ; 3FDh -> 3F8h
   576 0000E937 66B90E03            <1> 	mov	cx, 30Eh  ; divisor = 12 (9600 baud)
   577 0000E93B E85F000000          <1> 	call	sp_i3	; call A4	
   578 0000E940 A880                <1> 	test	al, 80h
   579 0000E942 7508                <1> 	jnz	short sp_i1
   580                              <1> sp_i0:
   581                              <1>         ; (Note: Serial port interrupts will be disabled here...)	
   582                              <1>         ; (INT 14h initialization code disables interrupts.)
   583                              <1> 	;
   584 0000E944 C603E3              <1> 	mov	byte [ebx], 0E3h ; 11100011b
   585 0000E947 E8DC000000          <1> 	call	sp_i5 ; 29/06/2015
   586                              <1> sp_i1:
   587 0000E94C 43                  <1> 	inc	ebx
   588 0000E94D 66BAF802            <1> 	mov	dx, 2F8h		; COM2
   589                              <1> 	 ; 29/10/2015
   590 0000E951 66B90103            <1> 	mov	cx, 301h  ; divisor = 1 (115200 baud)
   591 0000E955 E845000000          <1> 	call	sp_i3	; call A4	
   592 0000E95A A880                <1> 	test	al, 80h
   593 0000E95C 7410                <1> 	jz	short sp_i2 ; OK..
   594                              <1> 		; Error !
   595                              <1> 	;mov	dx, 2F8h
   596 0000E95E 80EA05              <1> 	sub	dl, 5 ; 2FDh -> 2F8h
   597 0000E961 66B90E03            <1> 	mov	cx, 30Eh  ; divisor = 12 (9600 baud)
   598 0000E965 E835000000          <1> 	call	sp_i3	; call A4	
   599 0000E96A A880                <1> 	test	al, 80h
   600 0000E96C 7530                <1> 	jnz	short sp_i7
   601                              <1> sp_i2:
   602 0000E96E C603E3              <1> 	mov	byte [ebx], 0E3h ; 11100011b
   603                              <1> sp_i6:
   604                              <1> 	;; COM2 - enabling IRQ 3
   605                              <1> 	; 07/11/2015
   606                              <1> 	; 26/10/2015
   607 0000E971 9C                  <1> 	pushf
   608 0000E972 FA                  <1> 	cli
   609                              <1> 	;
   610 0000E973 66BAFC02            <1> 	mov	dx, 2FCh   		; modem control register
   611 0000E977 EC                  <1> 	in	al, dx 	   		; read register
   612 0000E978 EB00                <1> 	JMP	$+2	   		; I/O DELAY
   613 0000E97A 0C08                <1> 	or	al, 8      		; enable bit 3 (OUT2)
   614 0000E97C EE                  <1> 	out	dx, al     		; write back to register
   615 0000E97D EB00                <1> 	JMP	$+2	   		; I/O DELAY
   616 0000E97F 66BAF902            <1> 	mov	dx, 2F9h   		; interrupt enable register
   617 0000E983 EC                  <1> 	in	al, dx     		; read register
   618 0000E984 EB00                <1> 	JMP	$+2	   		; I/O DELAY
   619                              <1> 	;or	al, 1      		; receiver data interrupt enable and
   620 0000E986 0C03                <1> 	or	al, 3	   		; transmitter empty interrupt enable
   621 0000E988 EE                  <1> 	out	dx, al 	   		; write back to register
   622 0000E989 EB00                <1> 	JMP	$+2        		; I/O DELAY
   623 0000E98B E421                <1> 	in	al, 21h    		; read interrupt mask register
   624 0000E98D EB00                <1> 	JMP	$+2	   		; I/O DELAY
   625 0000E98F 24F7                <1> 	and	al, 0F7h   		; enable IRQ 3 (COM2)
   626 0000E991 E621                <1> 	out	21h, al    		; write back to register
   627                              <1> 	;
   628                              <1> 	; 23/10/2015
   629 0000E993 B8[51E80000]        <1> 	mov 	eax, com2_int
   630 0000E998 A3[70EA0000]        <1> 	mov	[com2_irq3], eax
   631                              <1> 	; 26/10/2015
   632 0000E99D 9D                  <1> 	popf	
   633                              <1> sp_i7:
   634 0000E99E C3                  <1> 	retn
   635                              <1> 
   636                              <1> sp_i3:
   637                              <1> ;A4:  	;-----	INITIALIZE THE COMMUNICATIONS PORT
   638                              <1> 	; 28/10/2015
   639 0000E99F FEC2                <1> 	inc	dl	; 3F9h (2F9h)	; 3F9h, COM1 Interrupt enable register 
   640 0000E9A1 B000                <1> 	mov	al, 0
   641 0000E9A3 EE                  <1> 	out	dx, al			; disable serial port interrupt
   642 0000E9A4 EB00                <1> 	JMP	$+2			; I/O DELAY
   643 0000E9A6 80C202              <1> 	add	dl, 2 	; 3FBh (2FBh)	; COM1 Line control register (3FBh)
   644 0000E9A9 B080                <1> 	mov	al, 80h			
   645 0000E9AB EE                  <1> 	out	dx, al			; SET DLAB=1 ; divisor latch access bit
   646                              <1> 	;-----	SET BAUD RATE DIVISOR
   647                              <1> 	; 26/10/2015
   648 0000E9AC 80EA03              <1> 	sub 	dl, 3   ; 3F8h (2F8h)	; register for least significant byte
   649                              <1> 					; of the divisor value
   650 0000E9AF 88C8                <1> 	mov	al, cl	; 1
   651 0000E9B1 EE                  <1> 	out	dx, al			; 1 = 115200 baud (Retro UNIX 386 v1)
   652                              <1> 					; 2 = 57600 baud
   653                              <1> 					; 3 = 38400 baud
   654                              <1> 					; 6 = 19200 baud
   655                              <1> 					; 12 = 9600 baud (Retro UNIX 8086 v1)
   656 0000E9B2 EB00                <1> 	JMP	$+2			; I/O DELAY
   657 0000E9B4 28C0                <1> 	sub	al, al
   658 0000E9B6 FEC2                <1> 	inc	dl      ; 3F9h (2F9h)	; register for most significant byte
   659                              <1> 					; of the divisor value
   660 0000E9B8 EE                  <1> 	out	dx, al ; 0
   661 0000E9B9 EB00                <1> 	JMP	$+2			; I/O DELAY
   662                              <1> 	;	
   663 0000E9BB 88E8                <1> 	mov	al, ch ; 3		; 8 data bits, 1 stop bit, no parity
   664                              <1> 	;and	al, 1Fh ; Bits 0,1,2,3,4	
   665 0000E9BD 80C202              <1> 	add	dl, 2	; 3FBh (2FBh)	; Line control register
   666 0000E9C0 EE                  <1> 	out	dx, al			
   667 0000E9C1 EB00                <1> 	JMP	$+2			; I/O DELAY
   668                              <1> 	; 29/10/2015
   669 0000E9C3 FECA                <1> 	dec 	dl 	; 3FAh (2FAh)	; FIFO Control register (16550/16750)
   670 0000E9C5 30C0                <1> 	xor	al, al			; 0
   671 0000E9C7 EE                  <1> 	out	dx, al			; Disable FIFOs (reset to 8250 mode)
   672 0000E9C8 EB00                <1> 	JMP	$+2	
   673                              <1> sp_i4:
   674                              <1> ;A18:	;-----	COMM PORT STATUS ROUTINE
   675                              <1> 	; 29/06/2015 (line status after modem status)
   676 0000E9CA 80C204              <1> 	add	dl, 4	; 3FEh (2FEh)	; Modem status register
   677                              <1> sp_i4s:
   678 0000E9CD EC                  <1> 	in	al, dx			; GET MODEM CONTROL STATUS
   679 0000E9CE EB00                <1> 	JMP	$+2			; I/O DELAY
   680 0000E9D0 88C4                <1> 	mov	ah, al			; PUT IN (AH) FOR RETURN
   681 0000E9D2 FECA                <1> 	dec	dl	; 3FDh (2FDh)	; POINT TO LINE STATUS REGISTER
   682                              <1> 					; dx = 3FDh for COM1, 2FDh for COM2
   683 0000E9D4 EC                  <1> 	in	al, dx			; GET LINE CONTROL STATUS
   684                              <1> 	; AL = Line status, AH = Modem status
   685 0000E9D5 C3                  <1> 	retn
   686                              <1> 
   687                              <1> sp_status:
   688                              <1> 	; 29/06/2015
   689                              <1> 	; 27/06/2015 (Retro UNIX 386 v1)
   690                              <1> 	; Get serial port status
   691 0000E9D6 66BAFE03            <1> 	mov	dx, 3FEh		; Modem status register (COM1)
   692 0000E9DA 28C6                <1> 	sub	dh, al			; dh = 2 for COM2 (al = 1)
   693                              <1> 					; dx = 2FEh for COM2
   694 0000E9DC EBEF                <1> 	jmp	short sp_i4s
   695                              <1> 
   696                              <1> sp_setp: ; Set serial port communication parameters
   697                              <1> 	; 07/11/2015
   698                              <1> 	; 29/10/2015
   699                              <1> 	; 29/06/2015
   700                              <1> 	; Retro UNIX 386 v1 feature only !	
   701                              <1> 	;
   702                              <1> 	; INPUT:
   703                              <1> 	;	AL = 0 for COM1
   704                              <1> 	;	     1 for COM2
   705                              <1> 	;	AH = Communication parameters (*)
   706                              <1> 	; OUTPUT:
   707                              <1> 	;	CL = Line status
   708                              <1> 	;	CH = Modem status
   709                              <1> 	;   If cf = 1 -> Error code in [u.error]
   710                              <1> 	;		 'invalid parameter !' 
   711                              <1> 	;		 	 or
   712                              <1> 	;		 'device not ready !' error
   713                              <1> 	;	
   714                              <1> 	;  (*) Communication parameters (except BAUD RATE):
   715                              <1> 	;	Bit	4	3	2	1	0
   716                              <1> 	;		-PARITY--   STOP BIT  -WORD LENGTH-	 		 
   717                              <1> 	;  this one -->	00 = none    0 = 1 bit  11 = 8 bits
   718                              <1> 	;		01 = odd     1 = 2 bits	10 = 7 bits
   719                              <1> 	;		11 = even
   720                              <1> 	;  Baud rate setting bits: (29/06/2015)
   721                              <1> 	;		Retro UNIX 386 v1 feature only !
   722                              <1> 	;	Bit	7    6    5  | Baud rate
   723                              <1> 	;		------------------------
   724                              <1> 	;	value	0    0    0  | Default (Divisor = 1)
   725                              <1> 	;		0    0    1  | 9600 (12)
   726                              <1> 	;		0    1    0  | 19200 (6) 
   727                              <1> 	;		0    1	  1  | 38400 (3) 
   728                              <1> 	;		1    0	  0  | 14400 (8)
   729                              <1> 	;		1    0	  1  | 28800 (4)
   730                              <1> 	;		1    1    0  | 57600 (2)
   731                              <1> 	;		1    1    1  | 115200 (1) 
   732                              <1> 	;
   733                              <1> 	; (COM1 base port address = 3F8h, COM1 Interrupt = IRQ 4)
   734                              <1> 	; (COM2 base port address = 2F8h, COM1 Interrupt = IRQ 3)
   735                              <1> 	;
   736                              <1> 	; ((Modified registers: EAX, ECX, EDX, EBX))
   737                              <1> 	;
   738 0000E9DE 66BAF803            <1> 	mov	dx, 3F8h
   739 0000E9E2 BB[46310100]        <1> 	mov	ebx, com1p ; COM1 control byte offset
   740 0000E9E7 3C01                <1> 	cmp	al, 1
   741 0000E9E9 776B                <1> 	ja 	short sp_invp_err
   742 0000E9EB 7203                <1> 	jb	short sp_setp1 ;  COM1 (AL = 0)
   743 0000E9ED FECE                <1> 	dec	dh ; 2F8h
   744 0000E9EF 43                  <1> 	inc	ebx ; COM2 control byte offset
   745                              <1> sp_setp1:
   746                              <1> 	; 29/10/2015
   747 0000E9F0 8823                <1> 	mov	[ebx], ah
   748 0000E9F2 0FB6CC              <1> 	movzx 	ecx, ah
   749 0000E9F5 C0E905              <1> 	shr	cl, 5 ; -> baud rate index
   750 0000E9F8 80E41F              <1> 	and	ah, 1Fh ; communication parameters except baud rate
   751 0000E9FB 8A81[65EA0000]      <1> 	mov	al, [ecx+b_div_tbl]
   752 0000EA01 6689C1              <1> 	mov	cx, ax
   753 0000EA04 E896FFFFFF          <1> 	call	sp_i3
   754 0000EA09 6689C1              <1> 	mov	cx, ax ; CL = Line status, CH = Modem status
   755 0000EA0C A880                <1> 	test	al, 80h
   756 0000EA0E 740F                <1> 	jz	short sp_setp2
   757 0000EA10 C603E3              <1>         mov     byte [ebx], 0E3h ; Reset to initial value (11100011b)
   758                              <1> stp_dnr_err:
   759 0000EA13 C705[80470100]0F00- <1> 	mov	dword [u.error], ERR_DEV_NOT_RDY ; 'device not ready !'
   759 0000EA1B 0000                <1>
   760                              <1> 	; CL = Line status, CH = Modem status
   761 0000EA1D F9                  <1> 	stc
   762 0000EA1E C3                  <1> 	retn
   763                              <1> sp_setp2:
   764 0000EA1F 80FE02              <1> 	cmp	dh, 2 ; COM2 (2F?h)
   765 0000EA22 0F8649FFFFFF        <1>         jna     sp_i6 
   766                              <1> 		      ; COM1 (3F?h)
   767                              <1> sp_i5: 
   768                              <1> 	; 07/11/2015
   769                              <1> 	; 26/10/2015
   770                              <1> 	; 29/06/2015
   771                              <1> 	;
   772                              <1> 	;; COM1 - enabling IRQ 4
   773 0000EA28 9C                  <1> 	pushf
   774 0000EA29 FA                  <1> 	cli
   775 0000EA2A 66BAFC03            <1> 	mov	dx, 3FCh   		; modem control register
   776 0000EA2E EC                  <1> 	in	al, dx 	   		; read register
   777 0000EA2F EB00                <1> 	JMP	$+2			; I/O DELAY
   778 0000EA31 0C08                <1> 	or	al, 8      		; enable bit 3 (OUT2)
   779 0000EA33 EE                  <1> 	out	dx, al     		; write back to register
   780 0000EA34 EB00                <1> 	JMP	$+2			; I/O DELAY
   781 0000EA36 66BAF903            <1> 	mov	dx, 3F9h   		; interrupt enable register
   782 0000EA3A EC                  <1> 	in	al, dx     		; read register
   783 0000EA3B EB00                <1> 	JMP	$+2			; I/O DELAY
   784                              <1> 	;or	al, 1      		; receiver data interrupt enable and
   785 0000EA3D 0C03                <1> 	or	al, 3	   		; transmitter empty interrupt enable
   786 0000EA3F EE                  <1> 	out	dx, al 	   		; write back to register
   787 0000EA40 EB00                <1> 	JMP	$+2        		; I/O DELAY
   788 0000EA42 E421                <1> 	in	al, 21h    		; read interrupt mask register
   789 0000EA44 EB00                <1> 	JMP	$+2			; I/O DELAY
   790 0000EA46 24EF                <1> 	and	al, 0EFh   		; enable IRQ 4 (COM1)
   791 0000EA48 E621                <1> 	out	21h, al    		; write back to register
   792                              <1> 	;
   793                              <1> 	; 23/10/2015
   794 0000EA4A B8[5AE80000]        <1> 	mov 	eax, com1_int
   795 0000EA4F A3[6CEA0000]        <1> 	mov	[com1_irq4], eax
   796                              <1> 	; 26/10/2015
   797 0000EA54 9D                  <1> 	popf
   798 0000EA55 C3                  <1> 	retn
   799                              <1> 
   800                              <1> sp_invp_err:
   801 0000EA56 C705[80470100]1700- <1> 	mov	dword [u.error], ERR_INV_PARAMETER ; 'invalid parameter !' 
   801 0000EA5E 0000                <1>
   802 0000EA60 31C9                <1> 	xor	ecx, ecx
   803 0000EA62 49                  <1> 	dec	ecx ; 0FFFFh
   804 0000EA63 F9                  <1> 	stc
   805 0000EA64 C3                  <1> 	retn
   806                              <1> 
   807                              <1> ; 29/10/2015
   808                              <1> b_div_tbl: ; Baud rate divisor table (115200/divisor)
   809 0000EA65 010C0603080401      <1> 	db 1, 12, 6, 3, 8, 4, 1
   810                              <1> 
   811                              <1> 
   812                              <1> ; 23/10/2015
   813                              <1> com1_irq4:
   814 0000EA6C [74EA0000]          <1> 	dd dummy_retn
   815                              <1> com2_irq3:
   816 0000EA70 [74EA0000]          <1> 	dd dummy_retn
   817                              <1> 
   818                              <1> dummy_retn:
   819 0000EA74 C3                  <1> 	retn
   820                              <1> 
   821                              <1> wakeup:
   822                              <1> 	; 24/01/2016
   823 0000EA75 C3                  <1> 	retn
   824                              <1> 
   825                              <1> set_working_path_x:
   826                              <1> 		; 17/10/2016 (TRDOS 386 - FFF & FNF)
   827 0000EA76 66B80100            <1> 		mov	ax, 1 
   828                              <1> 			; File name is needed/forced (AL=1)
   829                              <1> 			; Change directory as temprorary (AH=0)	
   830                              <1> 
   831                              <1> 		; This is needed for preventing wrong Find Next File
   832                              <1> 		; system call after sysopen, syscreate, sysmkdir etc. 
   833                              <1> 		; Find Next File must immmediate follow Find First file)
   834                              <1> 
   835 0000EA7A 8825[983E0100]      <1> 		mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
   836                              <1> 
   837                              <1> set_working_path:
   838                              <1> 		; 16/10/2016
   839                              <1> 		; 12/10/2016
   840                              <1> 		; 10/10/2016
   841                              <1> 		; 05/10/2016 - TRDOS 386 (TRDOS v2.0)
   842                              <1> 		;
   843                              <1> 		; TRDOS v1.0 (DIR.ASM, "proc_set_working_path")
   844                              <1>                 ; 27/01/2011 - 08/02/2011 
   845                              <1> 		; Set/Changes current drive, directory and file
   846                              <1> 		; depending on command tail
   847                              <1> 		; (procedure is derivated from CMD_INTR.ASM 
   848                              <1> 		; file or dir locating code of internal commands)
   849                              <1> 		; (This procedure is prepared for INT 21H file/dir 
   850                              <1> 		; functions and also to get compact code for 
   851                              <1> 		; internal mainprog -command interpreter- commands)
   852                              <1> 		; 
   853                              <1> 		; INPUT: DS:SI -> Command tail (ASCIIZ string)
   854                              <1> 		; AL= 0 -> any, AL > 0 -> file name is forced
   855                              <1> 		; AH= CD -> Change directory permanently 
   856                              <1> 		; AH <> CD -> Change directory as temporary    
   857                              <1> 		; 
   858                              <1> 		; OUTPUT: ES=DS, FindFile structure has been set
   859                              <1> 		;        RUN_CDRV points previous current drive  
   860                              <1> 		;        DS:SI = FindFile structure address
   861                              <1> 		;        (DS=CS)       
   862                              <1> 		;        AX, BX, CX, DX, DI will be changed
   863                              <1> 		;   cf = 1 -> Error code in AX (AL)
   864                              <1> 		;        stc & AX = 0 -> Bad command or path name 
   865                              <1> 		; -----------------------------------------------
   866                              <1> 		;
   867                              <1> 		; TRDOS 386 (05/10/2016)
   868                              <1> 		; INPUT:
   869                              <1> 		;	ESI = File/Directory Path (ASCIIZ string)
   870                              <1> 		;             address in user's memory space
   871                              <1> 		;       Al = 0 -> any
   872                              <1> 		;       AL > 0 -> file name is forced
   873                              <1> 		;       AH = CD -> change directory as permanent
   874                              <1> 		;       AH <> CD -> change directory as temporary
   875                              <1> 		; 
   876                              <1> 		; OUTPUT:
   877                              <1> 		;	FindFile structure has been set
   878                              <1> 		;       RUN_CDRV points previous current drive  
   879                              <1> 		;       ESI = FindFile_Name address ; 12/10/2016
   880                              <1> 		;
   881                              <1> 		;       cf = 1 -> Error code in EAX (AL)
   882                              <1> 		;       stc & EAX = 0 -> Bad command or path name
   883                              <1> 		;  
   884                              <1> 		; Modified registers: EAX, EBX, ECX, EDX, ESI, EDI
   885                              <1> 
   886 0000EA80 66A3[9C3E0100]      <1> 		mov	[SWP_Mode], ax
   887 0000EA86 A0[A6310100]        <1> 		mov	al, [Current_Drv]
   888 0000EA8B 30E4                <1> 		xor	ah, ah
   889 0000EA8D 66A3[9E3E0100]      <1> 		mov	word [SWP_DRV], ax
   890                              <1> 
   891                              <1> 		; TRDOS 386 ring 3 (user's page directory)
   892                              <1> 		; to ring 0 (kernel's page directory) 
   893                              <1> 		; transfer modifications (05/10/2016).
   894                              <1> 
   895 0000EA93 55                  <1> 		push	ebp
   896 0000EA94 89E5                <1> 		mov	ebp, esp
   897                              <1> 		
   898 0000EA96 B980000000          <1> 		mov	ecx, 128 ; maximum path length = 128 bytes
   899 0000EA9B 29CC                <1> 		sub	esp, ecx ; reserve 128 bytes (buffer) on stack
   900 0000EA9D 89E7                <1> 		mov	edi, esp ; destination address (kernel space)
   901                              <1> 		; esi = source address (virtual, in user's memory space)
   902 0000EA9F E820F4FFFF          <1> 		call	transfer_from_user_buffer
   903 0000EAA4 720A                <1> 		jc	short loc_swp_xor_retn 
   904                              <1> 		
   905 0000EAA6 89E6                <1> 		mov	esi, esp ; temporary buffer (the path) on stack
   906                              <1> loc_swp_fchar:
   907 0000EAA8 8A06                <1> 		mov	al, [esi]
   908 0000EAAA 3C20                <1> 		cmp	al, 20h
   909 0000EAAC 7711                <1> 		ja	short loc_swp_parse_path_name
   910 0000EAAE 740C                <1> 		je	short loc_swp_fchar_next
   911                              <1> 
   912                              <1> loc_swp_xor_retn:
   913 0000EAB0 31C0                <1> 		xor	eax, eax
   914 0000EAB2 F9                  <1> 		stc
   915                              <1> loc_swp_retn:
   916 0000EAB3 89EC                <1> 		mov	esp, ebp
   917 0000EAB5 5D                  <1> 		pop	ebp
   918                              <1> 
   919                              <1> 		;mov	esi, FindFile_Drv
   920 0000EAB6 BE[8C3B0100]        <1> 		mov	esi, FindFile_Name ; 12/10/2016
   921 0000EABB C3                  <1> 		retn 
   922                              <1> 
   923                              <1> loc_swp_fchar_next:
   924 0000EABC 46                  <1> 		inc	esi
   925 0000EABD EBE9                <1> 		jmp	short loc_swp_fchar  
   926                              <1> 
   927                              <1> loc_swp_parse_path_name:
   928 0000EABF BF[4A3B0100]        <1> 		mov	edi, FindFile_Drv
   929 0000EAC4 E84CAEFFFF          <1> 		call	parse_path_name
   930 0000EAC9 72E8                <1> 		jc	short loc_swp_retn
   931                              <1> 
   932                              <1> loc_swp_checkfile_name:
   933 0000EACB 803D[9C3E0100]00    <1> 		cmp	byte [SWP_Mode], 0
   934 0000EAD2 761E                <1> 		jna	short loc_swp_drv
   935                              <1> 
   936                              <1> 		; 10/10/2016 (valid file name checking)
   937 0000EAD4 BE[8C3B0100]        <1> 		mov	esi, FindFile_Name
   938 0000EAD9 803E20              <1> 		cmp	byte [esi], 20h
   939 0000EADC 76D2                <1> 		jna	short loc_swp_xor_retn
   940                              <1> 
   941                              <1> 		; 16/10/2016
   942 0000EADE C605[9B3E0100]00    <1> 		mov	byte [SWP_inv_fname], 0 ; reset 
   943                              <1> 		; esi = file name address (ASCIIZ)
   944 0000EAE5 E8D48FFFFF          <1> 		call	check_filename
   945 0000EAEA 7306                <1> 		jnc	short loc_swp_drv
   946                              <1> 
   947 0000EAEC FE05[9B3E0100]      <1> 		inc	byte [SWP_inv_fname] ; set 	
   948                              <1> loc_swp_drv:
   949 0000EAF2 8A35[A6310100]      <1> 		mov	dh, [Current_Drv]
   950                              <1>                ;mov	[RUN_CDRV], dh
   951                              <1> 
   952 0000EAF8 8A15[4A3B0100]      <1> 		mov	dl, [FindFile_Drv]
   953                              <1>                ;cmp	dl, dh
   954 0000EAFE 3A15[A6310100]      <1> 		cmp	dl, [Current_Drv]
   955 0000EB04 740D                <1> 		je	short loc_swp_change_directory
   956                              <1> 
   957 0000EB06 FE05[9F3E0100]      <1> 		inc	byte [SWP_DRV_chg]
   958 0000EB0C E85B78FFFF          <1> 		call	change_current_drive
   959 0000EB11 72A0                <1> 		jc	short loc_swp_retn ; eax = error code
   960                              <1> 		; eax = 0
   961                              <1> 
   962                              <1> loc_swp_change_directory:
   963 0000EB13 803D[4B3B0100]21    <1> 		cmp	byte [FindFile_Directory], 21h
   964 0000EB1A F5                  <1> 		cmc
   965 0000EB1B 7396                <1> 		jnc	short loc_swp_retn
   966                              <1> 
   967 0000EB1D FE05[9F3E0100]      <1> 		inc	byte [SWP_DRV_chg]
   968 0000EB23 FE05[0DED0000]      <1> 		inc	byte [Restore_CDIR]
   969 0000EB29 BE[4B3B0100]        <1> 		mov	esi, FindFile_Directory
   970 0000EB2E 8A25[9D3E0100]      <1> 		mov	ah, [SWP_Mode+1] 
   971 0000EB34 E8C8A7FFFF          <1> 		call	change_current_directory
   972 0000EB39 0F8274FFFFFF        <1> 		jc	loc_swp_retn ; eax = error code
   973                              <1> 
   974                              <1> loc_swp_change_prompt_dir_string:
   975                              <1> 		; esi = PATH_Array
   976                              <1> 		; eax = Current Directory First Cluster
   977                              <1> 		; edi = Logical DOS Drive Description Table	
   978 0000EB3F E8E2A6FFFF          <1> 		call	change_prompt_dir_str 
   979 0000EB44 29C0                <1> 		sub	eax, eax ; 0
   980 0000EB46 E968FFFFFF          <1> 		jmp	loc_swp_retn 
   981                              <1> 
   982                              <1> reset_working_path:
   983                              <1> 		; 06/10/2016 - TRDOS 386 (TRDOS v2.0)
   984                              <1> 		;
   985                              <1> 		; TRDOS v1.0 (DIR.ASM, "proc_reset_working_path")
   986                              <1> 		; 05/02/2011 - 08/02/2011 
   987                              <1> 		;
   988                              <1> 		; Restores current drive and directory 
   989                              <1> 		; 
   990                              <1> 		; INPUT: none
   991                              <1> 		; OUTPUT: DL = SWP_DRV, EAX = 0 -> OK
   992                              <1> 		;
   993                              <1> 		;    AX = 0 -> ESI = Logical Dos Drv Desc. Table
   994                              <1> 		;
   995                              <1> 		;    EAX, EBX, ECX, EDX, ESI, EDI will be changed
   996                              <1> 		;
   997                              <1> 
   998                              <1>   
   999 0000EB4B 31C0                <1> 		xor	eax, eax
  1000 0000EB4D 48                  <1> 		dec	eax 
  1001                              <1> 
  1002 0000EB4E 668B15[9E3E0100]    <1> 		mov	dx, [SWP_DRV]
  1003 0000EB55 08F6                <1> 		or	dh, dh
  1004 0000EB57 742E                <1> 		jz	short loc_rwp_return
  1005                              <1> 
  1006 0000EB59 3A15[A6310100]      <1> 		cmp	dl, [Current_Drv]
  1007 0000EB5F 7407                <1> 		je	short loc_rwp_restore_cdir
  1008                              <1> loc_rwp_restore_cdrv:
  1009 0000EB61 E80678FFFF          <1> 		call	change_current_drive 
  1010 0000EB66 EB10                <1> 		jmp	short loc_rwp_restore_ok
  1011                              <1> loc_rwp_restore_cdir:
  1012 0000EB68 31DB                <1> 		xor	ebx, ebx
  1013 0000EB6A 88D7                <1> 		mov	bh, dl
  1014 0000EB6C BE00010900          <1> 		mov	esi, Logical_DOSDisks
  1015 0000EB71 01DE                <1> 		add	esi, ebx
  1016                              <1> 
  1017 0000EB73 E8AB78FFFF          <1> 		call	restore_current_directory
  1018                              <1> 
  1019                              <1> loc_rwp_restore_ok:
  1020 0000EB78 668B15[9E3E0100]    <1> 		mov	dx, [SWP_DRV]
  1021 0000EB7F 31C0                <1> 		xor	eax, eax  
  1022 0000EB81 66A3[9F3E0100]      <1> 		mov	[SWP_DRV_chg], ax
  1023                              <1> loc_rwp_return:
  1024 0000EB87 C3                  <1> 		retn
  1025                              <1> 
  1026                              <1> get_file_name:
  1027                              <1> 		; 15/10/2016 - TRDOS 386 (TRDOS v2.0)
  1028                              <1> 		; Convert file name 
  1029                              <1> 		;	from directory entry format
  1030                              <1>                 ; 	to (8.3) dot file name format 
  1031                              <1> 		;
  1032                              <1> 		; TRDOS v1.0 (DIR.ASM, "get_file_name")
  1033                              <1>                 ; 2005 - 09/10/2011 	
  1034                              <1> 		; INPUT: 
  1035                              <1> 		;	DS:SI -> Directory Entry Format File Name
  1036                              <1> 		;       ES:DI -> DOS Dot File Name Address
  1037                              <1> 		; OUTPUT:
  1038                              <1> 		;	DS:SI -> DOS Dot File Name Address
  1039                              <1>                 ;	ES:DI -> Directory Entry Format File Name
  1040                              <1> 		;	
  1041                              <1> 		; TRDOS 386 (15/10/2016)
  1042                              <1> 		; INPUT:
  1043                              <1> 		;	ESI = File name addr in dir entry format
  1044                              <1> 		;	EDI = Dot file name address (destination)
  1045                              <1> 		; OUTPUT: 
  1046                              <1> 		;	File name is converted and moved
  1047                              <1> 		;	to destination (as 8.3 dot filename)
  1048                              <1> 		;  
  1049                              <1> 		; Modified registers: EAX, ECX
  1050                              <1> 
  1051                              <1>                 ; 2005 (TRDOS 8086) - 2016 (TRDOS 386)
  1052                              <1>                             
  1053 0000EB88 57                  <1> 		push	edi
  1054 0000EB89 56                  <1> 		push	esi
  1055 0000EB8A AC                  <1> 		lodsb
  1056 0000EB8B 3C20                <1> 		cmp	al, 20h
  1057 0000EB8D 762A                <1> 		jna	short pass_gfn_ext
  1058 0000EB8F 56                  <1> 		push	esi
  1059 0000EB90 AA                  <1> 		stosb
  1060 0000EB91 B907000000          <1> 		mov	ecx, 7
  1061                              <1> loc_gfn_next_char:
  1062 0000EB96 AC                  <1> 		lodsb
  1063 0000EB97 3C20                <1> 		cmp	al, 20h
  1064 0000EB99 7603                <1> 		jna	short pass_gfn_fn
  1065 0000EB9B AA                  <1> 		stosb
  1066 0000EB9C E2F8                <1> 		loop	loc_gfn_next_char
  1067                              <1> pass_gfn_fn:
  1068 0000EB9E 5E                  <1> 		pop	esi
  1069 0000EB9F 83C607              <1> 		add	esi, 7
  1070 0000EBA2 AC                  <1> 		lodsb
  1071 0000EBA3 3C20                <1> 		cmp	al, 20h
  1072 0000EBA5 7612                <1> 		jna	short pass_gfn_ext
  1073 0000EBA7 B42E                <1> 		mov	ah, '.'
  1074 0000EBA9 86E0                <1> 		xchg	ah, al
  1075 0000EBAB 66AB                <1> 		stosw
  1076 0000EBAD AC                  <1> 		lodsb
  1077 0000EBAE 3C20                <1> 		cmp	al, 20h
  1078 0000EBB0 7607                <1> 		jna	short pass_gfn_ext
  1079 0000EBB2 AA                  <1> 		stosb
  1080 0000EBB3 AC                  <1> 		lodsb
  1081 0000EBB4 3C20                <1> 		cmp	al, 20h
  1082 0000EBB6 7601                <1> 		jna	short pass_gfn_ext
  1083 0000EBB8 AA                  <1> 		stosb
  1084                              <1> pass_gfn_ext:		
  1085 0000EBB9 30C0                <1> 		xor	al, al
  1086 0000EBBB AA                  <1> 		stosb
  1087 0000EBBC 5E                  <1> 		pop	esi
  1088 0000EBBD 5F                  <1> 		pop	edi
  1089 0000EBBE C3                  <1> 		retn
  1090                              <1> 
  1091                              <1> get_device_number:
  1092                              <1> 		; 08/10/2016
  1093                              <1> 		; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1094                              <1> 		;
  1095                              <1> 		; This procedure compares name of requested
  1096                              <1> 		; device with kernel device names and
  1097                              <1> 		; installable device names. If names match, 
  1098                              <1> 		; the relevant device index (entry) number 
  1099                              <1> 		; will be returned the caller (sysopen) 
  1100                              <1> 		; for the requested device.
  1101                              <1> 		;
  1102                              <1> 		; NOTE: Installable device drivers must
  1103                              <1> 		; be loaded before using 'sysopen'
  1104                              <1> 		; (opendev) system call.
  1105                              <1> 		;
  1106                              <1> 		; INPUT:
  1107                              <1> 		;    ESI = device name address (ASCIIZ)
  1108                              <1> 		;         (in kernel's memory space)  
  1109                              <1>    		;    max name length = 8 without '/dev/')
  1110                              <1> 		;    Device name will be capitalized 
  1111                              <1> 		;    and if there is, '/dev/' will be
  1112                              <1> 		;    removed from name before comparising)
  1113                              <1> 		;
  1114                              <1> 		; OUTPUT:
  1115                              <1> 		;    cf = 0 -> 
  1116                              <1> 		;      EAX (AL) = device entry/index number 	 	
  1117                              <1> 		;    cf = 1 -> device not found (installed)
  1118                              <1> 		;	       or invalid device name
  1119                              <1> 		;	       (AL=0)
  1120                              <1> 		;    device_name = device name address (asciiz)
  1121                              <1> 			;
  1122                              <1> 		; Modified registers: EAX, EBX, ESI, EDI
  1123                              <1> 
  1124 0000EBBF BF[A03E0100]        <1> 		mov	edi, device_name
  1125 0000EBC4 E805010000          <1> 		call 	lodsb_capitalize
  1126 0000EBC9 88C4                <1> 		mov	ah, al
  1127 0000EBCB 3C2F                <1> 		cmp	al, '/'
  1128 0000EBCD 750E                <1> 		jne	short gdn_1
  1129 0000EBCF BF[A03E0100]        <1> 		mov	edi, device_name
  1130 0000EBD4 E8F5000000          <1> 		call 	lodsb_capitalize
  1131                              <1> gdn_0:
  1132 0000EBD9 20C0                <1> 		and	al, al ; 0 ?
  1133 0000EBDB 7420                <1> 		jz	short gdn_err ; null name after '/'
  1134                              <1> gdn_1:
  1135 0000EBDD 3C44                <1> 		cmp	al, 'D'
  1136 0000EBDF 7517                <1> 		jne	short gdn_2
  1137 0000EBE1 E8E8000000          <1> 		call 	lodsb_capitalize
  1138 0000EBE6 3C45                <1> 		cmp	al, 'E'
  1139 0000EBE8 750E                <1> 		jne	short gdn_2
  1140 0000EBEA E8DF000000          <1> 		call 	lodsb_capitalize
  1141 0000EBEF 3C56                <1> 		cmp	al, 'V'
  1142 0000EBF1 7505                <1> 		jne	short gdn_2			
  1143 0000EBF3 AC                  <1> 		lodsb
  1144 0000EBF4 3C2F                <1> 		cmp	al, '/'
  1145 0000EBF6 740D                <1> 		je	short gdn_4
  1146                              <1> gdn_2:
  1147 0000EBF8 80FC2F              <1> 		cmp	ah, '/'
  1148 0000EBFB 750F                <1> 		jne	short gdn_5
  1149                              <1> gdn_err:		
  1150                              <1> 		; invalid device name or device not found
  1151 0000EBFD 31C0                <1> 		xor	eax, eax ; 0
  1152 0000EBFF F9                  <1> 		stc
  1153 0000EC00 C3                  <1> 		retn
  1154                              <1> gdn_3:
  1155 0000EC01 3C2F                <1> 		cmp	al, '/'
  1156 0000EC03 7507                <1> 		jne	short gdn_5
  1157                              <1> gdn_4:
  1158 0000EC05 BF[A03E0100]        <1> 		mov	edi, device_name
  1159 0000EC0A EB04                <1> 		jmp	short gdn_6
  1160                              <1> gdn_5:
  1161 0000EC0C 3C00                <1> 		cmp	al, 0
  1162 0000EC0E 7419                <1> 		je	short gdn_7
  1163                              <1> gdn_6:
  1164 0000EC10 E8B9000000          <1> 		call lodsb_capitalize
  1165 0000EC15 81FF[A83E0100]      <1> 		cmp	edi, device_name + 8
  1166 0000EC1B 72E4                <1> 		jb	short gdn_3
  1167 0000EC1D 3C00                <1> 		cmp	al, 0
  1168 0000EC1F 75DC                <1> 		jne	short gdn_err
  1169 0000EC21 81FF[A13E0100]      <1> 		cmp	edi, device_name + 1
  1170 0000EC27 76D4                <1> 		jna	short gdn_err ; null name after '/'
  1171                              <1> gdn_7:
  1172 0000EC29 AA                  <1> 		stosb
  1173                              <1> 		; zero padding ("NAME",0,0,0,0)
  1174 0000EC2A 81FF[A83E0100]      <1> 		cmp	edi, device_name + 8
  1175 0000EC30 72F7                <1> 		jb	short gdn_7
  1176                              <1> gdn_8:
  1177                              <1> 		; search for kernel device names
  1178 0000EC32 BE[A03E0100]        <1> 		mov	esi, device_name 
  1179 0000EC37 BF[24F40000]        <1> 		mov	edi, KDEV_NAME
  1180 0000EC3C 31C0                <1> 		xor	eax, eax
  1181                              <1> gdn_9:
  1182 0000EC3E A7                  <1> 		cmpsd	
  1183 0000EC3F 7505                <1> 		jne	short gdn_10
  1184 0000EC41 A7                  <1> 		cmpsd
  1185 0000EC42 7503                <1> 		jne	short gdn_11
  1186 0000EC44 EB2B                <1> 		jmp	short gdn_17 ; match
  1187                              <1> gdn_10:
  1188 0000EC46 A7                  <1> 		cmpsd  ; add esi, 4 & add edi, 4
  1189                              <1> gdn_11:
  1190 0000EC47 BE[A03E0100]        <1> 		mov	esi, device_name
  1191 0000EC4C FEC0                <1> 		inc	al
  1192 0000EC4E 3C16                <1> 		cmp	al, NumOfKernelDevNames
  1193 0000EC50 72EC                <1> 		jb	short gdn_9
  1194                              <1> gdn_12:
  1195                              <1> 		; search for installable device names
  1196                              <1> 		; esi = offset device_name 
  1197 0000EC52 BF[CC3E0100]        <1> 		mov	edi, IDEV_NAME
  1198 0000EC57 28C0                <1> 		sub	al, al ; 0
  1199                              <1> gdn_13:
  1200 0000EC59 A7                  <1> 		cmpsd	
  1201 0000EC5A 7505                <1> 		jne	short gdn_14
  1202 0000EC5C A7                  <1> 		cmpsd
  1203 0000EC5D 7503                <1> 		jne	short gdn_15
  1204 0000EC5F EB3F                <1> 		jmp	short gdn_19 ; match
  1205                              <1> gdn_14:
  1206 0000EC61 A7                  <1> 		cmpsd  ; add esi, 4 & add edi, 4
  1207                              <1> gdn_15:
  1208 0000EC62 BE[A03E0100]        <1> 		mov	esi, device_name
  1209 0000EC67 FEC0                <1> 		inc	al
  1210 0000EC69 3C08                <1> 		cmp	al, NumOfInstallableDevices
  1211 0000EC6B 72EC                <1> 		jb	short gdn_13
  1212                              <1> 
  1213                              <1> gdn_16: 	; error: invalid device name (not found) !
  1214 0000EC6D 30C0                <1> 		xor	al, al
  1215 0000EC6F F9                  <1> 		stc
  1216 0000EC70 C3                  <1> 		retn
  1217                              <1> 
  1218                              <1> gdn_17:		; name match (with one of kernel device names)
  1219                              <1> 		;
  1220                              <1> 		; convert KDEV_NAME index to 
  1221                              <1> 		; KDEV_NUMBER index
  1222                              <1> 		; (different names are used for same devices)
  1223                              <1> 		; (example: "COM1" & "TTY8" = device number 18) 
  1224 0000EC71 89C3                <1> 		mov	ebx, eax ; < 256
  1225 0000EC73 8A83[D4F40000]      <1> 		mov	al, [KDEV_NUMBER+ebx]
  1226                              <1> 
  1227                              <1> 		; check if empty dev entry in the list
  1228 0000EC79 80B8[50400100]00    <1> 		cmp	byte [DEV_OPENMODE+eax], 0
  1229 0000EC80 771B                <1> 		ja	short gdn_18 ; it must be already set
  1230                              <1> 
  1231                              <1> 		; (re)set device name and access flags
  1232                              <1> 		; (remain open work will be easy after that)
  1233                              <1> 		; (NOTE: here, data will be copied to bss section)
  1234 0000EC82 88C3                <1> 		mov	bl, al
  1235 0000EC84 83EF08              <1> 		sub	edi, 8 ; kernel device name address (data)
  1236 0000EC87 66C1E302            <1> 		shl	bx, 2 
  1237 0000EC8B 89BB[6E400100]      <1> 		mov	[DEV_NAME_PTR+ebx], edi ; (all) device names
  1238 0000EC91 8A98[2AF60000]      <1> 		mov	bl, [KDEV_ACCESS+eax] ; kernel dev list (data)
  1239 0000EC97 8898[9C3F0100]      <1> 		mov	[DEV_ACCESS+eax], bl ; (all) device list (bss)
  1240                              <1> gdn_18:
  1241 0000EC9D FEC0                <1> 		inc	al ; 1 to NumOfKernelDevNames (<=7Fh)
  1242                              <1> 		; eax = device index/entry number
  1243 0000EC9F C3                  <1> 		retn		
  1244                              <1> 
  1245                              <1> gdn_19:		; name match (with one of installable device names)
  1246                              <1> 		;
  1247                              <1> 		; al = 0 to NumOfInstallableDevices - 1 (<=7Fh)
  1248                              <1> 
  1249 0000ECA0 89C3                <1> 		mov	ebx, eax
  1250 0000ECA2 80C316              <1> 		add	bl, NumOfKernelDevices 	; < NUMOFDEVICES	
  1251                              <1> 
  1252                              <1> 		; check if empty dev entry in the list
  1253 0000ECA5 80BB[50400100]00    <1> 		cmp	byte [DEV_OPENMODE+ebx], 0
  1254 0000ECAC 771D                <1> 		ja	short gdn_20 ; it must be already set
  1255                              <1> 
  1256                              <1> 		; (re)set device name and access flags
  1257                              <1> 		; (remain open work will be easy after that)
  1258 0000ECAE 83EF08              <1> 		sub	edi, 8 ; installable device name address
  1259 0000ECB1 66C1E302            <1> 		shl	bx, 2 ;*4
  1260 0000ECB5 89BB[6E400100]      <1> 		mov	[DEV_NAME_PTR+ebx], edi ; (all) device names
  1261 0000ECBB 66C1EB02            <1> 		shr	bx, 2
  1262 0000ECBF 8A80[143F0100]      <1> 		mov	al, [IDEV_FLAGS+eax] ; installable dev list
  1263 0000ECC5 8883[9C3F0100]      <1> 		mov	[DEV_ACCESS+ebx], al ; (all) device list
  1264                              <1> gdn_20:	
  1265 0000ECCB 88D8                <1> 		mov	al, bl
  1266                              <1> 		; eax = device index/entry number ; < NUMOFDEVICES  
  1267 0000ECCD C3                  <1> 		retn
  1268                              <1> 
  1269                              <1> lodsb_capitalize:
  1270                              <1> 	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1271                              <1> 	; INPUT -> [esi] = character
  1272                              <1> 	;          edi = destination
  1273                              <1> 	; OUTPUT -> AL contains capitalized character
  1274                              <1> 	;	   esi = esi+1
  1275                              <1> 	;	   edi = edi+1	
  1276                              <1> 	; 
  1277 0000ECCE AC                  <1> 	lodsb	
  1278 0000ECCF 3C61                <1> 	cmp al, 61h
  1279 0000ECD1 7206                <1>      	jb  short lodsb_cap_retn
  1280 0000ECD3 3C7A                <1>      	cmp al, 7Ah
  1281 0000ECD5 7702                <1>      	ja  short lodsb_cap_retn
  1282 0000ECD7 24DF                <1>      	and al, 0DFh
  1283                              <1> lodsb_cap_retn:
  1284 0000ECD9 AA                  <1> 	stosb
  1285 0000ECDA C3                  <1> 	retn
  1286                              <1> 
  1287                              <1> device_open:
  1288                              <1> 	; 08/10/2016 - TRDOS 386 (TRDOS v2.0)
  1289                              <1> 	; Complete device opening work for sysopen (device)
  1290                              <1> 	;
  1291                              <1> 	; INPUT -> 
  1292                              <1> 	;	EAX = Device Number (AL)
  1293                              <1> 	;        CL = Open mode (1 = read, 2 = write)
  1294                              <1> 	;	 CH = Device access byte (bit 0 = 0)		
  1295                              <1> 	; OUTPUT ->
  1296                              <1> 	;	EAX = Device Number	
  1297                              <1> 	;	CF = 0 -> device has been opened
  1298                              <1> 	;	CF = 1 -> device could not be opened
  1299                              <1> 	;
  1300                              <1> 	;  Modified registers: ebx, (edx, ecx, esi, edi, ebp)
  1301                              <1> 	;
  1302                              <1> 
  1303 0000ECDB 89C3                <1> 	mov	ebx, eax
  1304 0000ECDD 66C1E302            <1> 	shl	bx, 2 ; *4
  1305                              <1> 
  1306 0000ECE1 F6C580              <1> 	test	ch, 80h ; bit 7, installable device driver flag
  1307 0000ECE4 7406                <1> 	jz	short d_open_2 ; Kernel device
  1308                              <1> 	; installable device
  1309                              <1> d_open_1:
  1310 0000ECE6 FFA3[183F0100]      <1>         jmp	dword [ebx+IDEV_OADDR-4]
  1311                              <1> d_open_2:
  1312 0000ECEC FFA3[E6F40000]      <1> 	jmp	dword [ebx+KDEV_OADDR-4]
  1313                              <1> 
  1314                              <1> device_close:
  1315                              <1> 	; 08/10/2016 - TRDOS 386 (TRDOS v2.0)
  1316                              <1> 	; Complete device closing work for sysclose (device)
  1317                              <1> 	;
  1318                              <1> 	; INPUT -> 
  1319                              <1> 	;	EAX = Device Number (AL)
  1320                              <1> 	;        CL = Open mode (1 = read, 2 = write)
  1321                              <1> 	;	 CH = Device access byte (bit 0 = 0)		
  1322                              <1> 	; OUTPUT ->
  1323                              <1> 	;	EAX = Device Number	
  1324                              <1> 	;	CF = 0 -> device has been closed
  1325                              <1> 	;	CF = 1 -> device could not be closed
  1326                              <1> 	;
  1327                              <1> 	; Modified registers: ebx, (edx, ecx, esi, edi, ebp)
  1328                              <1> 	;
  1329                              <1> 
  1330 0000ECF2 89C3                <1> 	mov	ebx, eax
  1331 0000ECF4 66C1E302            <1> 	shl	bx, 2 ; *4
  1332                              <1> 
  1333 0000ECF8 F6C580              <1> 	test	ch, 80h ; bit 7, installable device driver flag
  1334 0000ECFB 7406                <1> 	jz	short d_close_2 ; Kernel device
  1335                              <1> 	; installable device
  1336                              <1> d_close_1:
  1337 0000ECFD FFA3[383F0100]      <1>         jmp	dword [ebx+IDEV_CADDR-4]
  1338                              <1> d_close_2:
  1339 0000ED03 FFA3[36F50000]      <1> 	jmp	dword [ebx+KDEV_CADDR-4]	
  1340                              <1> 
  1341                              <1> rnull:
  1342                              <1> 	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1343                              <1> 	; read null (read from null device)
  1344 0000ED09 C3                  <1> 	retn
  1345                              <1> 
  1346                              <1> wnull:
  1347                              <1> 	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1348                              <1> 	; write null (write to null device)
  1349 0000ED0A C3                  <1> 	retn
  1350                              <1> 
  1351                              <1> otty:
  1352                              <1> sret:
  1353                              <1> ocvt:
  1354                              <1> ctty:
  1355                              <1> cret:
  1356                              <1> ccvt:
  1357                              <1> rtty:
  1358                              <1> wtty:
  1359                              <1> rmem:
  1360                              <1> wmem:
  1361                              <1> rfd:
  1362                              <1> rhd:
  1363                              <1> wfd:
  1364                              <1> whd:
  1365                              <1> rlpt:
  1366                              <1> wlpt:
  1367                              <1> rcvt:
  1368                              <1> xmtt:
  1369 0000ED0B C3                  <1> 	retn
  2141                                  %include 'trdosk9.s' ; 04/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - INITIALIZED DATA : trdosk9.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 16/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 04/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; ----------------------------------------------------------------------------
     9                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
    10                              <1> ; ----------------------------------------------------------------------------
    11                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    12                              <1> ; TRDOS2.ASM (09/11/2011)
    13                              <1> ; ****************************************************************************
    14                              <1> ; DRV_INIT.ASM [26/09/2009] Last Update: 07/08/2011
    15                              <1> ; MAINPROG.ASM [17/01/2004] Last Update: 09/11/2011
    16                              <1> ; CMD_INTR.ASM [29/01/2005] Last Update: 09/11/2011
    17                              <1> ; FILE.ASM [29/10/2009] Last Update: 09/10/2011
    18                              <1> 
    19                              <1> ; 12/02/2016
    20                              <1> Last_DOS_DiskNo: 
    21 0000ED0C 01                  <1> 		db 1 ; A: = 0 & B: = 1
    22                              <1> 
    23                              <1> Restore_CDIR:	
    24 0000ED0D FF                  <1> 		db 0FFh ; Initial value -> any number except 0
    25                              <1> 
    26                              <1> msg_CRLF_temp:  
    27 0000ED0E 070D0A00            <1> 		db  07h, 0Dh, 0Ah, 0
    28                              <1> 
    29                              <1> Magic_Bytes:
    30 0000ED12 04                  <1> 		db 4
    31 0000ED13 01                  <1> 		db 1
    32                              <1> mainprog_Version:
    33 0000ED14 07                  <1> 		db 7
    34 0000ED15 5B5452444F535D204D- <1> 		db "[TRDOS] Main Program v2.0.160117"
    34 0000ED1E 61696E2050726F6772- <1>
    34 0000ED27 616D2076322E302E31- <1>
    34 0000ED30 3630313137          <1>
    35 0000ED35 0D0A                <1> 		db 0Dh, 0Ah
    36 0000ED37 286329204572646F67- <1> 		db "(c) Erdogan Tan 2005-2016"
    36 0000ED40 616E2054616E203230- <1>
    36 0000ED49 30352D32303136      <1>
    37 0000ED50 0D0A00              <1> 		db 0Dh, 0Ah, 0
    38                              <1> 
    39                              <1> MainProgCfgFile: ; 14/04/2016
    40 0000ED53 4D41494E50524F472E- <1> 		db "MAINPROG.CFG", 0
    40 0000ED5C 43464700            <1>
    41                              <1> 
    42                              <1> TRDOSPromptLabel:
    43 0000ED60 5452444F53          <1> 		db "TRDOS"
    44 0000ED65 00                  <1> 		db 0
    45 0000ED66 00<rept>            <1>                 times 5 db 0
    46 0000ED6B 00                  <1> 		db 0
    47                              <1> 
    48                              <1> ; INTERNAL COMMANDS
    49                              <1> Command_List:
    50 0000ED6C 44495200            <1> Cmd_Dir:	db "DIR", 0
    51 0000ED70 434400              <1> Cmd_Cd:		db "CD", 0
    52 0000ED73 433A00              <1> Cmd_Drive:	db "C:", 0
    53 0000ED76 56455200            <1> Cmd_Ver:	db "VER", 0
    54 0000ED7A 4558495400          <1> Cmd_Exit:	db "EXIT", 0
    55 0000ED7F 50524F4D505400      <1> Cmd_Prompt:	db "PROMPT", 0
    56 0000ED86 564F4C554D4500      <1> Cmd_Volume:	db "VOLUME", 0
    57 0000ED8D 4C4F4E474E414D4500  <1> Cmd_LongName:	db "LONGNAME", 0
    58 0000ED96 4441544500          <1> Cmd_Date:	db "DATE", 0
    59 0000ED9B 54494D4500          <1> Cmd_Time:	db "TIME", 0
    60 0000EDA0 52554E00            <1> Cmd_Run:	db "RUN", 0
    61 0000EDA4 53455400            <1> Cmd_Set:	db "SET", 0 
    62 0000EDA8 434C5300            <1> Cmd_Cls:	db "CLS", 0
    63 0000EDAC 53484F5700          <1> Cmd_Show:	db "SHOW", 0
    64 0000EDB1 44454C00            <1> Cmd_Del:	db "DEL", 0
    65 0000EDB5 41545452494200      <1> Cmd_Attrib:	db "ATTRIB", 0
    66 0000EDBC 52454E414D4500      <1> Cmd_Rename:	db "RENAME", 0
    67 0000EDC3 524D44495200        <1> Cmd_Rmdir:	db "RMDIR", 0
    68 0000EDC9 4D4B44495200        <1> Cmd_Mkdir:	db "MKDIR", 0
    69 0000EDCF 434F505900          <1> Cmd_Copy:	db "COPY", 0
    70 0000EDD4 4D4F564500          <1> Cmd_Move:	db "MOVE", 0
    71 0000EDD9 5041544800          <1> Cmd_Path:	db "PATH", 0
    72 0000EDDE 4D454D00            <1> Cmd_Mem:	db "MEM", 0
    73 0000EDE2 00                  <1> 		db 0
    74 0000EDE3 46494E4400          <1> Cmd_Find:	db "FIND", 0
    75 0000EDE8 4543484F00          <1> Cmd_Echo:	db "ECHO", 0
    76 0000EDED 2A00                <1> Cmd_Remark:	db "*", 0
    77 0000EDEF 3F00                <1> Cmd_Help:	db "?", 0
    78 0000EDF1 44455649434500      <1> Cmd_Device:	db "DEVICE", 0
    79 0000EDF8 4445564C49535400    <1> Cmd_DevList:	db "DEVLIST", 0
    80 0000EE00 434844495200        <1> Cmd_Chdir:	db "CHDIR", 0
    81 0000EE06 4245455000          <1> Cmd_Beep:	db "BEEP", 0
    82                              <1> 		
    83 0000EE0B 00                  <1> 		db 0
    84                              <1> 
    85                              <1> ; 15/02/2016 (FILE.ASM, 09/10/2011)
    86                              <1> invalid_fname_chars:
    87 0000EE0C 222728292A2B2C2F    <1> 		db 22h, 27h, 28h, 29h, 2Ah, 2Bh, 2Ch, 2Fh
    88 0000EE14 3A3B3C3D3E3F40      <1> 		db 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh, 40h
    89 0000EE1B 5B5C5D5E60          <1> 		db 5Bh, 5Ch, 5Dh, 5Eh, 60h
    90                              <1> sizeInvFnChars  equ ($ - invalid_fname_chars)                
    91                              <1> ;
    92                              <1> 
    93                              <1> Msg_Enter_Date:
    94 0000EE20 456E746572206E6577- <1>                 db 'Enter new date (dd-mm-yy): '
    94 0000EE29 206461746520286464- <1>
    94 0000EE32 2D6D6D2D7979293A20  <1>
    95 0000EE3B 00                  <1>                 db 0
    96                              <1> Msg_Show_Date:
    97 0000EE3C 43757272656E742064- <1>                 db   'Current date is '
    97 0000EE45 61746520697320      <1>
    98 0000EE4C 30                  <1> Day:            db   '0'
    99 0000EE4D 30                  <1> 		db   '0'
   100 0000EE4E 2F                  <1>                 db   '/'
   101 0000EE4F 30                  <1> Month:          db   '0'
   102 0000EE50 30                  <1> 		db   '0'
   103 0000EE51 2F                  <1>                 db   '/'
   104 0000EE52 30                  <1> Century:        db   '0'
   105 0000EE53 30                  <1>                 db   '0'
   106 0000EE54 30                  <1> Year:           db   '0'
   107 0000EE55 30                  <1> 		db   '0'
   108 0000EE56 0D0A00              <1>                 db   0Dh, 0Ah, 0
   109                              <1> 
   110                              <1> Msg_Enter_Time:
   111 0000EE59 456E746572206E6577- <1> 		db 'Enter new time: '
   111 0000EE62 2074696D653A20      <1>
   112 0000EE69 00                  <1> 		db 0
   113                              <1> Msg_Show_Time:
   114 0000EE6A 43757272656E742074- <1> 		db   'Current time is '
   114 0000EE73 696D6520697320      <1>
   115 0000EE7A 30                  <1> Hour:           db   '0'
   116 0000EE7B 30                  <1> 		db   '0'
   117 0000EE7C 3A                  <1> 		db   ':'
   118 0000EE7D 30                  <1> Minute:         db   '0'
   119 0000EE7E 30                  <1> 		db   '0'
   120 0000EE7F 3A                  <1> 		db   ':'
   121 0000EE80 30                  <1> Second:         db   '0'
   122 0000EE81 30                  <1> 		db   '0'
   123 0000EE82 0D0A00              <1> 		db   0Dh, 0Ah, 0
   124                              <1> 
   125                              <1> ;VolSize_Unit1:   dd 0
   126                              <1> ;VolSize_Unit2:   dd 0
   127                              <1> 
   128                              <1> VolSize_KiloBytes:
   129 0000EE85 206B696C6F62797465- <1> 		db " kilobytes", 0Dh, 0Ah, 0
   129 0000EE8E 730D0A00            <1>
   130                              <1> VolSize_Bytes:
   131 0000EE92 2062797465730D0A00  <1> 		db " bytes", 0Dh, 0Ah, 0
   132                              <1> Volume_in_drive:
   133 0000EE9B 0D0A                <1> 		db 0Dh, 0Ah
   134                              <1> Vol_FS_Name:
   135 0000EE9D 54522046533120      <1> 		db "TR FS1 "
   136 0000EEA4 566F6C756D6520696E- <1> 		db "Volume in drive "
   136 0000EEAD 20647269766520      <1>
   137 0000EEB4 30                  <1> Vol_Drv_Name:   db 30h
   138 0000EEB5 3A                  <1> 		db ":"
   139 0000EEB6 20697320            <1> 		db " is "
   140 0000EEBA 0D0A00              <1> 		db 0Dh, 0Ah, 0
   141                              <1> Dir_Drive_Str:
   142 0000EEBD 54522D444F53204472- <1>                 db "TR-DOS Drive "
   142 0000EEC6 69766520            <1>
   143                              <1> Dir_Drive_Name:
   144 0000EECA 303A                <1>                 db "0:"
   145 0000EECC 0D0A                <1>                 db  0Dh, 0Ah
   146                              <1> Vol_Str_Header:
   147 0000EECE 566F6C756D65204E61- <1>                 db "Volume Name: "
   147 0000EED7 6D653A20            <1>
   148                              <1> Vol_Name:
   149 0000EEDB 00<rept>            <1> 		times 64 db 0
   150 0000EF1B 00                  <1> 		db 0
   151                              <1> Vol_Serial_Header:
   152 0000EF1C 0D0A                <1> 		db 0Dh, 0Ah
   153 0000EF1E 566F6C756D65205365- <1> 		db "Volume Serial No: "
   153 0000EF27 7269616C204E6F3A20  <1>
   154                              <1> Vol_Serial1:
   155 0000EF30 30303030            <1> 		db "0000"
   156 0000EF34 2D                  <1> 		db "-"
   157                              <1> Vol_Serial2:
   158 0000EF35 30303030            <1> 		db "0000"
   159 0000EF39 0D0A00              <1> 		db 0Dh, 0Ah, 0
   160                              <1> 
   161                              <1> ;Vol_Tot_Sec_Str_Start:
   162                              <1> ;		dd 0
   163                              <1> Vol_Total_Sector_Header:
   164 0000EF3C 0D0A                <1> 		db 0Dh, 0Ah
   165 0000EF3E 566F6C756D65205369- <1> 		db "Volume Size : ", 0
   165 0000EF47 7A65203A2000        <1>
   166                              <1> ;Vol_Tot_Sec_Str: 
   167                              <1> ;		db "0000000000"
   168                              <1> ;Vol_Tot_Sec_Str_End:
   169                              <1> ;		db 0
   170                              <1> ;Vol_Free_Sectors_Str_Start:
   171                              <1> ;		dd 0
   172                              <1> Vol_Free_Sectors_Header:
   173 0000EF4D 467265652053706163- <1> 		db "Free Space  : ", 0
   173 0000EF56 6520203A2000        <1>
   174                              <1> ;Vol_Free_Sectors_Str:
   175                              <1> ;		db "0000000000"
   176                              <1> ;Vol_Free_Sectors_Str_End:
   177                              <1> ;		db 0
   178                              <1> 
   179                              <1> Dir_Str_Header:
   180 0000EF5C 4469726563746F7279- <1>                 db "Directory: "
   180 0000EF65 3A20                <1>
   181 0000EF67 2F                  <1> Dir_Str_Root:   db "/"
   182 0000EF68 00<rept>            <1> Dir_Str:        times 64 db 0
   183 0000EFA8 00000000            <1>                 dd 0
   184 0000EFAC 00                  <1>                 db 0
   185                              <1> 
   186                              <1> Msg_Bad_Command:
   187 0000EFAD 42616420636F6D6D61- <1>                 db "Bad command or file name!"
   187 0000EFB6 6E64206F722066696C- <1>
   187 0000EFBF 65206E616D6521      <1>
   188 0000EFC6 0D0A00              <1>                 db 0Dh, 0Ah, 0
   189                              <1> 
   190                              <1> msgl_drv_not_ready: 
   191 0000EFC9 070D0A              <1> 		db 07h, 0Dh, 0Ah
   192                              <1> 
   193                              <1> ; CMD_INTR.ASM - 09/11/2011 - Messages
   194                              <1> 
   195                              <1> Msg_Not_Ready_Read_Err:
   196 0000EFCC 4472697665206E6F74- <1>                 db "Drive not ready or read error!"
   196 0000EFD5 207265616479206F72- <1>
   196 0000EFDE 207265616420657272- <1>
   196 0000EFE7 6F7221              <1>
   197 0000EFEA 0D0A00              <1>                 db 0Dh, 0Ah, 0
   198                              <1> 
   199                              <1> Msg_Not_Ready_Write_Err:
   200 0000EFED 4472697665206E6F74- <1>                 db "Drive not ready or write error!"
   200 0000EFF6 207265616479206F72- <1>
   200 0000EFFF 207772697465206572- <1>
   200 0000F008 726F7221            <1>
   201 0000F00C 0D0A00              <1>                 db 0Dh, 0Ah, 0
   202                              <1> 
   203                              <1> Msg_Dir_Not_Found:
   204 0000F00F 4469726563746F7279- <1>                 db "Directory not found!"
   204 0000F018 206E6F7420666F756E- <1>
   204 0000F021 6421                <1>
   205 0000F023 0D0A00              <1>                 db 0Dh, 0Ah, 0
   206                              <1> 
   207                              <1> Msg_File_Not_Found:
   208 0000F026 46696C65206E6F7420- <1>                 db "File not found!"
   208 0000F02F 666F756E6421        <1>
   209 0000F035 0D0A00              <1>                 db 0Dh, 0Ah, 0
   210                              <1> 
   211                              <1> Msg_File_Directory_Not_Found:
   212 0000F038 46696C65206F722064- <1>                 db "File or directory not found!"
   212 0000F041 69726563746F727920- <1>
   212 0000F04A 6E6F7420666F756E64- <1>
   212 0000F053 21                  <1>
   213 0000F054 0D0A00              <1>                 db 0Dh, 0Ah, 0
   214                              <1> 
   215                              <1> Msg_LongName_Not_Found:
   216 0000F057 4C6F6E67206E616D65- <1>                 db "Long name not found!"
   216 0000F060 206E6F7420666F756E- <1>
   216 0000F069 6421                <1>
   217 0000F06B 0D0A00              <1>                 db 0Dh, 0Ah, 0
   218                              <1> 
   219                              <1> Msg_Insufficient_Memory:
   220 0000F06E 496E73756666696369- <1>                 db "Insufficient memory!"
   220 0000F077 656E74206D656D6F72- <1>
   220 0000F080 7921                <1>
   221 0000F082 0D0A00              <1>                 db 0Dh, 0Ah, 0
   222                              <1> 
   223                              <1> Msg_Error_Code:
   224 0000F085 436F6D6D616E642066- <1>                 db 'Command failed! Error code : '
   224 0000F08E 61696C656421204572- <1>
   224 0000F097 726F7220636F646520- <1>
   224 0000F0A0 3A20                <1>
   225 0000F0A2 303068              <1> error_code_hex: db '00h'
   226 0000F0A5 0A0A00              <1>                 db 0Ah, 0Ah, 0
   227                              <1> 
   228                              <1> align 2
   229                              <1> 
   230                              <1> ; 10/02/2016
   231                              <1> ; DIR.ASM - 09/10/2011
   232                              <1> 
   233 0000F0A8 3C4449523E20202020- <1> Type_Dir:       db '<DIR>     ' ; 10 bytes
   233 0000F0B1 20                  <1>
   234                              <1> 
   235                              <1> File_Name:
   236 0000F0B2 20<rept>            <1>                 times 12 db 20h
   237 0000F0BE 20                  <1> 		db 20h
   238                              <1> Dir_Or_FileSize:
   239 0000F0BF 20<rept>            <1>                 times 10 db 20h
   240 0000F0C9 20                  <1> 		db 20h
   241                              <1> File_Attribute:
   242 0000F0CA 20202020            <1> 		dd 20202020h
   243 0000F0CE 20                  <1> 		db 20h
   244                              <1> File_Day:
   245 0000F0CF 3030                <1>                 db '0','0'
   246 0000F0D1 2F                  <1> 		db '/'
   247                              <1> File_Month:
   248 0000F0D2 3030                <1>                 db '0','0'
   249 0000F0D4 2F                  <1> 		db '/'
   250                              <1> File_Year:
   251 0000F0D5 30303030            <1>                 db '0','0','0','0'
   252 0000F0D9 20                  <1> 		db 20h
   253                              <1> File_Hour:
   254 0000F0DA 3030                <1>                 db '0','0'
   255 0000F0DC 3A                  <1> 		db ':'
   256                              <1> File_Minute:
   257 0000F0DD 3030                <1>                 db '0','0'
   258 0000F0DF 00                  <1> 		db 0
   259                              <1> 
   260                              <1> Decimal_File_Count_Header:
   261 0000F0E0 0D0A                <1> 		db 0Dh, 0Ah
   262                              <1> Decimal_File_Count:
   263 0000F0E2 00<rept>            <1> 		times 6 db 0
   264                              <1> 
   265 0000F0E8 2066696C6528732920- <1> str_files:	db " file(s) & "
   265 0000F0F1 2620                <1>
   266                              <1> Decimal_Dir_Count: 
   267 0000F0F3 00<rept>            <1> 		times 6 db 0
   268                              <1> str_dirs:       
   269 0000F0F9 206469726563746F72- <1> 		db " directory(s) "
   269 0000F102 7928732920          <1>
   270 0000F107 0D0A00              <1> 		db 0Dh, 0Ah, 0
   271                              <1> 
   272 0000F10A 206279746528732920- <1> str_bytes:	db " byte(s) in file(s)"
   272 0000F113 696E2066696C652873- <1>
   272 0000F11C 29                  <1>
   273 0000F11D 0D0A00              <1> 		db 0Dh, 0Ah, 0
   274                              <1> 
   275                              <1> ; CMD_INTR.ASM - 09/11/2011
   276                              <1> ; 07/10/2010
   277                              <1> Msg_invalid_name_chars:
   278 0000F120 496E76616C69642066- <1>                 db "Invalid file or directory name characters!"
   278 0000F129 696C65206F72206469- <1>
   278 0000F132 726563746F7279206E- <1>
   278 0000F13B 616D65206368617261- <1>
   278 0000F144 637465727321        <1>
   279 0000F14A 0D0A00              <1>         	db 0Dh, 0Ah, 0
   280                              <1> ; 21/02/2016
   281 0000F14D 46696C65206F722064- <1> Msg_Name_Exists: db "File or directory name exists!"
   281 0000F156 69726563746F727920- <1>
   281 0000F15F 6E616D652065786973- <1>
   281 0000F168 747321              <1>
   282 0000F16B 0D0A00              <1>                 db 0Dh, 0Ah, 0
   283                              <1> Msg_DoYouWantMkdir:
   284 0000F16E 446F20796F75207761- <1>                 db "Do you want to make directory ", 0
   284 0000F177 6E7420746F206D616B- <1>
   284 0000F180 65206469726563746F- <1>
   284 0000F189 72792000            <1>
   285 0000F18D 2028592F4E29203F20- <1> Msg_YesNo:      db " (Y/N) ? ", 0  
   285 0000F196 00                  <1>
   286 0000F197 000D0A00            <1> Y_N_nextline:	db 0, 0Dh, 0Ah, 0 
   287 0000F19B 4F4B2E0D0A00        <1> Msg_OK:		db "OK.", 0Dh, 0Ah, 0
   288                              <1> 
   289                              <1> ; 27/02/2016
   290                              <1> Msg_DoYouWantRmDir:
   291 0000F1A1 446F20796F75207761- <1>                 db "Do you want to delete directory ", 0
   291 0000F1AA 6E7420746F2064656C- <1>
   291 0000F1B3 657465206469726563- <1>
   291 0000F1BC 746F72792000        <1>
   292                              <1> Msg_Dir_Not_Empty:
   293 0000F1C2 4469726563746F7279- <1>                 db "Directory not empty!"
   293 0000F1CB 206E6F7420656D7074- <1>
   293 0000F1D4 7921                <1>
   294 0000F1D6 0D0A00              <1>                 db 0Dh, 0Ah, 0
   295                              <1> 
   296                              <1> Msg_DoYouWantDelete:
   297 0000F1D9 446F20796F75207761- <1>                 db "Do you want to delete file ",0
   297 0000F1E2 6E7420746F2064656C- <1>
   297 0000F1EB 6574652066696C6520- <1>
   297 0000F1F4 00                  <1>
   298                              <1> 
   299 0000F1F5 44656C657465642E2E- <1> Msg_Deleted:    db "Deleted...", 0Dh, 0Ah, 0
   299 0000F1FE 2E0D0A00            <1>
   300                              <1> 
   301                              <1> Msg_Permission_Denied:
   302 0000F202 07                  <1>                 db 7
   303 0000F203 5065726D697373696F- <1>                 db "Permission denied!", 0Dh, 0Ah, 0
   303 0000F20C 6E2064656E69656421- <1>
   303 0000F215 0D0A00              <1>
   304                              <1> 
   305                              <1> ; 04/03/2016
   306 0000F218 4E657720            <1> Msg_New:        db "New "
   307 0000F21C 00                  <1>                 db 0
   308                              <1> Str_Attributes:
   309 0000F21D 417474726962757465- <1>                 db "Attributes : "
   309 0000F226 73203A20            <1>
   310 0000F22A 4E4F524D414C        <1> Attr_Chars:     db "NORMAL"
   311 0000F230 00                  <1>                 db 0
   312                              <1> 
   313                              <1> ; 06/03/2016
   314                              <1> ; CMD_INTR.ASM - 16/11/2010 
   315                              <1> Msg_DoYouWantRename:
   316 0000F231 446F20796F75207761- <1>                 db "Do you want to rename ", 0
   316 0000F23A 6E7420746F2072656E- <1>
   316 0000F243 616D652000          <1>
   317 0000F248 66696C652000        <1> Rename_File:    db "file ", 0
   318 0000F24E 6469726563746F7279- <1> Rename_Directory: db "directory ", 0
   318 0000F257 2000                <1>
   319 0000F259 00<rept>            <1> Rename_OldName: times 13 db 0
   320 0000F266 20617320            <1> Msg_File_rename_as: db " as "
   321 0000F26A 00<rept>            <1> Rename_NewName: times 13 db 0
   322                              <1> 
   323                              <1> ; 08/03/2016
   324                              <1> ; CMD_INTR.ASM - 01/08/2010 - 23/04/2011
   325                              <1> msg_not_same_drv:
   326 0000F277 4E6F742073616D6520- <1>                 db "Not same drive!" 
   326 0000F280 647269766521        <1>
   327 0000F286 0D0A00              <1>                 db 0Dh, 0Ah, 0 
   328                              <1> 
   329                              <1> Msg_DoYouWantMoveFile:
   330 0000F289 446F20796F75207761- <1>                 db "Do you want to move file", 0
   330 0000F292 6E7420746F206D6F76- <1>
   330 0000F29B 652066696C6500      <1>
   331                              <1> 
   332                              <1> msg_insufficient_disk_space:
   333 0000F2A2 496E73756666696369- <1>                 db "Insufficient disk space!" 
   333 0000F2AB 656E74206469736B20- <1>
   333 0000F2B4 737061636521        <1>
   334 0000F2BA 0D0A00              <1>                 db 0Dh, 0Ah, 0
   335                              <1> 
   336                              <1> ; 01/08/2010
   337                              <1> msg_source_file: 
   338 0000F2BD 0D0A536F7572636520- <1> 		db 0Dh, 0Ah, "Source file name      :   "
   338 0000F2C6 66696C65206E616D65- <1>
   338 0000F2CF 2020202020203A2020- <1>
   338 0000F2D8 20                  <1>
   339                              <1> msg_source_file_drv: 
   340 0000F2D9 203A00              <1> 		db " :", 0
   341                              <1> msg_destination_file: 
   342 0000F2DC 0D0A44657374696E61- <1> 		db 0Dh, 0Ah, "Destination file name :   "
   342 0000F2E5 74696F6E2066696C65- <1>
   342 0000F2EE 206E616D65203A2020- <1>
   342 0000F2F7 20                  <1>
   343                              <1> msg_destination_file_drv: 
   344 0000F2F8 203A00              <1> 		db " :", 0
   345                              <1> msg_copy_nextline: 
   346 0000F2FB 0D0A00              <1> 		db 0Dh, 0Ah, 0
   347                              <1> 
   348                              <1> ; 15/03/2016
   349                              <1> ; CMD_INTR.ASM
   350                              <1> 
   351                              <1> Msg_DoYouWantOverWriteFile:
   352 0000F2FE 446F20796F75207761- <1>                 db "Do you want to overwrite file ",0
   352 0000F307 6E7420746F206F7665- <1>
   352 0000F310 727772697465206669- <1>
   352 0000F319 6C652000            <1>
   353                              <1>   
   354                              <1> Msg_DoYouWantCopyFile:
   355 0000F31D 446F20796F75207761- <1>                 db "Do you want to copy file",0
   355 0000F326 6E7420746F20636F70- <1>
   355 0000F32F 792066696C6500      <1>
   356                              <1> 
   357                              <1> Msg_read_file_error_before_EOF:
   358 0000F336 46696C652072656164- <1> 		db "File reading error! (before EOF)"
   358 0000F33F 696E67206572726F72- <1>
   358 0000F348 2120286265666F7265- <1>
   358 0000F351 20454F4629          <1>
   359 0000F356 0A0A00              <1> 		db 0Ah, 0Ah, 0
   360                              <1> 
   361                              <1> ; 18/03/2016
   362                              <1> ; TRDOS 386 (v2.0) mainprog copy procedure
   363                              <1> msg_reading:
   364 0000F359 52656164696E672E2E- <1> 		db "Reading... ", 0
   364 0000F362 2E2000              <1>
   365                              <1> msg_writing:
   366 0000F365 57726974696E672E2E- <1> 		db "Writing... ", 0
   366 0000F36E 2E2000              <1>
   367                              <1> percentagestr:
   368 0000F371 2020202500          <1> 		db "   %", 0  ; "  0%" .. "100%"
   369                              <1> ; 11/04/2016
   370                              <1> Msg_No_Set_Space:
   371 0000F376 496E73756666696369- <1>                 db "Insufficient environment space!"
   371 0000F37F 656E7420656E766972- <1>
   371 0000F388 6F6E6D656E74207370- <1>
   371 0000F391 61636521            <1>
   372 0000F395 0D0A00              <1>                 db 0Dh, 0Ah, 0
   373                              <1> ; 18/04/2016
   374                              <1> isc_msg:	
   375 0000F398 0D0A                <1> 		db 0Dh, 0Ah
   376 0000F39A 494E56414C49442053- <1> 		db "INVALID SYSTEM CALL", 0
   376 0000F3A3 595354454D2043414C- <1>
   376 0000F3AC 4C00                <1>
   377                              <1> usi_msg:
   378 0000F3AE 0D0A                <1> 		db 0Dh, 0Ah
   379 0000F3B0 554E444546494E4544- <1> 		db "UNDEFINED SOFTWARE INTERRUPT", 0
   379 0000F3B9 20534F465457415245- <1>
   379 0000F3C2 20494E544552525550- <1>
   379 0000F3CB 5400                <1>
   380                              <1> ifc_msg:
   381 0000F3CD 0D0A                <1> 		db 0Dh, 0Ah
   382 0000F3CF 494E56414C49442046- <1> 		db "INVALID FUNCTION CALL"
   382 0000F3D8 554E4354494F4E2043- <1>
   382 0000F3E1 414C4C              <1>
   383                              <1> inv_msg_for_trdos_v2:
   384 0000F3E4 20                  <1> 		db 20h
   385 0000F3E5 666F72205452444F53- <1> 		db "for TRDOS v2!"
   385 0000F3EE 20763221            <1>
   386 0000F3F2 07                  <1> 		db 07h
   387 0000F3F3 0D0A                <1> 		db 0Dh, 0Ah
   388 0000F3F5 0D0A                <1> 		db 0Dh, 0Ah
   389 0000F3F7 494E5420            <1> 		db "INT "
   390 0000F3FB 303068              <1> int_num_str:	db "00h"
   391 0000F3FE 0D0A                <1> 		db 0Dh, 0Ah
   392 0000F400 454158203A20        <1> 		db "EAX : "
   393 0000F406 303030303030303068- <1> eax_str:	db "00000000h", 0Dh, 0Ah
   393 0000F40F 0D0A                <1>
   394 0000F411 454950203A20        <1> 		db "EIP : "
   395 0000F417 303030303030303068- <1> eip_str:	db "00000000h", 0Dh, 0Ah, 0
   395 0000F420 0D0A00              <1>
   396                              <1> 
   397                              <1> ; 07/10/2016
   398                              <1> ; Device names & parameters (for kernel devices)
   399                              <1> 
   400 0000F423 90                  <1> align 2
   401                              <1> KDEV_NAME:
   402 0000F424 5454590000000000    <1> 		db 'TTY',0,0,0,0,0 ; 1
   403 0000F42C 4D454D0000000000    <1> 		db 'MEM',0,0,0,0,0 ; 2
   404 0000F434 4644300000000000    <1> 		db 'FD0',0,0,0,0,0 ; 3
   405 0000F43C 4644310000000000    <1> 		db 'FD1',0,0,0,0,0 ; 4
   406 0000F444 4844300000000000    <1> 		db 'HD0',0,0,0,0,0 ; 5
   407 0000F44C 4844310000000000    <1> 		db 'HD1',0,0,0,0,0 ; 6
   408 0000F454 4844320000000000    <1> 		db 'HD2',0,0,0,0,0 ; 7
   409 0000F45C 4844330000000000    <1> 		db 'HD3',0,0,0,0,0 ; 8
   410 0000F464 4C50540000000000    <1> 		db 'LPT',0,0,0,0,0 ; 9
   411 0000F46C 5454593000000000    <1> 		db 'TTY0',0,0,0,0 ; 10
   412 0000F474 5454593100000000    <1> 		db 'TTY1',0,0,0,0 ; 11
   413 0000F47C 5454593200000000    <1> 		db 'TTY2',0,0,0,0 ; 12
   414 0000F484 5454593300000000    <1> 		db 'TTY3',0,0,0,0 ; 13
   415 0000F48C 5454593400000000    <1> 		db 'TTY4',0,0,0,0 ; 14
   416 0000F494 5454593500000000    <1> 		db 'TTY5',0,0,0,0 ; 15
   417 0000F49C 5454593600000000    <1> 		db 'TTY6',0,0,0,0 ; 16
   418 0000F4A4 5454593700000000    <1> 		db 'TTY7',0,0,0,0 ; 17
   419 0000F4AC 5454593800000000    <1> 		db 'TTY8',0,0,0,0 ; 18
   420 0000F4B4 5454593900000000    <1> 		db 'TTY9',0,0,0,0 ; 19
   421 0000F4BC 434F4D3100000000    <1> 		db 'COM1',0,0,0,0 ; 18
   422 0000F4C4 434F4D3200000000    <1> 		db 'COM2',0,0,0,0 ; 19
   423                              <1> 		;db 'CONSOLE',0	  ; 1
   424                              <1> 		;db 'PRINTER',0   ; 9
   425                              <1> 		;db 'CDROM'	  ; 20
   426                              <1> 		;db 'CDROM0'	  ; 20
   427                              <1> 		;db 'CDROM1'	  ; 21		
   428                              <1> 		;db 'DVD'	  ; 22
   429                              <1> 		;db 'DVD0'	  ; 22
   430                              <1> 		;db 'DVD1'	  ; 23		
   431                              <1> 		;db 'USB'	  ; 24
   432                              <1> 		;db 'USB0'	  ; 24
   433                              <1> 		;db 'USB1'	  ; 25
   434                              <1> 		;db 'USB2'	  ; 26
   435                              <1> 		;db 'USB3'        ; 27
   436                              <1> 		;db 'KEYBOARD'	  ; 1	
   437                              <1> 		;db 'MOUSE'	  ; 28
   438                              <1> 		;db 'SOUND'	  ; 29
   439                              <1> 		;db 'VGA',0,0,0,0 ; 30
   440                              <1> 		;db 'CGA',0,0,0,0 ; 31
   441                              <1> 		;db 'AUDIO',0,0,0 ; 29
   442                              <1> 		;db 'VIDEO',0,0,0 ; 32
   443                              <1> 		;db 'MUSIC',0,0,0 ; 33
   444                              <1> 		;db 'ETHERNET'	  ; 34 		
   445                              <1> 		;db 'SD0',0,0,0,0,0 ; 35
   446                              <1> 		;db 'SD1',0,0,0,0,0 ; 36
   447                              <1> 		;db 'SD2',0,0,0,0,0 ; 37
   448                              <1> 		;db 'SD3',0,0,0,0,0 ; 38
   449                              <1> 		;db 'SATA0'	  ; 35
   450                              <1> 		;db 'SATA1'	  ; 36
   451                              <1> 		;db 'SATA2'        ; 37
   452                              <1> 		;db 'SATA3'        ; 38
   453                              <1> 		;db 'PATA0',0,0,0  ; 5
   454                              <1> 		;db 'PATA1',0,0,0  ; 6
   455                              <1> 		;db 'PATA2',0,0,0  ; 7
   456                              <1> 		;db 'PATA3',0,0,0  ; 8
   457                              <1> 		;db 'WIRELESS'	  ; 39
   458                              <1> 		;db 'HDMI',0,0,0,0 ; 40
   459 0000F4CC 4E554C4C00000000    <1> 		db 'NULL',0,0,0,0 ; 0
   460                              <1> 
   461                              <1> NumOfKernelDevNames equ ($-KDEV_NAME) / 8 ; 20 (07/10/2016)
   462                              <1> 
   463                              <1> KDEV_NUMBER:
   464 0000F4D4 010203040506070809  <1> 		db 1,2,3,4,5,6,7,8,9
   465 0000F4DD 0A0B0C0D0E0F101112- <1> 		db 10,11,12,13,14,15,16,17,18,19
   465 0000F4E6 13                  <1>
   466 0000F4E7 121300              <1> 		db 18,19,0
   467                              <1> 
   468                              <1> NumOfKernelDevices equ $ - KDEV_NUMBER
   469                              <1> 
   470                              <1> KDEV_OADDR:
   471 0000F4EA [0BED0000]          <1> 		dd otty ;tty  ; 1
   472 0000F4EE [0BED0000]          <1> 		dd sret ;mem  ; 2
   473 0000F4F2 [0BED0000]          <1>  		dd sret ;fd0  ; 3
   474 0000F4F6 [0BED0000]          <1>  		dd sret ;fd1  ; 4
   475 0000F4FA [0BED0000]          <1>  		dd sret ;hd0  ; 5
   476 0000F4FE [0BED0000]          <1>  		dd sret ;hd1  ; 6
   477 0000F502 [0BED0000]          <1>  		dd sret ;hd2  ; 7
   478 0000F506 [0BED0000]          <1>  		dd sret ;hd3  ; 8
   479 0000F50A [0BED0000]          <1>  		dd sret ;lpt  ; 9
   480 0000F50E [0BED0000]          <1>  		dd ocvt ;tty0 ; 10
   481 0000F512 [0BED0000]          <1> 		dd ocvt ;tty1 ; 11
   482 0000F516 [0BED0000]          <1>  		dd ocvt ;tty2 ; 12
   483 0000F51A [0BED0000]          <1>  		dd ocvt ;tty3 ; 13
   484 0000F51E [0BED0000]          <1>  		dd ocvt ;tty4 ; 14
   485 0000F522 [0BED0000]          <1>  		dd ocvt ;tty5 ; 15
   486 0000F526 [0BED0000]          <1>  		dd ocvt ;tty6 ; 16
   487 0000F52A [0BED0000]          <1>  		dd ocvt ;tty7 ; 17
   488 0000F52E [0BED0000]          <1>  		dd ocvt ;tty8 ; 18
   489 0000F532 [0BED0000]          <1>  		dd ocvt ;tty9 ; 19
   490                              <1>  		;dd ocvt ;com1 ; 18
   491                              <1>  		;dd ocvt ;com2 ; 19
   492 0000F536 [0BED0000]          <1> 		dd sret ;null ; 20  
   493                              <1> KDEV_CADDR:
   494 0000F53A [0BED0000]          <1> 		dd ctty ;tty  ; 1
   495 0000F53E [0BED0000]          <1> 		dd cret ;mem  ; 2
   496 0000F542 [0BED0000]          <1>  		dd cret ;fd0  ; 3
   497 0000F546 [0BED0000]          <1>  		dd cret ;fd1  ; 4
   498 0000F54A [0BED0000]          <1>  		dd cret ;hd0  ; 5
   499 0000F54E [0BED0000]          <1>  		dd cret ;hd1  ; 6
   500 0000F552 [0BED0000]          <1>  		dd cret ;hd2  ; 7
   501 0000F556 [0BED0000]          <1>  		dd cret ;hd3  ; 8
   502 0000F55A [0BED0000]          <1>  		dd cret ;lpt  ; 9
   503 0000F55E [0BED0000]          <1>  		dd ocvt ;tty0 ; 10
   504 0000F562 [0BED0000]          <1> 		dd ccvt ;tty1 ; 11
   505 0000F566 [0BED0000]          <1>  		dd ccvt ;tty2 ; 12
   506 0000F56A [0BED0000]          <1>  		dd ccvt ;tty3 ; 13
   507 0000F56E [0BED0000]          <1>  		dd ccvt ;tty4 ; 14
   508 0000F572 [0BED0000]          <1>  		dd ccvt ;tty5 ; 15
   509 0000F576 [0BED0000]          <1>  		dd ccvt ;tty6 ; 16
   510 0000F57A [0BED0000]          <1>  		dd ccvt ;tty7 ; 17
   511 0000F57E [0BED0000]          <1>  		dd ccvt ;tty8 ; 18
   512 0000F582 [0BED0000]          <1>  		dd ccvt ;tty9 ; 19
   513                              <1>  		;dd ccvt ;com1 ; 18
   514                              <1>  		;dd ccvt ;com2 ; 19
   515 0000F586 [0BED0000]          <1> 		dd cret ;null ; 20
   516                              <1> 
   517                              <1> KDEV_RADDR:
   518 0000F58A [0BED0000]          <1> 		dd rtty ;tty  ; 1
   519 0000F58E [0BED0000]          <1> 		dd rmem ;mem  ; 2
   520 0000F592 [0BED0000]          <1>  		dd rfd  ;fd0  ; 3
   521 0000F596 [0BED0000]          <1>  		dd rfd  ;fd1  ; 4
   522 0000F59A [0BED0000]          <1>  		dd rhd  ;hd0  ; 5
   523 0000F59E [0BED0000]          <1>  		dd rhd  ;hd1  ; 6
   524 0000F5A2 [0BED0000]          <1>  		dd rhd  ;hd2  ; 7
   525 0000F5A6 [0BED0000]          <1>  		dd rhd  ;hd3  ; 8
   526 0000F5AA [0BED0000]          <1>  		dd rlpt ;lpt  ; 9
   527 0000F5AE [0BED0000]          <1>  		dd rcvt ;tty0 ; 10
   528 0000F5B2 [0BED0000]          <1> 		dd rcvt ;tty1 ; 11
   529 0000F5B6 [0BED0000]          <1>  		dd rcvt ;tty2 ; 12
   530 0000F5BA [0BED0000]          <1>  		dd rcvt ;tty3 ; 13
   531 0000F5BE [0BED0000]          <1>  		dd rcvt ;tty4 ; 14
   532 0000F5C2 [0BED0000]          <1>  		dd rcvt ;tty5 ; 15
   533 0000F5C6 [0BED0000]          <1>  		dd rcvt ;tty6 ; 16
   534 0000F5CA [0BED0000]          <1>  		dd rcvt ;tty7 ; 17
   535 0000F5CE [0BED0000]          <1>  		dd rcvt ;tty8 ; 18
   536 0000F5D2 [0BED0000]          <1>  		dd rcvt ;tty9 ; 19
   537                              <1>  		;dd rcvt ;com1 ; 18
   538                              <1>  		;dd rcvt ;com2 ; 19
   539 0000F5D6 [09ED0000]          <1> 		dd rnull ;null ; 20  
   540                              <1> KDEV_WADDR:
   541 0000F5DA [0BED0000]          <1> 		dd wtty ;tty  ; 1
   542 0000F5DE [0BED0000]          <1> 		dd wmem ;mem  ; 2
   543 0000F5E2 [0BED0000]          <1>  		dd wfd  ;fd0  ; 3
   544 0000F5E6 [0BED0000]          <1>  		dd wfd  ;fd1  ; 4
   545 0000F5EA [0BED0000]          <1>  		dd whd  ;hd0  ; 5
   546 0000F5EE [0BED0000]          <1>  		dd whd  ;hd1  ; 6
   547 0000F5F2 [0BED0000]          <1>  		dd whd  ;hd2  ; 7
   548 0000F5F6 [0BED0000]          <1>  		dd whd  ;hd3  ; 8
   549 0000F5FA [0BED0000]          <1>  		dd wlpt ;lpt  ; 9
   550 0000F5FE [0BED0000]          <1>  		dd xmtt ;tty0 ; 10
   551 0000F602 [0BED0000]          <1> 		dd xmtt ;tty1 ; 11
   552 0000F606 [0BED0000]          <1>  		dd xmtt ;tty2 ; 12
   553 0000F60A [0BED0000]          <1>  		dd xmtt ;tty3 ; 13
   554 0000F60E [0BED0000]          <1>  		dd xmtt ;tty4 ; 14
   555 0000F612 [0BED0000]          <1>  		dd xmtt ;tty5 ; 15
   556 0000F616 [0BED0000]          <1>  		dd xmtt ;tty6 ; 16
   557 0000F61A [0BED0000]          <1>  		dd xmtt ;tty7 ; 17
   558 0000F61E [0BED0000]          <1>  		dd xmtt ;tty8 ; 18
   559 0000F622 [0BED0000]          <1>  		dd xmtt ;tty9 ; 19
   560                              <1>  		;dd xmtt ;com1 ; 18
   561                              <1>  		;dd xmtt ;com2 ; 19
   562 0000F626 [0AED0000]          <1> 		dd wnull ;null ; 20  
   563                              <1> 
   564                              <1> ; DEV_ACCESS bits:
   565                              <1> 	; bit 0 = accessable by normal users
   566                              <1> 	; bit 1 = read access permission
   567                              <1> 	; bit 2 = write access permission
   568                              <1> 	; bit 3 = IOCTL permission to users
   569                              <1> 	; bit 4 = block device if it is set
   570                              <1> 	; bit 5 = 16 bit or 1024 byte data
   571                              <1> 	; bit 6 = 32 bit or 2048 byte data
   572                              <1> 	; bit 7 = installable device driver	
   573                              <1> 
   574                              <1> KDEV_ACCESS: ; 08/10/2016
   575 0000F62A 07                  <1> 		db  00000111b	; tty, 1
   576 0000F62B 07                  <1> 		db  00000111b	; mem, 2	
   577 0000F62C 8F                  <1> 		db  10001111b	; fd0, 3	
   578 0000F62D 8F                  <1> 		db  10001111b	; fd1, 4
   579 0000F62E 8F                  <1> 		db  10001111b	; hd0, 5
   580 0000F62F 8F                  <1> 		db  10001111b	; hd1, 6
   581 0000F630 8F                  <1> 		db  10001111b	; hd2, 7
   582 0000F631 8F                  <1> 		db  10001111b	; hd3, 8
   583 0000F632 07                  <1> 		db  00000111b   ; lpt, 9
   584 0000F633 07                  <1> 		db  00000111b	; tty0, 10
   585 0000F634 07                  <1> 		db  00000111b	; tty1, 11
   586 0000F635 07                  <1> 		db  00000111b	; tty2, 12
   587 0000F636 07                  <1> 		db  00000111b	; tty3, 13
   588 0000F637 07                  <1> 		db  00000111b	; tty4, 14
   589 0000F638 07                  <1> 		db  00000111b	; tty5, 15
   590 0000F639 07                  <1> 		db  00000111b	; tty6, 16
   591 0000F63A 07                  <1> 		db  00000111b	; tty7, 17
   592 0000F63B 07                  <1> 		db  00000111b	; tty8, 18
   593 0000F63C 07                  <1> 		db  00000111b	; tty9, 19
   594                              <1> 		;db 00000111b	; com1, 18
   595                              <1> 		;db 00000111b	; com2, 19
   596 0000F63D 00                  <1> 		db  00000000b   ; null, 0
   597                              <1> 
   598                              <1> ; 07/10/2016
   599                              <1> NumOfInstallableDevices equ 8
   600                              <1> NUMIDEV		equ NumOfInstallableDevices ; 8
   601                              <1> NUMOFDEVICES	equ NumOfKernelDevices + NumOfInstallableDevices		
  2142                                  
  2143 0000F63E 90<rept>                align 16
  2144                                  
  2145                                  gdt:	; Global Descriptor Table
  2146                                  	; (30/07/2015, conforming cs)
  2147                                  	; (26/03/2015)
  2148                                  	; (24/03/2015, tss)
  2149                                  	; (19/03/2015)
  2150                                  	; (29/12/2013)
  2151                                  	;
  2152 0000F640 0000000000000000        	dw 0, 0, 0, 0		; NULL descriptor
  2153                                  	; 18/08/2014
  2154                                  			; 8h kernel code segment, base = 00000000h		
  2155                                  	;dw 0FFFFh, 0, 9E00h, 00CFh	; KCODE  ; 30/12/2016	 
  2156 0000F648 FFFF0000009ACF00        	dw 0FFFFh, 0, 9A00h, 00CFh	; KCODE
  2157                                  			; 10h kernel data segment, base = 00000000h	
  2158 0000F650 FFFF00000092CF00        	dw 0FFFFh, 0, 9200h, 00CFh	; KDATA
  2159                                  			; 1Bh user code segment, base address = 400000h ; CORE
  2160                                  	;dw 0FBFFh, 0, 0FE40h, 00CFh	; UCODE  ; 30/12/2016	
  2161 0000F658 FFFB000040FACF00        	dw 0FBFFh, 0, 0FA40h, 00CFh	; UCODE 
  2162                                  			; 23h user data segment, base address = 400000h ; CORE
  2163 0000F660 FFFB000040F2CF00        	dw 0FBFFh, 0, 0F240h, 00CFh	; UDATA
  2164                                  			; Task State Segment
  2165 0000F668 6700                    	dw 0067h ; Limit = 103 ; (104-1, tss size = 104 byte, 
  2166                                  			       ;  no IO permission in ring 3)
  2167                                  gdt_tss0:
  2168 0000F66A 0000                    	dw 0  ; TSS base address, bits 0-15 
  2169                                  gdt_tss1:
  2170 0000F66C 00                      	db 0  ; TSS base address, bits 16-23 
  2171                                  	      		; 49h	
  2172 0000F66D E9                      	db 11101001b ; E9h => P=1/DPL=11/0/1/0/B/1 --> B = Task is busy (1)
  2173 0000F66E 00                      	db 0 ; G/0/0/AVL/LIMIT=0000 ; (Limit bits 16-19 = 0000) (G=0, 1 byte)
  2174                                  gdt_tss2:
  2175 0000F66F 00                      	db 0  ; TSS base address, bits 24-31 
  2176                                  
  2177                                  gdt_end:
  2178                                  	;; 9Eh = 1001 1110b (GDT byte 5) P=1/DPL=00/1/TYPE=1110, 
  2179                                  					;; Type= 1 (code)/C=1/R=1/A=0
  2180                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  2181                                  		; 1= Code C= Conforming, R= Readable, A = Accessed
  2182                                  
  2183                                  	;; 9Ah = 1001 1010b (GDT byte 5) P=1/DPL=00/1/TYPE=1010, 
  2184                                  					;; Type= 1 (code)/C=0/R=1/A=0
  2185                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  2186                                  		; 1= Code C= non-Conforming, R= Readable, A = Accessed
  2187                                  
  2188                                  	;; 92h = 1001 0010b (GDT byte 5) P=1/DPL=00/1/TYPE=1010, 
  2189                                  					;; Type= 0 (data)/E=0/W=1/A=0
  2190                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  2191                                  		; 0= Data E= Expansion direction (1= down, 0= up)
  2192                                  		; W= Writeable, A= Accessed
  2193                                  
  2194                                  	;; FEh = 1111 1110b (GDT byte 5) P=1/DPL=11/1/TYPE=1110, 
  2195                                  					;; Type= 1 (code)/C=1/R=1/A=0
  2196                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  2197                                  		; 1= Code C= Conforming, R= Readable, A = Accessed
  2198                                  	
  2199                                  	;; FAh = 1111 1010b (GDT byte 5) P=1/DPL=11/1/TYPE=1010, 
  2200                                  					;; Type= 1 (code)/C=0/R=1/A=0
  2201                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  2202                                  		; 1= Code C= non-Conforming, R= Readable, A = Accessed
  2203                                  
  2204                                  	;; F2h = 1111 0010b (GDT byte 5) P=1/DPL=11/1/TYPE=0010, 
  2205                                  					;; Type= 0 (data)/E=0/W=1/A=0
  2206                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  2207                                  		; 0= Data E= Expansion direction (1= down, 0= up)
  2208                                  	
  2209                                  	;; CFh = 1100 1111b (GDT byte 6) G=1/B=1/0/AVL=0, Limit=1111b (3)
  2210                                  
  2211                                  		;; Limit = FFFFFh (=> FFFFFh+1= 100000h) // bits 0-15, 48-51 //
  2212                                  		;	 = 100000h * 1000h (G=1) = 4GB
  2213                                  		;; Limit = FFBFFh (=> FFBFFh+1= FFC00h) // bits 0-15, 48-51 //
  2214                                  		;	 = FFC00h * 1000h (G=1) = 4GB - 4MB
  2215                                  		; G= Granularity (1= 4KB), B= Big (32 bit), 
  2216                                  		; AVL= Available to programmers	
  2217                                  
  2218                                  gdtd:
  2219 0000F670 2F00                            dw gdt_end - gdt - 1    ; Limit (size)
  2220 0000F672 [40F60000]                      dd gdt			; Address of the GDT
  2221                                  
  2222                                  	; 20/08/2014
  2223                                  idtd:
  2224 0000F676 7F02                            dw idt_end - idt - 1    ; Limit (size)
  2225 0000F678 [F82D0100]                      dd idt			; Address of the IDT
  2226                                  
  2227                                  ;;;
  2228                                  ;;; 11/03/2015
  2229                                  %include 'kybdata.s'	; KEYBOARD (BIOS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - kybdata.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 17/01/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 17/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; kybdata.inc (11/03/2015)
    15                              <1> ;
    16                              <1> ; Derived from 'IBM PC-XT-286' BIOS source code (1986) 
    17                              <1> ; ****************************************************************************
    18                              <1> 
    19                              <1> ; Retro UNIX 386 v1 Kernel - KYBDATA.INC
    20                              <1> ; Last Modification: 11/03/2015
    21                              <1> ;		 (Data Section for 'KEYBOARD.INC')	
    22                              <1> ;
    23                              <1> ; ///////// KEYBOARD DATA ///////////////
    24                              <1> 
    25                              <1> ; 05/12/2014
    26                              <1> ; 04/12/2014 (derived from pc-xt-286 bios source code -1986-) 
    27                              <1> ; 03/06/86  KEYBOARD BIOS
    28                              <1> 
    29                              <1> ;---------------------------------------------------------------------------------
    30                              <1> ;	KEY IDENTIFICATION SCAN TABLES
    31                              <1> ;---------------------------------------------------------------------------------
    32                              <1> 
    33                              <1> ;-----	TABLES FOR ALT CASE ------------
    34                              <1> ;-----	ALT-INPUT-TABLE 
    35 0000F67C 524F50514B          <1> K30:	db	82,79,80,81,75
    36 0000F681 4C4D474849          <1> 	db	76,77,71,72,73		; 10 NUMBER ON KEYPAD
    37                              <1> ;-----	SUPER-SHIFT-TABLE 
    38 0000F686 101112131415        <1> 	db	16,17,18,19,20,21	; A-Z TYPEWRITER CHARS
    39 0000F68C 161718191E1F        <1> 	db	22,23,24,25,30,31
    40 0000F692 202122232425        <1> 	db	32,33,34,35,36,37
    41 0000F698 262C2D2E2F30        <1> 	db	38,44,45,46,47,48
    42 0000F69E 3132                <1> 	db	49,50
    43                              <1> 
    44                              <1> ;-----	TABLE OF SHIFT KEYS AND MASK VALUES
    45                              <1> ;-----	KEY_TABLE 
    46 0000F6A0 52                  <1> _K6:    db      INS_KEY                 ; INSERT KEY
    47 0000F6A1 3A4546381D          <1> 	db	CAPS_KEY,NUM_KEY,SCROLL_KEY,ALT_KEY,CTL_KEY
    48 0000F6A6 2A36                <1>         db      LEFT_KEY,RIGHT_KEY
    49                              <1> _K6L    equ     $-_K6
    50                              <1> 
    51                              <1> ;-----	MASK_TABLE
    52 0000F6A8 80                  <1> _K7:    db      INS_SHIFT               ; INSERT MODE SHIFT
    53 0000F6A9 4020100804          <1> 	db	CAPS_SHIFT,NUM_SHIFT,SCROLL_SHIFT,ALT_SHIFT,CTL_SHIFT
    54 0000F6AE 0201                <1> 	db	LEFT_SHIFT,RIGHT_SHIFT
    55                              <1> 
    56                              <1> ;-----	TABLES FOR CTRL CASE		;---- CHARACTERS ------
    57 0000F6B0 1BFF00FFFFFF        <1> _K8:	db	27,-1,0,-1,-1,-1	; Esc, 1, 2, 3, 4, 5
    58 0000F6B6 1EFFFFFFFF1F        <1> 	db 	30,-1,-1,-1,-1,31	; 6, 7, 8, 9, 0, -
    59 0000F6BC FF7FFF111705        <1> 	db	-1,127,-1,17,23,5	; =, Bksp, Tab, Q, W, E
    60 0000F6C2 12141915090F        <1> 	db	18,20,25,21,9,15	; R, T, Y, U, I, O
    61 0000F6C8 101B1D0AFF01        <1> 	db	16,27,29,10,-1,1	; P, [, ], Enter, Ctrl, A
    62 0000F6CE 13040607080A        <1> 	db	19,4,6,7,8,10		; S, D, F, G, H, J
    63 0000F6D4 0B0CFFFFFFFF        <1> 	db	11,12,-1,-1,-1,-1	; K, L, :, ', `, LShift
    64 0000F6DA 1C1A18031602        <1> 	db	28,26,24,3,22,2		; Bkslash, Z, X, C, V, B
    65 0000F6E0 0E0DFFFFFFFF        <1> 	db	14,13,-1,-1,-1,-1	; N, M, ,, ., /, RShift
    66 0000F6E6 96FF20FF            <1> 	db	150,-1,' ',-1		; *, ALT, Spc, CL
    67                              <1> 	;				;----- FUNCTIONS ------		
    68 0000F6EA 5E5F60616263        <1> 	db 	94,95,96,97,98,99	; F1 - F6
    69 0000F6F0 64656667FFFF        <1> 	db	100,101,102,103,-1,-1	; F7 - F10, NL, SL
    70 0000F6F6 778D848E738F        <1> 	db	119,141,132,142,115,143	; Home, Up, PgUp, -, Left, Pad5
    71 0000F6FC 749075917692        <1> 	db 	116,144,117,145,118,146 ; Right, +, End, Down, PgDn, Ins
    72 0000F702 93FFFFFF898A        <1> 	db	147,-1,-1,-1,137,138	; Del, SysReq, Undef, WT, F11, F12
    73                              <1> 
    74                              <1> ;-----	TABLES FOR LOWER CASE ----------
    75 0000F708 1B3132333435363738- <1> K10:	db 	27,'1234567890-=',8,9
    75 0000F711 39302D3D0809        <1>
    76 0000F717 71776572747975696F- <1> 	db 	'qwertyuiop[]',13,-1,'asdfghjkl;',39
    76 0000F720 705B5D0DFF61736466- <1>
    76 0000F729 67686A6B6C3B27      <1>
    77 0000F730 60FF5C7A786376626E- <1> 	db	96,-1,92,'zxcvbnm,./',-1,'*',-1,' ',-1
    77 0000F739 6D2C2E2FFF2AFF20FF  <1>
    78                              <1> ;-----	LC TABLE SCAN
    79 0000F742 3B3C3D3E3F          <1> 	db	59,60,61,62,63		; BASE STATE OF F1 - F10
    80 0000F747 4041424344          <1> 	db	64,65,66,67,68
    81 0000F74C FFFF                <1> 	db	-1,-1			; NL, SL
    82                              <1> 
    83                              <1> ;-----	KEYPAD TABLE
    84 0000F74E 474849FF4BFF        <1> K15:	db	71,72,73,-1,75,-1	; BASE STATE OF KEYPAD KEYS
    85 0000F754 4DFF4F50515253      <1> 	db	77,-1,79,80,81,82,83
    86 0000F75B FFFF5C8586          <1> 	db	-1,-1,92,133,134	; SysRq, Undef, WT, F11, F12
    87                              <1> 
    88                              <1> ;-----	TABLES FOR UPPER CASE ----------
    89 0000F760 1B21402324255E262A- <1> K11:	db 	27,'!@#$%',94,'&*()_+',8,0
    89 0000F769 28295F2B0800        <1>
    90 0000F76F 51574552545955494F- <1> 	db 	'QWERTYUIOP{}',13,-1,'ASDFGHJKL:"'
    90 0000F778 507B7D0DFF41534446- <1>
    90 0000F781 47484A4B4C3A22      <1>
    91 0000F788 7EFF7C5A584356424E- <1> 	db	126,-1,'|ZXCVBNM<>?',-1,'*',-1,' ',-1
    91 0000F791 4D3C3E3FFF2AFF20FF  <1>
    92                              <1> ;-----	UC TABLE SCAN
    93 0000F79A 5455565758          <1> K12:	db	84,85,86,87,88		; SHIFTED STATE OF F1 - F10
    94 0000F79F 595A5B5C5D          <1> 	db	89,90,91,92,93
    95 0000F7A4 FFFF                <1> 	db	-1,-1			; NL, SL
    96                              <1> 
    97                              <1> ;-----	NUM STATE TABLE
    98 0000F7A6 3738392D3435362B31- <1> K14:	db 	'789-456+1230.'		; NUMLOCK STATE OF KEYPAD KEYS
    98 0000F7AF 3233302E            <1>
    99                              <1> 	;
   100 0000F7B3 FFFF7C8788          <1> 	db	-1,-1,124,135,136	; SysRq, Undef, WT, F11, F12
   101                              <1> 
   102                              <1> ; 26/08/2014
   103                              <1> ; Retro UNIX 8086 v1 - UNIX.ASM (03/03/2014)
   104                              <1> ; Derived from IBM "pc-at" 
   105                              <1> ; rombios source code (06/10/1985)
   106                              <1> ; 'dseg.inc'
   107                              <1> 
   108                              <1> ;---------------------------------------;
   109                              <1> ;	SYSTEM DATA AREA		;
   110                              <1> ;----------------------------------------
   111 0000F7B8 00                  <1> BIOS_BREAK	db	0		; BIT 7=1 IF BREAK KEY HAS BEEN PRESSED
   112                              <1> 
   113                              <1> ;----------------------------------------
   114                              <1> ;	KEYBOARD DATA AREAS		;
   115                              <1> ;----------------------------------------
   116                              <1> 
   117 0000F7B9 00                  <1> KB_FLAG		db	0		; KEYBOARD SHIFT STATE AND STATUS FLAGS
   118 0000F7BA 00                  <1> KB_FLAG_1	db	0		; SECOND BYTE OF KEYBOARD STATUS
   119 0000F7BB 00                  <1> KB_FLAG_2	db	0		; KEYBOARD LED FLAGS
   120 0000F7BC 00                  <1> KB_FLAG_3	db	0		; KEYBOARD MODE STATE AND TYPE FLAGS
   121 0000F7BD 00                  <1> ALT_INPUT	db	0		; STORAGE FOR ALTERNATE KEY PAD ENTRY
   122 0000F7BE [CEF70000]          <1> BUFFER_START	dd	KB_BUFFER 	; OFFSET OF KEYBOARD BUFFER START
   123 0000F7C2 [EEF70000]          <1> BUFFER_END	dd	KB_BUFFER + 32	; OFFSET OF END OF BUFFER
   124 0000F7C6 [CEF70000]          <1> BUFFER_HEAD	dd	KB_BUFFER 	; POINTER TO HEAD OF KEYBOARD BUFFER
   125 0000F7CA [CEF70000]          <1> BUFFER_TAIL	dd	KB_BUFFER 	; POINTER TO TAIL OF KEYBOARD BUFFER
   126                              <1> ; ------	HEAD = TAIL	INDICATES THAT THE BUFFER IS EMPTY
   127 0000F7CE 0000<rept>          <1> KB_BUFFER	times	16 dw 0		; ROOM FOR 16 SCAN CODE ENTRIES
   128                              <1> 
   129                              <1> ; /// End Of KEYBOARD DATA ///
  2230                                  %include 'vidata.s'	; VIDEO (BIOS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - vidata.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 31/07/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 16/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; vidata.inc (11/03/2015)
    15                              <1> ;
    16                              <1> ; Derived from 'IBM PC-AT' BIOS source code (1985) 
    17                              <1> ; ****************************************************************************
    18                              <1> 
    19                              <1> ; Retro UNIX 386 v1 Kernel - VIDATA.S
    20                              <1> ; Last Modification: 11/03/2015
    21                              <1> ;		    (Data section for 'VIDEO.INC')	
    22                              <1> ;
    23                              <1> ; ///////// VIDEO DATA ///////////////
    24                              <1> 
    25                              <1> ;----------------------------------------
    26                              <1> ;	VIDEO DISPLAY DATA AREA		;
    27                              <1> ;----------------------------------------
    28 0000F7EE 03                  <1> CRT_MODE:	db	3	; CURRENT DISPLAY MODE (TYPE)
    29 0000F7EF 29                  <1> CRT_MODE_SET:	db	29h	; CURRENT SETTING OF THE 3X8 REGISTER
    30                              <1> 				; (29h default setting for video mode 3)
    31                              <1> 				; Mode Select register Bits
    32                              <1> 				;   BIT 0 - 80x25 (1), 40x25 (0)
    33                              <1> 				;   BIT 1 - ALPHA (0), 320x200 GRAPHICS (1)
    34                              <1> 				;   BIT 2 - COLOR (0), BW (1)
    35                              <1> 				;   BIT 3 - Video Sig. ENABLE (1), DISABLE (0)
    36                              <1> 				;   BIT 4 - 640x200 B&W Graphics Mode (1)
    37                              <1> 				;   BIT 5 - ALPHA mode BLINKING (1)
    38                              <1> 				;   BIT 6, 7 - Not Used
    39                              <1> 
    40                              <1> ; Mode 0 - 2Ch = 101100b	; 40x25 text, 16 gray colors
    41                              <1> ; Mode 1 - 28h = 101000b	; 40x25 text, 16 fore colors, 8 back colors
    42                              <1> ; Mode 2 - 2Dh = 101101b	; 80x25 text, 16 gray colors	
    43                              <1> ; Mode 3 - 29h = 101001b	; 80x25 text, 16 fore color, 8 back color
    44                              <1> ; Mode 4 - 2Ah = 101010b	; 320x200 graphics, 4 colors
    45                              <1> ; Mode 5 - 2Eh = 101110b	; 320x200 graphics, 4 gray colors
    46                              <1> ; Mode 6 - 1Eh = 011110b	; 640x200 graphics, 2 colors
    47                              <1> ; Mode 7 - 29h = 101001b	; 80x25 text, black & white colors
    48                              <1> ; Mode & 37h = Video signal OFF
    49                              <1> 
    50                              <1> ; 24/06/2016
    51 0000F7F0 50                  <1> CRT_COLS:	db	80	; Number of columns
    52                              <1> 
    53                              <1> ; 01/07/2016
    54 0000F7F1 00                  <1> CRT_PALETTE:	db 	0	; Current palette setting
    55                              <1> 
    56                              <1> ; 03/07/2016
    57 0000F7F2 10                  <1> CHAR_HEIGHT:	db	16	; Default character height
    58 0000F7F3 60                  <1> VGA_VIDEO_CTL:	db	60h	; ROM BIOS DATA AREA Offset 87h
    59 0000F7F4 F9                  <1> VGA_SWITCHES:	db 	0F9h	; Feature Bit Switches (the basic screen)
    60 0000F7F5 51                  <1> VGA_MODESET_CTL: db	051h	; Basic mode set options (VGA video flags)
    61                              <1> 				; ROM BIOS DATA AREA Offset 89h
    62                              <1> 				; Bit 7, 4 : Mode
    63                              <1> 				;	  01 : 400-line mode
    64                              <1> 				; Bit 6	: Display switch enabled =  1			
    65                              <1> 				; Bit 5	: Reserved  = 0
    66                              <1> 				; Bit 3	: Default palette loading 
    67                              <1> 				;	  disabled = 0
    68                              <1> 				; Bit 2 : Color monitor = 0
    69                              <1> 				; Bit 1 = Gray scale summing 
    70                              <1> 				;	  disabled = 0
    71                              <1> 				; Bit 0 = VGA active = 1
    72 0000F7F6 19                  <1> VGA_ROWS:	db	25
    73                              <1> 
    74                              <1> ; 16/01/2016
    75                              <1> chr_attrib:  ; Character color/attributes for viode pages (0 to 7)
    76 0000F7F7 0707070707070707    <1> 	db	07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
    77                              <1> ; 30/01/2016
    78                              <1> vmode:
    79 0000F7FF 0303030303030303    <1> 	db	3,3,3,3,3,3,3,3 ; video modes for pseudo screens 
    80                              <1> 
    81                              <1> CURSOR_MODE: ; cursor start (ch) = 14, cursor end (cl) = 15
    82 0000F807 0F0E                <1> 	db	15, 14 ; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
    83                              <1> 
    84                              <1> ;align 4
    85                              <1> ;VGA_BASE: ; 26/07/2016
    86                              <1> ;	dd	 0B8000h  ; (Mode < 0Dh) or 0A0000h (mode >= 0Dh)
    87                              <1> 
    88 0000F809 90                  <1> align 2
    89                              <1> 
    90                              <1> vga_modes:
    91                              <1> 	; 25/07/2016
    92                              <1> 	; 09/07/2016
    93                              <1> 	; 03/07/2016
    94                              <1> 	; valid (implemented) video modes (>7, extension to IBM PC CGA modes)
    95 0000F80A 0302010007040506    <1> 	db 	03h, 02h, 01h, 00h, 07h, 04h, 05h, 06h
    96                              <1> vga_g_modes: ; 31/07/2016
    97 0000F812 13F0126A0D0E1011    <1> 	db	13h, 0F0h, 12h, 6Ah, 0Dh, 0Eh, 10h, 11h
    98                              <1> vga_mode_count equ $ - vga_modes
    99                              <1> vga_g_mode_count equ $ - vga_g_modes
   100                              <1> 
   101                              <1> vga_mode_tbl_ptr:
   102                              <1> 	; 25/07/2016
   103 0000F81A [7AF80000]          <1> 	dd	vga_mode_03h
   104 0000F81E [7AF80000]          <1> 	dd	vga_mode_03h ; mode 02h -> mode 03h 
   105 0000F822 [BAF80000]          <1> 	dd	vga_mode_01h
   106 0000F826 [BAF80000]          <1> 	dd	vga_mode_01h ; mode 00h -> mode 01h
   107                              <1> 	;dd	vga_mode_07h
   108 0000F82A [7AF80000]          <1> 	dd	vga_mode_03h ; mode 07h -> mode 03h
   109 0000F82E [FAF80000]          <1> 	dd	vga_mode_04h
   110 0000F832 [FAF80000]          <1> 	dd	vga_mode_04h ; mode 05h -> mode 04h	
   111 0000F836 [3AF90000]          <1> 	dd	vga_mode_06h
   112 0000F83A [7AF90000]          <1> 	dd	vga_mode_13h
   113 0000F83E [BAF90000]          <1> 	dd	vga_mode_F0h
   114 0000F842 [FAF90000]          <1> 	dd	vga_mode_12h
   115 0000F846 [3AFA0000]          <1> 	dd	vga_mode_6Ah
   116 0000F84A [7AFA0000]          <1> 	dd	vga_mode_0Dh
   117 0000F84E [BAFA0000]          <1> 	dd	vga_mode_0Eh
   118 0000F852 [FAFA0000]          <1> 	dd	vga_mode_10h
   119 0000F856 [3AFB0000]          <1> 	dd	vga_mode_11h	
   120                              <1> 
   121                              <1> vga_memmodel: 
   122                              <1> 	; 25/07/2016
   123                              <1> 	; 07/07/2016
   124                              <1> 	CTEXT	equ 0
   125                              <1> 	;MTEXT	equ 1
   126                              <1> 	MTEXT	equ 0 ; mode 07h -> mode 03h
   127                              <1> 	CGA	equ 2
   128                              <1> 	LINEAR8 equ 5
   129                              <1> 	PLANAR4	equ 4
   130                              <1> 	PLANAR1	equ 3
   131 0000F85A 0000000000020202    <1> 	db	CTEXT, CTEXT, CTEXT, CTEXT, MTEXT, CGA, CGA, CGA
   132                              <1> vga_g_memmodel: ; 31/07/2016
   133 0000F862 0504040404040403    <1> 	db	LINEAR8, PLANAR4, PLANAR4, PLANAR4, PLANAR4, PLANAR4, PLANAR4, PLANAR1
   134                              <1> ;vga_pixbits:
   135                              <1> ;	; 25/07/2016
   136                              <1> ;	; 08/07/2016
   137                              <1> ;	db 	4, 4, 4, 4, 4, 2, 2, 1, 8, 4, 4, 4, 4, 4, 4, 1
   138                              <1> vga_dac_s:
   139 0000F86A 020202020001010103- <1> 	db	2, 2, 2, 2, 0, 1, 1, 1, 3, 3, 2, 2, 1, 1, 2, 2
   139 0000F873 03020201010202      <1>
   140                              <1> 
   141                              <1> vga_params:
   142                              <1> 	; 25/07/2016 
   143                              <1> 	; 19/07/2016
   144                              <1> 	; 03/07/2016
   145                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
   146                              <1> 	; vgabios-0.7a (2011)
   147                              <1> 	; by the LGPL VGABios Developers Team (2001-2008)
   148                              <1> 	; 'vgatables.h'
   149                              <1> 	; Oracle VirtualBox 5.0.24 VGABios Source Code
   150                              <1> 	; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
   151                              <1> 	;
   152                              <1> vga_mode_03h:  ; mode 03h, 80*25 text, CGA colors
   153 0000F87A 5018100010          <1>  	db	80, 24, 16, 00h, 10h ; tw, th-1, ch, slength (5)
   154 0000F87F 00030002            <1>  	db	00h, 03h, 00h, 02h ; sequ regs (4)
   155 0000F883 67                  <1>  	db	67h	; misc reg (1)
   156 0000F884 5F4F50825581BF1F    <1>  	db	5Fh, 4Fh, 50h, 82h, 55h, 81h, 0BFh, 1Fh
   157 0000F88C 004F                <1>  	db	00h, 4Fh
   158                              <1> vga_p_cm_pos equ $ - vga_mode_03h
   159 0000F88E 0D0E00000000        <1> 	db	0Dh, 0Eh, 00h, 00h, 00h, 00h
   160 0000F894 9C8E8F281F96B9A3    <1>  	db	9Ch, 8Eh, 8Fh, 28h, 1Fh, 96h, 0B9h, 0A3h
   161 0000F89C FF                  <1> 	db	0FFh	; crtc_regs (25)
   162 0000F89D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   163 0000F8A5 38393A3B3C3D3E3F    <1>  	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   164 0000F8AD 0C000F08            <1>  	db	0Ch, 00h, 0Fh, 08h  ; actl regs (20)
   165 0000F8B1 0000000000100E0FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 10h, 0Eh, 0Fh, 0FFh ; grdc regs (9)
   166                              <1> vga_mode_01h:	; mode 01h, 40*25 text, CGA colors
   167 0000F8BA 2818100008          <1> 	db	40, 24, 16, 00h, 08h ; tw, th-1, ch, slength
   168 0000F8BF 08030002            <1> 	db	08h, 03h, 00h, 02h  ; sequ regs
   169 0000F8C3 67                  <1> 	db	67h	; misc reg
   170 0000F8C4 2D2728902BA0BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 0A0h, 0BFh, 1Fh
   171 0000F8CC 004F0D0E00000000    <1> 	db	00h, 4Fh, 0Dh, 0Eh, 00h, 00h, 00h, 00h
   172 0000F8D4 9C8E8F141F96B9A3    <1> 	db	9Ch, 8Eh, 8Fh, 14h, 1Fh, 96h, 0B9h, 0A3h
   173 0000F8DC FF                  <1> 	db	0FFh	; crtc_regs
   174 0000F8DD 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   175 0000F8E5 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   176 0000F8ED 0C000F08            <1> 	db	0Ch, 00h, 0Fh, 08h  ; actl regs
   177 0000F8F1 0000000000100E0FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 10h, 0Eh, 0Fh, 0FFh ; grdc regs
   178                              <1> ;vga_mode_07h:	; mode 07h, 80*25 text, mono color
   179                              <1> ;	db	80, 24, 16, 00h, 10h  ; tw, th-1, ch, slength
   180                              <1> ;	db	00h, 03h, 00h, 02h ; sequ regs
   181                              <1> ;	db	66h	; misc reg
   182                              <1> ;	db	5Fh, 4Fh, 50h, 82h, 55h, 81h, 0BFh, 1Fh
   183                              <1> ;	db	00h, 4Fh, 0Dh, 0Eh, 00h, 00h, 00h, 00h
   184                              <1> ;	db	9Ch, 8Eh, 8Fh, 28h, 0Fh, 96h, 0B9h, 0A3h
   185                              <1> ;	db	0FFh	; crtc regs
   186                              <1> ;	db	00h, 08h, 08h, 08h, 08h, 08h, 08h, 08h
   187                              <1> ;	db	10h, 18h, 18h, 18h, 18h, 18h, 18h, 18h
   188                              <1> ;	db	0Eh, 00h, 0Fh, 08h  ; actl regs
   189                              <1> ;	db	00h, 00h, 00h, 00h, 00h, 10h, 0Ah, 0Fh, 0FFh ; grdc regs
   190                              <1> vga_mode_04h:	; 320*200 graphics, 4 colors, CGA
   191 0000F8FA 2818080008          <1> 	db	40, 24, 8, 00h, 08h   ; tw, th-1, ch, slength
   192 0000F8FF 09030002            <1> 	db	09h, 03h, 00h, 02h ; sequ regs
   193 0000F903 63                  <1> 	db	63h	; misc reg
   194 0000F904 2D2728902B80BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 80h, 0BFh, 1Fh
   195 0000F90C 00C1000000000000    <1> 	db	00h, 0C1h, 00h, 00h, 00h, 00h, 00h, 00h
   196 0000F914 9C8E8F140096B9A2    <1> 	db	9Ch, 8Eh, 8Fh, 14h, 00h, 96h, 0B9h, 0A2h
   197 0000F91C FF                  <1> 	db	0FFh	; crtc_regs
   198 0000F91D 0013151702040607    <1> 	db	00h, 13h, 15h, 17h, 02h, 04h, 06h, 07h
   199 0000F925 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   200 0000F92D 01000300            <1> 	db	01h, 00h, 03h, 00h ; actl regs
   201 0000F931 0000000000300F0FFF  <1> 	db 	00h, 00h, 00h, 00h, 00h, 30h, 0Fh, 0Fh, 0FFh ; grdc regs
   202                              <1> vga_mode_06h:	; 640*200 graphics, 2 colors, CGA
   203 0000F93A 5018080010          <1> 	db	80, 24, 8, 00h, 10h   ;	tw, th-1, ch, slength
   204 0000F93F 01010006            <1> 	db	01h, 01h, 00h, 06h ; sequ regs
   205 0000F943 63                  <1> 	db	63h	; misc reg
   206 0000F944 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   207 0000F94C 00C1000000000000    <1> 	db	00h, 0C1h, 00h, 00h, 00h, 00h, 00h, 00h
   208 0000F954 9C8E8F280096B9C2    <1> 	db	9Ch, 8Eh, 8Fh, 28h, 00h, 96h, 0B9h, 0C2h
   209 0000F95C FF                  <1> 	db	0FFh	; crtc regs
   210 0000F95D 0017171717171717    <1> 	db	00h, 17h, 17h, 17h, 17h, 17h, 17h, 17h
   211 0000F965 1717171717171717    <1> 	db	17h, 17h, 17h, 17h, 17h, 17h, 17h, 17h
   212 0000F96D 01000100            <1> 	db	01h, 00h, 01, 00h  ; actl regs
   213 0000F971 0000000000000D0FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 0Dh, 0Fh, 0FFh ; grdc regs
   214                              <1> vga_mode_13h:  ; mode 13h, 300*200, 256 colors, linear
   215 0000F97A 2818080000          <1> 	db 	40, 24, 8, 0, 0	; tw, th-1, ch, slength (5)
   216 0000F97F 010F000E            <1> 	db	01h, 0Fh, 00h, 0Eh ; sequ regs (4)
   217 0000F983 63                  <1> 	db	63h	; misc reg (1)
   218 0000F984 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh 
   219 0000F98C 0041000000000000    <1>  	db 	00h, 41h, 00h, 00h, 00h, 00h, 00h, 00h
   220 0000F994 9C8E8F284096B9A3    <1> 	db	9Ch, 8Eh, 8Fh, 28h, 40h, 96h, 0B9h, 0A3h
   221 0000F99C FF                  <1> 	db	0FFh	; crtc regs (25)
   222 0000F99D 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   223 0000F9A5 08090A0B0C0D0E0F    <1>  	db	08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh
   224 0000F9AD 41000F00            <1>  	db	41h, 00h, 0Fh, 00h  ; actl regs (20)
   225 0000F9B1 000000000040050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 40h, 05h, 0Fh, 0FFh ; grdc regs (9)
   226                              <1> vga_mode_setl equ $ - vga_mode_13h  ; = 64
   227                              <1> vga_mode_F0h:  ; mode X ; 320*240, 256 colors, planar
   228 0000F9BA 2818080000          <1> 	db 	40, 24, 8, 0, 0	; tw, th-1, ch, slength
   229 0000F9BF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   230 0000F9C3 E3                  <1> 	db	0E3h	; misc reg
   231 0000F9C4 5F4F508254800D3E    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0Dh, 3Eh 
   232 0000F9CC 0041000000000000    <1>  	db 	00h, 41h, 00h, 00h, 00h, 00h, 00h, 00h
   233 0000F9D4 EAACDF2800E706E3    <1> 	db	0EAh, 0ACh, 0DFh, 28h, 00h, 0E7h, 06h, 0E3h
   234 0000F9DC FF                  <1> 	db	0FFh	; crtc regs (25)
   235 0000F9DD 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   236 0000F9E5 08090A0B0C0D0E0F    <1>  	db	08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh
   237 0000F9ED 41000F00            <1>  	db	41h, 00h, 0Fh, 00h  ; actl regs
   238 0000F9F1 000000000040050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 40h, 05h, 0Fh, 0FFh ; grdc regs
   239                              <1> vga_mode_12h:  ; mode 12h, 640*480, 16 colors, planar
   240 0000F9FA 501D100000          <1>  	db 	80, 29, 16, 0, 0 ; tw, th-1, ch, slength
   241 0000F9FF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   242 0000FA03 E3                  <1> 	db 	0E3h	; misc reg
   243 0000FA04 5F4F508254800B3E    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0Bh, 3Eh
   244 0000FA0C 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   245 0000FA14 EA8CDF2800E704E3    <1>  	db	0EAh, 8Ch, 0DFh, 28h, 00h, 0E7h, 04h, 0E3h
   246 0000FA1C FF                  <1> 	db	0FFh	; crtc regs
   247 0000FA1D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   248 0000FA25 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   249 0000FA2D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   250 0000FA31 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   251                              <1> vga_mode_6Ah:  ; mode 6Ah, 800*600, 16 colors, planar
   252 0000FA3A 6424100000          <1>  	db 	100, 36, 16, 0, 0 ; tw, th-1, ch, slength
   253 0000FA3F 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   254 0000FA43 E3                  <1> 	db 	0E3h	; misc reg
   255 0000FA44 7F6363836B1B72F0    <1> 	db	7Fh, 63h, 63h, 83h, 6Bh, 1Bh, 72h, 0F0h
   256 0000FA4C 0060000000000000    <1> 	db	00h, 60h, 00h, 00h, 00h, 00h, 00h, 00h
   257 0000FA54 598D5732005773E3    <1>  	db	59h, 8Dh, 57h, 32h, 00h, 57h, 73h, 0E3h
   258 0000FA5C FF                  <1> 	db	0FFh	; crtc regs
   259 0000FA5D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   260 0000FA65 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   261 0000FA6D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   262 0000FA71 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   263                              <1> vga_mode_0Dh:  ; mode 0Dh, 320*200, 16 colors, planar
   264 0000FA7A 2818080020          <1>  	db 	40, 24, 8, 0, 20h ; tw, th-1, ch, slength
   265 0000FA7F 090F0006            <1> 	db	09h, 0Fh, 00h, 06h ; sequ regs
   266 0000FA83 63                  <1> 	db 	63h	; misc reg
   267 0000FA84 2D2728902B80BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 80h, 0BFh, 1Fh
   268 0000FA8C 00C0000000000000    <1> 	db	00h, 0C0h, 00h, 00h, 00h, 00h, 00h, 00h
   269 0000FA94 9C8E8F140096B9E3    <1>  	db	9Ch, 8Eh, 8Fh, 14h, 00h, 96h, 0B9h, 0E3h
   270 0000FA9C FF                  <1> 	db	0FFh	; crtc regs
   271 0000FA9D 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   272 0000FAA5 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   273 0000FAAD 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   274 0000FAB1 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   275                              <1> vga_mode_0Eh:  ; mode 0Eh, 640*200, 16 colors, planar
   276 0000FABA 5018080040          <1>  	db 	80, 24, 8, 0, 40h ; tw, th-1, ch, slength
   277 0000FABF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   278 0000FAC3 63                  <1> 	db 	63h	; misc reg
   279 0000FAC4 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   280 0000FACC 00C0000000000000    <1> 	db	00h, 0C0h, 00h, 00h, 00h, 00h, 00h, 00h
   281 0000FAD4 9C8E8F280096B9E3    <1>  	db	9Ch, 8Eh, 8Fh, 28h, 00h, 96h, 0B9h, 0E3h
   282 0000FADC FF                  <1> 	db	0FFh	; crtc regs
   283 0000FADD 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   284 0000FAE5 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   285 0000FAED 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   286 0000FAF1 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   287                              <1> vga_mode_10h: ; mode 10h, 640*350, 16 colors, planar
   288 0000FAFA 50180E0080          <1>  	db 	80, 24, 14, 0, 80h ; tw, th-1, ch, slength
   289 0000FAFF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   290 0000FB03 A3                  <1> 	db 	0A3h	; misc reg
   291 0000FB04 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   292 0000FB0C 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   293 0000FB14 83855D280F63BAE3    <1>  	db	83h, 85h, 5Dh, 28h, 0Fh, 63h, 0BAh, 0E3h
   294 0000FB1C FF                  <1> 	db	0FFh	; crtc regs
   295 0000FB1D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   296 0000FB25 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   297 0000FB2D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   298 0000FB31 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   299                              <1> vga_mode_11h: ; mode 11h, 640*480, mono color, planar
   300 0000FB3A 501D100000          <1>  	db 	80, 29, 16, 0, 0   ; tw, th-1, ch, slength
   301 0000FB3F 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   302 0000FB43 E3                  <1> 	db 	0E3h	; misc reg
   303 0000FB44 5F4F508254800B3E    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0Bh, 3Eh
   304 0000FB4C 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   305 0000FB54 EA8CDF2800E704E3    <1>  	db	0EAh, 8Ch, 0DFh, 28h, 00h, 0E7h, 04h, 0E3h
   306 0000FB5C FF                  <1> 	db	0FFh	; crtc regs
   307 0000FB5D 003F003F003F003F    <1> 	db	00h, 3Fh, 00h, 3Fh, 00h, 3Fh, 00h, 3Fh
   308 0000FB65 003F003F003F003F    <1> 	db	00h, 3Fh, 00h, 3Fh, 00h, 3Fh, 00h, 3Fh
   309 0000FB6D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   310 0000FB71 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   311                              <1> end_of_vga_params:
   312                              <1> 
   313                              <1> ; /// End Of VIDEO DATA ///
  2231                                  %include 'diskdata.s'	; DISK (BIOS) DATA (initialized)
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - diskdata.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 24/01/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; diskdata.inc (11/03/2015)
    15                              <1> ;
    16                              <1> ; Derived from 'IBM PC-XT-286' BIOS source code (1986) 
    17                              <1> ; ****************************************************************************
    18                              <1> 
    19                              <1> ; Retro UNIX 386 v1 Kernel - DISKDATA.INC
    20                              <1> ; Last Modification: 11/03/2015
    21                              <1> ;	(Initialized Disk Parameters Data section for 'DISKIO.INC') 
    22                              <1> ;
    23                              <1> 
    24                              <1> ;----------------------------------------
    25                              <1> ;	80286 INTERRUPT LOCATIONS	:
    26                              <1> ;	REFERENCED BY POST & BIOS	:
    27                              <1> ;----------------------------------------
    28                              <1> 
    29 0000FB7A [DDFB0000]          <1> DISK_POINTER:	dd	MD_TBL6		; Pointer to Diskette Parameter Table
    30                              <1> 
    31                              <1> ; IBM PC-XT Model 286 source code ORGS.ASM (06/10/85) - 14/12/2014
    32                              <1> ;----------------------------------------------------------------
    33                              <1> ; DISK_BASE							:
    34                              <1> ;	THIS IS THE SET OF PARAMETERS REQUIRED FOR		:
    35                              <1> ;	DISKETTE OPERATION. THEY ARE POINTED AT BY THE		:
    36                              <1> ;	DATA VARIABLE @DISK_POINTER. TO MODIFY THE PARAMETERS,	:
    37                              <1> ;	BUILD ANOTHER PARAMETER BLOCK AND POINT AT IT		:
    38                              <1> ;----------------------------------------------------------------
    39                              <1> 
    40                              <1> ;DISK_BASE:	
    41                              <1> ;	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
    42                              <1> ;	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
    43                              <1> ;	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
    44                              <1> ;	DB	2		; 512 BYTES/SECTOR
    45                              <1> ;	;DB	15		; EOT (LAST SECTOR ON TRACK)
    46                              <1> ;	db	18		; (EOT for 1.44MB diskette)
    47                              <1> ;	DB	01BH		; GAP LENGTH
    48                              <1> ;	DB	0FFH		; DTL
    49                              <1> ;	;DB	054H		; GAP LENGTH FOR FORMAT
    50                              <1> ;	db	06ch		; (for 1.44MB dsikette)
    51                              <1> ;	DB	0F6H		; FILL BYTE FOR FORMAT
    52                              <1> ;	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
    53                              <1> ;	DB	8		; MOTOR START TIME (1/8 SECONDS)
    54                              <1> 
    55                              <1> ;----------------------------------------
    56                              <1> ;	ROM BIOS DATA AREAS		:
    57                              <1> ;----------------------------------------
    58                              <1> 
    59                              <1> ;DATA		SEGMENT AT 40H		; ADDRESS= 0040:0000
    60                              <1> 
    61                              <1> ;@EQUIP_FLAG	DW	?		; INSTALLED HARDWARE FLAGS
    62                              <1> 
    63                              <1> ;----------------------------------------
    64                              <1> ;	DISKETTE DATA AREAS		:
    65                              <1> ;----------------------------------------
    66                              <1> 
    67                              <1> ;@SEEK_STATUS	DB	?		; DRIVE RECALIBRATION STATUS
    68                              <1> ;					; BIT 3-0 = DRIVE 3-0 RECALIBRATION
    69                              <1> ;					; BEFORE NEXT SEEK IF BIT IS = 0
    70                              <1> ;@MOTOR_STATUS	DB	?		; MOTOR STATUS
    71                              <1> ;					; BIT 3-0 = DRIVE 3-0 CURRENTLY RUNNING
    72                              <1> ;					; BIT 7 = CURRENT OPERATION IS A WRITE
    73                              <1> ;@MOTOR_COUNT	DB	?		; TIME OUT COUNTER FOR MOTOR(S) TURN OFF
    74                              <1> ;@DSKETTE_STATUS DB	?		; RETURN CODE STATUS BYTE
    75                              <1> ;					; CMD_BLOCK  IN STACK FOR DISK OPERATION
    76                              <1> ;@NEC_STATUS	DB	7 DUP(?)	; STATUS BYTES FROM DISKETTE OPERATION
    77                              <1> 
    78                              <1> ;----------------------------------------
    79                              <1> ;	POST AND BIOS WORK DATA AREA	:
    80                              <1> ;----------------------------------------
    81                              <1> 
    82                              <1> ;@INTR_FLAG	DB	?		; FLAG INDICATING AN INTERRUPT HAPPENED
    83                              <1> 
    84                              <1> ;----------------------------------------
    85                              <1> ;	TIMER DATA AREA 		:
    86                              <1> ;----------------------------------------
    87                              <1> 
    88                              <1> ; 17/12/2014  (IRQ 0 - INT 08H)
    89                              <1> ;TIMER_LOW	equ	46Ch		; Timer ticks (counter)  @ 40h:006Ch
    90                              <1> ;TIMER_HIGH	equ	46Eh		; (18.2 timer ticks per second)
    91                              <1> ;TIMER_OFL	equ	470h		; Timer - 24 hours flag  @ 40h:0070h
    92                              <1> 
    93                              <1> ;----------------------------------------
    94                              <1> ;	ADDITIONAL MEDIA DATA		:
    95                              <1> ;----------------------------------------
    96                              <1> 
    97                              <1> ;@LASTRATE	DB	?		; LAST DISKETTE DATA RATE SELECTED
    98                              <1> ;@DSK_STATE	DB	?		; DRIVE 0 MEDIA STATE
    99                              <1> ;		DB	?		; DRIVE 1 MEDIA STATE
   100                              <1> ;		DB	?		; DRIVE 0 OPERATION START STATE
   101                              <1> ;		DB	?		; DRIVE 1 OPERATION START STATE
   102                              <1> ;@DSK_TRK	DB	?		; DRIVE 0 PRESENT CYLINDER
   103                              <1> ;		DB	?		; DRIVE 1 PRESENT CYLINDER
   104                              <1> 
   105                              <1> ;DATA		ENDS			; END OF BIOS DATA SEGMENT
   106                              <1> 
   107                              <1> ;--------------------------------------------------------
   108                              <1> ;	DRIVE TYPE TABLE				:
   109                              <1> ;--------------------------------------------------------
   110                              <1> 		; 16/02/2015 (unix386.s, 32 bit modifications)
   111                              <1> DR_TYPE:
   112 0000FB7E 01                  <1> 		DB	01		;DRIVE TYPE, MEDIA TABLE
   113                              <1>                 ;DW      MD_TBL1
   114 0000FB7F [9CFB0000]          <1> 		dd	MD_TBL1
   115 0000FB83 82                  <1> 		DB	02+BIT7ON
   116                              <1> 		;DW      MD_TBL2
   117 0000FB84 [A9FB0000]          <1>                 dd      MD_TBL2
   118 0000FB88 02                  <1> DR_DEFAULT:	DB	02
   119                              <1>                 ;DW      MD_TBL3
   120 0000FB89 [B6FB0000]          <1> 		dd      MD_TBL3
   121 0000FB8D 03                  <1> 		DB	03
   122                              <1>                 ;DW      MD_TBL4
   123 0000FB8E [C3FB0000]          <1> 		dd      MD_TBL4
   124 0000FB92 84                  <1> 		DB	04+BIT7ON
   125                              <1>                 ;DW      MD_TBL5
   126 0000FB93 [D0FB0000]          <1> 		dd      MD_TBL5
   127 0000FB97 04                  <1> 		DB	04
   128                              <1>                 ;DW      MD_TBL6
   129 0000FB98 [DDFB0000]          <1> 		dd      MD_TBL6
   130                              <1> DR_TYPE_E       equ $                   ; END OF TABLE
   131                              <1> ;DR_CNT		EQU	(DR_TYPE_E-DR_TYPE)/3
   132                              <1> DR_CNT		equ	(DR_TYPE_E-DR_TYPE)/5
   133                              <1> ;--------------------------------------------------------
   134                              <1> ;	MEDIA/DRIVE PARAMETER TABLES			:
   135                              <1> ;--------------------------------------------------------
   136                              <1> ;--------------------------------------------------------
   137                              <1> ;	360 KB MEDIA IN 360 KB DRIVE			:
   138                              <1> ;--------------------------------------------------------
   139                              <1> MD_TBL1:        
   140 0000FB9C DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   141 0000FB9D 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   142 0000FB9E 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   143 0000FB9F 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   144 0000FBA0 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   145 0000FBA1 2A                  <1> 	DB	02AH		; GAP LENGTH
   146 0000FBA2 FF                  <1> 	DB	0FFH		; DTL
   147 0000FBA3 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   148 0000FBA4 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   149 0000FBA5 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   150 0000FBA6 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   151 0000FBA7 27                  <1> 	DB	39		; MAX. TRACK NUMBER
   152 0000FBA8 80                  <1> 	DB	RATE_250	; DATA TRANSFER RATE
   153                              <1> ;--------------------------------------------------------
   154                              <1> ;	360 KB MEDIA IN 1.2 MB DRIVE			:
   155                              <1> ;--------------------------------------------------------
   156                              <1> MD_TBL2:        
   157 0000FBA9 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   158 0000FBAA 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   159 0000FBAB 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   160 0000FBAC 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   161 0000FBAD 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   162 0000FBAE 2A                  <1> 	DB	02AH		; GAP LENGTH
   163 0000FBAF FF                  <1> 	DB	0FFH		; DTL
   164 0000FBB0 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   165 0000FBB1 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   166 0000FBB2 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   167 0000FBB3 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   168 0000FBB4 27                  <1> 	DB	39		; MAX. TRACK NUMBER
   169 0000FBB5 40                  <1> 	DB	RATE_300	; DATA TRANSFER RATE
   170                              <1> ;--------------------------------------------------------
   171                              <1> ;	1.2 MB MEDIA IN 1.2 MB DRIVE			:
   172                              <1> ;--------------------------------------------------------
   173                              <1> MD_TBL3:
   174 0000FBB6 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   175 0000FBB7 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   176 0000FBB8 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   177 0000FBB9 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   178 0000FBBA 0F                  <1> 	DB	15		; EOT (LAST SECTOR ON TRACK)
   179 0000FBBB 1B                  <1> 	DB	01BH		; GAP LENGTH
   180 0000FBBC FF                  <1> 	DB	0FFH		; DTL
   181 0000FBBD 54                  <1> 	DB	054H		; GAP LENGTH FOR FORMAT
   182 0000FBBE F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   183 0000FBBF 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   184 0000FBC0 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   185 0000FBC1 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   186 0000FBC2 00                  <1> 	DB	RATE_500	; DATA TRANSFER RATE
   187                              <1> ;--------------------------------------------------------
   188                              <1> ;	720 KB MEDIA IN 720 KB DRIVE			:
   189                              <1> ;--------------------------------------------------------
   190                              <1> MD_TBL4:
   191 0000FBC3 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   192 0000FBC4 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   193 0000FBC5 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   194 0000FBC6 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   195 0000FBC7 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   196 0000FBC8 2A                  <1> 	DB	02AH		; GAP LENGTH
   197 0000FBC9 FF                  <1> 	DB	0FFH		; DTL
   198 0000FBCA 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   199 0000FBCB F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   200 0000FBCC 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   201 0000FBCD 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   202 0000FBCE 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   203 0000FBCF 80                  <1> 	DB	RATE_250	; DATA TRANSFER RATE
   204                              <1> ;--------------------------------------------------------
   205                              <1> ;	720 KB MEDIA IN 1.44 MB DRIVE			:
   206                              <1> ;--------------------------------------------------------
   207                              <1> MD_TBL5:
   208 0000FBD0 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   209 0000FBD1 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   210 0000FBD2 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   211 0000FBD3 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   212 0000FBD4 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   213 0000FBD5 2A                  <1> 	DB	02AH		; GAP LENGTH
   214 0000FBD6 FF                  <1> 	DB	0FFH		; DTL
   215 0000FBD7 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   216 0000FBD8 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   217 0000FBD9 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   218 0000FBDA 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   219 0000FBDB 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   220 0000FBDC 80                  <1> 	DB	RATE_250	; DATA TRANSFER RATE
   221                              <1> ;--------------------------------------------------------
   222                              <1> ;	1.44 MB MEDIA IN 1.44 MB DRIVE			:
   223                              <1> ;--------------------------------------------------------
   224                              <1> MD_TBL6:
   225 0000FBDD AF                  <1> 	DB	10101111B	; SRT=A, HD UNLOAD=0F - 1ST SPECIFY BYTE
   226 0000FBDE 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   227 0000FBDF 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   228 0000FBE0 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   229 0000FBE1 12                  <1> 	DB	18		; EOT (LAST SECTOR ON TRACK)
   230 0000FBE2 1B                  <1> 	DB	01BH		; GAP LENGTH
   231 0000FBE3 FF                  <1> 	DB	0FFH		; DTL
   232 0000FBE4 6C                  <1> 	DB	06CH		; GAP LENGTH FOR FORMAT
   233 0000FBE5 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   234 0000FBE6 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   235 0000FBE7 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   236 0000FBE8 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   237 0000FBE9 00                  <1> 	DB	RATE_500	; DATA TRANSFER RATE
   238                              <1> 
   239                              <1> 
   240                              <1> ; << diskette.inc >>
   241                              <1> ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   242                              <1> ;
   243                              <1> ;----------------------------------------
   244                              <1> ;	ROM BIOS DATA AREAS		:
   245                              <1> ;----------------------------------------
   246                              <1> 
   247                              <1> ;DATA		SEGMENT AT 40H		; ADDRESS= 0040:0000
   248                              <1> 
   249                              <1> ;----------------------------------------
   250                              <1> ;	FIXED DISK DATA AREAS		:
   251                              <1> ;----------------------------------------
   252                              <1> 
   253                              <1> ;DISK_STATUS1:	DB	0		; FIXED DISK STATUS
   254                              <1> ;HF_NUM:		DB	0		; COUNT OF FIXED DISK DRIVES
   255                              <1> ;CONTROL_BYTE:	DB	0		; HEAD CONTROL BYTE
   256                              <1> ;@PORT_OFF	DB	?		;  RESERVED (PORT OFFSET)
   257                              <1> 
   258                              <1> ;----------------------------------------
   259                              <1> ;	ADDITIONAL MEDIA DATA		:
   260                              <1> ;----------------------------------------
   261                              <1> 
   262                              <1> ;@LASTRATE	DB	?		; LAST DISKETTE DATA RATE SELECTED
   263                              <1> ;HF_STATUS	DB	0		; STATUS REGISTER
   264                              <1> ;HF_ERROR	DB	0		; ERROR REGISTER
   265                              <1> ;HF_INT_FLAG	DB	0		; FIXED DISK INTERRUPT FLAG
   266                              <1> ;HF_CNTRL	DB	0		; COMBO FIXED DISK/DISKETTE CARD BIT 0=1
   267                              <1> ;@DSK_STATE	DB	?		; DRIVE 0 MEDIA STATE
   268                              <1> ;		DB	?		; DRIVE 1 MEDIA STATE
   269                              <1> ;		DB	?		; DRIVE 0 OPERATION START STATE
   270                              <1> ;		DB	?		; DRIVE 1 OPERATION START STATE
   271                              <1> ;@DSK_TRK	DB	?		; DRIVE 0 PRESENT CYLINDER
   272                              <1> ;		DB	?		; DRIVE 1 PRESENT CYLINDER
   273                              <1> 
   274                              <1> ;DATA		ENDS			; END OF BIOS DATA SEGMENT
   275                              <1> ;
   276                              <1> ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   277                              <1> 
   278                              <1> ERR_TBL:
   279 0000FBEA E0                  <1> 	db	NO_ERR
   280 0000FBEB 024001BB            <1> 	db	BAD_ADDR_MARK,BAD_SEEK,BAD_CMD,UNDEF_ERR
   281 0000FBEF 04BB100A            <1> 	db	RECORD_NOT_FND,UNDEF_ERR,BAD_ECC,BAD_SECTOR
   282                              <1> 
   283                              <1> ; 17/12/2014 (mov ax, [cfd])
   284                              <1> ; 11/12/2014
   285 0000FBF3 00                  <1> cfd:		db 0			; current floppy drive (for GET_PARM)
   286                              <1> ; 17/12/2014				; instead of 'DISK_POINTER'
   287 0000FBF4 01                  <1> pfd:		db 1			; previous floppy drive (for GET_PARM)
   288                              <1> 					; (initial value of 'pfd 
   289                              <1> 					; must be different then 'cfd' value
   290                              <1> 					; to force updating/initializing
   291                              <1> 					; current drive parameters) 
   292 0000FBF5 90                  <1> align 2
   293                              <1> 
   294 0000FBF6 F001                <1> HF_PORT:	dw 	1F0h  ; Default = 1F0h
   295                              <1> 			      ; (170h)
   296 0000FBF8 F603                <1> HF_REG_PORT:	dw	3F6h  ; HF_PORT + 206h
   297                              <1> 
   298                              <1> ; 05/01/2015 
   299 0000FBFA 00                  <1> hf_m_s:         db      0     ; (0 = Master, 1 = Slave)
   300                              <1> 
   301                              <1> ; *****************************************************************************
  2232                                  ;;;
  2233                                  
  2234 0000FBFB 90                      Align 2
  2235                                  
  2236                                  ; 04/11/2014 (Retro UNIX 386 v1)
  2237 0000FBFC 0000                    mem_1m_1k:   dw 0  ; Number of contiguous KB between
  2238                                                       ; 1 and 16 MB, max. 3C00h = 15 MB.
  2239 0000FBFE 0000                    mem_16m_64k: dw 0  ; Number of contiguous 64 KB blocks
  2240                                  		   ; between 16 MB and 4 GB.
  2241                                  
  2242                                  ; 12/11/2014 (Retro UNIX 386 v1)
  2243 0000FC00 00                      boot_drv:    db 0 ; boot drive number (physical)
  2244                                  ; 24/11/2014
  2245 0000FC01 00                      drv:	     db 0 
  2246 0000FC02 00                      last_drv:    db 0 ; last hdd
  2247 0000FC03 00                      hdc:         db 0  ; number of hard disk drives
  2248                                  		     ; (present/detected)
  2249                                  
  2250                                  ; 24/11/2014 (Retro UNIX 386 v1)
  2251                                  ; Physical drive type & flags
  2252 0000FC04 00                      fd0_type:    db 0  ; floppy drive type
  2253 0000FC05 00                      fd1_type:    db 0  ; 4 = 1.44 Mb, 80 track, 3.5" (18 spt)
  2254                                  		     ; 6 = 2.88 Mb, 80 track, 3.5" (36 spt)
  2255                                  		     ; 3 = 720 Kb, 80 track, 3.5" (9 spt)
  2256                                  		     ; 2 = 1.2 Mb, 80 track, 5.25" (15 spt)
  2257                                  		     ; 1 = 360 Kb, 40 track, 5.25" (9 spt)		
  2258 0000FC06 00                      hd0_type:    db 0  ; EDD status for hd0 (bit 7 = present flag)
  2259 0000FC07 00                      hd1_type:    db 0  ; EDD status for hd1 (bit 7 = present flag)
  2260 0000FC08 00                      hd2_type:    db 0  ; EDD status for hd2 (bit 7 = present flag)
  2261 0000FC09 00                      hd3_type:    db 0  ; EDD status for hd3 (bit 7 = present flag)
  2262                                  		     ; bit 0 - Fixed disk access subset supported
  2263                                  		     ; bit 1 - Drive locking and ejecting
  2264                                  		     ; bit 2 - Enhanced disk drive support
  2265                                  		     ; bit 3 = Reserved (64 bit EDD support)
  2266                                  		     ; (If bit 0 is '1' Retro UNIX 386 v1
  2267                                  		     ; will interpret it as 'LBA ready'!)
  2268                                  
  2269                                  ; 11/03/2015 - 10/07/2015
  2270 0000FC0A 000000000000000000-     drv.cylinders: dw 0,0,0,0,0,0,0
  2270 0000FC13 0000000000         
  2271 0000FC18 000000000000000000-     drv.heads:     dw 0,0,0,0,0,0,0
  2271 0000FC21 0000000000         
  2272 0000FC26 000000000000000000-     drv.spt:       dw 0,0,0,0,0,0,0
  2272 0000FC2F 0000000000         
  2273 0000FC34 000000000000000000-     drv.size:      dd 0,0,0,0,0,0,0
  2273 0000FC3D 000000000000000000-
  2273 0000FC46 000000000000000000-
  2273 0000FC4F 00                 
  2274 0000FC50 00000000000000          drv.status:    db 0,0,0,0,0,0,0
  2275 0000FC57 00000000000000          drv.error:     db 0,0,0,0,0,0,0		
  2276                                  
  2277                                  ; 27/08/2014
  2278                                  scr_row:
  2279 0000FC5E E0810B00                	dd 0B8000h + 0A0h + 0A0h + 0A0h ; Row 3
  2280                                  scr_col:
  2281 0000FC62 00000000                	dd 0
  2282                                  
  2283 0000FC66 90<rept>                Align 4
  2284                                  	; 15/04/2016
  2285                                  	; TRDOS 386 (TRDOS v2.0)
  2286                                  
  2287                                  	; 21/08/2014
  2288                                  ilist:
  2289                                  	;times 	32 dd cpu_except ; INT 0 to INT 1Fh
  2290                                  	;
  2291                                  	; Exception list
  2292                                  	; 25/08/2014	
  2293 0000FC68 [CC080000]              	dd	exc0	; 0h,  Divide-by-zero Error
  2294 0000FC6C [D3080000]              	dd	exc1	
  2295 0000FC70 [DA080000]              	dd 	exc2	
  2296 0000FC74 [E1080000]              	dd	exc3	
  2297 0000FC78 [E5080000]              	dd	exc4	
  2298 0000FC7C [E9080000]              	dd	exc5	
  2299 0000FC80 [ED080000]              	dd 	exc6	; 06h,  Invalid Opcode
  2300 0000FC84 [F1080000]              	dd	exc7	
  2301 0000FC88 [F5080000]              	dd	exc8	
  2302 0000FC8C [F9080000]              	dd	exc9	
  2303 0000FC90 [FD080000]              	dd 	exc10	
  2304 0000FC94 [01090000]              	dd	exc11
  2305 0000FC98 [05090000]              	dd	exc12
  2306 0000FC9C [09090000]              	dd	exc13	; 0Dh, General Protection Fault
  2307 0000FCA0 [0D090000]              	dd 	exc14	; 0Eh, Page Fault
  2308 0000FCA4 [11090000]              	dd	exc15
  2309 0000FCA8 [15090000]              	dd	exc16
  2310 0000FCAC [19090000]              	dd	exc17
  2311 0000FCB0 [1D090000]              	dd 	exc18
  2312 0000FCB4 [21090000]              	dd	exc19
  2313 0000FCB8 [25090000]              	dd 	exc20
  2314 0000FCBC [29090000]              	dd	exc21
  2315 0000FCC0 [2D090000]              	dd	exc22
  2316 0000FCC4 [31090000]              	dd	exc23
  2317 0000FCC8 [35090000]              	dd 	exc24
  2318 0000FCCC [39090000]              	dd	exc25
  2319 0000FCD0 [3D090000]              	dd	exc26
  2320 0000FCD4 [41090000]              	dd	exc27
  2321 0000FCD8 [45090000]              	dd 	exc28
  2322 0000FCDC [49090000]              	dd	exc29
  2323 0000FCE0 [4D090000]              	dd 	exc30
  2324 0000FCE4 [51090000]              	dd	exc31
  2325                                  	; Interrupt list
  2326 0000FCE8 [49060000]              	dd	timer_int	; INT 20h
  2327                                  		;dd	irq0	
  2328 0000FCEC [850D0000]              	dd	kb_int		; 24/01/2016
  2329                                  		;dd	irq1
  2330 0000FCF0 [22080000]              	dd	irq2
  2331                                  		; COM2 int
  2332 0000FCF4 [26080000]              	dd	irq3
  2333                                  		; COM1 int
  2334 0000FCF8 [31080000]              	dd	irq4
  2335 0000FCFC [3C080000]              	dd	irq5
  2336                                  ;DISKETTE_INT: ;06/02/2015
  2337 0000FD00 [36410000]              	dd	fdc_int		; 16/02/2015, IRQ 6 handler	
  2338                                  		;dd	irq6
  2339                                  ; Default IRQ 7 handler against spurious IRQs (from master PIC)
  2340                                  ; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  2341 0000FD04 [7C0B0000]              	dd	default_irq7	; 25/02/2015
  2342                                  		;dd	irq7
  2343                                  ; Real Time Clock Interrupt
  2344 0000FD08 [AB070000]              	dd	rtc_int		; 23/02/2015, IRQ 8 handler
  2345                                  		;dd	irq8	; INT 28h
  2346 0000FD0C [4C080000]              	dd	irq9
  2347 0000FD10 [50080000]              	dd	irq10
  2348 0000FD14 [54080000]              	dd	irq11
  2349 0000FD18 [58080000]              	dd	irq12
  2350 0000FD1C [5C080000]              	dd	irq13
  2351                                  ;HDISK_INT1:  ;06/02/2015 	
  2352 0000FD20 [B24A0000]              	dd	hdc1_int 	; 21/02/2015, IRQ 14 handler		
  2353                                  		;dd	irq14
  2354                                  ;HDISK_INT2:  ;06/02/2015
  2355 0000FD24 [D94A0000]              	dd	hdc2_int 	; 21/02/2015, IRQ 15 handler		
  2356                                  		;dd	irq15	; INT 2Fh
  2357                                  		; 14/08/2015
  2358                                  	;dd	sysent		; INT 30h (system calls)
  2359                                  
  2360                                  	; 15/04/2016
  2361                                  	; TRDOS 386(TRDOS v2.0) Software Interrupts
  2362                                  
  2363 0000FD28 [85FD0000]              	dd	int30h		; Reserved for
  2364                                  				; !!! Retro UNIX (RUNIX) !!!
  2365                                  				; !!! SINGLIX !!! System Calls
  2366 0000FD2C [78140000]              	dd	int31h		; Video BIOS (IBM PC/AT, Int 10h)
  2367 0000FD30 [A40B0000]              	dd	int32h		; Keyboard Functions (IBM PC/AT, Int 16h)
  2368 0000FD34 [EC410000]              	dd	int33h		; DISK I/O (IBM PC/AT, Int 13h)
  2369 0000FD38 [0CE80000]              	dd	int34h		; #IOCTL# (I/O port access support for ring 3)
  2370 0000FD3C [B9560000]              	dd	int35h		; Time/Date Functions (IBM PC/AT, Int 1Ah)
  2371 0000FD40 [2C0A0000]              	dd	ignore_int	; INT 36h : Timer Functions	
  2372 0000FD44 [2C0A0000]              	dd	ignore_int	; INT 37h	
  2373 0000FD48 [2C0A0000]              	dd	ignore_int	; INT 38h
  2374 0000FD4C [2C0A0000]              	dd	ignore_int	; INT 39h
  2375 0000FD50 [2C0A0000]              	dd	ignore_int	; INT 3Ah	
  2376 0000FD54 [2C0A0000]              	dd	ignore_int	; INT 3Bh
  2377 0000FD58 [2C0A0000]              	dd	ignore_int	; INT 3Ch
  2378 0000FD5C [2C0A0000]              	dd	ignore_int	; INT 3Dh	
  2379 0000FD60 [2C0A0000]              	dd	ignore_int	; INT 3Eh
  2380 0000FD64 [2C0A0000]              	dd	ignore_int	; INT 3Fh
  2381 0000FD68 [70BA0000]              	dd	sysent		; INT 40h : !!! TRDOS 386 System Calls !!!
  2382                                  	;dd	ignore_int
  2383 0000FD6C 00000000                	dd	0
  2384                                  
  2385                                  ; 20/08/2014
  2386                                    ; /* This is the default interrupt "handler" :-) */ 
  2387                                    ; Linux v0.12 (head.s)
  2388                                  int_msg:
  2389 0000FD70 556E6B6E6F776E2069-     	db "Unknown interrupt ! ", 0
  2389 0000FD79 6E7465727275707420-
  2389 0000FD82 212000             
  2390                                  
  2391                                  ; 15/04/2016
  2392                                  ; TRDOS 386 (TRDOS v2.0)
  2393                                  
  2394                                  ; 29/04/2016
  2395                                  int30h:
  2396                                  trdos_isc_routine:
  2397                                  	; 02/05/2016
  2398                                  	; 01/05/2016
  2399                                  	; 29/04/2016
  2400                                  	; 18/04/2016
  2401                                  	; 15/04/2016 (TRDOS 386 = TRDOS v2.0)
  2402                                  	; 17/04/2011 (TRDOS v1.0, 'IFC.ASM')
  2403                                  	; 03/02/2011 ('trdos_ifc_routine')
  2404                                  	;
  2405 0000FD85 8B1C24                  	mov	ebx, [esp] ; EIP (next)
  2406 0000FD88 83EB02                  	sub	ebx, 2 ; EIP (CD ##h)
  2407                                  
  2408 0000FD8B 89C1                    	mov	ecx, eax
  2409 0000FD8D 8A4301                  	mov	al, [ebx+1] ; CDh ##h
  2410                                  
  2411 0000FD90 66BA1000                	mov	dx, KDATA
  2412 0000FD94 8EDA                    	mov	ds, dx
  2413 0000FD96 8EC2                    	mov	es, dx
  2414                                  
  2415 0000FD98 FC                      	cld
  2416 0000FD99 8B15[E0300100]          	mov	edx, [k_page_dir]
  2417 0000FD9F 0F22DA                  	mov	cr3, edx
  2418                                  
  2419 0000FDA2 E8A834FFFF              	call	bytetohex
  2420 0000FDA7 66A3[FBF30000]          	mov	[int_num_str], ax
  2421                                  
  2422 0000FDAD 89D8                    	mov	eax, ebx ; EIP
  2423 0000FDAF E8DB34FFFF              	call	dwordtohex
  2424 0000FDB4 8915[17F40000]          	mov	[eip_str], edx
  2425 0000FDBA A3[1BF40000]            	mov	[eip_str+4], eax
  2426                                  
  2427 0000FDBF 89C8                    	mov	eax, ecx
  2428 0000FDC1 E8C934FFFF              	call	dwordtohex
  2429 0000FDC6 8915[06F40000]          	mov	[eax_str], edx
  2430 0000FDCC A3[0AF40000]            	mov	[eax_str+4], eax 	
  2431                                  
  2432 0000FDD1 43                      	inc	ebx
  2433 0000FDD2 8A03                    	mov	al, [ebx] ; Interrupt number
  2434                                  
  2435                                  trdos_isc_handler:
  2436 0000FDD4 80FE30                  	cmp	dh, 30h ; Retro UNIX, SINGLIX System calls
  2437 0000FDD7 7507                    	jne	short trdos_usi_handler
  2438 0000FDD9 BE[98F30000]            	mov	esi, isc_msg
  2439 0000FDDE EB05                    	jmp	short loc_write_inv_system_call_msg
  2440                                  
  2441                                  trdos_usi_handler:
  2442 0000FDE0 BE[AEF30000]            	mov	esi, usi_msg
  2443                                  
  2444                                  loc_write_inv_system_call_msg:
  2445 0000FDE5 E8825CFFFF              	call	print_msg
  2446                                  	; 29/04/2016
  2447 0000FDEA BE[E4F30000]            	mov	esi, inv_msg_for_trdos_v2
  2448 0000FDEF E8785CFFFF              	call	print_msg
  2449                                  
  2450                                  loc_ifc_terminate_process:
  2451                                  	; u.uno = process number
  2452                                  	; 29/04/2016
  2453                                  
  2454                                  	; 02/05/2016
  2455 0000FDF4 FE05[13470100]          	inc	byte [sysflg] ; 0FFh -> 0
  2456                                  
  2457 0000FDFA B801000000              	mov	eax, 1
  2458 0000FDFF E99DBEFFFF              	jmp	sysexit
  2459                                  
  2460                                  ; 07/03/2015
  2461                                  ; Temporary Code
  2462                                  display_disks:
  2463 0000FE04 803D[04FC0000]00        	cmp 	byte [fd0_type], 0
  2464 0000FE0B 7605                    	jna 	short ddsks1
  2465 0000FE0D E87D000000              	call	pdskm
  2466                                  ddsks1:
  2467 0000FE12 803D[05FC0000]00        	cmp	byte [fd1_type], 0
  2468 0000FE19 760C                    	jna	short ddsks2
  2469 0000FE1B C605[B2FF0000]31        	mov	byte [dskx], '1'
  2470 0000FE22 E868000000              	call	pdskm
  2471                                  ddsks2:
  2472 0000FE27 803D[06FC0000]00        	cmp	byte [hd0_type], 0
  2473 0000FE2E 7654                    	jna	short ddsk6
  2474 0000FE30 66C705[B0FF0000]68-     	mov	word [dsktype], 'hd'
  2474 0000FE38 64                 
  2475 0000FE39 C605[B2FF0000]30        	mov	byte [dskx], '0'
  2476 0000FE40 E84A000000              	call	pdskm
  2477                                  ddsks3:
  2478 0000FE45 803D[07FC0000]00        	cmp	byte [hd1_type], 0
  2479 0000FE4C 7636                    	jna	short ddsk6
  2480 0000FE4E C605[B2FF0000]31        	mov	byte [dskx], '1'
  2481 0000FE55 E835000000              	call	pdskm
  2482                                  ddsks4:
  2483 0000FE5A 803D[08FC0000]00        	cmp	byte [hd2_type], 0
  2484 0000FE61 7621                    	jna	short ddsk6
  2485 0000FE63 C605[B2FF0000]32        	mov	byte [dskx], '2'
  2486 0000FE6A E820000000              	call	pdskm
  2487                                  ddsks5:
  2488 0000FE6F 803D[09FC0000]00        	cmp	byte [hd3_type], 0
  2489 0000FE76 760C                    	jna	short ddsk6
  2490 0000FE78 C605[B2FF0000]33        	mov	byte [dskx], '3'
  2491 0000FE7F E80B000000              	call	pdskm
  2492                                  ddsk6:
  2493 0000FE84 BE[C3FF0000]            	mov	esi, nextline
  2494 0000FE89 E806000000              	call	pdskml
  2495                                  pdskm_ok:
  2496 0000FE8E C3                      	retn
  2497                                  pdskm:
  2498 0000FE8F BE[AEFF0000]            	mov	esi, dsk_ready_msg
  2499                                  pdskml:	
  2500 0000FE94 AC                      	lodsb
  2501 0000FE95 08C0                    	or	al, al
  2502 0000FE97 74F5                    	jz	short pdskm_ok
  2503 0000FE99 56                      	push	esi
  2504                                  	; 13/05/2016
  2505 0000FE9A BB07000000                      mov     ebx, 7  ; Black background, 
  2506                                  			; light gray forecolor
  2507                                  			; Video page 0 (bh=0)
  2508 0000FE9F E8941DFFFF              	call	_write_tty
  2509 0000FEA4 5E                      	pop	esi
  2510 0000FEA5 EBED                    	jmp	short pdskml
  2511                                  
  2512 0000FEA7 90                      Align 2
  2513                                  	; 21/08/2014
  2514                                  exc_msg:
  2515 0000FEA8 435055206578636570-     	db "CPU exception ! "
  2515 0000FEB1 74696F6E202120     
  2516                                  excnstr: 		; 25/08/2014
  2517 0000FEB8 3F3F68202045495020-     	db "??h", "  EIP : "
  2517 0000FEC1 3A20               
  2518                                  EIPstr: ; 29/08/2014
  2519 0000FEC3 00<rept>                	times 12 db 0
  2520                                  
  2521                                  	; 23/02/2015
  2522                                  	; 25/08/2014
  2523                                  ;scounter:
  2524                                  ;	db 5
  2525                                  ;	db 19
  2526                                  
  2527                                  ; 05/11/2014
  2528                                  msg_out_of_memory:
  2529 0000FECF 070D0A                  	db 	07h, 0Dh, 0Ah
  2530 0000FED2 496E73756666696369-             db      'Insufficient memory !'
  2530 0000FEDB 656E74206D656D6F72-
  2530 0000FEE4 792021             
  2531 0000FEE7 0D0A                    	db	0Dh, 0Ah
  2532                                  _int13h_48h_buffer: ; 07/07/2016
  2533 0000FEE9 284D696E696D756D20-     	db	'(Minimum 2MB memory is needed.)'
  2533 0000FEF2 324D42206D656D6F72-
  2533 0000FEFB 79206973206E656564-
  2533 0000FF04 65642E29           
  2534 0000FF08 0D0A00                   	db	0Dh, 0Ah, 0
  2535                                  	;
  2536                                  setup_error_msg:
  2537 0000FF0B 0D0A                    	db 0Dh, 0Ah
  2538 0000FF0D 4469736B2053657475-     	db 'Disk Setup Error !' 
  2538 0000FF16 70204572726F722021 
  2539 0000FF1F 0D0A00                  	db 0Dh, 0Ah,0
  2540                                  
  2541                                  ; 06/11/2014
  2542                                  ; Memory Information message
  2543                                  ; 14/08/2015
  2544                                  msg_memory_info:
  2545 0000FF22 07                      	db	07h
  2546 0000FF23 0D0A                    	db	0Dh, 0Ah
  2547                                  	;db 	"MEMORY ALLOCATION INFO", 0Dh, 0Ah, 0Dh, 0Ah
  2548 0000FF25 546F74616C206D656D-     	db	"Total memory : "
  2548 0000FF2E 6F7279203A20       
  2549                                  mem_total_b_str: ; 10 digits
  2550 0000FF34 303030303030303030-     	db	"0000000000 bytes", 0Dh, 0Ah
  2550 0000FF3D 302062797465730D0A 
  2551 0000FF46 202020202020202020-     	db	"               ", 20h, 20h, 20h
  2551 0000FF4F 202020202020202020 
  2552                                  mem_total_p_str: ; 7 digits
  2553 0000FF58 303030303030302070-     	db	"0000000 pages", 0Dh, 0Ah
  2553 0000FF61 616765730D0A       
  2554 0000FF67 0D0A                    	db 	0Dh, 0Ah
  2555 0000FF69 46726565206D656D6F-     	db	"Free memory  : "
  2555 0000FF72 727920203A20       
  2556                                  free_mem_b_str:  ; 10 digits
  2557 0000FF78 3F3F3F3F3F3F3F3F3F-     	db	"?????????? bytes", 0Dh, 0Ah
  2557 0000FF81 3F2062797465730D0A 
  2558 0000FF8A 202020202020202020-     	db	"               ", 20h, 20h, 20h
  2558 0000FF93 202020202020202020 
  2559                                  free_mem_p_str:  ; 7 digits
  2560 0000FF9C 3F3F3F3F3F3F3F2070-     	db	"??????? pages", 0Dh, 0Ah
  2560 0000FFA5 616765730D0A       
  2561 0000FFAB 0D0A00                  	db	0Dh, 0Ah, 0
  2562                                  
  2563                                  dsk_ready_msg:
  2564 0000FFAE 0D0A                    	db 	0Dh, 0Ah
  2565                                  dsktype:
  2566 0000FFB0 6664                    	db	'fd'
  2567                                  dskx:
  2568 0000FFB2 30                      	db	'0'
  2569 0000FFB3 20                      	db	20h
  2570 0000FFB4 697320524541445920-     	db 	'is READY ...'
  2570 0000FFBD 2E2E2E             
  2571 0000FFC0 00                      	db 	0
  2572                                  
  2573                                  next2line: ; 08/02/2016
  2574 0000FFC1 0D0A                    	db	0Dh, 0Ah
  2575                                  nextline:
  2576 0000FFC3 0D0A00                  	db 	0Dh, 0Ah, 0
  2577                                  
  2578                                  ; KERNEL - SYSINIT Messages
  2579                                  ; 24/08/2015
  2580                                  ; 13/04/2015 - (Retro UNIX 386 v1 Beginning)
  2581                                  ; 14/07/2013
  2582                                  ;kernel_init_err_msg:
  2583                                  ;	db 0Dh, 0Ah
  2584                                  ;	db 07h
  2585                                  ;	db 'Kernel initialization ERROR !'
  2586                                  ;	db 0Dh, 0Ah, 0 
  2587                                  
  2588                                  ;welcome_msg: 
  2589                                  ;	db 0Dh, 0Ah
  2590                                  ;	db 07h
  2591                                  ;	db 'Welcome to TRDOS 386 Operating System !'
  2592                                  ;	db 0Dh, 0Ah
  2593                                  ;	db 'by Erdogan Tan - 16/01/2017 (v2.0.0)'
  2594                                  ;	db 0Dh, 0Ah, 0
  2595                                  
  2596                                  panic_msg:
  2597 0000FFC6 0D0A07                  	db 0Dh, 0Ah, 07h
  2598 0000FFC9 4552524F523A204B65-     	db 'ERROR: Kernel Panic !'
  2598 0000FFD2 726E656C2050616E69-
  2598 0000FFDB 632021             
  2599 0000FFDE 0D0A00                  	db 0Dh, 0Ah, 0
  2600                                  
  2601                                  ;msgl_drv_not_ready: 
  2602                                  ;	db 07h, 0Dh, 0Ah
  2603                                  ;       db 'Drive not ready or read error !'
  2604                                  ;       db 0Dh, 0Ah, 0
  2605                                  
  2606                                  starting_msg:
  2607 0000FFE1 5475726B6973682052-     	db "Turkish Rational DOS v2.0 [16/01/2017] ...", 0
  2607 0000FFEA 6174696F6E616C2044-
  2607 0000FFF3 4F532076322E30205B-
  2607 0000FFFC 31362F30312F323031-
  2607 00010005 375D202E2E2E00     
  2608                                  NextLine:
  2609 0001000C 0D0A00                  	db 0Dh, 0Ah, 0
  2610                                  
  2611 0001000F 90                      align 4
  2612                                  
  2613                                  %include 'vgadata.s' ; 04/07/2016
     1                              <1> ; ****************************************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - vgadata.s  (palette and fond data)
     3                              <1> ; -----------------------------------------------------------------------------
     4                              <1> ; Last Update: 04/07/2016
     5                              <1> ; -----------------------------------------------------------------------------
     6                              <1> ; Beginning: 16/01/2016
     7                              <1> ; -----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; -----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Plex86/Bochs VGABios' source code, vgabios-0.7a (2011)
    14                              <1> ; by the LGPL VGABios Developers Team (2001-2008), 'vgatables.h'
    15                              <1> ;
    16                              <1> ; Oracle VirtualBox 5.0.24 VGABios Source Code 
    17                              <1> ; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
    18                              <1> ;
    19                              <1> ; Palette and font data in assembly language format:
    20                              <1> ; 'VBoxVgaBiosAlternative.asm'
    21                              <1> 
    22                              <1> ; ****************************************************************************************************
    23                              <1> 
    24                              <1> ; 04/07/2016
    25                              <1> ; COLOR DATA
    26                              <1> 
    27                              <1> palette0:
    28 00010010 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    28 00010019 00000000000000      <1>
    29 00010020 00000000000000002A- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    29 00010029 2A2A2A2A2A2A2A      <1>
    30 00010030 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    30 00010039 2A2A2A2A2A2A2A      <1>
    31 00010040 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    31 00010049 2A2A2A2A2A2A2A      <1>
    32 00010050 2A2A2A2A2A2A2A2A3F- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    32 00010059 3F3F3F3F3F3F3F      <1>
    33 00010060 3F3F3F3F3F3F3F3F3F- <1>     db  03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    33 00010069 3F3F3F3F3F3F3F      <1>
    34 00010070 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    34 00010079 00000000000000      <1>
    35 00010080 00000000000000002A- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    35 00010089 2A2A2A2A2A2A2A      <1>
    36 00010090 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    36 00010099 2A2A2A2A2A2A2A      <1>
    37 000100A0 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    37 000100A9 2A2A2A2A2A2A2A      <1>
    38 000100B0 2A2A2A2A2A2A2A2A3F- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    38 000100B9 3F3F3F3F3F3F3F      <1>
    39 000100C0 3F3F3F3F3F3F3F3F3F- <1>     db  03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    39 000100C9 3F3F3F3F3F3F3F      <1>
    40                              <1> palette1:
    41 000100D0 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    41 000100D9 002A2A2A00002A      <1>
    42 000100E0 002A2A15002A2A2A00- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah
    42 000100E9 000000002A002A      <1>
    43 000100F0 00002A2A2A00002A00- <1>     db  000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah, 000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah
    43 000100F9 2A2A15002A2A2A      <1>
    44 00010100 15151515153F153F15- <1>     db  015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh, 015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh
    44 00010109 153F3F3F15153F      <1>
    45 00010110 153F3F3F153F3F3F15- <1>     db  015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    45 00010119 151515153F153F      <1>
    46 00010120 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    46 00010129 3F3F3F153F3F3F      <1>
    47 00010130 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    47 00010139 002A2A2A00002A      <1>
    48 00010140 002A2A15002A2A2A00- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah
    48 00010149 000000002A002A      <1>
    49 00010150 00002A2A2A00002A00- <1>     db  000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah, 000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah
    49 00010159 2A2A15002A2A2A      <1>
    50 00010160 15151515153F153F15- <1>     db  015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh, 015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh
    50 00010169 153F3F3F15153F      <1>
    51 00010170 153F3F3F153F3F3F15- <1>     db  015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    51 00010179 151515153F153F      <1>
    52 00010180 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    52 00010189 3F3F3F153F3F3F      <1>
    53                              <1> palette2:
    54 00010190 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    54 00010199 002A2A2A00002A      <1>
    55 000101A0 002A2A2A002A2A2A00- <1>     db  000h, 02ah, 02ah, 02ah, 000h, 02ah, 02ah, 02ah, 000h, 000h, 015h, 000h, 000h, 03fh, 000h, 02ah
    55 000101A9 001500003F002A      <1>
    56 000101B0 15002A3F2A00152A00- <1>     db  015h, 000h, 02ah, 03fh, 02ah, 000h, 015h, 02ah, 000h, 03fh, 02ah, 02ah, 015h, 02ah, 02ah, 03fh
    56 000101B9 3F2A2A152A2A3F      <1>
    57 000101C0 00150000152A003F00- <1>     db  000h, 015h, 000h, 000h, 015h, 02ah, 000h, 03fh, 000h, 000h, 03fh, 02ah, 02ah, 015h, 000h, 02ah
    57 000101C9 003F2A2A15002A      <1>
    58 000101D0 152A2A3F002A3F2A00- <1>     db  015h, 02ah, 02ah, 03fh, 000h, 02ah, 03fh, 02ah, 000h, 015h, 015h, 000h, 015h, 03fh, 000h, 03fh
    58 000101D9 151500153F003F      <1>
    59 000101E0 15003F3F2A15152A15- <1>     db  015h, 000h, 03fh, 03fh, 02ah, 015h, 015h, 02ah, 015h, 03fh, 02ah, 03fh, 015h, 02ah, 03fh, 03fh
    59 000101E9 3F2A3F152A3F3F      <1>
    60 000101F0 15000015002A152A00- <1>     db  015h, 000h, 000h, 015h, 000h, 02ah, 015h, 02ah, 000h, 015h, 02ah, 02ah, 03fh, 000h, 000h, 03fh
    60 000101F9 152A2A3F00003F      <1>
    61 00010200 002A3F2A003F2A2A15- <1>     db  000h, 02ah, 03fh, 02ah, 000h, 03fh, 02ah, 02ah, 015h, 000h, 015h, 015h, 000h, 03fh, 015h, 02ah
    61 00010209 001515003F152A      <1>
    62 00010210 15152A3F3F00153F00- <1>     db  015h, 015h, 02ah, 03fh, 03fh, 000h, 015h, 03fh, 000h, 03fh, 03fh, 02ah, 015h, 03fh, 02ah, 03fh
    62 00010219 3F3F2A153F2A3F      <1>
    63 00010220 15150015152A153F00- <1>     db  015h, 015h, 000h, 015h, 015h, 02ah, 015h, 03fh, 000h, 015h, 03fh, 02ah, 03fh, 015h, 000h, 03fh
    63 00010229 153F2A3F15003F      <1>
    64 00010230 152A3F3F003F3F2A15- <1>     db  015h, 02ah, 03fh, 03fh, 000h, 03fh, 03fh, 02ah, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    64 00010239 151515153F153F      <1>
    65 00010240 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    65 00010249 3F3F3F153F3F3F      <1>
    66                              <1> palette3:
    67 00010250 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    67 00010259 002A2A2A00002A      <1>
    68 00010260 002A2A15002A2A2A15- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    68 00010269 151515153F153F      <1>
    69 00010270 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    69 00010279 3F3F3F153F3F3F      <1>
    70 00010280 000000050505080808- <1>     db  000h, 000h, 000h, 005h, 005h, 005h, 008h, 008h, 008h, 00bh, 00bh, 00bh, 00eh, 00eh, 00eh, 011h
    70 00010289 0B0B0B0E0E0E11      <1>
    71 00010290 11111414141818181C- <1>     db  011h, 011h, 014h, 014h, 014h, 018h, 018h, 018h, 01ch, 01ch, 01ch, 020h, 020h, 020h, 024h, 024h
    71 00010299 1C1C2020202424      <1>
    72 000102A0 242828282D2D2D3232- <1>     db  024h, 028h, 028h, 028h, 02dh, 02dh, 02dh, 032h, 032h, 032h, 038h, 038h, 038h, 03fh, 03fh, 03fh
    72 000102A9 323838383F3F3F      <1>
    73 000102B0 00003F10003F1F003F- <1>     db  000h, 000h, 03fh, 010h, 000h, 03fh, 01fh, 000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h, 03fh, 03fh
    73 000102B9 2F003F3F003F3F      <1>
    74 000102C0 002F3F001F3F00103F- <1>     db  000h, 02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 000h, 000h, 03fh, 010h, 000h, 03fh, 01fh
    74 000102C9 00003F10003F1F      <1>
    75 000102D0 003F2F003F3F002F3F- <1>     db  000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h, 02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 000h
    75 000102D9 001F3F00103F00      <1>
    76 000102E0 003F00003F10003F1F- <1>     db  000h, 03fh, 000h, 000h, 03fh, 010h, 000h, 03fh, 01fh, 000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h
    76 000102E9 003F2F003F3F00      <1>
    77 000102F0 2F3F001F3F00103F1F- <1>     db  02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh, 02fh, 01fh
    77 000102F9 1F3F271F3F2F1F      <1>
    78 00010300 3F371F3F3F1F3F3F1F- <1>     db  03fh, 037h, 01fh, 03fh, 03fh, 01fh, 03fh, 03fh, 01fh, 037h, 03fh, 01fh, 02fh, 03fh, 01fh, 027h
    78 00010309 373F1F2F3F1F27      <1>
    79 00010310 3F1F1F3F271F3F2F1F- <1>     db  03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh, 02fh, 01fh, 03fh, 037h, 01fh, 03fh, 03fh, 01fh, 037h
    79 00010319 3F371F3F3F1F37      <1>
    80 00010320 3F1F2F3F1F273F1F1F- <1>     db  03fh, 01fh, 02fh, 03fh, 01fh, 027h, 03fh, 01fh, 01fh, 03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh
    80 00010329 3F1F1F3F271F3F      <1>
    81 00010330 2F1F3F371F3F3F1F37- <1>     db  02fh, 01fh, 03fh, 037h, 01fh, 03fh, 03fh, 01fh, 037h, 03fh, 01fh, 02fh, 03fh, 01fh, 027h, 03fh
    81 00010339 3F1F2F3F1F273F      <1>
    82 00010340 2D2D3F312D3F362D3F- <1>     db  02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h, 02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh, 03fh, 03fh
    82 00010349 3A2D3F3F2D3F3F      <1>
    83 00010350 2D3A3F2D363F2D313F- <1>     db  02dh, 03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h
    83 00010359 2D2D3F312D3F36      <1>
    84 00010360 2D3F3A2D3F3F2D3A3F- <1>     db  02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh, 03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 02dh
    84 00010369 2D363F2D313F2D      <1>
    85 00010370 2D3F2D2D3F312D3F36- <1>     db  02dh, 03fh, 02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h, 02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh
    85 00010379 2D3F3A2D3F3F2D      <1>
    86 00010380 3A3F2D363F2D313F00- <1>     db  03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 000h, 000h, 01ch, 007h, 000h, 01ch, 00eh, 000h
    86 00010389 001C07001C0E00      <1>
    87 00010390 1C15001C1C001C1C00- <1>     db  01ch, 015h, 000h, 01ch, 01ch, 000h, 01ch, 01ch, 000h, 015h, 01ch, 000h, 00eh, 01ch, 000h, 007h
    87 00010399 151C000E1C0007      <1>
    88 000103A0 1C00001C07001C0E00- <1>     db  01ch, 000h, 000h, 01ch, 007h, 000h, 01ch, 00eh, 000h, 01ch, 015h, 000h, 01ch, 01ch, 000h, 015h
    88 000103A9 1C15001C1C0015      <1>
    89 000103B0 1C000E1C00071C0000- <1>     db  01ch, 000h, 00eh, 01ch, 000h, 007h, 01ch, 000h, 000h, 01ch, 000h, 000h, 01ch, 007h, 000h, 01ch
    89 000103B9 1C00001C07001C      <1>
    90 000103C0 0E001C15001C1C0015- <1>     db  00eh, 000h, 01ch, 015h, 000h, 01ch, 01ch, 000h, 015h, 01ch, 000h, 00eh, 01ch, 000h, 007h, 01ch
    90 000103C9 1C000E1C00071C      <1>
    91 000103D0 0E0E1C110E1C150E1C- <1>     db  00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h, 00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh, 01ch, 01ch
    91 000103D9 180E1C1C0E1C1C      <1>
    92 000103E0 0E181C0E151C0E111C- <1>     db  00eh, 018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h
    92 000103E9 0E0E1C110E1C15      <1>
    93 000103F0 0E1C180E1C1C0E181C- <1>     db  00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh, 018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 00eh
    93 000103F9 0E151C0E111C0E      <1>
    94 00010400 0E1C0E0E1C110E1C15- <1>     db  00eh, 01ch, 00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h, 00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh
    94 00010409 0E1C180E1C1C0E      <1>
    95 00010410 181C0E151C0E111C14- <1>     db  018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 014h, 014h, 01ch, 016h, 014h, 01ch, 018h, 014h
    95 00010419 141C16141C1814      <1>
    96 00010420 1C1A141C1C141C1C14- <1>     db  01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ch, 01ch, 014h, 01ah, 01ch, 014h, 018h, 01ch, 014h, 016h
    96 00010429 1A1C14181C1416      <1>
    97 00010430 1C14141C16141C1814- <1>     db  01ch, 014h, 014h, 01ch, 016h, 014h, 01ch, 018h, 014h, 01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ah
    97 00010439 1C1A141C1C141A      <1>
    98 00010440 1C14181C14161C1414- <1>     db  01ch, 014h, 018h, 01ch, 014h, 016h, 01ch, 014h, 014h, 01ch, 014h, 014h, 01ch, 016h, 014h, 01ch
    98 00010449 1C14141C16141C      <1>
    99 00010450 18141C1A141C1C141A- <1>     db  018h, 014h, 01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ah, 01ch, 014h, 018h, 01ch, 014h, 016h, 01ch
    99 00010459 1C14181C14161C      <1>
   100 00010460 000010040010080010- <1>     db  000h, 000h, 010h, 004h, 000h, 010h, 008h, 000h, 010h, 00ch, 000h, 010h, 010h, 000h, 010h, 010h
   100 00010469 0C001010001010      <1>
   101 00010470 000C10000810000410- <1>     db  000h, 00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 000h, 000h, 010h, 004h, 000h, 010h, 008h
   101 00010479 00001004001008      <1>
   102 00010480 00100C001010000C10- <1>     db  000h, 010h, 00ch, 000h, 010h, 010h, 000h, 00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 000h
   102 00010489 00081000041000      <1>
   103 00010490 001000001004001008- <1>     db  000h, 010h, 000h, 000h, 010h, 004h, 000h, 010h, 008h, 000h, 010h, 00ch, 000h, 010h, 010h, 000h
   103 00010499 00100C00101000      <1>
   104 000104A0 0C1000081000041008- <1>     db  00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 008h, 008h, 010h, 00ah, 008h, 010h, 00ch, 008h
   104 000104A9 08100A08100C08      <1>
   105 000104B0 100E08101008101008- <1>     db  010h, 00eh, 008h, 010h, 010h, 008h, 010h, 010h, 008h, 00eh, 010h, 008h, 00ch, 010h, 008h, 00ah
   105 000104B9 0E10080C10080A      <1>
   106 000104C0 100808100A08100C08- <1>     db  010h, 008h, 008h, 010h, 00ah, 008h, 010h, 00ch, 008h, 010h, 00eh, 008h, 010h, 010h, 008h, 00eh
   106 000104C9 100E081010080E      <1>
   107 000104D0 10080C10080A100808- <1>     db  010h, 008h, 00ch, 010h, 008h, 00ah, 010h, 008h, 008h, 010h, 008h, 008h, 010h, 00ah, 008h, 010h
   107 000104D9 100808100A0810      <1>
   108 000104E0 0C08100E081010080E- <1>     db  00ch, 008h, 010h, 00eh, 008h, 010h, 010h, 008h, 00eh, 010h, 008h, 00ch, 010h, 008h, 00ah, 010h
   108 000104E9 10080C10080A10      <1>
   109 000104F0 0B0B100C0B100D0B10- <1>     db  00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh, 00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh, 010h, 010h
   109 000104F9 0F0B10100B1010      <1>
   110 00010500 0B0F100B0D100B0C10- <1>     db  00bh, 00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh
   110 00010509 0B0B100C0B100D      <1>
   111 00010510 0B100F0B10100B0F10- <1>     db  00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh, 00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 00bh
   111 00010519 0B0D100B0C100B      <1>
   112 00010520 0B100B0B100C0B100D- <1>     db  00bh, 010h, 00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh, 00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh
   112 00010529 0B100F0B10100B      <1>
   113 00010530 0F100B0D100B0C1000- <1>     db  00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   113 00010539 00000000000000      <1>
   114 00010540 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   114 00010549 00000000000000      <1>
   115                              <1> 
   116                              <1> 
   117                              <1> ; 04/07/2016
   118                              <1> ; FONT DATA
   119                              <1> 
   120                              <1> CRT_CHAR_GEN:
   121                              <1> vgafont8: 
   122 00010550 00000000000000007E- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 081h, 0a5h, 081h, 0bdh, 099h, 081h, 07eh
   122 00010559 81A581BD99817E      <1>
   123 00010560 7EFFDBFFC3E7FF7E6C- <1>     db  07eh, 0ffh, 0dbh, 0ffh, 0c3h, 0e7h, 0ffh, 07eh, 06ch, 0feh, 0feh, 0feh, 07ch, 038h, 010h, 000h
   123 00010569 FEFEFE7C381000      <1>
   124 00010570 10387CFE7C38100038- <1>     db  010h, 038h, 07ch, 0feh, 07ch, 038h, 010h, 000h, 038h, 07ch, 038h, 0feh, 0feh, 07ch, 038h, 07ch
   124 00010579 7C38FEFE7C387C      <1>
   125 00010580 1010387CFE7C387C00- <1>     db  010h, 010h, 038h, 07ch, 0feh, 07ch, 038h, 07ch, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h
   125 00010589 00183C3C180000      <1>
   126 00010590 FFFFE7C3C3E7FFFF00- <1>     db  0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h
   126 00010599 3C664242663C00      <1>
   127 000105A0 FFC399BDBD99C3FF0F- <1>     db  0ffh, 0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 00fh, 007h, 00fh, 07dh, 0cch, 0cch, 0cch, 078h
   127 000105A9 070F7DCCCCCC78      <1>
   128 000105B0 3C6666663C187E183F- <1>     db  03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 018h, 03fh, 033h, 03fh, 030h, 030h, 070h, 0f0h, 0e0h
   128 000105B9 333F303070F0E0      <1>
   129 000105C0 7F637F636367E6C099- <1>     db  07fh, 063h, 07fh, 063h, 063h, 067h, 0e6h, 0c0h, 099h, 05ah, 03ch, 0e7h, 0e7h, 03ch, 05ah, 099h
   129 000105C9 5A3CE7E73C5A99      <1>
   130 000105D0 80E0F8FEF8E0800002- <1>     db  080h, 0e0h, 0f8h, 0feh, 0f8h, 0e0h, 080h, 000h, 002h, 00eh, 03eh, 0feh, 03eh, 00eh, 002h, 000h
   130 000105D9 0E3EFE3E0E0200      <1>
   131 000105E0 183C7E18187E3C1866- <1>     db  018h, 03ch, 07eh, 018h, 018h, 07eh, 03ch, 018h, 066h, 066h, 066h, 066h, 066h, 000h, 066h, 000h
   131 000105E9 66666666006600      <1>
   132 000105F0 7FDBDB7B1B1B1B003E- <1>     db  07fh, 0dbh, 0dbh, 07bh, 01bh, 01bh, 01bh, 000h, 03eh, 063h, 038h, 06ch, 06ch, 038h, 0cch, 078h
   132 000105F9 63386C6C38CC78      <1>
   133 00010600 000000007E7E7E0018- <1>     db  000h, 000h, 000h, 000h, 07eh, 07eh, 07eh, 000h, 018h, 03ch, 07eh, 018h, 07eh, 03ch, 018h, 0ffh
   133 00010609 3C7E187E3C18FF      <1>
   134 00010610 183C7E181818180018- <1>     db  018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h
   134 00010619 1818187E3C1800      <1>
   135 00010620 00180CFE0C18000000- <1>     db  000h, 018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 030h, 060h, 0feh, 060h, 030h, 000h, 000h
   135 00010629 3060FE60300000      <1>
   136 00010630 0000C0C0C0FE000000- <1>     db  000h, 000h, 0c0h, 0c0h, 0c0h, 0feh, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h
   136 00010639 2466FF66240000      <1>
   137 00010640 00183C7EFFFF000000- <1>     db  000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 000h, 000h, 000h, 0ffh, 0ffh, 07eh, 03ch, 018h, 000h, 000h
   137 00010649 FFFF7E3C180000      <1>
   138 00010650 000000000000000030- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 030h, 078h, 078h, 030h, 030h, 000h, 030h, 000h
   138 00010659 78783030003000      <1>
   139 00010660 6C6C6C00000000006C- <1>     db  06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch, 0feh, 06ch, 06ch, 000h
   139 00010669 6CFE6CFE6C6C00      <1>
   140 00010670 307CC0780CF8300000- <1>     db  030h, 07ch, 0c0h, 078h, 00ch, 0f8h, 030h, 000h, 000h, 0c6h, 0cch, 018h, 030h, 066h, 0c6h, 000h
   140 00010679 C6CC183066C600      <1>
   141 00010680 386C3876DCCC760060- <1>     db  038h, 06ch, 038h, 076h, 0dch, 0cch, 076h, 000h, 060h, 060h, 0c0h, 000h, 000h, 000h, 000h, 000h
   141 00010689 60C00000000000      <1>
   142 00010690 183060606030180060- <1>     db  018h, 030h, 060h, 060h, 060h, 030h, 018h, 000h, 060h, 030h, 018h, 018h, 018h, 030h, 060h, 000h
   142 00010699 30181818306000      <1>
   143 000106A0 00663CFF3C66000000- <1>     db  000h, 066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 030h, 030h, 0fch, 030h, 030h, 000h, 000h
   143 000106A9 3030FC30300000      <1>
   144 000106B0 000000000030306000- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 030h, 060h, 000h, 000h, 000h, 0fch, 000h, 000h, 000h, 000h
   144 000106B9 0000FC00000000      <1>
   145 000106C0 000000000030300006- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 030h, 000h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h
   145 000106C9 0C183060C08000      <1>
   146 000106D0 7CC6CEDEF6E67C0030- <1>     db  07ch, 0c6h, 0ceh, 0deh, 0f6h, 0e6h, 07ch, 000h, 030h, 070h, 030h, 030h, 030h, 030h, 0fch, 000h
   146 000106D9 7030303030FC00      <1>
   147 000106E0 78CC0C3860CCFC0078- <1>     db  078h, 0cch, 00ch, 038h, 060h, 0cch, 0fch, 000h, 078h, 0cch, 00ch, 038h, 00ch, 0cch, 078h, 000h
   147 000106E9 CC0C380CCC7800      <1>
   148 000106F0 1C3C6CCCFE0C1E00FC- <1>     db  01ch, 03ch, 06ch, 0cch, 0feh, 00ch, 01eh, 000h, 0fch, 0c0h, 0f8h, 00ch, 00ch, 0cch, 078h, 000h
   148 000106F9 C0F80C0CCC7800      <1>
   149 00010700 3860C0F8CCCC7800FC- <1>     db  038h, 060h, 0c0h, 0f8h, 0cch, 0cch, 078h, 000h, 0fch, 0cch, 00ch, 018h, 030h, 030h, 030h, 000h
   149 00010709 CC0C1830303000      <1>
   150 00010710 78CCCC78CCCC780078- <1>     db  078h, 0cch, 0cch, 078h, 0cch, 0cch, 078h, 000h, 078h, 0cch, 0cch, 07ch, 00ch, 018h, 070h, 000h
   150 00010719 CCCC7C0C187000      <1>
   151 00010720 003030000030300000- <1>     db  000h, 030h, 030h, 000h, 000h, 030h, 030h, 000h, 000h, 030h, 030h, 000h, 000h, 030h, 030h, 060h
   151 00010729 30300000303060      <1>
   152 00010730 183060C06030180000- <1>     db  018h, 030h, 060h, 0c0h, 060h, 030h, 018h, 000h, 000h, 000h, 0fch, 000h, 000h, 0fch, 000h, 000h
   152 00010739 00FC0000FC0000      <1>
   153 00010740 6030180C1830600078- <1>     db  060h, 030h, 018h, 00ch, 018h, 030h, 060h, 000h, 078h, 0cch, 00ch, 018h, 030h, 000h, 030h, 000h
   153 00010749 CC0C1830003000      <1>
   154 00010750 7CC6DEDEDEC0780030- <1>     db  07ch, 0c6h, 0deh, 0deh, 0deh, 0c0h, 078h, 000h, 030h, 078h, 0cch, 0cch, 0fch, 0cch, 0cch, 000h
   154 00010759 78CCCCFCCCCC00      <1>
   155 00010760 FC66667C6666FC003C- <1>     db  0fch, 066h, 066h, 07ch, 066h, 066h, 0fch, 000h, 03ch, 066h, 0c0h, 0c0h, 0c0h, 066h, 03ch, 000h
   155 00010769 66C0C0C0663C00      <1>
   156 00010770 F86C6666666CF800FE- <1>     db  0f8h, 06ch, 066h, 066h, 066h, 06ch, 0f8h, 000h, 0feh, 062h, 068h, 078h, 068h, 062h, 0feh, 000h
   156 00010779 6268786862FE00      <1>
   157 00010780 FE6268786860F0003C- <1>     db  0feh, 062h, 068h, 078h, 068h, 060h, 0f0h, 000h, 03ch, 066h, 0c0h, 0c0h, 0ceh, 066h, 03eh, 000h
   157 00010789 66C0C0CE663E00      <1>
   158 00010790 CCCCCCFCCCCCCC0078- <1>     db  0cch, 0cch, 0cch, 0fch, 0cch, 0cch, 0cch, 000h, 078h, 030h, 030h, 030h, 030h, 030h, 078h, 000h
   158 00010799 30303030307800      <1>
   159 000107A0 1E0C0C0CCCCC7800E6- <1>     db  01eh, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 000h, 0e6h, 066h, 06ch, 078h, 06ch, 066h, 0e6h, 000h
   159 000107A9 666C786C66E600      <1>
   160 000107B0 F06060606266FE00C6- <1>     db  0f0h, 060h, 060h, 060h, 062h, 066h, 0feh, 000h, 0c6h, 0eeh, 0feh, 0feh, 0d6h, 0c6h, 0c6h, 000h
   160 000107B9 EEFEFED6C6C600      <1>
   161 000107C0 C6E6F6DECEC6C60038- <1>     db  0c6h, 0e6h, 0f6h, 0deh, 0ceh, 0c6h, 0c6h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h
   161 000107C9 6CC6C6C66C3800      <1>
   162 000107D0 FC66667C6060F00078- <1>     db  0fch, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h, 078h, 0cch, 0cch, 0cch, 0dch, 078h, 01ch, 000h
   162 000107D9 CCCCCCDC781C00      <1>
   163 000107E0 FC66667C6C66E60078- <1>     db  0fch, 066h, 066h, 07ch, 06ch, 066h, 0e6h, 000h, 078h, 0cch, 0e0h, 070h, 01ch, 0cch, 078h, 000h
   163 000107E9 CCE0701CCC7800      <1>
   164 000107F0 FCB4303030307800CC- <1>     db  0fch, 0b4h, 030h, 030h, 030h, 030h, 078h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 0fch, 000h
   164 000107F9 CCCCCCCCCCFC00      <1>
   165 00010800 CCCCCCCCCC783000C6- <1>     db  0cch, 0cch, 0cch, 0cch, 0cch, 078h, 030h, 000h, 0c6h, 0c6h, 0c6h, 0d6h, 0feh, 0eeh, 0c6h, 000h
   165 00010809 C6C6D6FEEEC600      <1>
   166 00010810 C6C66C38386CC600CC- <1>     db  0c6h, 0c6h, 06ch, 038h, 038h, 06ch, 0c6h, 000h, 0cch, 0cch, 0cch, 078h, 030h, 030h, 078h, 000h
   166 00010819 CCCC7830307800      <1>
   167 00010820 FEC68C183266FE0078- <1>     db  0feh, 0c6h, 08ch, 018h, 032h, 066h, 0feh, 000h, 078h, 060h, 060h, 060h, 060h, 060h, 078h, 000h
   167 00010829 60606060607800      <1>
   168 00010830 C06030180C06020078- <1>     db  0c0h, 060h, 030h, 018h, 00ch, 006h, 002h, 000h, 078h, 018h, 018h, 018h, 018h, 018h, 078h, 000h
   168 00010839 18181818187800      <1>
   169 00010840 10386CC60000000000- <1>     db  010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   169 00010849 000000000000FF      <1>
   170 00010850 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 076h, 000h
   170 00010859 00780C7CCC7600      <1>
   171 00010860 E060607C6666DC0000- <1>     db  0e0h, 060h, 060h, 07ch, 066h, 066h, 0dch, 000h, 000h, 000h, 078h, 0cch, 0c0h, 0cch, 078h, 000h
   171 00010869 0078CCC0CC7800      <1>
   172 00010870 1C0C0C7CCCCC760000- <1>     db  01ch, 00ch, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h
   172 00010879 0078CCFCC07800      <1>
   173 00010880 386C60F06060F00000- <1>     db  038h, 06ch, 060h, 0f0h, 060h, 060h, 0f0h, 000h, 000h, 000h, 076h, 0cch, 0cch, 07ch, 00ch, 0f8h
   173 00010889 0076CCCC7C0CF8      <1>
   174 00010890 E0606C766666E60030- <1>     db  0e0h, 060h, 06ch, 076h, 066h, 066h, 0e6h, 000h, 030h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   174 00010899 00703030307800      <1>
   175 000108A0 0C000C0C0CCCCC78E0- <1>     db  00ch, 000h, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 0e0h, 060h, 066h, 06ch, 078h, 06ch, 0e6h, 000h
   175 000108A9 60666C786CE600      <1>
   176 000108B0 703030303030780000- <1>     db  070h, 030h, 030h, 030h, 030h, 030h, 078h, 000h, 000h, 000h, 0cch, 0feh, 0feh, 0d6h, 0c6h, 000h
   176 000108B9 00CCFEFED6C600      <1>
   177 000108C0 0000F8CCCCCCCC0000- <1>     db  000h, 000h, 0f8h, 0cch, 0cch, 0cch, 0cch, 000h, 000h, 000h, 078h, 0cch, 0cch, 0cch, 078h, 000h
   177 000108C9 0078CCCCCC7800      <1>
   178 000108D0 0000DC66667C60F000- <1>     db  000h, 000h, 0dch, 066h, 066h, 07ch, 060h, 0f0h, 000h, 000h, 076h, 0cch, 0cch, 07ch, 00ch, 01eh
   178 000108D9 0076CCCC7C0C1E      <1>
   179 000108E0 0000DC766660F00000- <1>     db  000h, 000h, 0dch, 076h, 066h, 060h, 0f0h, 000h, 000h, 000h, 07ch, 0c0h, 078h, 00ch, 0f8h, 000h
   179 000108E9 007CC0780CF800      <1>
   180 000108F0 10307C303034180000- <1>     db  010h, 030h, 07ch, 030h, 030h, 034h, 018h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 076h, 000h
   180 000108F9 00CCCCCCCC7600      <1>
   181 00010900 0000CCCCCC78300000- <1>     db  000h, 000h, 0cch, 0cch, 0cch, 078h, 030h, 000h, 000h, 000h, 0c6h, 0d6h, 0feh, 0feh, 06ch, 000h
   181 00010909 00C6D6FEFE6C00      <1>
   182 00010910 0000C66C386CC60000- <1>     db  000h, 000h, 0c6h, 06ch, 038h, 06ch, 0c6h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 07ch, 00ch, 0f8h
   182 00010919 00CCCCCC7C0CF8      <1>
   183 00010920 0000FC983064FC001C- <1>     db  000h, 000h, 0fch, 098h, 030h, 064h, 0fch, 000h, 01ch, 030h, 030h, 0e0h, 030h, 030h, 01ch, 000h
   183 00010929 3030E030301C00      <1>
   184 00010930 1818180018181800E0- <1>     db  018h, 018h, 018h, 000h, 018h, 018h, 018h, 000h, 0e0h, 030h, 030h, 01ch, 030h, 030h, 0e0h, 000h
   184 00010939 30301C3030E000      <1>
   185 00010940 76DC00000000000000- <1>     db  076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 000h
   185 00010949 10386CC6C6FE00      <1>
   186 00010950 78CCC0CC78180C7800- <1>     db  078h, 0cch, 0c0h, 0cch, 078h, 018h, 00ch, 078h, 000h, 0cch, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   186 00010959 CC00CCCCCC7E00      <1>
   187 00010960 1C0078CCFCC078007E- <1>     db  01ch, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h, 07eh, 0c3h, 03ch, 006h, 03eh, 066h, 03fh, 000h
   187 00010969 C33C063E663F00      <1>
   188 00010970 CC00780C7CCC7E00E0- <1>     db  0cch, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 0e0h, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h
   188 00010979 00780C7CCC7E00      <1>
   189 00010980 3030780C7CCC7E0000- <1>     db  030h, 030h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 000h, 000h, 078h, 0c0h, 0c0h, 078h, 00ch, 038h
   189 00010989 0078C0C0780C38      <1>
   190 00010990 7EC33C667E603C00CC- <1>     db  07eh, 0c3h, 03ch, 066h, 07eh, 060h, 03ch, 000h, 0cch, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h
   190 00010999 0078CCFCC07800      <1>
   191 000109A0 E00078CCFCC07800CC- <1>     db  0e0h, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h, 0cch, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   191 000109A9 00703030307800      <1>
   192 000109B0 7CC6381818183C00E0- <1>     db  07ch, 0c6h, 038h, 018h, 018h, 018h, 03ch, 000h, 0e0h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   192 000109B9 00703030307800      <1>
   193 000109C0 C6386CC6FEC6C60030- <1>     db  0c6h, 038h, 06ch, 0c6h, 0feh, 0c6h, 0c6h, 000h, 030h, 030h, 000h, 078h, 0cch, 0fch, 0cch, 000h
   193 000109C9 300078CCFCCC00      <1>
   194 000109D0 1C00FC607860FC0000- <1>     db  01ch, 000h, 0fch, 060h, 078h, 060h, 0fch, 000h, 000h, 000h, 07fh, 00ch, 07fh, 0cch, 07fh, 000h
   194 000109D9 007F0C7FCC7F00      <1>
   195 000109E0 3E6CCCFECCCCCE0078- <1>     db  03eh, 06ch, 0cch, 0feh, 0cch, 0cch, 0ceh, 000h, 078h, 0cch, 000h, 078h, 0cch, 0cch, 078h, 000h
   195 000109E9 CC0078CCCC7800      <1>
   196 000109F0 00CC0078CCCC780000- <1>     db  000h, 0cch, 000h, 078h, 0cch, 0cch, 078h, 000h, 000h, 0e0h, 000h, 078h, 0cch, 0cch, 078h, 000h
   196 000109F9 E00078CCCC7800      <1>
   197 00010A00 78CC00CCCCCC7E0000- <1>     db  078h, 0cch, 000h, 0cch, 0cch, 0cch, 07eh, 000h, 000h, 0e0h, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   197 00010A09 E000CCCCCC7E00      <1>
   198 00010A10 00CC00CCCC7C0CF8C3- <1>     db  000h, 0cch, 000h, 0cch, 0cch, 07ch, 00ch, 0f8h, 0c3h, 018h, 03ch, 066h, 066h, 03ch, 018h, 000h
   198 00010A19 183C66663C1800      <1>
   199 00010A20 CC00CCCCCCCC780018- <1>     db  0cch, 000h, 0cch, 0cch, 0cch, 0cch, 078h, 000h, 018h, 018h, 07eh, 0c0h, 0c0h, 07eh, 018h, 018h
   199 00010A29 187EC0C07E1818      <1>
   200 00010A30 386C64F060E6FC00CC- <1>     db  038h, 06ch, 064h, 0f0h, 060h, 0e6h, 0fch, 000h, 0cch, 0cch, 078h, 0fch, 030h, 0fch, 030h, 030h
   200 00010A39 CC78FC30FC3030      <1>
   201 00010A40 F8CCCCFAC6CFC6C70E- <1>     db  0f8h, 0cch, 0cch, 0fah, 0c6h, 0cfh, 0c6h, 0c7h, 00eh, 01bh, 018h, 03ch, 018h, 018h, 0d8h, 070h
   201 00010A49 1B183C1818D870      <1>
   202 00010A50 1C00780C7CCC7E0038- <1>     db  01ch, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 038h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   202 00010A59 00703030307800      <1>
   203 00010A60 001C0078CCCC780000- <1>     db  000h, 01ch, 000h, 078h, 0cch, 0cch, 078h, 000h, 000h, 01ch, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   203 00010A69 1C00CCCCCC7E00      <1>
   204 00010A70 00F800F8CCCCCC00FC- <1>     db  000h, 0f8h, 000h, 0f8h, 0cch, 0cch, 0cch, 000h, 0fch, 000h, 0cch, 0ech, 0fch, 0dch, 0cch, 000h
   204 00010A79 00CCECFCDCCC00      <1>
   205 00010A80 3C6C6C3E007E000038- <1>     db  03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h
   205 00010A89 6C6C38007C0000      <1>
   206 00010A90 30003060C0CC780000- <1>     db  030h, 000h, 030h, 060h, 0c0h, 0cch, 078h, 000h, 000h, 000h, 000h, 0fch, 0c0h, 0c0h, 000h, 000h
   206 00010A99 0000FCC0C00000      <1>
   207 00010AA0 000000FC0C0C0000C3- <1>     db  000h, 000h, 000h, 0fch, 00ch, 00ch, 000h, 000h, 0c3h, 0c6h, 0cch, 0deh, 033h, 066h, 0cch, 00fh
   207 00010AA9 C6CCDE3366CC0F      <1>
   208 00010AB0 C3C6CCDB376FCF0318- <1>     db  0c3h, 0c6h, 0cch, 0dbh, 037h, 06fh, 0cfh, 003h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 000h
   208 00010AB9 18001818181800      <1>
   209 00010AC0 003366CC6633000000- <1>     db  000h, 033h, 066h, 0cch, 066h, 033h, 000h, 000h, 000h, 0cch, 066h, 033h, 066h, 0cch, 000h, 000h
   209 00010AC9 CC663366CC0000      <1>
   210 00010AD0 228822882288228855- <1>     db  022h, 088h, 022h, 088h, 022h, 088h, 022h, 088h, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah
   210 00010AD9 AA55AA55AA55AA      <1>
   211 00010AE0 DB77DBEEDB77DBEE18- <1>     db  0dbh, 077h, 0dbh, 0eeh, 0dbh, 077h, 0dbh, 0eeh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   211 00010AE9 18181818181818      <1>
   212 00010AF0 18181818F818181818- <1>     db  018h, 018h, 018h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h, 018h
   212 00010AF9 18F818F8181818      <1>
   213 00010B00 36363636F636363600- <1>     db  036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h
   213 00010B09 000000FE363636      <1>
   214 00010B10 0000F818F818181836- <1>     db  000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h
   214 00010B19 36F606F6363636      <1>
   215 00010B20 363636363636363600- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 0feh, 006h, 0f6h, 036h, 036h, 036h
   215 00010B29 00FE06F6363636      <1>
   216 00010B30 3636F606FE00000036- <1>     db  036h, 036h, 0f6h, 006h, 0feh, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h, 000h
   216 00010B39 363636FE000000      <1>
   217 00010B40 1818F818F800000000- <1>     db  018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h
   217 00010B49 000000F8181818      <1>
   218 00010B50 181818181F00000018- <1>     db  018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h
   218 00010B59 181818FF000000      <1>
   219 00010B60 00000000FF18181818- <1>     db  000h, 000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 018h, 018h
   219 00010B69 1818181F181818      <1>
   220 00010B70 00000000FF00000018- <1>     db  000h, 000h, 000h, 000h, 0ffh, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h
   220 00010B79 181818FF181818      <1>
   221 00010B80 18181F181F18181836- <1>     db  018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h
   221 00010B89 36363637363636      <1>
   222 00010B90 363637303F00000000- <1>     db  036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h
   222 00010B99 003F3037363636      <1>
   223 00010BA0 3636F700FF00000000- <1>     db  036h, 036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0f7h, 036h, 036h, 036h
   223 00010BA9 00FF00F7363636      <1>
   224 00010BB0 363637303736363600- <1>     db  036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h, 000h
   224 00010BB9 00FF00FF000000      <1>
   225 00010BC0 3636F700F736363618- <1>     db  036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h
   225 00010BC9 18FF00FF000000      <1>
   226 00010BD0 36363636FF00000000- <1>     db  036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h
   226 00010BD9 00FF00FF181818      <1>
   227 00010BE0 00000000FF36363636- <1>     db  000h, 000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 03fh, 000h, 000h, 000h
   227 00010BE9 3636363F000000      <1>
   228 00010BF0 18181F181F00000000- <1>     db  018h, 018h, 01fh, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h, 018h
   228 00010BF9 001F181F181818      <1>
   229 00010C00 000000003F36363636- <1>     db  000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h
   229 00010C09 363636FF363636      <1>
   230 00010C10 1818FF18FF18181818- <1>     db  018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h
   230 00010C19 181818F8000000      <1>
   231 00010C20 000000001F181818FF- <1>     db  000h, 000h, 000h, 000h, 01fh, 018h, 018h, 018h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   231 00010C29 FFFFFFFFFFFFFF      <1>
   232 00010C30 00000000FFFFFFFFF0- <1>     db  000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   232 00010C39 F0F0F0F0F0F0F0      <1>
   233 00010C40 0F0F0F0F0F0F0F0FFF- <1>     db  00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h
   233 00010C49 FFFFFF00000000      <1>
   234 00010C50 000076DCC8DC760000- <1>     db  000h, 000h, 076h, 0dch, 0c8h, 0dch, 076h, 000h, 000h, 078h, 0cch, 0f8h, 0cch, 0f8h, 0c0h, 0c0h
   234 00010C59 78CCF8CCF8C0C0      <1>
   235 00010C60 00FCCCC0C0C0C00000- <1>     db  000h, 0fch, 0cch, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 0feh, 06ch, 06ch, 06ch, 06ch, 06ch, 000h
   235 00010C69 FE6C6C6C6C6C00      <1>
   236 00010C70 FCCC603060CCFC0000- <1>     db  0fch, 0cch, 060h, 030h, 060h, 0cch, 0fch, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 070h, 000h
   236 00010C79 007ED8D8D87000      <1>
   237 00010C80 00666666667C60C000- <1>     db  000h, 066h, 066h, 066h, 066h, 07ch, 060h, 0c0h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 000h
   237 00010C89 76DC1818181800      <1>
   238 00010C90 FC3078CCCC7830FC38- <1>     db  0fch, 030h, 078h, 0cch, 0cch, 078h, 030h, 0fch, 038h, 06ch, 0c6h, 0feh, 0c6h, 06ch, 038h, 000h
   238 00010C99 6CC6FEC66C3800      <1>
   239 00010CA0 386CC6C66C6CEE001C- <1>     db  038h, 06ch, 0c6h, 0c6h, 06ch, 06ch, 0eeh, 000h, 01ch, 030h, 018h, 07ch, 0cch, 0cch, 078h, 000h
   239 00010CA9 30187CCCCC7800      <1>
   240 00010CB0 00007EDBDB7E000006- <1>     db  000h, 000h, 07eh, 0dbh, 0dbh, 07eh, 000h, 000h, 006h, 00ch, 07eh, 0dbh, 0dbh, 07eh, 060h, 0c0h
   240 00010CB9 0C7EDBDB7E60C0      <1>
   241 00010CC0 3860C0F8C060380078- <1>     db  038h, 060h, 0c0h, 0f8h, 0c0h, 060h, 038h, 000h, 078h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 000h
   241 00010CC9 CCCCCCCCCCCC00      <1>
   242 00010CD0 00FC00FC00FC000030- <1>     db  000h, 0fch, 000h, 0fch, 000h, 0fch, 000h, 000h, 030h, 030h, 0fch, 030h, 030h, 000h, 0fch, 000h
   242 00010CD9 30FC303000FC00      <1>
   243 00010CE0 603018306000FC0018- <1>     db  060h, 030h, 018h, 030h, 060h, 000h, 0fch, 000h, 018h, 030h, 060h, 030h, 018h, 000h, 0fch, 000h
   243 00010CE9 3060301800FC00      <1>
   244 00010CF0 0E1B1B181818181818- <1>     db  00eh, 01bh, 01bh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h, 070h
   244 00010CF9 18181818D8D870      <1>
   245 00010D00 303000FC0030300000- <1>     db  030h, 030h, 000h, 0fch, 000h, 030h, 030h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h
   245 00010D09 76DC0076DC0000      <1>
   246 00010D10 386C6C380000000000- <1>     db  038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h
   246 00010D19 00001818000000      <1>
   247 00010D20 00000000180000000F- <1>     db  000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h, 00fh, 00ch, 00ch, 00ch, 0ech, 06ch, 03ch, 01ch
   247 00010D29 0C0C0CEC6C3C1C      <1>
   248 00010D30 786C6C6C6C00000070- <1>     db  078h, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 070h, 018h, 030h, 060h, 078h, 000h, 000h, 000h
   248 00010D39 18306078000000      <1>
   249 00010D40 00003C3C3C3C000000- <1>     db  000h, 000h, 03ch, 03ch, 03ch, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   249 00010D49 00000000000000      <1>
   250                              <1> vgafont14:
   251 00010D50 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   251 00010D59 00000000000000      <1>
   252 00010D60 7E81A58181BD99817E- <1>     db  07eh, 081h, 0a5h, 081h, 081h, 0bdh, 099h, 081h, 07eh, 000h, 000h, 000h, 000h, 000h, 07eh, 0ffh
   252 00010D69 00000000007EFF      <1>
   253 00010D70 DBFFFFC3E7FF7E0000- <1>     db  0dbh, 0ffh, 0ffh, 0c3h, 0e7h, 0ffh, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 06ch, 0feh, 0feh
   253 00010D79 000000006CFEFE      <1>
   254 00010D80 FEFE7C381000000000- <1>     db  0feh, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 07ch, 0feh, 07ch
   254 00010D89 000010387CFE7C      <1>
   255 00010D90 381000000000000018- <1>     db  038h, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 0e7h, 0e7h, 0e7h, 018h, 018h
   255 00010D99 3C3CE7E7E71818      <1>
   256 00010DA0 3C0000000000183C7E- <1>     db  03ch, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 07eh, 018h, 018h, 03ch, 000h
   256 00010DA9 FFFF7E18183C00      <1>
   257 00010DB0 00000000000000183C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h, 000h
   257 00010DB9 3C180000000000      <1>
   258 00010DC0 FFFFFFFFFFE7C3C3E7- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h
   258 00010DC9 FFFFFFFFFF0000      <1>
   259 00010DD0 00003C664242663C00- <1>     db  000h, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh
   259 00010DD9 000000FFFFFFFF      <1>
   260 00010DE0 C399BDBD99C3FFFFFF- <1>     db  0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 01eh, 00eh, 01ah, 032h
   260 00010DE9 FF00001E0E1A32      <1>
   261 00010DF0 78CCCCCC7800000000- <1>     db  078h, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 066h, 066h, 03ch, 018h
   261 00010DF9 003C6666663C18      <1>
   262 00010E00 7E181800000000003F- <1>     db  07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 03fh, 033h, 03fh, 030h, 030h, 030h, 070h, 0f0h
   262 00010E09 333F30303070F0      <1>
   263 00010E10 E000000000007F637F- <1>     db  0e0h, 000h, 000h, 000h, 000h, 000h, 07fh, 063h, 07fh, 063h, 063h, 063h, 067h, 0e7h, 0e6h, 0c0h
   263 00010E19 63636367E7E6C0      <1>
   264 00010E20 000000001818DB3CE7- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 0dbh, 03ch, 0e7h, 03ch, 0dbh, 018h, 018h, 000h, 000h, 000h
   264 00010E29 3CDB1818000000      <1>
   265 00010E30 000080C0E0F8FEF8E0- <1>     db  000h, 000h, 080h, 0c0h, 0e0h, 0f8h, 0feh, 0f8h, 0e0h, 0c0h, 080h, 000h, 000h, 000h, 000h, 000h
   265 00010E39 C0800000000000      <1>
   266 00010E40 02060E3EFE3E0E0602- <1>     db  002h, 006h, 00eh, 03eh, 0feh, 03eh, 00eh, 006h, 002h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch
   266 00010E49 0000000000183C      <1>
   267 00010E50 7E1818187E3C180000- <1>     db  07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h
   267 00010E59 00000066666666      <1>
   268 00010E60 666600666600000000- <1>     db  066h, 066h, 000h, 066h, 066h, 000h, 000h, 000h, 000h, 000h, 07fh, 0dbh, 0dbh, 0dbh, 07bh, 01bh
   268 00010E69 007FDBDBDB7B1B      <1>
   269 00010E70 1B1B1B000000007CC6- <1>     db  01bh, 01bh, 01bh, 000h, 000h, 000h, 000h, 07ch, 0c6h, 060h, 038h, 06ch, 0c6h, 0c6h, 06ch, 038h
   269 00010E79 60386CC6C66C38      <1>
   270 00010E80 0CC67C000000000000- <1>     db  00ch, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 0feh, 000h
   270 00010E89 000000FEFEFE00      <1>
   271 00010E90 00000000183C7E1818- <1>     db  000h, 000h, 000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 07eh, 000h, 000h
   271 00010E99 187E3C187E0000      <1>
   272 00010EA0 0000183C7E18181818- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   272 00010EA9 18180000000000      <1>
   273 00010EB0 1818181818187E3C18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   273 00010EB9 00000000000000      <1>
   274 00010EC0 180CFE0C1800000000- <1>     db  018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 030h, 060h
   274 00010EC9 00000000003060      <1>
   275 00010ED0 FE6030000000000000- <1>     db  0feh, 060h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c0h
   275 00010ED9 00000000C0C0C0      <1>
   276 00010EE0 FE0000000000000000- <1>     db  0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 028h, 06ch, 0feh, 06ch, 028h, 000h
   276 00010EE9 00286CFE6C2800      <1>
   277 00010EF0 000000000000001038- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 038h, 07ch, 07ch, 0feh, 0feh, 000h, 000h
   277 00010EF9 387C7CFEFE0000      <1>
   278 00010F00 0000000000FEFE7C7C- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 07ch, 07ch, 038h, 038h, 010h, 000h, 000h, 000h, 000h
   278 00010F09 38381000000000      <1>
   279 00010F10 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   279 00010F19 00000000000000      <1>
   280 00010F20 183C3C3C1818001818- <1>     db  018h, 03ch, 03ch, 03ch, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 066h, 066h, 066h
   280 00010F29 00000000666666      <1>
   281 00010F30 240000000000000000- <1>     db  024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch
   281 00010F39 0000006C6CFE6C      <1>
   282 00010F40 6C6CFE6C6C00000018- <1>     db  06ch, 06ch, 0feh, 06ch, 06ch, 000h, 000h, 000h, 018h, 018h, 07ch, 0c6h, 0c2h, 0c0h, 07ch, 006h
   282 00010F49 187CC6C2C07C06      <1>
   283 00010F50 86C67C181800000000- <1>     db  086h, 0c6h, 07ch, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 0c2h, 0c6h, 00ch, 018h, 030h, 066h
   283 00010F59 00C2C60C183066      <1>
   284 00010F60 C60000000000386C6C- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 038h, 06ch, 06ch, 038h, 076h, 0dch, 0cch, 0cch, 076h, 000h
   284 00010F69 3876DCCCCC7600      <1>
   285 00010F70 000000303030600000- <1>     db  000h, 000h, 000h, 030h, 030h, 030h, 060h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   285 00010F79 00000000000000      <1>
   286 00010F80 00000C183030303030- <1>     db  000h, 000h, 00ch, 018h, 030h, 030h, 030h, 030h, 030h, 018h, 00ch, 000h, 000h, 000h, 000h, 000h
   286 00010F89 180C0000000000      <1>
   287 00010F90 30180C0C0C0C0C1830- <1>     db  030h, 018h, 00ch, 00ch, 00ch, 00ch, 00ch, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   287 00010F99 00000000000000      <1>
   288 00010FA0 663CFF3C6600000000- <1>     db  066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h
   288 00010FA9 00000000001818      <1>
   289 00010FB0 7E1818000000000000- <1>     db  07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   289 00010FB9 00000000000000      <1>
   290 00010FC0 181818300000000000- <1>     db  018h, 018h, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 000h, 000h, 000h
   290 00010FC9 000000FE000000      <1>
   291 00010FD0 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h
   291 00010FD9 00000000181800      <1>
   292 00010FE0 0000000002060C1830- <1>     db  000h, 000h, 000h, 000h, 002h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h, 000h, 000h, 000h
   292 00010FE9 60C08000000000      <1>
   293 00010FF0 00007CC6CEDEF6E6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0ceh, 0deh, 0f6h, 0e6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   293 00010FF9 C67C0000000000      <1>
   294 00011000 18387818181818187E- <1>     db  018h, 038h, 078h, 018h, 018h, 018h, 018h, 018h, 07eh, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h
   294 00011009 00000000007CC6      <1>
   295 00011010 060C183060C6FE0000- <1>     db  006h, 00ch, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 006h, 006h
   295 00011019 0000007CC60606      <1>
   296 00011020 3C0606C67C00000000- <1>     db  03ch, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 00ch, 01ch, 03ch, 06ch, 0cch, 0feh
   296 00011029 000C1C3C6CCCFE      <1>
   297 00011030 0C0C1E0000000000FE- <1>     db  00ch, 00ch, 01eh, 000h, 000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0fch, 006h, 006h, 0c6h
   297 00011039 C0C0C0FC0606C6      <1>
   298 00011040 7C00000000003860C0- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 038h, 060h, 0c0h, 0c0h, 0fch, 0c6h, 0c6h, 0c6h, 07ch, 000h
   298 00011049 C0FCC6C6C67C00      <1>
   299 00011050 00000000FEC6060C18- <1>     db  000h, 000h, 000h, 000h, 0feh, 0c6h, 006h, 00ch, 018h, 030h, 030h, 030h, 030h, 000h, 000h, 000h
   299 00011059 30303030000000      <1>
   300 00011060 00007CC6C6C67CC6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   300 00011069 C67C0000000000      <1>
   301 00011070 7CC6C6C67E06060C78- <1>     db  07ch, 0c6h, 0c6h, 0c6h, 07eh, 006h, 006h, 00ch, 078h, 000h, 000h, 000h, 000h, 000h, 000h, 018h
   301 00011079 00000000000018      <1>
   302 00011080 180000001818000000- <1>     db  018h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h
   302 00011089 00000000181800      <1>
   303 00011090 000018183000000000- <1>     db  000h, 000h, 018h, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 006h, 00ch, 018h, 030h, 060h, 030h
   303 00011099 00060C18306030      <1>
   304 000110A0 180C06000000000000- <1>     db  018h, 00ch, 006h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 000h, 000h, 07eh, 000h
   304 000110A9 00007E00007E00      <1>
   305 000110B0 000000000000603018- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 060h, 000h
   305 000110B9 0C060C18306000      <1>
   306 000110C0 000000007CC6C60C18- <1>     db  000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 00ch, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h
   306 000110C9 18001818000000      <1>
   307 000110D0 00007CC6C6DEDEDEDC- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0deh, 0deh, 0deh, 0dch, 0c0h, 07ch, 000h, 000h, 000h, 000h, 000h
   307 000110D9 C07C0000000000      <1>
   308 000110E0 10386CC6C6FEC6C6C6- <1>     db  010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h, 0fch, 066h
   308 000110E9 0000000000FC66      <1>
   309 000110F0 66667C666666FC0000- <1>     db  066h, 066h, 07ch, 066h, 066h, 066h, 0fch, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 0c2h, 0c0h
   309 000110F9 0000003C66C2C0      <1>
   310 00011100 C0C0C2663C00000000- <1>     db  0c0h, 0c0h, 0c2h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h, 0f8h, 06ch, 066h, 066h, 066h, 066h
   310 00011109 00F86C66666666      <1>
   311 00011110 666CF80000000000FE- <1>     db  066h, 06ch, 0f8h, 000h, 000h, 000h, 000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 062h, 066h
   311 00011119 66626878686266      <1>
   312 00011120 FE0000000000FE6662- <1>     db  0feh, 000h, 000h, 000h, 000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 060h, 0f0h, 000h
   312 00011129 6878686060F000      <1>
   313 00011130 000000003C66C2C0C0- <1>     db  000h, 000h, 000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0deh, 0c6h, 066h, 03ah, 000h, 000h, 000h
   313 00011139 DEC6663A000000      <1>
   314 00011140 0000C6C6C6C6FEC6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h
   314 00011149 C6C60000000000      <1>
   315 00011150 3C181818181818183C- <1>     db  03ch, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 01eh, 00ch
   315 00011159 00000000001E0C      <1>
   316 00011160 0C0C0C0CCCCC780000- <1>     db  00ch, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h, 000h, 0e6h, 066h, 06ch, 06ch
   316 00011169 000000E6666C6C      <1>
   317 00011170 786C6C66E600000000- <1>     db  078h, 06ch, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 0f0h, 060h, 060h, 060h, 060h, 060h
   317 00011179 00F06060606060      <1>
   318 00011180 6266FE0000000000C6- <1>     db  062h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h, 0c6h, 0eeh, 0feh, 0feh, 0d6h, 0c6h, 0c6h, 0c6h
   318 00011189 EEFEFED6C6C6C6      <1>
   319 00011190 C60000000000C6E6F6- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 000h
   319 00011199 FEDECEC6C6C600      <1>
   320 000111A0 00000000386CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h
   320 000111A9 C6C66C38000000      <1>
   321 000111B0 0000FC6666667C6060- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h, 000h
   321 000111B9 60F00000000000      <1>
   322 000111C0 7CC6C6C6C6D6DE7C0C- <1>     db  07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0deh, 07ch, 00ch, 00eh, 000h, 000h, 000h, 000h, 0fch, 066h
   322 000111C9 0E00000000FC66      <1>
   323 000111D0 66667C6C6666E60000- <1>     db  066h, 066h, 07ch, 06ch, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 060h
   323 000111D9 0000007CC6C660      <1>
   324 000111E0 380CC6C67C00000000- <1>     db  038h, 00ch, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 07eh, 07eh, 05ah, 018h, 018h, 018h
   324 000111E9 007E7E5A181818      <1>
   325 000111F0 18183C0000000000C6- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h
   325 000111F9 C6C6C6C6C6C6C6      <1>
   326 00011200 7C0000000000C6C6C6- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 010h, 000h
   326 00011209 C6C6C66C381000      <1>
   327 00011210 00000000C6C6C6C6D6- <1>     db  000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0d6h, 0feh, 07ch, 06ch, 000h, 000h, 000h
   327 00011219 D6FE7C6C000000      <1>
   328 00011220 0000C6C66C3838386C- <1>     db  000h, 000h, 0c6h, 0c6h, 06ch, 038h, 038h, 038h, 06ch, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h
   328 00011229 C6C60000000000      <1>
   329 00011230 666666663C1818183C- <1>     db  066h, 066h, 066h, 066h, 03ch, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 0feh, 0c6h
   329 00011239 0000000000FEC6      <1>
   330 00011240 8C183060C2C6FE0000- <1>     db  08ch, 018h, 030h, 060h, 0c2h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 03ch, 030h, 030h, 030h
   330 00011249 0000003C303030      <1>
   331 00011250 303030303C00000000- <1>     db  030h, 030h, 030h, 030h, 03ch, 000h, 000h, 000h, 000h, 000h, 080h, 0c0h, 0e0h, 070h, 038h, 01ch
   331 00011259 0080C0E070381C      <1>
   332 00011260 0E060200000000003C- <1>     db  00eh, 006h, 002h, 000h, 000h, 000h, 000h, 000h, 03ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch
   332 00011269 0C0C0C0C0C0C0C      <1>
   333 00011270 3C00000010386CC600- <1>     db  03ch, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   333 00011279 00000000000000      <1>
   334 00011280 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h
   334 00011289 0000000000FF00      <1>
   335 00011290 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   335 00011299 00000000000000      <1>
   336 000112A0 000000780C7CCCCC76- <1>     db  000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 0e0h, 060h
   336 000112A9 0000000000E060      <1>
   337 000112B0 60786C6666667C0000- <1>     db  060h, 078h, 06ch, 066h, 066h, 066h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch
   337 000112B9 0000000000007C      <1>
   338 000112C0 C6C0C0C67C00000000- <1>     db  0c6h, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 01ch, 00ch, 00ch, 03ch, 06ch, 0cch
   338 000112C9 001C0C0C3C6CCC      <1>
   339 000112D0 CCCC76000000000000- <1>     db  0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h
   339 000112D9 00007CC6FEC0C6      <1>
   340 000112E0 7C0000000000386C64- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 0f0h, 000h
   340 000112E9 60F0606060F000      <1>
   341 000112F0 0000000000000076CC- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 07ch, 00ch, 0cch, 078h, 000h
   341 000112F9 CCCC7C0CCC7800      <1>
   342 00011300 0000E060606C766666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 06ch, 076h, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h
   342 00011309 66E60000000000      <1>
   343 00011310 18180038181818183C- <1>     db  018h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 006h, 006h
   343 00011319 00000000000606      <1>
   344 00011320 000E0606060666663C- <1>     db  000h, 00eh, 006h, 006h, 006h, 006h, 066h, 066h, 03ch, 000h, 000h, 000h, 0e0h, 060h, 060h, 066h
   344 00011329 000000E0606066      <1>
   345 00011330 6C786C66E600000000- <1>     db  06ch, 078h, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h
   345 00011339 00381818181818      <1>
   346 00011340 18183C000000000000- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ech, 0feh, 0d6h, 0d6h, 0d6h
   346 00011349 0000ECFED6D6D6      <1>
   347 00011350 C60000000000000000- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 000h
   347 00011359 DC666666666600      <1>
   348 00011360 000000000000007CC6- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h
   348 00011369 C6C6C67C000000      <1>
   349 00011370 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h, 000h, 000h
   349 00011379 7C6060F0000000      <1>
   350 00011380 00000076CCCCCC7C0C- <1>     db  000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 07ch, 00ch, 00ch, 01eh, 000h, 000h, 000h, 000h, 000h
   350 00011389 0C1E0000000000      <1>
   351 00011390 00DC76666060F00000- <1>     db  000h, 0dch, 076h, 066h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch
   351 00011399 0000000000007C      <1>
   352 000113A0 C6701CC67C00000000- <1>     db  0c6h, 070h, 01ch, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 010h, 030h, 030h, 0fch, 030h, 030h
   352 000113A9 00103030FC3030      <1>
   353 000113B0 30361C000000000000- <1>     db  030h, 036h, 01ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch
   353 000113B9 0000CCCCCCCCCC      <1>
   354 000113C0 760000000000000000- <1>     db  076h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 03ch, 018h, 000h
   354 000113C9 666666663C1800      <1>
   355 000113D0 00000000000000C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0d6h, 0d6h, 0feh, 06ch, 000h, 000h, 000h
   355 000113D9 D6D6FE6C000000      <1>
   356 000113E0 0000000000C66C3838- <1>     db  000h, 000h, 000h, 000h, 000h, 0c6h, 06ch, 038h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h
   356 000113E9 6CC60000000000      <1>
   357 000113F0 000000C6C6C6C67E06- <1>     db  000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 0f8h, 000h, 000h, 000h, 000h, 000h
   357 000113F9 0CF80000000000      <1>
   358 00011400 00FECC183066FE0000- <1>     db  000h, 0feh, 0cch, 018h, 030h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h, 00eh, 018h, 018h, 018h
   358 00011409 0000000E181818      <1>
   359 00011410 701818180E00000000- <1>     db  070h, 018h, 018h, 018h, 00eh, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 000h, 018h
   359 00011419 00181818180018      <1>
   360 00011420 181818000000000070- <1>     db  018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 070h, 018h, 018h, 018h, 00eh, 018h, 018h, 018h
   360 00011429 1818180E181818      <1>
   361 00011430 70000000000076DC00- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   361 00011439 00000000000000      <1>
   362 00011440 00000000000010386C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   362 00011449 C6C6FE00000000      <1>
   363 00011450 00003C66C2C0C0C266- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 00ch, 006h, 07ch, 000h, 000h, 000h
   363 00011459 3C0C067C000000      <1>
   364 00011460 CCCC00CCCCCCCCCC76- <1>     db  0cch, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 00ch, 018h, 030h
   364 00011469 000000000C1830      <1>
   365 00011470 007CC6FEC0C67C0000- <1>     db  000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 000h, 078h
   365 00011479 000010386C0078      <1>
   366 00011480 0C7CCCCC7600000000- <1>     db  00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 000h, 078h, 00ch, 07ch
   366 00011489 00CCCC00780C7C      <1>
   367 00011490 CCCC76000000006030- <1>     db  0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 078h, 00ch, 07ch, 0cch, 0cch
   367 00011499 1800780C7CCCCC      <1>
   368 000114A0 7600000000386C3800- <1>     db  076h, 000h, 000h, 000h, 000h, 038h, 06ch, 038h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h
   368 000114A9 780C7CCCCC7600      <1>
   369 000114B0 0000000000003C6660- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 060h, 066h, 03ch, 00ch, 006h, 03ch, 000h, 000h
   369 000114B9 663C0C063C0000      <1>
   370 000114C0 0010386C007CC6FEC0- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   370 000114C9 C67C0000000000      <1>
   371 000114D0 CCCC007CC6FEC0C67C- <1>     db  0cch, 0cch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h
   371 000114D9 00000000603018      <1>
   372 000114E0 007CC6FEC0C67C0000- <1>     db  000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 000h, 038h
   372 000114E9 00000066660038      <1>
   373 000114F0 181818183C00000000- <1>     db  018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 018h, 03ch, 066h, 000h, 038h, 018h, 018h
   373 000114F9 183C6600381818      <1>
   374 00011500 18183C000000006030- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 038h, 018h, 018h, 018h, 018h
   374 00011509 18003818181818      <1>
   375 00011510 3C00000000C6C61038- <1>     db  03ch, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 000h
   375 00011519 6CC6C6FEC6C600      <1>
   376 00011520 0000386C3800386CC6- <1>     db  000h, 000h, 038h, 06ch, 038h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 000h, 000h, 000h
   376 00011529 C6FEC6C6000000      <1>
   377 00011530 18306000FE66607C60- <1>     db  018h, 030h, 060h, 000h, 0feh, 066h, 060h, 07ch, 060h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h
   377 00011539 66FE0000000000      <1>
   378 00011540 0000CC76367ED8D86E- <1>     db  000h, 000h, 0cch, 076h, 036h, 07eh, 0d8h, 0d8h, 06eh, 000h, 000h, 000h, 000h, 000h, 03eh, 06ch
   378 00011549 00000000003E6C      <1>
   379 00011550 CCCCFECCCCCCCE0000- <1>     db  0cch, 0cch, 0feh, 0cch, 0cch, 0cch, 0ceh, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 000h, 07ch
   379 00011559 000010386C007C      <1>
   380 00011560 C6C6C6C67C00000000- <1>     db  0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 000h, 07ch, 0c6h, 0c6h
   380 00011569 00C6C6007CC6C6      <1>
   381 00011570 C6C67C000000006030- <1>     db  0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h
   381 00011579 18007CC6C6C6C6      <1>
   382 00011580 7C000000003078CC00- <1>     db  07ch, 000h, 000h, 000h, 000h, 030h, 078h, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h
   382 00011589 CCCCCCCCCC7600      <1>
   383 00011590 00000060301800CCCC- <1>     db  000h, 000h, 000h, 060h, 030h, 018h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h
   383 00011599 CCCCCC76000000      <1>
   384 000115A0 0000C6C600C6C6C6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 078h, 000h, 000h, 0c6h
   384 000115A9 7E060C780000C6      <1>
   385 000115B0 C6386CC6C6C6C66C38- <1>     db  0c6h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 000h
   385 000115B9 00000000C6C600      <1>
   386 000115C0 C6C6C6C6C6C67C0000- <1>     db  0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 018h, 018h, 03ch, 066h, 060h
   386 000115C9 000018183C6660      <1>
   387 000115D0 60663C181800000000- <1>     db  060h, 066h, 03ch, 018h, 018h, 000h, 000h, 000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h
   387 000115D9 386C6460F06060      <1>
   388 000115E0 60E6FC000000000066- <1>     db  060h, 0e6h, 0fch, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 03ch, 018h, 07eh, 018h, 07eh, 018h
   388 000115E9 663C187E187E18      <1>
   389 000115F0 1800000000F8CCCCF8- <1>     db  018h, 000h, 000h, 000h, 000h, 0f8h, 0cch, 0cch, 0f8h, 0c4h, 0cch, 0deh, 0cch, 0cch, 0c6h, 000h
   389 000115F9 C4CCDECCCCC600      <1>
   390 00011600 0000000E1B1818187E- <1>     db  000h, 000h, 000h, 00eh, 01bh, 018h, 018h, 018h, 07eh, 018h, 018h, 018h, 018h, 0d8h, 070h, 000h
   390 00011609 18181818D87000      <1>
   391 00011610 0018306000780C7CCC- <1>     db  000h, 018h, 030h, 060h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 00ch
   391 00011619 CC76000000000C      <1>
   392 00011620 18300038181818183C- <1>     db  018h, 030h, 000h, 038h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 018h, 030h, 060h
   392 00011629 00000000183060      <1>
   393 00011630 007CC6C6C6C67C0000- <1>     db  000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 018h, 030h, 060h, 000h, 0cch
   393 00011639 000018306000CC      <1>
   394 00011640 CCCCCCCC7600000000- <1>     db  0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 0dch, 066h, 066h
   394 00011649 0076DC00DC6666      <1>
   395 00011650 66666600000076DC00- <1>     db  066h, 066h, 066h, 000h, 000h, 000h, 076h, 0dch, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h
   395 00011659 C6E6F6FEDECEC6      <1>
   396 00011660 C6000000003C6C6C3E- <1>     db  0c6h, 000h, 000h, 000h, 000h, 03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 000h, 000h, 000h
   396 00011669 007E0000000000      <1>
   397 00011670 000000386C6C38007C- <1>     db  000h, 000h, 000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   397 00011679 00000000000000      <1>
   398 00011680 0000303000303060C6- <1>     db  000h, 000h, 030h, 030h, 000h, 030h, 030h, 060h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   398 00011689 C67C0000000000      <1>
   399 00011690 00000000FEC0C0C000- <1>     db  000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   399 00011699 00000000000000      <1>
   400 000116A0 0000FE060606000000- <1>     db  000h, 000h, 0feh, 006h, 006h, 006h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c6h, 0cch, 0d8h
   400 000116A9 0000C0C0C6CCD8      <1>
   401 000116B0 3060DC860C183E0000- <1>     db  030h, 060h, 0dch, 086h, 00ch, 018h, 03eh, 000h, 000h, 0c0h, 0c0h, 0c6h, 0cch, 0d8h, 030h, 066h
   401 000116B9 C0C0C6CCD83066      <1>
   402 000116C0 CE9E3E060600000018- <1>     db  0ceh, 09eh, 03eh, 006h, 006h, 000h, 000h, 000h, 018h, 018h, 000h, 018h, 018h, 03ch, 03ch, 03ch
   402 000116C9 180018183C3C3C      <1>
   403 000116D0 180000000000000036- <1>     db  018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 036h, 06ch, 0d8h, 06ch, 036h, 000h, 000h, 000h
   403 000116D9 6CD86C36000000      <1>
   404 000116E0 000000000000D86C36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0d8h, 06ch, 036h, 06ch, 0d8h, 000h, 000h, 000h, 000h, 000h
   404 000116E9 6CD80000000000      <1>
   405 000116F0 114411441144114411- <1>     db  011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 055h, 0aah
   405 000116F9 441144114455AA      <1>
   406 00011700 55AA55AA55AA55AA55- <1>     db  055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 0ddh, 077h, 0ddh, 077h
   406 00011709 AA55AADD77DD77      <1>
   407 00011710 DD77DD77DD77DD77DD- <1>     db  0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 018h, 018h, 018h, 018h, 018h, 018h
   407 00011719 77181818181818      <1>
   408 00011720 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h
   408 00011729 181818181818F8      <1>
   409 00011730 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h
   409 00011739 1818F818F81818      <1>
   410 00011740 181818183636363636- <1>     db  018h, 018h, 018h, 018h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 036h
   410 00011749 3636F636363636      <1>
   411 00011750 363600000000000000- <1>     db  036h, 036h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h, 036h, 036h, 036h
   411 00011759 FE363636363636      <1>
   412 00011760 0000000000F818F818- <1>     db  000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 036h, 036h
   412 00011769 18181818183636      <1>
   413 00011770 363636F606F6363636- <1>     db  036h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   413 00011779 36363636363636      <1>
   414 00011780 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 000h, 0feh
   414 00011789 360000000000FE      <1>
   415 00011790 06F636363636363636- <1>     db  006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0feh
   415 00011799 36363636F606FE      <1>
   416 000117A0 000000000000363636- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h
   416 000117A9 36363636FE0000      <1>
   417 000117B0 000000001818181818- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h
   417 000117B9 F818F800000000      <1>
   418 000117C0 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h
   418 000117C9 F8181818181818      <1>
   419 000117D0 181818181818181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h
   419 000117D9 00000000001818      <1>
   420 000117E0 1818181818FF000000- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   420 000117E9 00000000000000      <1>
   421 000117F0 000000FF1818181818- <1>     db  000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   421 000117F9 18181818181818      <1>
   422 00011800 181F18181818181800- <1>     db  018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   422 00011809 000000000000FF      <1>
   423 00011810 000000000000181818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h
   423 00011819 18181818FF1818      <1>
   424 00011820 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h
   424 00011829 1F181F18181818      <1>
   425 00011830 181836363636363636- <1>     db  018h, 018h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h, 036h, 036h, 036h
   425 00011839 37363636363636      <1>
   426 00011840 363636363637303F00- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   426 00011849 00000000000000      <1>
   427 00011850 0000003F3037363636- <1>     db  000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   427 00011859 36363636363636      <1>
   428 00011860 36F700FF0000000000- <1>     db  036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   428 00011869 000000000000FF      <1>
   429 00011870 00F736363636363636- <1>     db  000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 030h, 037h
   429 00011879 36363636373037      <1>
   430 00011880 363636363636000000- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h
   430 00011889 0000FF00FF0000      <1>
   431 00011890 000000003636363636- <1>     db  000h, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 036h
   431 00011899 F700F736363636      <1>
   432 000118A0 36361818181818FF00- <1>     db  036h, 036h, 018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h
   432 000118A9 FF000000000000      <1>
   433 000118B0 36363636363636FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   433 000118B9 00000000000000      <1>
   434 000118C0 000000FF00FF181818- <1>     db  000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   434 000118C9 18181800000000      <1>
   435 000118D0 000000FF3636363636- <1>     db  000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   435 000118D9 36363636363636      <1>
   436 000118E0 363F00000000000018- <1>     db  036h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh
   436 000118E9 181818181F181F      <1>
   437 000118F0 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h
   437 000118F9 00001F181F1818      <1>
   438 00011900 181818180000000000- <1>     db  018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h
   438 00011909 00003F36363636      <1>
   439 00011910 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h
   439 00011919 FF363636363636      <1>
   440 00011920 1818181818FF18FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   440 00011929 18181818181818      <1>
   441 00011930 1818181818F8000000- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   441 00011939 00000000000000      <1>
   442 00011940 0000001F1818181818- <1>     db  000h, 000h, 000h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   442 00011949 18FFFFFFFFFFFF      <1>
   443 00011950 FFFFFFFFFFFFFFFF00- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   443 00011959 000000000000FF      <1>
   444 00011960 FFFFFFFFFFFFF0F0F0- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   444 00011969 F0F0F0F0F0F0F0      <1>
   445 00011970 F0F0F0F00F0F0F0F0F- <1>     db  0f0h, 0f0h, 0f0h, 0f0h, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh
   445 00011979 0F0F0F0F0F0F0F      <1>
   446 00011980 0F0FFFFFFFFFFFFFFF- <1>     db  00fh, 00fh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   446 00011989 00000000000000      <1>
   447 00011990 000000000076DCD8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 0d8h, 0d8h, 0dch, 076h, 000h, 000h, 000h, 000h, 000h
   447 00011999 DC760000000000      <1>
   448 000119A0 00007CC6FCC6C6FCC0- <1>     db  000h, 000h, 07ch, 0c6h, 0fch, 0c6h, 0c6h, 0fch, 0c0h, 0c0h, 040h, 000h, 000h, 000h, 0feh, 0c6h
   448 000119A9 C040000000FEC6      <1>
   449 000119B0 C6C0C0C0C0C0C00000- <1>     db  0c6h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 06ch
   449 000119B9 0000000000FE6C      <1>
   450 000119C0 6C6C6C6C6C00000000- <1>     db  06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 0feh, 0c6h, 060h, 030h, 018h, 030h
   450 000119C9 00FEC660301830      <1>
   451 000119D0 60C6FE000000000000- <1>     db  060h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 0d8h
   451 000119D9 00007ED8D8D8D8      <1>
   452 000119E0 700000000000000066- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0c0h
   452 000119E9 6666667C6060C0      <1>
   453 000119F0 00000000000076DC18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h
   453 000119F9 18181818000000      <1>
   454 00011A00 00007E183C6666663C- <1>     db  000h, 000h, 07eh, 018h, 03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h, 000h
   454 00011A09 187E0000000000      <1>
   455 00011A10 386CC6C6FEC6C66C38- <1>     db  038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 038h, 06ch
   455 00011A19 0000000000386C      <1>
   456 00011A20 C6C6C66C6C6CEE0000- <1>     db  0c6h, 0c6h, 0c6h, 06ch, 06ch, 06ch, 0eeh, 000h, 000h, 000h, 000h, 000h, 01eh, 030h, 018h, 00ch
   456 00011A29 0000001E30180C      <1>
   457 00011A30 3E6666663C00000000- <1>     db  03eh, 066h, 066h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 0dbh, 0dbh
   457 00011A39 000000007EDBDB      <1>
   458 00011A40 7E0000000000000003- <1>     db  07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 003h, 006h, 07eh, 0dbh, 0dbh, 0f3h, 07eh, 060h
   458 00011A49 067EDBDBF37E60      <1>
   459 00011A50 C000000000001C3060- <1>     db  0c0h, 000h, 000h, 000h, 000h, 000h, 01ch, 030h, 060h, 060h, 07ch, 060h, 060h, 030h, 01ch, 000h
   459 00011A59 607C6060301C00      <1>
   460 00011A60 00000000007CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h
   460 00011A69 C6C6C6C6000000      <1>
   461 00011A70 000000FE0000FE0000- <1>     db  000h, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h
   461 00011A79 FE000000000000      <1>
   462 00011A80 0018187E18180000FF- <1>     db  000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 030h, 018h
   462 00011A89 00000000003018      <1>
   463 00011A90 0C060C1830007E0000- <1>     db  00ch, 006h, 00ch, 018h, 030h, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 00ch, 018h, 030h, 060h
   463 00011A99 0000000C183060      <1>
   464 00011AA0 30180C007E00000000- <1>     db  030h, 018h, 00ch, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 00eh, 01bh, 01bh, 018h, 018h, 018h
   464 00011AA9 000E1B1B181818      <1>
   465 00011AB0 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h
   465 00011AB9 1818181818D8D8      <1>
   466 00011AC0 700000000000001818- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 07eh, 000h, 018h, 018h, 000h, 000h
   466 00011AC9 007E0018180000      <1>
   467 00011AD0 00000000000076DC00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h
   467 00011AD9 76DC0000000000      <1>
   468 00011AE0 00386C6C3800000000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   468 00011AE9 00000000000000      <1>
   469 00011AF0 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   469 00011AF9 00000000000000      <1>
   470 00011B00 000000180000000000- <1>     db  000h, 000h, 000h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 00fh, 00ch, 00ch, 00ch, 00ch
   470 00011B09 00000F0C0C0C0C      <1>
   471 00011B10 0CEC6C3C1C00000000- <1>     db  00ch, 0ech, 06ch, 03ch, 01ch, 000h, 000h, 000h, 000h, 0d8h, 06ch, 06ch, 06ch, 06ch, 06ch, 000h
   471 00011B19 D86C6C6C6C6C00      <1>
   472 00011B20 0000000000000070D8- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 070h, 0d8h, 030h, 060h, 0c8h, 0f8h, 000h, 000h, 000h
   472 00011B29 3060C8F8000000      <1>
   473 00011B30 00000000000000007C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 000h, 000h
   473 00011B39 7C7C7C7C7C0000      <1>
   474 00011B40 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   474 00011B49 00000000000000      <1>
   475                              <1> vgafont16:
   476 00011B50 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   476 00011B59 00000000000000      <1>
   477 00011B60 00007E81A58181BD99- <1>     db  000h, 000h, 07eh, 081h, 0a5h, 081h, 081h, 0bdh, 099h, 081h, 081h, 07eh, 000h, 000h, 000h, 000h
   477 00011B69 81817E00000000      <1>
   478 00011B70 00007EFFDBFFFFC3E7- <1>     db  000h, 000h, 07eh, 0ffh, 0dbh, 0ffh, 0ffh, 0c3h, 0e7h, 0ffh, 0ffh, 07eh, 000h, 000h, 000h, 000h
   478 00011B79 FFFF7E00000000      <1>
   479 00011B80 000000006CFEFEFEFE- <1>     db  000h, 000h, 000h, 000h, 06ch, 0feh, 0feh, 0feh, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h
   479 00011B89 7C381000000000      <1>
   480 00011B90 0000000010387CFE7C- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 07ch, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h, 000h
   480 00011B99 38100000000000      <1>
   481 00011BA0 000000183C3CE7E7E7- <1>     db  000h, 000h, 000h, 018h, 03ch, 03ch, 0e7h, 0e7h, 0e7h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   481 00011BA9 18183C00000000      <1>
   482 00011BB0 000000183C7EFFFF7E- <1>     db  000h, 000h, 000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 07eh, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   482 00011BB9 18183C00000000      <1>
   483 00011BC0 000000000000183C3C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   483 00011BC9 18000000000000      <1>
   484 00011BD0 FFFFFFFFFFFFE7C3C3- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   484 00011BD9 E7FFFFFFFFFFFF      <1>
   485 00011BE0 00000000003C664242- <1>     db  000h, 000h, 000h, 000h, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h
   485 00011BE9 663C0000000000      <1>
   486 00011BF0 FFFFFFFFFFC399BDBD- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   486 00011BF9 99C3FFFFFFFFFF      <1>
   487 00011C00 00001E0E1A3278CCCC- <1>     db  000h, 000h, 01eh, 00eh, 01ah, 032h, 078h, 0cch, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h
   487 00011C09 CCCC7800000000      <1>
   488 00011C10 00003C666666663C18- <1>     db  000h, 000h, 03ch, 066h, 066h, 066h, 066h, 03ch, 018h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h
   488 00011C19 7E181800000000      <1>
   489 00011C20 00003F333F30303030- <1>     db  000h, 000h, 03fh, 033h, 03fh, 030h, 030h, 030h, 030h, 070h, 0f0h, 0e0h, 000h, 000h, 000h, 000h
   489 00011C29 70F0E000000000      <1>
   490 00011C30 00007F637F63636363- <1>     db  000h, 000h, 07fh, 063h, 07fh, 063h, 063h, 063h, 063h, 067h, 0e7h, 0e6h, 0c0h, 000h, 000h, 000h
   490 00011C39 67E7E6C0000000      <1>
   491 00011C40 0000001818DB3CE73C- <1>     db  000h, 000h, 000h, 018h, 018h, 0dbh, 03ch, 0e7h, 03ch, 0dbh, 018h, 018h, 000h, 000h, 000h, 000h
   491 00011C49 DB181800000000      <1>
   492 00011C50 0080C0E0F0F8FEF8F0- <1>     db  000h, 080h, 0c0h, 0e0h, 0f0h, 0f8h, 0feh, 0f8h, 0f0h, 0e0h, 0c0h, 080h, 000h, 000h, 000h, 000h
   492 00011C59 E0C08000000000      <1>
   493 00011C60 0002060E1E3EFE3E1E- <1>     db  000h, 002h, 006h, 00eh, 01eh, 03eh, 0feh, 03eh, 01eh, 00eh, 006h, 002h, 000h, 000h, 000h, 000h
   493 00011C69 0E060200000000      <1>
   494 00011C70 0000183C7E1818187E- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h
   494 00011C79 3C180000000000      <1>
   495 00011C80 000066666666666666- <1>     db  000h, 000h, 066h, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 066h, 066h, 000h, 000h, 000h, 000h
   495 00011C89 00666600000000      <1>
   496 00011C90 00007FDBDBDB7B1B1B- <1>     db  000h, 000h, 07fh, 0dbh, 0dbh, 0dbh, 07bh, 01bh, 01bh, 01bh, 01bh, 01bh, 000h, 000h, 000h, 000h
   496 00011C99 1B1B1B00000000      <1>
   497 00011CA0 007CC660386CC6C66C- <1>     db  000h, 07ch, 0c6h, 060h, 038h, 06ch, 0c6h, 0c6h, 06ch, 038h, 00ch, 0c6h, 07ch, 000h, 000h, 000h
   497 00011CA9 380CC67C000000      <1>
   498 00011CB0 0000000000000000FE- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 0feh, 0feh, 000h, 000h, 000h, 000h
   498 00011CB9 FEFEFE00000000      <1>
   499 00011CC0 0000183C7E1818187E- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h
   499 00011CC9 3C187E00000000      <1>
   500 00011CD0 0000183C7E18181818- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   500 00011CD9 18181800000000      <1>
   501 00011CE0 000018181818181818- <1>     db  000h, 000h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h
   501 00011CE9 7E3C1800000000      <1>
   502 00011CF0 0000000000180CFE0C- <1>     db  000h, 000h, 000h, 000h, 000h, 018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   502 00011CF9 18000000000000      <1>
   503 00011D00 00000000003060FE60- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 060h, 0feh, 060h, 030h, 000h, 000h, 000h, 000h, 000h, 000h
   503 00011D09 30000000000000      <1>
   504 00011D10 000000000000C0C0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c0h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h
   504 00011D19 FE000000000000      <1>
   505 00011D20 00000000002466FF66- <1>     db  000h, 000h, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 000h
   505 00011D29 24000000000000      <1>
   506 00011D30 000000001038387C7C- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 038h, 07ch, 07ch, 0feh, 0feh, 000h, 000h, 000h, 000h, 000h
   506 00011D39 FEFE0000000000      <1>
   507 00011D40 00000000FEFE7C7C38- <1>     db  000h, 000h, 000h, 000h, 0feh, 0feh, 07ch, 07ch, 038h, 038h, 010h, 000h, 000h, 000h, 000h, 000h
   507 00011D49 38100000000000      <1>
   508 00011D50 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   508 00011D59 00000000000000      <1>
   509 00011D60 0000183C3C3C181818- <1>     db  000h, 000h, 018h, 03ch, 03ch, 03ch, 018h, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   509 00011D69 00181800000000      <1>
   510 00011D70 006666662400000000- <1>     db  000h, 066h, 066h, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   510 00011D79 00000000000000      <1>
   511 00011D80 0000006C6CFE6C6C6C- <1>     db  000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch, 06ch, 06ch, 0feh, 06ch, 06ch, 000h, 000h, 000h, 000h
   511 00011D89 FE6C6C00000000      <1>
   512 00011D90 18187CC6C2C07C0606- <1>     db  018h, 018h, 07ch, 0c6h, 0c2h, 0c0h, 07ch, 006h, 006h, 086h, 0c6h, 07ch, 018h, 018h, 000h, 000h
   512 00011D99 86C67C18180000      <1>
   513 00011DA0 00000000C2C60C1830- <1>     db  000h, 000h, 000h, 000h, 0c2h, 0c6h, 00ch, 018h, 030h, 060h, 0c6h, 086h, 000h, 000h, 000h, 000h
   513 00011DA9 60C68600000000      <1>
   514 00011DB0 0000386C6C3876DCCC- <1>     db  000h, 000h, 038h, 06ch, 06ch, 038h, 076h, 0dch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   514 00011DB9 CCCC7600000000      <1>
   515 00011DC0 003030306000000000- <1>     db  000h, 030h, 030h, 030h, 060h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   515 00011DC9 00000000000000      <1>
   516 00011DD0 00000C183030303030- <1>     db  000h, 000h, 00ch, 018h, 030h, 030h, 030h, 030h, 030h, 030h, 018h, 00ch, 000h, 000h, 000h, 000h
   516 00011DD9 30180C00000000      <1>
   517 00011DE0 000030180C0C0C0C0C- <1>     db  000h, 000h, 030h, 018h, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 018h, 030h, 000h, 000h, 000h, 000h
   517 00011DE9 0C183000000000      <1>
   518 00011DF0 0000000000663CFF3C- <1>     db  000h, 000h, 000h, 000h, 000h, 066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 000h, 000h, 000h
   518 00011DF9 66000000000000      <1>
   519 00011E00 000000000018187E18- <1>     db  000h, 000h, 000h, 000h, 000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   519 00011E09 18000000000000      <1>
   520 00011E10 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 030h, 000h, 000h, 000h
   520 00011E19 18181830000000      <1>
   521 00011E20 00000000000000FE00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   521 00011E29 00000000000000      <1>
   522 00011E30 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   522 00011E39 00181800000000      <1>
   523 00011E40 0000000002060C1830- <1>     db  000h, 000h, 000h, 000h, 002h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h, 000h, 000h, 000h
   523 00011E49 60C08000000000      <1>
   524 00011E50 00003C66C3C3DBDBC3- <1>     db  000h, 000h, 03ch, 066h, 0c3h, 0c3h, 0dbh, 0dbh, 0c3h, 0c3h, 066h, 03ch, 000h, 000h, 000h, 000h
   524 00011E59 C3663C00000000      <1>
   525 00011E60 000018387818181818- <1>     db  000h, 000h, 018h, 038h, 078h, 018h, 018h, 018h, 018h, 018h, 018h, 07eh, 000h, 000h, 000h, 000h
   525 00011E69 18187E00000000      <1>
   526 00011E70 00007CC6060C183060- <1>     db  000h, 000h, 07ch, 0c6h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   526 00011E79 C0C6FE00000000      <1>
   527 00011E80 00007CC606063C0606- <1>     db  000h, 000h, 07ch, 0c6h, 006h, 006h, 03ch, 006h, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   527 00011E89 06C67C00000000      <1>
   528 00011E90 00000C1C3C6CCCFE0C- <1>     db  000h, 000h, 00ch, 01ch, 03ch, 06ch, 0cch, 0feh, 00ch, 00ch, 00ch, 01eh, 000h, 000h, 000h, 000h
   528 00011E99 0C0C1E00000000      <1>
   529 00011EA0 0000FEC0C0C0FC0606- <1>     db  000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0fch, 006h, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   529 00011EA9 06C67C00000000      <1>
   530 00011EB0 00003860C0C0FCC6C6- <1>     db  000h, 000h, 038h, 060h, 0c0h, 0c0h, 0fch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   530 00011EB9 C6C67C00000000      <1>
   531 00011EC0 0000FEC606060C1830- <1>     db  000h, 000h, 0feh, 0c6h, 006h, 006h, 00ch, 018h, 030h, 030h, 030h, 030h, 000h, 000h, 000h, 000h
   531 00011EC9 30303000000000      <1>
   532 00011ED0 00007CC6C6C67CC6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   532 00011ED9 C6C67C00000000      <1>
   533 00011EE0 00007CC6C6C67E0606- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07eh, 006h, 006h, 006h, 00ch, 078h, 000h, 000h, 000h, 000h
   533 00011EE9 060C7800000000      <1>
   534 00011EF0 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   534 00011EF9 18180000000000      <1>
   535 00011F00 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 030h, 000h, 000h, 000h, 000h
   535 00011F09 18183000000000      <1>
   536 00011F10 000000060C18306030- <1>     db  000h, 000h, 000h, 006h, 00ch, 018h, 030h, 060h, 030h, 018h, 00ch, 006h, 000h, 000h, 000h, 000h
   536 00011F19 180C0600000000      <1>
   537 00011F20 00000000007E00007E- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 000h, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   537 00011F29 00000000000000      <1>
   538 00011F30 0000006030180C060C- <1>     db  000h, 000h, 000h, 060h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 060h, 000h, 000h, 000h, 000h
   538 00011F39 18306000000000      <1>
   539 00011F40 00007CC6C60C181818- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 00ch, 018h, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   539 00011F49 00181800000000      <1>
   540 00011F50 0000007CC6C6DEDEDE- <1>     db  000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0deh, 0deh, 0deh, 0dch, 0c0h, 07ch, 000h, 000h, 000h, 000h
   540 00011F59 DCC07C00000000      <1>
   541 00011F60 000010386CC6C6FEC6- <1>     db  000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   541 00011F69 C6C6C600000000      <1>
   542 00011F70 0000FC6666667C6666- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 066h, 066h, 066h, 066h, 0fch, 000h, 000h, 000h, 000h
   542 00011F79 6666FC00000000      <1>
   543 00011F80 00003C66C2C0C0C0C0- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 000h, 000h, 000h, 000h
   543 00011F89 C2663C00000000      <1>
   544 00011F90 0000F86C6666666666- <1>     db  000h, 000h, 0f8h, 06ch, 066h, 066h, 066h, 066h, 066h, 066h, 06ch, 0f8h, 000h, 000h, 000h, 000h
   544 00011F99 666CF800000000      <1>
   545 00011FA0 0000FE666268786860- <1>     db  000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 062h, 066h, 0feh, 000h, 000h, 000h, 000h
   545 00011FA9 6266FE00000000      <1>
   546 00011FB0 0000FE666268786860- <1>     db  000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   546 00011FB9 6060F000000000      <1>
   547 00011FC0 00003C66C2C0C0DEC6- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0deh, 0c6h, 0c6h, 066h, 03ah, 000h, 000h, 000h, 000h
   547 00011FC9 C6663A00000000      <1>
   548 00011FD0 0000C6C6C6C6FEC6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   548 00011FD9 C6C6C600000000      <1>
   549 00011FE0 00003C181818181818- <1>     db  000h, 000h, 03ch, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   549 00011FE9 18183C00000000      <1>
   550 00011FF0 00001E0C0C0C0C0CCC- <1>     db  000h, 000h, 01eh, 00ch, 00ch, 00ch, 00ch, 00ch, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h
   550 00011FF9 CCCC7800000000      <1>
   551 00012000 0000E666666C78786C- <1>     db  000h, 000h, 0e6h, 066h, 066h, 06ch, 078h, 078h, 06ch, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   551 00012009 6666E600000000      <1>
   552 00012010 0000F0606060606060- <1>     db  000h, 000h, 0f0h, 060h, 060h, 060h, 060h, 060h, 060h, 062h, 066h, 0feh, 000h, 000h, 000h, 000h
   552 00012019 6266FE00000000      <1>
   553 00012020 0000C3E7FFFFDBC3C3- <1>     db  000h, 000h, 0c3h, 0e7h, 0ffh, 0ffh, 0dbh, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 000h, 000h, 000h, 000h
   553 00012029 C3C3C300000000      <1>
   554 00012030 0000C6E6F6FEDECEC6- <1>     db  000h, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   554 00012039 C6C6C600000000      <1>
   555 00012040 00007CC6C6C6C6C6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   555 00012049 C6C67C00000000      <1>
   556 00012050 0000FC6666667C6060- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 060h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   556 00012059 6060F000000000      <1>
   557 00012060 00007CC6C6C6C6C6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0deh, 07ch, 00ch, 00eh, 000h, 000h
   557 00012069 D6DE7C0C0E0000      <1>
   558 00012070 0000FC6666667C6C66- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 06ch, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   558 00012079 6666E600000000      <1>
   559 00012080 00007CC6C660380C06- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 060h, 038h, 00ch, 006h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   559 00012089 C6C67C00000000      <1>
   560 00012090 0000FFDB9918181818- <1>     db  000h, 000h, 0ffh, 0dbh, 099h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   560 00012099 18183C00000000      <1>
   561 000120A0 0000C6C6C6C6C6C6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   561 000120A9 C6C67C00000000      <1>
   562 000120B0 0000C3C3C3C3C3C3C3- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 000h
   562 000120B9 663C1800000000      <1>
   563 000120C0 0000C3C3C3C3C3DBDB- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 066h, 000h, 000h, 000h, 000h
   563 000120C9 FF666600000000      <1>
   564 000120D0 0000C3C3663C18183C- <1>     db  000h, 000h, 0c3h, 0c3h, 066h, 03ch, 018h, 018h, 03ch, 066h, 0c3h, 0c3h, 000h, 000h, 000h, 000h
   564 000120D9 66C3C300000000      <1>
   565 000120E0 0000C3C3C3663C1818- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   565 000120E9 18183C00000000      <1>
   566 000120F0 0000FFC3860C183060- <1>     db  000h, 000h, 0ffh, 0c3h, 086h, 00ch, 018h, 030h, 060h, 0c1h, 0c3h, 0ffh, 000h, 000h, 000h, 000h
   566 000120F9 C1C3FF00000000      <1>
   567 00012100 00003C303030303030- <1>     db  000h, 000h, 03ch, 030h, 030h, 030h, 030h, 030h, 030h, 030h, 030h, 03ch, 000h, 000h, 000h, 000h
   567 00012109 30303C00000000      <1>
   568 00012110 00000080C0E070381C- <1>     db  000h, 000h, 000h, 080h, 0c0h, 0e0h, 070h, 038h, 01ch, 00eh, 006h, 002h, 000h, 000h, 000h, 000h
   568 00012119 0E060200000000      <1>
   569 00012120 00003C0C0C0C0C0C0C- <1>     db  000h, 000h, 03ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 03ch, 000h, 000h, 000h, 000h
   569 00012129 0C0C3C00000000      <1>
   570 00012130 10386CC60000000000- <1>     db  010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   570 00012139 00000000000000      <1>
   571 00012140 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 000h
   571 00012149 00000000FF0000      <1>
   572 00012150 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   572 00012159 00000000000000      <1>
   573 00012160 0000000000780C7CCC- <1>     db  000h, 000h, 000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   573 00012169 CCCC7600000000      <1>
   574 00012170 0000E06060786C6666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 078h, 06ch, 066h, 066h, 066h, 066h, 07ch, 000h, 000h, 000h, 000h
   574 00012179 66667C00000000      <1>
   575 00012180 00000000007CC6C0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c0h, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   575 00012189 C0C67C00000000      <1>
   576 00012190 00001C0C0C3C6CCCCC- <1>     db  000h, 000h, 01ch, 00ch, 00ch, 03ch, 06ch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   576 00012199 CCCC7600000000      <1>
   577 000121A0 00000000007CC6FEC0- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   577 000121A9 C0C67C00000000      <1>
   578 000121B0 0000386C6460F06060- <1>     db  000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   578 000121B9 6060F000000000      <1>
   579 000121C0 000000000076CCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 0cch, 0cch, 07ch, 00ch, 0cch, 078h, 000h
   579 000121C9 CCCC7C0CCC7800      <1>
   580 000121D0 0000E060606C766666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 06ch, 076h, 066h, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   580 000121D9 6666E600000000      <1>
   581 000121E0 000018180038181818- <1>     db  000h, 000h, 018h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   581 000121E9 18183C00000000      <1>
   582 000121F0 00000606000E060606- <1>     db  000h, 000h, 006h, 006h, 000h, 00eh, 006h, 006h, 006h, 006h, 006h, 006h, 066h, 066h, 03ch, 000h
   582 000121F9 06060666663C00      <1>
   583 00012200 0000E06060666C7878- <1>     db  000h, 000h, 0e0h, 060h, 060h, 066h, 06ch, 078h, 078h, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h
   583 00012209 6C66E600000000      <1>
   584 00012210 000038181818181818- <1>     db  000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   584 00012219 18183C00000000      <1>
   585 00012220 0000000000E6FFDBDB- <1>     db  000h, 000h, 000h, 000h, 000h, 0e6h, 0ffh, 0dbh, 0dbh, 0dbh, 0dbh, 0dbh, 000h, 000h, 000h, 000h
   585 00012229 DBDBDB00000000      <1>
   586 00012230 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 000h, 000h, 000h
   586 00012239 66666600000000      <1>
   587 00012240 00000000007CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   587 00012249 C6C67C00000000      <1>
   588 00012250 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h
   588 00012259 66667C6060F000      <1>
   589 00012260 000000000076CCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 0cch, 0cch, 07ch, 00ch, 00ch, 01eh, 000h
   589 00012269 CCCC7C0C0C1E00      <1>
   590 00012270 0000000000DC766660- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 076h, 066h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   590 00012279 6060F000000000      <1>
   591 00012280 00000000007CC66038- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 060h, 038h, 00ch, 0c6h, 07ch, 000h, 000h, 000h, 000h
   591 00012289 0CC67C00000000      <1>
   592 00012290 0000103030FC303030- <1>     db  000h, 000h, 010h, 030h, 030h, 0fch, 030h, 030h, 030h, 030h, 036h, 01ch, 000h, 000h, 000h, 000h
   592 00012299 30361C00000000      <1>
   593 000122A0 0000000000CCCCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   593 000122A9 CCCC7600000000      <1>
   594 000122B0 0000000000C3C3C3C3- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 000h
   594 000122B9 663C1800000000      <1>
   595 000122C0 0000000000C3C3C3DB- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 000h, 000h, 000h, 000h
   595 000122C9 DBFF6600000000      <1>
   596 000122D0 0000000000C3663C18- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 066h, 03ch, 018h, 03ch, 066h, 0c3h, 000h, 000h, 000h, 000h
   596 000122D9 3C66C300000000      <1>
   597 000122E0 0000000000C6C6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 0f8h, 000h
   597 000122E9 C6C67E060CF800      <1>
   598 000122F0 0000000000FECC1830- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 0cch, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   598 000122F9 60C6FE00000000      <1>
   599 00012300 00000E181818701818- <1>     db  000h, 000h, 00eh, 018h, 018h, 018h, 070h, 018h, 018h, 018h, 018h, 00eh, 000h, 000h, 000h, 000h
   599 00012309 18180E00000000      <1>
   600 00012310 000018181818001818- <1>     db  000h, 000h, 018h, 018h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   600 00012319 18181800000000      <1>
   601 00012320 0000701818180E1818- <1>     db  000h, 000h, 070h, 018h, 018h, 018h, 00eh, 018h, 018h, 018h, 018h, 070h, 000h, 000h, 000h, 000h
   601 00012329 18187000000000      <1>
   602 00012330 000076DC0000000000- <1>     db  000h, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   602 00012339 00000000000000      <1>
   603 00012340 0000000010386CC6C6- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h
   603 00012349 C6FE0000000000      <1>
   604 00012350 00003C66C2C0C0C0C2- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 00ch, 006h, 07ch, 000h, 000h
   604 00012359 663C0C067C0000      <1>
   605 00012360 0000CC0000CCCCCCCC- <1>     db  000h, 000h, 0cch, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   605 00012369 CCCC7600000000      <1>
   606 00012370 000C1830007CC6FEC0- <1>     db  000h, 00ch, 018h, 030h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   606 00012379 C0C67C00000000      <1>
   607 00012380 0010386C00780C7CCC- <1>     db  000h, 010h, 038h, 06ch, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   607 00012389 CCCC7600000000      <1>
   608 00012390 0000CC0000780C7CCC- <1>     db  000h, 000h, 0cch, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   608 00012399 CCCC7600000000      <1>
   609 000123A0 0060301800780C7CCC- <1>     db  000h, 060h, 030h, 018h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   609 000123A9 CCCC7600000000      <1>
   610 000123B0 00386C3800780C7CCC- <1>     db  000h, 038h, 06ch, 038h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   610 000123B9 CCCC7600000000      <1>
   611 000123C0 000000003C66606066- <1>     db  000h, 000h, 000h, 000h, 03ch, 066h, 060h, 060h, 066h, 03ch, 00ch, 006h, 03ch, 000h, 000h, 000h
   611 000123C9 3C0C063C000000      <1>
   612 000123D0 0010386C007CC6FEC0- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   612 000123D9 C0C67C00000000      <1>
   613 000123E0 0000C600007CC6FEC0- <1>     db  000h, 000h, 0c6h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   613 000123E9 C0C67C00000000      <1>
   614 000123F0 00603018007CC6FEC0- <1>     db  000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   614 000123F9 C0C67C00000000      <1>
   615 00012400 000066000038181818- <1>     db  000h, 000h, 066h, 000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   615 00012409 18183C00000000      <1>
   616 00012410 00183C660038181818- <1>     db  000h, 018h, 03ch, 066h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   616 00012419 18183C00000000      <1>
   617 00012420 006030180038181818- <1>     db  000h, 060h, 030h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   617 00012429 18183C00000000      <1>
   618 00012430 00C60010386CC6C6FE- <1>     db  000h, 0c6h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   618 00012439 C6C6C600000000      <1>
   619 00012440 386C3800386CC6C6FE- <1>     db  038h, 06ch, 038h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   619 00012449 C6C6C600000000      <1>
   620 00012450 18306000FE66607C60- <1>     db  018h, 030h, 060h, 000h, 0feh, 066h, 060h, 07ch, 060h, 060h, 066h, 0feh, 000h, 000h, 000h, 000h
   620 00012459 6066FE00000000      <1>
   621 00012460 00000000006E3B1B7E- <1>     db  000h, 000h, 000h, 000h, 000h, 06eh, 03bh, 01bh, 07eh, 0d8h, 0dch, 077h, 000h, 000h, 000h, 000h
   621 00012469 D8DC7700000000      <1>
   622 00012470 00003E6CCCCCFECCCC- <1>     db  000h, 000h, 03eh, 06ch, 0cch, 0cch, 0feh, 0cch, 0cch, 0cch, 0cch, 0ceh, 000h, 000h, 000h, 000h
   622 00012479 CCCCCE00000000      <1>
   623 00012480 0010386C007CC6C6C6- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   623 00012489 C6C67C00000000      <1>
   624 00012490 0000C600007CC6C6C6- <1>     db  000h, 000h, 0c6h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   624 00012499 C6C67C00000000      <1>
   625 000124A0 00603018007CC6C6C6- <1>     db  000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   625 000124A9 C6C67C00000000      <1>
   626 000124B0 003078CC00CCCCCCCC- <1>     db  000h, 030h, 078h, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   626 000124B9 CCCC7600000000      <1>
   627 000124C0 0060301800CCCCCCCC- <1>     db  000h, 060h, 030h, 018h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   627 000124C9 CCCC7600000000      <1>
   628 000124D0 0000C60000C6C6C6C6- <1>     db  000h, 000h, 0c6h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 078h, 000h
   628 000124D9 C6C67E060C7800      <1>
   629 000124E0 00C6007CC6C6C6C6C6- <1>     db  000h, 0c6h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   629 000124E9 C6C67C00000000      <1>
   630 000124F0 00C600C6C6C6C6C6C6- <1>     db  000h, 0c6h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   630 000124F9 C6C67C00000000      <1>
   631 00012500 0018187EC3C0C0C0C3- <1>     db  000h, 018h, 018h, 07eh, 0c3h, 0c0h, 0c0h, 0c0h, 0c3h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h
   631 00012509 7E181800000000      <1>
   632 00012510 00386C6460F0606060- <1>     db  000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 060h, 0e6h, 0fch, 000h, 000h, 000h, 000h
   632 00012519 60E6FC00000000      <1>
   633 00012520 0000C3663C18FF18FF- <1>     db  000h, 000h, 0c3h, 066h, 03ch, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   633 00012529 18181800000000      <1>
   634 00012530 00FC66667C62666F66- <1>     db  000h, 0fch, 066h, 066h, 07ch, 062h, 066h, 06fh, 066h, 066h, 066h, 0f3h, 000h, 000h, 000h, 000h
   634 00012539 6666F300000000      <1>
   635 00012540 000E1B1818187E1818- <1>     db  000h, 00eh, 01bh, 018h, 018h, 018h, 07eh, 018h, 018h, 018h, 018h, 018h, 0d8h, 070h, 000h, 000h
   635 00012549 181818D8700000      <1>
   636 00012550 0018306000780C7CCC- <1>     db  000h, 018h, 030h, 060h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   636 00012559 CCCC7600000000      <1>
   637 00012560 000C18300038181818- <1>     db  000h, 00ch, 018h, 030h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   637 00012569 18183C00000000      <1>
   638 00012570 00183060007CC6C6C6- <1>     db  000h, 018h, 030h, 060h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   638 00012579 C6C67C00000000      <1>
   639 00012580 0018306000CCCCCCCC- <1>     db  000h, 018h, 030h, 060h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   639 00012589 CCCC7600000000      <1>
   640 00012590 000076DC00DC666666- <1>     db  000h, 000h, 076h, 0dch, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 000h, 000h, 000h
   640 00012599 66666600000000      <1>
   641 000125A0 76DC00C6E6F6FEDECE- <1>     db  076h, 0dch, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   641 000125A9 C6C6C600000000      <1>
   642 000125B0 003C6C6C3E007E0000- <1>     db  000h, 03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   642 000125B9 00000000000000      <1>
   643 000125C0 00386C6C38007C0000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   643 000125C9 00000000000000      <1>
   644 000125D0 0000303000303060C0- <1>     db  000h, 000h, 030h, 030h, 000h, 030h, 030h, 060h, 0c0h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   644 000125D9 C6C67C00000000      <1>
   645 000125E0 000000000000FEC0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h
   645 000125E9 C0C00000000000      <1>
   646 000125F0 000000000000FE0606- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0feh, 006h, 006h, 006h, 006h, 000h, 000h, 000h, 000h, 000h
   646 000125F9 06060000000000      <1>
   647 00012600 00C0C0C2C6CC183060- <1>     db  000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 060h, 0ceh, 09bh, 006h, 00ch, 01fh, 000h, 000h
   647 00012609 CE9B060C1F0000      <1>
   648 00012610 00C0C0C2C6CC183066- <1>     db  000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 066h, 0ceh, 096h, 03eh, 006h, 006h, 000h, 000h
   648 00012619 CE963E06060000      <1>
   649 00012620 00001818001818183C- <1>     db  000h, 000h, 018h, 018h, 000h, 018h, 018h, 018h, 03ch, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h
   649 00012629 3C3C1800000000      <1>
   650 00012630 0000000000366CD86C- <1>     db  000h, 000h, 000h, 000h, 000h, 036h, 06ch, 0d8h, 06ch, 036h, 000h, 000h, 000h, 000h, 000h, 000h
   650 00012639 36000000000000      <1>
   651 00012640 0000000000D86C366C- <1>     db  000h, 000h, 000h, 000h, 000h, 0d8h, 06ch, 036h, 06ch, 0d8h, 000h, 000h, 000h, 000h, 000h, 000h
   651 00012649 D8000000000000      <1>
   652 00012650 114411441144114411- <1>     db  011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h
   652 00012659 44114411441144      <1>
   653 00012660 55AA55AA55AA55AA55- <1>     db  055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah
   653 00012669 AA55AA55AA55AA      <1>
   654 00012670 DD77DD77DD77DD77DD- <1>     db  0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h
   654 00012679 77DD77DD77DD77      <1>
   655 00012680 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   655 00012689 18181818181818      <1>
   656 00012690 18181818181818F818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   656 00012699 18181818181818      <1>
   657 000126A0 1818181818F818F818- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   657 000126A9 18181818181818      <1>
   658 000126B0 36363636363636F636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   658 000126B9 36363636363636      <1>
   659 000126C0 00000000000000FE36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   659 000126C9 36363636363636      <1>
   660 000126D0 0000000000F818F818- <1>     db  000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   660 000126D9 18181818181818      <1>
   661 000126E0 3636363636F606F636- <1>     db  036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   661 000126E9 36363636363636      <1>
   662 000126F0 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   662 000126F9 36363636363636      <1>
   663 00012700 0000000000FE06F636- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   663 00012709 36363636363636      <1>
   664 00012710 3636363636F606FE00- <1>     db  036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   664 00012719 00000000000000      <1>
   665 00012720 36363636363636FE00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   665 00012729 00000000000000      <1>
   666 00012730 1818181818F818F800- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   666 00012739 00000000000000      <1>
   667 00012740 00000000000000F818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   667 00012749 18181818181818      <1>
   668 00012750 181818181818181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   668 00012759 00000000000000      <1>
   669 00012760 18181818181818FF00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   669 00012769 00000000000000      <1>
   670 00012770 00000000000000FF18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   670 00012779 18181818181818      <1>
   671 00012780 181818181818181F18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   671 00012789 18181818181818      <1>
   672 00012790 00000000000000FF00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   672 00012799 00000000000000      <1>
   673 000127A0 18181818181818FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   673 000127A9 18181818181818      <1>
   674 000127B0 18181818181F181F18- <1>     db  018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   674 000127B9 18181818181818      <1>
   675 000127C0 363636363636363736- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   675 000127C9 36363636363636      <1>
   676 000127D0 363636363637303F00- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   676 000127D9 00000000000000      <1>
   677 000127E0 00000000003F303736- <1>     db  000h, 000h, 000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   677 000127E9 36363636363636      <1>
   678 000127F0 3636363636F700FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   678 000127F9 00000000000000      <1>
   679 00012800 0000000000FF00F736- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   679 00012809 36363636363636      <1>
   680 00012810 363636363637303736- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   680 00012819 36363636363636      <1>
   681 00012820 0000000000FF00FF00- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   681 00012829 00000000000000      <1>
   682 00012830 3636363636F700F736- <1>     db  036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   682 00012839 36363636363636      <1>
   683 00012840 1818181818FF00FF00- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   683 00012849 00000000000000      <1>
   684 00012850 36363636363636FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   684 00012859 00000000000000      <1>
   685 00012860 0000000000FF00FF18- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   685 00012869 18181818181818      <1>
   686 00012870 00000000000000FF36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   686 00012879 36363636363636      <1>
   687 00012880 363636363636363F00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   687 00012889 00000000000000      <1>
   688 00012890 18181818181F181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   688 00012899 00000000000000      <1>
   689 000128A0 00000000001F181F18- <1>     db  000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   689 000128A9 18181818181818      <1>
   690 000128B0 000000000000003F36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   690 000128B9 36363636363636      <1>
   691 000128C0 36363636363636FF36- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   691 000128C9 36363636363636      <1>
   692 000128D0 1818181818FF18FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   692 000128D9 18181818181818      <1>
   693 000128E0 18181818181818F800- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   693 000128E9 00000000000000      <1>
   694 000128F0 000000000000001F18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   694 000128F9 18181818181818      <1>
   695 00012900 FFFFFFFFFFFFFFFFFF- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   695 00012909 FFFFFFFFFFFFFF      <1>
   696 00012910 00000000000000FFFF- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   696 00012919 FFFFFFFFFFFFFF      <1>
   697 00012920 F0F0F0F0F0F0F0F0F0- <1>     db  0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   697 00012929 F0F0F0F0F0F0F0      <1>
   698 00012930 0F0F0F0F0F0F0F0F0F- <1>     db  00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh
   698 00012939 0F0F0F0F0F0F0F      <1>
   699 00012940 FFFFFFFFFFFFFF0000- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   699 00012949 00000000000000      <1>
   700 00012950 000000000076DCD8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 0d8h, 0d8h, 0d8h, 0dch, 076h, 000h, 000h, 000h, 000h
   700 00012959 D8DC7600000000      <1>
   701 00012960 000078CCCCCCD8CCC6- <1>     db  000h, 000h, 078h, 0cch, 0cch, 0cch, 0d8h, 0cch, 0c6h, 0c6h, 0c6h, 0cch, 000h, 000h, 000h, 000h
   701 00012969 C6C6CC00000000      <1>
   702 00012970 0000FEC6C6C0C0C0C0- <1>     db  000h, 000h, 0feh, 0c6h, 0c6h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h
   702 00012979 C0C0C000000000      <1>
   703 00012980 00000000FE6C6C6C6C- <1>     db  000h, 000h, 000h, 000h, 0feh, 06ch, 06ch, 06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h
   703 00012989 6C6C6C00000000      <1>
   704 00012990 000000FEC660301830- <1>     db  000h, 000h, 000h, 0feh, 0c6h, 060h, 030h, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   704 00012999 60C6FE00000000      <1>
   705 000129A0 00000000007ED8D8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 0d8h, 0d8h, 070h, 000h, 000h, 000h, 000h
   705 000129A9 D8D87000000000      <1>
   706 000129B0 000000006666666666- <1>     db  000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0c0h, 000h, 000h, 000h
   706 000129B9 7C6060C0000000      <1>
   707 000129C0 0000000076DC181818- <1>     db  000h, 000h, 000h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   707 000129C9 18181800000000      <1>
   708 000129D0 0000007E183C666666- <1>     db  000h, 000h, 000h, 07eh, 018h, 03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h
   708 000129D9 3C187E00000000      <1>
   709 000129E0 000000386CC6C6FEC6- <1>     db  000h, 000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h
   709 000129E9 C66C3800000000      <1>
   710 000129F0 0000386CC6C6C66C6C- <1>     db  000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 06ch, 06ch, 06ch, 06ch, 0eeh, 000h, 000h, 000h, 000h
   710 000129F9 6C6CEE00000000      <1>
   711 00012A00 00001E30180C3E6666- <1>     db  000h, 000h, 01eh, 030h, 018h, 00ch, 03eh, 066h, 066h, 066h, 066h, 03ch, 000h, 000h, 000h, 000h
   711 00012A09 66663C00000000      <1>
   712 00012A10 00000000007EDBDBDB- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 0dbh, 0dbh, 0dbh, 07eh, 000h, 000h, 000h, 000h, 000h, 000h
   712 00012A19 7E000000000000      <1>
   713 00012A20 00000003067EDBDBF3- <1>     db  000h, 000h, 000h, 003h, 006h, 07eh, 0dbh, 0dbh, 0f3h, 07eh, 060h, 0c0h, 000h, 000h, 000h, 000h
   713 00012A29 7E60C000000000      <1>
   714 00012A30 00001C3060607C6060- <1>     db  000h, 000h, 01ch, 030h, 060h, 060h, 07ch, 060h, 060h, 060h, 030h, 01ch, 000h, 000h, 000h, 000h
   714 00012A39 60301C00000000      <1>
   715 00012A40 0000007CC6C6C6C6C6- <1>     db  000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   715 00012A49 C6C6C600000000      <1>
   716 00012A50 00000000FE0000FE00- <1>     db  000h, 000h, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h
   716 00012A59 00FE0000000000      <1>
   717 00012A60 0000000018187E1818- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h
   717 00012A69 0000FF00000000      <1>
   718 00012A70 00000030180C060C18- <1>     db  000h, 000h, 000h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 000h, 07eh, 000h, 000h, 000h, 000h
   718 00012A79 30007E00000000      <1>
   719 00012A80 0000000C1830603018- <1>     db  000h, 000h, 000h, 00ch, 018h, 030h, 060h, 030h, 018h, 00ch, 000h, 07eh, 000h, 000h, 000h, 000h
   719 00012A89 0C007E00000000      <1>
   720 00012A90 00000E1B1B18181818- <1>     db  000h, 000h, 00eh, 01bh, 01bh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   720 00012A99 18181818181818      <1>
   721 00012AA0 1818181818181818D8- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h, 0d8h, 070h, 000h, 000h, 000h, 000h
   721 00012AA9 D8D87000000000      <1>
   722 00012AB0 000000001818007E00- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 07eh, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   722 00012AB9 18180000000000      <1>
   723 00012AC0 000000000076DC0076- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h
   723 00012AC9 DC000000000000      <1>
   724 00012AD0 00386C6C3800000000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   724 00012AD9 00000000000000      <1>
   725 00012AE0 000000000000001818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   725 00012AE9 00000000000000      <1>
   726 00012AF0 000000000000000018- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   726 00012AF9 00000000000000      <1>
   727 00012B00 000F0C0C0C0C0CEC6C- <1>     db  000h, 00fh, 00ch, 00ch, 00ch, 00ch, 00ch, 0ech, 06ch, 06ch, 03ch, 01ch, 000h, 000h, 000h, 000h
   727 00012B09 6C3C1C00000000      <1>
   728 00012B10 00D86C6C6C6C6C0000- <1>     db  000h, 0d8h, 06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   728 00012B19 00000000000000      <1>
   729 00012B20 0070D83060C8F80000- <1>     db  000h, 070h, 0d8h, 030h, 060h, 0c8h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   729 00012B29 00000000000000      <1>
   730 00012B30 000000007C7C7C7C7C- <1>     db  000h, 000h, 000h, 000h, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 000h, 000h, 000h, 000h, 000h
   730 00012B39 7C7C0000000000      <1>
   731 00012B40 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   731 00012B49 00000000000000      <1>
   732                              <1> vgafont14alt:
   733 00012B50 1D000000002466FF66- <1>     db  01dh, 000h, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 022h
   733 00012B59 24000000000022      <1>
   734 00012B60 006363632200000000- <1>     db  000h, 063h, 063h, 063h, 022h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 02bh, 000h
   734 00012B69 00000000002B00      <1>
   735 00012B70 0000181818FF181818- <1>     db  000h, 000h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 02dh, 000h, 000h
   735 00012B79 000000002D0000      <1>
   736 00012B80 00000000FF00000000- <1>     db  000h, 000h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 04dh, 000h, 000h, 0c3h
   736 00012B89 0000004D0000C3      <1>
   737 00012B90 E7FFDBC3C3C3C3C300- <1>     db  0e7h, 0ffh, 0dbh, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 000h, 000h, 000h, 054h, 000h, 000h, 0ffh, 0dbh
   737 00012B99 0000540000FFDB      <1>
   738 00012BA0 9918181818183C0000- <1>     db  099h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 056h, 000h, 000h, 0c3h, 0c3h, 0c3h
   738 00012BA9 00560000C3C3C3      <1>
   739 00012BB0 C3C3C3663C18000000- <1>     db  0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 057h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h
   739 00012BB9 570000C3C3C3C3      <1>
   740 00012BC0 DBDBFF666600000058- <1>     db  0dbh, 0dbh, 0ffh, 066h, 066h, 000h, 000h, 000h, 058h, 000h, 000h, 0c3h, 0c3h, 066h, 03ch, 018h
   740 00012BC9 0000C3C3663C18      <1>
   741 00012BD0 3C66C3C30000005900- <1>     db  03ch, 066h, 0c3h, 0c3h, 000h, 000h, 000h, 059h, 000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h
   741 00012BD9 00C3C3C3663C18      <1>
   742 00012BE0 18183C0000005A0000- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 05ah, 000h, 000h, 0ffh, 0c3h, 086h, 00ch, 018h, 030h, 061h
   742 00012BE9 FFC3860C183061      <1>
   743 00012BF0 C3FF0000006D000000- <1>     db  0c3h, 0ffh, 000h, 000h, 000h, 06dh, 000h, 000h, 000h, 000h, 000h, 0e6h, 0ffh, 0dbh, 0dbh, 0dbh
   743 00012BF9 0000E6FFDBDBDB      <1>
   744 00012C00 DB0000007600000000- <1>     db  0dbh, 000h, 000h, 000h, 076h, 000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h
   744 00012C09 00C3C3C3663C18      <1>
   745 00012C10 000000770000000000- <1>     db  000h, 000h, 000h, 077h, 000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 000h
   745 00012C19 C3C3DBDBFF6600      <1>
   746 00012C20 000091000000006E3B- <1>     db  000h, 000h, 091h, 000h, 000h, 000h, 000h, 06eh, 03bh, 01bh, 07eh, 0d8h, 0dch, 077h, 000h, 000h
   746 00012C29 1B7ED8DC770000      <1>
   747 00012C30 009B0018187EC3C0C0- <1>     db  000h, 09bh, 000h, 018h, 018h, 07eh, 0c3h, 0c0h, 0c0h, 0c3h, 07eh, 018h, 018h, 000h, 000h, 000h
   747 00012C39 C37E1818000000      <1>
   748 00012C40 9D0000C3663C18FF18- <1>     db  09dh, 000h, 000h, 0c3h, 066h, 03ch, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 000h, 000h, 000h, 09eh
   748 00012C49 FF18180000009E      <1>
   749 00012C50 00FC66667C62666F66- <1>     db  000h, 0fch, 066h, 066h, 07ch, 062h, 066h, 06fh, 066h, 066h, 0f3h, 000h, 000h, 000h, 0f1h, 000h
   749 00012C59 66F3000000F100      <1>
   750 00012C60 00181818FF18181800- <1>     db  000h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h, 000h, 0ffh, 000h, 000h, 000h, 0f6h, 000h, 000h
   750 00012C69 FF000000F60000      <1>
   751 00012C70 18180000FF00001818- <1>     db  018h, 018h, 000h, 000h, 0ffh, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   751 00012C79 00000000            <1>
   752                              <1> vgafont16alt:
   753 00012C7D 1D00000000002466FF- <1>     db  01dh, 000h, 000h, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h, 000h, 000h, 000h
   753 00012C86 66240000000000      <1>
   754 00012C8D 003000003C66C3C3DB- <1>     db  000h, 030h, 000h, 000h, 03ch, 066h, 0c3h, 0c3h, 0dbh, 0dbh, 0c3h, 0c3h, 066h, 03ch, 000h, 000h
   754 00012C96 DBC3C3663C0000      <1>
   755 00012C9D 00004D0000C3E7FFFF- <1>     db  000h, 000h, 04dh, 000h, 000h, 0c3h, 0e7h, 0ffh, 0ffh, 0dbh, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 000h
   755 00012CA6 DBC3C3C3C3C300      <1>
   756 00012CAD 000000540000FFDB99- <1>     db  000h, 000h, 000h, 054h, 000h, 000h, 0ffh, 0dbh, 099h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch
   756 00012CB6 1818181818183C      <1>
   757 00012CBD 00000000560000C3C3- <1>     db  000h, 000h, 000h, 000h, 056h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch
   757 00012CC6 C3C3C3C3C3663C      <1>
   758 00012CCD 1800000000570000C3- <1>     db  018h, 000h, 000h, 000h, 000h, 057h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh
   758 00012CD6 C3C3C3C3DBDBFF      <1>
   759 00012CDD 666600000000580000- <1>     db  066h, 066h, 000h, 000h, 000h, 000h, 058h, 000h, 000h, 0c3h, 0c3h, 066h, 03ch, 018h, 018h, 03ch
   759 00012CE6 C3C3663C18183C      <1>
   760 00012CED 66C3C3000000005900- <1>     db  066h, 0c3h, 0c3h, 000h, 000h, 000h, 000h, 059h, 000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h
   760 00012CF6 00C3C3C3663C18      <1>
   761 00012CFD 1818183C000000005A- <1>     db  018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 05ah, 000h, 000h, 0ffh, 0c3h, 086h, 00ch, 018h
   761 00012D06 0000FFC3860C18      <1>
   762 00012D0D 3060C1C3FF00000000- <1>     db  030h, 060h, 0c1h, 0c3h, 0ffh, 000h, 000h, 000h, 000h, 06dh, 000h, 000h, 000h, 000h, 000h, 0e6h
   762 00012D16 6D0000000000E6      <1>
   763 00012D1D FFDBDBDBDBDB000000- <1>     db  0ffh, 0dbh, 0dbh, 0dbh, 0dbh, 0dbh, 000h, 000h, 000h, 000h, 076h, 000h, 000h, 000h, 000h, 000h
   763 00012D26 00760000000000      <1>
   764 00012D2D C3C3C3C3663C180000- <1>     db  0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 000h, 077h, 000h, 000h, 000h, 000h
   764 00012D36 00007700000000      <1>
   765 00012D3D 00C3C3C3DBDBFF6600- <1>     db  000h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 000h, 000h, 000h, 000h, 078h, 000h, 000h, 000h
   765 00012D46 00000078000000      <1>
   766 00012D4D 0000C3663C183C66C3- <1>     db  000h, 000h, 0c3h, 066h, 03ch, 018h, 03ch, 066h, 0c3h, 000h, 000h, 000h, 000h, 091h, 000h, 000h
   766 00012D56 00000000910000      <1>
   767 00012D5D 0000006E3B1B7ED8DC- <1>     db  000h, 000h, 000h, 06eh, 03bh, 01bh, 07eh, 0d8h, 0dch, 077h, 000h, 000h, 000h, 000h, 09bh, 000h
   767 00012D66 77000000009B00      <1>
   768 00012D6D 18187EC3C0C0C0C37E- <1>     db  018h, 018h, 07eh, 0c3h, 0c0h, 0c0h, 0c0h, 0c3h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h, 09dh
   768 00012D76 1818000000009D      <1>
   769 00012D7D 0000C3663C18FF18FF- <1>     db  000h, 000h, 0c3h, 066h, 03ch, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   769 00012D86 18181800000000      <1>
   770 00012D8D 9E00FC66667C62666F- <1>     db  09eh, 000h, 0fch, 066h, 066h, 07ch, 062h, 066h, 06fh, 066h, 066h, 066h, 0f3h, 000h, 000h, 000h
   770 00012D96 666666F3000000      <1>
   771 00012D9D 00AB00C0C0C2C6CC18- <1>     db  000h, 0abh, 000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 060h, 0ceh, 09bh, 006h, 00ch, 01fh
   771 00012DA6 3060CE9B060C1F      <1>
   772 00012DAD 0000AC00C0C0C2C6CC- <1>     db  000h, 000h, 0ach, 000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 066h, 0ceh, 096h, 03eh, 006h
   772 00012DB6 183066CE963E06      <1>
   773 00012DBD 06000000            <1>     db  006h, 000h, 000h, 000h
  2614                                  
  2615 00012DC1 90<rept>                align 16
  2616                                  
  2617                                  KERNELFSIZE  equ $  ; 04/07/2016
  2618                                  
  2619                                  align 2
  2620                                  
  2621                                  ; EPOCH Variables
  2622                                  ; 13/04/2015 - Retro UNIX 386 v1 Beginning
  2623                                  ; 09/04/2013 epoch variables
  2624                                  ; Retro UNIX 8086 v1 Prototype: UNIXCOPY.ASM, 10/03/2013
  2625                                  ;
  2626 00012DD0 B207                    year: 	dw 1970
  2627 00012DD2 0100                    month: 	dw 1
  2628 00012DD4 0100                    day: 	dw 1
  2629 00012DD6 0000                    hour: 	dw 0
  2630 00012DD8 0000                    minute: dw 0
  2631 00012DDA 0000                    second: dw 0
  2632                                  
  2633                                  DMonth:
  2634 00012DDC 0000                    	dw 0
  2635 00012DDE 1F00                    	dw 31
  2636 00012DE0 3B00                    	dw 59
  2637 00012DE2 5A00                    	dw 90
  2638 00012DE4 7800                    	dw 120
  2639 00012DE6 9700                    	dw 151
  2640 00012DE8 B500                    	dw 181
  2641 00012DEA D400                    	dw 212
  2642 00012DEC F300                    	dw 243
  2643 00012DEE 1101                    	dw 273
  2644 00012DF0 3001                    	dw 304
  2645 00012DF2 4E01                    	dw 334
  2646                                  
  2647                                  bss_start:
  2648                                  
  2649                                  ABSOLUTE bss_start
  2650                                  
  2651 00012DF4 <res 00000004>          alignb 8 ; 25/12/2016
  2652                                  
  2653                                  	; 15/04/2016
  2654                                  	; TRDOS 386 (TRDOS v2.0)
  2655                                  	; 	80 interrupts 	
  2656                                  	; 11/03/2015
  2657                                  	; Interrupt Descriptor Table (20/08/2014)
  2658                                  idt:
  2659                                  	;resb	64*8 ; INT 0 to INT 3Fh
  2660                                  	; 15/04/2016
  2661 00012DF8 <res 00000280>          	resb	80*8 ; INT 0 to INT 4Fh
  2662                                  
  2663                                  idt_end:
  2664                                  
  2665                                  ;alignb 4
  2666                                  
  2667                                  task_state_segment:
  2668                                  	; 24/03/2015
  2669 00013078 <res 00000002>          tss.link:   resw 1
  2670 0001307A <res 00000002>          	    resw 1
  2671                                  ; tss offset 4	
  2672 0001307C <res 00000004>          tss.esp0:   resd 1
  2673 00013080 <res 00000002>          tss.ss0:    resw 1
  2674 00013082 <res 00000002>          	    resw 1	
  2675 00013084 <res 00000004>          tss.esp1:   resd 1
  2676 00013088 <res 00000002>          tss.ss1:    resw 1
  2677 0001308A <res 00000002>          	    resw 1 	
  2678 0001308C <res 00000004>          tss.esp2:   resd 1
  2679 00013090 <res 00000002>          tss.ss2:    resw 1
  2680 00013092 <res 00000002>          	    resw 1
  2681                                  ; tss offset 28
  2682 00013094 <res 00000004>          tss.CR3:    resd 1
  2683 00013098 <res 00000004>          tss.eip:    resd 1
  2684 0001309C <res 00000004>          tss.eflags: resd 1
  2685                                  ; tss offset 40
  2686 000130A0 <res 00000004>          tss.eax:    resd 1		 		
  2687 000130A4 <res 00000004>          tss.ecx:    resd 1
  2688 000130A8 <res 00000004>          tss.edx:    resd 1
  2689 000130AC <res 00000004>          tss.ebx:    resd 1
  2690 000130B0 <res 00000004>          tss.esp:    resd 1
  2691 000130B4 <res 00000004>          tss.ebp:    resd 1
  2692 000130B8 <res 00000004>          tss.esi:    resd 1
  2693 000130BC <res 00000004>          tss.edi:    resd 1
  2694                                  ; tss offset 72
  2695 000130C0 <res 00000002>          tss.ES:     resw 1
  2696 000130C2 <res 00000002>          	    resw 1	
  2697 000130C4 <res 00000002>          tss.CS:	    resw 1
  2698 000130C6 <res 00000002>          	    resw 1
  2699 000130C8 <res 00000002>          tss.SS:	    resw 1
  2700 000130CA <res 00000002>          	    resw 1
  2701 000130CC <res 00000002>          tss.DS:	    resw 1
  2702 000130CE <res 00000002>          	    resw 1
  2703 000130D0 <res 00000002>          tss.FS:	    resw 1
  2704 000130D2 <res 00000002>          	    resw 1
  2705 000130D4 <res 00000002>          tss.GS:	    resw 1
  2706 000130D6 <res 00000002>          	    resw 1		
  2707 000130D8 <res 00000002>          tss.LDTR:   resw 1
  2708 000130DA <res 00000002>          	    resw 1
  2709                                  ; tss offset 100		
  2710 000130DC <res 00000002>          	    resw 1		
  2711 000130DE <res 00000002>          tss.IOPB:   resw 1
  2712                                  ; tss offset 104 
  2713                                  tss_end:
  2714                                  
  2715 000130E0 <res 00000004>          k_page_dir:  resd 1 ; Kernel's (System) Page Directory address
  2716                                  		    ; (Physical address = Virtual address)	 	
  2717 000130E4 <res 00000004>          memory_size: resd 1 ; memory size in pages
  2718 000130E8 <res 00000004>          free_pages:  resd 1 ; number of free pages		
  2719 000130EC <res 00000004>          next_page:   resd 1 ; offset value in M.A.T. for
  2720                                  		    ; first free page search
  2721 000130F0 <res 00000004>          last_page:   resd 1 ; offset value in M.A.T. which
  2722                                  		    ; next free page search will be
  2723                                  		    ; stopped after it. (end of M.A.T.)
  2724 000130F4 <res 00000004>          first_page:  resd 1 ; offset value in M.A.T. which
  2725                                  		    ; first free page search
  2726                                  		    ; will be started on it. (for user)
  2727 000130F8 <res 00000004>          mat_size:    resd 1 ; Memory Allocation Table size in pages		
  2728                                  
  2729                                  ; 02/09/2014 (Retro UNIX 386 v1)
  2730                                  ; 04/12/2013 (Retro UNIX 8086 v1)
  2731 000130FC <res 00000002>          CRT_START:   resw 1 	  ; starting address in regen buffer
  2732                                  			  ; NOTE: active page only	
  2733 000130FE <res 00000010>          CURSOR_POSN: resw 8 ; cursor positions for video pages
  2734                                  ACTIVE_PAGE: 
  2735 0001310E <res 00000001>          ptty: 	     resb 1 ; current tty
  2736                                  ; 01/07/2015 - 29/01/2016
  2737 0001310F <res 00000001>          ccolor:	     resb 1 ; current color attribute
  2738                                  ; 26/10/2015
  2739                                  ; 07/09/2014
  2740 00013110 <res 00000014>          ttychr:      resw ntty+2 ; Character buffer (multiscreen)
  2741                                  
  2742                                  ; 18/05/2015 (03/06/2013 - Retro UNIX 8086 v1 feature only!)
  2743 00013124 <res 00000004>          p_time:      resd 1     ; present time (for systime & sysmdate)
  2744                                  
  2745                                  ; 18/05/2015 (16/08/2013 - Retro UNIX 8086 v1 feature only !)
  2746                                  ; (open mode locks for pseudo TTYs)
  2747                                  ; [ major tty locks (return error in any conflicts) ]
  2748 00013128 <res 00000014>          ttyl:        resw ntty+2 ; opening locks for TTYs.
  2749                                  
  2750                                  ; 15/04/2015 (Retro UNIX 386 v1)
  2751                                  ; 22/09/2013 (Retro UNIX 8086 v1)
  2752 0001313C <res 0000000A>          wlist:       resb ntty+2 ; wait channel list (0 to 9 for TTYs)
  2753                                  ; 15/04/2015 (Retro UNIX 386 v1)
  2754                                  ;; 12/07/2014 -> sp_init set comm. parameters as 0E3h
  2755                                  ;; 0 means serial port is not available 
  2756                                  ;;comprm: ; 25/06/2014
  2757 00013146 <res 00000001>          com1p:       resb 1  ;;0E3h
  2758 00013147 <res 00000001>          com2p:       resb 1  ;;0E3h
  2759                                  
  2760                                  ; 17/11/2015
  2761                                  ; request for response (from the terminal)	
  2762 00013148 <res 00000002>          req_resp:    resw 1 			
  2763                                  ; 07/11/2015
  2764 0001314A <res 00000001>          ccomport:    resb 1 ; current COM (serial) port
  2765                                  		    ; (0= COM1, 1= COM2)
  2766                                  ; 09/11/2015
  2767 0001314B <res 00000001>          comqr:	     resb 1 ; 'query or response' sign (u9.s, 'sndc')
  2768                                  ; 07/11/2015
  2769 0001314C <res 00000002>          rchar:	     resw 1 ; last received char for COM 1 and COM 2		
  2770 0001314E <res 00000002>          schar:	     resw 1 ; last sent char for COM 1 and COM 2
  2771                                  
  2772                                  ; 22/08/2014 (RTC)
  2773                                  ; (Packed BCD)
  2774 00013150 <res 00000001>          time_seconds: resb 1
  2775 00013151 <res 00000001>          time_minutes: resb 1
  2776 00013152 <res 00000001>          time_hours:   resb 1
  2777 00013153 <res 00000001>          date_wday:    resb 1
  2778 00013154 <res 00000001>          date_day:     resb 1
  2779 00013155 <res 00000001>          date_month:   resb 1			
  2780 00013156 <res 00000001>          date_year:    resb 1
  2781 00013157 <res 00000001>          date_century: resb 1
  2782                                  
  2783                                  ; 24/01/2016
  2784 00013158 <res 00000004>          RTC_LH:	       resd 1
  2785 0001315C <res 00000001>          RTC_WAIT_FLAG: resb 1
  2786 0001315D <res 00000001>          USER_FLAG:     resb 1
  2787                                  ; 19/05/2016
  2788                                  ;RTC_second:
  2789 0001315E <res 00000001>          RTC_2Hz:       resb 1 ;  from 2Hz interrupt to 1Hz timer event function	
  2790                                  
  2791                                  %include 'diskbss.s'	; UNINITIALIZED DISK (BIOS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - diskbss.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 24/01/2016
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Turkish Rational DOS
    11                              <1> ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                              <1> ;
    13                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    14                              <1> ; diskbss.inc (10/07/2015)
    15                              <1> ;
    16                              <1> ; Derived from 'IBM PC-XT-286' BIOS source code (1986) 
    17                              <1> ; ****************************************************************************
    18                              <1> 
    19                              <1> ; Retro UNIX 386 v1 Kernel - DISKBSS.INC
    20                              <1> ; Last Modification: 10/07/2015
    21                              <1> ;	(Unnitialized Disk Parameters Data section for 'DISKIO.INC') 
    22                              <1> 
    23 0001315F <res 00000001>      <1> alignb 2
    24                              <1> 
    25                              <1> ;----------------------------------------
    26                              <1> ;	TIMER DATA AREA 		:
    27                              <1> ;----------------------------------------
    28                              <1> 
    29                              <1> TIMER_LH:	; 16/02/205
    30 00013160 <res 00000002>      <1> TIMER_LOW:      resw	1               ; LOW WORD OF TIMER COUNT
    31 00013162 <res 00000002>      <1> TIMER_HIGH:     resw	1               ; HIGH WORD OF TIMER COUNT
    32 00013164 <res 00000001>      <1> TIMER_OFL:      resb 	1               ; TIMER HAS ROLLED OVER SINCE LAST READ
    33                              <1> 
    34                              <1> ;----------------------------------------
    35                              <1> ;	DISKETTE DATA AREAS		:
    36                              <1> ;----------------------------------------
    37                              <1> 
    38 00013165 <res 00000001>      <1> SEEK_STATUS:	resb	1
    39 00013166 <res 00000001>      <1> MOTOR_STATUS:	resb	1
    40 00013167 <res 00000001>      <1> MOTOR_COUNT:	resb	1
    41 00013168 <res 00000001>      <1> DSKETTE_STATUS:	resb	1
    42 00013169 <res 00000007>      <1> NEC_STATUS:	resb	7
    43                              <1> 
    44                              <1> ;----------------------------------------
    45                              <1> ;	ADDITIONAL MEDIA DATA		:
    46                              <1> ;----------------------------------------
    47                              <1> 
    48 00013170 <res 00000001>      <1> LASTRATE:	resb 	1
    49 00013171 <res 00000001>      <1> HF_STATUS:	resb 	1
    50 00013172 <res 00000001>      <1> HF_ERROR:	resb 	1
    51 00013173 <res 00000001>      <1> HF_INT_FLAG:	resb 	1
    52 00013174 <res 00000001>      <1> HF_CNTRL:	resb 	1
    53 00013175 <res 00000004>      <1> DSK_STATE:	resb 	4
    54 00013179 <res 00000002>      <1> DSK_TRK:	resb 	2
    55                              <1> 
    56                              <1> ;----------------------------------------
    57                              <1> ;	FIXED DISK DATA AREAS		:
    58                              <1> ;----------------------------------------
    59                              <1> 
    60 0001317B <res 00000001>      <1> DISK_STATUS1:	resb 	1		; FIXED DISK STATUS
    61 0001317C <res 00000001>      <1> HF_NUM:		resb 	1		; COUNT OF FIXED DISK DRIVES
    62 0001317D <res 00000001>      <1> CONTROL_BYTE:	resb 	1		; HEAD CONTROL BYTE
    63                              <1> ;@PORT_OFF	resb	1		; RESERVED (PORT OFFSET)
    64                              <1> ;port1_off	resb	1		; Hard disk controller 1 - port offset
    65                              <1> ;port2_off	resb	1		; Hard idsk controller 2 - port offset
    66                              <1> 
    67 0001317E <res 00000002>      <1> alignb 4
    68                              <1> 
    69                              <1> ;HF_TBL_VEC:	resd	1 		; Primary master disk param. tbl. pointer
    70                              <1> ;HF1_TBL_VEC:	resd	1		; Primary slave disk param. tbl. pointer
    71                              <1> HF_TBL_VEC: ; 22/12/2014	
    72 00013180 <res 00000004>      <1> HDPM_TBL_VEC:	resd	1 		; Primary master disk param. tbl. pointer
    73 00013184 <res 00000004>      <1> HDPS_TBL_VEC:	resd	1		; Primary slave disk param. tbl. pointer
    74 00013188 <res 00000004>      <1> HDSM_TBL_VEC:	resd	1 		; Secondary master disk param. tbl. pointer
    75 0001318C <res 00000004>      <1> HDSS_TBL_VEC:	resd	1		; Secondary slave disk param. tbl. pointer
    76                              <1> 
    77                              <1> ; 03/01/2015
    78 00013190 <res 00000001>      <1> LBAMode:     	resb	1
    79                              <1> 
    80                              <1> ; *****************************************************************************
  2792                                  
  2793                                  ;;; Real Mode Data (10/07/2015 - BSS)
  2794                                  
  2795                                  ;alignb 2
  2796                                  
  2797                                  ; 10/01/2016
  2798                                  %include 'trdoskx.s'	; UNINITIALIZED KERNEL (Logical Drive & FS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - UNINITIALIZED DATA : trdoskx.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 15/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 04/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    11                              <1> ; TRDOS2.ASM (09/11/2011)
    12                              <1> ; ****************************************************************************
    13                              <1> ; DRV_INIT.ASM [26/09/2009] Last Update: 07/08/2011
    14                              <1> ; MAINPROG.ASM [17/01/2004] Last Update: 09/11/2011
    15                              <1> ; DIR.ASM      [17/01/2004] Last Update: 09/10/2011
    16                              <1> ; CMD_INTR.ASM [29/01/2005] Last update: 09/11/2011
    17                              <1> ; DRV_FAT.ASM  [07/07/2009] Last update: 21/08/2011
    18                              <1> 
    19 00013191 <res 00000003>      <1> alignb 4
    20                              <1> 
    21                              <1> ; MAINPROG.ASM
    22 00013194 <res 00000004>      <1> MainProgCfg_FileSize:   resd 1 ; 14/04/2016
    23 00013198 <res 00000004>      <1> MainProgCfg_LineOffset: resd 1 ; 14/04/2016
    24                              <1> 
    25 0001319C <res 00000004>      <1> Current_VolSerial: resd 1
    26                              <1> 
    27 000131A0 <res 00000004>      <1> Current_Dir_FCluster: resd 1
    28                              <1> 
    29 000131A4 <res 00000001>      <1> Current_Dir_Level: resb 1
    30 000131A5 <res 00000001>      <1> Current_FATType: resb 1
    31 000131A6 <res 00000001>      <1> Current_Drv: resb 1
    32 000131A7 <res 00000001>      <1> Current_Dir_Drv:   resb 1 ; '?'
    33 000131A8 <res 00000001>      <1>                    resb 1 ; ':'
    34 000131A9 <res 00000001>      <1> Current_Dir_Root:  resb 1 ; '/' 
    35 000131AA <res 0000005A>      <1> Current_Directory: resb 90
    36 00013204 <res 00000001>      <1> End_Of_Current_Dir_Str: resb 1
    37 00013205 <res 00000001>      <1> Current_Dir_StrLen: resb 1   
    38                              <1> 
    39 00013206 <res 00000001>      <1> CursorColumn: 	resb 1
    40 00013207 <res 00000001>      <1> CmdArgStart:    resb 1
    41                              <1> 
    42                              <1> ; 03/02/2016
    43 00013208 <res 0000004E>      <1> Remark:		resb 78
    44                              <1> 
    45 00013256 <res 00000050>      <1> CommandBuffer: 	resb 80
    46                              <1> 
    47 000132A6 <res 00000100>      <1> TextBuffer:	resb 256
    48                              <1> 
    49                              <1> MasterBootBuff:
    50 000133A6 <res 000001BE>      <1> MasterBootCode: resb 1BEh
    51 00013564 <res 00000040>      <1> PartitionTable: resb 64
    52 000135A4 <res 00000002>      <1> MBIDCode: resw 1
    53                              <1> 
    54                              <1> PTable_Buffer:
    55 000135A6 <res 00000040>      <1> PTable_hd0: resb 64
    56 000135E6 <res 00000040>      <1> PTable_hd1: resb 64
    57 00013626 <res 00000040>      <1> PTable_hd2: resb 64
    58 00013666 <res 00000040>      <1> PTable_hd3: resb 64
    59 000136A6 <res 00000040>      <1> PTable_ep0: resb 64
    60 000136E6 <res 00000040>      <1> PTable_ep1: resb 64
    61 00013726 <res 00000040>      <1> PTable_ep2: resb 64
    62 00013766 <res 00000040>      <1> PTable_ep3: resb 64
    63                              <1> 
    64 000137A6 <res 00000001>      <1> scount:	resb 1 ; 16/05/2016 (diskio.s, 'int33h:')	
    65 000137A7 <res 00000001>      <1> HD_LBA_yes: resb 1
    66 000137A8 <res 00000001>      <1> PP_Counter: resb 1
    67 000137A9 <res 00000001>      <1> EP_Counter: resb 1
    68                              <1> 
    69 000137AA <res 00000004>      <1> EP_StartSector: resd 1
    70 000137AE <res 00000004>      <1>                 resd 1
    71 000137B2 <res 00000004>      <1>                 resd 1
    72 000137B6 <res 00000004>      <1>                 resd 1
    73                              <1> 
    74 000137BA <res 00000200>      <1> DOSBootSectorBuff: resb 512
    75                              <1> 
    76                              <1> FAT_BuffDescriptor:
    77 000139BA <res 00000004>      <1> FAT_CurrentCluster: resd 1
    78 000139BE <res 00000001>      <1> FAT_BuffValidData: resb 1
    79 000139BF <res 00000001>      <1> FAT_BuffDrvName: resb 1
    80 000139C0 <res 00000002>      <1> FAT_BuffOffset: resw 1
    81 000139C2 <res 00000004>      <1> FAT_BuffSector: resd 1
    82                              <1> 
    83 000139C6 <res 00000004>      <1> FAT_ClusterCounter: resd 1
    84 000139CA <res 00000004>      <1> LastCluster: resd 1
    85                              <1> 
    86                              <1> ; 16/05/2016
    87                              <1> ;; 18/03/2016 (TRDOS v2.0)
    88                              <1> ;ClusterBuffer_Valid: resb 1
    89                              <1> 
    90                              <1> Dir_BuffDescriptor:
    91 000139CE <res 00000001>      <1> DirBuff_DRV: resb 1
    92 000139CF <res 00000001>      <1> DirBuff_FATType: resb 1
    93 000139D0 <res 00000001>      <1> DirBuff_ValidData: resb 1
    94 000139D1 <res 00000002>      <1> DirBuff_CurrentEntry: resw 1
    95 000139D3 <res 00000002>      <1> DirBuff_LastEntry: resw 1
    96 000139D5 <res 00000004>      <1> DirBuff_Cluster: resd 1 
    97 000139D9 <res 00000002>      <1> DirBuffer_Size: resw 1
    98                              <1> ;DirBuff_EntryCounter: resw 1
    99                              <1> 
   100                              <1> ; 01/02/2016
   101                              <1> ; these are on (real mode) segment 8000h and later
   102                              <1> ; FAT_Buffer:	resb 1536 ; 3 sectors
   103                              <1> ; Dir_Buffer:	resb 512*32
   104                              <1> ; Logical_DOSDisks:  resb 6656 ; 26 * 256 bytes
   105                              <1> 
   106                              <1> ; 18/01/2016
   107                              <1> 
   108 000139DB <res 00000004>      <1> FreeClusterCount: resd 1
   109                              <1> 
   110 000139DF <res 00000004>      <1> VolSize_Unit1:   resd 1
   111 000139E3 <res 00000004>      <1> VolSize_Unit2:   resd 1
   112                              <1> 
   113 000139E7 <res 00000004>      <1> Vol_Tot_Sec_Str_Start:	    resd 1
   114 000139EB <res 0000000A>      <1> Vol_Tot_Sec_Str: 	    resb 10
   115 000139F5 <res 00000001>      <1> Vol_Tot_Sec_Str_End:	    resb 1
   116 000139F6 <res 00000001>      <1> resb 1
   117 000139F7 <res 00000004>      <1> Vol_Free_Sectors_Str_Start: resd 1
   118 000139FB <res 0000000A>      <1> Vol_Free_Sectors_Str:	    resb 10				
   119 00013A05 <res 00000001>      <1> Vol_Free_Sectors_Str_End:   resb 1
   120                              <1> 
   121                              <1> ; 10/02/2016
   122 00013A06 <res 00000001>      <1> RUN_CDRV: resb 1 ; CMD_INTR.ASM  ; 09/11/2011
   123                              <1> 
   124                              <1> ; 24/01/2016
   125 00013A07 <res 00000080>      <1> PATH_Array:     resb 128 ; DIR.ASM ; 09/10/2011
   126                              <1> ; 06/02/2016
   127 00013A87 <res 00000004>      <1> CCD_DriveDT:	resd 1 ; DIR.ASM ; (word)
   128 00013A8B <res 00000001>      <1> CCD_Level:	resb 1 ; DIR.ASM
   129 00013A8C <res 00000001>      <1> Last_Dir_Level:	resb 1 ; DIR.ASM
   130                              <1> ;
   131 00013A8D <res 00000002>      <1> CDLF_AttributesMask: resw 1 ; DIR.ASM
   132 00013A8F <res 00000004>      <1> CDLF_FNAddress:	resd 1 ; DIR.ASM (word)
   133 00013A93 <res 00000002>      <1> CDLF_DEType:	resw 1 ; DIR.ASM
   134                              <1> ;
   135 00013A95 <res 00000001>      <1> CD_COMMAND:	resb 1 ; DIR.ASM
   136                              <1> 
   137 00013A96 <res 00000002>      <1> alignb 4
   138                              <1> 
   139                              <1> ; 29/01/2016
   140 00013A98 <res 00000001>      <1> Program_Exit:	resb 1 ; CMD_INTR.ASM  ; 09/11/2011
   141                              <1> 
   142                              <1> ;alignb 4
   143                              <1> ; 23/02/2016
   144 00013A99 <res 00000001>      <1> disk_rw_op:	resb 1 ;  0 = disk read, 1 = disk write
   145                              <1> ;disk_rw_spt:	resb 1 ; sectors per track (<= 63) /// (<256)
   146                              <1> ; 31/01/2016
   147 00013A9A <res 00000001>      <1> retry_count: 	resb 1 ; DISK_IO.ASM ; 20/07/2011 (CHS_RetryCount)
   148 00013A9B <res 00000001>      <1> disk_rw_err: 	resb 1 ; DISK_IO.ASM ; (Disk_IO_err_code)
   149 00013A9C <res 00000004>      <1> sector_count:	resd 1 ; DISK_IO.ASM ; (Disk_RW_SectorCount)
   150                              <1> 
   151                              <1> ; 06/02/2016 (long name)
   152 00013AA0 <res 00000002>      <1> FDE_AttrMask:	   resw 1 ; DIR.ASM
   153 00013AA2 <res 00000002>      <1> AmbiguousFileName: resw 1 ; DIR.ASM
   154 00013AA4 <res 00000001>      <1> PreviousAttr:	   resb 1 ; DIR.ASM
   155                              <1> ;	
   156 00013AA5 <res 00000001>      <1> LongNameFound:   resb 1	  ; DIR.ASM
   157 00013AA6 <res 00000001>      <1> LFN_EntryLength: resb 1   ; DIR.ASM
   158 00013AA7 <res 00000001>      <1> LFN_CheckSum:    resb 1   ; DIR.ASM
   159 00013AA8 <res 00000084>      <1> LongFileName:    resb 132 ; DIR.ASM
   160                              <1> 
   161                              <1> ;PATH_Array_Ptr: resw 1 ; DIR.ASM
   162 00013B2C <res 00000001>      <1> PATH_CDLevel:	 resb 1 ; DIR.ASM
   163 00013B2D <res 00000001>      <1> PATH_Level:	 resb 1 ; DIR.ASM
   164                              <1> 
   165                              <1> ; 07/02/2016
   166 00013B2E <res 0000000D>      <1> Dir_File_Name:	resb 13 ; DIR.ASM ; 09/10/2011
   167                              <1> 
   168                              <1> ; 10/02/2016
   169 00013B3B <res 0000000D>      <1> Dir_Entry_Name:	resb 13 ; DIR.ASM
   170                              <1> 
   171                              <1> alignb 2
   172                              <1> 
   173 00013B48 <res 00000002>      <1> AttributesMask: resw 1 ; CMD_INTR.ASM ; 09/11/2011
   174                              <1> 
   175                              <1> ; 10/02/2016 (128 bytes -> 126 bytes)
   176                              <1> ; 08/02/2016
   177                              <1> ;FFF Structure (128 bytes) ; DIR.ASM ; 09/10/2011
   178 00013B4A <res 00000001>      <1> FindFile_Drv:		  resb 1
   179 00013B4B <res 00000041>      <1> FindFile_Directory:	  resb 65
   180 00013B8C <res 0000000D>      <1> FindFile_Name:		  resb 13
   181                              <1> FindFile_LongNameEntryLength:
   182 00013B99 <res 00000001>      <1> FindFile_LongNameYes: 	  resb 1 ; Sign for longname procedures
   183                              <1> ;Above 80 bytes form
   184                              <1> ;TR-DOS Source/Destination File FullName Format/Structure
   185 00013B9A <res 00000002>      <1> FindFile_AttributesMask:  resw 1
   186 00013B9C <res 00000020>      <1> FindFile_DirEntry:	  resb 32
   187 00013BBC <res 00000004>      <1> FindFile_DirFirstCluster: resd 1
   188 00013BC0 <res 00000004>      <1> FindFile_DirCluster:	  resd 1
   189 00013BC4 <res 00000002>      <1> FindFile_DirEntryNumber:  resw 1
   190 00013BC6 <res 00000002>      <1> FindFile_MatchCounter:	  resw 1
   191 00013BC8 <res 00000002>      <1> FindFile_Reserved:	  resw 1 ; 06/03/2016
   192                              <1> 
   193 00013BCA <res 00000004>      <1> First_Path_Pos: resd 1	; DIR.ASM ; 09/10/2011
   194 00013BCE <res 00000004>      <1> Last_Slash_Pos: resd 1	; DIR.ASM 
   195                              <1> 
   196                              <1> ; 10/02/2016
   197 00013BD2 <res 00000002>      <1> File_Count:     resw 1 	; DIR.ASM ; 09/10/2011
   198 00013BD4 <res 00000002>      <1> Dir_Count:      resw 1
   199 00013BD6 <res 00000004>      <1> Total_FSize:    resd 1
   200 00013BDA <res 00000004>      <1> TFS_Dec_Begin:  resd 1
   201 00013BDE <res 0000000A>      <1>                 resb 10
   202 00013BE8 <res 00000001>      <1> TFS_Dec_End:    resb 1
   203                              <1> 
   204 00013BE9 <res 00000001>      <1> PrintDir_RowCounter: resb 1
   205                              <1> 
   206 00013BEA <res 00000002>      <1> alignb 4
   207                              <1> ; 15/02/2015 ('show' command variables)
   208 00013BEC <res 00000004>      <1> Show_FDT:	resd 1
   209 00013BF0 <res 00000004>      <1> Show_LDDDT:	resd 1
   210 00013BF4 <res 00000004>      <1> Show_Cluster:	resd 1
   211 00013BF8 <res 00000004>      <1> Show_FileSize:	resd 1
   212 00013BFC <res 00000004>      <1> Show_FilePointer: resd 1
   213 00013C00 <res 00000002>      <1> Show_ClusterPointer: resw 1
   214 00013C02 <res 00000002>      <1> Show_ClusterSize: resw 1
   215 00013C04 <res 00000001>      <1> Show_RowCount:	resb 1
   216                              <1> 
   217 00013C05 <res 00000003>      <1> alignb 4
   218                              <1> ; 21/02/2016
   219 00013C08 <res 00000004>      <1> DelFile_FNPointer:	resd 1 ; ; CMD_INTR.ASM (word) ; 09/11/2011
   220                              <1> ; 27/02/2016
   221                              <1> ; DIR.ASM (09/10/2011)
   222 00013C0C <res 00000004>      <1> DelFile_FCluster:	resd 1
   223 00013C10 <res 00000002>      <1> DelFile_EntryCounter:	resw 1
   224 00013C12 <res 00000001>      <1> DelFile_LNEL:		resb 1
   225 00013C13 <res 00000001>      <1> resb 1
   226                              <1> 
   227                              <1> ; DIR.ASM
   228 00013C14 <res 00000004>      <1> mkdir_DirName_Offset: 	resd 1
   229 00013C18 <res 00000004>      <1> mkdir_FFCluster:	resd 1
   230 00013C1C <res 00000004>      <1> mkdir_LastDirCluster:	resd 1
   231 00013C20 <res 00000004>      <1> mkdir_FreeSectors:	resd 1
   232 00013C24 <res 00000002>      <1> mkdir_attrib:		resw 1 
   233 00013C26 <res 00000001>      <1> mkdir_SecPerClust:	resb 1
   234 00013C27 <res 00000001>      <1> mkdir_add_new_cluster:	resb 1
   235 00013C28 <res 0000000D>      <1> mkdir_Name:		resb 13
   236 00013C35 <res 00000002>      <1> resw 1 ; 01/03/2016
   237                              <1> ; 27/02/2016
   238 00013C37 <res 00000001>      <1> RmDir_MultiClusters:	resb 1  
   239 00013C38 <res 00000004>      <1> RmDir_DirEntryOffset:	resd 1 ; 01/03/2016 (word -> dword)
   240 00013C3C <res 00000004>      <1> RmDir_ParentDirCluster: resd 1
   241 00013C40 <res 00000004>      <1> RmDir_DirLastCluster:   resd 1
   242 00013C44 <res 00000004>      <1> RmDir_PreviousCluster:  resd 1
   243                              <1> ; 22/02/2016
   244 00013C48 <res 00000001>      <1> UPDLMDT_CDirLevel:	resb 1
   245 00013C49 <res 00000004>      <1> UPDLMDT_CDirFCluster:	resd 1
   246                              <1> 	
   247 00013C4D <res 00000003>      <1> alignb 4
   248                              <1> ; DRV_FAT.ASM ; 21/08/2011
   249 00013C50 <res 00000004>      <1> gffc_next_free_cluster:  resd 1
   250 00013C54 <res 00000004>      <1> gffc_first_free_cluster: resd 1
   251 00013C58 <res 00000004>      <1> gffc_last_free_cluster:  resd 1
   252                              <1> 
   253                              <1> ;29/04/2016
   254                              <1> Cluster_Index: ; resd 1
   255                              <1> ; 22/02/2016
   256 00013C5C <res 00000004>      <1> ClusterValue:	resd 1
   257                              <1> ; 04/03/2016
   258 00013C60 <res 00000001>      <1> Attributes:	resb 1 
   259                              <1> ;;CFS_error:  resb 1 ;; 01/03/2016
   260 00013C61 <res 00000001>      <1> resb 1
   261 00013C62 <res 00000001>      <1> CFS_OPType: resb 1
   262 00013C63 <res 00000001>      <1> CFS_Drv:    resb 1
   263 00013C64 <res 00000004>      <1> CFS_CC:	    resd 1
   264 00013C68 <res 00000004>      <1> CFS_FAT32FSINFOSEC: resd 1
   265 00013C6C <res 00000004>      <1> CFS_FAT32FC: resd 1
   266                              <1> 
   267                              <1> ; 27/02/2016
   268                              <1> ;alignb 4
   269 00013C70 <res 00000004>      <1> glc_prevcluster: resd 1 ; DRV_FAT.ASM (21/08/2011)
   270                              <1> ; 22/10/2016
   271 00013C74 <res 00000004>      <1> glc_index:	 resd 1 ;  Last Cluster Index (22/10/2016)	
   272                              <1> 
   273                              <1> ; DIR.ASM
   274 00013C78 <res 00000002>      <1> DLN_EntryNumber: resw 1
   275 00013C7A <res 00000001>      <1> DLN_40h:	 resb 1
   276                              <1> ; 28/02/2016
   277 00013C7B <res 00000001>      <1> TCC_FATErr:	 resb 1 ; DRV_FAT.ASM
   278                              <1> 
   279                              <1> alignb 4
   280                              <1> ; DIR.ASM (09/10/2011)
   281 00013C7C <res 00000002>      <1> LCDE_EntryIndex: resw 1 ; LCDE_EntryOffset
   282 00013C7E <res 00000002>      <1> LCDE_ClusterSN:  resw 1
   283 00013C80 <res 00000004>      <1> LCDE_Cluster: 	 resd 1
   284 00013C84 <res 00000004>      <1> LCDE_ByteOffset: resd 1
   285                              <1> 
   286                              <1> ;alignb4
   287                              <1> ; 06/03/2016 (word -> dword)
   288                              <1> ; CMD_INTR.ASM (01/08/2010)
   289 00013C88 <res 00000004>      <1> SourceFilePath:	     resd 1
   290 00013C8C <res 00000004>      <1> DestinationFilePath: resd 1
   291                              <1> 
   292                              <1> ;alignb 4
   293                              <1> ; 06/03/2016
   294                              <1> ; FILE.ASM (09/10/2011)
   295                              <1> ;Source File Structure (same with 'Find File' Structure)
   296 00013C90 <res 00000001>      <1> SourceFile_Drv:			resb 1
   297 00013C91 <res 00000041>      <1> SourceFile_Directory:		resb 65
   298 00013CD2 <res 0000000D>      <1> SourceFile_Name:		resb 13
   299                              <1> SourceFile_LongNameEntryLength: 
   300 00013CDF <res 00000001>      <1> SourceFile_LongNameYes:		resb 1 ; Sign for longname procedures
   301                              <1> ;Above 80 bytes
   302                              <1> ;is TR-DOS Source File FullName Format/Structure
   303 00013CE0 <res 00000002>      <1> SourceFile_AttributesMask:	resw 1
   304 00013CE2 <res 00000020>      <1> SourceFile_DirEntry:		resb 32
   305 00013D02 <res 00000004>      <1> SourceFile_DirFirstCluster:	resd 1
   306 00013D06 <res 00000004>      <1> SourceFile_DirCluster:		resd 1
   307 00013D0A <res 00000002>      <1> SourceFile_DirEntryNumber:	resw 1
   308 00013D0C <res 00000002>      <1> SourceFile_MatchCounter:	resw 1
   309                              <1> ; 16/03/2016
   310 00013D0E <res 00000001>      <1> SourceFile_SecPerClust:		resb 1
   311 00013D0F <res 00000001>      <1> SourceFile_Reserved:		resb 1
   312                              <1> ; Above is 128 bytes
   313                              <1> 
   314                              <1> ;Destination File Structure (same with 'Find File' Structure)
   315 00013D10 <res 00000001>      <1> DestinationFile_Drv:		resb 1
   316 00013D11 <res 00000041>      <1> DestinationFile_Directory: 	resb 65
   317 00013D52 <res 0000000D>      <1> DestinationFile_Name:		resb 13
   318                              <1> DestinationFile_LongNameEntryLength:
   319 00013D5F <res 00000001>      <1> DestinationFile_LongNameYes:	resb 1 ; Sign for longname procedures
   320                              <1> ;Above 80 bytes
   321                              <1> ;is TR-DOS Destination File FullName Format/Structure
   322 00013D60 <res 00000002>      <1> DestinationFile_AttributesMask: resw 1
   323 00013D62 <res 00000020>      <1> DestinationFile_DirEntry:	resb 32
   324 00013D82 <res 00000004>      <1> DestinationFile_DirFirstCluster: resd 1
   325 00013D86 <res 00000004>      <1> DestinationFile_DirCluster:	resd 1
   326 00013D8A <res 00000002>      <1> DestinationFile_DirEntryNumber: resw 1
   327 00013D8C <res 00000002>      <1> DestinationFile_MatchCounter:	resw 1
   328                              <1> ; 16/03/2016
   329 00013D8E <res 00000001>      <1> DestinationFile_SecPerClust:	resb 1
   330 00013D8F <res 00000001>      <1> DestinationFile_Reserved:	resb 1
   331                              <1> ; Above is 128 bytes
   332                              <1> 
   333                              <1> ; 24/04/2016
   334 00013D90 <res 00000002>      <1> resw 1
   335                              <1> 
   336                              <1> ; 10/03/2016
   337                              <1> ; FILE.ASM
   338 00013D92 <res 00000001>      <1> move_cmd_phase:	   resb 1
   339 00013D93 <res 00000001>      <1> msftdf_sf_df_drv:  resb 1
   340 00013D94 <res 00000004>      <1> msftdf_drv_offset: resd 1
   341                              <1> 
   342                              <1> ; 11/03/2016
   343                              <1> ; DRV_FAT.ASM (21/08/2011)
   344 00013D98 <res 00000004>      <1> FAT_anc_LCluster:  resd 1
   345 00013D9C <res 00000004>      <1> FAT_anc_FFCluster: resd 1
   346                              <1> 
   347                              <1> ;alignb 4
   348                              <1> 
   349                              <1> ; 14/03/2016
   350                              <1> ; TRDOS 386 = TRDOS v2.0 feature only !
   351                              <1> ; 'allocate_memory_block' in 'memory.s'
   352 00013DA0 <res 00000004>      <1> mem_ipg_count:	resd 1 ; page count (for contiguous allocation)
   353 00013DA4 <res 00000004>      <1> mem_pg_count:	resd 1 ; page count (for count down)
   354 00013DA8 <res 00000004>      <1> mem_aperture:	resd 1 ; contiguous free pages (current)
   355 00013DAC <res 00000004>      <1> mem_max_aperture: resd 1 ; maximum value of contiguous free pages
   356 00013DB0 <res 00000004>      <1> mem_pg_pos:	resd 1 ; mem. position (page #) of current aperture
   357 00013DB4 <res 00000004>      <1> mem_max_pg_pos: resd 1 ; mem. position (page #) of max. aperture
   358                              <1> 
   359                              <1> ; 15/03/2016
   360                              <1> ; FILE.ASM ('copy_source_file_to_destination_file')
   361 00013DB8 <res 00000001>      <1> copy_cmd_phase:       resb 1
   362 00013DB9 <res 00000001>      <1> csftdf_rw_err:	      resb 1
   363 00013DBA <res 00000001>      <1> DestinationFileFound: resb 1
   364 00013DBB <res 00000001>      <1> csftdf_cdrv: 	      resb 1
   365 00013DBC <res 00000004>      <1> csftdf_filesize:      resd 1
   366                              <1> ; TRDOS386 (TRDOS v2.0)
   367 00013DC0 <res 00000004>      <1> csftdf_sf_mem_addr:   resd 1
   368 00013DC4 <res 00000004>      <1> csftdf_sf_mem_bsize:  resd 1
   369                              <1> ;
   370                              <1> 
   371 00013DC8 <res 00000004>      <1> csftdf_sf_cluster:    resd 1 ; 16/03/2016
   372 00013DCC <res 00000004>      <1> csftdf_df_cluster:    resd 1
   373                              <1> ; 16/03/2016
   374 00013DD0 <res 00000004>      <1> csftdf_r_size:        resd 1
   375 00013DD4 <res 00000004>      <1> csftdf_w_size:        resd 1
   376 00013DD8 <res 00000004>      <1> csftdf_sf_rbytes:     resd 1
   377 00013DDC <res 00000004>      <1> csftdf_df_wbytes:     resd 1
   378 00013DE0 <res 00000001>      <1> csftdf_percentage:    resb 1
   379                              <1> ; 17/03/2016
   380 00013DE1 <res 00000001>      <1> csftdf_videopage:     resb 1
   381 00013DE2 <res 00000002>      <1> csftdf_cursorpos:     resw 1
   382 00013DE4 <res 00000004>      <1> csftdf_sf_drv_dt:     resd 1
   383 00013DE8 <res 00000004>      <1> csftdf_df_drv_dt:     resd 1
   384                              <1> 
   385                              <1> ; 21/03/2016
   386                              <1> ; 20/03/2016
   387                              <1> ; FILE.ASM
   388 00013DEC <res 00000004>      <1> createfile_Name_Offset:  resd 1
   389 00013DF0 <res 00000004>      <1> createfile_FreeSectors:  resd 1 
   390 00013DF4 <res 00000004>      <1> createfile_size:         resd 1
   391 00013DF8 <res 00000004>      <1> createfile_FFCluster:    resd 1 ; 11/03/2016
   392 00013DFC <res 00000004>      <1> createfile_LastDirCluster: resd 1
   393 00013E00 <res 00000004>      <1> createfile_Cluster:      resd 1
   394 00013E04 <res 00000004>      <1> createfile_PCluster:     resd 1
   395 00013E08 <res 00000001>      <1> createfile_attrib:	 resb 1
   396 00013E09 <res 00000001>      <1> createfile_SecPerClust:  resb 1
   397 00013E0A <res 00000002>      <1> createfile_DirIndex:     resw 1
   398 00013E0C <res 00000004>      <1> createfile_CCount:	 resd 1
   399 00013E10 <res 00000002>      <1> createfile_BytesPerSec:	 resw 1 ; 23/03/2016
   400 00013E12 <res 00000001>      <1> createfile_wfc:	         resb 1
   401 00013E13 <res 00000001>      <1> createfile_UpdatePDir:	 resb 1 ; 31/03/2016
   402                              <1> 
   403                              <1> ;alignb 4
   404                              <1> 
   405                              <1> ; 11/04/2016
   406 00013E14 <res 00000002>      <1> env_var_length:	   resw 1
   407                              <1> 
   408 00013E16 <res 00000002>      <1> alignb 4
   409                              <1> 
   410                              <1> ; 25/04/2016
   411 00013E18 <res 00000001>      <1> readi.valid:	resb 1 ; valid data (>0 = valid for readi)
   412 00013E19 <res 00000001>      <1> readi.drv:	resb 1 ; drive number (0, 1,2,3,4..)
   413 00013E1A <res 00000001>      <1> readi.spc:	resb 1 ; sectors per cluster for 'readi' drive
   414 00013E1B <res 00000001>      <1> readi.s_index:  resb 1 ; sector index in current cluster (buffer)
   415 00013E1C <res 00000004>      <1> readi.sector:	resd 1 ; current disk sector
   416 00013E20 <res 00000002>      <1> readi.bpc:	resw 1 ; bytes per cluster - 1
   417 00013E22 <res 00000002>      <1> readi.offset:	resw 1 ; byte offset in cluster buffer
   418 00013E24 <res 00000004>      <1> readi.cluster:  resd 1 ; current cluster number
   419 00013E28 <res 00000004>      <1> readi.c_index:	resd 1 ; cluster index of the current cluster (0,1,2,3..)
   420 00013E2C <res 00000004>      <1> readi.fclust:	resd 1 ; first cluster of the current cluster
   421 00013E30 <res 00000004>      <1> readi.fs_index: resd 1 ; sector index in disk/file section (for Singlix FS)
   422                              <1> ;readi.buffer:	resd 1 ; readi sector buffer address
   423                              <1> 
   424                              <1> ;alignb 4
   425                              <1> 
   426 00013E34 <res 00000001>      <1> writei.valid:	resb 1 ; valid data (>0 = valid for writei)
   427 00013E35 <res 00000001>      <1> writei.drv:	resb 1 ; drive number (0, 1,2,3,4..)
   428 00013E36 <res 00000001>      <1> writei.spc:	resb 1 ; sectors per cluster for 'writei' drive
   429 00013E37 <res 00000001>      <1> writei.s_index: resb 1 ; sector index in current cluster (buffer)
   430 00013E38 <res 00000004>      <1> writei.sector:	resd 1 ; current disk sector
   431 00013E3C <res 00000002>      <1> writei.bpc:	resw 1 ; bytes per cluster - 1
   432 00013E3E <res 00000002>      <1> writei.offset:	resw 1 ; byte offset in cluster buffer
   433 00013E40 <res 00000004>      <1> writei.cluster: resd 1 ; current cluster number
   434 00013E44 <res 00000004>      <1> writei.c_index:	resd 1 ; cluster index of the current cluster (0,1,2,3..)
   435 00013E48 <res 00000004>      <1> writei.fclust:  resd 1 ; first cluster of the current cluster
   436 00013E4C <res 00000004>      <1> writei.fs_index: resd 1 ; sector index in disk/file section (for Singlix FS)
   437                              <1> ;writei.buffer:	resd 1 ; writei sector buffer address
   438 00013E50 <res 00000004>      <1> writei.lclust:	resd 1 ; writei last cluster (mget_w) ; 23/10/2016
   439 00013E54 <res 00000004>      <1> writei.l_index:	resd 1 ; writei last cluster index (mget_w) ; 23/10/2016
   440 00013E58 <res 00000001>      <1> writei.ofn:	resb 1 ; open file number (to be written) ; 23/10/2016
   441                              <1> 
   442 00013E59 <res 00000003>      <1> alignb 4
   443                              <1> 
   444                              <1> ; 29/04/2016
   445 00013E5C <res 00000004>      <1> Run_CDirFC:	resd 1
   446 00013E60 <res 00000001>      <1> Run_Auto_Path:	resb 1
   447 00013E61 <res 00000001>      <1> Run_Manual_Path: resb 1 ; 0 -> auto path sequence needed
   448 00013E62 <res 00000001>      <1> EXE_ID:		resb 1	
   449 00013E63 <res 00000001>      <1> EXE_dot:	resb 1
   450                              <1> 
   451                              <1> ; 06/05/2016
   452 00013E64 <res 00000004>      <1> mainprog_return_addr: resd 1
   453 00013E68 <res 00000004>      <1> last_error:	resd 1  ; this will be used to return error code to MainProg
   454                              <1> 			; 'lasterror' keyword will be used later to get the
   455                              <1> 			; last error code/number/status.
   456                              <1> ; 12/05/2016
   457 00013E6C <res 00000004>      <1> video_eax:	resd 1  ; eax return value of video function
   458                              <1> 
   459                              <1> ; 01/06/2016
   460 00013E70 <res 00000004>      <1> user_buffer:	resd 1  ; 'diskio.s' (INT 33h, Function 08h, floppy disk type)
   461                              <1> 
   462                              <1> ; 21/05/2016 - TRDOS 386 ('swap/switch', 'rswap', [u.pri])
   463 00013E74 <res 00000001>      <1> priority:	resb 1  ; running priority level of process (0,1,2)
   464                              <1> 			; (run queue which is process comes from)
   465                              <1> ; 22/05/2016 - TRDOS 386 ('set_run_sequence', 'rtc_int', 'u_timer')
   466 00013E75 <res 00000001>      <1> p_change:	resb 1  ; process change status (for timer events)
   467                              <1> ; 23/05/2016 - TRDOS 386 ('clock')
   468 00013E76 <res 00000001>      <1> multi_tasking:	resb 1   ; Multi Tasking status (0 = disabled, >0 = enabled)
   469                              <1> 			; (EBX will return with user buffer addr or disk type)
   470                              <1> ; 07/06/2016
   471 00013E77 <res 00000001>      <1> timer_events:	resb 1  ; number of (active) timer events, <= 16		
   472                              <1> 
   473                              <1> ; 24/06/2016
   474 00013E78 <res 00000001>      <1> w_str_cmd:	resb 1	; WRITE_STRING command (0,1,2,3) ; video.s
   475 00013E79 <res 00000001>      <1> p_crt_mode:	resb 1  ; previous video mode (=3 or 0), backup mark/sign
   476                              <1> ; 26/06/2016
   477 00013E7A <res 00000001>      <1> p_crt_page:	resb 1  ; previous active page (for 'set_mode')
   478                              <1> ; 04/07/2016
   479 00013E7B <res 00000001>      <1> noclearmem:	resb 1  ; if set, 'SET MODE' (INT 31h) function (AH = 4)
   480                              <1> 			; will not clear the video memory
   481                              <1> 			; (usable for graphics modes only)
   482                              <1> alignb 2
   483 00013E7C <res 00000002>      <1> CRT_LEN:	resw 1  ; length of regen buffer in bytes
   484 00013E7E <res 00000010>      <1> cursor_pposn:	resw 8  ; cursor positions backup
   485                              <1> 
   486                              <1> ; 10/07/2016 ('VGA_FONT_SETUP', INT 43H address for x86 real mode bios)
   487 00013E8E <res 00000004>      <1> VGA_INT43H:	resd 1	; 0 = default (not configured by user)
   488                              <1> 			; 0FFFFFFFFh = user defined fonts
   489                              <1> 			; address:
   490                              <1> 			; 	vgafont8
   491                              <1> 			; 	vgafont16
   492                              <1> 			; 	vgafont14
   493                              <1> 
   494                              <1> ; 25/07/2016
   495 00013E92 <res 00000001>      <1> VGA_MTYPE:	resb 1  ; 0=CTEXT,1=MTEXT,2=CGA,3=PLANAR1,4=PLANAR4,5=LINEAR 
   496                              <1> 
   497                              <1> ; 23/10/2016
   498 00013E93 <res 00000001>      <1> setfmod		resb 1	; update last modification date&time sign (if >0)
   499                              <1> 			; (it is Open File Number + 1, if > 0)
   500                              <1> alignb 4
   501                              <1> 
   502                              <1> ; 16/10/2016
   503 00013E94 <res 00000004>      <1> FFF_UBuffer:	resd 1  ; User's buffer address for FFF & FNF system calls 
   504                              <1> ; 15/10/2016
   505 00013E98 <res 00000001>      <1> FFF_Valid:	resb 1  ; Find First File Structure validation byte
   506                              <1> 			; 0  = invalid (Find Next File can't use FFF struct)
   507                              <1> 			; >0 = valid, return type for FFF and Find Next File
   508                              <1> 			; 24 = basic parameters, 24 bytes
   509                              <1> 			; 128 = entire FFF structure/table, 128 bytes
   510                              <1> ; 16/10/2016 (FFF_Attrib: resw 1)
   511 00013E99 <res 00000001>      <1> FFF_Attrib:	resb 1	; Find First File attributes for Find Next File (LB)
   512 00013E9A <res 00000001>      <1> FFF_RType:	resb 1  ; FFF return type (0 = Basic, >0 = complete) (HB)
   513                              <1> ; 16/10/2016 - 05/10/2016 (Set Working Path)
   514 00013E9B <res 00000001>      <1> SWP_inv_fname:	resb 1	; Set Working Path - Invalid File Name
   515 00013E9C <res 00000002>      <1> SWP_Mode:	resw 1	; Set Working Path - Mode
   516 00013E9E <res 00000001>      <1> SWP_DRV:	resb 1	; Set Working Path - Drive	
   517 00013E9F <res 00000001>      <1> SWP_DRV_chg:	resb 1	; Set Working Path - Drive Change
   518                              <1> 
   519                              <1> ; 08/10/2016
   520 00013EA0 <res 00000009>      <1> device_name:    resb 9  ; capitalized (and zero padded) device canem 
   521                              <1> 			; (example: "TTY0",0,0,0,0,0")
   522                              <1> 
   523 00013EA9 <res 00000003>      <1> alignb 4
   524                              <1> 
   525                              <1> ; 08/10/2016
   526                              <1> ; 07/10/2016
   527                              <1> ; Table of kernel devices (which do not use installable device drivers)
   528                              <1> ; has been coded into KERNEL (trdosk9.s) 
   529                              <1> ; 07/10/2016
   530                              <1> ; 8 installable device drivers available to install (NUMIDEV)
   531 00013EAC <res 00000020>      <1> IDEV_PGDIR: resd NUMIDEV
   532                              <1> 			; Page directories of installable device drivers
   533                              <1> 			;
   534                              <1> 			; Note: Virtual start address is always 400000h
   535                              <1> 			; (end of the 1st 4MB). [org 400000h]
   536                              <1> 			; Segments: KCODE, KDATA
   537                              <1> 			; Method: call 400000h (after changing page dir) 	
   538                              <1> 			; Query code located at the start (400000h).
   539                              <1> 			; Query code returns with
   540                              <1> 			;   eax = device type and driver version
   541                              <1> 			;         AL = Device Type minor
   542                              <1> 			;         AH = Device Type major
   543                              <1> 			;         Byte 16-23 : Version minor
   544                              <1> 			;	  Byte 24-31 : Version major - 1
   545                              <1> 			;		       (0:0 -> 1.0)
   546                              <1> 			;   ebx = initialization code address
   547                              <1> 			;   ecx = configuration table address
   548                              <1> 			;   edx = description table address
   549                              <1> 			;   esi = device (default) name address (ASCIIZ)
   550                              <1> 			;	 (name has "/DEV/" prefix)		
   551                              <1> 			;   edi = dispatch table address
   552                              <1> 			;        (for calling kernel-device functions)
   553                              <1> 			;   ebp = address table address
   554                              <1> 			; Initialization code returns with
   555                              <1> 			;   eax = open code address
   556                              <1> 			;   ecx = close code address 
   557                              <1> 			;   ebx = read code address
   558                              <1> 			;   edx = write code address 	
   559                              <1> 			;   esi = IOCTL code address
   560                              <1> 			;   edi = dispatch table address
   561                              <1> 			;   ebp = address table address
   562                              <1> 			; Address Table:
   563                              <1> 			;    Offset 0  : open code address
   564                              <1> 			;    Offset 4  : read code address
   565                              <1> 			;    Offset 8  : write code address
   566                              <1> 			;    Offset 12 : close code address
   567                              <1> 			;    Offset 16 : IOCTL code address
   568                              <1> 			;    Offset 20 : initialization code address
   569                              <1> 			;    Offset 24 : description table address
   570                              <1> 			;    Offset 28 : configuration table address
   571                              <1> 			;    Offset 32 : device name address
   572                              <1> 			;    Offset 36 : dispatch table address
   573                              <1> 			;          (for calling kernel-device functions)
   574                              <1> 
   575 00013ECC <res 00000040>      <1> IDEV_NAME:  resb 8*NUMIDEV 
   576                              <1> 			; 8 byte names of installable device drivers
   577                              <1> 
   578 00013F0C <res 00000008>      <1> IDEV_TYPE:  resb NUMIDEV ; Driver type of installable device drivers
   579 00013F14 <res 00000008>      <1> IDEV_FLAGS: resb NUMIDEV ; Device access parameters for installable
   580                              <1>                          ; device drivers (These values are set while
   581                              <1> 			 ; the device driver is being loaded.)
   582 00013F1C <res 00000020>      <1> IDEV_OADDR: resd NUMIDEV ; open function addr for installable dev driver
   583 00013F3C <res 00000020>      <1> IDEV_CADDR: resd NUMIDEV ; close function addr for installable dev driver
   584 00013F5C <res 00000020>      <1> IDEV_RADDR: resd NUMIDEV ; read function addr for installable dev driver
   585 00013F7C <res 00000020>      <1> IDEV_WADDR: resd NUMIDEV ; write function addr for installable dev driver
   586                              <1> 	
   587                              <1> ; 08/10/2016	
   588                              <1> ; 07/10/2016
   589                              <1> ; Device Open and Access parameters
   590 00013F9C <res 0000001E>      <1> DEV_ACCESS:	 resb NUMOFDEVICES   ; bit 0 = accessable by normal users
   591                              <1> 				     ; bit 1 = read access permission
   592                              <1> 				     ; bit 2 = write access permission
   593                              <1> 				     ; bit 3 = IOCTL permission to users
   594                              <1> 				     ; bit 4 = block device if it is set	
   595                              <1> 				     ; bit 5 = 16 bit or 1024 byte data
   596                              <1> 				     ; bit 6 = 32 bit or 2048 byte data
   597                              <1> 				     ; bit 7 = installable device driver
   598 00013FBA <res 0000001E>      <1> DEV_R_OWNER:	 resb NUMOFDEVICES   ; Reading owner no (u.uid) of devices		
   599 00013FD8 <res 0000001E>      <1> DEV_R_OPENCOUNT: resb NUMOFDEVICES   ; Reading open count 
   600 00013FF6 <res 0000001E>      <1> DEV_W_OWNER:	 resb NUMOFDEVICES   ; Writing owner no (u.uid) of devices		
   601 00014014 <res 0000001E>      <1> DEV_W_OPENCOUNT: resb NUMOFDEVICES   ; Writing open count
   602 00014032 <res 0000001E>      <1> DEV_DRIVER:	 resb NUMOFDEVICES   ; device driver number (1 to 7Fh)
   603                              <1> 				     ; *if bit 7 is set (80 to FFh)
   604                              <1> 				     ; *if it is installable device driver
   605                              <1> 				     ; *index (0 to 7Fh)
   606                              <1> 				     ; otherwise it is kernel device index
   607 00014050 <res 0000001E>      <1> DEV_OPENMODE:	 resb NUMOFDEVICES   ; 1 = read mode
   608                              <1> 				     ; 2 = write mode
   609                              <1> 				     ; 3 = read & write 	  
   610                              <1> 				     ; 0 = not open (free)		
   611 0001406E <res 00000078>      <1> DEV_NAME_PTR:    resd NUMOFDEVICES   ; pointers to name addresses of drivers
   612                              <1> 				     ; Address base: KDEV_NAME+		
   613                              <1> 				     ; or IDEV_NAME+
   614 000140E6 <res 00000078>      <1> DEV_R_POINTER:	 resd NUMOFDEVICES   ; reading pointer, writing pointer	
   615 0001415E <res 00000078>      <1> DEV_W_POINTER:	 resd NUMOFDEVICES   ; sector number if block device
   616                              <1> 				     ; character offset if char device
   617 000141D6 <res 00000002>      <1> alignb 4
   618                              <1> 
   619                              <1> ; 06/10/2016
   620                              <1> ; Open File Parameters
   621 000141D8 <res 00000028>      <1> OF_FCLUSTER:	resd OPENFILES  ; First clusters of open files
   622 00014200 <res 0000000A>      <1> OF_DRIVE:	resb OPENFILES  ; Logical DOS drive numbers of open files 
   623 0001420A <res 0000000A>      <1> OF_MODE:	resb OPENFILES  ; Open mode (1 = read, 2 = write, 3 = r&w) 
   624 00014214 <res 0000000A>      <1> OF_STATUS:	resb OPENFILES  ; (bit 0 = read, bit 1 = write)
   625 0001421E <res 0000000A>      <1> OF_OPENCOUNT:	resb OPENFILES  ; Open counts of open files
   626 00014228 <res 00000028>      <1> OF_POINTER:	resd OPENFILES	; File seek/read/write pointer
   627 00014250 <res 00000028>      <1> OF_SIZE:	resd OPENFILES	; File sizes of open files (in bytes)
   628 00014278 <res 00000028>      <1> OF_DIRFCLUSTER:	resd OPENFILES  ; Directory First Clusters of open files
   629 000142A0 <res 00000028>      <1> OF_DIRCLUSTER:	resd OPENFILES  ; Directory (Entry) Clusters of open files
   630 000142C8 <res 00000028>      <1> OF_VOLUMEID:	resd OPENFILES  ; Vol ID for removable drives of open files
   631 000142F0 <res 00000028>      <1> OF_CCLUSTER:	resd OPENFILES  ; Current clusters of open files
   632 00014318 <res 00000028>      <1> OF_CCINDEX:	resd OPENFILES  ; Cluster index numbers of current clusters
   633                              <1> ; 24/10/2016
   634 00014340 <res 00000014>      <1> OF_DIRENTRY:	resw OPENFILES  ; Directory entry index no. in dir cluster 
   635                              <1> 				; Sector index = entry index / 16
   636                              <1> ;alignb 2
   637                              <1> 
   638 00014354 <res 00000060>      <1> DTA:		resd 24		; Find First File data transfer area
   639                              <1> 
   640                              <1> ; 19/12/2016
   641 000143B4 <res 00000001>      <1> tcallback:	resb 1		; Timer callback method flag for 'systimer'
   642 000143B5 <res 00000001>      <1> trtc:		resb 1		; Timer interrupt type flag for 'systimer'
   643                              <1> ; 12/01/2016
   644 000143B6 <res 00000001>      <1> 		resb 1		; Reserved byte
   645                              <1> ;;15/01/2017
   646                              <1> ; 02/01/2017
   647                              <1> ;;intflg:	resb 1		; software interrupt in progress signal
   648                              <1> 				; (for timer interrupt)
  2799                                  ; 24/01/2016
  2800                                  %include 'ubss.s'	; UNINITIALIZED KERNEL (USER) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.0) - UNINITIALIZED USER DATA : ubss.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 13/01/2017
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.11 (trdos386.s)
     9                              <1> ; ----------------------------------------------------------------------------
    10                              <1> ; Derived from 'Retro UNIX 386 Kernel - v0.2.1.0' source code by Erdogan Tan
    11                              <1> ; ux.s (04/12/2015)
    12                              <1> ; ****************************************************************************
    13                              <1> 
    14                              <1> ; Retro UNIX 386 v1 Kernel - ux.s
    15                              <1> ; Last Modification: 04/12/2015
    16                              <1> ;
    17                              <1> ; ///////// RETRO UNIX 386 V1 SYSTEM DEFINITIONS ///////////////
    18                              <1> ; (Modified from 
    19                              <1> ;	Retro UNIX 8086 v1 system definitions in 'UNIX.ASM', 01/09/2014)
    20                              <1> ; ((UNIX.ASM (RETRO UNIX 8086 V1 Kernel), 11/03/2013 - 01/09/2014))
    21                              <1> ; ----------------------------------------------------------------------------
    22                              <1> ; Derived from UNIX Operating System (v1.0 for PDP-11) 
    23                              <1> ; (Original) Source Code by Ken Thompson (1971-1972)
    24                              <1> ; <Bell Laboratories (17/3/1972)>
    25                              <1> ; <Preliminary Release of UNIX Implementation Document>
    26                              <1> ; (Section E10 (17/3/1972) - ux.s)
    27                              <1> ; ****************************************************************************
    28                              <1> 
    29 000143B7 <res 00000001>      <1> alignb 2
    30                              <1> 
    31                              <1> inode:
    32                              <1> 	; 11/03/2013. 
    33                              <1> 	;Derived from UNIX v1 source code 'inode' structure (ux).
    34                              <1> 	;i.
    35                              <1> 
    36 000143B8 <res 00000002>      <1> 	i.flgs:	 resw 1
    37 000143BA <res 00000001>      <1> 	i.nlks:	 resb 1
    38 000143BB <res 00000001>      <1> 	i.uid:	 resb 1
    39                              <1>         ;i.size:  resw 1 ; size
    40 000143BC <res 00000002>      <1> 	resw 1 ; 29/04/2016
    41 000143BE <res 00000010>      <1> 	i.dskp:	 resw 8 ; 16 bytes
    42 000143CE <res 00000004>      <1> 	i.ctim:	 resd 1
    43 000143D2 <res 00000004>      <1> 	i.mtim:	 resd 1
    44 000143D6 <res 00000002>      <1> 	i.rsvd:  resw 1 ; Reserved (ZERO/Undefined word for UNIX v1.)
    45                              <1> 
    46                              <1> I_SIZE	equ $ - inode 
    47                              <1> 
    48                              <1> process:
    49                              <1> 	; 19/12/2016
    50                              <1> 	; 21/05/2016
    51                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
    52                              <1> 	; 06/05/2015 - Retro UNIX 386 v1
    53                              <1> 	; 11/03/2013 - 05/02/2014 (Retro UNIX 8086 v1)
    54                              <1> 	;Derived from UNIX v1 source code 'proc' structure (ux).
    55                              <1> 	;p.
    56                              <1> 	
    57 000143D8 <res 00000020>      <1>         p.pid:   resw nproc
    58 000143F8 <res 00000020>      <1>         p.ppid:  resw nproc
    59 00014418 <res 00000020>      <1>         p.break: resw nproc
    60 00014438 <res 00000010>      <1>         p.ttyc:  resb nproc ; console tty in Retro UNIX 8086 v1.
    61 00014448 <res 00000010>      <1> 	p.waitc: resb nproc ; waiting channel in Retro UNIX 8086 v1.
    62 00014458 <res 00000010>      <1> 	p.link:	 resb nproc
    63 00014468 <res 00000010>      <1> 	p.stat:	 resb nproc
    64                              <1> 
    65                              <1> 	; 06/05/2015 (Retro UNIX 386 v1 feature only !) 
    66 00014478 <res 00000040>      <1> 	p.upage: resd nproc ; Physical address of the process's
    67                              <1> 			    ; 'user' structure
    68                              <1> 	; 21/05/2016	
    69                              <1> 	; 19/05/2016 (TRDOS 386 feature only!)
    70 000144B8 <res 00000010>      <1> 	p.timer: resb nproc ; number of timer events of the processs
    71                              <1> 
    72                              <1> 	; 19/12/2016
    73 000144C8 <res 00000040>      <1> 	p.tcb:	resd nproc ; timer callback service address (if > 0)
    74                              <1> 			  		 			 	  
    75                              <1> P_SIZE	equ $ - process
    76                              <1> 
    77                              <1> ; fsp table (original UNIX v1)
    78                              <1> ;
    79                              <1> ;Entry
    80                              <1> ;          15                                      0
    81                              <1> ;  1     |---|---------------------------------------|
    82                              <1> ;        |r/w|       i-number of open file           |
    83                              <1> ;        |---|---------------------------------------| 
    84                              <1> ;        |               device number               |
    85                              <1> ;        |-------------------------------------------|
    86                              <1> ;    (*) | offset pointer, i.e., r/w pointer to file |
    87                              <1> ;        |-------------------------------------------| 
    88                              <1> ;        |  flag that says    | number of processes  |
    89                              <1> ;        |   file deleted     | that have file open  |
    90                              <1> ;        |-------------------------------------------| 
    91                              <1> ;  2     |                                           |
    92                              <1> ;        |-------------------------------------------| 
    93                              <1> ;        |                                           |
    94                              <1> ;        |-------------------------------------------|
    95                              <1> ;        |                                           |
    96                              <1> ;        |-------------------------------------------|
    97                              <1> ;        |                                           |
    98                              <1> ;        |-------------------------------------------| 
    99                              <1> ;  3     |                                           | 
   100                              <1> ;        |                                           |  
   101                              <1> ;
   102                              <1> ; (*) Retro UNIX 386 v1 modification: 32 bit offset pointer 
   103                              <1> 
   104                              <1> 
   105                              <1> ; 15/04/2015
   106 00014508 <res 000001F4>      <1> fsp:	 resb nfiles * 10 ; 11/05/2015 (8 -> 10)
   107 000146FC <res 00000002>      <1> idev:	 resw 1 ; device number is 1 byte in Retro UNIX 8086 v1 !
   108 000146FE <res 00000002>      <1> cdev:    resw 1 ; device number is 1 byte in Retro UNIX 8086 v1 !
   109                              <1> ; 18/05/2015
   110                              <1> ; 26/04/2013 device/drive parameters (Retro UNIX 8086 v1 feature only!)
   111                              <1> ; 'UNIX' device numbers (as in 'cdev' and 'u.cdrv')
   112                              <1> ;	0 -> root device (which has Retro UNIX 8086 v1 file system)
   113                              <1> ; 	1 -> mounted device (which has Retro UNIX 8086 v1 file system)
   114                              <1> ; 'Retro UNIX 8086 v1' device numbers: (for disk I/O procedures)
   115                              <1> ;	0 -> fd0 (physical drive, floppy disk 1), physical drive number = 0
   116                              <1> ;	1 -> fd1 (physical drive, floppy disk 2), physical drive number = 1
   117                              <1> ;	2 -> hd0 (physical drive, hard disk 1), physical drive number = 80h
   118                              <1> ;	3 -> hd1 (physical drive, hard disk 2), physical drive number = 81h
   119                              <1> ;	4 -> hd2 (physical drive, hard disk 3), physical drive number = 82h
   120                              <1> ;	5 -> hd3 (physical drive, hard disk 4), physical drive number = 83h
   121 00014700 <res 00000001>      <1> rdev:	 resb 1 ; root device number ; Retro UNIX 8086 v1 feature only!
   122                              <1> 	        ; as above, for physical drives numbers in following table
   123 00014701 <res 00000001>      <1> mdev:	 resb 1 ; mounted device number ; Retro UNIX 8086 v1 feature only!
   124                              <1> ; 15/04/2015
   125 00014702 <res 00000001>      <1> active:	 resb 1 
   126 00014703 <res 00000001>      <1> 	 resb 1 ; 09/06/2015
   127 00014704 <res 00000002>      <1> mnti:	 resw 1
   128 00014706 <res 00000002>      <1> mpid:	 resw 1
   129 00014708 <res 00000002>      <1> rootdir: resw 1
   130                              <1> 
   131                              <1> ; 21/05/2016 - TRDOS 386 (TRDOS v2.0) - priority levels, 3 run queues 
   132                              <1> runq:
   133 0001470A <res 00000002>      <1> runq_event:	 resw 1 ; high priority, 'run for event'            ; 2
   134 0001470C <res 00000002>      <1> runq_normal:	 resw 1 ; normal/regular priority, 'run as reqular' ; 1
   135 0001470E <res 00000002>      <1> runq_background: resw 1 ; low priority, 'run on background'         ; 0
   136                              <1> ;
   137 00014710 <res 00000001>      <1> imod:	 resb 1
   138 00014711 <res 00000001>      <1> smod:	 resb 1
   139 00014712 <res 00000001>      <1> mmod:	 resb 1
   140 00014713 <res 00000001>      <1> sysflg:	 resb 1
   141                              <1> 
   142                              <1> alignb 4
   143                              <1> 
   144                              <1> user:
   145                              <1> 	; 13/01/2017
   146                              <1> 	; 19/12/2016
   147                              <1> 	; 21/05/2016 - TRDOS 386 (TRDOS v2.0) 
   148                              <1> 	; 	       [u.pri] usage method modification
   149                              <1> 	; 04/12/2015 
   150                              <1> 	; 18/10/2015
   151                              <1> 	; 12/10/2015
   152                              <1> 	; 21/09/2015
   153                              <1> 	; 24/07/2015
   154                              <1> 	; 16/06/2015
   155                              <1> 	; 09/06/2015
   156                              <1> 	; 11/05/2015
   157                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - 32 bit modifications)
   158                              <1> 	; 10/10/2013
   159                              <1> 	; 11/03/2013. 
   160                              <1> 	;Derived from UNIX v1 source code 'user' structure (ux).
   161                              <1> 	;u.
   162                              <1> 
   163 00014714 <res 00000004>      <1> 	u.sp:	  resd 1 ; esp (kernel stack at the beginning of 'sysent')
   164 00014718 <res 00000004>      <1> 	u.usp:	  resd 1 ; esp (kernel stack points to user's registers)
   165 0001471C <res 00000004>      <1> 	u.r0:	  resd 1 ; eax
   166 00014720 <res 00000002>      <1> 	u.cdir:	  resw 1
   167 00014722 <res 0000000A>      <1> 	u.fp:	  resb 10
   168 0001472C <res 00000004>      <1> 	u.fofp:	  resd 1
   169 00014730 <res 00000004>      <1> 	u.dirp:	  resd 1
   170 00014734 <res 00000004>      <1> 	u.namep:  resd 1
   171 00014738 <res 00000004>      <1> 	u.off:	  resd 1
   172 0001473C <res 00000004>      <1> 	u.base:	  resd 1
   173 00014740 <res 00000004>      <1> 	u.count:  resd 1
   174 00014744 <res 00000004>      <1> 	u.nread:  resd 1
   175 00014748 <res 00000004>      <1> 	u.break:  resd 1 ; break
   176 0001474C <res 00000002>      <1> 	u.ttyp:	  resw 1 
   177                              <1> 	; 10/01/2017 (TRDOS 386, relocation and dword alignment)
   178                              <1> 	; tty number (rtty, rcvt, wtty)
   179 0001474E <res 00000001>      <1> 	u.ttyn:	  resb 1 ; 28/07/2013 - Retro Unix 8086 v1 feature only !
   180 0001474F <res 00000001>      <1> 	u.resb:   resb 1 ; 10/01/2017 (TRDOS 386, temporary)
   181 00014750 <res 00000010>      <1> 	u.dirbuf: resb 16 ; 04/12/2015 (10 -> 16) 
   182                              <1> 	;u.pri:	  resw 1 ; 14/02/2014
   183 00014760 <res 00000001>      <1> 	u.quant:  resb 1 ; Retro UNIX 8086 v1 Feature only ! (uquant)
   184 00014761 <res 00000001>      <1> 	u.pri:	  resb 1 ; Modification: 21/05/2016 (priority levels: 0, 1, 2)
   185 00014762 <res 00000002>      <1> 	u.intr:	  resw 1
   186 00014764 <res 00000002>      <1> 	u.quit:	  resw 1
   187                              <1> 	;u.emt:	  resw 1 ; 10/10/2013
   188                              <1> 	;u.ilgins: resw 1 ; 10/01/2017
   189 00014766 <res 00000002>      <1> 	u.cdrv:	  resw 1 ; cdev
   190 00014768 <res 00000001>      <1> 	u.uid:	  resb 1 ; uid
   191 00014769 <res 00000001>      <1> 	u.ruid:	  resb 1
   192 0001476A <res 00000001>      <1> 	u.bsys:	  resb 1
   193 0001476B <res 00000001>      <1> 	u.uno:	  resb 1
   194 0001476C <res 00000004>      <1>         u.upage:  resd 1 ; 16/04/2015 - Retro Unix 386 v1 feature only !
   195 00014770 <res 00000004>      <1> 	u.pgdir:  resd 1 ; 09/03/2015 (page dir addr of process)
   196 00014774 <res 00000004>      <1> 	u.ppgdir: resd 1 ; 06/05/2015 (page dir addr of the parent process)
   197 00014778 <res 00000004>      <1> 	u.pbase:  resd 1 ; 20/05/2015 (physical base/transfer address)
   198 0001477C <res 00000002>      <1> 	u.pcount: resw 1 ; 20/05/2015 (byte -transfer- count for page)
   199                              <1> 	;u.pncount: resw 1 
   200                              <1> 		; 16/06/2015 (byte -transfer- count for page, 'namei', 'mkdir')
   201                              <1> 	;u.pnbase:  resd 1 
   202                              <1> 		; 16/06/2015 (physical base/transfer address, 'namei', 'mkdir')
   203                              <1> 			 ; 09/06/2015
   204 0001477E <res 00000001>      <1> 	u.kcall:  resb 1 ; The caller is 'namei' (dskr) or 'mkdir' (dskw) sign		
   205 0001477F <res 00000001>      <1> 	u.brwdev: resb 1 ; Block device number for direct I/O (bread & bwrite)
   206                              <1> 			 ; 24/07/2015 - 24/06/2015
   207                              <1> 	;u.args:  resd 1 ; arguments list (line) offset from start of [u.upage]
   208                              <1> 			 ; (arg list/line is from offset [u.args] to 4096 in [u.upage])
   209                              <1> 			 ; ([u.args] points to argument count -argc- address offset)
   210                              <1>  			 ; 24/06/2015	  	
   211                              <1> 	;u.core:  resd 1 ; physical start address of user's memory space (for sys exec)
   212                              <1> 	;u.ecore: resd 1 ; physical end address of user's memory space (for sys exec)
   213                              <1> 	; last error number
   214 00014780 <res 00000004>      <1> 	u.error:  resd 1 ; 28/07/2013 - 09/03/2015 
   215                              <1> 		        ; Retro UNIX 8086/386 v1 feature only!
   216                              <1> 			; 21/09/2015 (debugging - page fault analyze)
   217 00014784 <res 00000004>      <1> 	u.pfcount: resd 1 ; page fault count for (this) process (for sys geterr)
   218                              <1> 		; 19/12/2016 (TRDOS 386)	
   219 00014788 <res 00000004>      <1> 	u.tcb:	  resd 1 ; Timer callback address/flag which will be used by timer int
   220                              <1> 		; 13/01/2017 (TRDOS 386)
   221 0001478C <res 00000001>      <1> 	u.t_lock: resb 1 ; Timer interrupt (callback) lock (unlocked by 'sysrele')
   222 0001478D <res 00000001>      <1> 	u.t_mode: resb 1 ; running mode during timer interrupt (0= system, 0FFh= user) 
   223                              <1> 
   224 0001478E <res 00000002>      <1> alignb 4
   225                              <1> 
   226                              <1> U_SIZE	equ $ - user
   227                              <1> 
   228                              <1> ; 18/10/2015 - Retro UNIX 386 v1 (local variables for 'namei' and 'sysexec')
   229 00014790 <res 00000004>      <1> pcore:  resd 1 ; physical start address of user's memory space (for sys exec)
   230 00014794 <res 00000004>      <1> ecore:  resd 1 ; physical start address of user's memory space (for sys exec)
   231 00014798 <res 00000004>      <1> nbase:	resd 1	; physical base address for 'namei' & 'sysexec'
   232 0001479C <res 00000002>      <1> ncount: resw 1	; remain byte count in page for 'namei' & 'sysexec'
   233 0001479E <res 00000002>      <1> argc:	resw 1	; argument count for 'sysexec'
   234 000147A0 <res 00000004>      <1> argv:	resd 1	; argument list (recent) address for 'sysexec'
   235                              <1> 
   236                              <1> ; 03/06/2015 - Retro UNIX 386 v1 Beginning
   237                              <1> ; 07/04/2013 - 31/07/2013 - Retro UNIX 8086 v1
   238 000147A4 <res 00000001>      <1> rw: 	 resb 1 ;; Read/Write sign (iget)
   239                              <1> 
   240                              <1> ;alignb 4
   241                              <1> 
   242                              <1> ; 24/04/2016
   243 000147A5 <res 00000004>      <1> ii:		resd 1 ; first cluster of the program file
   244 000147A9 <res 00000004>      <1> i.size:		resd 1 ; size of the program file
  2801                                  
  2802 000147AD <res 00000003>          alignb 4
  2803                                  
  2804                                  ; 23/05/2016 (TRDOS 386)
  2805                                  ; 14/10/2015 (Retro UNIX 386 v1, 'unix386.s')
  2806 000147B0 <res 00000004>          cr3reg:	 resd 1  ; cr3 register content at the beginning of the timer
  2807                                  		 ; (or RTC) interrupt handler.
  2808                                  
  2809                                  ; 10/12/2016 (callback)
  2810                                  ; 10/06/2016
  2811                                  ; 19/05/2016
  2812                                  ; 18/05/2016 - TRDOS 386 feature only !
  2813 000147B4 <res 00000100>          timer_set: resd 16*4   ; 256 bytes memory space for 16 timer events
  2814                                  	; Timer Event Structure: (max. 16 timer events, 16*16 bytes)
  2815                                  	;       Owner:	        resb 1 ; 0 = free
  2816                                  	;		  	       ;>0 = process number (u.uno)
  2817                                  	;	Callback:	resb 1 ; 0 = response byte address (phy)
  2818                                  	;				 1 = callback address (virtual)				
  2819                                  	;	Interrupt:      resb 1 ; 0 = Timer interrupt (or none)
  2820                                  	;		   	       ; 1 = Real Time Clock interrupt 
  2821                                  	;	Response:       resb 1 ; 0 to 255, signal return value
  2822                                  	;	Count Limit:	resd 1 ; count of ticks (total/set)
  2823                                  	;	Current Count: 	resd 1 ; count of ticks (current)
  2824                                  	;	Response Addr:  resd 1 ; response byte (pointer) address
  2825                                  	;			       ; (or callback -user service- address)	
  2826                                  
  2827                                  ;; Memory (swap) Data (11/03/2015)
  2828                                  ; 09/03/2015
  2829 000148B4 <res 00000002>          swpq_count: resw 1 ; count of pages on the swap queue
  2830 000148B6 <res 00000004>          swp_drv:    resd 1 ; logical drive description table address of the swap drive/disk
  2831 000148BA <res 00000004>          swpd_size:  resd 1 ; size of swap drive/disk (volume) in sectors (512 bytes). 		  				
  2832 000148BE <res 00000004>          swpd_free:  resd 1 ; free page blocks (4096 bytes) on swap disk/drive (logical)
  2833 000148C2 <res 00000004>          swpd_next:  resd 1 ; next free page block
  2834 000148C6 <res 00000004>          swpd_last:  resd 1 ; last swap page block	
  2835                                  
  2836 000148CA <res 00000002>          alignb 4
  2837                                  
  2838                                  ; 10/07/2015
  2839                                  ; 28/08/2014
  2840 000148CC <res 00000004>          error_code:	resd 1
  2841                                  ; 29/08/2014
  2842 000148D0 <res 00000004>          FaultOffset: 	resd 1
  2843                                  ; 21/09/2015
  2844 000148D4 <res 00000004>          PF_Count:	resd 1	; total page fault count
  2845                                  		       	; (for debugging - page fault analyze)
  2846                                  		 	; 'page_fault_handler' (memory.inc)
  2847                                  			; 'sysgeterr' (u9.s)
  2848                                  
  2849                                  ; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
  2850                                  ; 22/08/2015 (Retro UNIX 386 v1)
  2851                                  buffer: 
  2852 000148D8 <res 00000008>          	resb	8 
  2853                                  readi_buffer:
  2854 000148E0 <res 00000200>          	resb 	512
  2855 00014AE0 <res 00000008>          	resb	8
  2856                                  writei_buffer:
  2857 00014AE8 <res 00000200>          	resb	512	
  2858                                  ; 24/10/2016
  2859 00014CE8 <res 00000008>          	resb	8 
  2860                                  rw_buffer:
  2861 00014CF0 <res 00000800>          	resb 	2048  ; general purposed, r/w sector buffer
  2862                                  
  2863                                  bss_end:
  2864                                  
  2865                                  ; 27/12/2013
  2866                                  _end:  ; end of kernel code
